Add edge-to-edge tweak

Supposed to be used when component is placed within another control that already provides external borders. Should not be confused with 'no-border' style. Some controls in the 'edge-to-edge' mode still need a border, e.g. toolbar always needs the bottom border.
This commit is contained in:
mkpaz 2022-09-05 08:50:13 +04:00
parent 48fb49f967
commit b50dd57f75
10 changed files with 72 additions and 25 deletions

@ -1,7 +1,15 @@
package atlantafx.base.theme; package atlantafx.base.theme;
/** Contains extra style class names introduced to tweak some controls view. */ /**
* Contains extra style class names introduced to tweak some controls view if and where it makes sense.
* The reason of supporting tweaks is to allow users to write less CSS code. Search for #tweak/classname
* to find the controls supporting tweaks or check the control page in the Sampler app.
*/
public final class Tweaks { public final class Tweaks {
/** Removes or hides dropdown arrow button */
public static final String NO_ARROW = "no-arrow"; public static final String NO_ARROW = "no-arrow";
/** Remover external control borders */
public static final String EDGE_TO_EDGE = "edge-to-edge";
} }

@ -3,6 +3,7 @@ package atlantafx.sampler.page.components;
import atlantafx.base.controls.Spacer; import atlantafx.base.controls.Spacer;
import atlantafx.base.controls.ToggleSwitch; import atlantafx.base.controls.ToggleSwitch;
import atlantafx.base.theme.Tweaks;
import atlantafx.sampler.fake.domain.Book; import atlantafx.sampler.fake.domain.Book;
import atlantafx.sampler.page.AbstractPage; import atlantafx.sampler.page.AbstractPage;
import javafx.geometry.Orientation; import javafx.geometry.Orientation;
@ -91,18 +92,22 @@ public class ListPage extends AbstractPage {
var stripedToggle = new ToggleSwitch("Striped"); var stripedToggle = new ToggleSwitch("Striped");
stripedToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, STRIPED))); stripedToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, STRIPED)));
var edge2edgeToggle = new ToggleSwitch("Edge to edge");
edge2edgeToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, Tweaks.EDGE_TO_EDGE)));
var disableToggle = new ToggleSwitch("Disable"); var disableToggle = new ToggleSwitch("Disable");
disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedList().ifPresent(lv -> { disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedList().ifPresent(lv -> {
if (val != null) { lv.setDisable(val); } if (val != null) { lv.setDisable(val); }
})); }));
var controls = new HBox(20, var controls = new HBox(20,
new Spacer(), new Spacer(),
borderedToggle, borderedToggle,
denseToggle, denseToggle,
stripedToggle, stripedToggle,
disableToggle, edge2edgeToggle,
new Spacer() disableToggle,
new Spacer()
); );
playground.getChildren().setAll( playground.getChildren().setAll(
@ -273,11 +278,11 @@ public class ListPage extends AbstractPage {
purchaseBtn.setGraphic(new FontIcon(Feather.SHOPPING_CART)); purchaseBtn.setGraphic(new FontIcon(Feather.SHOPPING_CART));
root = new HBox(5, root = new HBox(5,
titleLabel, titleLabel,
new Label(" by"), new Label(" by"),
authorLink, authorLink,
new Spacer(), new Spacer(),
purchaseBtn purchaseBtn
); );
root.setAlignment(Pos.CENTER_LEFT); root.setAlignment(Pos.CENTER_LEFT);
} }

@ -1,10 +1,11 @@
/* SPDX-License-Identifier: MIT */ /* SPDX-License-Identifier: MIT */
package atlantafx.sampler.page.components; package atlantafx.sampler.page.components;
import atlantafx.base.controls.ToggleSwitch;
import atlantafx.sampler.fake.domain.Product;
import atlantafx.base.controls.CaptionMenuItem; import atlantafx.base.controls.CaptionMenuItem;
import atlantafx.base.controls.Spacer; import atlantafx.base.controls.Spacer;
import atlantafx.base.controls.ToggleSwitch;
import atlantafx.base.theme.Tweaks;
import atlantafx.sampler.fake.domain.Product;
import atlantafx.sampler.page.AbstractPage; import atlantafx.sampler.page.AbstractPage;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding; import javafx.beans.binding.StringBinding;
@ -225,6 +226,15 @@ public class TablePage extends AbstractPage {
table.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty()); table.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty());
cellSelectionItem.setSelected(false); cellSelectionItem.setSelected(false);
var edge2edgeItem = new CheckMenuItem("Edge to edge");
edge2edgeItem.selectedProperty().addListener((obs, old, val) -> {
if (!val) {
table.getStyleClass().remove(Tweaks.EDGE_TO_EDGE);
} else {
table.getStyleClass().add(Tweaks.EDGE_TO_EDGE);
}
});
var menuButtonItem = new CheckMenuItem("Show menu button"); var menuButtonItem = new CheckMenuItem("Show menu button");
table.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty()); table.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty());
menuButtonItem.setSelected(true); menuButtonItem.setSelected(true);
@ -240,6 +250,7 @@ public class TablePage extends AbstractPage {
new SeparatorMenuItem(), new SeparatorMenuItem(),
editCellsItem, editCellsItem,
cellSelectionItem, cellSelectionItem,
edge2edgeItem,
menuButtonItem menuButtonItem
); );
}}; }};

@ -3,6 +3,7 @@ package atlantafx.sampler.page.components;
import atlantafx.base.controls.Spacer; import atlantafx.base.controls.Spacer;
import atlantafx.base.controls.ToggleSwitch; import atlantafx.base.controls.ToggleSwitch;
import atlantafx.base.theme.Tweaks;
import atlantafx.sampler.page.AbstractPage; import atlantafx.sampler.page.AbstractPage;
import javafx.geometry.Orientation; import javafx.geometry.Orientation;
import javafx.scene.control.*; import javafx.scene.control.*;
@ -71,6 +72,11 @@ public class TreePage extends AbstractPage {
})); }));
showRootToggle.setSelected(true); showRootToggle.setSelected(true);
var edge2edgeToggle = new ToggleSwitch("Edge to edge");
edge2edgeToggle.selectedProperty().addListener(
(obs, old, val) -> findDisplayedTree().ifPresent(tv -> toggleStyleClass(tv, Tweaks.EDGE_TO_EDGE))
);
var disableToggle = new ToggleSwitch("Disable"); var disableToggle = new ToggleSwitch("Disable");
disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedTree().ifPresent(tv -> { disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedTree().ifPresent(tv -> {
if (val != null) { tv.setDisable(val); } if (val != null) { tv.setDisable(val); }
@ -80,6 +86,7 @@ public class TreePage extends AbstractPage {
new Spacer(), new Spacer(),
denseToggle, denseToggle,
showRootToggle, showRootToggle,
edge2edgeToggle,
disableToggle, disableToggle,
new Spacer() new Spacer()
); );

@ -4,6 +4,7 @@ package atlantafx.sampler.page.components;
import atlantafx.base.controls.CaptionMenuItem; import atlantafx.base.controls.CaptionMenuItem;
import atlantafx.base.controls.Spacer; import atlantafx.base.controls.Spacer;
import atlantafx.base.controls.ToggleSwitch; import atlantafx.base.controls.ToggleSwitch;
import atlantafx.base.theme.Tweaks;
import atlantafx.sampler.fake.domain.Product; import atlantafx.sampler.fake.domain.Product;
import atlantafx.sampler.page.AbstractPage; import atlantafx.sampler.page.AbstractPage;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
@ -55,10 +56,10 @@ public class TreeTablePage extends AbstractPage {
}); });
var togglesBox = new HBox(20, var togglesBox = new HBox(20,
bordersToggle, bordersToggle,
denseToggle, denseToggle,
stripesToggle, stripesToggle,
disableToggle disableToggle
); );
togglesBox.setAlignment(Pos.CENTER_LEFT); togglesBox.setAlignment(Pos.CENTER_LEFT);
@ -213,6 +214,15 @@ public class TreeTablePage extends AbstractPage {
treeTable.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty()); treeTable.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty());
cellSelectionItem.setSelected(false); cellSelectionItem.setSelected(false);
var edge2edgeItem = new CheckMenuItem("Edge to edge");
edge2edgeItem.selectedProperty().addListener((obs, old, val) -> {
if (!val) {
treeTable.getStyleClass().remove(Tweaks.EDGE_TO_EDGE);
} else {
treeTable.getStyleClass().add(Tweaks.EDGE_TO_EDGE);
}
});
var menuButtonItem = new CheckMenuItem("Show menu button"); var menuButtonItem = new CheckMenuItem("Show menu button");
treeTable.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty()); treeTable.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty());
menuButtonItem.setSelected(true); menuButtonItem.setSelected(true);
@ -229,6 +239,7 @@ public class TreeTablePage extends AbstractPage {
showRootItem, showRootItem,
editCellsItem, editCellsItem,
cellSelectionItem, cellSelectionItem,
edge2edgeItem,
menuButtonItem menuButtonItem
); );
}}; }};

@ -2,6 +2,7 @@
package atlantafx.sampler.page.showcase.musicplayer; package atlantafx.sampler.page.showcase.musicplayer;
import atlantafx.base.controls.Spacer; import atlantafx.base.controls.Spacer;
import atlantafx.base.theme.Tweaks;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.concurrent.Task; import javafx.concurrent.Task;
@ -82,6 +83,7 @@ final class PlaylistPane extends VBox {
controlsBox.setAlignment(CENTER_LEFT); controlsBox.setAlignment(CENTER_LEFT);
playlist = new ListView<>(model.playlist()); playlist = new ListView<>(model.playlist());
playlist.getStyleClass().add(Tweaks.EDGE_TO_EDGE);
playlist.setCellFactory(param -> new MediaCell(model)); playlist.setCellFactory(param -> new MediaCell(model));
playlist.setPlaceholder(new Label("No Content")); playlist.setPlaceholder(new Label("No Content"));
VBox.setVgrow(playlist, ALWAYS); VBox.setVgrow(playlist, ALWAYS);
@ -205,4 +207,4 @@ final class PlaylistPane extends VBox {
} }
} }
} }
} }

@ -41,12 +41,9 @@
-color-button-bg-focused: transparent; -color-button-bg-focused: transparent;
-color-button-bg-pressed: transparent; -color-button-bg-pressed: transparent;
} }
.music-player-showcase > .player-screen > * > .playlist > .list-view {
-fx-border-width: 0;
}
.music-player-showcase > .player-screen > * > .playlist > .list-view .list-cell { .music-player-showcase > .player-screen > * > .playlist > .list-view .list-cell {
-color-cell-bg: transparent; -color-cell-bg: transparent;
-color-cell-bg-selected: transparent; -color-cell-bg-selected: transparent;
-color-cell-border: transparent; -color-cell-border: transparent;
-fx-cell-size: 4em; -fx-cell-size: 4em;
} }

@ -50,6 +50,11 @@ $tree-cell-indent: 1em !default;
-fx-opacity: cfg.$opacity-disabled; -fx-opacity: cfg.$opacity-disabled;
} }
} }
// #tweak/edge-to-edge
&.edge-to-edge {
-fx-border-width: 0;
}
} }
// row selection (cellSelectionEnabled = false) // row selection (cellSelectionEnabled = false)
@ -481,4 +486,4 @@ $tree-cell-indent: 1em !default;
-fx-alignment: CENTER_LEFT; -fx-alignment: CENTER_LEFT;
} }
} }
} }

@ -122,6 +122,7 @@ $separator-width: 0.75px !default;
} }
.menu-button { .menu-button {
// #tweak/no-arrow
&.no-arrow { &.no-arrow {
>.arrow-button { >.arrow-button {
-fx-padding: 0; -fx-padding: 0;

@ -87,4 +87,4 @@ $thumb-radius: cfg.$border-radius !default;
-fx-opacity: cfg.$scrollbar-opacity-disabled; -fx-opacity: cfg.$scrollbar-opacity-disabled;
} }
} }
} }