From c8858755568d25b0efa7a74260aa4f3f0059e7fe Mon Sep 17 00:00:00 2001 From: DallonF Date: Fri, 5 Jul 2019 14:47:00 -0500 Subject: [PATCH 01/25] Support margins via config file for custom coords --- .../services/utils/QueleaProperties.java | 26 +++++++++++++++++++ .../java/org/quelea/windows/main/Main.java | 4 +-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index 20976ec204..de0fc0606e 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -1120,6 +1120,19 @@ public Bounds getProjectorCoords() { Integer.parseInt(prop[3])); } + public Bounds getProjectorCoordsWithMargins() { + Bounds baseCoords = getProjectorCoords(); + double leftMargin = getDisplayMarginLeft() * baseCoords.getWidth(); + double topMargin = getDisplayMarginTop() * baseCoords.getHeight(); + + return new BoundingBox( + baseCoords.getMinX() + leftMargin, + baseCoords.getMinY() + topMargin, + baseCoords.getWidth() - leftMargin - getDisplayMarginRight()* baseCoords.getWidth(), + baseCoords.getHeight() - topMargin - getDisplayMarginBottom()* baseCoords.getHeight() + ); + } + /** * Set the custom projector co-ordinates. *

@@ -2190,6 +2203,19 @@ public double getLyricHeightBounds() { return Double.parseDouble(getProperty("lyric.height.bound", "0.9")); } + public double getDisplayMarginTop () { + return Double.parseDouble((getProperty("display.margin.top", "0"))); + } + public double getDisplayMarginLeft () { + return Double.parseDouble((getProperty("display.margin.left", "0"))); + } + public double getDisplayMarginBottom() { + return Double.parseDouble((getProperty("display.margin.bottom", "0"))); + } + public double getDisplayMarginRight() { + return Double.parseDouble((getProperty("display.margin.right", "0"))); + } + public boolean getDefaultSongDBUpdate() { return Boolean.parseBoolean(getProperty("default.song.db.update", "true")); } diff --git a/Quelea/src/main/java/org/quelea/windows/main/Main.java b/Quelea/src/main/java/org/quelea/windows/main/Main.java index 4ad1ecfce0..550b098d2c 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/Main.java +++ b/Quelea/src/main/java/org/quelea/windows/main/Main.java @@ -189,9 +189,9 @@ public void run() { fullScreenWindow.hide(); }); } else if (QueleaProperties.get().isProjectorModeCoords()) { - LOGGER.log(Level.INFO, "Starting projector display: ", QueleaProperties.get().getProjectorCoords()); + LOGGER.log(Level.INFO, "Starting projector display: ", QueleaProperties.get().getProjectorCoordsWithMargins()); Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(QueleaProperties.get().getProjectorCoords(), false); + fullScreenWindow = new DisplayStage(QueleaProperties.get().getProjectorCoordsWithMargins(), false); }); } else { LOGGER.log(Level.INFO, "Starting projector display on monitor {0} (base 0!)", projectorScreen); From e114841d95153cda35b306699d59ffed9d49afea Mon Sep 17 00:00:00 2001 From: DallonF Date: Fri, 5 Jul 2019 14:55:33 -0500 Subject: [PATCH 02/25] Apply margins to monitor display --- .../services/utils/QueleaProperties.java | 23 +++++++++++-------- .../java/org/quelea/windows/main/Main.java | 14 +++++++++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index de0fc0606e..1a167cb139 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -1121,16 +1121,7 @@ public Bounds getProjectorCoords() { } public Bounds getProjectorCoordsWithMargins() { - Bounds baseCoords = getProjectorCoords(); - double leftMargin = getDisplayMarginLeft() * baseCoords.getWidth(); - double topMargin = getDisplayMarginTop() * baseCoords.getHeight(); - - return new BoundingBox( - baseCoords.getMinX() + leftMargin, - baseCoords.getMinY() + topMargin, - baseCoords.getWidth() - leftMargin - getDisplayMarginRight()* baseCoords.getWidth(), - baseCoords.getHeight() - topMargin - getDisplayMarginBottom()* baseCoords.getHeight() - ); + return applyDisplayMargins(getProjectorCoords()); } /** @@ -2216,6 +2207,18 @@ public double getDisplayMarginRight() { return Double.parseDouble((getProperty("display.margin.right", "0"))); } + public Bounds applyDisplayMargins(Bounds coords) { + double leftMargin = getDisplayMarginLeft() * coords.getWidth(); + double topMargin = getDisplayMarginTop() * coords.getHeight(); + + return new BoundingBox( + coords.getMinX() + leftMargin, + coords.getMinY() + topMargin, + coords.getWidth() - leftMargin - getDisplayMarginRight()* coords.getWidth(), + coords.getHeight() - topMargin - getDisplayMarginBottom()* coords.getHeight() + ); + } + public boolean getDefaultSongDBUpdate() { return Boolean.parseBoolean(getProperty("default.song.db.update", "true")); } diff --git a/Quelea/src/main/java/org/quelea/windows/main/Main.java b/Quelea/src/main/java/org/quelea/windows/main/Main.java index 550b098d2c..1be0d893b2 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/Main.java +++ b/Quelea/src/main/java/org/quelea/windows/main/Main.java @@ -185,7 +185,12 @@ public void run() { if (lyricsHidden) { LOGGER.log(Level.INFO, "Hiding projector display on monitor 0 (base 0!)"); Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()), false); + fullScreenWindow = new DisplayStage( + QueleaProperties.get().applyDisplayMargins( + Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()) + ), + false + ); fullScreenWindow.hide(); }); } else if (QueleaProperties.get().isProjectorModeCoords()) { @@ -196,7 +201,12 @@ public void run() { } else { LOGGER.log(Level.INFO, "Starting projector display on monitor {0} (base 0!)", projectorScreen); Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(projectorScreen).getBounds()), false); + fullScreenWindow = new DisplayStage( + QueleaProperties.get().applyDisplayMargins( + Utils.getBoundsFromRect2D(monitors.get(projectorScreen).getBounds()) + ), + false + ); fullScreenWindow.setFullScreenAlwaysOnTop(true); }); } From 69dedb2a6371c564257f7eae181592452d39452d Mon Sep 17 00:00:00 2001 From: DallonF Date: Fri, 5 Jul 2019 15:29:00 -0500 Subject: [PATCH 03/25] Save display margins in a single property line --- .../quelea/services/utils/PercentMargins.java | 78 +++++++++++++++++++ .../services/utils/QueleaProperties.java | 36 ++++----- 2 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java diff --git a/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java b/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java new file mode 100644 index 0000000000..a6dd19a395 --- /dev/null +++ b/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java @@ -0,0 +1,78 @@ +/* + * This file is part of Quelea, free projection software for churches. + * + * Copyright (C) 2012 Michael Berry + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.quelea.services.utils; + +import javafx.geometry.BoundingBox; +import javafx.geometry.Bounds; +import javafx.geometry.Rectangle2D; + +/** + * Percentage-based (0-1) margins to be applied to a display + *

+ * @author Dallon Feldner + */ +public class PercentMargins { + + private double top; + private double right; + private double bottom; + private double left; + + public PercentMargins(double top, double right, double bottom, double left) { + this.top = top; + this.right = right; + this.bottom = bottom; + this.left = left; + } + + @Override + public String toString() { + return top + "," + right + "," + bottom + "," + left; + } + + public double getTop() { + return top; + } + + public double getRight() { + return right; + } + + public double getBottom() { + return bottom; + } + + public double getLeft() { + return left; + } + + public Bounds applyMargins(Bounds coords) { + double leftMargin = left * coords.getWidth(); + double topMargin = top * coords.getHeight(); + + return new BoundingBox( + coords.getMinX() + leftMargin, + coords.getMinY() + topMargin, + coords.getWidth() - leftMargin - right* coords.getWidth(), + coords.getHeight() - topMargin - bottom* coords.getHeight() + ); + } + +} + diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index 1a167cb139..8bb97824c5 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -26,6 +26,7 @@ import java.util.Properties; import java.util.logging.Level; +import com.sun.istack.NotNull; import javafx.geometry.BoundingBox; import javafx.geometry.Bounds; import javafx.scene.paint.Color; @@ -2194,29 +2195,26 @@ public double getLyricHeightBounds() { return Double.parseDouble(getProperty("lyric.height.bound", "0.9")); } - public double getDisplayMarginTop () { - return Double.parseDouble((getProperty("display.margin.top", "0"))); - } - public double getDisplayMarginLeft () { - return Double.parseDouble((getProperty("display.margin.left", "0"))); - } - public double getDisplayMarginBottom() { - return Double.parseDouble((getProperty("display.margin.bottom", "0"))); + public PercentMargins getDisplayMargin() { + String[] parts = getProperty("display.margin", "0,0,0,0").split(","); + if (parts.length == 4) { + return new PercentMargins( + Double.parseDouble(parts[0]), + Double.parseDouble(parts[1]), + Double.parseDouble(parts[2]), + Double.parseDouble(parts[3]) + ); + } else { + return new PercentMargins(0,0,0,0); + } } - public double getDisplayMarginRight() { - return Double.parseDouble((getProperty("display.margin.right", "0"))); + + public void setDisplayMargin(@NotNull PercentMargins margins) { + setProperty("display.margin", margins.toString()); } public Bounds applyDisplayMargins(Bounds coords) { - double leftMargin = getDisplayMarginLeft() * coords.getWidth(); - double topMargin = getDisplayMarginTop() * coords.getHeight(); - - return new BoundingBox( - coords.getMinX() + leftMargin, - coords.getMinY() + topMargin, - coords.getWidth() - leftMargin - getDisplayMarginRight()* coords.getWidth(), - coords.getHeight() - topMargin - getDisplayMarginBottom()* coords.getHeight() - ); + return getDisplayMargin().applyMargins(coords); } public boolean getDefaultSongDBUpdate() { From a613c44cc51bde468b9b83cbf0e38cd4b97297ab Mon Sep 17 00:00:00 2001 From: DallonF Date: Fri, 5 Jul 2019 17:24:21 -0500 Subject: [PATCH 04/25] Started adding margin settings UI --- Quelea/languages/gb.lang | 1 + .../windows/options/SingleDisplayPanel.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Quelea/languages/gb.lang b/Quelea/languages/gb.lang index 3d0136f227..46b784a715 100644 --- a/Quelea/languages/gb.lang +++ b/Quelea/languages/gb.lang @@ -694,3 +694,4 @@ db.song.preview.label=Database song preview db.song.preview.label.control=None db.song.preview.label.databasepreview=In database pane db.song.preview.label.previewpane=In preview pane +display.margins=Margins: (in %) \ No newline at end of file diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index b804848915..6f73897ff5 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -51,6 +51,8 @@ public class SingleDisplayPanel extends VBox { private NumberTextField customWidth; private NumberTextField customHeight; + private NumberTextField marginTop; + /** * Create a new single display panel. * @@ -128,6 +130,23 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 posPanel.setMaxWidth(Double.MAX_VALUE); getChildren().add(posPanel); } + + Label marginsLabel = new Label(LabelGrabber.INSTANCE.getLabel("display.margins")); + getChildren().add(marginsLabel); + + GridPane marginPanel = new GridPane(); + marginPanel.setVgap(5); + marginPanel.setHgap(5); + + marginTop = new NumberTextField(0); + + Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); + GridPane.setConstraints(marginTopLabel, 1, 1); + marginPanel.getChildren().add(marginTopLabel); + GridPane.setConstraints(marginTop, 2, 1); + marginPanel.getChildren().add(marginTop); + + getChildren().add(marginPanel); } /** From e1e2f9d147167dde8e450eeb5ade3a5391f310d7 Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 29 Jul 2019 07:46:18 -0500 Subject: [PATCH 05/25] Add other margin fields --- .../windows/options/SingleDisplayPanel.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 6f73897ff5..b6a0ea0b86 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -52,6 +52,9 @@ public class SingleDisplayPanel extends VBox { private NumberTextField customHeight; private NumberTextField marginTop; + private NumberTextField marginRight; + private NumberTextField marginBottom; + private NumberTextField marginLeft; /** * Create a new single display panel. @@ -139,13 +142,33 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 marginPanel.setHgap(5); marginTop = new NumberTextField(0); - Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); GridPane.setConstraints(marginTopLabel, 1, 1); marginPanel.getChildren().add(marginTopLabel); GridPane.setConstraints(marginTop, 2, 1); marginPanel.getChildren().add(marginTop); + marginRight = new NumberTextField(0); + Label marginRightLabel = new Label(LabelGrabber.INSTANCE.getLabel("right") + ":"); + GridPane.setConstraints(marginRightLabel, 1, 2); + marginPanel.getChildren().add(marginRightLabel); + GridPane.setConstraints(marginRight, 2, 2); + marginPanel.getChildren().add(marginRight); + + marginBottom = new NumberTextField(0); + Label marginBottomLabel = new Label(LabelGrabber.INSTANCE.getLabel("bottom") + ":"); + GridPane.setConstraints(marginBottomLabel, 1, 3); + marginPanel.getChildren().add(marginBottomLabel); + GridPane.setConstraints(marginBottom, 2, 3); + marginPanel.getChildren().add(marginBottom); + + marginLeft = new NumberTextField(0); + Label marginLeftLabel = new Label(LabelGrabber.INSTANCE.getLabel("left") + ":"); + GridPane.setConstraints(marginLeftLabel, 1, 4); + marginPanel.getChildren().add(marginLeftLabel); + GridPane.setConstraints(marginLeft, 2, 4); + marginPanel.getChildren().add(marginLeft); + getChildren().add(marginPanel); } From e9ec095d7dd7ac56f427e543b9a7d61eac3b8d59 Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 29 Jul 2019 07:54:07 -0500 Subject: [PATCH 06/25] Only show margins UI for projector settings --- .../options/OptionsDisplaySetupPanel.java | 6 +- .../windows/options/SingleDisplayPanel.java | 66 ++++++++++--------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index 9f90eda772..bcabc7bf32 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -46,13 +46,13 @@ public OptionsDisplaySetupPanel() { setHgap(30); setVgap(10); setPadding(new Insets(30)); - monitorPanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("control.screen.label") + ":", "icons/monitor.png", false, false); + monitorPanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("control.screen.label") + ":", "icons/monitor.png", false, false, false); GridPane.setConstraints(monitorPanel, 1, 1); getChildren().add(monitorPanel); - projectorPanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("projector.screen.label") + ":", "icons/projector.png", true, true); + projectorPanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("projector.screen.label") + ":", "icons/projector.png", true, true, true); GridPane.setConstraints(projectorPanel, 2, 1); getChildren().add(projectorPanel); - stagePanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("stage.screen.label") + ":", "icons/stage.png", true, true); + stagePanel = new SingleDisplayPanel(LabelGrabber.INSTANCE.getLabel("stage.screen.label") + ":", "icons/stage.png", true, true, false); GridPane.setConstraints(stagePanel, 3, 1); getChildren().add(stagePanel); readProperties(); diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index b6a0ea0b86..0a8bda964f 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -65,9 +65,11 @@ public class SingleDisplayPanel extends VBox { * otherwise. * @param customPos true if a custom position should be allowed for this * display panel. + * @param margins true if margins should be allowed for this + * display panel. */ public SingleDisplayPanel(String caption, String iconLocation, boolean none, - boolean customPos) { + boolean customPos, boolean margins) { setSpacing(10); setAlignment(Pos.TOP_CENTER); this.none = none; @@ -134,42 +136,44 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 getChildren().add(posPanel); } - Label marginsLabel = new Label(LabelGrabber.INSTANCE.getLabel("display.margins")); - getChildren().add(marginsLabel); + if (margins) { + Label marginsLabel = new Label(LabelGrabber.INSTANCE.getLabel("display.margins")); + getChildren().add(marginsLabel); - GridPane marginPanel = new GridPane(); - marginPanel.setVgap(5); - marginPanel.setHgap(5); + GridPane marginPanel = new GridPane(); + marginPanel.setVgap(5); + marginPanel.setHgap(5); - marginTop = new NumberTextField(0); - Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); - GridPane.setConstraints(marginTopLabel, 1, 1); - marginPanel.getChildren().add(marginTopLabel); - GridPane.setConstraints(marginTop, 2, 1); - marginPanel.getChildren().add(marginTop); + marginTop = new NumberTextField(0); + Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); + GridPane.setConstraints(marginTopLabel, 1, 1); + marginPanel.getChildren().add(marginTopLabel); + GridPane.setConstraints(marginTop, 2, 1); + marginPanel.getChildren().add(marginTop); - marginRight = new NumberTextField(0); - Label marginRightLabel = new Label(LabelGrabber.INSTANCE.getLabel("right") + ":"); - GridPane.setConstraints(marginRightLabel, 1, 2); - marginPanel.getChildren().add(marginRightLabel); - GridPane.setConstraints(marginRight, 2, 2); - marginPanel.getChildren().add(marginRight); + marginRight = new NumberTextField(0); + Label marginRightLabel = new Label(LabelGrabber.INSTANCE.getLabel("right") + ":"); + GridPane.setConstraints(marginRightLabel, 1, 2); + marginPanel.getChildren().add(marginRightLabel); + GridPane.setConstraints(marginRight, 2, 2); + marginPanel.getChildren().add(marginRight); - marginBottom = new NumberTextField(0); - Label marginBottomLabel = new Label(LabelGrabber.INSTANCE.getLabel("bottom") + ":"); - GridPane.setConstraints(marginBottomLabel, 1, 3); - marginPanel.getChildren().add(marginBottomLabel); - GridPane.setConstraints(marginBottom, 2, 3); - marginPanel.getChildren().add(marginBottom); + marginBottom = new NumberTextField(0); + Label marginBottomLabel = new Label(LabelGrabber.INSTANCE.getLabel("bottom") + ":"); + GridPane.setConstraints(marginBottomLabel, 1, 3); + marginPanel.getChildren().add(marginBottomLabel); + GridPane.setConstraints(marginBottom, 2, 3); + marginPanel.getChildren().add(marginBottom); - marginLeft = new NumberTextField(0); - Label marginLeftLabel = new Label(LabelGrabber.INSTANCE.getLabel("left") + ":"); - GridPane.setConstraints(marginLeftLabel, 1, 4); - marginPanel.getChildren().add(marginLeftLabel); - GridPane.setConstraints(marginLeft, 2, 4); - marginPanel.getChildren().add(marginLeft); + marginLeft = new NumberTextField(0); + Label marginLeftLabel = new Label(LabelGrabber.INSTANCE.getLabel("left") + ":"); + GridPane.setConstraints(marginLeftLabel, 1, 4); + marginPanel.getChildren().add(marginLeftLabel); + GridPane.setConstraints(marginLeft, 2, 4); + marginPanel.getChildren().add(marginLeft); - getChildren().add(marginPanel); + getChildren().add(marginPanel); + } } /** From 0478cc6057ac57c091a650fafe02dabd42af9e7a Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 29 Jul 2019 08:02:44 -0500 Subject: [PATCH 07/25] Can now save margin from settings UI --- .../windows/options/OptionsDisplaySetupPanel.java | 1 + .../org/quelea/windows/options/SingleDisplayPanel.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index bcabc7bf32..babcb1a217 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -182,6 +182,7 @@ public void setProperties() { QueleaProperties props = QueleaProperties.get(); props.setControlScreen(monitorPanel.getOutputScreen()); props.setProjectorCoords(projectorPanel.getCoords()); + props.setDisplayMargin(projectorPanel.getMargins()); props.setStageCoords(stagePanel.getCoords()); if(projectorPanel.customPosition()) { props.setProjectorModeCoords(); diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 0a8bda964f..1366f88a2a 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -32,6 +32,7 @@ import javafx.scene.layout.VBox; import javafx.stage.Screen; import org.quelea.services.languages.LabelGrabber; +import org.quelea.services.utils.PercentMargins; import org.quelea.services.utils.Utils; import org.quelea.windows.main.widgets.NumberTextField; @@ -246,6 +247,15 @@ public void setCoords(Bounds bounds) { customHeight.setNumber((int) bounds.getHeight()); } + public PercentMargins getMargins() { + return new PercentMargins( + marginTop.getNumber() / 100.0, + marginRight.getNumber() / 100.0, + marginBottom.getNumber() / 100.0, + marginLeft.getNumber() / 100.0 + ); + } + /** * Set the screen to select on the combo box. * From a1b982a02279faf0b5df45e652ebb008e075a5b5 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 30 Jul 2019 19:23:10 -0500 Subject: [PATCH 08/25] Can now set margins via UI --- .../quelea/windows/options/OptionsDisplaySetupPanel.java | 1 + .../org/quelea/windows/options/SingleDisplayPanel.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index babcb1a217..e0d2461054 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -102,6 +102,7 @@ public final void readProperties() { stagePanel.update(); monitorPanel.setScreen(QueleaProperties.get().getControlScreen()); projectorPanel.setCoords(QueleaProperties.get().getProjectorCoords()); + projectorPanel.setMargins(QueleaProperties.get().getDisplayMargin()); if(!QueleaProperties.get().isProjectorModeCoords()) { projectorPanel.setScreen(QueleaProperties.get().getProjectorScreen()); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 1366f88a2a..7fca08e924 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -256,6 +256,13 @@ public PercentMargins getMargins() { ); } + public void setMargins(PercentMargins margins) { + marginTop.setNumber((int)Math.round(margins.getTop() * 100)); + marginRight.setNumber((int)Math.round(margins.getRight() * 100)); + marginBottom.setNumber((int)Math.round(margins.getBottom() * 100)); + marginLeft.setNumber((int)Math.round(margins.getLeft() * 100)); + } + /** * Set the screen to select on the combo box. * From 50997e705729b9648b9e36bd775e40bea1a499da Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 30 Jul 2019 19:27:34 -0500 Subject: [PATCH 09/25] Rename "display margin" to "projector margin" --- Quelea/languages/gb.lang | 2 +- .../quelea/services/utils/QueleaProperties.java | 14 +++++++------- .../main/java/org/quelea/windows/main/Main.java | 4 ++-- .../windows/options/OptionsDisplaySetupPanel.java | 4 ++-- .../quelea/windows/options/SingleDisplayPanel.java | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Quelea/languages/gb.lang b/Quelea/languages/gb.lang index 46b784a715..d2760d5cc7 100644 --- a/Quelea/languages/gb.lang +++ b/Quelea/languages/gb.lang @@ -694,4 +694,4 @@ db.song.preview.label=Database song preview db.song.preview.label.control=None db.song.preview.label.databasepreview=In database pane db.song.preview.label.previewpane=In preview pane -display.margins=Margins: (in %) \ No newline at end of file +projector.margins=Margins: (in %) \ No newline at end of file diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index 8bb97824c5..b432a576ce 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -1122,7 +1122,7 @@ public Bounds getProjectorCoords() { } public Bounds getProjectorCoordsWithMargins() { - return applyDisplayMargins(getProjectorCoords()); + return applyProjectorMargin(getProjectorCoords()); } /** @@ -2195,8 +2195,8 @@ public double getLyricHeightBounds() { return Double.parseDouble(getProperty("lyric.height.bound", "0.9")); } - public PercentMargins getDisplayMargin() { - String[] parts = getProperty("display.margin", "0,0,0,0").split(","); + public PercentMargins getProjectorMargin() { + String[] parts = getProperty("projector.margin", "0,0,0,0").split(","); if (parts.length == 4) { return new PercentMargins( Double.parseDouble(parts[0]), @@ -2209,12 +2209,12 @@ public PercentMargins getDisplayMargin() { } } - public void setDisplayMargin(@NotNull PercentMargins margins) { - setProperty("display.margin", margins.toString()); + public void setProjectorMargin(@NotNull PercentMargins margins) { + setProperty("projector.margin", margins.toString()); } - public Bounds applyDisplayMargins(Bounds coords) { - return getDisplayMargin().applyMargins(coords); + public Bounds applyProjectorMargin(Bounds coords) { + return getProjectorMargin().applyMargins(coords); } public boolean getDefaultSongDBUpdate() { diff --git a/Quelea/src/main/java/org/quelea/windows/main/Main.java b/Quelea/src/main/java/org/quelea/windows/main/Main.java index 1be0d893b2..4563b25de1 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/Main.java +++ b/Quelea/src/main/java/org/quelea/windows/main/Main.java @@ -186,7 +186,7 @@ public void run() { LOGGER.log(Level.INFO, "Hiding projector display on monitor 0 (base 0!)"); Platform.runLater(() -> { fullScreenWindow = new DisplayStage( - QueleaProperties.get().applyDisplayMargins( + QueleaProperties.get().applyProjectorMargin( Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()) ), false @@ -202,7 +202,7 @@ public void run() { LOGGER.log(Level.INFO, "Starting projector display on monitor {0} (base 0!)", projectorScreen); Platform.runLater(() -> { fullScreenWindow = new DisplayStage( - QueleaProperties.get().applyDisplayMargins( + QueleaProperties.get().applyProjectorMargin( Utils.getBoundsFromRect2D(monitors.get(projectorScreen).getBounds()) ), false diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index e0d2461054..f4d240e3b2 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -102,7 +102,7 @@ public final void readProperties() { stagePanel.update(); monitorPanel.setScreen(QueleaProperties.get().getControlScreen()); projectorPanel.setCoords(QueleaProperties.get().getProjectorCoords()); - projectorPanel.setMargins(QueleaProperties.get().getDisplayMargin()); + projectorPanel.setMargins(QueleaProperties.get().getProjectorMargin()); if(!QueleaProperties.get().isProjectorModeCoords()) { projectorPanel.setScreen(QueleaProperties.get().getProjectorScreen()); } @@ -183,7 +183,7 @@ public void setProperties() { QueleaProperties props = QueleaProperties.get(); props.setControlScreen(monitorPanel.getOutputScreen()); props.setProjectorCoords(projectorPanel.getCoords()); - props.setDisplayMargin(projectorPanel.getMargins()); + props.setProjectorMargin(projectorPanel.getMargins()); props.setStageCoords(stagePanel.getCoords()); if(projectorPanel.customPosition()) { props.setProjectorModeCoords(); diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 7fca08e924..2d6402af44 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -138,7 +138,7 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 } if (margins) { - Label marginsLabel = new Label(LabelGrabber.INSTANCE.getLabel("display.margins")); + Label marginsLabel = new Label(LabelGrabber.INSTANCE.getLabel("projector.margins")); getChildren().add(marginsLabel); GridPane marginPanel = new GridPane(); From f90d81f0a8eb68087f8aba64d10cf8ab2278eb65 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 6 Aug 2019 20:10:12 -0500 Subject: [PATCH 10/25] Use margin when updating bounds --- .../windows/options/SingleDisplayPanel.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 2d6402af44..fde2438ae9 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -52,6 +52,7 @@ public class SingleDisplayPanel extends VBox { private NumberTextField customWidth; private NumberTextField customHeight; + private boolean hasMargins; private NumberTextField marginTop; private NumberTextField marginRight; private NumberTextField marginBottom; @@ -71,6 +72,7 @@ public class SingleDisplayPanel extends VBox { */ public SingleDisplayPanel(String caption, String iconLocation, boolean none, boolean customPos, boolean margins) { + this.hasMargins = margins; setSpacing(10); setAlignment(Pos.TOP_CENTER); this.none = none; @@ -201,7 +203,7 @@ public int getOutputScreen() { */ public Bounds getOutputBounds() { if(custom != null && custom.isSelected()) { - return getCoords(); + return applyMarginToBounds(getCoords()); } ObservableList monitors = Screen.getScreens(); @@ -210,7 +212,7 @@ public Bounds getOutputBounds() { return null; } else { - return Utils.getBoundsFromRect2D(monitors.get(screen).getBounds()); + return applyMarginToBounds(Utils.getBoundsFromRect2D(monitors.get(screen).getBounds())); } } @@ -317,4 +319,13 @@ private ObservableList getAvailableScreens(boolean none) { return descriptions; } + private Bounds applyMarginToBounds(Bounds input) + { + if (hasMargins) { + return getMargins().applyMargins(input); + } else { + return input; + } + } + } From 1f89c6e7161c67474e3b632ebb6a2520a6c9629d Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 6 Aug 2019 20:47:16 -0500 Subject: [PATCH 11/25] Start constraining margins to 99% --- .../windows/options/SingleDisplayPanel.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index fde2438ae9..3c917ca1bf 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -16,6 +16,7 @@ */ package org.quelea.windows.options; +import javafx.beans.property.ObjectProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; @@ -151,6 +152,7 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); GridPane.setConstraints(marginTopLabel, 1, 1); marginPanel.getChildren().add(marginTopLabel); + marginTop.numberProperty().addListener(this.onMarginNumberChange); GridPane.setConstraints(marginTop, 2, 1); marginPanel.getChildren().add(marginTop); @@ -179,6 +181,31 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 } } + private ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { + NumberTextField field; + NumberTextField oppositeField; + if (observable == marginTop.numberProperty()) { + field = marginTop; + oppositeField = marginBottom; + } else { + throw new IllegalArgumentException(); + } + + // make sure the margins only add up to 99 at most, leaving 1% for content + int total = field.getNumber() + oppositeField.getNumber(); + if (total > 99) { + int suggestedOpposite = 99 - field.getNumber(); + if (suggestedOpposite > 0) { + oppositeField.setNumber(suggestedOpposite); + } else { + // A number greater than 99 has been entered in the field + // clamp to 99 + field.setNumber(99); + oppositeField.setNumber(0); + } + } + }; + /** * Get the output screen currently selected in the dialog, or -1 if none is * selected. From 45edae703e7b72fb410f29300c1afc0534cec780 Mon Sep 17 00:00:00 2001 From: DallonF Date: Sat, 31 Aug 2019 12:20:10 -0500 Subject: [PATCH 12/25] Constrain all margin fields to a total of 99% --- .../quelea/windows/options/SingleDisplayPanel.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java index 3c917ca1bf..49a120580a 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/SingleDisplayPanel.java @@ -149,14 +149,15 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 marginPanel.setHgap(5); marginTop = new NumberTextField(0); + marginTop.numberProperty().addListener(this.onMarginNumberChange); Label marginTopLabel = new Label(LabelGrabber.INSTANCE.getLabel("top") + ":"); GridPane.setConstraints(marginTopLabel, 1, 1); marginPanel.getChildren().add(marginTopLabel); - marginTop.numberProperty().addListener(this.onMarginNumberChange); GridPane.setConstraints(marginTop, 2, 1); marginPanel.getChildren().add(marginTop); marginRight = new NumberTextField(0); + marginRight.numberProperty().addListener(this.onMarginNumberChange); Label marginRightLabel = new Label(LabelGrabber.INSTANCE.getLabel("right") + ":"); GridPane.setConstraints(marginRightLabel, 1, 2); marginPanel.getChildren().add(marginRightLabel); @@ -164,6 +165,7 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 marginPanel.getChildren().add(marginRight); marginBottom = new NumberTextField(0); + marginBottom.numberProperty().addListener(this.onMarginNumberChange); Label marginBottomLabel = new Label(LabelGrabber.INSTANCE.getLabel("bottom") + ":"); GridPane.setConstraints(marginBottomLabel, 1, 3); marginPanel.getChildren().add(marginBottomLabel); @@ -171,6 +173,7 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 marginPanel.getChildren().add(marginBottom); marginLeft = new NumberTextField(0); + marginLeft.numberProperty().addListener(this.onMarginNumberChange); Label marginLeftLabel = new Label(LabelGrabber.INSTANCE.getLabel("left") + ":"); GridPane.setConstraints(marginLeftLabel, 1, 4); marginPanel.getChildren().add(marginLeftLabel); @@ -187,6 +190,15 @@ public void changed(ObservableValue ov, Boolean t, Boolean t1 if (observable == marginTop.numberProperty()) { field = marginTop; oppositeField = marginBottom; + } else if (observable == marginRight.numberProperty()) { + field = marginRight; + oppositeField = marginLeft; + } else if (observable == marginBottom.numberProperty()) { + field = marginBottom; + oppositeField = marginTop; + } else if (observable == marginLeft.numberProperty()) { + field = marginLeft; + oppositeField = marginRight; } else { throw new IllegalArgumentException(); } From 09d256849278765100c932b827b7799f7a10752b Mon Sep 17 00:00:00 2001 From: DallonF Date: Sat, 31 Aug 2019 15:20:32 -0500 Subject: [PATCH 13/25] Start adapting margin options to new options UI --- .../quelea/windows/options/DisplayGroup.java | 47 ++++++++++++------- .../options/OptionsDisplaySetupPanel.java | 6 +-- .../windows/options/PreferencesDialog.java | 12 +++-- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 5ac7a08b60..296a8fd5b3 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -33,6 +33,7 @@ import org.quelea.services.languages.LabelGrabber; import org.quelea.services.utils.QueleaProperties; +import java.util.ArrayList; import java.util.HashMap; import static org.quelea.services.utils.QueleaPropertyKeys.*; @@ -41,7 +42,13 @@ public class DisplayGroup { private boolean displayChange = false; private Group group; - DisplayGroup(String groupName, boolean custom, HashMap bindings) { + /** + * @param custom true if a custom position should be allowed for this + * display panel. + * @param margins true if margins should be allowed for this + * display panel. + */ + DisplayGroup(String groupName, boolean custom, boolean margins, HashMap bindings) { BooleanProperty useCustomPosition = new SimpleBooleanProperty(false); if (groupName.equals(LabelGrabber.INSTANCE.getLabel("projector.screen.label"))) { useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); @@ -66,12 +73,12 @@ public class DisplayGroup { displayChange = true; }); + ArrayList settings = new ArrayList<>(); + if (!custom) { int screen = QueleaProperties.get().getControlScreen(); screenSelectProperty.setValue(screen > -1 ? availableScreens.get(screen) : availableScreens.get(0)); - group = Group.of(groupName, - Setting.of(groupName, customControl, screenSelectProperty).customKey(controlScreenKey) - ); + settings.add(Setting.of(groupName, customControl, screenSelectProperty).customKey(controlScreenKey)); } else { int screen; Bounds bounds; @@ -117,20 +124,18 @@ public class DisplayGroup { screenSelectProperty.setValue(screen > 0 && screen < availableScreens.size() ? availableScreens.get(screen) : availableScreens.get(0)); boolean projectorGroup = groupName.equals(LabelGrabber.INSTANCE.getLabel("projector.screen.label")); - group = Group.of(groupName, - Setting.of(groupName, customControl, screenSelectProperty) - .customKey(projectorGroup ? projectorScreenKey : stageScreenKey), - Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) - .customKey(projectorGroup ? projectorModeKey : stageModeKey), - Setting.of("W", sizeWith, widthProperty) - .customKey(projectorGroup ? projectorWCoordKey : stageWCoordKey), - Setting.of("H", sizeHeight, heightProperty) - .customKey(projectorGroup ? projectorHCoordKey : stageHCoordKey), - Setting.of("X", posX, xProperty) - .customKey(projectorGroup ? projectorXCoordKey : stageXCoordKey), - Setting.of("Y", posY, yProperty) - .customKey(projectorGroup ? projectorYCoordKey : stageYCoordKey) - ); + settings.add(Setting.of(groupName, customControl, screenSelectProperty) + .customKey(projectorGroup ? projectorScreenKey : stageScreenKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) + .customKey(projectorGroup ? projectorModeKey : stageModeKey)); + settings.add(Setting.of("W", sizeWith, widthProperty) + .customKey(projectorGroup ? projectorWCoordKey : stageWCoordKey)); + settings.add(Setting.of("H", sizeHeight, heightProperty) + .customKey(projectorGroup ? projectorHCoordKey : stageHCoordKey)); + settings.add(Setting.of("X", posX, xProperty) + .customKey(projectorGroup ? projectorXCoordKey : stageXCoordKey)); + settings.add(Setting.of("Y", posY, yProperty) + .customKey(projectorGroup ? projectorYCoordKey : stageYCoordKey)); bindings.put(sizeWith, useCustomPosition.not()); bindings.put(sizeHeight, useCustomPosition.not()); @@ -138,6 +143,12 @@ public class DisplayGroup { bindings.put(posY, useCustomPosition.not()); bindings.put(customControl, useCustomPosition); } + + + Setting[] settingsArray = new Setting[settings.size()]; + group = Group.of(groupName, + settings.toArray(settingsArray) + ); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index 1d108e4ca6..d01c928f81 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -46,9 +46,9 @@ public class OptionsDisplaySetupPanel { */ OptionsDisplaySetupPanel(HashMap bindings) { this.bindings = bindings; - controlScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("control.screen.label"), false, bindings); - projectorScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("projector.screen.label"), true, bindings); - stageScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("stage.screen.label"), true, bindings); + controlScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("control.screen.label"), false, false, bindings); + projectorScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("projector.screen.label"), true, true, bindings); + stageScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("stage.screen.label"), true, false, bindings); GraphicsDeviceWatcher.INSTANCE.addGraphicsDeviceListener(devices -> { QueleaApp.get().getMainWindow().getPreferencesDialog().updatePos(); diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java index 9e47c22e11..6cf85ee7c0 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java @@ -166,11 +166,15 @@ public void updatePos() { int projectorScreen = QueleaProperties.get().getProjectorScreen(); Bounds bounds; if (QueleaProperties.get().isProjectorModeCoords()) { - bounds = QueleaProperties.get().getProjectorCoords(); + bounds = QueleaProperties.get().getProjectorCoordsWithMargins(); } else { - bounds = Utils.getBoundsFromRect2D( - monitors.get(projectorScreen < 0 || projectorScreen >= monitors.size() ? 0 : projectorScreen) - .getBounds()); + bounds = QueleaProperties.get().applyProjectorMargin( + Utils.getBoundsFromRect2D( + monitors + .get(projectorScreen < 0 || projectorScreen >= monitors.size() ? 0 : projectorScreen) + .getBounds() + ) + ); } fiLyricWindow.setAreaImmediate(bounds); if (!QueleaApp.get().getMainWindow().getMainPanel().getLivePanel().getHide().isSelected()) { From 26d4f7ba008e6a6e4d47a5dddbde1b9362ef77fa Mon Sep 17 00:00:00 2001 From: DallonF Date: Sat, 31 Aug 2019 17:07:40 -0500 Subject: [PATCH 14/25] Refactor DisplayGroup so I can add new fields to it --- .../quelea/windows/options/DisplayGroup.java | 79 ++++++++++++------- .../options/OptionsDisplaySetupPanel.java | 6 +- 2 files changed, 53 insertions(+), 32 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 296a8fd5b3..a854285be6 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -33,6 +33,7 @@ import org.quelea.services.languages.LabelGrabber; import org.quelea.services.utils.QueleaProperties; +import java.awt.*; import java.util.ArrayList; import java.util.HashMap; @@ -42,17 +43,23 @@ public class DisplayGroup { private boolean displayChange = false; private Group group; - /** - * @param custom true if a custom position should be allowed for this - * display panel. - * @param margins true if margins should be allowed for this - * display panel. - */ - DisplayGroup(String groupName, boolean custom, boolean margins, HashMap bindings) { + DisplayGroup(String groupName, HashMap bindings) { + + boolean isControl = groupName.equals(LabelGrabber.INSTANCE.getLabel(("control.screen.label"))); + boolean isProjector = groupName.equals(LabelGrabber.INSTANCE.getLabel(("projector.screen.label"))); + boolean isStage = groupName.equals(LabelGrabber.INSTANCE.getLabel("stage.screen.label")); + + // can be disabled? + boolean noScreen = isProjector || isStage; + // Support a custom position? + boolean custom = isProjector || isStage; + // Support display margins? + boolean margins = isProjector; + BooleanProperty useCustomPosition = new SimpleBooleanProperty(false); - if (groupName.equals(LabelGrabber.INSTANCE.getLabel("projector.screen.label"))) { + if (isProjector) { useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); - } else if (groupName.equals(LabelGrabber.INSTANCE.getLabel("stage.screen.label"))) { + } else if (isStage) { useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isStageModeCoords()); } useCustomPosition.addListener(e -> { @@ -75,19 +82,39 @@ public class DisplayGroup { ArrayList settings = new ArrayList<>(); - if (!custom) { - int screen = QueleaProperties.get().getControlScreen(); - screenSelectProperty.setValue(screen > -1 ? availableScreens.get(screen) : availableScreens.get(0)); - settings.add(Setting.of(groupName, customControl, screenSelectProperty).customKey(controlScreenKey)); + int screen; + String screenKey; + if (isControl) + { + screen = QueleaProperties.get().getControlScreen(); + screenKey = controlScreenKey; + } else if (isProjector) { + screen = QueleaProperties.get().getProjectorScreen(); + screenKey = projectorScreenKey; + } else if (isStage) { + screen = QueleaProperties.get().getStageScreen(); + screenKey = stageScreenKey; + } else { + throw new IllegalArgumentException("Unsupported groupName: " + groupName); + } + + if (noScreen) { + screen++; // Compensate for "none" value in available screens + screenSelectProperty.setValue(screen > 0 && screen < availableScreens.size() ? availableScreens.get(screen) : availableScreens.get(0)); } else { - int screen; + screenSelectProperty.setValue(screen > -1 ? availableScreens.get(screen) : availableScreens.get(0)); + } + + settings.add(Setting.of(groupName, customControl, screenSelectProperty).customKey(screenKey)); + + if (custom) { Bounds bounds; - if (groupName.equals(LabelGrabber.INSTANCE.getLabel("projector.screen.label"))) { - screen = QueleaProperties.get().getProjectorScreen(); + if (isProjector) { bounds = QueleaProperties.get().getProjectorCoords(); - } else { - screen = QueleaProperties.get().getStageScreen(); + } else if (isStage) { bounds = QueleaProperties.get().getStageCoords(); + } else { + throw new IllegalArgumentException("Unsupported groupName: " + groupName); } IntegerProperty widthProperty = new SimpleIntegerProperty((int) bounds.getWidth()); @@ -119,23 +146,17 @@ public class DisplayGroup { displayChange = true; }); - screen++; // Compensate for "none" value in available screens - - screenSelectProperty.setValue(screen > 0 && screen < availableScreens.size() ? availableScreens.get(screen) : availableScreens.get(0)); - boolean projectorGroup = groupName.equals(LabelGrabber.INSTANCE.getLabel("projector.screen.label")); - settings.add(Setting.of(groupName, customControl, screenSelectProperty) - .customKey(projectorGroup ? projectorScreenKey : stageScreenKey)); settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) - .customKey(projectorGroup ? projectorModeKey : stageModeKey)); + .customKey(isProjector ? projectorModeKey : stageModeKey)); settings.add(Setting.of("W", sizeWith, widthProperty) - .customKey(projectorGroup ? projectorWCoordKey : stageWCoordKey)); + .customKey(isProjector ? projectorWCoordKey : stageWCoordKey)); settings.add(Setting.of("H", sizeHeight, heightProperty) - .customKey(projectorGroup ? projectorHCoordKey : stageHCoordKey)); + .customKey(isProjector ? projectorHCoordKey : stageHCoordKey)); settings.add(Setting.of("X", posX, xProperty) - .customKey(projectorGroup ? projectorXCoordKey : stageXCoordKey)); + .customKey(isProjector ? projectorXCoordKey : stageXCoordKey)); settings.add(Setting.of("Y", posY, yProperty) - .customKey(projectorGroup ? projectorYCoordKey : stageYCoordKey)); + .customKey(isProjector ? projectorYCoordKey : stageYCoordKey)); bindings.put(sizeWith, useCustomPosition.not()); bindings.put(sizeHeight, useCustomPosition.not()); diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index d01c928f81..a54ed15ccf 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -46,9 +46,9 @@ public class OptionsDisplaySetupPanel { */ OptionsDisplaySetupPanel(HashMap bindings) { this.bindings = bindings; - controlScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("control.screen.label"), false, false, bindings); - projectorScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("projector.screen.label"), true, true, bindings); - stageScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("stage.screen.label"), true, false, bindings); + controlScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("control.screen.label"), bindings); + projectorScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("projector.screen.label"), bindings); + stageScreen = new DisplayGroup(LabelGrabber.INSTANCE.getLabel("stage.screen.label"), bindings); GraphicsDeviceWatcher.INSTANCE.addGraphicsDeviceListener(devices -> { QueleaApp.get().getMainWindow().getPreferencesDialog().updatePos(); From 09bd17c952f727c6e125ab726bb830f25dd3fbb8 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 3 Sep 2019 20:12:18 -0500 Subject: [PATCH 15/25] Added marginTop --- Quelea/languages/gb.lang | 2 +- .../services/utils/QueleaProperties.java | 10 +++- .../services/utils/QueleaPropertyKeys.java | 2 + .../quelea/windows/options/DisplayGroup.java | 47 +++++++++++++------ .../options/PreferenceStorageHandler.java | 3 ++ 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Quelea/languages/gb.lang b/Quelea/languages/gb.lang index 5bd48ee2f1..3efe43a759 100644 --- a/Quelea/languages/gb.lang +++ b/Quelea/languages/gb.lang @@ -699,4 +699,4 @@ small.bible.text.options=Small Bible Text Options general.user.options=General User Options theme.options=Theme Options schedule.options=Schedule Options -projector.margins=Margins: (in %) +projector.margin.top=Margin Top % diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index cb8af0c0f1..27daf08cfa 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -2280,7 +2280,7 @@ public double getLyricHeightBounds() { } public PercentMargins getProjectorMargin() { - String[] parts = getProperty("projector.margin", "0,0,0,0").split(","); + String[] parts = getProperty(projectorMarginKey, "0,0,0,0").split(","); if (parts.length == 4) { return new PercentMargins( Double.parseDouble(parts[0]), @@ -2294,7 +2294,13 @@ public PercentMargins getProjectorMargin() { } public void setProjectorMargin(@NotNull PercentMargins margins) { - setProperty("projector.margin", margins.toString()); + setProperty(projectorMarginKey, margins.toString()); + } + + public void setProjectorMarginTop(int value) { + PercentMargins prop = getProjectorMargin(); + PercentMargins newProp = new PercentMargins(value / 100.0, prop.getRight(), prop.getBottom(), prop.getLeft()); + setProjectorMargin(newProp); } public Bounds applyProjectorMargin(Bounds coords) { diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java index f4b326c9d4..e31dcfc06c 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java @@ -126,5 +126,7 @@ public class QueleaPropertyKeys { public static final String stageWCoordKey = "stage.width.coord"; public static final String stageHCoordKey = "stage.height.coord"; public static final String darkThemeKey = "use.dark.theme"; + public static final String projectorMarginKey = "projector.margin"; + public static final String projectorMarginTopKey = "projector.margin.top"; } diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index a854285be6..f116aa6480 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -31,6 +31,7 @@ import javafx.geometry.Bounds; import javafx.stage.Screen; import org.quelea.services.languages.LabelGrabber; +import org.quelea.services.utils.PercentMargins; import org.quelea.services.utils.QueleaProperties; import java.awt.*; @@ -52,21 +53,11 @@ public class DisplayGroup { // can be disabled? boolean noScreen = isProjector || isStage; // Support a custom position? - boolean custom = isProjector || isStage; + boolean useCustom = isProjector || isStage; // Support display margins? - boolean margins = isProjector; + boolean useMargins = isProjector; - BooleanProperty useCustomPosition = new SimpleBooleanProperty(false); - if (isProjector) { - useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); - } else if (isStage) { - useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isStageModeCoords()); - } - useCustomPosition.addListener(e -> { - displayChange = true; - }); - - ObservableList availableScreens = getAvailableScreens(custom); + ObservableList availableScreens = getAvailableScreens(useCustom); ListProperty screenListProperty = new SimpleListProperty<>(availableScreens); ObjectProperty screenSelectProperty = new SimpleObjectProperty<>(availableScreens.get(0)); Field customControl = Field.ofSingleSelectionType(screenListProperty, screenSelectProperty).render( @@ -107,16 +98,20 @@ public class DisplayGroup { settings.add(Setting.of(groupName, customControl, screenSelectProperty).customKey(screenKey)); - if (custom) { + if (useCustom) { Bounds bounds; + BooleanProperty useCustomPosition; if (isProjector) { bounds = QueleaProperties.get().getProjectorCoords(); + useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); } else if (isStage) { bounds = QueleaProperties.get().getStageCoords(); + useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isStageModeCoords()); } else { throw new IllegalArgumentException("Unsupported groupName: " + groupName); } + IntegerProperty widthProperty = new SimpleIntegerProperty((int) bounds.getWidth()); IntegerProperty heightProperty = new SimpleIntegerProperty((int) bounds.getHeight()); IntegerProperty xProperty = new SimpleIntegerProperty((int) bounds.getMinX()); @@ -146,6 +141,10 @@ public class DisplayGroup { displayChange = true; }); + useCustomPosition.addListener(e -> { + displayChange = true; + }); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) .customKey(isProjector ? projectorModeKey : stageModeKey)); @@ -165,6 +164,26 @@ public class DisplayGroup { bindings.put(customControl, useCustomPosition); } + if (useMargins) { + PercentMargins margins; + if (isProjector) { + margins = QueleaProperties.get().getProjectorMargin(); + } else { + throw new IllegalArgumentException("Unsupported groupName: " + groupName); + } + + IntegerProperty marginTopProperty = new SimpleIntegerProperty((int) margins.getTop()); + IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( + new SimpleIntegerControl()); + + marginTopProperty.addListener(e -> { + displayChange = true; + }); + + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) + .customKey(projectorMarginTopKey)); + } + Setting[] settingsArray = new Setting[settings.size()]; group = Group.of(groupName, diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java index 424db4b813..eb7a10a2c6 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java @@ -208,6 +208,9 @@ public void saveObject(String breadcrumb, Object object) { case QueleaPropertyKeys.projectorYCoordKey: QueleaProperties.get().setYProjectorCoord(object.toString()); break; + case QueleaPropertyKeys.projectorMarginTopKey: + QueleaProperties.get().setProjectorMarginTop((Integer) object); + break; case QueleaPropertyKeys.stageHCoordKey: QueleaProperties.get().setHeightStageCoord(object.toString()); break; From b09885e829d89f1c6a7b87932e09c59ee45b97e3 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 3 Sep 2019 20:26:36 -0500 Subject: [PATCH 16/25] Can now edit the full margin --- Quelea/languages/gb.lang | 3 +++ .../services/utils/QueleaProperties.java | 19 ++++++++++++++ .../services/utils/QueleaPropertyKeys.java | 3 +++ .../quelea/windows/options/DisplayGroup.java | 26 +++++++++++++++++++ .../options/PreferenceStorageHandler.java | 9 +++++++ 5 files changed, 60 insertions(+) diff --git a/Quelea/languages/gb.lang b/Quelea/languages/gb.lang index 3efe43a759..9f5f1b9dee 100644 --- a/Quelea/languages/gb.lang +++ b/Quelea/languages/gb.lang @@ -700,3 +700,6 @@ general.user.options=General User Options theme.options=Theme Options schedule.options=Schedule Options projector.margin.top=Margin Top % +projector.margin.right=Margin Right % +projector.margin.bottom=Margin Bottom % +projector.margin.left=Margin Left % diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index 27daf08cfa..a1f9f7158c 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -2303,6 +2303,25 @@ public void setProjectorMarginTop(int value) { setProjectorMargin(newProp); } + public void setProjectorMarginRight(int value) { + PercentMargins prop = getProjectorMargin(); + PercentMargins newProp = new PercentMargins(prop.getTop(), value / 100.0, prop.getBottom(), prop.getLeft()); + setProjectorMargin(newProp); + } + + public void setProjectorMarginBottom(int value) { + PercentMargins prop = getProjectorMargin(); + PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), value / 100.0, prop.getLeft()); + setProjectorMargin(newProp); + } + + public void setProjectorMarginLeft(int value) { + PercentMargins prop = getProjectorMargin(); + PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), prop.getBottom(), value / 100.0); + setProjectorMargin(newProp); + } + + public Bounds applyProjectorMargin(Bounds coords) { return getProjectorMargin().applyMargins(coords); } diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java index e31dcfc06c..acc04eae86 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaPropertyKeys.java @@ -128,5 +128,8 @@ public class QueleaPropertyKeys { public static final String darkThemeKey = "use.dark.theme"; public static final String projectorMarginKey = "projector.margin"; public static final String projectorMarginTopKey = "projector.margin.top"; + public static final String projectorMarginRightKey = "projector.margin.right"; + public static final String projectorMarginBottomKey = "projector.margin.bottom"; + public static final String projectorMarginLeftKey = "projector.margin.left"; } diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index f116aa6480..4a72a5082b 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -173,15 +173,41 @@ public class DisplayGroup { } IntegerProperty marginTopProperty = new SimpleIntegerProperty((int) margins.getTop()); + IntegerProperty marginRightProperty = new SimpleIntegerProperty((int) margins.getRight()); + IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int) margins.getBottom()); + IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int) margins.getLeft()); IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( new SimpleIntegerControl()); + IntegerField marginRight = Field.ofIntegerType(marginRightProperty).render( + new SimpleIntegerControl()); + IntegerField marginBottom = Field.ofIntegerType(marginBottomProperty).render( + new SimpleIntegerControl()); + IntegerField marginLeft = Field.ofIntegerType(marginLeftProperty).render( + new SimpleIntegerControl()); + marginTopProperty.addListener(e -> { displayChange = true; }); + marginRightProperty.addListener(e -> { + displayChange = true; + }); + marginBottomProperty.addListener(e -> { + displayChange = true; + }); + marginLeftProperty.addListener(e -> { + displayChange = true; + }); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) .customKey(projectorMarginTopKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRight, marginRightProperty) + .customKey(projectorMarginRightKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottom, marginBottomProperty) + .customKey(projectorMarginBottomKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeft, marginLeftProperty) + .customKey(projectorMarginLeftKey)); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java index eb7a10a2c6..b705a7d67d 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java @@ -211,6 +211,15 @@ public void saveObject(String breadcrumb, Object object) { case QueleaPropertyKeys.projectorMarginTopKey: QueleaProperties.get().setProjectorMarginTop((Integer) object); break; + case QueleaPropertyKeys.projectorMarginRightKey: + QueleaProperties.get().setProjectorMarginRight((Integer) object); + break; + case QueleaPropertyKeys.projectorMarginBottomKey: + QueleaProperties.get().setProjectorMarginBottom((Integer) object); + break; + case QueleaPropertyKeys.projectorMarginLeftKey: + QueleaProperties.get().setProjectorMarginLeft((Integer) object); + break; case QueleaPropertyKeys.stageHCoordKey: QueleaProperties.get().setHeightStageCoord(object.toString()); break; From 44349d5794106df83b8d833fd0ee252ac5893f7f Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 3 Sep 2019 20:40:48 -0500 Subject: [PATCH 17/25] Correctly load margins from properties --- .../java/org/quelea/windows/options/DisplayGroup.java | 8 ++++---- .../quelea/windows/options/PreferenceStorageHandler.java | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 4a72a5082b..bca229856c 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -172,10 +172,10 @@ public class DisplayGroup { throw new IllegalArgumentException("Unsupported groupName: " + groupName); } - IntegerProperty marginTopProperty = new SimpleIntegerProperty((int) margins.getTop()); - IntegerProperty marginRightProperty = new SimpleIntegerProperty((int) margins.getRight()); - IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int) margins.getBottom()); - IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int) margins.getLeft()); + IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); + IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); + IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); + IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( new SimpleIntegerControl()); IntegerField marginRight = Field.ofIntegerType(marginRightProperty).render( diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java index b705a7d67d..6943999e9f 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java @@ -339,6 +339,14 @@ public Object loadObject(String breadcrumb, Object defaultObject) { return QueleaProperties.get().getProjectorCoords().getMinX(); case QueleaPropertyKeys.projectorYCoordKey: return QueleaProperties.get().getProjectorCoords().getMinY(); + case QueleaPropertyKeys.projectorMarginTopKey: + return QueleaProperties.get().getProjectorMargin().getTop() * 100; + case QueleaPropertyKeys.projectorMarginRightKey: + return QueleaProperties.get().getProjectorMargin().getRight() * 100; + case QueleaPropertyKeys.projectorMarginBottomKey: + return QueleaProperties.get().getProjectorMargin().getBottom() * 100; + case QueleaPropertyKeys.projectorMarginLeftKey: + return QueleaProperties.get().getProjectorMargin().getLeft() * 100; case QueleaPropertyKeys.stageHCoordKey: return QueleaProperties.get().getStageCoords().getHeight(); case QueleaPropertyKeys.stageWCoordKey: From 1ce64cb1f69db361f59ea7f584bc11a36febe555 Mon Sep 17 00:00:00 2001 From: DallonF Date: Fri, 6 Sep 2019 18:58:41 -0500 Subject: [PATCH 18/25] Validation for margin properties --- .../quelea/windows/options/DisplayGroup.java | 58 +++++++++++++++---- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index bca229856c..b713db4e00 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -19,11 +19,13 @@ import com.dlsc.formsfx.model.structure.Field; import com.dlsc.formsfx.model.structure.IntegerField; +import com.dlsc.formsfx.model.validators.IntegerRangeValidator; import com.dlsc.preferencesfx.formsfx.view.controls.SimpleComboBoxControl; import com.dlsc.preferencesfx.formsfx.view.controls.SimpleIntegerControl; import com.dlsc.preferencesfx.model.Group; import com.dlsc.preferencesfx.model.Setting; import javafx.beans.property.*; +import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; @@ -172,6 +174,7 @@ public class DisplayGroup { throw new IllegalArgumentException("Unsupported groupName: " + groupName); } + IntegerRangeValidator validator = IntegerRangeValidator.upTo(99, "Maximum value of 99"); IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); @@ -185,19 +188,52 @@ public class DisplayGroup { IntegerField marginLeft = Field.ofIntegerType(marginLeftProperty).render( new SimpleIntegerControl()); + marginTop.validate(validator); + marginRight.validate(validator); + marginBottom.validate(validator); + + ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { + IntegerField field; + IntegerField oppositeField; + if (observable == marginTopProperty) { + field = marginTop; + oppositeField = marginBottom; + } else if (observable == marginRightProperty) { + field = marginRight; + oppositeField = marginLeft; + } else if (observable == marginBottomProperty) { + field = marginBottom; + oppositeField = marginTop; + } else if (observable == marginLeftProperty) { + field = marginLeft; + oppositeField = marginRight; + } else { + throw new IllegalArgumentException(); + } - marginTopProperty.addListener(e -> { displayChange = true; - }); - marginRightProperty.addListener(e -> { - displayChange = true; - }); - marginBottomProperty.addListener(e -> { - displayChange = true; - }); - marginLeftProperty.addListener(e -> { - displayChange = true; - }); + + // make sure the margins only add up to 99 at most, leaving 1% for content + int total = field.getValue() + oppositeField.getValue(); + if (total > 99) { + int suggestedOpposite = 99 - field.getValue(); + if (suggestedOpposite > 0) { + oppositeField.valueProperty().set(suggestedOpposite); +// oppositeField.setValue(suggestedOpposite); + } else { + // A number greater than 99 has been entered in the field + // clamp to 99 + field.valueProperty().set(99); + oppositeField.valueProperty().set(0); + } + } + }; + + + marginTopProperty.addListener(onMarginNumberChange); + marginRightProperty.addListener(onMarginNumberChange); + marginBottomProperty.addListener(onMarginNumberChange); + marginLeftProperty.addListener(onMarginNumberChange); settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) From 3068f57a5ac0ccd0d2225e04188c3e715becc83a Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 9 Sep 2019 20:59:56 -0500 Subject: [PATCH 19/25] Remove unused imports --- .../src/main/java/org/quelea/services/utils/PercentMargins.java | 1 - .../src/main/java/org/quelea/windows/options/DisplayGroup.java | 1 - 2 files changed, 2 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java b/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java index a6dd19a395..e9bef5d68b 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java +++ b/Quelea/src/main/java/org/quelea/services/utils/PercentMargins.java @@ -20,7 +20,6 @@ import javafx.geometry.BoundingBox; import javafx.geometry.Bounds; -import javafx.geometry.Rectangle2D; /** * Percentage-based (0-1) margins to be applied to a display diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index b713db4e00..5af4fbfb63 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -36,7 +36,6 @@ import org.quelea.services.utils.PercentMargins; import org.quelea.services.utils.QueleaProperties; -import java.awt.*; import java.util.ArrayList; import java.util.HashMap; From e85aaaf1e201992a01f0a425b7d3f1cd7bc3af6c Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 9 Sep 2019 21:10:01 -0500 Subject: [PATCH 20/25] Refactor long DisplayGroup constructor --- .../quelea/windows/options/DisplayGroup.java | 274 +++++++++--------- 1 file changed, 141 insertions(+), 133 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 5af4fbfb63..94f2050599 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -100,156 +100,164 @@ public class DisplayGroup { settings.add(Setting.of(groupName, customControl, screenSelectProperty).customKey(screenKey)); if (useCustom) { - Bounds bounds; - BooleanProperty useCustomPosition; - if (isProjector) { - bounds = QueleaProperties.get().getProjectorCoords(); - useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); - } else if (isStage) { - bounds = QueleaProperties.get().getStageCoords(); - useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isStageModeCoords()); - } else { - throw new IllegalArgumentException("Unsupported groupName: " + groupName); - } + setupCustomPosition(bindings, isProjector, isStage, customControl, settings); + } + + if (useMargins) { + setupMargins(isProjector, settings); + } - IntegerProperty widthProperty = new SimpleIntegerProperty((int) bounds.getWidth()); - IntegerProperty heightProperty = new SimpleIntegerProperty((int) bounds.getHeight()); - IntegerProperty xProperty = new SimpleIntegerProperty((int) bounds.getMinX()); - IntegerProperty yProperty = new SimpleIntegerProperty((int) bounds.getMinY()); - IntegerField sizeWith = Field.ofIntegerType(widthProperty).render( - new SimpleIntegerControl()); - IntegerField sizeHeight = Field.ofIntegerType(heightProperty).render( - new SimpleIntegerControl()); - IntegerField posX = Field.ofIntegerType(xProperty).render( - new SimpleIntegerControl()); - IntegerField posY = Field.ofIntegerType(yProperty).render( - new SimpleIntegerControl()); - - widthProperty.addListener(e -> { - displayChange = true; - }); - - heightProperty.addListener(e -> { - displayChange = true; - }); - - xProperty.addListener(e -> { - displayChange = true; - }); - - yProperty.addListener(e -> { - displayChange = true; - }); - - useCustomPosition.addListener(e -> { - displayChange = true; - }); - - - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) - .customKey(isProjector ? projectorModeKey : stageModeKey)); - settings.add(Setting.of("W", sizeWith, widthProperty) - .customKey(isProjector ? projectorWCoordKey : stageWCoordKey)); - settings.add(Setting.of("H", sizeHeight, heightProperty) - .customKey(isProjector ? projectorHCoordKey : stageHCoordKey)); - settings.add(Setting.of("X", posX, xProperty) - .customKey(isProjector ? projectorXCoordKey : stageXCoordKey)); - settings.add(Setting.of("Y", posY, yProperty) - .customKey(isProjector ? projectorYCoordKey : stageYCoordKey)); - - bindings.put(sizeWith, useCustomPosition.not()); - bindings.put(sizeHeight, useCustomPosition.not()); - bindings.put(posX, useCustomPosition.not()); - bindings.put(posY, useCustomPosition.not()); - bindings.put(customControl, useCustomPosition); + Setting[] settingsArray = new Setting[settings.size()]; + group = Group.of(groupName, + settings.toArray(settingsArray) + ); + } + + private void setupMargins(boolean isProjector, ArrayList settings) { + PercentMargins margins; + if (isProjector) { + margins = QueleaProperties.get().getProjectorMargin(); + } else { + throw new IllegalArgumentException("Unsupported groupName (isn't projector)"); } - if (useMargins) { - PercentMargins margins; - if (isProjector) { - margins = QueleaProperties.get().getProjectorMargin(); + IntegerRangeValidator validator = IntegerRangeValidator.upTo(99, "Maximum value of 99"); + IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); + IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); + IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); + IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); + IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( + new SimpleIntegerControl()); + IntegerField marginRight = Field.ofIntegerType(marginRightProperty).render( + new SimpleIntegerControl()); + IntegerField marginBottom = Field.ofIntegerType(marginBottomProperty).render( + new SimpleIntegerControl()); + IntegerField marginLeft = Field.ofIntegerType(marginLeftProperty).render( + new SimpleIntegerControl()); + + marginTop.validate(validator); + marginRight.validate(validator); + marginBottom.validate(validator); + + ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { + IntegerField field; + IntegerField oppositeField; + if (observable == marginTopProperty) { + field = marginTop; + oppositeField = marginBottom; + } else if (observable == marginRightProperty) { + field = marginRight; + oppositeField = marginLeft; + } else if (observable == marginBottomProperty) { + field = marginBottom; + oppositeField = marginTop; + } else if (observable == marginLeftProperty) { + field = marginLeft; + oppositeField = marginRight; } else { - throw new IllegalArgumentException("Unsupported groupName: " + groupName); + throw new IllegalArgumentException(); } - IntegerRangeValidator validator = IntegerRangeValidator.upTo(99, "Maximum value of 99"); - IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); - IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); - IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); - IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); - IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( - new SimpleIntegerControl()); - IntegerField marginRight = Field.ofIntegerType(marginRightProperty).render( - new SimpleIntegerControl()); - IntegerField marginBottom = Field.ofIntegerType(marginBottomProperty).render( - new SimpleIntegerControl()); - IntegerField marginLeft = Field.ofIntegerType(marginLeftProperty).render( - new SimpleIntegerControl()); - - marginTop.validate(validator); - marginRight.validate(validator); - marginBottom.validate(validator); - - ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { - IntegerField field; - IntegerField oppositeField; - if (observable == marginTopProperty) { - field = marginTop; - oppositeField = marginBottom; - } else if (observable == marginRightProperty) { - field = marginRight; - oppositeField = marginLeft; - } else if (observable == marginBottomProperty) { - field = marginBottom; - oppositeField = marginTop; - } else if (observable == marginLeftProperty) { - field = marginLeft; - oppositeField = marginRight; - } else { - throw new IllegalArgumentException(); - } - - displayChange = true; + displayChange = true; - // make sure the margins only add up to 99 at most, leaving 1% for content - int total = field.getValue() + oppositeField.getValue(); - if (total > 99) { - int suggestedOpposite = 99 - field.getValue(); - if (suggestedOpposite > 0) { - oppositeField.valueProperty().set(suggestedOpposite); + // make sure the margins only add up to 99 at most, leaving 1% for content + int total = field.getValue() + oppositeField.getValue(); + if (total > 99) { + int suggestedOpposite = 99 - field.getValue(); + if (suggestedOpposite > 0) { + oppositeField.valueProperty().set(suggestedOpposite); // oppositeField.setValue(suggestedOpposite); - } else { - // A number greater than 99 has been entered in the field - // clamp to 99 - field.valueProperty().set(99); - oppositeField.valueProperty().set(0); - } + } else { + // A number greater than 99 has been entered in the field + // clamp to 99 + field.valueProperty().set(99); + oppositeField.valueProperty().set(0); } - }; + } + }; - marginTopProperty.addListener(onMarginNumberChange); - marginRightProperty.addListener(onMarginNumberChange); - marginBottomProperty.addListener(onMarginNumberChange); - marginLeftProperty.addListener(onMarginNumberChange); + marginTopProperty.addListener(onMarginNumberChange); + marginRightProperty.addListener(onMarginNumberChange); + marginBottomProperty.addListener(onMarginNumberChange); + marginLeftProperty.addListener(onMarginNumberChange); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) - .customKey(projectorMarginTopKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRight, marginRightProperty) - .customKey(projectorMarginRightKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottom, marginBottomProperty) - .customKey(projectorMarginBottomKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeft, marginLeftProperty) - .customKey(projectorMarginLeftKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) + .customKey(projectorMarginTopKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRight, marginRightProperty) + .customKey(projectorMarginRightKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottom, marginBottomProperty) + .customKey(projectorMarginBottomKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeft, marginLeftProperty) + .customKey(projectorMarginLeftKey)); + } + + private void setupCustomPosition( HashMap bindings, boolean isProjector, boolean isStage, Field customControl, ArrayList settings) { + Bounds bounds; + BooleanProperty useCustomPosition; + if (isProjector) { + bounds = QueleaProperties.get().getProjectorCoords(); + useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isProjectorModeCoords()); + } else if (isStage) { + bounds = QueleaProperties.get().getStageCoords(); + useCustomPosition = new SimpleBooleanProperty(QueleaProperties.get().isStageModeCoords()); + } else { + throw new IllegalArgumentException("Unsupported groupName - is neither projector nor stage"); } - Setting[] settingsArray = new Setting[settings.size()]; - group = Group.of(groupName, - settings.toArray(settingsArray) - ); + IntegerProperty widthProperty = new SimpleIntegerProperty((int) bounds.getWidth()); + IntegerProperty heightProperty = new SimpleIntegerProperty((int) bounds.getHeight()); + IntegerProperty xProperty = new SimpleIntegerProperty((int) bounds.getMinX()); + IntegerProperty yProperty = new SimpleIntegerProperty((int) bounds.getMinY()); + IntegerField sizeWith = Field.ofIntegerType(widthProperty).render( + new SimpleIntegerControl()); + IntegerField sizeHeight = Field.ofIntegerType(heightProperty).render( + new SimpleIntegerControl()); + IntegerField posX = Field.ofIntegerType(xProperty).render( + new SimpleIntegerControl()); + IntegerField posY = Field.ofIntegerType(yProperty).render( + new SimpleIntegerControl()); + + widthProperty.addListener(e -> { + displayChange = true; + }); + + heightProperty.addListener(e -> { + displayChange = true; + }); + + xProperty.addListener(e -> { + displayChange = true; + }); + + yProperty.addListener(e -> { + displayChange = true; + }); + + useCustomPosition.addListener(e -> { + displayChange = true; + }); + + + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("custom.position.text"), useCustomPosition) + .customKey(isProjector ? projectorModeKey : stageModeKey)); + settings.add(Setting.of("W", sizeWith, widthProperty) + .customKey(isProjector ? projectorWCoordKey : stageWCoordKey)); + settings.add(Setting.of("H", sizeHeight, heightProperty) + .customKey(isProjector ? projectorHCoordKey : stageHCoordKey)); + settings.add(Setting.of("X", posX, xProperty) + .customKey(isProjector ? projectorXCoordKey : stageXCoordKey)); + settings.add(Setting.of("Y", posY, yProperty) + .customKey(isProjector ? projectorYCoordKey : stageYCoordKey)); + + bindings.put(sizeWith, useCustomPosition.not()); + bindings.put(sizeHeight, useCustomPosition.not()); + bindings.put(posX, useCustomPosition.not()); + bindings.put(posY, useCustomPosition.not()); + bindings.put(customControl, useCustomPosition); } From 5a9061d462b22feb478c5458d31b70f47d2a668a Mon Sep 17 00:00:00 2001 From: DallonF Date: Mon, 9 Sep 2019 21:24:06 -0500 Subject: [PATCH 21/25] Use sliders for margin settings --- .../quelea/windows/options/DisplayGroup.java | 145 ++++++++---------- 1 file changed, 65 insertions(+), 80 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 94f2050599..8991dc99a2 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -114,86 +114,6 @@ public class DisplayGroup { ); } - private void setupMargins(boolean isProjector, ArrayList settings) { - PercentMargins margins; - if (isProjector) { - margins = QueleaProperties.get().getProjectorMargin(); - } else { - throw new IllegalArgumentException("Unsupported groupName (isn't projector)"); - } - - IntegerRangeValidator validator = IntegerRangeValidator.upTo(99, "Maximum value of 99"); - IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); - IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); - IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); - IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); - IntegerField marginTop = Field.ofIntegerType(marginTopProperty).render( - new SimpleIntegerControl()); - IntegerField marginRight = Field.ofIntegerType(marginRightProperty).render( - new SimpleIntegerControl()); - IntegerField marginBottom = Field.ofIntegerType(marginBottomProperty).render( - new SimpleIntegerControl()); - IntegerField marginLeft = Field.ofIntegerType(marginLeftProperty).render( - new SimpleIntegerControl()); - - marginTop.validate(validator); - marginRight.validate(validator); - marginBottom.validate(validator); - - ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { - IntegerField field; - IntegerField oppositeField; - if (observable == marginTopProperty) { - field = marginTop; - oppositeField = marginBottom; - } else if (observable == marginRightProperty) { - field = marginRight; - oppositeField = marginLeft; - } else if (observable == marginBottomProperty) { - field = marginBottom; - oppositeField = marginTop; - } else if (observable == marginLeftProperty) { - field = marginLeft; - oppositeField = marginRight; - } else { - throw new IllegalArgumentException(); - } - - displayChange = true; - - // make sure the margins only add up to 99 at most, leaving 1% for content - int total = field.getValue() + oppositeField.getValue(); - if (total > 99) { - int suggestedOpposite = 99 - field.getValue(); - if (suggestedOpposite > 0) { - oppositeField.valueProperty().set(suggestedOpposite); -// oppositeField.setValue(suggestedOpposite); - } else { - // A number greater than 99 has been entered in the field - // clamp to 99 - field.valueProperty().set(99); - oppositeField.valueProperty().set(0); - } - } - }; - - - marginTopProperty.addListener(onMarginNumberChange); - marginRightProperty.addListener(onMarginNumberChange); - marginBottomProperty.addListener(onMarginNumberChange); - marginLeftProperty.addListener(onMarginNumberChange); - - - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTop, marginTopProperty) - .customKey(projectorMarginTopKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRight, marginRightProperty) - .customKey(projectorMarginRightKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottom, marginBottomProperty) - .customKey(projectorMarginBottomKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeft, marginLeftProperty) - .customKey(projectorMarginLeftKey)); - } - private void setupCustomPosition( HashMap bindings, boolean isProjector, boolean isStage, Field customControl, ArrayList settings) { Bounds bounds; BooleanProperty useCustomPosition; @@ -260,6 +180,71 @@ private void setupCustomPosition( HashMap bindings, bool bindings.put(customControl, useCustomPosition); } + private void setupMargins(boolean isProjector, ArrayList settings) { + PercentMargins margins; + if (isProjector) { + margins = QueleaProperties.get().getProjectorMargin(); + } else { + throw new IllegalArgumentException("Unsupported groupName (isn't projector)"); + } + + IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); + IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); + IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); + IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); + + ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { + IntegerProperty property; + IntegerProperty opposite; + if (observable == marginTopProperty) { + property = marginTopProperty; + opposite = marginBottomProperty; + } else if (observable == marginRightProperty) { + property = marginRightProperty; + opposite = marginLeftProperty; + } else if (observable == marginBottomProperty) { + property = marginBottomProperty; + opposite = marginTopProperty; + } else if (observable == marginLeftProperty) { + property = marginLeftProperty; + opposite = marginRightProperty; + } else { + throw new IllegalArgumentException(); + } + + displayChange = true; + + // make sure the margins only add up to 99 at most, leaving 1% for content + int total = property.getValue() + opposite.getValue(); + if (total > 99) { + int suggestedOpposite = 99 - property.getValue(); + if (suggestedOpposite > 0) { + opposite.set(suggestedOpposite); + } else { + // A number greater than 99 has been selected + // clamp to 99 + property.set(99); + opposite.set(0); + } + } + }; + + + marginTopProperty.addListener(onMarginNumberChange); + marginRightProperty.addListener(onMarginNumberChange); + marginBottomProperty.addListener(onMarginNumberChange); + marginLeftProperty.addListener(onMarginNumberChange); + + + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTopProperty, 0, 99) + .customKey(projectorMarginTopKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRightProperty, 0, 99) + .customKey(projectorMarginRightKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottomProperty, 0, 99) + .customKey(projectorMarginBottomKey)); + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeftProperty, 0, 99) + .customKey(projectorMarginLeftKey)); + } /** * Get a list model describing the available graphical devices. From ab863f5e34e1ceb782373ae724b9462fbef0d7a4 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 10 Sep 2019 18:25:59 -0500 Subject: [PATCH 22/25] Use PercentSliderControl for margin settings --- Quelea/languages/gb.lang | 8 ++-- .../services/utils/QueleaProperties.java | 16 ++++---- .../quelea/windows/options/DisplayGroup.java | 39 ++++++++++++------- .../options/PreferenceStorageHandler.java | 16 ++++---- 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Quelea/languages/gb.lang b/Quelea/languages/gb.lang index 9f5f1b9dee..427c058633 100644 --- a/Quelea/languages/gb.lang +++ b/Quelea/languages/gb.lang @@ -699,7 +699,7 @@ small.bible.text.options=Small Bible Text Options general.user.options=General User Options theme.options=Theme Options schedule.options=Schedule Options -projector.margin.top=Margin Top % -projector.margin.right=Margin Right % -projector.margin.bottom=Margin Bottom % -projector.margin.left=Margin Left % +projector.margin.top=Margin Top +projector.margin.right=Margin Right +projector.margin.bottom=Margin Bottom +projector.margin.left=Margin Left diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index a1f9f7158c..cd6e0015a8 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -2297,27 +2297,27 @@ public void setProjectorMargin(@NotNull PercentMargins margins) { setProperty(projectorMarginKey, margins.toString()); } - public void setProjectorMarginTop(int value) { + public void setProjectorMarginTop(double value) { PercentMargins prop = getProjectorMargin(); - PercentMargins newProp = new PercentMargins(value / 100.0, prop.getRight(), prop.getBottom(), prop.getLeft()); + PercentMargins newProp = new PercentMargins(value, prop.getRight(), prop.getBottom(), prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginRight(int value) { + public void setProjectorMarginRight(double value) { PercentMargins prop = getProjectorMargin(); - PercentMargins newProp = new PercentMargins(prop.getTop(), value / 100.0, prop.getBottom(), prop.getLeft()); + PercentMargins newProp = new PercentMargins(prop.getTop(), value, prop.getBottom(), prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginBottom(int value) { + public void setProjectorMarginBottom(double value) { PercentMargins prop = getProjectorMargin(); - PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), value / 100.0, prop.getLeft()); + PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), value, prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginLeft(int value) { + public void setProjectorMarginLeft(double value) { PercentMargins prop = getProjectorMargin(); - PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), prop.getBottom(), value / 100.0); + PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), prop.getBottom(), value); setProjectorMargin(newProp); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 8991dc99a2..342f7045ee 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -17,6 +17,7 @@ */ package org.quelea.windows.options; +import com.dlsc.formsfx.model.structure.DoubleField; import com.dlsc.formsfx.model.structure.Field; import com.dlsc.formsfx.model.structure.IntegerField; import com.dlsc.formsfx.model.validators.IntegerRangeValidator; @@ -35,6 +36,7 @@ import org.quelea.services.languages.LabelGrabber; import org.quelea.services.utils.PercentMargins; import org.quelea.services.utils.QueleaProperties; +import org.quelea.windows.options.customprefs.PercentSliderControl; import java.util.ArrayList; import java.util.HashMap; @@ -188,14 +190,23 @@ private void setupMargins(boolean isProjector, ArrayList settings) { throw new IllegalArgumentException("Unsupported groupName (isn't projector)"); } - IntegerProperty marginTopProperty = new SimpleIntegerProperty((int)(margins.getTop() * 100)); - IntegerProperty marginRightProperty = new SimpleIntegerProperty((int)(margins.getRight() * 100)); - IntegerProperty marginBottomProperty = new SimpleIntegerProperty((int)(margins.getBottom() * 100)); - IntegerProperty marginLeftProperty = new SimpleIntegerProperty((int)(margins.getLeft() * 100)); + DoubleProperty marginTopProperty = new SimpleDoubleProperty(margins.getTop()); + DoubleProperty marginRightProperty = new SimpleDoubleProperty(margins.getRight()); + DoubleProperty marginBottomProperty = new SimpleDoubleProperty(margins.getBottom()); + DoubleProperty marginLeftProperty = new SimpleDoubleProperty(margins.getLeft()); + + DoubleField marginTopField = Field.ofDoubleType(marginTopProperty).render( + new PercentSliderControl(0.0, 0.99, 2)); + DoubleField marginRightField = Field.ofDoubleType(marginRightProperty).render( + new PercentSliderControl(0.0, 0.99, 2)); + DoubleField marginBottomField = Field.ofDoubleType(marginBottomProperty).render( + new PercentSliderControl(0.0, 0.99, 2)); + DoubleField marginLeftField = Field.ofDoubleType(marginLeftProperty).render( + new PercentSliderControl(0.0, 0.99, 2)); ChangeListener onMarginNumberChange = (observable, oldValue, newValue) -> { - IntegerProperty property; - IntegerProperty opposite; + DoubleProperty property; + DoubleProperty opposite; if (observable == marginTopProperty) { property = marginTopProperty; opposite = marginBottomProperty; @@ -215,15 +226,15 @@ private void setupMargins(boolean isProjector, ArrayList settings) { displayChange = true; // make sure the margins only add up to 99 at most, leaving 1% for content - int total = property.getValue() + opposite.getValue(); - if (total > 99) { - int suggestedOpposite = 99 - property.getValue(); + double total = property.getValue() + opposite.getValue(); + if (total > 0.99) { + double suggestedOpposite = 0.99 - property.getValue(); if (suggestedOpposite > 0) { opposite.set(suggestedOpposite); } else { // A number greater than 99 has been selected // clamp to 99 - property.set(99); + property.set(0.99); opposite.set(0); } } @@ -236,13 +247,13 @@ private void setupMargins(boolean isProjector, ArrayList settings) { marginLeftProperty.addListener(onMarginNumberChange); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTopProperty, 0, 99) + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.top"), marginTopField, marginTopProperty) .customKey(projectorMarginTopKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRightProperty, 0, 99) + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.right"), marginRightField, marginRightProperty) .customKey(projectorMarginRightKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottomProperty, 0, 99) + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.bottom"), marginBottomField, marginBottomProperty) .customKey(projectorMarginBottomKey)); - settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeftProperty, 0, 99) + settings.add(Setting.of(LabelGrabber.INSTANCE.getLabel("projector.margin.left"), marginLeftField, marginLeftProperty) .customKey(projectorMarginLeftKey)); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java index 6943999e9f..40b0a8a41e 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferenceStorageHandler.java @@ -209,16 +209,16 @@ public void saveObject(String breadcrumb, Object object) { QueleaProperties.get().setYProjectorCoord(object.toString()); break; case QueleaPropertyKeys.projectorMarginTopKey: - QueleaProperties.get().setProjectorMarginTop((Integer) object); + QueleaProperties.get().setProjectorMarginTop((Double) object); break; case QueleaPropertyKeys.projectorMarginRightKey: - QueleaProperties.get().setProjectorMarginRight((Integer) object); + QueleaProperties.get().setProjectorMarginRight((Double) object); break; case QueleaPropertyKeys.projectorMarginBottomKey: - QueleaProperties.get().setProjectorMarginBottom((Integer) object); + QueleaProperties.get().setProjectorMarginBottom((Double) object); break; case QueleaPropertyKeys.projectorMarginLeftKey: - QueleaProperties.get().setProjectorMarginLeft((Integer) object); + QueleaProperties.get().setProjectorMarginLeft((Double) object); break; case QueleaPropertyKeys.stageHCoordKey: QueleaProperties.get().setHeightStageCoord(object.toString()); @@ -340,13 +340,13 @@ public Object loadObject(String breadcrumb, Object defaultObject) { case QueleaPropertyKeys.projectorYCoordKey: return QueleaProperties.get().getProjectorCoords().getMinY(); case QueleaPropertyKeys.projectorMarginTopKey: - return QueleaProperties.get().getProjectorMargin().getTop() * 100; + return QueleaProperties.get().getProjectorMargin().getTop(); case QueleaPropertyKeys.projectorMarginRightKey: - return QueleaProperties.get().getProjectorMargin().getRight() * 100; + return QueleaProperties.get().getProjectorMargin().getRight(); case QueleaPropertyKeys.projectorMarginBottomKey: - return QueleaProperties.get().getProjectorMargin().getBottom() * 100; + return QueleaProperties.get().getProjectorMargin().getBottom(); case QueleaPropertyKeys.projectorMarginLeftKey: - return QueleaProperties.get().getProjectorMargin().getLeft() * 100; + return QueleaProperties.get().getProjectorMargin().getLeft(); case QueleaPropertyKeys.stageHCoordKey: return QueleaProperties.get().getStageCoords().getHeight(); case QueleaPropertyKeys.stageWCoordKey: From 0d2d1a3ab3ee1af4f2ab28ea3f5587fa24c195d6 Mon Sep 17 00:00:00 2001 From: DallonF Date: Tue, 10 Sep 2019 18:33:44 -0500 Subject: [PATCH 23/25] Oops, one more unused import --- .../src/main/java/org/quelea/windows/options/DisplayGroup.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java index 342f7045ee..284a747967 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java +++ b/Quelea/src/main/java/org/quelea/windows/options/DisplayGroup.java @@ -20,7 +20,6 @@ import com.dlsc.formsfx.model.structure.DoubleField; import com.dlsc.formsfx.model.structure.Field; import com.dlsc.formsfx.model.structure.IntegerField; -import com.dlsc.formsfx.model.validators.IntegerRangeValidator; import com.dlsc.preferencesfx.formsfx.view.controls.SimpleComboBoxControl; import com.dlsc.preferencesfx.formsfx.view.controls.SimpleIntegerControl; import com.dlsc.preferencesfx.model.Group; From 436c3aa32a8673fa589b0f863abdb86bd4040119 Mon Sep 17 00:00:00 2001 From: DallonF Date: Thu, 17 Oct 2019 19:48:23 -0500 Subject: [PATCH 24/25] Don't set fullscreen if margins are set --- .../org/quelea/services/utils/QueleaProperties.java | 12 ++++++++---- .../src/main/java/org/quelea/windows/main/Main.java | 4 +++- .../quelea/windows/options/PreferencesDialog.java | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java index 46497ef06d..44a1f286c0 100644 --- a/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java +++ b/Quelea/src/main/java/org/quelea/services/utils/QueleaProperties.java @@ -2297,30 +2297,34 @@ public void setProjectorMargin(@NotNull PercentMargins margins) { setProperty(projectorMarginKey, margins.toString()); } - public void setProjectorMarginTop(double value) { + public void setProjectorMarginTop(double value) { PercentMargins prop = getProjectorMargin(); PercentMargins newProp = new PercentMargins(value, prop.getRight(), prop.getBottom(), prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginRight(double value) { + public void setProjectorMarginRight(double value) { PercentMargins prop = getProjectorMargin(); PercentMargins newProp = new PercentMargins(prop.getTop(), value, prop.getBottom(), prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginBottom(double value) { + public void setProjectorMarginBottom(double value) { PercentMargins prop = getProjectorMargin(); PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), value, prop.getLeft()); setProjectorMargin(newProp); } - public void setProjectorMarginLeft(double value) { + public void setProjectorMarginLeft(double value) { PercentMargins prop = getProjectorMargin(); PercentMargins newProp = new PercentMargins(prop.getTop(), prop.getRight(), prop.getBottom(), value); setProjectorMargin(newProp); } + public boolean hasProjectorMargin() { + PercentMargins margins = getProjectorMargin(); + return margins.getTop() > 0 || margins.getLeft() > 0 || margins.getBottom() > 0 || margins.getRight() > 0; + } public Bounds applyProjectorMargin(Bounds coords) { return getProjectorMargin().applyMargins(coords); diff --git a/Quelea/src/main/java/org/quelea/windows/main/Main.java b/Quelea/src/main/java/org/quelea/windows/main/Main.java index ff48fb97db..514abbede1 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/Main.java +++ b/Quelea/src/main/java/org/quelea/windows/main/Main.java @@ -206,7 +206,9 @@ public void run() { ), false ); - fullScreenWindow.setFullScreenAlwaysOnTop(true); + if (!QueleaProperties.get().hasProjectorMargin()) { + fullScreenWindow.setFullScreenAlwaysOnTop(true); + } }); } diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java index 572e6f53b9..2c0b58c53a 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java @@ -185,7 +185,7 @@ public void updatePos() { } // non-custom positioned windows are fullscreen - if (!QueleaProperties.get().isProjectorModeCoords()) { + if (!QueleaProperties.get().isProjectorModeCoords() && !QueleaProperties.get().hasProjectorMargin()) { if (QueleaProperties.get().getProjectorScreen() == -1) { fiLyricWindow.hide(); VLCWindow.INSTANCE.refreshPosition(); From 7bf77f305e1ee8898378dd3e370a21e699f9c033 Mon Sep 17 00:00:00 2001 From: DallonF Date: Sat, 19 Oct 2019 15:16:39 -0500 Subject: [PATCH 25/25] Move margins check --- .../java/org/quelea/windows/options/PreferencesDialog.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java index 2c0b58c53a..550ede78d4 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java +++ b/Quelea/src/main/java/org/quelea/windows/options/PreferencesDialog.java @@ -185,12 +185,14 @@ public void updatePos() { } // non-custom positioned windows are fullscreen - if (!QueleaProperties.get().isProjectorModeCoords() && !QueleaProperties.get().hasProjectorMargin()) { + if (!QueleaProperties.get().isProjectorModeCoords()) { if (QueleaProperties.get().getProjectorScreen() == -1) { fiLyricWindow.hide(); VLCWindow.INSTANCE.refreshPosition(); } else { - fiLyricWindow.setFullScreenAlwaysOnTop(true); + if (!QueleaProperties.get().hasProjectorMargin()) { + fiLyricWindow.setFullScreenAlwaysOnTop(true); + } } } else { fiLyricWindow.setFullScreenAlwaysOnTop(false);