diff --git a/gui/griffon-app/controllers/com/muwire/gui/CloseWarningController.groovy b/gui/griffon-app/controllers/com/muwire/gui/CloseWarningController.groovy index 8ec7d023..8db2bc47 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/CloseWarningController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/CloseWarningController.groovy @@ -23,17 +23,38 @@ class CloseWarningController { @ControllerAction void close() { - boolean showWarning = !view.checkbox.model.isSelected() - model.closeWarning = showWarning - settings.closeWarning = showWarning - - File props = new File(home, "gui.properties") - props.withOutputStream { - settings.write(it) + boolean rememberDecision = view.checkbox.model.isSelected() + if (rememberDecision) { + settings.exitOnClose = false + settings.closeWarning = false + saveMuSettings() } view.dialog.setVisible(false) view.mainFrame.setVisible(false) mvcGroup.destroy() } + + @ControllerAction + void exit() { + boolean rememberDecision = view.checkbox.model.isSelected() + if (rememberDecision) { + settings.exitOnClose = true + settings.closeWarning = false + saveMuSettings() + } + view.dialog.setVisible(false) + view.mainFrame.setVisible(false) + def parentView = mvcGroup.parentGroup.view + mvcGroup.destroy() + parentView.closeApplication() + } + + private void saveMuSettings() { + + File props = new File(home, "gui.properties") + props.withOutputStream { + settings.write(it) + } + } } \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy index 2e2d901e..bb44ec88 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy @@ -161,6 +161,10 @@ class OptionsController { boolean clearUploads = view.clearUploadsCheckbox.model.isSelected() model.clearUploads = clearUploads uiSettings.clearUploads = clearUploads + + uiSettings.exitOnClose = model.exitOnClose + if (model.closeDecisionMade) + uiSettings.closeWarning = false File uiSettingsFile = new File(core.home, "gui.properties") uiSettingsFile.withOutputStream { @@ -199,13 +203,25 @@ class OptionsController { } @ControllerAction - void automaticFontAction() { + void automaticFont() { model.automaticFontSize = true model.customFontSize = 12 } @ControllerAction - void customFontAction() { + void customFont() { model.automaticFontSize = false } + + @ControllerAction + void exitOnClose() { + model.exitOnClose = true + model.closeDecisionMade = true + } + + @ControllerAction + void minimizeOnClose() { + model.exitOnClose = false + model.closeDecisionMade = true + } } \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/CloseWarningModel.groovy b/gui/griffon-app/models/com/muwire/gui/CloseWarningModel.groovy index 1f1e6c13..338c689b 100644 --- a/gui/griffon-app/models/com/muwire/gui/CloseWarningModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/CloseWarningModel.groovy @@ -7,9 +7,12 @@ import griffon.core.artifact.GriffonModel import griffon.core.controller.ControllerAction import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor +import griffon.transform.Observable + import javax.annotation.Nonnull @ArtifactProviderFor(GriffonModel) class CloseWarningModel { - @griffon.transform.Observable boolean closeWarning + @Observable boolean closeWarning + @Observable boolean exitOnClose } \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy index 5a57ee4a..05f88835 100644 --- a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy @@ -39,6 +39,8 @@ class OptionsModel { @Observable boolean excludeLocalResult @Observable boolean showSearchHashes @Observable boolean clearUploads + @Observable boolean exitOnClose + @Observable boolean closeDecisionMade // bw options @Observable String inBw @@ -83,6 +85,7 @@ class OptionsModel { excludeLocalResult = uiSettings.excludeLocalResult showSearchHashes = uiSettings.showSearchHashes clearUploads = uiSettings.clearUploads + exitOnClose = uiSettings.exitOnClose if (core.router != null) { inBw = String.valueOf(settings.inBw) diff --git a/gui/griffon-app/views/com/muwire/gui/CloseWarningView.groovy b/gui/griffon-app/views/com/muwire/gui/CloseWarningView.groovy index 5e506a47..01be8bcf 100644 --- a/gui/griffon-app/views/com/muwire/gui/CloseWarningView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/CloseWarningView.groovy @@ -28,15 +28,16 @@ class CloseWarningView { void initUI() { mainFrame = application.windowManager.findWindow("main-frame") - dialog = new JDialog(mainFrame, "MuWire will continue running", true) + dialog = new JDialog(mainFrame, "Close MuWire?", true) panel = builder.panel { gridBagLayout() - label(text : "MuWire will continue running. You can close it from the system tray", constraints : gbc(gridx: 0, gridy: 0, gridwidth : 2)) + label(text : "Would you like to minimize to system tray or exit immediately?", constraints : gbc(gridx: 0, gridy: 0, gridwidth : 2)) label(text : "\n", constraints : gbc(gridx : 0, gridy : 1)) // TODO: real padding - label(text : "Do not show this warning again", constraints : gbc(gridx: 0, gridy : 2, weightx: 100, anchor : GridBagConstraints.LINE_END)) + label(text : "Remember my decision", constraints : gbc(gridx: 0, gridy : 2, weightx: 100, anchor : GridBagConstraints.LINE_END)) checkbox = checkBox(selected : bind {model.closeWarning}, constraints : gbc(gridx: 1, gridy :2)) panel (constraints : gbc(gridx: 0, gridy : 3, gridwidth : 2)) { - button(text : "Ok", closeAction) + button(text : "Minimize To Tray", closeAction) + button(text : "Exit MuWire", exitAction) } } dialog.getContentPane().add(panel) diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 0d0144cd..baf3f052 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -463,7 +463,8 @@ class MainFrameView { args2.put("home", model.core.home) mvcGroup.createMVCGroup("close-warning", "Close Warning", args2) } - } + } else if (settings.exitOnClose) + closeApplication() } else { closeApplication() } diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index 23a1a959..326b55c4 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -194,13 +194,19 @@ class OptionsView { constraints : gbc(gridx : 1, gridy:1, anchor : GridBagConstraints.LINE_END)) label(text : "Smooth download speed over (seconds)", constraints : gbc(gridx: 0, gridy : 2, anchor : GridBagConstraints.LINE_START, weightx: 100)) speedSmoothSecondsField = textField(text : bind {model.speedSmoothSeconds}, - constraints : gbc(gridx:1, gridy: 2, anchor : GridBagConstraints.LINE_START)) + constraints : gbc(gridx:1, gridy: 2, anchor : GridBagConstraints.LINE_END)) label(text : "Exclude local files from results", constraints: gbc(gridx:0, gridy:3, anchor : GridBagConstraints.LINE_START, weightx: 100)) excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, constraints : gbc(gridx: 1, gridy : 3, anchor : GridBagConstraints.LINE_END)) label(text : "Automatically Clear finished uploads", constraints:gbc(gridx:0, gridy:4, anchor: GridBagConstraints.LINE_START, weightx : 100)) clearUploadsCheckbox = checkBox(selected : bind {model.clearUploads}, constraints : gbc(gridx:1, gridy: 4, anchor:GridBagConstraints.LINE_END)) + label(text : "When closing MuWire", constraints : gbc(gridx: 0, gridy : 5, anchor : GridBagConstraints.LINE_START, weightx: 100)) + panel (constraints : gbc(gridx:1, gridy: 5, anchor : GridBagConstraints.LINE_END)) { + buttonGroup(id : "closeBehaviorGroup") + radioButton(text : "Minimize to tray", selected : bind {!model.exitOnClose}, buttonGroup: closeBehaviorGroup, minimizeOnCloseAction) + radioButton(text : "Exit", selected : bind {model.exitOnClose}, buttonGroup : closeBehaviorGroup, exitOnCloseAction) + } } panel (constraints : gbc(gridx: 0, gridy: 2, weighty: 100)) } diff --git a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy index b1c9e5a5..5c096330 100644 --- a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy +++ b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy @@ -12,6 +12,7 @@ class UISettings { boolean excludeLocalResult boolean showSearchHashes boolean closeWarning + boolean exitOnClose boolean clearUploads UISettings(Properties props) { @@ -25,6 +26,7 @@ class UISettings { autoFontSize = Boolean.parseBoolean(props.getProperty("autoFontSize","false")) fontSize = Integer.parseInt(props.getProperty("fontSize","12")) closeWarning = Boolean.parseBoolean(props.getProperty("closeWarning","true")) + exitOnClose = Boolean.parseBoolean(props.getProperty("exitOnClose","false")) clearUploads = Boolean.parseBoolean(props.getProperty("clearUploads","false")) } @@ -39,6 +41,7 @@ class UISettings { props.setProperty("autoFontSize", String.valueOf(autoFontSize)) props.setProperty("fontSize", String.valueOf(fontSize)) props.setProperty("closeWarning", String.valueOf(closeWarning)) + props.setProperty("exitOnClose", String.valueOf(exitOnClose)) props.setProperty("clearUploads", String.valueOf(clearUploads)) if (font != null) props.setProperty("font", font)