diff --git a/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java b/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java index 61d2d8f7bd0..ee34ff54db1 100644 --- a/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java +++ b/HMCL/src/main/java/com/jfoenix/controls/JFXRippler.java @@ -30,6 +30,7 @@ import javafx.css.converter.BooleanConverter; import javafx.css.converter.PaintConverter; import javafx.css.converter.SizeConverter; +import javafx.event.EventHandler; import javafx.geometry.Bounds; import javafx.scene.CacheHint; import javafx.scene.Group; @@ -45,6 +46,8 @@ import javafx.scene.shape.Rectangle; import javafx.scene.shape.Shape; import javafx.util.Duration; +import org.jackhuang.hmcl.ui.animation.AnimationUtils; +import org.jackhuang.hmcl.ui.animation.Motion; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -76,6 +79,8 @@ public enum RipplerMask { protected RippleGenerator rippler; protected Pane ripplerPane; protected Node control; + private Animation coverAnimation; + private Rectangle hoverOverlay; protected static final double RIPPLE_MAX_RADIUS = 300; private static final Interpolator RIPPLE_INTERPOLATOR = Interpolator.SPLINE(0.0825, @@ -128,6 +133,29 @@ public JFXRippler(Node control, RipplerMask mask, RipplerPos pos) { setCache(true); setCacheHint(CacheHint.SPEED); setCacheShape(true); + + EventHandler mouseEventHandler = event -> { + if (coverAnimation != null) { + coverAnimation.stop(); + } + boolean isEntered = event.getEventType() == MouseEvent.MOUSE_ENTERED; + + if (AnimationUtils.isAnimationEnabled()) { + coverAnimation = new Timeline(new KeyFrame(Motion.SHORT4, + new KeyValue(hoverOverlay.opacityProperty(), isEntered ? 1 : 0, isEntered ? Motion.EASE_IN : Motion.EASE_OUT))); + coverAnimation.play(); + } else { + interpolateBackground(isEntered ? 1 : 0); + } + }; + + addEventHandler(MouseEvent.MOUSE_ENTERED, mouseEventHandler); + addEventHandler(MouseEvent.MOUSE_EXITED, mouseEventHandler); + } + + private void interpolateBackground(double frac) { + if (hoverOverlay == null) return; + hoverOverlay.setOpacity(frac); } protected final void createRippleUI() { @@ -135,7 +163,23 @@ protected final void createRippleUI() { rippler = new RippleGenerator(); ripplerPane = new StackPane(); ripplerPane.setMouseTransparent(true); - ripplerPane.getChildren().add(rippler); + + hoverOverlay = new Rectangle(); + hoverOverlay.setManaged(false); + hoverOverlay.setCache(true); + hoverOverlay.setCacheHint(CacheHint.SPEED); + hoverOverlay.setOpacity(0); + + hoverOverlay.fillProperty().bind(Bindings.createObjectBinding(() -> { + Paint currentFill = getRipplerFill(); + if (currentFill instanceof Color fill) { + return Color.color(fill.getRed(), fill.getGreen(), fill.getBlue(), 0.15); + } else { + return currentFill; + } + }, ripplerFillProperty())); + + ripplerPane.getChildren().addAll(hoverOverlay, rippler); getChildren().add(ripplerPane); } @@ -325,16 +369,25 @@ public void showOverlay() { rippler.overlayRect.outAnimation.stop(); } rippler.createOverlay(); - rippler.overlayRect.inAnimation.play(); + + if (AnimationUtils.isAnimationEnabled()) { + rippler.overlayRect.inAnimation.play(); + } else { + rippler.overlayRect.inAnimation.stop(); + rippler.overlayRect.setOpacity(1); + } } public void hideOverlay() { if (!forceOverlay) { if (rippler.overlayRect != null) { rippler.overlayRect.inAnimation.stop(); - } - if (rippler.overlayRect != null) { - rippler.overlayRect.outAnimation.play(); + if (AnimationUtils.isAnimationEnabled()) { + rippler.overlayRect.outAnimation.play(); + } else { + rippler.overlayRect.outAnimation.stop(); + rippler.overlayRect.setOpacity(0); + } } } else { System.err.println("Ripple Overlay is forced!"); @@ -373,15 +426,22 @@ void createRipple() { } this.resetClip = false; - // create the ripple effect - final Ripple ripple = new Ripple(generatorCenterX, generatorCenterY); - getChildren().add(ripple); - ripplesQueue.add(ripple); + if (AnimationUtils.isAnimationEnabled()) { + // create the ripple effect + final Ripple ripple = new Ripple(generatorCenterX, generatorCenterY); + getChildren().add(ripple); + ripplesQueue.add(ripple); - // animate the ripple - overlayRect.outAnimation.stop(); - overlayRect.inAnimation.play(); - ripple.inAnimation.play(); + // animate the ripple + overlayRect.outAnimation.stop(); + overlayRect.inAnimation.play(); + ripple.inAnimation.play(); + } else { + // apply simple press effect when animation is disabled + overlayRect.outAnimation.stop(); + overlayRect.inAnimation.stop(); + overlayRect.setOpacity(1); + } } } @@ -389,16 +449,25 @@ private void releaseRipple() { Ripple ripple = ripplesQueue.poll(); if (ripple != null) { ripple.inAnimation.stop(); - ripple.outAnimation = new Timeline( - new KeyFrame(Duration.millis(Math.min(800, (0.9 * 500) / ripple.getScaleX())) - , ripple.outKeyValues)); - ripple.outAnimation.setOnFinished((event) -> getChildren().remove(ripple)); - ripple.outAnimation.play(); - if (generating.getAndSet(false)) { - if (overlayRect != null) { - overlayRect.inAnimation.stop(); - if (!forceOverlay) { + if (AnimationUtils.isAnimationEnabled()) { + ripple.outAnimation = new Timeline( + new KeyFrame(Duration.millis(Math.min(800, (0.9 * 500) / ripple.getScaleX())) + , ripple.outKeyValues)); + ripple.outAnimation.setOnFinished((event) -> getChildren().remove(ripple)); + ripple.outAnimation.play(); + } else { + getChildren().remove(ripple); + } + } + if (generating.getAndSet(false)) { + if (overlayRect != null) { + overlayRect.inAnimation.stop(); + if (!forceOverlay) { + if (AnimationUtils.isAnimationEnabled()) { overlayRect.outAnimation.play(); + } else { + overlayRect.outAnimation.stop(); + overlayRect.setOpacity(0); } } } @@ -548,8 +617,14 @@ private void resetOverLay() { if (rippler.overlayRect != null) { rippler.overlayRect.inAnimation.stop(); final RippleGenerator.OverLayRipple oldOverlay = rippler.overlayRect; - rippler.overlayRect.outAnimation.setOnFinished((finish) -> rippler.getChildren().remove(oldOverlay)); - rippler.overlayRect.outAnimation.play(); + + if (AnimationUtils.isAnimationEnabled()) { + rippler.overlayRect.outAnimation.setOnFinished((finish) -> rippler.getChildren().remove(oldOverlay)); + rippler.overlayRect.outAnimation.play(); + } else { + rippler.overlayRect.outAnimation.stop(); + rippler.getChildren().remove(oldOverlay); + } rippler.overlayRect = null; } } @@ -561,6 +636,17 @@ private void resetClip() { protected void resetRippler() { resetOverLay(); resetClip(); + + if (hoverOverlay != null && control != null) { + Bounds bounds = control.getBoundsInParent(); + double diffMinX = Math.abs(control.getBoundsInLocal().getMinX() - control.getLayoutBounds().getMinX()); + double diffMinY = Math.abs(control.getBoundsInLocal().getMinY() - control.getLayoutBounds().getMinY()); + hoverOverlay.setX(bounds.getMinX() + diffMinX - snappedLeftInset()); + hoverOverlay.setY(bounds.getMinY() + diffMinY - snappedTopInset()); + hoverOverlay.setWidth(control.getLayoutBounds().getWidth()); + hoverOverlay.setHeight(control.getLayoutBounds().getHeight()); + hoverOverlay.setClip(getMask()); + } } /*************************************************************************** diff --git a/HMCL/src/main/java/com/jfoenix/skins/JFXTabPaneSkin.java b/HMCL/src/main/java/com/jfoenix/skins/JFXTabPaneSkin.java index 855db30da39..0ca99bf1317 100644 --- a/HMCL/src/main/java/com/jfoenix/skins/JFXTabPaneSkin.java +++ b/HMCL/src/main/java/com/jfoenix/skins/JFXTabPaneSkin.java @@ -41,7 +41,6 @@ import javafx.geometry.Insets; import javafx.geometry.Side; import javafx.geometry.VPos; -import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.skin.TabPaneSkin; @@ -1126,7 +1125,6 @@ public HeaderControl(ArrowPosition pos) { StackPane container = new StackPane(arrowButton); container.getStyleClass().add("container"); container.setPadding(new Insets(7)); - container.setCursor(Cursor.HAND); container.setOnMousePressed(press -> { offsetProperty.set(header.scrollOffset); diff --git a/HMCL/src/main/java/com/jfoenix/skins/JFXToggleButtonSkin.java b/HMCL/src/main/java/com/jfoenix/skins/JFXToggleButtonSkin.java index 0548204d7cb..b0d65f94ec8 100644 --- a/HMCL/src/main/java/com/jfoenix/skins/JFXToggleButtonSkin.java +++ b/HMCL/src/main/java/com/jfoenix/skins/JFXToggleButtonSkin.java @@ -29,7 +29,6 @@ import com.jfoenix.transitions.JFXKeyValue; import javafx.animation.Interpolator; import javafx.geometry.Insets; -import javafx.scene.Cursor; import javafx.scene.control.skin.ToggleButtonSkin; import javafx.scene.layout.StackPane; import javafx.scene.shape.Circle; @@ -86,7 +85,6 @@ public JFXToggleButtonSkin(JFXToggleButton toggleButton) { final StackPane main = new StackPane(); main.getChildren().setAll(line, rippler); - main.setCursor(Cursor.HAND); // show focus traversal effect getSkinnable().armedProperty().addListener((o, oldVal, newVal) -> { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index a747c1a34c9..6c2150fe98a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -411,7 +411,6 @@ private static final class InstallerItemSkin extends SkinBase { event.consume(); } }); - pane.setCursor(Cursor.HAND); } else { container.setOnMouseClicked(null); pane.setCursor(Cursor.DEFAULT); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItemSkin.java index 81dd8f94012..15e75aae8e0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItemSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItemSkin.java @@ -23,7 +23,6 @@ import javafx.beans.binding.Bindings; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Cursor; import javafx.scene.canvas.Canvas; import javafx.scene.control.Label; import javafx.scene.control.SkinBase; @@ -53,7 +52,6 @@ public AccountListItemSkin(AccountListItem skinnable) { super(skinnable); BorderPane root = new BorderPane(); - root.setCursor(Cursor.HAND); FXUtils.onClicked(root, skinnable::fire); JFXRadioButton chkSelected = new JFXRadioButton(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineButtonBase.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineButtonBase.java index 43dfec2fe03..4ff67132d3d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineButtonBase.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineButtonBase.java @@ -17,11 +17,7 @@ */ package org.jackhuang.hmcl.ui.construct; -import javafx.collections.ListChangeListener; import javafx.event.ActionEvent; -import javafx.scene.Cursor; -import javafx.scene.Node; -import javafx.scene.Parent; import org.jackhuang.hmcl.ui.FXUtils; /// @author Glavo @@ -34,31 +30,13 @@ public LineButtonBase() { this.getStyleClass().addAll(LineButtonBase.DEFAULT_STYLE_CLASS); this.ripplerContainer = new RipplerContainer(container); - container.getChildren().addListener((ListChangeListener) change -> updateCursor()); - disabledProperty().addListener(observable -> updateCursor()); FXUtils.setOverflowHidden(this); FXUtils.onClicked(this, this::fire); this.getChildren().setAll(ripplerContainer); - updateCursor(); } public void fire() { fireEvent(new ActionEvent(this, this)); } - - /// Updates the cursor shown by the row rippler. - private void updateCursor() { - applyCursor(this, isDisabled() ? Cursor.DEFAULT : Cursor.HAND); - } - - /// Applies the row cursor to every current child node that may receive mouse hover. - private static void applyCursor(Node node, Cursor cursor) { - node.setCursor(cursor); - if (node instanceof Parent parent) { - for (Node child : parent.getChildrenUnmodifiable()) { - applyCursor(child, cursor); - } - } - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java index 4c6fae21bee..d3de640e2cf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java @@ -18,13 +18,13 @@ package org.jackhuang.hmcl.ui.construct; import com.jfoenix.controls.JFXRippler; -import javafx.animation.Transition; -import javafx.css.*; +import javafx.css.CssMetaData; +import javafx.css.Styleable; +import javafx.css.StyleableObjectProperty; +import javafx.css.StyleableProperty; import javafx.css.converter.PaintConverter; -import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Node; -import javafx.scene.input.MouseEvent; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; @@ -32,9 +32,6 @@ import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Rectangle; -import org.jackhuang.hmcl.theme.Themes; -import org.jackhuang.hmcl.ui.animation.AnimationUtils; -import org.jackhuang.hmcl.ui.animation.Motion; import java.util.ArrayList; import java.util.List; @@ -63,8 +60,6 @@ protected Node getMask() { } }; - private Transition coverAnimation; - public RipplerContainer(Node container) { this.container = container; @@ -90,61 +85,6 @@ public RipplerContainer(Node container) { shape.widthProperty().bind(widthProperty()); shape.heightProperty().bind(heightProperty()); setShape(shape); - - EventHandler mouseEventHandler; - if (AnimationUtils.isAnimationEnabled()) { - mouseEventHandler = event -> { - if (coverAnimation != null) { - coverAnimation.stop(); - coverAnimation = null; - } - - if (event.getEventType() == MouseEvent.MOUSE_ENTERED) { - coverAnimation = new Transition() { - { - setCycleDuration(Motion.SHORT4); - setInterpolator(Motion.EASE_IN); - } - - @Override - protected void interpolate(double frac) { - interpolateBackground(frac); - } - }; - } else { - coverAnimation = new Transition() { - { - setCycleDuration(Motion.SHORT4); - setInterpolator(Motion.EASE_OUT); - } - - @Override - protected void interpolate(double frac) { - interpolateBackground(1 - frac); - } - }; - } - - coverAnimation.play(); - }; - } else { - mouseEventHandler = event -> - interpolateBackground(event.getEventType() == MouseEvent.MOUSE_ENTERED ? 1 : 0); - } - - addEventHandler(MouseEvent.MOUSE_ENTERED, mouseEventHandler); - addEventHandler(MouseEvent.MOUSE_EXITED, mouseEventHandler); - } - - private void interpolateBackground(double frac) { - if (frac < 0.01) { - setBackground(null); - } else { - Color onSurface = Themes.getColorScheme().getOnSurface(); - setBackground(new Background(new BackgroundFill( - Color.color(onSurface.getRed(), onSurface.getGreen(), onSurface.getBlue(), frac * 0.04), - CornerRadii.EMPTY, Insets.EMPTY))); - } } protected void updateChildren() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java index 467d7d5517f..24f9609baf1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/DownloadListPage.java @@ -30,7 +30,6 @@ import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.image.Image; @@ -554,7 +553,6 @@ protected ModDownloadListPageSkin(DownloadListPage control) { HBox container = new HBox(8); container.setPadding(new Insets(8)); - container.setCursor(Cursor.HAND); container.setAlignment(Pos.CENTER_LEFT); imageContainer.setMouseTransparent(true); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java index 7a7d9ecc5d6..fc6e2b6ddb2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/GameListCell.java @@ -17,13 +17,14 @@ */ package org.jackhuang.hmcl.ui.instances; -import com.jfoenix.controls.*; +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXPopup; +import com.jfoenix.controls.JFXRadioButton; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Cursor; import javafx.scene.control.ListCell; import javafx.scene.input.MouseButton; import javafx.scene.layout.BorderPane; @@ -142,7 +143,6 @@ public void fire() { right.getChildren().add(btnManage); } - root.setCursor(Cursor.HAND); container.setOnMouseClicked(e -> { GameListItem item = getItem(); if (item == null) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java index 72d5aff3710..250463dc0f7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/MainPage.java @@ -29,7 +29,6 @@ import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.Tooltip; @@ -179,7 +178,6 @@ public final class MainPage extends StackPane implements DecoratorPage { FXUtils.setLimitHeight(updatePane, 55); StackPane.setAlignment(updatePane, Pos.TOP_RIGHT); FXUtils.onClicked(updatePane, this::onUpgrade); - updatePane.setCursor(Cursor.HAND); FXUtils.onChange(showUpdateProperty(), this::doAnimation); FXUtils.onChange(showUpdateDialogProperty(), this::showUpdateDialog); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java index 3c6eb4dd864..711c56811ab 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/ThemePackManagementPage.java @@ -23,23 +23,14 @@ import com.jfoenix.controls.JFXTextField; import javafx.animation.PauseTransition; import javafx.beans.binding.Bindings; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.ReadOnlyObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.geometry.Insets; import javafx.geometry.Pos; -import javafx.scene.Cursor; import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.control.ListCell; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.Skin; -import javafx.scene.control.SkinBase; +import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -465,7 +456,6 @@ private ThemePackInfoDialog(ThemePackManagementPage page, ThemePackManager.Insta row.getChildren().setAll(themeIcon, item); var rowRippler = new RipplerContainer(row); - rowRippler.setCursor(Cursor.HAND); ComponentList.setNoPadding(rowRippler); FXUtils.onClicked(rowRippler, () -> { @@ -680,7 +670,6 @@ private ThemePackItemCell(ThemePackManagementPage page) { content.setMouseTransparent(true); center.getChildren().setAll(icon, content); HBox.setHgrow(content, Priority.ALWAYS); - center.setCursor(Cursor.HAND); FXUtils.onClicked(ripplerContainer, () -> { ThemePackManager.InstalledThemePack themePack = getItem(); if (themePack != null) { diff --git a/HMCL/src/main/resources/assets/css/root.css b/HMCL/src/main/resources/assets/css/root.css index 6b2634f711b..566f088ed94 100644 --- a/HMCL/src/main/resources/assets/css/root.css +++ b/HMCL/src/main/resources/assets/css/root.css @@ -392,10 +392,6 @@ -fx-fill: -monet-inverse-on-surface; } -.sponsor-pane { - -fx-cursor: hand; -} - .installer-item-status:incompatible { -fx-opacity: 0.6; } @@ -448,7 +444,6 @@ -fx-min-height: 55px; -fx-background-color: -monet-primary-container; -fx-opacity: 1; /* Override the opacity of disabled button */ - -fx-cursor: hand; } .launch-pane > .jfx-button.launch-button { @@ -456,12 +451,12 @@ -fx-min-width: 200px; -fx-border-width: 0 3px 0 0; -fx-border-color: linear-gradient( - to bottom, - transparent 0%, - transparent 20%, + to bottom, + transparent 0%, + transparent 20%, -monet-on-surface-variant 20%, -monet-on-surface-variant 80%, - transparent 80%, + transparent 80%, transparent 100% ); -fx-background-radius: 4px 0 0 4px; @@ -670,7 +665,6 @@ .icon { -fx-fill: #FE774D; -fx-padding: 10.0; - -fx-cursor: hand; } /******************************************************************************* @@ -707,7 +701,6 @@ -fx-min-height: 40px; -fx-max-height: 40px; -fx-pref-height: 40px; - -fx-cursor: hand; } .jfx-tool-bar .jfx-decorator-button .svg { @@ -839,16 +832,6 @@ -fx-background-insets: 0; } -/******************************************************************************* -* * -* JFX Rippler * -* * -*******************************************************************************/ - -.jfx-rippler:hover { - -fx-cursor: hand; -} - /******************************************************************************* * * * JFX Button * @@ -857,7 +840,6 @@ .jfx-button { -jfx-disable-visual-focus: true; - -fx-cursor: hand; } .jfx-button .jfx-rippler { @@ -1553,7 +1535,6 @@ .combo-box-popup .list-view .jfx-list-cell { -fx-background-color: -monet-surface-container; -fx-text-fill: -monet-on-surface; - -fx-cursor: hand; -fx-background-insets: 0.0; }