diff --git a/synfig-studio/src/gui/app.cpp b/synfig-studio/src/gui/app.cpp index 211adb1..6de1c51 100644 --- a/synfig-studio/src/gui/app.cpp +++ b/synfig-studio/src/gui/app.cpp @@ -1692,6 +1692,8 @@ App::App(const synfig::String& basepath, int *argc, char ***argv): gamma.set_gamma(1.0/2.2); set_workspace_default(); } + if (!load_settings("workspace.layout")) + set_workspace_default(); load_file_window_size(); // Init Tools must be done after load_accel_map() : accelerators keys diff --git a/synfig-studio/src/gui/docks/dock_toolbox.cpp b/synfig-studio/src/gui/docks/dock_toolbox.cpp index fdac3d6..4f9633f 100644 --- a/synfig-studio/src/gui/docks/dock_toolbox.cpp +++ b/synfig-studio/src/gui/docks/dock_toolbox.cpp @@ -100,7 +100,7 @@ Dock_Toolbox::Dock_Toolbox(): Widget_Defaults* widget_defaults(manage(new Widget_Defaults())); - Gtk::Paned *tool_box_paned = manage(new Gtk::Paned(Gtk::ORIENTATION_VERTICAL)); + tool_box_paned = manage(new Gtk::Paned(Gtk::ORIENTATION_VERTICAL)); tool_box_paned->pack1(*scrolled_window, Gtk::PACK_EXPAND_WIDGET|Gtk::PACK_SHRINK, 3); tool_box_paned->pack2(*widget_defaults, Gtk::PACK_EXPAND_WIDGET|Gtk::PACK_SHRINK, 3); tool_box_paned->set_position(200); @@ -134,6 +134,23 @@ Dock_Toolbox::~Dock_Toolbox() studio::App::dock_toolbox=NULL; } +void Dock_Toolbox::write_layout_string(string& params) const +{ + char num_str[6]; + snprintf(num_str, 5, "%d", tool_box_paned->get_position()); + params += std::string(num_str); +} + +void Dock_Toolbox::read_layout_string(const string& params) const +{ + try { + int pos = std::stoi(params.c_str()); + tool_box_paned->set_position(pos); + } catch (...) { + // ignores invalid value and let it use the default one + } +} + void Dock_Toolbox::set_active_state(const synfig::String& statename) { diff --git a/synfig-studio/src/gui/docks/dock_toolbox.h b/synfig-studio/src/gui/docks/dock_toolbox.h index 370de50..4fb2a9a 100644 --- a/synfig-studio/src/gui/docks/dock_toolbox.h +++ b/synfig-studio/src/gui/docks/dock_toolbox.h @@ -51,6 +51,10 @@ /* === C L A S S E S & S T R U C T S ======================================= */ +namespace Gtk { +class Paned; +} + namespace studio { class StateManager; @@ -61,6 +65,7 @@ class Dock_Toolbox : public Dockable Gtk::ToolItemGroup *tool_item_group; Gtk::VBox *tool_box; + Gtk::Paned *tool_box_paned; std::map state_button_map; @@ -85,6 +90,8 @@ public: Dock_Toolbox(); virtual ~Dock_Toolbox(); + virtual void write_layout_string(std::string ¶ms) const; + virtual void read_layout_string(const std::string ¶ms) const; }; }; // END of namespace studio diff --git a/synfig-studio/src/gui/docks/dockable.cpp b/synfig-studio/src/gui/docks/dockable.cpp index 3dab8f0..d5cf170 100644 --- a/synfig-studio/src/gui/docks/dockable.cpp +++ b/synfig-studio/src/gui/docks/dockable.cpp @@ -284,3 +284,11 @@ Dockable::create_tab_label() return event_box; } + +void Dockable::write_layout_string(std::string& /*params*/) const +{ +} + +void Dockable::read_layout_string(const std::string& /*params*/) const +{ +} diff --git a/synfig-studio/src/gui/docks/dockable.h b/synfig-studio/src/gui/docks/dockable.h index 136077f..871c1e9 100644 --- a/synfig-studio/src/gui/docks/dockable.h +++ b/synfig-studio/src/gui/docks/dockable.h @@ -100,6 +100,11 @@ public: virtual void present(); virtual Gtk::Widget* create_tab_label(); + /// Appends serialized extra layout info of this dockable + /// \param params[out] serialized data. It must not have ']' or '|' characters. + virtual void write_layout_string(std::string ¶ms) const; + virtual void read_layout_string(const std::string ¶ms) const; + private: void on_drag_data_get(const Glib::RefPtr&, Gtk::SelectionData& selection_data, guint info, guint time); void on_drag_end(const Glib::RefPtr&context); diff --git a/synfig-studio/src/gui/docks/dockmanager.cpp b/synfig-studio/src/gui/docks/dockmanager.cpp index c377783..aaa7bf2 100644 --- a/synfig-studio/src/gui/docks/dockmanager.cpp +++ b/synfig-studio/src/gui/docks/dockmanager.cpp @@ -125,12 +125,12 @@ class studio::DockSettings : public synfigapp::Settings public: DockSettings(DockManager* dock_manager):dock_manager(dock_manager) { - synfigapp::Main::settings().add_domain(this,"dock"); + synfigapp::Main::settings().add_domain(this,"workspace"); } virtual ~DockSettings() { - synfigapp::Main::settings().remove_domain("dock"); + synfigapp::Main::settings().remove_domain("workspace"); } virtual bool get_value(const synfig::String& key_, synfig::String& value)const @@ -400,6 +400,17 @@ std::string DockManager::read_string(std::string &x) return res; } +std::string DockManager::extract_dockable_name(std::string &x) const +{ + size_t pos = x.find(","); + std::string res = x.substr(0, pos); + if (pos == std::string::npos) + x.clear(); + else + x = x.substr(pos+1); // skip comma + return res; +} + int DockManager::read_int(std::string &x) { return strtol(read_string(x).c_str(), NULL, 10); @@ -455,10 +466,13 @@ Gtk::Widget* DockManager::read_widget(std::string &x) DockBook *book = NULL; do { - std::string name = read_string(x); + std::string dockable_name_params = read_string(x); + std::string name = extract_dockable_name(dockable_name_params); if (!name.empty()) { Dockable &dockable = find_dockable(name); + if (!dockable_name_params.empty()) + dockable.read_layout_string(dockable_name_params); Gtk::Container *container = dockable.get_parent(); if (container) { container->remove(dockable); @@ -467,22 +481,6 @@ Gtk::Widget* DockManager::read_widget(std::string &x) if (book == NULL) { book = manage(new DockBook()); book->show(); } book->add(dockable); } - /*std::string name = read_string(x); - if (!name.empty()) - { - Dockable *dockable = &find_dockable(name); - if (dockable != NULL) - { - Gtk::Container *container = dockable->get_parent(); - if (container) - { - container->remove(*dockable); - containers_to_remove_[container] = true; - } - if (book == NULL) { book = manage(new DockBook()); book->show(); } - book->add(*dockable); - } - }*/ } while (read_separator(x)); return book; @@ -646,7 +644,17 @@ void DockManager::write_widget(std::string &x, Gtk::Widget* widget) if (dockable) { write_separator(x); - write_string(x, dockable->get_name()); + std::string name_params = dockable->get_name(); + std::string params; + dockable->write_layout_string(params); + if (!params.empty()) { + if (params.find_first_of("]|") != std::string::npos) { + synfig::warning("Ignoring %s's layout info: it must not have ] or | characters.", dockable->get_name().c_str()); + } else { + name_params += "," + params; + } + } + write_string(x, name_params); } } write_separator(x, false); diff --git a/synfig-studio/src/gui/docks/dockmanager.h b/synfig-studio/src/gui/docks/dockmanager.h index 75867de..256f7c4 100644 --- a/synfig-studio/src/gui/docks/dockmanager.h +++ b/synfig-studio/src/gui/docks/dockmanager.h @@ -75,6 +75,7 @@ private: bool read_separator(std::string &x); std::string read_string(std::string &x); + std::string extract_dockable_name(std::string &x) const; int read_int(std::string &x); bool read_bool(std::string &x); Gtk::Widget* read_widget(std::string &x); diff --git a/synfig-studio/src/synfigapp/settings.cpp b/synfig-studio/src/synfigapp/settings.cpp index df2ed76..746bb0c 100644 --- a/synfig-studio/src/synfigapp/settings.cpp +++ b/synfig-studio/src/synfigapp/settings.cpp @@ -242,6 +242,7 @@ Settings::load_from_file(const synfig::String& filename, const synfig::String& k std::ifstream file(filename.c_str()); if(!file) return false; + bool loaded_filter = false; while(file) { std::string line; @@ -263,6 +264,8 @@ Settings::load_from_file(const synfig::String& filename, const synfig::String& k { if(!set_value(key,value)) synfig::warning("Settings::load_from_file(): Key \"%s\" with a value of \"%s\" was rejected.",key.c_str(),value.c_str()); + else + loaded_filter = true; } } catch(...) @@ -272,5 +275,7 @@ Settings::load_from_file(const synfig::String& filename, const synfig::String& k } } } + if (!key_filter.empty() && !loaded_filter) + return false; return true; } diff --git a/synfig-studio/src/synfigapp/settings.h b/synfig-studio/src/synfigapp/settings.h index 2a7b159..22a99af 100644 --- a/synfig-studio/src/synfigapp/settings.h +++ b/synfig-studio/src/synfigapp/settings.h @@ -70,7 +70,7 @@ public: bool save_to_string(synfig::String& data); //! \brief Load optionally filtered settings from given synfig settings format filename - //! \return false if file open failed, else true. + //! \return false if file open failed, else true. If key_filter is set, return false if value could not be loaded. //! \sa set_value //! \Param[in] filename, the synfig settings format filename. Should be aboslute path. //! \Param[in] key_filter, optional, string use to filter the settings key. No wildcard only full equal string test.