1919package sporemodder .view .dialogs ;
2020
2121import java .io .File ;
22+ import java .nio .file .Files ;
2223import java .util .Map ;
2324
2425import javafx .fxml .FXML ;
3536import javafx .scene .control .Tooltip ;
3637import javafx .stage .DirectoryChooser ;
3738import javafx .stage .FileChooser ;
38- import sporemodder .FileManager ;
39- import sporemodder .GameManager ;
39+ import sporemodder .*;
4040import sporemodder .GameManager .GameType ;
4141import sporemodder .file .shaders .FXCompiler ;
42- import sporemodder .MainApp ;
43- import sporemodder .UIManager ;
4442import sporemodder .util .GamePathConfiguration .GamePathType ;
4543import sporemodder .util .SporeGame ;
4644import sporemodder .view .Controller ;
@@ -75,6 +73,9 @@ public class ProgramSettingsUI implements Controller {
7573 @ FXML private Control gameTypeLabel ;
7674 @ FXML private Control styleLabel ;
7775 @ FXML private Control fxcLabel ;
76+
77+ @ FXML private TextField projectsFolderTextField ;
78+ @ FXML private Button findProjectsFolderButton ;
7879
7980 private Dialog <ButtonType > dialog ;
8081
@@ -93,9 +94,7 @@ public Node getMainNode() {
9394 chooser .getExtensionFilters ().add (FileManager .FILEFILTER_ALL );
9495 if (!fxcPathField .getText ().isEmpty ()) chooser .setInitialDirectory (new File (fxcPathField .getText ()).getParentFile ());
9596
96- UIManager .get ().setOverlay (true );
9797 File result = chooser .showOpenDialog (UIManager .get ().getScene ().getWindow ());
98- UIManager .get ().setOverlay (false );
9998
10099 if (result != null ) {
101100 fxcPathField .setText (result .getAbsolutePath ());
@@ -116,10 +115,8 @@ public Node getMainNode() {
116115 findSporeButton .setOnAction (event -> {
117116 DirectoryChooser chooser = new DirectoryChooser ();
118117 if (!sporeField .getText ().isEmpty ()) chooser .setInitialDirectory (new File (sporeField .getText ()));
119-
120- UIManager .get ().setOverlay (true );
118+
121119 File result = chooser .showDialog (UIManager .get ().getScene ().getWindow ());
122- UIManager .get ().setOverlay (false );
123120
124121 if (result != null ) {
125122 result = gameMgr .findInstallationFolder (GameManager .SPORE_SPOREBIN , result );
@@ -136,10 +133,8 @@ public Node getMainNode() {
136133 findGAButton .setOnAction (event -> {
137134 DirectoryChooser chooser = new DirectoryChooser ();
138135 if (!gaField .getText ().isEmpty ()) chooser .setInitialDirectory (new File (gaField .getText ()));
139-
140- UIManager .get ().setOverlay (true );
136+
141137 File result = chooser .showDialog (UIManager .get ().getScene ().getWindow ());
142- UIManager .get ().setOverlay (false );
143138
144139 if (result != null ) {
145140 result = gameMgr .findInstallationFolder (GameManager .GA_SPOREBIN , result );
@@ -162,10 +157,8 @@ public Node getMainNode() {
162157 }
163158 chooser .getExtensionFilters ().add (FileManager .FILEFILTER_ALL );
164159 chooser .getExtensionFilters ().add (FileManager .FILEFILTER_EXE );
165-
166- UIManager .get ().setOverlay (true );
160+
167161 File result = chooser .showOpenDialog (UIManager .get ().getScene ().getWindow ());
168- UIManager .get ().setOverlay (false );
169162
170163 if (result != null ) {
171164 customPathField .setText (result .getAbsolutePath ());
@@ -223,6 +216,25 @@ public Node getMainNode() {
223216 if (FXCompiler .get ().getFXCFile () != null ) {
224217 fxcPathField .setText (FXCompiler .get ().getFXCFile ().getAbsolutePath ());
225218 }
219+
220+
221+ findProjectsFolderButton .setOnAction (event -> {
222+ DirectoryChooser chooser = new DirectoryChooser ();
223+ File initialDirectory ;
224+ if (projectsFolderTextField .getText ().isBlank ()) {
225+ initialDirectory = PathManager .get ().getProjectsFolder ();
226+ } else {
227+ initialDirectory = new File (projectsFolderTextField .getText ());
228+ }
229+ chooser .setInitialDirectory (initialDirectory );
230+
231+ File result = chooser .showDialog (UIManager .get ().getScene ().getWindow ());
232+
233+ if (result != null ) {
234+ projectsFolderTextField .setText (result .getAbsolutePath ());
235+ }
236+ });
237+ projectsFolderTextField .setText (PathManager .get ().getProjectsFolderStringForSettings ());
226238 }
227239
228240 private void applyChanges () {
@@ -284,7 +296,27 @@ else if (!gameMgr.hasGalacticAdventures() || !path.equals(gameMgr.getGalacticAdv
284296 } else {
285297 FXCompiler .get ().setFXCFile (new File (path ));
286298 }
287-
299+
300+
301+ String newProjectsFolder = null ;
302+ if (!projectsFolderTextField .getText ().isBlank ()) {
303+ File projectsFolder = new File (projectsFolderTextField .getText ());
304+ if (!Files .isDirectory (projectsFolder .toPath ())) {
305+ UIManager .get ().showDialog (AlertType .ERROR , "The Projects folder does not exist: " + projectsFolderTextField .getText ());
306+ } else {
307+ newProjectsFolder = projectsFolderTextField .getText ();
308+ }
309+ } else {
310+ // Reset projects folder if it has been changed to default
311+ if (!PathManager .get ().isDefaultProjectsFolder ()) {
312+ newProjectsFolder = "" ;
313+ }
314+ }
315+
316+ if (newProjectsFolder != null ) {
317+ UIManager .get ().showDialog ("The Projects folder has been changed. The changes won't apply until you restart SporeModder FX." );
318+ PathManager .get ().setNextProjectsFolder (newProjectsFolder );
319+ }
288320
289321 MainApp .get ().saveSettings ();
290322 }
@@ -322,7 +354,7 @@ private void showInternal() {
322354
323355 public static void show () {
324356 ProgramSettingsUI node = UIManager .get ().loadUI ("dialogs/ProgramSettingsUI" );
325- node .dialog = new Dialog <ButtonType >();
357+ node .dialog = new Dialog <>();
326358 node .showInternal ();
327359 }
328360}
0 commit comments