/* Copyright (c) 2013-2016 Jesper Öqvist <jesper@llbit.se> * * This file is part of Chunky. * * Chunky 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. * * Chunky 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 Chunky. If not, see <http://www.gnu.org/licenses/>. */ package se.llbit.chunky.launcher.ui; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; import javafx.scene.image.Image; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import se.llbit.chunky.PersistentSettings; import se.llbit.chunky.launcher.Dialogs; import se.llbit.chunky.launcher.LauncherSettings; import se.llbit.chunky.resources.SettingsDirectory; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; /** * A dialog which lets the user select a settings directory where * Chunky settings should be stored. After an option has been selected * the selected directory is created and the onAccept callback is called. */ public class FirstTimeSetupDialog extends Stage { /** * @param onAccept callback to run when the user has selected a settings * directory and the settings directory has been created. */ public FirstTimeSetupDialog(Runnable onAccept) { setTitle("Chunky First-Time Setup"); Label description = new Label("It looks like this is your first time starting Chunky!\n" + "(or the previous settings could not be found)"); Label description2 = new Label( "Please select which directory to store Chunky configuration in:"); ToggleGroup group = new ToggleGroup(); RadioButton homeDirectoryBtn = new RadioButton( "Home Directory (Recommended):\n" + SettingsDirectory.getHomeDirectory()); homeDirectoryBtn.setToggleGroup(group); RadioButton programDirectoryBtn = new RadioButton( "Program Directory (for portable/thumb drive installations):\n" + SettingsDirectory .getProgramDirectory()); programDirectoryBtn.setToggleGroup(group); RadioButton workingDirectoryBtn = new RadioButton("Working Directory:\n" + SettingsDirectory.getWorkingDirectory()); workingDirectoryBtn.setToggleGroup(group); homeDirectoryBtn.setSelected(true); getIcons().add(new Image(getClass().getResourceAsStream("chunky-cfg.png"))); Button okBtn = new Button("Use Selected Directory"); okBtn.setDefaultButton(true); okBtn.setOnAction(event -> { File settingsDir; if (homeDirectoryBtn.isSelected()) { settingsDir = SettingsDirectory.getHomeDirectory(); } else if (programDirectoryBtn.isSelected()) { settingsDir = SettingsDirectory.getProgramDirectory(); } else { settingsDir = SettingsDirectory.getWorkingDirectory(); } boolean initialized = false; if (settingsDir != null) { try { if (!settingsDir.isDirectory()) { settingsDir.mkdirs(); } File settingsFile = new File(settingsDir, PersistentSettings.SETTINGS_FILE); try (PrintStream out = new PrintStream(new FileOutputStream(settingsFile))) { // Create an empty settings file (default settings will be used). out.println("{}"); } File launcherSettings = new File(settingsDir, LauncherSettings.LAUNCHER_SETTINGS_FILE); try (PrintStream out = new PrintStream(new FileOutputStream(launcherSettings))) { // Create an empty settings file (default settings will be used). out.println("{}"); } initialized = settingsFile.isFile() && launcherSettings.isFile(); } catch (IOException e1) { System.err.println(e1.getMessage()); } PersistentSettings.changeSettingsDirectory(settingsDir); } if (!initialized) { Dialogs.error("Failed to Initialize", "Failed to initialize Chunky configuration directory! " + "You may need administrative permissions on the computer to do this."); } else { onAccept.run(); hide(); } }); Button cancelBtn = new Button("Cancel"); cancelBtn.setCancelButton(true); cancelBtn.setOnAction(e -> hide()); HBox buttons = new HBox(); buttons.setSpacing(10); buttons.setAlignment(Pos.CENTER_RIGHT); buttons.getChildren().setAll(okBtn, cancelBtn); VBox vBox = new VBox(); vBox.setPadding(new Insets(10)); vBox.setSpacing(10); vBox.getChildren().setAll(description, description2, homeDirectoryBtn, programDirectoryBtn, workingDirectoryBtn, buttons); setScene(new Scene(vBox)); } }