Skip to content

Commit bfeaa67

Browse files
authored
Feature/#93 confirmation dialog on closing (#98)
added confirmation on close option.
1 parent 89462e6 commit bfeaa67

File tree

8 files changed

+93
-22
lines changed

8 files changed

+93
-22
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ private void readSettings() {
210210
model.screenSettings.saveWindowPosition.set(settings.isSaveWindowPosition());
211211
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
212212
model.remindIfNotesAreEmptyOnlyForWorkEntry.set(settings.isRemindIfNotesAreEmptyOnlyForWorkEntry());
213+
model.confirmClose.set(settings.isConfirmClose());
213214

214215
}
215216

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public void updateSettings(final Settings newValuedSettings) {
132132
settings.setScreenHash(newValuedSettings.getScreenHash());
133133
settings.setRemindIfNotesAreEmpty(newValuedSettings.isRemindIfNotesAreEmpty());
134134
settings.setRemindIfNotesAreEmptyOnlyForWorkEntry(newValuedSettings.isRemindIfNotesAreEmptyOnlyForWorkEntry());
135+
settings.setConfirmClose(newValuedSettings.isConfirmClose());
135136

136137
settings = model.getSettingsRepository().save(settings);
137138

@@ -149,6 +150,7 @@ public void updateSettings(final Settings newValuedSettings) {
149150
model.screenSettings.screenHash.set(settings.getScreenHash());
150151
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
151152
model.remindIfNotesAreEmptyOnlyForWorkEntry.set(settings.isRemindIfNotesAreEmptyOnlyForWorkEntry());
153+
model.confirmClose.set(settings.isConfirmClose());
152154
}
153155

154156
@PreDestroy
@@ -164,7 +166,8 @@ public void shutdown() {
164166
model.useHotkey.get(), model.displayProjectsRight.get(), model.hideProjectsOnMouseExit.get(),
165167
model.screenSettings.proportionalX.get(), model.screenSettings.proportionalY.get(),
166168
model.screenSettings.screenHash.get(), model.screenSettings.saveWindowPosition.get(),
167-
model.remindIfNotesAreEmpty.get(),model.remindIfNotesAreEmptyOnlyForWorkEntry.get());
169+
model.remindIfNotesAreEmpty.get(), model.remindIfNotesAreEmptyOnlyForWorkEntry.get(),
170+
model.confirmClose.get());
168171
updateSettings(newSettings);
169172
}
170173

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ public Model(final ProjectRepository projectRepository, final WorkRepository wor
8484

8585
public final ObjectProperty<Boolean> remindIfNotesAreEmptyOnlyForWorkEntry = new SimpleObjectProperty<>(false);
8686

87+
public final ObjectProperty<Boolean> confirmClose = new SimpleObjectProperty<>(false);
88+
8789
public final ScreenSettings screenSettings = new ScreenSettings();
8890

8991
private ConfigurableApplicationContext springContext;

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,17 @@ public class Settings {
7070
private boolean remindIfNotesAreEmpty;
7171

7272
private boolean remindIfNotesAreEmptyOnlyForWorkEntry;
73-
public Settings() {
74-
}
73+
74+
private boolean confirmClose;
75+
76+
public Settings() {}
7577

7678
public Settings(final Color hoverBackgroundColor, final Color hoverFontColor, final Color defaultBackgroundColor,
7779
final Color defaultFontColor, final Color taskBarColor, final boolean useHotkey,
7880
final boolean displayProjectsRight, final boolean hideProjectsOnMouseExit, final double windowPositionX,
7981
final double windowPositionY, final int screenHash, final boolean saveWindowPosition,
80-
final boolean remindIfNotesAreEmpty, final boolean remindIfNotesAreEmptyOnlyForWorkEntry) {
82+
final boolean remindIfNotesAreEmpty, final boolean remindIfNotesAreEmptyOnlyForWorkEntry,
83+
final boolean confirmClose) {
8184
this.hoverBackgroundColor = hoverBackgroundColor;
8285
this.hoverFontColor = hoverFontColor;
8386
this.defaultBackgroundColor = defaultBackgroundColor;
@@ -92,6 +95,7 @@ public Settings(final Color hoverBackgroundColor, final Color hoverFontColor, fi
9295
this.saveWindowPosition = saveWindowPosition;
9396
this.remindIfNotesAreEmpty = remindIfNotesAreEmpty;
9497
this.remindIfNotesAreEmptyOnlyForWorkEntry = remindIfNotesAreEmptyOnlyForWorkEntry;
98+
this.confirmClose = confirmClose;
9599

96100
}
97101

@@ -103,6 +107,14 @@ public void setRemindIfNotesAreEmptyOnlyForWorkEntry(boolean emptyNoteReminderCh
103107
this.remindIfNotesAreEmptyOnlyForWorkEntry = emptyNoteReminderCheckBoxIsWork;
104108
}
105109

110+
public boolean isConfirmClose() {
111+
return confirmClose;
112+
}
113+
114+
public void setConfirmClose(boolean confirmClose) {
115+
this.confirmClose = confirmClose;
116+
}
117+
106118
public long getId() {
107119
return id;
108120
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ public class SettingsController {
9595
@FXML
9696
private CheckBox emptyNoteReminderOnlyForWorkEntryCheckBox;
9797

98+
@FXML
99+
private CheckBox confirmCloseCheckBox;
100+
98101
@FXML
99102
private Button saveButton;
100103

@@ -207,7 +210,8 @@ private void initialize() {
207210
useHotkeyCheckBox.isSelected(), displayProjectsRightCheckBox.isSelected(),
208211
hideProjectsOnMouseExitCheckBox.isSelected(), model.screenSettings.proportionalX.get(),
209212
model.screenSettings.proportionalY.get(), model.screenSettings.screenHash.get(),
210-
saveWindowPositionCheckBox.isSelected(), emptyNoteReminderCheckBox.isSelected(), emptyNoteReminderOnlyForWorkEntryCheckBox.isSelected()));
213+
saveWindowPositionCheckBox.isSelected(), emptyNoteReminderCheckBox.isSelected(),
214+
emptyNoteReminderOnlyForWorkEntryCheckBox.isSelected(), confirmCloseCheckBox.isSelected()));
211215
thisStage.close();
212216

213217
});
@@ -300,6 +304,7 @@ void update() {
300304
emptyNoteReminderCheckBox.setSelected(model.remindIfNotesAreEmpty.get());
301305
emptyNoteReminderOnlyForWorkEntryCheckBox.disableProperty().bind(emptyNoteReminderCheckBox.selectedProperty().not());
302306
emptyNoteReminderOnlyForWorkEntryCheckBox.setSelected(model.remindIfNotesAreEmptyOnlyForWorkEntry.get());
307+
confirmCloseCheckBox.setSelected(model.confirmClose.get());
303308
}
304309

305310
public void setStage(final Stage thisStage) {

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

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@
2222
import java.time.LocalDateTime;
2323
import java.util.Optional;
2424

25-
import de.doubleslash.keeptime.common.*;
26-
import javafx.scene.control.*;
27-
import javafx.scene.shape.SVGPath;
2825
import org.slf4j.Logger;
2926
import org.slf4j.LoggerFactory;
3027
import org.springframework.beans.factory.annotation.Autowired;
3128
import org.springframework.stereotype.Component;
3229

30+
import de.doubleslash.keeptime.common.ColorHelper;
31+
import de.doubleslash.keeptime.common.DateFormatter;
32+
import de.doubleslash.keeptime.common.Resources;
3333
import de.doubleslash.keeptime.common.Resources.RESOURCE;
34+
import de.doubleslash.keeptime.common.ScreenPosHelper;
35+
import de.doubleslash.keeptime.common.StyleUtils;
36+
import de.doubleslash.keeptime.common.SvgNodeProvider;
3437
import de.doubleslash.keeptime.common.time.Interval;
3538
import de.doubleslash.keeptime.controller.Controller;
3639
import de.doubleslash.keeptime.exceptions.FXMLLoaderException;
@@ -56,6 +59,14 @@
5659
import javafx.scene.SnapshotParameters;
5760
import javafx.scene.canvas.Canvas;
5861
import javafx.scene.canvas.GraphicsContext;
62+
import javafx.scene.control.Alert;
63+
import javafx.scene.control.Button;
64+
import javafx.scene.control.ButtonType;
65+
import javafx.scene.control.Dialog;
66+
import javafx.scene.control.Label;
67+
import javafx.scene.control.ListView;
68+
import javafx.scene.control.TextArea;
69+
import javafx.scene.control.TextField;
5970
import javafx.scene.image.Image;
6071
import javafx.scene.image.ImageView;
6172
import javafx.scene.image.WritableImage;
@@ -67,6 +78,7 @@
6778
import javafx.scene.layout.VBox;
6879
import javafx.scene.paint.Color;
6980
import javafx.scene.shape.Circle;
81+
import javafx.scene.shape.SVGPath;
7082
import javafx.scene.text.TextAlignment;
7183
import javafx.stage.Modality;
7284
import javafx.stage.Stage;
@@ -112,19 +124,6 @@ public class ViewController {
112124
private Button settingsButton;
113125
@FXML
114126
private Button calendarButton;
115-
116-
@FXML
117-
private SVGPath calendarIcon;
118-
119-
@FXML
120-
private SVGPath settingsIcon;
121-
122-
@FXML
123-
private SVGPath minimizeIcon;
124-
125-
@FXML
126-
private SVGPath closeIcon;
127-
128127
@FXML
129128
private TextArea textArea;
130129

@@ -187,7 +186,7 @@ private void initialize() {
187186

188187
minimizeButton.setOnAction(ae -> mainStage.setIconified(true));
189188
minimizeButton.textFillProperty().bind(fontColorProperty);
190-
closeButton.setOnAction(ae -> mainStage.close());
189+
closeButton.setOnAction(ae -> openConfirmationWindow());
191190
closeButton.textFillProperty().bind(fontColorProperty);
192191

193192
addNewProjectButton.textFillProperty().bind(fontColorProperty);
@@ -319,6 +318,23 @@ private void initialize() {
319318

320319
}
321320

321+
private void openConfirmationWindow() {
322+
if (model.confirmClose.get()) {
323+
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", ButtonType.YES, ButtonType.CANCEL);
324+
alert.setTitle("Confirm exit");
325+
alert.setHeaderText("Are you sure you want to close KeepTime?");
326+
327+
alert.initOwner(mainStage);
328+
alert.showAndWait();
329+
330+
if (alert.getResult() == ButtonType.YES) {
331+
mainStage.close();
332+
}
333+
} else {
334+
mainStage.close();
335+
}
336+
}
337+
322338
private Dialog<Project> dialogResultConverter(final Dialog<Project> dialog,
323339
final ManageProjectController manageProjectController) {
324340
dialog.setResultConverter(dialogButton -> {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE settings
2+
ADD COLUMN confirm_close BOOLEAN NOT NULL DEFAULT(false)

src/main/resources/layouts/settings.fxml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,36 @@
296296
</Group>
297297
</children>
298298
</VBox>
299+
<VBox styleClass="menuBorder">
300+
<children>
301+
<Group>
302+
<children>
303+
<VBox>
304+
<children>
305+
<HBox spacing="10.0">
306+
<children>
307+
<Label text="Confirmation on close">
308+
<font>
309+
<Font name="Open Sans Bold" size="12.0" />
310+
</font>
311+
</Label>
312+
</children>
313+
</HBox>
314+
<HBox spacing="10.0">
315+
<children>
316+
<CheckBox fx:id="confirmCloseCheckBox" mnemonicParsing="false" text="Open confirmation window when closing application" wrapText="true" HBox.hgrow="NEVER">
317+
<font>
318+
<Font name="Open Sans Regular" size="12.0" />
319+
</font>
320+
</CheckBox>
321+
</children>
322+
</HBox>
323+
</children>
324+
</VBox>
325+
</children>
326+
</Group>
327+
</children>
328+
</VBox>
299329
<HBox spacing="10.0">
300330
<children>
301331
<Button fx:id="saveButton" mnemonicParsing="false" text="Save">

0 commit comments

Comments
 (0)