From aceb2665e67992528496f129b3b696c0b3709d15 Mon Sep 17 00:00:00 2001 From: Teletha Date: Tue, 13 Feb 2024 08:57:07 +0900 Subject: [PATCH] feat: context submenu is rebuildable --- src/main/java/viewtify/ui/UIContextMenu.java | 32 +++++++++++++++++++ src/main/java/viewtify/ui/UIMenuItem.java | 6 ++-- src/main/java/viewtify/ui/UITab.java | 26 ++++++++------- .../java/viewtify/ui/dock/DockSystem.java | 30 ----------------- src/main/java/viewtify/ui/dock/TabArea.java | 1 + .../viewtify/ui/helper/VisibleHelper.java | 2 +- 6 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/main/java/viewtify/ui/UIContextMenu.java b/src/main/java/viewtify/ui/UIContextMenu.java index a612edb49..945a83155 100644 --- a/src/main/java/viewtify/ui/UIContextMenu.java +++ b/src/main/java/viewtify/ui/UIContextMenu.java @@ -132,9 +132,34 @@ public void menu(Object text, Consumer sub) { * Declare simple menu with text. * * @param text A label text. + * @param rebuildable Determines whether the menu is regenerated each time it is opened. + * @param sub Define submenus. + */ + public void menu(Object text, boolean rebuildable, Consumer sub) { + menu(Variable.of(String.valueOf(text)), sub); + } + + /** + * Declare simple menu with text. + * + * @param text A label text. + * @param sub Define submenus. */ public void menu(Variable text, Consumer sub) { + menu(text, true, sub); + } + + /** + * Declare simple menu with text. + * + * @param text A label text. + * @param rebuildable Determines whether the menu is regenerated each time it is opened. + * @param sub Define submenus. + */ + public void menu(Variable text, boolean rebuildable, Consumer sub) { UIMenuItem menu = new UIMenuItem<>(register(new Menu())).text(text); + + // enhance animation menu.when(Menu.ON_SHOWN, () -> { ContextMenu context = MonkeyPatch.findContextMenu(menu.ui.getStyleableNode(), "submenu"); MonkeyPatch.fix(context); @@ -156,6 +181,13 @@ public void menu(Variable text, Consumer sub) { }); sub.accept(new UIContextMenu(text, menu.ui.getItems())); + + if (rebuildable) { + menu.when(Menu.ON_SHOWING, () -> { + menu.ui.getItems().clear(); + sub.accept(new UIContextMenu(text, menu.ui.getItems())); + }); + } } /** diff --git a/src/main/java/viewtify/ui/UIMenuItem.java b/src/main/java/viewtify/ui/UIMenuItem.java index 90fca4b4a..a3e4b5d99 100644 --- a/src/main/java/viewtify/ui/UIMenuItem.java +++ b/src/main/java/viewtify/ui/UIMenuItem.java @@ -10,14 +10,16 @@ package viewtify.ui; import javafx.scene.control.MenuItem; + import viewtify.ui.helper.DisableHelper; import viewtify.ui.helper.LabelHelper; import viewtify.ui.helper.StyleHelper; import viewtify.ui.helper.UserActionHelper; +import viewtify.ui.helper.VisibleHelper; public class UIMenuItem - implements StyleHelper, MenuItem>, DisableHelper>, LabelHelper>, - UserActionHelper> { + implements StyleHelper, MenuItem>, DisableHelper>, VisibleHelper>, + LabelHelper>, UserActionHelper> { /** The actual ui. */ final M ui; diff --git a/src/main/java/viewtify/ui/UITab.java b/src/main/java/viewtify/ui/UITab.java index af780f994..c5da97c87 100644 --- a/src/main/java/viewtify/ui/UITab.java +++ b/src/main/java/viewtify/ui/UITab.java @@ -90,20 +90,24 @@ public UITab(View parent) { context(menus -> { menus.menu().text(CloseThisTab).action(this::close); menus.menu(CloseMultipleTabs, sub -> { - sub.menu(CloseRightTabs).action(() -> { - ObservableList tabs = getTabPane().getTabs(); - I.signal(tabs).skip(tabs.indexOf(this) + 1).buffer().flatIterable(x -> x).to(x -> tabs.remove(x)); - }); - sub.menu(CloseLeftTabs).action(() -> { - ObservableList tabs = getTabPane().getTabs(); - I.signal(tabs).take(tabs.indexOf(this)).buffer().flatIterable(x -> x).to(x -> tabs.remove(x)); - }); - sub.menu(CloseOtherTabs).action(() -> { - ObservableList tabs = getTabPane().getTabs(); + ObservableList tabs = getTabPane().getTabs(); + int index = tabs.indexOf(this); + + if (index + 1 != tabs.size()) { + sub.menu(CloseRightTabs).action(() -> { + I.signal(tabs).skip(index + 1).buffer().flatIterable(x -> x).to(x -> tabs.remove(x)); + }); + } + if (index != 0) { + sub.menu(CloseLeftTabs).action(() -> { + I.signal(tabs).take(index).buffer().flatIterable(x -> x).to(x -> tabs.remove(x)); + }); + } + if (tabs.size() > 1) sub.menu(CloseOtherTabs).action(() -> { I.signal(tabs).skip(this).buffer().flatIterable(x -> x).to(x -> tabs.remove(x)); }); sub.menu(CloseAllTabs).action(() -> { - getTabPane().getTabs().clear(); + tabs.clear(); }); }); }); diff --git a/src/main/java/viewtify/ui/dock/DockSystem.java b/src/main/java/viewtify/ui/dock/DockSystem.java index 5000296a4..617a36aff 100644 --- a/src/main/java/viewtify/ui/dock/DockSystem.java +++ b/src/main/java/viewtify/ui/dock/DockSystem.java @@ -237,36 +237,6 @@ public static UITab register(String id, UnaryOperator o UITab tab = new UITab(null); tab.setId(id); - // tab.context(menus -> { - // menus.menu().text(CloseThisTab).action(() -> { - // TabArea area = (TabArea) tab.getProperties().get("tabarea"); - // area.remove(tab); - // }); - // menus.menu(CloseMultipleTabs, sub -> { - // sub.menu(CloseRightTabs).action(() -> { - // TabArea area = (TabArea) tab.getProperties().get("tabarea"); - // ObservableList tabs = tab.getTabPane().getTabs(); - // I.signal(tabs).skip(tabs.indexOf(tab) + 1).buffer().flatIterable(x -> x).to(x -> - // area.remove(x)); - // }); - // sub.menu(CloseLeftTabs).action(() -> { - // TabArea area = (TabArea) tab.getProperties().get("tabarea"); - // ObservableList tabs = tab.getTabPane().getTabs(); - // I.signal(tabs).take(tabs.indexOf(tab)).buffer().flatIterable(x -> x).to(x -> - // area.remove(x)); - // }); - // sub.menu(CloseOtherTabs).action(() -> { - // TabArea area = (TabArea) tab.getProperties().get("tabarea"); - // ObservableList tabs = tab.getTabPane().getTabs(); - // I.signal(tabs).skip(tab).buffer().flatIterable(x -> x).to(x -> area.remove(x)); - // }); - // sub.menu(CloseAllTabs).action(() -> { - // TabArea area = (TabArea) tab.getProperties().get("tabarea"); - // ObservableList tabs = tab.getTabPane().getTabs(); - // I.signal(tabs).buffer().flatIterable(x -> x).to(x -> area.remove(x)); - // }); - // }); - // }); DockRecommendedLocation o = option.apply(new DockRecommendedLocation()); DockLayout layout = layout(); diff --git a/src/main/java/viewtify/ui/dock/TabArea.java b/src/main/java/viewtify/ui/dock/TabArea.java index 792fab219..7a739f39d 100644 --- a/src/main/java/viewtify/ui/dock/TabArea.java +++ b/src/main/java/viewtify/ui/dock/TabArea.java @@ -380,6 +380,7 @@ void registerMenu(WiseConsumer menuBuilder) { label.when(WindowEvent.WINDOW_SHOWING, () -> { DockSystem.latestMenuActivatedTabArea = this; + System.out.println("SHOW"); }).when(WindowEvent.WINDOW_HIDDEN, () -> { DockSystem.latestMenuActivatedTabArea = null; }); diff --git a/src/main/java/viewtify/ui/helper/VisibleHelper.java b/src/main/java/viewtify/ui/helper/VisibleHelper.java index 5cf55b0cc..9ffd4dbe4 100644 --- a/src/main/java/viewtify/ui/helper/VisibleHelper.java +++ b/src/main/java/viewtify/ui/helper/VisibleHelper.java @@ -239,7 +239,7 @@ default Self invisibleWhen(Variable condition) { */ default Self invisibleWhen(ObservableValue condition) { if (condition != null) { - invisibleWhen(BooleanBinding.booleanExpression(condition).not()); + visibleWhen(BooleanBinding.booleanExpression(condition).not()); } return (Self) this; }