From 52923065e3a76c664e6a4cd4a9683f410e22e0c2 Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Tue, 17 Nov 2020 15:36:43 +0100 Subject: [PATCH] Fixed #160 - Add option to insert columns and rows --- .../DesktopMenuToolbarViewController.java | 34 ++++++++- .../project/GeneralTabViewController.java | 75 +++++-------------- .../src/main/resources/lang/_de.properties | 4 +- .../src/main/resources/lang/ui_de.properties | 2 + .../resources/view/main/desktop/Header.fxml | 4 + .../design/ModernDesignSizeHelper.java | 0 .../de/tobias/playpad/project/Project.java | 11 ++- .../project/ProjectSettingsValidator.java | 55 ++++++++++++++ .../de/tobias/playpad/project/page/Page.java | 35 ++++++++- 9 files changed, 157 insertions(+), 63 deletions(-) rename {PlayWall => PlayWallCore}/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java (100%) create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java index fc6d030e..696d5b14 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java +++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java @@ -26,6 +26,7 @@ import de.tobias.playpad.project.Project; import de.tobias.playpad.project.ProjectNotFoundException; import de.tobias.playpad.project.ProjectReader.ProjectReaderDelegate.ProfileAbortException; import de.tobias.playpad.project.ProjectSettings; +import de.tobias.playpad.project.ProjectSettingsValidator; import de.tobias.playpad.project.page.Page; import de.tobias.playpad.project.ref.ProjectReference; import de.tobias.playpad.project.ref.ProjectReferenceManager; @@ -303,8 +304,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro int index = 1; // Für Tastenkombination for (MainLayoutFactory connect : mainLayouts.getComponents()) { - if(connect.getType().equals(profileSettings.getMainLayoutType())) - { + if (connect.getType().equals(profileSettings.getMainLayoutType())) { continue; } @@ -324,7 +324,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro layoutMenu.getItems().add(item); index++; - } + } } @Override @@ -699,6 +699,34 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro } } + @FXML + void addColumnToProject() { + ProjectSettingsValidator projectSettingsValidator = new ProjectSettingsValidator(mainViewController.getScreen()); + final int maxValue = projectSettingsValidator.maxValue(ProjectSettingsValidator.Dimension.COLUMNS); + if (maxValue < openProject.getSettings().getColumns() + 1) { + showErrorMessage(Localization.getString("Error.Screen.TooMuch", maxValue)); + return; + } + + openProject.addColumn(); + mainViewController.createPadViews(); + mainViewController.showPage(mainViewController.getPage()); + } + + @FXML + void addRowToProject() { + ProjectSettingsValidator projectSettingsValidator = new ProjectSettingsValidator(mainViewController.getScreen()); + final int maxValue = projectSettingsValidator.maxValue(ProjectSettingsValidator.Dimension.ROWS); + if (maxValue < openProject.getSettings().getRows() + 1) { + showErrorMessage(Localization.getString("Error.Screen.TooMuch", maxValue)); + return; + } + + openProject.addRow(); + mainViewController.createPadViews(); + mainViewController.showPage(mainViewController.getPage()); + } + @FXML void alwaysOnTopItemHandler(ActionEvent event) { boolean selected = alwaysOnTopItem.isSelected(); diff --git a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java index dac32ea1..33ed71c9 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java +++ b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java @@ -6,6 +6,8 @@ import de.tobias.playpad.Strings; import de.tobias.playpad.design.ModernDesignSizeHelper; import de.tobias.playpad.project.Project; import de.tobias.playpad.project.ProjectSettings; +import de.tobias.playpad.project.ProjectSettingsValidator; +import de.tobias.playpad.project.ProjectSettingsValidator.ValidationState; import de.tobias.playpad.view.PseudoClasses; import de.tobias.playpad.viewcontroller.main.IMainViewController; import de.tobias.playpad.viewcontroller.option.IProjectReloadTask; @@ -16,25 +18,16 @@ import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.stage.Screen; -public class GeneralTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask { - - public static final int DISPLAY_OFFSET = 100; +import static de.tobias.playpad.project.ProjectSettingsValidator.Dimension; - private enum ValidationState { - NORMAL, - TOO_MUCH, - TOO_LESS - } - - private enum Dimension { - COLUMNS, - ROWS - } +public class GeneralTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask { private static final String DIGIT_POSITIVE = "^[1-9]\\d*$"; - private Screen mainWindowScreen; - private Alertable parentController; // Für Benachrichtungen + private final Screen mainWindowScreen; + private final Alertable parentController; // Für Benachrichtungen + + private final ProjectSettingsValidator projectSettingsValidator; @FXML private TextField columnTextField; @@ -52,6 +45,8 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i this.mainWindowScreen = currentScreen; this.parentController = parentController; + this.projectSettingsValidator = new ProjectSettingsValidator(this.mainWindowScreen); + if (activePlayer) { rowTextField.setDisable(true); columnTextField.setDisable(true); @@ -63,7 +58,7 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i columnTextField.textProperty().addListener((a, b, c) -> { if (c.matches(DIGIT_POSITIVE) && !c.isEmpty()) { - ValidationState validationState = validate(Integer.parseInt(c), Dimension.COLUMNS); + ValidationState validationState = projectSettingsValidator.validate(Integer.parseInt(c), Dimension.COLUMNS); if (validationState == ValidationState.NORMAL) { columnTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, false); columnErrorLabel.setText(""); @@ -73,22 +68,22 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i String errorText = ""; // Error Message if (validationState == ValidationState.TOO_MUCH) { - errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, maxValue(Dimension.COLUMNS)); + errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, projectSettingsValidator.maxValue(Dimension.COLUMNS)); } else if (validationState == ValidationState.TOO_LESS) { - errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.COLUMNS)); + errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.COLUMNS)); } columnErrorLabel.setText(errorText); } } else { columnTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, true); - columnErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.COLUMNS))); + columnErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.COLUMNS))); } }); rowTextField.textProperty().addListener((a, b, c) -> { if (c.matches(DIGIT_POSITIVE) && !c.isEmpty()) { - ValidationState validationState = validate(Integer.parseInt(c), Dimension.ROWS); + ValidationState validationState = projectSettingsValidator.validate(Integer.parseInt(c), Dimension.ROWS); if (validationState == ValidationState.NORMAL) { rowTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, false); rowErrorLabel.setText(""); @@ -98,49 +93,19 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i String errorText = ""; // Error Message if (validationState == ValidationState.TOO_MUCH) { - errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, maxValue(Dimension.ROWS)); + errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, projectSettingsValidator.maxValue(Dimension.ROWS)); } else if (validationState == ValidationState.TOO_LESS) { - errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.ROWS)); + errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.ROWS)); } rowErrorLabel.setText(errorText); } } else { rowTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, true); - rowErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.ROWS))); + rowErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.ROWS))); } }); } - private ValidationState validate(int input, Dimension dimension) { - if (input < minValue(dimension)) { - return ValidationState.TOO_LESS; - } else if (input > maxValue(dimension)) { - return ValidationState.TOO_MUCH; - } - return ValidationState.NORMAL; - } - - private int minValue(Dimension dimension) { - if (dimension == Dimension.COLUMNS) { - return ProjectSettings.MIN_COLUMNS; - } else if (dimension == Dimension.ROWS) { - return ProjectSettings.MIN_ROWS; - } - return -1; - } - - private int maxValue(Dimension dimension) { - double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX(); - double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY(); - - if (dimension == Dimension.COLUMNS) { - return Math.min((int) (width / ModernDesignSizeHelper.getPadWidth()), ProjectSettings.MAX_COLUMNS); - } else if (dimension == Dimension.ROWS) { - return Math.min((int) ((height - DISPLAY_OFFSET) / ModernDesignSizeHelper.getPadHeight()), ProjectSettings.MAX_ROWS); - } - return -1; - } - private boolean screenValid() { double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX(); double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY(); @@ -200,8 +165,8 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i @Override public boolean validSettings() { try { - return validate(Integer.parseInt(columnTextField.getText()), Dimension.COLUMNS) == ValidationState.NORMAL && - validate(Integer.parseInt(rowTextField.getText()), Dimension.ROWS) == ValidationState.NORMAL; + return projectSettingsValidator.validate(Integer.parseInt(columnTextField.getText()), Dimension.COLUMNS) == ValidationState.NORMAL && + projectSettingsValidator.validate(Integer.parseInt(rowTextField.getText()), Dimension.ROWS) == ValidationState.NORMAL; } catch (NumberFormatException e) { return false; } diff --git a/PlayWall/src/main/resources/lang/_de.properties b/PlayWall/src/main/resources/lang/_de.properties index cfbdf22e..3761ad40 100755 --- a/PlayWall/src/main/resources/lang/_de.properties +++ b/PlayWall/src/main/resources/lang/_de.properties @@ -144,8 +144,8 @@ Error.Plugins.Missing=Es wurden im Projekt Erweiterungen verwendet, welche momen Error.Plugins.Loading=Die Plugins konnten nicht vom geladen werden. Versuchen Sie es sp\u00E4ter erneut. Error.Plugins.Install=Es ist ein Fehler beim installieren des Plugins aufgetreten. Versuche Sie es sp\u00E4ter erneut ({}) # Error - Screen -Error.Screen.TooMuch=Maxiamle Anzahl der Kacheln {} -Error.Screen.TooLess=Minmale Anzahl der Kacheln {} +Error.Screen.TooMuch=Maximale Anzahl der Kacheln {} +Error.Screen.TooLess=Minimale Anzahl der Kacheln {} #Mapper Mapper.Keyboard.Name=Tastatur Mapper.Midi.Name=Midi diff --git a/PlayWall/src/main/resources/lang/ui_de.properties b/PlayWall/src/main/resources/lang/ui_de.properties index 1876ec12..48792534 100755 --- a/PlayWall/src/main/resources/lang/ui_de.properties +++ b/PlayWall/src/main/resources/lang/ui_de.properties @@ -29,6 +29,8 @@ main.menuitem.changelog=Changelog anzeigen... main.menuitem.website=Webseite anzeigen... main.menuitem.fullScreen=Vollbild main.menuitem.searchPad=Kachel suchen... +main.menuitem.addColumn=Spalte rechts hinzuf\u00FCgen +main.menuitem.addRow=Reihe unten hinzuf\u00FCgen main.label.live=Live settings.gen.label.behaviour=Programmstart: settings.gen.checkbox.openLastDocument=Automatisch zuletzt geladenes Projekt \u00F6ffnen. diff --git a/PlayWall/src/main/resources/view/main/desktop/Header.fxml b/PlayWall/src/main/resources/view/main/desktop/Header.fxml index e18a7a14..8383f694 100644 --- a/PlayWall/src/main/resources/view/main/desktop/Header.fxml +++ b/PlayWall/src/main/resources/view/main/desktop/Header.fxml @@ -126,6 +126,10 @@ </accelerator> </CheckMenuItem> <SeparatorMenuItem mnemonicParsing="false"/> + <MenuItem mnemonicParsing="false" onAction="#addColumnToProject" + text="%main.menuitem.addColumn"/> + <MenuItem mnemonicParsing="false" onAction="#addRowToProject" text="%main.menuitem.addRow"/> + <SeparatorMenuItem mnemonicParsing="false"/> <MenuItem fx:id="searchPadMenuItem" mnemonicParsing="false" onAction="#searchPadHandler" text="%main.menuitem.searchPad"/> <SeparatorMenuItem mnemonicParsing="false"/> diff --git a/PlayWall/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java b/PlayWallCore/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java similarity index 100% rename from PlayWall/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java rename to PlayWallCore/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java index bd70c1df..eedc4bca 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java @@ -199,7 +199,6 @@ public class Project { notFoundMediaProperty.set(getPads(p -> p.getStatus() == PadStatus.NOT_FOUND).size()); } - @Override public String toString() { return projectReference.getName() + " (" + projectReference.getUuid() + ")"; @@ -281,4 +280,14 @@ public class Project { } return null; } + + public void addColumn() { + settings.setColumns(settings.getColumns() + 1); + pages.forEach(Page::addColumn); + } + + public void addRow() { + settings.setRows(settings.getRows() + 1); + pages.forEach(Page::addRow); + } } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java new file mode 100644 index 00000000..c7507224 --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java @@ -0,0 +1,55 @@ +package de.tobias.playpad.project; + +import de.tobias.playpad.design.ModernDesignSizeHelper; +import javafx.stage.Screen; + +public class ProjectSettingsValidator { + public static final int DISPLAY_OFFSET = 100; + + public enum ValidationState { + NORMAL, + TOO_MUCH, + TOO_LESS + } + + public enum Dimension { + COLUMNS, + ROWS + } + + public ProjectSettingsValidator(Screen mainWindowScreen) { + this.mainWindowScreen = mainWindowScreen; + } + + private final Screen mainWindowScreen; + + public ValidationState validate(int input, Dimension dimension) { + if (input < minValue(dimension)) { + return ValidationState.TOO_LESS; + } else if (input > maxValue(dimension)) { + return ValidationState.TOO_MUCH; + } + return ValidationState.NORMAL; + } + + public int minValue(Dimension dimension) { + if (dimension == Dimension.COLUMNS) { + return ProjectSettings.MIN_COLUMNS; + } else if (dimension == Dimension.ROWS) { + return ProjectSettings.MIN_ROWS; + } + return -1; + } + + public int maxValue(Dimension dimension) { + double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX(); + double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY(); + + if (dimension == Dimension.COLUMNS) { + return Math.min((int) (width / ModernDesignSizeHelper.getPadWidth()), ProjectSettings.MAX_COLUMNS); + } else if (dimension == Dimension.ROWS) { + return Math.min((int) ((height - DISPLAY_OFFSET) / ModernDesignSizeHelper.getPadHeight()), ProjectSettings.MAX_ROWS); + } + return -1; + } +} diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java index 36d9b1d0..59708137 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java @@ -192,12 +192,17 @@ public class Page { public Pad getPad(int x, int y) { ProjectSettings settings = projectReference.getSettings(); if (x < settings.getColumns() && y < settings.getRows()) { - int id = y * settings.getColumns() + x; - return getPad(id); + int position = getPadPosition(x, y); + return getPad(position); } return null; } + private int getPadPosition(int x, int y) { + ProjectSettings settings = projectReference.getSettings(); + return y * settings.getColumns() + x; + } + /** * Set a pad to a new id. It overwrites the old pad. If the pad argument is null, it only removes the old pad. * @@ -244,6 +249,32 @@ public class Page { pads.removeIf(p -> p.getUuid().equals(uuid)); } + public void addColumn() { + final int columns = getProject().getSettings().getColumns() - 1; + final int rows = getProject().getSettings().getRows(); + + for (int i = 0; i < rows; i++) { + insertPadInto(columns, i, rows * columns); + } + } + + public void addRow() { + final int columns = getProject().getSettings().getColumns(); + final int rows = getProject().getSettings().getRows() - 1; + + for (int i = 0; i < columns; i++) { + insertPadInto(i, columns, rows * columns); + } + } + + private void insertPadInto(int x, int y, int maxPad) { + int position = getPadPosition(x, y); + for (int i = maxPad - 1; i >= position; i--) { + getPad(i).setPosition(i + 1); + } + getPad(position); + } + @Override public String toString() { return "Page [positionProperty=" + positionProperty + "]"; -- GitLab