Просмотр исходного кода

tools: save preferences to user's config directory

Daniele Bartolini 5 лет назад
Родитель
Сommit
dad29e2c93
3 измененных файлов с 77 добавлено и 10 удалено
  1. 1 0
      docs/changelog.rst
  2. 44 10
      tools/level_editor/level_editor.vala
  3. 32 0
      tools/level_editor/preferences_dialog.vala

+ 1 - 0
docs/changelog.rst

@@ -28,6 +28,7 @@ Changelog
 * Fixed an issue that caused the Level Editor to start the Editor View before data compilation was done in some circumstances
 * Fixed an issue that caused the Level Editor to start the Editor View before data compilation was done in some circumstances
 * Fixed main.lua files generated by Level Editor for new projects
 * Fixed main.lua files generated by Level Editor for new projects
 * Lua reloading has been extended to the running game when pressing F5 from the Level Editor
 * Lua reloading has been extended to the running game when pressing F5 from the Level Editor
+* Preferences are now saved to the user's config directory
 * Renaming of objects in the Level Tree is now handled with a modal dialog
 * Renaming of objects in the Level Tree is now handled with a modal dialog
 * The Editor View will now show a message explaining how to recover the session after a crash or unintended disconnection
 * The Editor View will now show a message explaining how to recover the session after a crash or unintended disconnection
 * Unified the asset import dialogs
 * Unified the asset import dialogs

+ 44 - 10
tools/level_editor/level_editor.vala

@@ -195,6 +195,10 @@ namespace Crown
 		private string _level_resource = "";
 		private string _level_resource = "";
 		private bool _create_initial_files = false;
 		private bool _create_initial_files = false;
 
 
+		// Global paths
+		private GLib.File _config_dir;
+		private GLib.File _settings_file;
+
 		// Editor state
 		// Editor state
 		private double _grid_size;
 		private double _grid_size;
 		private double _rotation_snap;
 		private double _rotation_snap;
@@ -328,6 +332,10 @@ namespace Crown
 
 
 			_level = new Level(_database, _editor, _project);
 			_level = new Level(_database, _editor, _project);
 
 
+			// Global paths
+			_config_dir = GLib.File.new_build_filename(GLib.Environment.get_user_config_dir(), "crown");
+			_settings_file = GLib.File.new_build_filename(_config_dir.get_path(), "settings.sjson");
+
 			// Editor state
 			// Editor state
 			_grid_size = 1.0;
 			_grid_size = 1.0;
 			_rotation_snap = 15.0;
 			_rotation_snap = 15.0;
@@ -376,6 +384,10 @@ namespace Crown
 			_resource_popover.delete_event.connect(() => { _resource_popover.hide(); return true; });
 			_resource_popover.delete_event.connect(() => { _resource_popover.hide(); return true; });
 			_resource_popover.modal = true;
 			_resource_popover.modal = true;
 
 
+			_preferences_dialog = new PreferencesDialog(this);
+			_preferences_dialog.set_transient_for(this.active_window);
+			_preferences_dialog.delete_event.connect(() => { _preferences_dialog.hide(); return true; });
+
 			_resource_chooser = new ResourceChooser(_project, _project_store, true);
 			_resource_chooser = new ResourceChooser(_project, _project_store, true);
 			_resource_chooser.resource_selected.connect(on_resource_browser_resource_selected);
 			_resource_chooser.resource_selected.connect(on_resource_browser_resource_selected);
 			_resource_chooser.resource_selected.connect(() => { _resource_popover.hide(); });
 			_resource_chooser.resource_selected.connect(() => { _resource_popover.hide(); });
@@ -416,9 +428,6 @@ namespace Crown
 			_file_filter.set_filter_name("Level (*.level)");
 			_file_filter.set_filter_name("Level (*.level)");
 			_file_filter.add_pattern("*.level");
 			_file_filter.add_pattern("*.level");
 
 
-			// Save level once every 5 minutes.
-			set_autosave_timer(5);
-
 			if (_level_resource != "")
 			if (_level_resource != "")
 			{
 			{
 				string level_path = _project.source_dir() + "/" + _level_resource + ".level";
 				string level_path = _project.source_dir() + "/" + _level_resource + ".level";
@@ -435,9 +444,38 @@ namespace Crown
 				_level.load_empty_level();
 				_level.load_empty_level();
 			}
 			}
 
 
+			try
+			{
+				_config_dir.make_directory();
+			}
+			catch (Error e)
+			{
+				// Nobody cares
+			}
+
+			load_settings();
+
 			start_compiler();
 			start_compiler();
 		}
 		}
 
 
+		public void load_settings()
+		{
+			Hashtable settings = SJSON.load(_settings_file.get_path());
+
+			_preferences_dialog.load(settings.has_key("preferences") ? (Hashtable)settings["preferences"] : new Hashtable());
+		}
+
+		public void save_settings()
+		{
+			Hashtable preferences = new Hashtable();
+			_preferences_dialog.save(preferences);
+
+			Hashtable settings = new Hashtable();
+			settings["preferences"] = preferences;
+
+			SJSON.save(settings, _settings_file.get_path());
+		}
+
 		protected override void activate()
 		protected override void activate()
 		{
 		{
 			if (_source_dir == "")
 			if (_source_dir == "")
@@ -854,6 +892,7 @@ namespace Crown
 
 
 			_level.send_level();
 			_level.send_level();
 			send_state();
 			send_state();
+			_preferences_dialog.apply();
 		}
 		}
 
 
 		private void stop_editor()
 		private void stop_editor()
@@ -1200,6 +1239,8 @@ namespace Crown
 		{
 		{
 			base.shutdown();
 			base.shutdown();
 
 
+			save_settings();
+
 			if (_save_timer_id > 0)
 			if (_save_timer_id > 0)
 				GLib.Source.remove(_save_timer_id);
 				GLib.Source.remove(_save_timer_id);
 
 
@@ -1336,13 +1377,6 @@ namespace Crown
 
 
 		private void on_preferences(GLib.SimpleAction action, GLib.Variant? param)
 		private void on_preferences(GLib.SimpleAction action, GLib.Variant? param)
 		{
 		{
-			if (_preferences_dialog == null)
-			{
-				_preferences_dialog = new PreferencesDialog(this);
-				_preferences_dialog.set_transient_for(this.active_window);
-				_preferences_dialog.delete_event.connect(() => { _preferences_dialog.hide(); return true; });
-			}
-
 			_preferences_dialog.show_all();
 			_preferences_dialog.show_all();
 		}
 		}
 
 

+ 32 - 0
tools/level_editor/preferences_dialog.vala

@@ -4,6 +4,7 @@
  */
  */
 
 
 using Gtk;
 using Gtk;
+using Gee;
 
 
 namespace Crown
 namespace Crown
 {
 {
@@ -68,5 +69,36 @@ namespace Crown
 		{
 		{
 			_application.set_autosave_timer((uint)_level_autosave_spin_button.value);
 			_application.set_autosave_timer((uint)_level_autosave_spin_button.value);
 		}
 		}
+
+		public void load(Hashtable preferences)
+		{
+			_grid_color_button.value          = Vector3.from_array(preferences.has_key("grid") ? (Gee.ArrayList<GLib.Value?>)preferences["grid"] : _grid_color_button.value.to_array());
+			_grid_disabled_color_button.value = Vector3.from_array(preferences.has_key("grid_disabled") ? (Gee.ArrayList<GLib.Value?>)preferences["grid_disabled"] : _grid_disabled_color_button.value.to_array());
+			_axis_x_color_button.value        = Vector3.from_array(preferences.has_key("axis_x") ? (Gee.ArrayList<GLib.Value?>)preferences["axis_x"] : _axis_x_color_button.value.to_array());
+			_axis_y_color_button.value        = Vector3.from_array(preferences.has_key("axis_y") ? (Gee.ArrayList<GLib.Value?>)preferences["axis_y"] : _axis_y_color_button.value.to_array());
+			_axis_z_color_button.value        = Vector3.from_array(preferences.has_key("axis_z") ? (Gee.ArrayList<GLib.Value?>)preferences["axis_z"] : _axis_z_color_button.value.to_array());
+			_axis_selected_color_button.value = Vector3.from_array(preferences.has_key("axis_selected") ? (Gee.ArrayList<GLib.Value?>)preferences["axis_selected"] : _axis_selected_color_button.value.to_array());
+			_gizmo_size_spin_button.value     = preferences.has_key("gizmo_size") ? (double)preferences["gizmo_size"] : _gizmo_size_spin_button.value;
+			_level_autosave_spin_button.value = preferences.has_key("autosave_timer") ? (double)preferences["autosave_timer"] : _level_autosave_spin_button.value;
+		}
+
+		public void save(Hashtable preferences)
+		{
+			preferences["grid"]           = _grid_color_button.value.to_array();
+			preferences["grid_disabled"]  = _grid_disabled_color_button.value.to_array();
+			preferences["axis_x"]         = _axis_x_color_button.value.to_array();
+			preferences["axis_y"]         = _axis_y_color_button.value.to_array();
+			preferences["axis_z"]         = _axis_z_color_button.value.to_array();
+			preferences["axis_selected"]  = _axis_selected_color_button.value.to_array();
+			preferences["gizmo_size"]     = _gizmo_size_spin_button.value;
+			preferences["autosave_timer"] = _level_autosave_spin_button.value;
+		}
+
+		public void apply()
+		{
+			GLib.Signal.emit_by_name(_grid_color_button, "color-set");
+			GLib.Signal.emit_by_name(_gizmo_size_spin_button, "value-changed");
+			GLib.Signal.emit_by_name(_level_autosave_spin_button, "value-changed");
+		}
 	}
 	}
 }
 }