diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/IconSwitch.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/IconSwitch.java new file mode 100644 index 0000000..a0e34b5 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/IconSwitch.java @@ -0,0 +1,63 @@ +package com.fx.client.gui.uicomponents.basicInfo; + +import com.fx.client.gui.uicomponents.basicInfo.skin.IconSwitchSkin; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Control; +import javafx.scene.control.Label; +import javafx.scene.control.Skin; + +/** + * @version: 0.0.1 + * @description: + * @className: IconSwitch + * @author: liwen + * @date: 2021/2/22 10:21 + */ +public class IconSwitch extends Control { + + // CSS pseudo classes + private BooleanProperty selected; + + private final Label symbol; + + // ******************** Constructors ************************************** + public IconSwitch() { + getStyleClass().addAll("icon-switch"); + symbol = new Label(); + symbol.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + } + + // ******************** Methods ******************************************* + public final boolean isSelected() { + return null == selected ? false : selected.get(); + } + + public final void setSelected(final boolean ON) { + selectedProperty().set(ON); + } + + public final BooleanProperty selectedProperty() { + if (null == selected) { + selected = new SimpleBooleanProperty(); + } + return selected; + } + + // ******************** Style related ************************************* + @Override + protected Skin createDefaultSkin() { + return new IconSwitchSkin(this); + } + + @Override + public String getUserAgentStylesheet() { + return getClass().getResource("/css/iconswitch.css").toExternalForm(); + } + + + public Label getSymbol() { + return symbol; + } +} diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/skin/IconSwitchSkin.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/skin/IconSwitchSkin.java new file mode 100644 index 0000000..5038568 --- /dev/null +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/basicInfo/skin/IconSwitchSkin.java @@ -0,0 +1,197 @@ +package com.fx.client.gui.uicomponents.basicInfo.skin; + +import com.fx.client.gui.uicomponents.basicInfo.IconSwitch; +import com.jfoenix.svg.SVGGlyph; +import javafx.animation.TranslateTransition; +import javafx.geometry.Pos; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Label; +import javafx.scene.control.SkinBase; +import javafx.scene.layout.Pane; +import javafx.scene.shape.Rectangle; +import javafx.util.Duration; + +/** + * @version: 0.0.1 + * @description: + * @className: IconSwitch + * @author: liwen + * @date: 2021/2/22 10:21 + */ +public class IconSwitchSkin extends SkinBase { + private static final double PREFERRED_WIDTH = 80; + private static final double PREFERRED_HEIGHT = 32; + private static final double MINIMUM_WIDTH = 20; + private static final double MINIMUM_HEIGHT = 8; + private static final double MAXIMUM_WIDTH = 1024; + private static final double MAXIMUM_HEIGHT = 1024; + private double size; + + private double aspectRatio; + private double width; + private double height; + private Pane pane; + private Rectangle background; + private SVGGlyph symbol; + private Label thumb; + private TranslateTransition moveToDeselected; + private TranslateTransition moveToSelected; + + // ******************** Constructors ************************************** + public IconSwitchSkin(final IconSwitch CONTROL) { + super(CONTROL); + init(); + initGraphics(); + registerListeners(); + resize(); + } + + // ******************** Initialization ************************************ + private void init() { + if (Double.compare(getSkinnable().getPrefWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getPrefHeight(), 0.0) <= 0 || + Double.compare(getSkinnable().getWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getHeight(), 0.0) <= 0) { + if (getSkinnable().getPrefWidth() > 0 && getSkinnable().getPrefHeight() > 0) { + getSkinnable().setPrefSize(getSkinnable().getPrefWidth(), getSkinnable().getPrefHeight()); + } else { + getSkinnable().setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT); + } + } + + if (Double.compare(getSkinnable().getMinWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getMinHeight(), 0.0) <= 0) { + getSkinnable().setMinSize(MINIMUM_WIDTH, MINIMUM_HEIGHT); + } + + if (Double.compare(getSkinnable().getMaxWidth(), 0.0) <= 0 || Double.compare(getSkinnable().getMaxHeight(), 0.0) <= 0) { + getSkinnable().setMaxSize(MAXIMUM_WIDTH, MAXIMUM_HEIGHT); + } + + if (getSkinnable().getPrefWidth() != PREFERRED_WIDTH || getSkinnable().getPrefHeight() != PREFERRED_HEIGHT) { + aspectRatio = getSkinnable().getPrefHeight() / getSkinnable().getPrefWidth(); + } + } + + + private void initGraphics() { + + background = new Rectangle(); + background.getStyleClass().setAll("background"); + + + symbol = new SVGGlyph(""); + symbol.setSize(20, 20); + symbol.setId("symbol-a"); + + thumb = new Label(""); + thumb.setGraphic(symbol); + thumb.setAlignment(Pos.CENTER); + thumb.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + thumb.getStyleClass().setAll("thumb-a"); + thumb.setMouseTransparent(true); + + + pane = new Pane(background, thumb); + pane.getStyleClass().setAll("icon-switch"); + + moveToDeselected = new TranslateTransition(Duration.millis(180), thumb); + moveToSelected = new TranslateTransition(Duration.millis(180), thumb); + + // Add all nodes + getChildren().setAll(pane); + } + + private void registerListeners() { + getSkinnable().widthProperty().addListener(observable -> handleControlPropertyChanged("RESIZE")); + getSkinnable().heightProperty().addListener(observable -> handleControlPropertyChanged("RESIZE")); + getSkinnable().selectedProperty().addListener(observable -> handleControlPropertyChanged("SELECTED")); + pane.setOnMouseClicked(mouseEvent -> { + getSkinnable().setSelected(!getSkinnable().isSelected()); + }); + } + + // ******************** Methods ******************************************* + protected void handleControlPropertyChanged(final String PROPERTY) { + if ("RESIZE".equals(PROPERTY)) { + resize(); + } else if ("SELECTED".equals(PROPERTY)) { + + thumb.getStyleClass().removeAll("thumb-a-selected" , "thumb-a"); + thumb.getStyleClass().setAll(getSkinnable().isSelected() ? "thumb-a-selected" : "thumb-a"); + symbol.setId(getSkinnable().isSelected() ? "symbol-a-selected" : "symbol-a"); +// symbol.setStyle(getSkinnable().isSelected() ? "-fx-background-color: #191e1e;" : " -fx-background-color: #ffffff;"); + if (getSkinnable().isSelected()) { + moveToSelected.play(); + } else { + moveToDeselected.play(); + } + } + } + + + @Override + protected double computeMinWidth(final double HEIGHT, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + return super.computeMinWidth(Math.max(MINIMUM_HEIGHT, HEIGHT - TOP_INSET - BOTTOM_INSET), TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + @Override + protected double computeMinHeight(final double WIDTH, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + return super.computeMinHeight(Math.max(MINIMUM_WIDTH, WIDTH - LEFT_INSET - RIGHT_INSET), TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + @Override + protected double computeMaxWidth(final double HEIGHT, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + return super.computeMaxWidth(Math.min(MAXIMUM_HEIGHT, HEIGHT - TOP_INSET - BOTTOM_INSET), TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + @Override + protected double computeMaxHeight(final double WIDTH, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + return super.computeMaxHeight(Math.min(MAXIMUM_WIDTH, WIDTH - LEFT_INSET - RIGHT_INSET), TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + @Override + protected double computePrefWidth(final double HEIGHT, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + double prefHeight = PREFERRED_HEIGHT; + if (HEIGHT != -1) { + prefHeight = Math.max(0, HEIGHT - TOP_INSET - BOTTOM_INSET); + } + return super.computePrefWidth(prefHeight, TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + @Override + protected double computePrefHeight(final double WIDTH, double TOP_INSET, double RIGHT_INSET, double BOTTOM_INSET, double LEFT_INSET) { + double prefWidth = PREFERRED_WIDTH; + if (WIDTH != -1) { + prefWidth = Math.max(0, WIDTH - LEFT_INSET - RIGHT_INSET); + } + return super.computePrefHeight(prefWidth, TOP_INSET, RIGHT_INSET, BOTTOM_INSET, LEFT_INSET); + } + + + // ******************** Private Methods *********************************** + private void resize() { + width = getSkinnable().getWidth(); + height = getSkinnable().getHeight(); + size = (width < height ? width : height)*.65; + + if (width > 0 && height > 0) { + + background.heightProperty().set(height * 0.35); + background.widthProperty().set(width); + background.arcHeightProperty().setValue(background.getHeight()); + background.arcWidthProperty().setValue(background.getHeight()); + background.setTranslateY((height - background.getHeight()) / 2.0); + + thumb.setPrefSize(size, size); + thumb.setTranslateX(getSkinnable().isSelected() ? width - size : 0); + thumb.setTranslateY((height - size) / 2.0); + + symbol.setSize((size * 0.65), (size * 0.65)); + + moveToDeselected.setFromX(width -size); + moveToDeselected.setToX(0); + + moveToSelected.setFromX(0); + moveToSelected.setToX(width - size); + } + } + +} diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java index 9d04923..d36dbd1 100644 --- a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/control/LFXDecorator.java @@ -2,18 +2,9 @@ package com.fx.client.gui.uicomponents.control; import com.jfoenix.controls.JFXButton; import com.jfoenix.svg.SVGGlyph; -import javafx.animation.Animation; -import javafx.animation.Interpolator; -import javafx.animation.KeyFrame; -import javafx.animation.KeyValue; -import javafx.animation.Timeline; +import javafx.animation.*; import javafx.application.Platform; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; +import javafx.beans.property.*; import javafx.geometry.BoundingBox; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -21,21 +12,10 @@ import javafx.geometry.Rectangle2D; import javafx.scene.Cursor; import javafx.scene.Node; import javafx.scene.control.Tooltip; +import javafx.scene.effect.BlendMode; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.Background; -import javafx.scene.layout.BackgroundFill; -import javafx.scene.layout.Border; -import javafx.scene.layout.BorderStroke; -import javafx.scene.layout.BorderStrokeStyle; -import javafx.scene.layout.BorderWidths; -import javafx.scene.layout.CornerRadii; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; -import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; import javafx.scene.paint.Color; -import javafx.scene.shape.Rectangle; import javafx.scene.text.Text; import javafx.stage.Screen; import javafx.stage.Stage; @@ -351,7 +331,6 @@ public class LFXDecorator extends StackPane { } }); buttonsContainer.setMinWidth(180); - contentPlaceHolder.getStyleClass().add("lfx-decorator-content-container"); contentPlaceHolder.setMinSize(0, 0); StackPane clippedContainer = new StackPane(node); contentPlaceHolder.getChildren().add(clippedContainer); @@ -361,15 +340,9 @@ public class LFXDecorator extends StackPane { // BINDING - Rectangle clip = new Rectangle(); - clip.setArcWidth(20); - clip.setArcHeight(20); - clip.widthProperty().bind(contentPane.widthProperty()); - clip.heightProperty().bind(contentPane.heightProperty()); - VBox.setVgrow(contentPlaceHolder, Priority.ALWAYS); - contentPane.getChildren().addAll(buttonsContainer, contentPlaceHolder); - contentPane.setClip(clip); + contentPane.getChildren().addAll(buttonsContainer,contentPlaceHolder); + contentPane.setBlendMode(BlendMode.SRC_ATOP); this.setPadding(new Insets(3,3,3,3)); this.getChildren().addAll(contentPane); diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java index a10d4ec..ceb9fea 100644 --- a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java @@ -179,7 +179,7 @@ public class LoginController { registeredPane.managedProperty().bind(registeredPane.visibleProperty()); initAnimation(); - loadingImage(); +// loadingImage(); initAction(); } diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java index 16a3448..afffe95 100644 --- a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/main/MainController.java @@ -3,6 +3,7 @@ package com.fx.client.gui.uicomponents.main; import com.fx.client.AppStartup; import com.fx.client.bean.MenuVoCell; import com.fx.client.gui.feature.FeatureResourceConsumer; +import com.fx.client.gui.uicomponents.basicInfo.IconSwitch; import com.fx.client.gui.uicomponents.home.HomeController; import com.fx.client.gui.uicomponents.login.LoginController; import com.fx.client.gui.uicomponents.main.components.UserInfoController; @@ -82,9 +83,8 @@ public class MainController { @FXML @ActionTrigger("goHome") private JFXButton homeButton; - @FXML @ActionTrigger("showSkinPane") - private JFXToggleNode styleNode; + private IconSwitch styleNode; //刷新按钮 @FXML @EventTrigger("refresh") @@ -127,7 +127,9 @@ public class MainController { @PostConstruct public void init() throws FlowException { - + styleNode=new IconSwitch(); + styleNode.setPrefSize(50,32); + rightHbox.getChildren().add(0,styleNode); navigationList=new JFXListView<>(); navigationList.getStyleClass().add("navigation-list"); leftDrawer = new JFXDrawer(); @@ -147,7 +149,6 @@ public class MainController { refreshButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".shuaxin1")); bellButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".cc-bell-o")); userButton.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".ChevronDownCircle")); - styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".moon-fill")); } catch (Exception e) { e.printStackTrace(); @@ -205,8 +206,16 @@ public class MainController { }); drawersStack.toggle(leftDrawer); drawersStack.setEffect(null); - - styleNode.selectedProperty().bindBidirectional(ApplicatonStore.styleProperty()); + ApplicatonStore.styleProperty().bindBidirectional( styleNode.selectedProperty()); + styleNode.selectedProperty().addListener((observable, oldValue, newValue) -> { + try { + showSkinPane(); + } catch (VetoException e) { + e.printStackTrace(); + } catch (FlowException e) { + e.printStackTrace(); + } + }); featureResourceConsumer.consumeResource(this); navigationList.setCellFactory(listView -> new JFXListCell() { @@ -412,19 +421,10 @@ public class MainController { String style2 = AppStartup.class.getResource("/css/app-dark.css").toExternalForm(); if (styleNode.isSelected()) { - try { - styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".taiyang")); - } catch (Exception e) { - e.printStackTrace(); - } + styleNode.getScene().getStylesheets().removeAll(style1); styleNode.getScene().getStylesheets().addAll(style2); } else { - try { - styleNode.setGraphic(SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".moon-fill")); - } catch (Exception e) { - e.printStackTrace(); - } styleNode.getScene().getStylesheets().removeAll(style2); styleNode.getScene().getStylesheets().addAll(style1); diff --git a/falsework-client/src/main/resources/css/app-dark.css b/falsework-client/src/main/resources/css/app-dark.css index 816453c..21c992b 100644 --- a/falsework-client/src/main/resources/css/app-dark.css +++ b/falsework-client/src/main/resources/css/app-dark.css @@ -222,7 +222,8 @@ .lfx-decorator { -fx-decorator-color: -fx-main-base; - -fx-background-color: transparent; + -fx-background-color: -fx-main-base; + -fx-background-radius: 11; } diff --git a/falsework-client/src/main/resources/css/app-light.css b/falsework-client/src/main/resources/css/app-light.css index 2285798..048b555 100644 --- a/falsework-client/src/main/resources/css/app-light.css +++ b/falsework-client/src/main/resources/css/app-light.css @@ -219,8 +219,8 @@ .lfx-decorator { -fx-decorator-color: -fx-main-base; - -fx-background-color: transparent; - + -fx-background-color: -fx-main-base; + -fx-background-radius: 11; } .lfx-decorator .lfx-decorator-buttons-container { diff --git a/falsework-client/src/main/resources/css/iconswitch.css b/falsework-client/src/main/resources/css/iconswitch.css new file mode 100644 index 0000000..4856dec --- /dev/null +++ b/falsework-client/src/main/resources/css/iconswitch.css @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2013 by Gerrit Grunwald + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/************************************************************ +* ICON-SWITCH class * +************************************************************/ +.icon-switch { + -fx-skin: "com.fx.client.gui.uicomponents.basicInfo.skin.IconSwitchSkin"; + -switch-color: white; + -thumb-color: white; +} + +.icon-switch > .background { + -fx-fill: #41464b; +} + +.icon-switch > .thumb-a { + -fx-background-color: #909191; + -fx-background-radius: 1024; +} + +.icon-switch > .thumb-a-selected { + -fx-background-color: #9b9b9b; + -fx-background-radius: 1024; +} + + + +.icon-switch .thumb-a .jfx-svg-glyph { + -fx-shape: "M511.951 74.082c16.284 0 29.529-13.001 29.904-29.18l0.008-0.706v-81.31c0-16.506-13.392-29.886-29.912-29.886-16.283 0-29.528 13-29.903 29.18l-0.008 0.706v81.31c0 16.505 13.392 29.886 29.911 29.886z m-219.283 93.56c11.514-11.505 11.679-30.056 0.493-41.761l-0.493-0.505-57.545-57.495c-11.68-11.67-30.62-11.67-42.301 0-11.515 11.505-11.68 30.055-0.494 41.76l0.494 0.505 57.544 57.495c11.681 11.671 30.62 11.671 42.302 0z m484.965 0.492l0.505-0.493 57.545-57.495c11.681-11.67 11.681-30.593 0-42.265-11.515-11.504-30.08-11.669-41.797-0.493l-0.505 0.493-57.544 57.495c-11.682 11.671-11.682 30.594 0 42.265 11.514 11.505 30.08 11.669 41.796 0.493zM511.951 645.787c143.596 0 260.003-116.306 260.003-259.778 0-143.471-116.407-259.778-260.003-259.778-143.595 0-260.003 116.307-260.003 259.778 0 143.472 116.408 259.778 260.003 259.778z m0-59.772c-110.556 0-200.179-89.545-200.179-200.006 0-110.46 89.623-200.006 200.18-200.006 110.555 0 200.179 89.546 200.179 200.006s-89.624 200.006-200.18 200.006z m-336.694-167.07c16.505 0 29.886-13.391 29.886-29.911 0-16.284-13.001-29.529-29.18-29.904l-0.706-0.008h-81.31c-16.506 0-29.886 13.392-29.886 29.912 0 16.284 13 29.528 29.18 29.904l0.706 0.008h81.31z m747.796 0c16.506 0 29.886-13.391 29.886-29.911 0-16.284-13-29.529-29.18-29.904l-0.706-0.008h-81.31c-16.505 0-29.886 13.392-29.886 29.912 0 16.284 13.001 29.528 29.18 29.904l0.706 0.008h81.31zM234.618 708.382l0.505-0.493 57.545-57.495c11.681-11.671 11.681-30.594 0-42.265-11.515-11.505-30.08-11.67-41.797-0.493l-0.505 0.493-57.544 57.494c-11.682 11.672-11.682 30.594 0 42.265 11.514 11.505 30.08 11.67 41.796 0.494z m596.463-0.493c11.515-11.505 11.679-30.055 0.494-41.76l-0.494-0.506-57.544-57.494c-11.682-11.671-30.62-11.671-42.302 0-11.515 11.504-11.679 30.055-0.494 41.76l0.494 0.505 57.544 57.495c11.682 11.67 30.62 11.67 42.302 0zM511.951 832c16.284 0 29.529-13 29.904-29.18l0.008-0.706v-81.31c0-16.505-13.392-29.886-29.912-29.886-16.283 0-29.528 13.001-29.903 29.18l-0.008 0.706v81.31C482.04 818.62 495.432 832 511.95 832z"; +} + +.icon-switch .thumb-a-selected .jfx-svg-glyph { + -fx-shape: "M485.546667 809.856a320 320 0 1 1 452.266666-452.266667C924.245333 134.229333 738.816-42.666667 512.042667-42.666667 276.352-42.666667 85.333333 148.352 85.333333 384c0 226.773333 176.896 412.202667 400.213334 425.856z"; +} + +.icon-switch:disabled { + -fx-opacity: 0.4; +} diff --git a/falsework-client/src/main/resources/fxml/main/main.fxml b/falsework-client/src/main/resources/fxml/main/main.fxml index af3b8f0..e19e5db 100644 --- a/falsework-client/src/main/resources/fxml/main/main.fxml +++ b/falsework-client/src/main/resources/fxml/main/main.fxml @@ -22,70 +22,83 @@ - + - + - + - + - + - + - - + + - + - + - - - + + + - + - + - - + - + - + - +