Skip to content

Commit

Permalink
feat: context submenu is rebuildable
Browse files Browse the repository at this point in the history
  • Loading branch information
teletha committed Feb 12, 2024
1 parent a63a716 commit aceb266
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 44 deletions.
32 changes: 32 additions & 0 deletions src/main/java/viewtify/ui/UIContextMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,34 @@ public void menu(Object text, Consumer<UIContextMenu> 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<UIContextMenu> 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<String> text, Consumer<UIContextMenu> 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<String> text, boolean rebuildable, Consumer<UIContextMenu> sub) {
UIMenuItem<Menu> 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);
Expand All @@ -156,6 +181,13 @@ public void menu(Variable<String> text, Consumer<UIContextMenu> 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()));
});
}
}

/**
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/viewtify/ui/UIMenuItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<M extends MenuItem>
implements StyleHelper<UIMenuItem<M>, MenuItem>, DisableHelper<UIMenuItem<M>>, LabelHelper<UIMenuItem<M>>,
UserActionHelper<UIMenuItem<M>> {
implements StyleHelper<UIMenuItem<M>, MenuItem>, DisableHelper<UIMenuItem<M>>, VisibleHelper<UIMenuItem<M>>,
LabelHelper<UIMenuItem<M>>, UserActionHelper<UIMenuItem<M>> {

/** The actual ui. */
final M ui;
Expand Down
26 changes: 15 additions & 11 deletions src/main/java/viewtify/ui/UITab.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Tab> 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<Tab> tabs = getTabPane().getTabs();
I.signal(tabs).take(tabs.indexOf(this)).buffer().flatIterable(x -> x).to(x -> tabs.remove(x));
});
sub.menu(CloseOtherTabs).action(() -> {
ObservableList<Tab> tabs = getTabPane().getTabs();
ObservableList<Tab> 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();
});
});
});
Expand Down
30 changes: 0 additions & 30 deletions src/main/java/viewtify/ui/dock/DockSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -237,36 +237,6 @@ public static UITab register(String id, UnaryOperator<DockRecommendedLocation> 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<Tab> 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<Tab> 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<Tab> 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<Tab> 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();
Expand Down
1 change: 1 addition & 0 deletions src/main/java/viewtify/ui/dock/TabArea.java
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,7 @@ void registerMenu(WiseConsumer<UILabel> menuBuilder) {

label.when(WindowEvent.WINDOW_SHOWING, () -> {
DockSystem.latestMenuActivatedTabArea = this;
System.out.println("SHOW");
}).when(WindowEvent.WINDOW_HIDDEN, () -> {
DockSystem.latestMenuActivatedTabArea = null;
});
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/viewtify/ui/helper/VisibleHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ default Self invisibleWhen(Variable<Boolean> condition) {
*/
default Self invisibleWhen(ObservableValue<Boolean> condition) {
if (condition != null) {
invisibleWhen(BooleanBinding.booleanExpression(condition).not());
visibleWhen(BooleanBinding.booleanExpression(condition).not());
}
return (Self) this;
}
Expand Down

0 comments on commit aceb266

Please sign in to comment.