mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-09-30 00:56:56 +13:00
More keyboard navigation fixes
This commit is contained in:
parent
3f01bb0028
commit
c228e6ba30
27 changed files with 241 additions and 107 deletions
|
@ -268,6 +268,7 @@ final class BrowserFileListComp extends SimpleComp {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
null,
|
||||||
() -> {
|
() -> {
|
||||||
if (row.getItem() != null && row.getItem().isSynthetic()) {
|
if (row.getItem() != null && row.getItem().isSynthetic()) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -103,7 +103,7 @@ public class BrowserNavBar extends SimpleComp {
|
||||||
homeButton.setAccessibleText("Directory options");
|
homeButton.setAccessibleText("Directory options");
|
||||||
homeButton.getStyleClass().add(Styles.LEFT_PILL);
|
homeButton.getStyleClass().add(Styles.LEFT_PILL);
|
||||||
homeButton.getStyleClass().add("path-graphic-button");
|
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);
|
return model.getInOverview().get() ? null : new BrowserContextMenu(model, null);
|
||||||
})
|
})
|
||||||
.augment(new SimpleCompStructure<>(homeButton));
|
.augment(new SimpleCompStructure<>(homeButton));
|
||||||
|
@ -112,7 +112,7 @@ public class BrowserNavBar extends SimpleComp {
|
||||||
historyButton.setAccessibleText("History");
|
historyButton.setAccessibleText("History");
|
||||||
historyButton.getStyleClass().add(Styles.RIGHT_PILL);
|
historyButton.getStyleClass().add(Styles.RIGHT_PILL);
|
||||||
// historyButton.getStyleClass().add("path-graphic-button");
|
// 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));
|
.augment(new SimpleCompStructure<>(historyButton));
|
||||||
|
|
||||||
var breadcrumbs = new BrowserBreadcrumbBar(model).grow(false, true);
|
var breadcrumbs = new BrowserBreadcrumbBar(model).grow(false, true);
|
||||||
|
|
|
@ -79,9 +79,6 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
|
||||||
var empty = new MenuItem("...");
|
var empty = new MenuItem("...");
|
||||||
empty.setDisable(true);
|
empty.setDisable(true);
|
||||||
menu.getItems().add(empty);
|
menu.getItems().add(empty);
|
||||||
InputHelper.onRight(empty, true, keyEvent -> {
|
|
||||||
keyEvent.consume();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDirectoryMenu() {
|
private void createDirectoryMenu() {
|
||||||
|
|
|
@ -124,6 +124,6 @@ public class BrowserStatusBarComp extends SimpleComp {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Use status bar as an extension of file list
|
// 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,14 +7,15 @@ import io.xpipe.app.comp.base.TileButtonComp;
|
||||||
import io.xpipe.app.core.AppFont;
|
import io.xpipe.app.core.AppFont;
|
||||||
import io.xpipe.app.fxcomps.Comp;
|
import io.xpipe.app.fxcomps.Comp;
|
||||||
import io.xpipe.app.fxcomps.SimpleComp;
|
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.LabelComp;
|
||||||
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
|
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
|
||||||
import io.xpipe.app.fxcomps.impl.PrettySvgComp;
|
import io.xpipe.app.fxcomps.impl.PrettySvgComp;
|
||||||
import io.xpipe.app.fxcomps.util.BindingsHelper;
|
import io.xpipe.app.fxcomps.util.BindingsHelper;
|
||||||
import io.xpipe.app.storage.DataStorage;
|
import io.xpipe.app.storage.DataStorage;
|
||||||
import io.xpipe.app.util.JfxHelper;
|
|
||||||
import io.xpipe.app.util.ThreadHelper;
|
import io.xpipe.app.util.ThreadHelper;
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
|
import javafx.beans.property.BooleanProperty;
|
||||||
import javafx.beans.property.SimpleBooleanProperty;
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
import javafx.geometry.Insets;
|
import javafx.geometry.Insets;
|
||||||
|
@ -26,6 +27,8 @@ import javafx.scene.layout.Priority;
|
||||||
import javafx.scene.layout.Region;
|
import javafx.scene.layout.Region;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BrowserWelcomeComp extends SimpleComp {
|
public class BrowserWelcomeComp extends SimpleComp {
|
||||||
|
|
||||||
private final BrowserModel model;
|
private final BrowserModel model;
|
||||||
|
@ -86,25 +89,10 @@ public class BrowserWelcomeComp extends SimpleComp {
|
||||||
storeList.setSpacing(8);
|
storeList.setSpacing(8);
|
||||||
|
|
||||||
var listBox = new ListBoxViewComp<>(list, list, e -> {
|
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();
|
var disable = new SimpleBooleanProperty();
|
||||||
return new ButtonComp(null, content, () -> {
|
var entryButton = entryButton(e, disable);
|
||||||
ThreadHelper.runAsync(() -> {
|
var dirButton = dirButton(e, disable);
|
||||||
model.restoreStateAsync(e, disable);
|
return new HorizontalComp(List.of(entryButton, dirButton));
|
||||||
});
|
|
||||||
})
|
|
||||||
.accessibleText(DataStorage.get().getStoreDisplayName(entry.get()))
|
|
||||||
.disable(disable)
|
|
||||||
.styleClass("color-listBox")
|
|
||||||
.apply(struc -> struc.get().setMaxWidth(2000))
|
|
||||||
.grow(true, false);
|
|
||||||
})
|
})
|
||||||
.apply(struc -> {
|
.apply(struc -> {
|
||||||
VBox vBox = (VBox) struc.get().getContent();
|
VBox vBox = (VBox) struc.get().getContent();
|
||||||
|
@ -134,4 +122,37 @@ public class BrowserWelcomeComp extends SimpleComp {
|
||||||
|
|
||||||
return layout;
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class OpenFileSystemComp extends SimpleComp {
|
||||||
|
|
||||||
var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open"));
|
var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open"));
|
||||||
new ContextMenuAugment<>(
|
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));
|
.augment(new SimpleCompStructure<>(menuButton));
|
||||||
menuButton.disableProperty().bind(model.getInOverview());
|
menuButton.disableProperty().bind(model.getInOverview());
|
||||||
menuButton.setAccessibleText("Directory options");
|
menuButton.setAccessibleText("Directory options");
|
||||||
|
|
|
@ -32,7 +32,7 @@ public class DropdownComp extends Comp<CompStructure<Button>> {
|
||||||
.toArray(MenuItem[]::new));
|
.toArray(MenuItem[]::new));
|
||||||
|
|
||||||
Button button = (Button) new ButtonComp(null, () -> {})
|
Button button = (Button) new ButtonComp(null, () -> {})
|
||||||
.apply(new ContextMenuAugment<>(e -> true, () -> {
|
.apply(new ContextMenuAugment<>(e -> true, null, () -> {
|
||||||
return cm;
|
return cm;
|
||||||
}))
|
}))
|
||||||
.createRegion();
|
.createRegion();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package io.xpipe.app.comp.base;
|
package io.xpipe.app.comp.base;
|
||||||
|
|
||||||
import atlantafx.base.theme.Styles;
|
|
||||||
import io.xpipe.app.core.AppFont;
|
import io.xpipe.app.core.AppFont;
|
||||||
import io.xpipe.app.core.AppI18n;
|
import io.xpipe.app.core.AppI18n;
|
||||||
import io.xpipe.app.fxcomps.Comp;
|
import io.xpipe.app.fxcomps.Comp;
|
||||||
|
@ -43,7 +42,7 @@ public class TileButtonComp extends Comp<TileButtonComp.Structure> {
|
||||||
@Override
|
@Override
|
||||||
public Structure createBase() {
|
public Structure createBase() {
|
||||||
var bt = new Button();
|
var bt = new Button();
|
||||||
Styles.toggleStyleClass(bt, Styles.FLAT);
|
bt.getStyleClass().add("tile-button-comp");
|
||||||
bt.setOnAction(e -> {
|
bt.setOnAction(e -> {
|
||||||
action.accept(e);
|
action.accept(e);
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,6 +5,8 @@ import io.xpipe.app.fxcomps.SimpleComp;
|
||||||
import io.xpipe.app.fxcomps.util.PlatformThread;
|
import io.xpipe.app.fxcomps.util.PlatformThread;
|
||||||
import javafx.beans.property.Property;
|
import javafx.beans.property.Property;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
|
import javafx.scene.input.KeyCode;
|
||||||
|
import javafx.scene.input.KeyEvent;
|
||||||
import javafx.scene.layout.Region;
|
import javafx.scene.layout.Region;
|
||||||
|
|
||||||
public class ToggleSwitchComp extends SimpleComp {
|
public class ToggleSwitchComp extends SimpleComp {
|
||||||
|
@ -20,6 +22,13 @@ public class ToggleSwitchComp extends SimpleComp {
|
||||||
@Override
|
@Override
|
||||||
protected Region createSimple() {
|
protected Region createSimple() {
|
||||||
var s = new ToggleSwitch();
|
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.setSelected(selected.getValue());
|
||||||
s.selectedProperty().addListener((observable, oldValue, newValue) -> {
|
s.selectedProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
selected.setValue(newValue);
|
selected.setValue(newValue);
|
||||||
|
|
|
@ -97,7 +97,7 @@ public abstract class StoreEntryComp extends SimpleComp {
|
||||||
wrapper.executeDefaultAction();
|
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(
|
var loading = LoadingOverlayComp.noProgress(
|
||||||
Comp.of(() -> button),
|
Comp.of(() -> button),
|
||||||
|
@ -247,7 +247,7 @@ public abstract class StoreEntryComp extends SimpleComp {
|
||||||
settingsButton.styleClass("settings");
|
settingsButton.styleClass("settings");
|
||||||
settingsButton.accessibleText("More");
|
settingsButton.accessibleText("More");
|
||||||
settingsButton.apply(new ContextMenuAugment<>(
|
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"));
|
settingsButton.apply(new FancyTooltipAugment<>("more"));
|
||||||
return settingsButton;
|
return settingsButton;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,8 @@ import io.xpipe.app.fxcomps.Comp;
|
||||||
import io.xpipe.app.fxcomps.CompStructure;
|
import io.xpipe.app.fxcomps.CompStructure;
|
||||||
import io.xpipe.app.fxcomps.impl.IconButtonComp;
|
import io.xpipe.app.fxcomps.impl.IconButtonComp;
|
||||||
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
|
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
|
||||||
|
import io.xpipe.app.util.ContextMenuHelper;
|
||||||
import javafx.geometry.Side;
|
import javafx.geometry.Side;
|
||||||
import javafx.scene.Node;
|
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.ContextMenu;
|
import javafx.scene.control.ContextMenu;
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
|
@ -24,22 +24,12 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
|
||||||
this.action = action;
|
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() {
|
private ContextMenu createMenu() {
|
||||||
if (section.getShownChildren().isEmpty()) {
|
if (section.getShownChildren().isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cm = new ContextMenu();
|
var cm = ContextMenuHelper.create();
|
||||||
cm.setAutoHide(true);
|
|
||||||
cm.getStyleClass().add("condensed");
|
cm.getStyleClass().add("condensed");
|
||||||
Menu menu = (Menu) recurse(cm, section);
|
Menu menu = (Menu) recurse(cm, section);
|
||||||
cm.getItems().addAll(menu.getItems());
|
cm.getItems().addAll(menu.getItems());
|
||||||
|
@ -52,9 +42,7 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
|
||||||
var graphic =
|
var graphic =
|
||||||
w.getEntry().getProvider().getDisplayIconFileName(w.getEntry().getStore());
|
w.getEntry().getProvider().getDisplayIconFileName(w.getEntry().getStore());
|
||||||
if (c.isEmpty()) {
|
if (c.isEmpty()) {
|
||||||
var item = new MenuItem(
|
var item = ContextMenuHelper.item(PrettyImageHelper.ofFixedSizeSquare(graphic, 16), w.getName().getValue());
|
||||||
w.getName().getValue(),
|
|
||||||
PrettyImageHelper.ofFixedSizeSquare(graphic, 16).createRegion());
|
|
||||||
item.setOnAction(event -> {
|
item.setOnAction(event -> {
|
||||||
action.accept(w);
|
action.accept(w);
|
||||||
contextMenu.hide();
|
contextMenu.hide();
|
||||||
|
@ -89,8 +77,14 @@ public class StoreQuickAccessButtonComp extends Comp<CompStructure<Button>> {
|
||||||
public CompStructure<Button> createBase() {
|
public CompStructure<Button> createBase() {
|
||||||
var button = new IconButtonComp("mdi2c-chevron-double-right");
|
var button = new IconButtonComp("mdi2c-chevron-double-right");
|
||||||
button.apply(struc -> {
|
button.apply(struc -> {
|
||||||
|
var cm = createMenu();
|
||||||
|
if (cm == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
struc.get().setOnAction(event -> {
|
struc.get().setOnAction(event -> {
|
||||||
showMenu(struc.get());
|
ContextMenuHelper.toggleShow(cm,struc.get(), Side.RIGHT);
|
||||||
|
event.consume();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return button.createStructure();
|
return button.createStructure();
|
||||||
|
|
|
@ -56,9 +56,14 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
|
||||||
.apply(struc -> struc.get().setMinWidth(30))
|
.apply(struc -> struc.get().setMinWidth(30))
|
||||||
.apply(struc -> struc.get().setPrefWidth(30))
|
.apply(struc -> struc.get().setPrefWidth(30))
|
||||||
.maxHeight(100)
|
.maxHeight(100)
|
||||||
|
.accessibleText(Bindings.createStringBinding(
|
||||||
|
() -> {
|
||||||
|
return "Access " + section.getWrapper().getName().getValue();
|
||||||
|
},
|
||||||
|
section.getWrapper().getName()))
|
||||||
.disable(quickAccessDisabled)
|
.disable(quickAccessDisabled)
|
||||||
.focusTraversableForAccessibility()
|
.focusTraversableForAccessibility()
|
||||||
.dislayOnlyShortcut(new KeyCodeCombination(KeyCode.RIGHT))
|
.displayOnlyShortcut(new KeyCodeCombination(KeyCode.RIGHT))
|
||||||
.tooltipKey("accessSubConnections");
|
.tooltipKey("accessSubConnections");
|
||||||
return quickAccessButton;
|
return quickAccessButton;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +84,7 @@ public class StoreSectionComp extends Comp<CompStructure<VBox>> {
|
||||||
.apply(struc -> struc.get().setMinWidth(30))
|
.apply(struc -> struc.get().setMinWidth(30))
|
||||||
.apply(struc -> struc.get().setPrefWidth(30))
|
.apply(struc -> struc.get().setPrefWidth(30))
|
||||||
.focusTraversableForAccessibility()
|
.focusTraversableForAccessibility()
|
||||||
.dislayOnlyShortcut(new KeyCodeCombination(KeyCode.SPACE))
|
.displayOnlyShortcut(new KeyCodeCombination(KeyCode.SPACE))
|
||||||
.tooltipKey("expand")
|
.tooltipKey("expand")
|
||||||
.accessibleText(Bindings.createStringBinding(
|
.accessibleText(Bindings.createStringBinding(
|
||||||
() -> {
|
() -> {
|
||||||
|
|
|
@ -230,9 +230,10 @@ public class AppWindowHelper {
|
||||||
InputHelper.onNavigationInput(scene, (kb) -> {
|
InputHelper.onNavigationInput(scene, (kb) -> {
|
||||||
var r = scene.getRoot();
|
var r = scene.getRoot();
|
||||||
if (r != null) {
|
if (r != null) {
|
||||||
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("key-navigation"), kb);
|
var acc = Platform.isAccessibilityActive();
|
||||||
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("normal-navigation"), !kb);
|
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("key-navigation"), kb && !acc);
|
||||||
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("accessibility-navigation"), false);
|
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("normal-navigation"), !kb && !acc);
|
||||||
|
r.pseudoClassStateChanged(PseudoClass.getPseudoClass("accessibility-navigation"), acc);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ import javafx.scene.layout.VBox;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
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));
|
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));
|
return apply(struc -> Shortcuts.addDisplayShortcut(struc.get(), shortcut));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,12 +196,6 @@ public abstract class Comp<S extends CompStructure<?>> {
|
||||||
return apply(new FancyTooltipAugment<>(key));
|
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() {
|
public Region createRegion() {
|
||||||
return createStructure().get();
|
return createStructure().get();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,52 +1,90 @@
|
||||||
package io.xpipe.app.fxcomps.augment;
|
package io.xpipe.app.fxcomps.augment;
|
||||||
|
|
||||||
import io.xpipe.app.fxcomps.CompStructure;
|
import io.xpipe.app.fxcomps.CompStructure;
|
||||||
|
import javafx.geometry.Side;
|
||||||
|
import javafx.scene.control.ButtonBase;
|
||||||
import javafx.scene.control.ContextMenu;
|
import javafx.scene.control.ContextMenu;
|
||||||
import javafx.scene.input.MouseButton;
|
import javafx.scene.input.KeyEvent;
|
||||||
import javafx.scene.input.MouseEvent;
|
import javafx.scene.input.MouseEvent;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class ContextMenuAugment<S extends CompStructure<?>> implements Augment<S> {
|
public class ContextMenuAugment<S extends CompStructure<?>> implements Augment<S> {
|
||||||
|
|
||||||
private static ContextMenu currentContextMenu;
|
private final Predicate<MouseEvent> mouseEventCheck;
|
||||||
private final Predicate<MouseEvent> show;
|
private final Predicate<KeyEvent> keyEventCheck;
|
||||||
private final Supplier<ContextMenu> contextMenu;
|
private final Supplier<ContextMenu> contextMenu;
|
||||||
|
|
||||||
public ContextMenuAugment(Predicate<MouseEvent> show, Supplier<ContextMenu> contextMenu) {
|
public ContextMenuAugment(Predicate<MouseEvent> mouseEventCheck, Predicate<KeyEvent> keyEventCheck, Supplier<ContextMenu> contextMenu) {
|
||||||
this.show = show;
|
this.mouseEventCheck = mouseEventCheck;
|
||||||
this.contextMenu = contextMenu;
|
this.keyEventCheck = keyEventCheck;
|
||||||
}
|
|
||||||
|
|
||||||
public ContextMenuAugment(Supplier<ContextMenu> contextMenu) {
|
|
||||||
this.show = event -> event.getButton() == MouseButton.SECONDARY;
|
|
||||||
this.contextMenu = contextMenu;
|
this.contextMenu = contextMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void augment(S struc) {
|
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();
|
var r = struc.get();
|
||||||
r.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
|
r.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
|
||||||
if (currentContextMenu != null && currentContextMenu.isShowing()) {
|
if (mouseEventCheck != null && mouseEventCheck.test(event)) {
|
||||||
currentContextMenu.hide();
|
if (!hide.get()) {
|
||||||
currentContextMenu = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (show.test(event)) {
|
|
||||||
var cm = contextMenu.get();
|
var cm = contextMenu.get();
|
||||||
if (cm != null) {
|
if (cm != null) {
|
||||||
cm.show(r, event.getScreenX(), event.getScreenY());
|
cm.show(r, event.getScreenX(), event.getScreenY());
|
||||||
currentContextMenu = cm;
|
currentContextMenu.set(cm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event.consume();
|
event.consume();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
r.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
|
r.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
|
||||||
if (show.test(event)) {
|
if (mouseEventCheck != null && mouseEventCheck.test(event)) {
|
||||||
event.consume();
|
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();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ public class FancyTooltipAugment<S extends CompStructure<?>> implements Augment<
|
||||||
var tt = new Tooltip();
|
var tt = new Tooltip();
|
||||||
var toDisplay = text.getValue();
|
var toDisplay = text.getValue();
|
||||||
if (Shortcuts.getDisplayShortcut(region) != null) {
|
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.textProperty().setValue(toDisplay);
|
||||||
tt.setStyle("-fx-font-size: 11pt;");
|
tt.setStyle("-fx-font-size: 11pt;");
|
||||||
|
|
|
@ -15,6 +15,7 @@ import io.xpipe.app.fxcomps.util.BindingsHelper;
|
||||||
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
|
||||||
import io.xpipe.app.storage.DataStorage;
|
import io.xpipe.app.storage.DataStorage;
|
||||||
import io.xpipe.app.storage.DataStoreCategory;
|
import io.xpipe.app.storage.DataStoreCategory;
|
||||||
|
import io.xpipe.app.util.ContextMenuHelper;
|
||||||
import javafx.beans.binding.Bindings;
|
import javafx.beans.binding.Bindings;
|
||||||
import javafx.beans.property.SimpleBooleanProperty;
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
import javafx.css.PseudoClass;
|
import javafx.css.PseudoClass;
|
||||||
|
@ -22,6 +23,7 @@ import javafx.geometry.Insets;
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
import javafx.scene.control.ContextMenu;
|
import javafx.scene.control.ContextMenu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
|
import javafx.scene.input.KeyCode;
|
||||||
import javafx.scene.input.MouseButton;
|
import javafx.scene.input.MouseButton;
|
||||||
import javafx.scene.layout.Region;
|
import javafx.scene.layout.Region;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
@ -70,7 +72,7 @@ public class StoreCategoryComp extends SimpleComp {
|
||||||
var showing = new SimpleBooleanProperty();
|
var showing = new SimpleBooleanProperty();
|
||||||
var settings = new IconButtonComp("mdomz-settings")
|
var settings = new IconButtonComp("mdomz-settings")
|
||||||
.styleClass("settings")
|
.styleClass("settings")
|
||||||
.apply(new ContextMenuAugment<>(mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, () -> {
|
.apply(new ContextMenuAugment<>(mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, null, () -> {
|
||||||
var cm = createContextMenu(name);
|
var cm = createContextMenu(name);
|
||||||
showing.bind(cm.showingProperty());
|
showing.bind(cm.showingProperty());
|
||||||
return cm;
|
return cm;
|
||||||
|
@ -93,8 +95,6 @@ public class StoreCategoryComp extends SimpleComp {
|
||||||
count.hide(BindingsHelper.persist(hover.or(showing).or(focus))),
|
count.hide(BindingsHelper.persist(hover.or(showing).or(focus))),
|
||||||
settings.hide(
|
settings.hide(
|
||||||
BindingsHelper.persist(hover.not().and(showing.not()).and(focus.not())))));
|
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)));
|
h.padding(new Insets(0, 10, 0, (category.getDepth() * 10)));
|
||||||
|
|
||||||
var categoryButton = new ButtonComp(null, h.createRegion(), category::select)
|
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()))
|
.apply(struc -> focus.bind(struc.get().focusedProperty()))
|
||||||
.accessibleText(category.nameProperty())
|
.accessibleText(category.nameProperty())
|
||||||
.grow(true, false);
|
.grow(true, false);
|
||||||
|
categoryButton.apply(new ContextMenuAugment<>(
|
||||||
|
mouseEvent -> mouseEvent.getButton() == MouseButton.SECONDARY, keyEvent -> keyEvent.getCode() == KeyCode.SPACE, () -> createContextMenu(name)));
|
||||||
|
|
||||||
var l = category.getChildren()
|
var l = category.getChildren()
|
||||||
.sorted(Comparator.comparing(
|
.sorted(Comparator.comparing(
|
||||||
|
@ -122,8 +124,7 @@ public class StoreCategoryComp extends SimpleComp {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ContextMenu createContextMenu(Region text) {
|
private ContextMenu createContextMenu(Region text) {
|
||||||
var contextMenu = new ContextMenu();
|
var contextMenu = ContextMenuHelper.create();
|
||||||
AppFont.normal(contextMenu.getStyleableNode());
|
|
||||||
|
|
||||||
var newCategory = new MenuItem(AppI18n.get("newCategory"), new FontIcon("mdi2p-plus-thick"));
|
var newCategory = new MenuItem(AppI18n.get("newCategory"), new FontIcon("mdi2p-plus-thick"));
|
||||||
newCategory.setOnAction(event -> {
|
newCategory.setOnAction(event -> {
|
||||||
|
|
50
app/src/main/java/io/xpipe/app/util/ContextMenuHelper.java
Normal file
50
app/src/main/java/io/xpipe/app/util/ContextMenuHelper.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,7 @@ public class InputHelper {
|
||||||
public static void onNavigationInput(EventTarget target, Consumer<Boolean> r) {
|
public static void onNavigationInput(EventTarget target, Consumer<Boolean> r) {
|
||||||
target.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
|
target.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
|
||||||
var c = event.getCode();
|
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));
|
r.accept(list.stream().anyMatch(keyCode -> keyCode == c));
|
||||||
});
|
});
|
||||||
target.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
|
target.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.update-button {
|
.tile-button-comp.update-button {
|
||||||
-fx-border-width: 0.05em;
|
-fx-border-width: 0.05em;
|
||||||
-fx-border-radius: 4px;
|
-fx-border-radius: 4px;
|
||||||
-fx-background-radius: 4px;
|
-fx-background-radius: 4px;
|
||||||
|
|
|
@ -19,8 +19,12 @@
|
||||||
-fx-opacity: 1.0;
|
-fx-opacity: 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.browser .welcome .button {
|
.browser .welcome .entry-button {
|
||||||
-fx-border-radius: 4px;
|
-fx-background-radius: 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.browser .welcome .directory-button {
|
||||||
|
-fx-background-radius: 0 4px 4px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.browser .welcome .button:hover {
|
.browser .welcome .button:hover {
|
||||||
|
|
|
@ -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%);
|
-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-background-color: -color-bg-default;
|
||||||
-fx-border-color: -color-fg-default;
|
-fx-border-color: -color-fg-default;
|
||||||
}
|
}
|
||||||
|
@ -61,15 +61,15 @@
|
||||||
-fx-border-width: 4;
|
-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;
|
-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;
|
-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-color: -color-fg-default;
|
||||||
-fx-border-width: 4;
|
-fx-border-width: 4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 > * > * {
|
.context-menu > * > * {
|
||||||
-fx-padding: 3px 10px 3px 10px;
|
-fx-padding: 3px 10px 3px 10px;
|
||||||
-fx-background-radius: 1px;
|
-fx-background-radius: 1px;
|
||||||
|
|
|
@ -54,6 +54,14 @@
|
||||||
-fx-border-width: 1 0 1 0;
|
-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 {
|
.prefs .theme-switcher .combo-box-popup .list-view {
|
||||||
-fx-effect: NONE;
|
-fx-effect: NONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,10 @@
|
||||||
-fx-padding: 0.05em;
|
-fx-padding: 0.05em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.root:key-navigation .icon-button-comp:focused {
|
||||||
|
-fx-background-color: -color-accent-muted;
|
||||||
|
}
|
||||||
|
|
||||||
.scroll-pane {
|
.scroll-pane {
|
||||||
-fx-background-color: transparent;
|
-fx-background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in a new issue