+
+void
+EditorRegions::freeze_tree_model (){
+
+ _display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
+ _model->set_sort_column (-2, SORT_ASCENDING); //Disable sorting to gain performance
+
+}
+
+void
+EditorRegions::thaw_tree_model (){
+
+ _model->set_sort_column (0, SORT_ASCENDING); // renabale sorting
+ _display.set_model (_model);
+
+ if (toggle_full_action()->get_active()) {
+ _display.expand_all();
+ }
+}
+
+void
+EditorRegions::locked_changed (std::string const & path)
+{
+ TreeIter i = _model->get_iter (path);
+ if (i) {
+ boost::shared_ptr<ARDOUR::Region> region = (*i)[_columns.region];
+ if (region) {
+ region->set_locked (!(*i)[_columns.locked]);
+ }
+ }
+}
+
+void
+EditorRegions::glued_changed (std::string const & path)
+{
+ TreeIter i = _model->get_iter (path);
+ if (i) {
+ boost::shared_ptr<ARDOUR::Region> region = (*i)[_columns.region];
+ if (region) {
+ /* `glued' means MusicTime, and we're toggling here */
+ region->set_position_lock_style ((*i)[_columns.glued] ? AudioTime : MusicTime);
+ }
+ }
+
+}
+
+void
+EditorRegions::muted_changed (std::string const & path)
+{
+ TreeIter i = _model->get_iter (path);
+ if (i) {
+ boost::shared_ptr<ARDOUR::Region> region = (*i)[_columns.region];
+ if (region) {
+ region->set_muted (!(*i)[_columns.muted]);
+ }
+ }
+
+}
+
+void
+EditorRegions::opaque_changed (std::string const & path)
+{
+ TreeIter i = _model->get_iter (path);
+ if (i) {
+ boost::shared_ptr<ARDOUR::Region> region = (*i)[_columns.region];
+ if (region) {
+ region->set_opaque (!(*i)[_columns.opaque]);
+ }
+ }
+
+}
+
+XMLNode &
+EditorRegions::get_state () const
+{
+ XMLNode* node = new XMLNode (X_("RegionList"));
+
+ node->add_property (X_("sort-type"), enum_2_string (_sort_type));
+
+ RefPtr<Action> act = ActionManager::get_action (X_("RegionList"), X_("SortAscending"));
+ bool const ascending = RefPtr<RadioAction>::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)
+{
+ bool changed = false;
+
+ if (node.name() != X_("RegionList")) {
+ return;
+ }
+
+ XMLProperty const * p = node.property (X_("sort-type"));
+
+ if (p) {
+ Editing::RegionListSortType const t = static_cast<Editing::RegionListSortType> (string_2_enum (p->value(), _sort_type));
+
+ if (_sort_type != t) {
+ changed = true;
+ }
+
+ reset_sort_type (t, true);
+ RefPtr<RadioAction> ract = sort_type_action (t);
+ ract->set_active ();
+ }
+
+ p = node.property (X_("sort-ascending"));
+
+ if (p) {
+ bool const yn = string_is_affirmative (p->value ());
+ SortType old_sort_type;
+ int old_sort_column;
+
+ _model->get_sort_column_id (old_sort_column, old_sort_type);
+
+ if (old_sort_type != (yn ? SORT_ASCENDING : SORT_DESCENDING)) {
+ changed = true;
+ }
+
+ reset_sort_direction (yn);
+ RefPtr<Action> act;
+
+ if (yn) {
+ act = ActionManager::get_action (X_("RegionList"), X_("SortAscending"));
+ } else {
+ act = ActionManager::get_action (X_("RegionList"), X_("SortDescending"));
+ }
+
+ RefPtr<RadioAction>::cast_dynamic(act)->set_active ();
+ }
+
+ p = node.property (X_("show-all"));
+ if (p) {
+ bool const yn = string_is_affirmative (p->value ());
+
+ if (expanded != yn) {
+ changed = true;
+ }
+
+ set_full (yn);
+ toggle_full_action()->set_active (yn);
+ }
+
+ p = node.property (X_("show-automatic-regions"));
+ if (p) {
+ bool const yn = string_is_affirmative (p->value ());
+
+ if (yn != _show_automatic_regions) {
+ _show_automatic_regions = yn;
+ toggle_show_auto_regions_action()->set_active (yn);
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ redisplay ();
+ }
+}
+
+RefPtr<RadioAction>
+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<Action> act = ActionManager::get_action (X_("RegionList"), action);
+ assert (act);
+
+ return RefPtr<RadioAction>::cast_dynamic (act);
+}
+
+RefPtr<Action>
+EditorRegions::hide_action () const
+{
+ return ActionManager::get_action (X_("RegionList"), X_("rlHide"));
+
+}
+
+RefPtr<Action>
+EditorRegions::show_action () const
+{
+ return ActionManager::get_action (X_("RegionList"), X_("rlShow"));
+}
+
+RefPtr<Action>
+EditorRegions::remove_unused_regions_action () const
+{
+ return ActionManager::get_action (X_("RegionList"), X_("removeUnusedRegions"));
+}
+
+RefPtr<ToggleAction>
+EditorRegions::toggle_full_action () const
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("RegionList"), X_("rlShowAll"));
+ assert (act);
+ return Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+}
+
+RefPtr<ToggleAction>
+EditorRegions::toggle_show_auto_regions_action () const
+{
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("RegionList"), X_("rlShowAuto"));
+ assert (act);
+ return Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+}