1414import javafx .scene .control .*;
1515import javafx .scene .image .Image ;
1616import javafx .scene .image .ImageView ;
17+ import javafx .scene .input .DragEvent ;
18+ import javafx .scene .input .Dragboard ;
19+ import javafx .scene .input .TransferMode ;
20+ import javafx .scene .layout .GridPane ;
1721import javafx .stage .FileChooser ;
1822import javafx .stage .Stage ;
1923import org .apache .logging .log4j .LogManager ;
2630
2731public final class MainWindowController implements IAudioTimer {
2832
33+ @ FXML
34+ private SoundPane snpZen ;
35+ @ FXML
36+ private SoundPane snpFrogs ;
37+ @ FXML
38+ private GridPane grpMain ;
39+ @ FXML
40+ private SoundPane snpCave ;
2941 @ FXML
3042 private SoundPane snpFan ;
3143 @ FXML
@@ -279,6 +291,9 @@ private void initialize() {
279291 snpStatic .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("static" , newValue .doubleValue () / 100 ));
280292 snpFantasy .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("fantasy" , newValue .doubleValue () / 100 ));
281293 snpFan .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("fan" , newValue .doubleValue () / 100 ));
294+ snpCave .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("cave" , newValue .doubleValue () / 100 ));
295+ snpFrogs .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("frogs" , newValue .doubleValue () / 100 ));
296+ snpZen .getSlider ().valueProperty ().addListener ((observableValue , oldValue , newValue ) -> audioController .setPlayerVolume ("zen" , newValue .doubleValue () / 100 ));
282297
283298 mniTimerEnabled .setOnAction (e ->
284299 {
@@ -307,36 +322,48 @@ private void openSoundPresetAction() {
307322 final File file = chooser .showOpenDialog (new Stage ());
308323
309324 if (file != null && file .exists ()) {
310- try {
311- audioController .loadSoundPreset (file .getAbsolutePath ());
312- for (final Map .Entry <String , Double > entry : audioController .getVolumes ()) {
313- switch (entry .getKey ()) {
314- case "rain" -> snpRain .getSlider ().setValue (entry .getValue () * 100 );
315- case "wind" -> snpWind .getSlider ().setValue (entry .getValue () * 100 );
316- case "thunder" -> snpThunder .getSlider ().setValue (entry .getValue () * 100 );
317- case "birds" -> snpBird .getSlider ().setValue (entry .getValue () * 100 );
318- case "river" -> snpRiver .getSlider ().setValue (entry .getValue () * 100 );
319- case "keyboard" -> snpTyping .getSlider ().setValue (entry .getValue () * 100 );
320- case "telephone" -> snpTelephone .getSlider ().setValue (entry .getValue () * 100 );
321- case "officeChatter" -> snpChatter .getSlider ().setValue (entry .getValue () * 100 );
322- case "traffic" -> snpTraffic .getSlider ().setValue (entry .getValue () * 100 );
323- case "fireplace" -> snpFireplace .getSlider ().setValue (entry .getValue () * 100 );
324- case "static" -> snpStatic .getSlider ().setValue (entry .getValue () * 100 );
325- case "fantasy" -> snpFantasy .getSlider ().setValue (entry .getValue () * 100 );
326- case "fan" -> snpFan .getSlider ().setValue (entry .getValue () * 100 );
327- case "clock" -> snpClock .getSlider ().setValue (entry .getValue () * 100 );
328- default -> logger .info ("Unknown key found: {}" , entry .getKey ());
329- }
330- }
331- } catch (final IOException ex ) {
332- logger .error ("Unable to open the sound preset from {}" , file .getAbsolutePath (), ex );
333- FxUtils .showErrorAlert (translationBundle .getString ("OpenSoundPresetError" ), ex .getMessage (), getClass ().getResourceAsStream (SharedVariables .ICON_URL ));
334- }
325+ openSoundPreset (file .getAbsolutePath ());
335326 } else {
336327 logger .info ("Cancelled opening a sound preset" );
337328 }
338329 }
339330
331+ /**
332+ * Open a sound preset
333+ *
334+ * @param filePath The absolute path of the sound preset file
335+ */
336+ private void openSoundPreset (final String filePath ) {
337+ try {
338+ audioController .loadSoundPreset (filePath );
339+ for (final Map .Entry <String , Double > entry : audioController .getVolumes ()) {
340+ switch (entry .getKey ()) {
341+ case "rain" -> snpRain .getSlider ().setValue (entry .getValue () * 100 );
342+ case "wind" -> snpWind .getSlider ().setValue (entry .getValue () * 100 );
343+ case "thunder" -> snpThunder .getSlider ().setValue (entry .getValue () * 100 );
344+ case "birds" -> snpBird .getSlider ().setValue (entry .getValue () * 100 );
345+ case "river" -> snpRiver .getSlider ().setValue (entry .getValue () * 100 );
346+ case "keyboard" -> snpTyping .getSlider ().setValue (entry .getValue () * 100 );
347+ case "telephone" -> snpTelephone .getSlider ().setValue (entry .getValue () * 100 );
348+ case "officeChatter" -> snpChatter .getSlider ().setValue (entry .getValue () * 100 );
349+ case "traffic" -> snpTraffic .getSlider ().setValue (entry .getValue () * 100 );
350+ case "fireplace" -> snpFireplace .getSlider ().setValue (entry .getValue () * 100 );
351+ case "static" -> snpStatic .getSlider ().setValue (entry .getValue () * 100 );
352+ case "fantasy" -> snpFantasy .getSlider ().setValue (entry .getValue () * 100 );
353+ case "fan" -> snpFan .getSlider ().setValue (entry .getValue () * 100 );
354+ case "clock" -> snpClock .getSlider ().setValue (entry .getValue () * 100 );
355+ case "cave" -> snpCave .getSlider ().setValue (entry .getValue () * 100 );
356+ case "frogs" -> snpFrogs .getSlider ().setValue (entry .getValue () * 100 );
357+ case "zen" -> snpZen .getSlider ().setValue (entry .getValue () * 100 );
358+ default -> logger .info ("Unknown key found: {}" , entry .getKey ());
359+ }
360+ }
361+ } catch (final IOException ex ) {
362+ logger .error ("Unable to open the sound preset from {}" , filePath , ex );
363+ FxUtils .showErrorAlert (translationBundle .getString ("OpenSoundPresetError" ), ex .getMessage (), getClass ().getResourceAsStream (SharedVariables .ICON_URL ));
364+ }
365+ }
366+
340367 /**
341368 * Save the sound settings to disk
342369 */
@@ -387,6 +414,9 @@ private void resetAction() {
387414 snpStatic .getSlider ().setValue (0 );
388415 snpFantasy .getSlider ().setValue (0 );
389416 snpFan .getSlider ().setValue (0 );
417+ snpCave .getSlider ().setValue (0 );
418+ snpFrogs .getSlider ().setValue (0 );
419+ snpZen .getSlider ().setValue (0 );
390420 }
391421
392422 /**
@@ -588,6 +618,10 @@ private void updateAction() {
588618 public void fired () {
589619 resetAction ();
590620 mniTimerEnabled .setSelected (false );
621+
622+ if (Boolean .parseBoolean (settingsController .getProperties ().getProperty ("timerApplicationShutdown" , "false" ))) {
623+ exitAction ();
624+ }
591625 }
592626
593627 /**
@@ -597,4 +631,36 @@ public void fired() {
597631 public void cancelled () {
598632 mniTimerEnabled .setSelected (false );
599633 }
634+
635+ /**
636+ * Method that is invoked when a drag-over event is occurring
637+ *
638+ * @param dragEvent The {@link DragEvent} object
639+ */
640+ @ FXML
641+ private void onDragOver (final DragEvent dragEvent ) {
642+ if (dragEvent .getGestureSource () != grpMain && dragEvent .getDragboard ().hasFiles ()) {
643+ dragEvent .acceptTransferModes (TransferMode .COPY_OR_MOVE );
644+ }
645+ dragEvent .consume ();
646+ }
647+
648+ /**
649+ * Method that is invoked when a drag-drop event occurred
650+ *
651+ * @param dragEvent The {@link DragEvent} object
652+ */
653+ @ FXML
654+ public void onDragDropped (final DragEvent dragEvent ) {
655+ final Dragboard db = dragEvent .getDragboard ();
656+ boolean success = false ;
657+
658+ if (db .hasFiles ()) {
659+ openSoundPreset (db .getFiles ().get (0 ).getAbsolutePath ());
660+ success = true ;
661+ }
662+
663+ dragEvent .setDropCompleted (success );
664+ dragEvent .consume ();
665+ }
600666}
0 commit comments