More keyboard navigation fixes

This commit is contained in:
crschnick 2024-03-30 19:34:13 +00:00
parent 3f01bb0028
commit c228e6ba30
27 changed files with 241 additions and 107 deletions

View file

@ -268,6 +268,7 @@ final class BrowserFileListComp extends SimpleComp {
return false;
},
null,
() -> {
if (row.getItem() != null && row.getItem().isSynthetic()) {
return null;

View file

@ -103,7 +103,7 @@ public class BrowserNavBar extends SimpleComp {
homeButton.setAccessibleText("Directory options");
homeButton.getStyleClass().add(Styles.LEFT_PILL);
homeButton.getStyleClass().add("path-graphic-button");
new ContextMenuAugment<>(event -> event.getButton() == MouseButton.PRIMARY, () -> {
new ContextMenuAugment<>(event -> event.getButton() == MouseButton.PRIMARY, null, () -> {
return model.getInOverview().get() ? null : new BrowserContextMenu(model, null);
})
.augment(new SimpleCompStructure<>(homeButton));
@ -112,7 +112,7 @@ public class BrowserNavBar extends SimpleComp {
historyButton.setAccessibleText("History");
historyButton.getStyleClass().add(Styles.RIGHT_PILL);
// historyButton.getStyleClass().add("path-graphic-button");
new ContextMenuAugment<>(event -> event.getButton() == MouseButton.PRIMARY, this::createContextMenu)
new ContextMenuAugment<>(event -> event.getButton() == MouseButton.PRIMARY, null, this::createContextMenu)
.augment(new SimpleCompStructure<>(historyButton));
var breadcrumbs = new BrowserBreadcrumbBar(model).grow(false, true);

View file

@ -79,9 +79,6 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
var empty = new MenuItem("...");
empty.setDisable(true);
menu.getItems().add(empty);
InputHelper.onRight(empty, true, keyEvent -> {
keyEvent.consume();
});
}
private void createDirectoryMenu() {

View file

@ -124,6 +124,6 @@ public class BrowserStatusBarComp extends SimpleComp {
});
// Use status bar as an extension of file list
new ContextMenuAugment<>(() -> new BrowserContextMenu(model, null)).augment(new SimpleCompStructure<>(r));
new ContextMenuAugment<>(mouseEvent -> mouseEvent.isSecondaryButtonDown(), null, () -> new BrowserContextMenu(model, null)).augment(new SimpleCompStructure<>(r));
}
}

View file

@ -7,14 +7,15 @@ import io.xpipe.app.comp.base.TileButtonComp;
import io.xpipe.app.core.AppFont;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.HorizontalComp;
import io.xpipe.app.fxcomps.impl.LabelComp;
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.PrettySvgComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.JfxHelper;
import io.xpipe.app.util.ThreadHelper;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
@ -26,6 +27,8 @@ import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import java.util.List;
public class BrowserWelcomeComp extends SimpleComp {
private final BrowserModel model;
@ -86,25 +89,10 @@ public class BrowserWelcomeComp extends SimpleComp {
storeList.setSpacing(8);
var listBox = new ListBoxViewComp<>(list, list, e -> {
var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid());
var graphic = entry.get()
.getProvider()
.getDisplayIconFileName(entry.get().getStore());
var view = PrettyImageHelper.ofFixedSize(graphic, 50, 40);
view.padding(new Insets(2, 8, 2, 8));
var content = JfxHelper.createNamedEntry(
DataStorage.get().getStoreDisplayName(entry.get()), e.getPath(), graphic);
var disable = new SimpleBooleanProperty();
return new ButtonComp(null, content, () -> {
ThreadHelper.runAsync(() -> {
model.restoreStateAsync(e, disable);
});
})
.accessibleText(DataStorage.get().getStoreDisplayName(entry.get()))
.disable(disable)
.styleClass("color-listBox")
.apply(struc -> struc.get().setMaxWidth(2000))
.grow(true, false);
var disable = new SimpleBooleanProperty();
var entryButton = entryButton(e, disable);
var dirButton = dirButton(e, disable);
return new HorizontalComp(List.of(entryButton, dirButton));
})
.apply(struc -> {
VBox vBox = (VBox) struc.get().getContent();
@ -134,4 +122,37 @@ public class BrowserWelcomeComp extends SimpleComp {
return layout;
}
private Comp<?> entryButton(BrowserSavedState.Entry e, BooleanProperty disable) {
var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid());
var graphic = entry.get()
.getProvider()
.getDisplayIconFileName(entry.get().getStore());
var view = PrettyImageHelper.ofFixedSize(graphic, 30, 24);
return new ButtonComp(new SimpleStringProperty(DataStorage.get().getStoreDisplayName(entry.get())), view.createRegion(), () -> {
ThreadHelper.runAsync(() -> {
model.restoreStateAsync(e, disable);
});
})
.minWidth(250)
.accessibleText(DataStorage.get().getStoreDisplayName(entry.get()))
.disable(disable)
.styleClass("entry-button")
.apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT));
}
private Comp<?> dirButton(BrowserSavedState.Entry e, BooleanProperty disable) {
var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid());
return new ButtonComp(new SimpleStringProperty(e.getPath()), null, () -> {
ThreadHelper.runAsync(() -> {
model.restoreStateAsync(e, disable);
});
})
.accessibleText(e.getPath())
.disable(disable)
.styleClass("directory-button")
.apply(struc -> struc.get().setMaxWidth(2000))
.grow(true, false)
.apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT));
}
}

View file

@ -55,7 +55,7 @@ public class OpenFileSystemComp extends SimpleComp {
var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open"));
new ContextMenuAugment<>(
event -> event.getButton() == MouseButton.PRIMARY, () -> new BrowserContextMenu(model, null))
event -> event.getButton() == MouseButton.PRIMARY, null, () -> new BrowserContextMenu(model, null))
.augment(new SimpleCompStructure<>(menuButton));
menuButton.disableProperty().bind(model.getInOverview());
menuButton.setAccessibleText("Directory options");

View file

@ -32,7 +32,7 @@ public class DropdownComp extends Comp<CompStructure<Button>> {
.toArray(MenuItem[]::new));
Button button = (Button) new ButtonComp(null, () -> {})
.apply(new ContextMenuAugment<>(e -> true, () -> {
.apply(new ContextMenuAugment<>(e -> true, null, () -> {
return cm;
}))
.createRegion();

View file

@ -1,6 +1,5 @@
package io.xpipe.app.comp.base;
import atlantafx.base.theme.Styles;
import io.xpipe.app.core.AppFont;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.Comp;
@ -43,7 +42,7 @@ public class TileButtonComp extends Comp<TileButtonComp.Structure> {
@Override
public Structure createBase() {
var bt = new Button();
Styles.toggleStyleClass(bt, Styles.FLAT);
bt.getStyleClass().add("tile-button-comp");
bt.setOnAction(e -> {
action.accept(e);
});

View file

@ -5,6 +5,8 @@ import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import javafx.beans.property.Property;
import javafx.beans.value.ObservableValue;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Region;
public class ToggleSwitchComp extends SimpleComp {
@ -20,6 +22,13 @@ public class ToggleSwitchComp extends SimpleComp {
@Override
protected Region createSimple() {
var s = new ToggleSwitch();
s.addEventFilter(KeyEvent.KEY_PRESSED,event -> {
if (event.getCode() == KeyCode.SPACE || event.getCode() == KeyCode.ENTER) {
s.setSelected(!s.isSelected());
event.consume();
}
});
s.getStyleClass().add("toggle-switch-comp");
s.setSelected(selected.getValue());
s.selectedProperty().addListener((observable, oldValue, newValue) -> {
selected.setValue(newValue);

View file

@ -97,7 +97,7 @@ public abstract class StoreEntryComp extends SimpleComp {
wrapper.executeDefaultAction();
});
});
new ContextMenuAugment<>(() -> this.createContextMenu()).augment(new SimpleCompStructure<>(button));
new ContextMenuAugment<>(mouseEvent -> mouseEvent.isSecondaryButtonDown(), null, () -> this.createContextMenu()).augment(new SimpleCompStructure<>(button));
var loading = LoadingOverlayComp.noProgress(
Comp.of(() -> button),
@ -247,7 +247,7 @@ public abstract class StoreEntryComp extends SimpleComp {
settingsButton.styleClass("settings");
settingsButton.accessibleText("More");
settingsButton.apply(new ContextMenuAugment<>(
event -> event.getButton() == MouseButton.PRIMARY, () -> StoreEntryComp.this.createContextMenu()));
event -> event.getButton() == MouseButton.PRIMARY, null, () -> StoreEntryComp.this.createContextMenu()));
settingsButton.apply(new FancyTooltipAugment<>("more"));
return settingsButton;
}

View file

@ -4,8 +4,8 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.util.ContextMenuHelper;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
@ -24,22 +24,12 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
this.action = action;
}
private void showMenu(Node anchor) {
var cm = createMenu();
if (cm == null) {
return;
}
cm.show(anchor, Side.RIGHT, 0, 0);
}
private ContextMenu createMenu() {
if (section.getShownChildren().isEmpty()) {
return null;
}
var cm = new ContextMenu();
cm.setAutoHide(true);
var cm = ContextMenuHelper.create();
cm.getStyleClass().add("condensed");
Menu menu = (Menu) recurse(cm, section);
cm.getItems().addAll(menu.getItems());
@ -52,9 +42,7 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
var graphic =
w.getEntry().getProvider().getDisplayIconFileName(w.getEntry().getStore());
if (c.isEmpty()) {
var item = new MenuItem(
w.getName().getValue(),
PrettyImageHelper.ofFixedSizeSquare(graphic, 16).createRegion());
var item = ContextMenuHelper.item(PrettyImageHelper.ofFixedSizeSquare(graphic, 16), w.getName().getValue());
item.setOnAction(event -> {
action.accept(w);
contextMenu.hide();
@ -89,8 +77,14 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
public CompStructure<Button> createBase() {
var button = new IconButtonComp("mdi2c-chevron-double-right");
button.apply(struc -> {
var cm = createMenu();
if (cm == null) {
return;
}
struc.get().setOnAction(event -> {
showMenu(struc.get());
ContextMenuHelper.toggleShow(cm,struc.get(), Side.RIGHT);
event.consume();
});
});
return button.createStructure();

View file

@ -56,9 +56,14 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
.apply(struc -> struc.get().setMinWidth(30))
.apply(struc -> struc.get().setPrefWidth(30))
.maxHeight(100)
.accessibleText(Bindings.createStringBinding(
() -> {
return "Access " + section.getWrapper().getName().getValue();
},
section.getWrapper().getName()))
.disable(quickAccessDisabled)
.focusTraversableForAccessibility()
.dislayOnlyShortcut(new KeyCodeCombination(KeyCode.RIGHT))
.displayOnlyShortcut(new KeyCodeCombination(KeyCode.RIGHT))
.tooltipKey("accessSubConnections");
return quickAccessButton;
}
@ -79,7 +84,7 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
.apply(struc -> struc.get().setMinWidth(30))
.apply(struc -> struc.get().setPrefWidth(30))
.focusTraversableForAccessibility()
.dislayOnlyShortcut(new KeyCodeCombination(KeyCode.SPACE))
.displayOnlyShortcut(new KeyCodeCombination(KeyCode.SPACE))
.tooltipKey("expand")
.accessibleText(Bindings.createStringBinding(
() -> {

View file

@ -230,9 +230,10 @@ public class AppWindowHelper {
InputHelper.onNavigationInput(scene, (kb) -> {
var r = scene.getRoot();
if (r != null) {
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("key-navigation"), kb);
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("normal-navigation"), !kb);
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("accessibility-navigation"), false);
var acc = Platform.isAccessibilityActive();
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("key-navigation"), kb && !acc);
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("normal-navigation"), !kb && !acc);
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("accessibility-navigation"), acc);
}
});

View file

@ -21,7 +21,6 @@ import javafx.scene.layout.VBox;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
@ -185,7 +184,7 @@ public abstract class Comp<S extends CompStructure<?>> {
return apply(struc -> Shortcuts.addShortcut((ButtonBase) struc.get(), shortcut));
}
public Comp<S> dislayOnlyShortcut(KeyCombination shortcut) {
public Comp<S> displayOnlyShortcut(KeyCombination shortcut) {
return apply(struc -> Shortcuts.addDisplayShortcut(struc.get(), shortcut));
}
@ -197,12 +196,6 @@ public abstract class Comp<S extends CompStructure<?>> {
return apply(new FancyTooltipAugment<>(key));
}
public <T1 extends CompStructure<?>, T2 extends CompStructure<?>>void applyMultiple(Comp<T1> c1, Comp<T2> c2, BiConsumer<T1,T2> consumer) {
c1.apply(struc -> {
});
}
public Region createRegion() {
return createStructure().get();
}

View file

@ -1,52 +1,90 @@
package io.xpipe.app.fxcomps.augment;
import io.xpipe.app.fxcomps.CompStructure;
import javafx.geometry.Side;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.ContextMenu;
import javafx.scene.input.MouseButton;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class ContextMenuAugment<S extends CompStructure<?>> implements Augment<S> {
private static ContextMenu currentContextMenu;
private final Predicate<MouseEvent> show;
private final Predicate<MouseEvent> mouseEventCheck;
private final Predicate<KeyEvent> keyEventCheck;
private final Supplier<ContextMenu> contextMenu;
public ContextMenuAugment(Predicate<MouseEvent> show, Supplier<ContextMenu> contextMenu) {
this.show = show;
this.contextMenu = contextMenu;
}
public ContextMenuAugment(Supplier<ContextMenu> contextMenu) {
this.show = event -> event.getButton() == MouseButton.SECONDARY;
public ContextMenuAugment(Predicate<MouseEvent> mouseEventCheck, Predicate<KeyEvent> keyEventCheck, Supplier<ContextMenu> contextMenu) {
this.mouseEventCheck = mouseEventCheck;
this.keyEventCheck = keyEventCheck;
this.contextMenu = contextMenu;
}
@Override
public void augment(S struc) {
var currentContextMenu = new AtomicReference<ContextMenu>();
Supplier<Boolean> hide = () -> {
if (currentContextMenu.get() != null && currentContextMenu.get().isShowing()) {
currentContextMenu.get().hide();
currentContextMenu.set(null);
return true;
}
return false;
};
var r = struc.get();
r.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
if (currentContextMenu != null && currentContextMenu.isShowing()) {
currentContextMenu.hide();
currentContextMenu = null;
}
if (show.test(event)) {
var cm = contextMenu.get();
if (cm != null) {
cm.show(r, event.getScreenX(), event.getScreenY());
currentContextMenu = cm;
if (mouseEventCheck != null && mouseEventCheck.test(event)) {
if (!hide.get()) {
var cm = contextMenu.get();
if (cm != null) {
cm.show(r, event.getScreenX(), event.getScreenY());
currentContextMenu.set(cm);
}
}
event.consume();
}
});
r.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
if (show.test(event)) {
if (mouseEventCheck != null && mouseEventCheck.test(event)) {
event.consume();
}
});
r.addEventFilter(KeyEvent.KEY_RELEASED, event -> {
if (keyEventCheck != null && keyEventCheck.test(event)) {
event.consume();
}
});
r.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (keyEventCheck != null && keyEventCheck.test(event)) {
if (!hide.get()) {
var cm = contextMenu.get();
if (cm != null) {
cm.show(r, Side.BOTTOM, 0, 0);
currentContextMenu.set(cm);
}
}
event.consume();
}
});
if (r instanceof ButtonBase buttonBase && keyEventCheck == null) {
buttonBase.setOnAction(event -> {
if (!hide.get()) {
var cm = contextMenu.get();
if (cm != null) {
cm.show(r, Side.BOTTOM, 0, 0);
currentContextMenu.set(cm);
}
}
event.consume();
});
}
}
}

View file

@ -26,7 +26,7 @@ public class FancyTooltipAugment<S extends CompStructure<?>> implements Augment<
var tt = new Tooltip();
var toDisplay = text.getValue();
if (Shortcuts.getDisplayShortcut(region) != null) {
toDisplay = toDisplay + "\n\n(Shortcut: " + Shortcuts.getDisplayShortcut(region).getDisplayText() + ")";
toDisplay = toDisplay + "\n\nShortcut: " + Shortcuts.getDisplayShortcut(region).getDisplayText();
}
tt.textProperty().setValue(toDisplay);
tt.setStyle("-fx-font-size: 11pt;");

View file

@ -15,6 +15,7 @@ import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreCategory;
import io.xpipe.app.util.ContextMenuHelper;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.css.PseudoClass;
@ -22,6 +23,7 @@ import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Region;
import lombok.EqualsAndHashCode;
@ -70,7 +72,7 @@ public class StoreCategoryComp extends SimpleComp {
var showing = new SimpleBooleanProperty();
var settings = new IconButtonComp("mdomz-settings")
.styleClass("settings")
.apply(new ContextMenuAugment<>(mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, () -> {
.apply(new ContextMenuAugment<>(mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, null, () -> {
var cm = createContextMenu(name);
showing.bind(cm.showingProperty());
return cm;
@ -93,8 +95,6 @@ public class StoreCategoryComp extends SimpleComp {
count.hide(BindingsHelper.persist(hover.or(showing).or(focus))),
settings.hide(
BindingsHelper.persist(hover.not().and(showing.not()).and(focus.not())))));
h.apply(new ContextMenuAugment<>(
mouseEvent -> mouseEvent.getButton() == MouseButton.SECONDARY, () -> createContextMenu(name)));
h.padding(new Insets(0, 10, 0, (category.getDepth() * 10)));
var categoryButton = new ButtonComp(null, h.createRegion(), category::select)
@ -103,6 +103,8 @@ public class StoreCategoryComp extends SimpleComp {
.apply(struc -> focus.bind(struc.get().focusedProperty()))
.accessibleText(category.nameProperty())
.grow(true, false);
categoryButton.apply(new ContextMenuAugment<>(
mouseEvent -> mouseEvent.getButton() == MouseButton.SECONDARY, keyEvent -> keyEvent.getCode() == KeyCode.SPACE, () -> createContextMenu(name)));
var l = category.getChildren()
.sorted(Comparator.comparing(
@ -122,8 +124,7 @@ public class StoreCategoryComp extends SimpleComp {
}
private ContextMenu createContextMenu(Region text) {
var contextMenu = new ContextMenu();
AppFont.normal(contextMenu.getStyleableNode());
var contextMenu = ContextMenuHelper.create();
var newCategory = new MenuItem(AppI18n.get("newCategory"), new FontIcon("mdi2p-plus-thick"));
newCategory.setOnAction(event -> {

View file

@ -0,0 +1,50 @@
package io.xpipe.app.util;
import io.xpipe.app.fxcomps.Comp;
import javafx.application.Platform;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.Region;
public class ContextMenuHelper {
public static ContextMenu create() {
ContextMenu contextMenu = new ContextMenu();
contextMenu.setAutoHide(true);
InputHelper.onLeft(contextMenu, false, e -> {
contextMenu.hide();
e.consume();
});
contextMenu.addEventFilter(Menu.ON_SHOWING, e -> {
Node content = contextMenu.getSkin().getNode();
if (content instanceof Region r) {
r.setMaxWidth(500);
}
});
contextMenu.addEventFilter(Menu.ON_SHOWN, e -> {
Platform.runLater(() -> {
var first = contextMenu.getItems().getFirst();
if (first != null) {
first.getStyleableNode().requestFocus();
}
});
});
return contextMenu;
}
public static MenuItem item(Comp<?> graphic, String name) {
var i = new MenuItem(name, graphic.createRegion());
return i;
}
public static void toggleShow(ContextMenu contextMenu, Node ref, Side side) {
if (!contextMenu.isShowing()) {
contextMenu.show(ref, Side.RIGHT, 0, 0);
} else {
contextMenu.hide();
}
}
}

View file

@ -40,7 +40,7 @@ public class InputHelper {
public static void onNavigationInput(EventTarget target, Consumer<Boolean> r) {
target.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
var c = event.getCode();
var list = List.of(KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.SPACE, KeyCode.TAB, KeyCode.NUMPAD2, KeyCode.NUMPAD4, KeyCode.NUMPAD6, KeyCode.NUMPAD8);
var list = List.of(KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.SPACE, KeyCode.ENTER, KeyCode.SHIFT, KeyCode.TAB, KeyCode.NUMPAD2, KeyCode.NUMPAD4, KeyCode.NUMPAD6, KeyCode.NUMPAD8);
r.accept(list.stream().anyMatch(keyCode -> keyCode == c));
});
target.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {

View file

@ -1,4 +1,4 @@
.update-button {
.tile-button-comp.update-button {
-fx-border-width: 0.05em;
-fx-border-radius: 4px;
-fx-background-radius: 4px;

View file

@ -19,8 +19,12 @@
-fx-opacity: 1.0;
}
.browser .welcome .button {
-fx-border-radius: 4px;
.browser .welcome .entry-button {
-fx-background-radius: 4px 0 0 4px;
}
.browser .welcome .directory-button {
-fx-background-radius: 0 4px 4px 0;
}
.browser .welcome .button:hover {

View file

@ -43,7 +43,7 @@
-fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(12, 11, 11) 40%, rgb(32, 32, 40) 50%, rgb(35, 29, 29) 100%);
}
.root:light .store-header-bar .menu-button:hover, .root:dark .store-header-bar .menu-button:hover {
.store-header-bar .menu-button:hover, .root:key-navigation .store-header-bar .menu-button:focused {
-fx-background-color: -color-bg-default;
-fx-border-color: -color-fg-default;
}
@ -61,15 +61,15 @@
-fx-border-width: 4;
}
.store-header-bar .menu-button:hover > * {
.store-header-bar .menu-button:hover > *, .root:key-navigation .store-header-bar .menu-button:focused > * {
-fx-text-fill: -color-fg-default;
}
.store-header-bar .menu-button:hover > * > .ikonli-font-icon {
.store-header-bar .menu-button:hover > * > .ikonli-font-icon, .root:key-navigation .store-header-bar .menu-button:focused > * > .ikonli-font-icon {
-fx-icon-color: -color-fg-default;
}
.store-header-bar .menu-button:hover .arrow {
.store-header-bar .menu-button:hover .arrow, .root:key-navigation .store-header-bar .menu-button:focused .arrow {
-fx-border-color: -color-fg-default;
-fx-border-width: 4;
}

View file

@ -1,14 +1,3 @@
.header-menu-item {
-fx-background-color: white;
-fx-opacity: 1.0;
}
.header-menu-item .label {
-fx-background-color: white;
-fx-opacity: 1.0;
}
.context-menu > * > * {
-fx-padding: 3px 10px 3px 10px;
-fx-background-radius: 1px;

View file

@ -54,6 +54,14 @@
-fx-border-width: 1 0 1 0;
}
.prefs .sidebar .button:armed {
-fx-background-color: derive(-color-neutral-muted, 25%);
}
.prefs .sidebar .button:hover, .root:key-navigation .prefs .sidebar .button:focused {
-fx-background-color: -color-neutral-muted;
}
.prefs .theme-switcher .combo-box-popup .list-view {
-fx-effect: NONE;
}

View file

@ -52,6 +52,10 @@
-fx-padding: 0.05em;
}
.root:key-navigation .icon-button-comp:focused {
-fx-background-color: -color-accent-muted;
}
.scroll-pane {
-fx-background-color: transparent;
}

View file

@ -0,0 +1,17 @@
.tile-button-comp {
-fx-border-color: transparent;
-fx-background-color: transparent;
-fx-background-radius: 4px;
}
.root.nord .tile-button-comp {
-fx-background-radius: 0;
}
.tile-button-comp:hover:armed {
-fx-background-color: derive(-color-neutral-muted, 25%);
}
.tile-button-comp:hover, .root:key-navigation .tile-button-comp:focused {
-fx-background-color: -color-neutral-muted;
}

View file

@ -0,0 +1,3 @@
.toggle-switch-comp:hover > .thumb-area, .root:key-navigation .toggle-switch-comp:focused > .thumb-area {
-fx-background-color: -color-neutral-muted;
}