From 620a4df7309d63126082ec1aa465fcc8b0074b5c Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 19 Sep 2010 02:18:59 +0000 Subject: [PATCH] Save / restore settings from the editor region list context menu. git-svn-id: svn://localhost/ardour2/branches/3.0@7804 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 2 + gtk2_ardour/editor_actions.cc | 2 +- gtk2_ardour/editor_regions.cc | 185 ++++++++++++++++++++++++++++------ gtk2_ardour/editor_regions.h | 16 ++- 4 files changed, 166 insertions(+), 39 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 9c431fdd2c..a91a0572e4 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2559,6 +2559,7 @@ Editor::set_state (const XMLNode& node, int /*version*/) XMLNodeList children = node.children (); for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { selection->set_state (**i, Stateful::current_state_version); + _regions->set_state (**i); } return 0; @@ -2648,6 +2649,7 @@ Editor::get_state () node->add_property (X_("editor-list-page"), buf); node->add_child_nocopy (selection->get_state ()); + node->add_child_nocopy (_regions->get_state ()); return *node; } diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index e8eeb4d572..0814bd37ff 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -841,7 +841,7 @@ Editor::register_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, X_("addExternalAudioToRegionList"), _("Import to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion)); + act = ActionManager::register_action (editor_actions, X_("addExternalAudioToRegionList"), _("Import to Region List..."), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 4d51c2539d..a87cc6ac8e 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -493,16 +493,15 @@ EditorRegions::redisplay () bool tree_expanded = false; - if (_toggle_full_action && _toggle_full_action->get_active()) { //If the list was expanded prior to rebuilding, - tree_expanded = true; //expand it again afterwards + /* If the list was expanded prior to rebuilding, expand it again afterwards */ + if (toggle_full_action()->get_active()) { + tree_expanded = true; } _display.set_model (Glib::RefPtr(0)); _model->clear (); - /* now add everything we have, via a temporary list used to help with - sorting. - */ + /* now add everything we have, via a temporary list used to help with sorting */ tmp_region_list.clear(); @@ -873,40 +872,23 @@ EditorRegions::populate_row (boost::shared_ptr region, TreeModel::Row co } } -void -EditorRegions::build_menu () -{ - _menu = dynamic_cast(ActionManager::get_widget ("/RegionListMenu")); - - /* now grab specific menu items that we need */ - - Glib::RefPtr act; - - _hide_action = ActionManager::get_action (X_("RegionList"), X_("rlHide")); - _show_action = ActionManager::get_action (X_("RegionList"), X_("rlShow")); - - act = ActionManager::get_action (X_("RegionList"), X_("rlShowAll")); - if (act) { - _toggle_full_action = Glib::RefPtr::cast_dynamic (act); - } - - act = ActionManager::get_action (X_("RegionList"), X_("rlShowAuto")); - if (act) { - _toggle_show_auto_regions_action = Glib::RefPtr::cast_dynamic (act); - } -} - void EditorRegions::toggle_show_auto_regions () { - _show_automatic_regions = _toggle_show_auto_regions_action->get_active(); + _show_automatic_regions = toggle_show_auto_regions_action()->get_active(); redisplay (); } void EditorRegions::toggle_full () { - if (_toggle_full_action->get_active()) { + set_full (toggle_full_action()->get_active ()); +} + +void +EditorRegions::set_full (bool f) +{ + if (f) { _display.expand_all (); } else { _display.collapse_all (); @@ -917,7 +899,7 @@ void EditorRegions::show_context_menu (int button, int time) { if (_menu == 0) { - build_menu (); + _menu = dynamic_cast (ActionManager::get_widget ("/RegionListMenu")); } if (_display.get_selection()->count_selected_rows() > 0) { @@ -944,8 +926,8 @@ EditorRegions::show_context_menu (int button, int time) } } - _hide_action->set_sensitive (have_shown); - _show_action->set_sensitive (have_hidden); + hide_action()->set_sensitive (have_shown); + show_action()->set_sensitive (have_hidden); _menu->popup (button, time); } @@ -1292,3 +1274,140 @@ EditorRegions::opaque_changed (std::string const & path) } } + +XMLNode & +EditorRegions::get_state () const +{ + XMLNode* node = new XMLNode (X_("RegionList")); + + node->add_property (X_("sort-type"), enum_2_string (_sort_type)); + + RefPtr act = ActionManager::get_action (X_("RegionList"), X_("SortAscending")); + bool const ascending = RefPtr::cast_dynamic(act)->get_active (); + node->add_property (X_("sort-ascending"), ascending ? "yes" : "no"); + node->add_property (X_("show-all"), toggle_full_action()->get_active() ? "yes" : "no"); + node->add_property (X_("show-automatic-regions"), _show_automatic_regions ? "yes" : "no"); + + return *node; +} + +void +EditorRegions::set_state (const XMLNode & node) +{ + if (node.name() != X_("RegionList")) { + return; + } + + XMLProperty const * p = node.property (X_("sort-type")); + if (p) { + Editing::RegionListSortType const t = static_cast (string_2_enum (p->value(), _sort_type)); + reset_sort_type (t, true); + RefPtr ract = sort_type_action (t); + ract->set_active (); + } + + p = node.property (X_("sort-ascending")); + if (p) { + bool const a = string_is_affirmative (p->value ()); + reset_sort_direction (a); + RefPtr act; + if (a) { + act = ActionManager::get_action (X_("RegionList"), X_("SortAscending")); + } else { + act = ActionManager::get_action (X_("RegionList"), X_("SortDescending")); + } + + RefPtr::cast_dynamic(act)->set_active (); + } + + p = node.property (X_("show-all")); + if (p) { + bool const s = string_is_affirmative (p->value ()); + set_full (s); + toggle_full_action()->set_active (s); + } + + p = node.property (X_("show-automatic-regions")); + if (p) { + bool const s = string_is_affirmative (p->value ()); + _show_automatic_regions = s; + redisplay (); + toggle_show_auto_regions_action()->set_active (s); + } +} + +RefPtr +EditorRegions::sort_type_action (Editing::RegionListSortType t) const +{ + const char* action = 0; + + switch (t) { + case Editing::ByName: + action = X_("SortByRegionName"); + break; + case Editing::ByLength: + action = X_("SortByRegionLength"); + break; + case Editing::ByPosition: + action = X_("SortByRegionPosition"); + break; + case Editing::ByTimestamp: + action = X_("SortByRegionTimestamp"); + break; + case Editing::ByStartInFile: + action = X_("SortByRegionStartinFile"); + break; + case Editing::ByEndInFile: + action = X_("SortByRegionEndinFile"); + break; + case Editing::BySourceFileName: + action = X_("SortBySourceFileName"); + break; + case Editing::BySourceFileLength: + action = X_("SortBySourceFileLength"); + break; + case Editing::BySourceFileCreationDate: + action = X_("SortBySourceFileCreationDate"); + break; + case Editing::BySourceFileFS: + action = X_("SortBySourceFilesystem"); + break; + default: + fatal << string_compose (_("programming error: %1: %2"), "EditorRegions: impossible sort type", (int) t) << endmsg; + /*NOTREACHED*/ + } + + RefPtr act = ActionManager::get_action (X_("RegionList"), action); + assert (act); + + return RefPtr::cast_dynamic (act); +} + +RefPtr +EditorRegions::hide_action () const +{ + return ActionManager::get_action (X_("RegionList"), X_("rlHide")); + +} + +RefPtr +EditorRegions::show_action () const +{ + return ActionManager::get_action (X_("RegionList"), X_("rlShow")); +} + +RefPtr +EditorRegions::toggle_full_action () const +{ + Glib::RefPtr act = ActionManager::get_action (X_("RegionList"), X_("rlShowAll")); + assert (act); + return Glib::RefPtr::cast_dynamic (act); +} + +RefPtr +EditorRegions::toggle_show_auto_regions_action () const +{ + Glib::RefPtr act = ActionManager::get_action (X_("RegionList"), X_("rlShowAuto")); + assert (act); + return Glib::RefPtr::cast_dynamic (act); +} diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h index c4b5c8f3f1..e6f473ff3d 100644 --- a/gtk2_ardour/editor_regions.h +++ b/gtk2_ardour/editor_regions.h @@ -63,6 +63,9 @@ public: _display.get_selection()->unselect_all (); } + XMLNode& get_state () const; + void set_state (const XMLNode &); + private: struct Columns : public Gtk::TreeModel::ColumnRecord { @@ -119,7 +122,6 @@ private: bool key_press (GdkEventKey *); bool button_press (GdkEventButton *); - void build_menu (); void show_context_menu (int button, int time); int sorter (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator); @@ -137,15 +139,19 @@ private: Glib::RefPtr const &, gint, gint, Gtk::SelectionData const &, guint, guint ); + Glib::RefPtr sort_type_action (Editing::RegionListSortType) const; + void set_full (bool); + + Glib::RefPtr hide_action () const; + Glib::RefPtr show_action () const; + Glib::RefPtr toggle_full_action () const; + Glib::RefPtr toggle_show_auto_regions_action () const; + Gtk::Menu* _menu; Gtk::ScrolledWindow _scroller; Gtk::Frame _frame; Gtkmm2ext::DnDTreeView > _display; Glib::RefPtr _model; - Glib::RefPtr _hide_action; ///< the action for our Hide menu option - Glib::RefPtr _show_action; ///< the action for our Show menu option - Glib::RefPtr _toggle_full_action; - Glib::RefPtr _toggle_show_auto_regions_action; bool _show_automatic_regions; Editing::RegionListSortType _sort_type; bool _no_redisplay;