Skip to content

Commit 354b365

Browse files
author
Jan Schraff
committed
moved ScreenLogic to own class
1 parent 2f7ba10 commit 354b365

File tree

6 files changed

+143
-103
lines changed

6 files changed

+143
-103
lines changed

src/main/java/de/doubleslash/keeptime/Main.java

Lines changed: 6 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import de.doubleslash.keeptime.common.FontProvider;
3434
import de.doubleslash.keeptime.common.Resources;
3535
import de.doubleslash.keeptime.common.Resources.RESOURCE;
36+
import de.doubleslash.keeptime.common.ScreenPosManager;
3637
import de.doubleslash.keeptime.controller.Controller;
3738
import de.doubleslash.keeptime.model.Model;
3839
import de.doubleslash.keeptime.model.Project;
@@ -42,8 +43,6 @@
4243
import de.doubleslash.keeptime.viewpopup.GlobalScreenListener;
4344
import de.doubleslash.keeptime.viewpopup.ViewControllerPopup;
4445
import javafx.application.Application;
45-
import javafx.beans.value.ChangeListener;
46-
import javafx.beans.value.ObservableValue;
4746
import javafx.event.EventHandler;
4847
import javafx.fxml.FXMLLoader;
4948
import javafx.scene.Parent;
@@ -60,7 +59,6 @@
6059
import javafx.scene.layout.Pane;
6160
import javafx.scene.layout.Priority;
6261
import javafx.scene.paint.Color;
63-
import javafx.stage.Screen;
6462
import javafx.stage.Stage;
6563
import javafx.stage.StageStyle;
6664
import javafx.stage.WindowEvent;
@@ -206,10 +204,10 @@ private void readSettings() {
206204
model.useHotkey.set(settings.isUseHotkey());
207205
model.displayProjectsRight.set(settings.isDisplayProjectsRight());
208206
model.hideProjectsOnMouseExit.set(settings.isHideProjectsOnMouseExit());
209-
model.windowPositionX.set(settings.getWindowPositionX());
210-
model.windowPositionY.set(settings.getWindowPositionY());
211-
model.screenHash.set(settings.getScreenHash());
212-
model.saveWindowPosition.set(settings.isSaveWindowPosition());
207+
model.screenSettings.windowPositionX.set(settings.getWindowPositionX());
208+
model.screenSettings.windowPositionY.set(settings.getWindowPositionY());
209+
model.screenSettings.screenHash.set(settings.getScreenHash());
210+
model.screenSettings.saveWindowPosition.set(settings.isSaveWindowPosition());
213211
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
214212

215213
}
@@ -246,67 +244,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
246244
private void initialiseUI(final Stage primaryStage) throws IOException {
247245
LOG.debug("Initialising main UI.");
248246

249-
if (Boolean.TRUE.equals(model.saveWindowPosition.get())) {
250-
LOG.info("Setting position of lightsStage to X: '{}' Y: '{}'.", model.getAbsolutePositionX(),
251-
model.getAbsolutePositionY());
252-
primaryStage.setX(model.getAbsolutePositionX());
253-
primaryStage.setY(model.getAbsolutePositionY());
254-
}
255-
256-
final ChangeListener<Number> posChange = new ChangeListener<Number>() {
257-
258-
@Override
259-
public void changed(final ObservableValue<? extends Number> observable, final Number oldValue,
260-
final Number newValue) {
261-
if (!model.saveWindowPosition.get()) {
262-
return;
263-
}
264-
265-
final Settings newSettings = new Settings(model.hoverBackgroundColor.get(), model.hoverFontColor.get(),
266-
model.defaultBackgroundColor.get(), model.defaultFontColor.get(), model.taskBarColor.get(),
267-
model.useHotkey.get(), model.displayProjectsRight.get(), model.hideProjectsOnMouseExit.get(),
268-
model.windowPositionX.get(), model.windowPositionY.get(), model.screenHash.get(),
269-
model.saveWindowPosition.get(), model.remindIfNotesAreEmpty.get());
270-
271-
if (observable.equals(primaryStage.xProperty())) {
272-
Screen screen = Screen.getPrimary();
273-
for (final Screen s : Screen.getScreens()) {
274-
if (s.getVisualBounds().getMinX() <= newValue.doubleValue()
275-
&& newValue.doubleValue() <= s.getVisualBounds().getMaxX()
276-
&& s.getVisualBounds().getMinY() <= model.windowPositionY.get()
277-
&& model.windowPositionY.get() <= s.getVisualBounds().getMaxY()) {
278-
screen = s;
279-
break;
280-
}
281-
}
282-
newSettings.setScreenHash(screen.hashCode());
283-
final double xInScreen = newValue.doubleValue() - screen.getVisualBounds().getMinX();
284-
newSettings.setWindowPositionX(xInScreen / screen.getVisualBounds().getWidth());
285-
286-
} else {
287-
288-
Screen screen = Screen.getPrimary();
289-
for (final Screen s : Screen.getScreens()) {
290-
if (s.getVisualBounds().getMinY() <= newValue.doubleValue()
291-
&& newValue.doubleValue() <= s.getVisualBounds().getMaxY()
292-
&& s.getVisualBounds().getMinX() <= model.windowPositionX.get()
293-
&& model.windowPositionX.get() <= s.getVisualBounds().getMaxX()) {
294-
screen = s;
295-
break;
296-
}
297-
}
298-
newSettings.setScreenHash(screen.hashCode());
299-
final double yInScreen = newValue.doubleValue() - screen.getVisualBounds().getMinY();
300-
newSettings.setWindowPositionY(yInScreen / screen.getVisualBounds().getHeight());
301-
}
302-
303-
controller.updateSettings(newSettings);
304-
LOG.debug("updated Position to x: {} y: {}", model.windowPositionX.get(), model.windowPositionY.get());
305-
}
306-
307-
};
308-
primaryStage.xProperty().addListener(posChange);
309-
primaryStage.yProperty().addListener(posChange);
247+
new ScreenPosManager(primaryStage, model, controller);
310248

311249
Pane mainPane;
312250

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package de.doubleslash.keeptime.common;
2+
3+
import de.doubleslash.keeptime.controller.Controller;
4+
import de.doubleslash.keeptime.model.Model;
5+
import de.doubleslash.keeptime.model.Settings;
6+
import javafx.beans.value.ChangeListener;
7+
import javafx.beans.value.ObservableValue;
8+
import javafx.stage.Screen;
9+
import javafx.stage.Stage;
10+
11+
public class ScreenPosManager {
12+
13+
Stage stage;
14+
Model model;
15+
Controller controller;
16+
17+
public ScreenPosManager(final Stage stage, final Model model, final Controller controller) {
18+
this.stage = stage;
19+
this.model = model;
20+
this.controller = controller;
21+
22+
setStageToSavedPos();
23+
registerStageMovedListener();
24+
25+
}
26+
27+
public void setStageToSavedPos() {
28+
if (model.screenSettings.saveWindowPosition.get()) {
29+
stage.setX(getAbsolutePositionX(model));
30+
stage.setY(getAbsolutePositionY(model));
31+
}
32+
}
33+
34+
public void registerStageMovedListener() {
35+
final ChangeListener<Number> posChange = new ChangeListener<Number>() {
36+
37+
@Override
38+
public void changed(final ObservableValue<? extends Number> observable, final Number oldValue,
39+
final Number newValue) {
40+
if (!model.screenSettings.saveWindowPosition.get()) {
41+
return;
42+
}
43+
44+
final Settings newSettings = new Settings(model.hoverBackgroundColor.get(), model.hoverFontColor.get(),
45+
model.defaultBackgroundColor.get(), model.defaultFontColor.get(), model.taskBarColor.get(),
46+
model.useHotkey.get(), model.displayProjectsRight.get(), model.hideProjectsOnMouseExit.get(),
47+
model.screenSettings.windowPositionX.get(), model.screenSettings.windowPositionY.get(),
48+
model.screenSettings.screenHash.get(), model.screenSettings.saveWindowPosition.get(),
49+
model.remindIfNotesAreEmpty.get());
50+
51+
if (observable.equals(stage.xProperty())) {
52+
Screen screen = Screen.getPrimary();
53+
for (final Screen s : Screen.getScreens()) {
54+
if (s.getVisualBounds().getMinX() <= newValue.doubleValue()
55+
&& newValue.doubleValue() <= s.getVisualBounds().getMaxX()
56+
&& s.getVisualBounds().getMinY() <= model.screenSettings.windowPositionY.get()
57+
&& model.screenSettings.windowPositionY.get() <= s.getVisualBounds().getMaxY()) {
58+
screen = s;
59+
break;
60+
}
61+
}
62+
newSettings.setScreenHash(screen.hashCode());
63+
final double xInScreen = newValue.doubleValue() - screen.getVisualBounds().getMinX();
64+
newSettings.setWindowPositionX(xInScreen / screen.getVisualBounds().getWidth());
65+
66+
} else {
67+
68+
Screen screen = Screen.getPrimary();
69+
for (final Screen s : Screen.getScreens()) {
70+
if (s.getVisualBounds().getMinY() <= newValue.doubleValue()
71+
&& newValue.doubleValue() <= s.getVisualBounds().getMaxY()
72+
&& s.getVisualBounds().getMinX() <= model.screenSettings.windowPositionX.get()
73+
&& model.screenSettings.windowPositionX.get() <= s.getVisualBounds().getMaxX()) {
74+
screen = s;
75+
break;
76+
}
77+
}
78+
newSettings.setScreenHash(screen.hashCode());
79+
final double yInScreen = newValue.doubleValue() - screen.getVisualBounds().getMinY();
80+
newSettings.setWindowPositionY(yInScreen / screen.getVisualBounds().getHeight());
81+
}
82+
83+
controller.updateSettings(newSettings);
84+
85+
}
86+
87+
};
88+
stage.xProperty().addListener(posChange);
89+
stage.yProperty().addListener(posChange);
90+
91+
}
92+
93+
private double getAbsolutePositionX(final Model model) {
94+
final Screen toDisplay = getScreenWithHashOrPrimary(model.screenSettings.screenHash.get());
95+
return toDisplay.getVisualBounds().getMinX()
96+
+ (toDisplay.getVisualBounds().getWidth() * model.screenSettings.windowPositionX.get());
97+
98+
}
99+
100+
private double getAbsolutePositionY(final Model model) {
101+
final Screen toDisplay = getScreenWithHashOrPrimary(model.screenSettings.screenHash.get());
102+
return toDisplay.getVisualBounds().getMinY()
103+
+ (toDisplay.getVisualBounds().getHeight() * model.screenSettings.windowPositionY.get());
104+
105+
}
106+
107+
private Screen getScreenWithHashOrPrimary(final int hash) {
108+
109+
for (final Screen s : Screen.getScreens()) {
110+
if (s.hashCode() == hash) {
111+
return s;
112+
}
113+
}
114+
return Screen.getPrimary();
115+
}
116+
117+
}

src/main/java/de/doubleslash/keeptime/controller/Controller.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ public void updateSettings(final Settings newValuedSettings) {
128128
model.useHotkey.set(settings.isUseHotkey());
129129
model.displayProjectsRight.set(settings.isDisplayProjectsRight());
130130
model.hideProjectsOnMouseExit.set(settings.isHideProjectsOnMouseExit());
131-
model.saveWindowPosition.set(settings.isSaveWindowPosition());
132-
model.windowPositionX.set(settings.getWindowPositionX());
133-
model.windowPositionY.set(settings.getWindowPositionY());
134-
model.screenHash.set(settings.getScreenHash());
131+
model.screenSettings.saveWindowPosition.set(settings.isSaveWindowPosition());
132+
model.screenSettings.windowPositionX.set(settings.getWindowPositionX());
133+
model.screenSettings.windowPositionY.set(settings.getWindowPositionY());
134+
model.screenSettings.screenHash.set(settings.getScreenHash());
135135
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
136136
}
137137

src/main/java/de/doubleslash/keeptime/model/Model.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import javafx.collections.ObservableList;
3232
import javafx.collections.transformation.SortedList;
3333
import javafx.scene.paint.Color;
34-
import javafx.stage.Screen;
3534

3635
@Component
3736
public class Model {
@@ -83,10 +82,7 @@ public Model(final ProjectRepository projectRepository, final WorkRepository wor
8382

8483
public final ObjectProperty<Boolean> remindIfNotesAreEmpty = new SimpleObjectProperty<>(false);
8584

86-
public final ObjectProperty<Boolean> saveWindowPosition = new SimpleObjectProperty<>(false);
87-
public final ObjectProperty<Double> windowPositionY = new SimpleObjectProperty<>(0.5);
88-
public final ObjectProperty<Double> windowPositionX = new SimpleObjectProperty<>(0.5);
89-
public final ObjectProperty<Integer> screenHash = new SimpleObjectProperty<>(0);
85+
public final ScreenSettings screenSettings = new ScreenSettings();
9086

9187
private ConfigurableApplicationContext springContext;
9288

@@ -142,28 +138,6 @@ public ObservableList<Project> getAllProjects() {
142138
return allProjects;
143139
}
144140

145-
public double getAbsolutePositionX() {
146-
final Screen toDisplay = getScreenWithHashOrPrimary(screenHash.get());
147-
return toDisplay.getVisualBounds().getMinX() + (toDisplay.getVisualBounds().getWidth() * windowPositionX.get());
148-
149-
}
150-
151-
public double getAbsolutePositionY() {
152-
final Screen toDisplay = getScreenWithHashOrPrimary(screenHash.get());
153-
return toDisplay.getVisualBounds().getMinY() + (toDisplay.getVisualBounds().getHeight() * windowPositionY.get());
154-
155-
}
156-
157-
private Screen getScreenWithHashOrPrimary(final int hash) {
158-
159-
for (final Screen s : Screen.getScreens()) {
160-
if (s.hashCode() == hash) {
161-
return s;
162-
}
163-
}
164-
return Screen.getPrimary();
165-
}
166-
167141
public void setSpringContext(final ConfigurableApplicationContext springContext) {
168142
this.springContext = springContext;
169143
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package de.doubleslash.keeptime.model;
2+
3+
import javafx.beans.property.ObjectProperty;
4+
import javafx.beans.property.SimpleObjectProperty;
5+
6+
public class ScreenSettings {
7+
public final ObjectProperty<Boolean> saveWindowPosition = new SimpleObjectProperty<>(false);
8+
public final ObjectProperty<Double> windowPositionY = new SimpleObjectProperty<>(0.5);
9+
public final ObjectProperty<Double> windowPositionX = new SimpleObjectProperty<>(0.5);
10+
public final ObjectProperty<Integer> screenHash = new SimpleObjectProperty<>(0);
11+
}

src/main/java/de/doubleslash/keeptime/view/SettingsController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ private void initialize() {
179179
controller.updateSettings(new Settings(hoverBackgroundColor.getValue(), hoverFontColor.getValue(),
180180
defaultBackgroundColor.getValue(), defaultFontColor.getValue(), taskBarColor.getValue(),
181181
useHotkeyCheckBox.isSelected(), displayProjectsRightCheckBox.isSelected(),
182-
hideProjectsOnMouseExitCheckBox.isSelected(), model.windowPositionX.get(), model.windowPositionY.get(),
183-
model.screenHash.get(), saveWindowPositionCheckBox.isSelected(),
184-
emptyNoteReminderCheckBox.isSelected()));
182+
hideProjectsOnMouseExitCheckBox.isSelected(), model.screenSettings.windowPositionX.get(),
183+
model.screenSettings.windowPositionY.get(), model.screenSettings.screenHash.get(),
184+
saveWindowPositionCheckBox.isSelected(), emptyNoteReminderCheckBox.isSelected()));
185185
thisStage.close();
186186

187187
});
@@ -223,7 +223,7 @@ void update() {
223223
useHotkeyCheckBox.setSelected(model.useHotkey.get());
224224
displayProjectsRightCheckBox.setSelected(model.displayProjectsRight.get());
225225
hideProjectsOnMouseExitCheckBox.setSelected(model.hideProjectsOnMouseExit.get());
226-
saveWindowPositionCheckBox.setSelected(model.saveWindowPosition.get());
226+
saveWindowPositionCheckBox.setSelected(model.screenSettings.saveWindowPosition.get());
227227
emptyNoteReminderCheckBox.setSelected(model.remindIfNotesAreEmpty.get());
228228
}
229229

0 commit comments

Comments
 (0)