From 5fa859b278799069c0381920c3f86833498624e6 Mon Sep 17 00:00:00 2001 From: Teletha Date: Sat, 2 Dec 2023 01:18:52 +0900 Subject: [PATCH] fix: remove PreferenceViewBase --- .../viewtify/keys/KeyBindingSettingView.java | 6 +- src/main/java/viewtify/ui/View.java | 19 +++ .../ui/calendar/CalendarSettingView.java | 5 +- .../viewtify/ui/toast/ToastSettingView.java | 7 +- .../ui/view/AppearanceSettingView.java | 5 +- .../viewtify/ui/view/PreferenceViewBase.java | 135 ------------------ .../viewtify/ui/view/PreferencesView.java | 130 +++++++++++++++-- 7 files changed, 150 insertions(+), 157 deletions(-) delete mode 100644 src/main/java/viewtify/ui/view/PreferenceViewBase.java diff --git a/src/main/java/viewtify/keys/KeyBindingSettingView.java b/src/main/java/viewtify/keys/KeyBindingSettingView.java index 4d2640a9f..e17c07754 100644 --- a/src/main/java/viewtify/keys/KeyBindingSettingView.java +++ b/src/main/java/viewtify/keys/KeyBindingSettingView.java @@ -19,11 +19,11 @@ import viewtify.ui.UITableColumn; import viewtify.ui.UITableView; import viewtify.ui.UIText; +import viewtify.ui.View; import viewtify.ui.ViewDSL; import viewtify.ui.helper.User; -import viewtify.ui.view.PreferenceViewBase; -public class KeyBindingSettingView extends PreferenceViewBase { +public class KeyBindingSettingView extends View { private UIText filter; @@ -37,7 +37,7 @@ public class KeyBindingSettingView extends PreferenceViewBase { * {@inheritDoc} */ @Override - public Variable category() { + public Variable title() { return en("Keyborad Operation"); } diff --git a/src/main/java/viewtify/ui/View.java b/src/main/java/viewtify/ui/View.java index d144eebd2..45456f68a 100644 --- a/src/main/java/viewtify/ui/View.java +++ b/src/main/java/viewtify/ui/View.java @@ -25,6 +25,7 @@ import javafx.stage.Screen; import javafx.stage.Stage; import javafx.stage.Window; + import kiss.Disposable; import kiss.Extensible; import kiss.I; @@ -104,6 +105,24 @@ public String id() { return parent == null ? name() : parent.name() + IDSeparator + name(); } + /** + * The title of this {@link View}. + * + * @return + */ + public Variable title() { + return Variable.empty(); + } + + /** + * The icon of this {@link View}. + * + * @return + */ + public Variable icon() { + return Variable.empty(); + } + /** * {@inheritDoc} */ diff --git a/src/main/java/viewtify/ui/calendar/CalendarSettingView.java b/src/main/java/viewtify/ui/calendar/CalendarSettingView.java index a42b9a456..bd02688c1 100644 --- a/src/main/java/viewtify/ui/calendar/CalendarSettingView.java +++ b/src/main/java/viewtify/ui/calendar/CalendarSettingView.java @@ -23,10 +23,9 @@ import viewtify.ui.UIComboBox; import viewtify.ui.View; import viewtify.ui.ViewDSL; -import viewtify.ui.view.PreferenceViewBase; import viewtify.util.FXUtils; -public class CalendarSettingView extends PreferenceViewBase { +public class CalendarSettingView extends View { private UIComboBox firstDoW; @@ -42,7 +41,7 @@ public class CalendarSettingView extends PreferenceViewBase { * {@inheritDoc} */ @Override - public Variable category() { + public Variable title() { return en("Calendar"); } diff --git a/src/main/java/viewtify/ui/toast/ToastSettingView.java b/src/main/java/viewtify/ui/toast/ToastSettingView.java index 56af5dd53..0ed44b828 100644 --- a/src/main/java/viewtify/ui/toast/ToastSettingView.java +++ b/src/main/java/viewtify/ui/toast/ToastSettingView.java @@ -12,6 +12,7 @@ import java.util.stream.IntStream; import javafx.util.Duration; + import kiss.Variable; import viewtify.model.Preferences; import viewtify.style.FormStyles; @@ -19,12 +20,12 @@ import viewtify.ui.UICheckSwitch; import viewtify.ui.UIComboBox; import viewtify.ui.UISpinner; +import viewtify.ui.View; import viewtify.ui.ViewDSL; -import viewtify.ui.view.PreferenceViewBase; import viewtify.util.Corner; import viewtify.util.ScreenSelector; -public class ToastSettingView extends PreferenceViewBase { +public class ToastSettingView extends View { /** The desktop configuration UI. */ private UICheckSwitch enableNotification; @@ -54,7 +55,7 @@ public class ToastSettingView extends PreferenceViewBase { * {@inheritDoc} */ @Override - public Variable category() { + public Variable title() { return en("Notification"); } diff --git a/src/main/java/viewtify/ui/view/AppearanceSettingView.java b/src/main/java/viewtify/ui/view/AppearanceSettingView.java index 481603fdd..213cbae95 100644 --- a/src/main/java/viewtify/ui/view/AppearanceSettingView.java +++ b/src/main/java/viewtify/ui/view/AppearanceSettingView.java @@ -22,9 +22,10 @@ import viewtify.style.FormStyles; import viewtify.ui.UIComboBox; import viewtify.ui.UISpinner; +import viewtify.ui.View; import viewtify.ui.ViewDSL; -public class AppearanceSettingView extends PreferenceViewBase { +public class AppearanceSettingView extends View { /** The theme selector. */ public UIComboBox theme; @@ -45,7 +46,7 @@ public class AppearanceSettingView extends PreferenceViewBase { * {@inheritDoc} */ @Override - public Variable category() { + public Variable title() { return en("Appearance and Language"); } diff --git a/src/main/java/viewtify/ui/view/PreferenceViewBase.java b/src/main/java/viewtify/ui/view/PreferenceViewBase.java deleted file mode 100644 index 78dc2a058..000000000 --- a/src/main/java/viewtify/ui/view/PreferenceViewBase.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2023 Nameless Production Committee - * - * Licensed under the MIT License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://opensource.org/licenses/mit-license.php - */ -package viewtify.ui.view; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.Parent; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Labeled; - -import kiss.Extensible; -import kiss.Variable; -import viewtify.style.FormStyles; -import viewtify.ui.View; - -public abstract class PreferenceViewBase extends View implements Extensible { - - /** - * Define the category of preferences. - * - * @return - */ - public abstract Variable category(); - - /** - * @param text - */ - void searchPreferenceBy(String text) { - String[] classes = {".label", ".button", ".check-box", ".hyperlink", " .toggle-button", ".cell"}; - boolean precondition = text == null || text.isBlank() || category().exact().contains(text); - - int shown = 0; - Set shownDescriptions = new HashSet(); - - List rows = new ArrayList(); - rows.addAll(ui().lookupAll(FormStyles.Row.selector())); - rows.addAll(ui().lookupAll(".table-view")); - - for (Node row : rows) { - Variable description = findDescription(row); - if (precondition || searchLabel(row, text, classes) || searchCombo(row, text) || searchDescription(description, text, classes)) { - shown++; - row.setManaged(true); - row.setVisible(true); - description.to(x -> { - x.setManaged(true); - x.setVisible(true); - shownDescriptions.add(x); - }); - } else { - row.setManaged(false); - row.setVisible(false); - description.to(x -> { - if (!shownDescriptions.contains(x)) { - x.setManaged(false); - x.setVisible(false); - } - }); - } - } - - Node title = ui().getParent(); - title.setVisible(precondition || shown != 0); - title.setManaged(precondition || shown != 0); - } - - private boolean searchLabel(Node row, String text, String... classes) { - for (String clazz : classes) { - for (Node node : row.lookupAll(clazz)) { - if (node instanceof Labeled labeled && labeled.getText() != null && labeled.getText().toLowerCase().contains(text)) { - return true; - } - } - } - return false; - } - - private boolean searchCombo(Node row, String text) { - for (Node node : row.lookupAll(".combo-box")) { - if (node instanceof ComboBox combo) { - for (Object object : combo.getItems()) { - if (object.toString().toLowerCase().contains(text)) { - return true; - } - } - } - } - return false; - } - - private boolean searchDescription(Variable description, String text, String... classes) { - if (description.isAbsent()) { - return false; - } - - for (String clazz : classes) { - for (Node node : description.v.lookupAll(clazz)) { - if (node instanceof Labeled labeled && labeled.getText().toLowerCase().contains(text)) { - return true; - } - } - } - return false; - } - - private Variable findDescription(Node row) { - Node target = row; - Parent node = target.getParent(); - while (node != null && !node.getStyleClass().contains(FormStyles.Preferences.className()[0])) { - ObservableList children = node.getChildrenUnmodifiable(); - for (int i = children.indexOf(target) - 1; 0 <= i; i--) { - Node child = children.get(i); - ObservableList classes = child.getStyleClass(); - if (classes.contains(FormStyles.Description.className()[0])) { - return Variable.of(child); - } - } - target = node; - node = node.getParent(); - } - return Variable.empty(); - } -} diff --git a/src/main/java/viewtify/ui/view/PreferencesView.java b/src/main/java/viewtify/ui/view/PreferencesView.java index e4bcc048b..d1adfe0a9 100644 --- a/src/main/java/viewtify/ui/view/PreferencesView.java +++ b/src/main/java/viewtify/ui/view/PreferencesView.java @@ -10,11 +10,20 @@ package viewtify.ui.view; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; + +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.Parent; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Labeled; import org.controlsfx.glyphfont.FontAwesome; import kiss.I; +import kiss.Variable; import stylist.Style; import stylist.StyleDSL; import viewtify.style.FormStyles; @@ -38,7 +47,7 @@ public class PreferencesView extends View { private UIText search; /** The list of preference views. */ - private final List bases = new ArrayList(); + private final List bases = new ArrayList(); /** * Normal constructor. @@ -55,8 +64,8 @@ protected ViewDSL declareUI() { { $(hbox, () -> { $(navi, style.left, () -> { - for (PreferenceViewBase view : bases) { - $(new UILabel(null).text(view.category()).style(style.navi).when(User.LeftClick, () -> { + for (View view : bases) { + $(new UILabel(null).text(view.title()).style(style.navi).when(User.LeftClick, () -> { scroll.scrollTo(view.ui().getParent(), true); })); } @@ -65,9 +74,9 @@ protected ViewDSL declareUI() { $(search, FormStyles.Input, style.search); $(scroll, FormStyles.Preferences, () -> { $(vbox, style.root, () -> { - for (PreferenceViewBase view : bases) { + for (View view : bases) { $(vbox, style.box, () -> { - label(view.category(), FormStyles.Title); + label(view.title(), FormStyles.Title); $(view); }); } @@ -126,8 +135,8 @@ protected void initialize() { search.placeholder(en("Search from preferences")).clearable().prefix(FontAwesome.Glyph.SEARCH).observe().to(text -> { text = text.strip().toLowerCase(); - for (PreferenceViewBase base : bases) { - base.searchPreferenceBy(text); + for (View base : bases) { + searchPreferenceBy(base, text); } }); } @@ -138,8 +147,8 @@ protected void initialize() { * @param views * @return */ - public PreferencesView add(Class... views) { - for (Class view : views) { + public PreferencesView add(Class... views) { + for (Class view : views) { bases.add(I.make(view)); } return this; @@ -151,7 +160,7 @@ public PreferencesView add(Class... views) { * @param views * @return */ - public PreferencesView add(PreferenceViewBase... views) { + public PreferencesView add(View... views) { return add(List.of(views)); } @@ -161,7 +170,7 @@ public PreferencesView add(PreferenceViewBase... views) { * @param views * @return */ - public PreferencesView add(List views) { + public PreferencesView add(List views) { bases.addAll(views); return this; } @@ -185,4 +194,103 @@ public final PreferencesView disableToC() { navi.show(false); return this; } + + /** + * @param text + */ + private static void searchPreferenceBy(View view, String text) { + String[] classes = {".label", ".button", ".check-box", ".hyperlink", " .toggle-button", ".cell"}; + boolean precondition = text == null || text.isBlank() || view.title().exact().contains(text); + + int shown = 0; + Set shownDescriptions = new HashSet(); + + List rows = new ArrayList(); + rows.addAll(view.ui().lookupAll(FormStyles.Row.selector())); + rows.addAll(view.ui().lookupAll(".table-view")); + + for (Node row : rows) { + Variable description = findDescription(row); + if (precondition || searchLabel(row, text, classes) || searchCombo(row, text) || searchDescription(description, text, classes)) { + shown++; + row.setManaged(true); + row.setVisible(true); + description.to(x -> { + x.setManaged(true); + x.setVisible(true); + shownDescriptions.add(x); + }); + } else { + row.setManaged(false); + row.setVisible(false); + description.to(x -> { + if (!shownDescriptions.contains(x)) { + x.setManaged(false); + x.setVisible(false); + } + }); + } + } + + Node title = view.ui().getParent(); + title.setVisible(precondition || shown != 0); + title.setManaged(precondition || shown != 0); + } + + private static boolean searchLabel(Node row, String text, String... classes) { + for (String clazz : classes) { + for (Node node : row.lookupAll(clazz)) { + if (node instanceof Labeled labeled && labeled.getText() != null && labeled.getText().toLowerCase().contains(text)) { + return true; + } + } + } + return false; + } + + private static boolean searchCombo(Node row, String text) { + for (Node node : row.lookupAll(".combo-box")) { + if (node instanceof ComboBox combo) { + for (Object object : combo.getItems()) { + if (object.toString().toLowerCase().contains(text)) { + return true; + } + } + } + } + return false; + } + + private static boolean searchDescription(Variable description, String text, String... classes) { + if (description.isAbsent()) { + return false; + } + + for (String clazz : classes) { + for (Node node : description.v.lookupAll(clazz)) { + if (node instanceof Labeled labeled && labeled.getText().toLowerCase().contains(text)) { + return true; + } + } + } + return false; + } + + private static Variable findDescription(Node row) { + Node target = row; + Parent node = target.getParent(); + while (node != null && !node.getStyleClass().contains(FormStyles.Preferences.className()[0])) { + ObservableList children = node.getChildrenUnmodifiable(); + for (int i = children.indexOf(target) - 1; 0 <= i; i--) { + Node child = children.get(i); + ObservableList classes = child.getStyleClass(); + if (classes.contains(FormStyles.Description.className()[0])) { + return Variable.of(child); + } + } + target = node; + node = node.getParent(); + } + return Variable.empty(); + } }