diff options
-rw-r--r-- | gtk2_ardour/ardour3_ui_dark.rc.in | 18 | ||||
-rw-r--r-- | gtk2_ardour/editor.cc | 8 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_region_list.cc | 99 | ||||
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/streamview.cc | 1 |
6 files changed, 116 insertions, 25 deletions
diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in index fc5ae51f5e..c50ff71e27 100644 --- a/gtk2_ardour/ardour3_ui_dark.rc.in +++ b/gtk2_ardour/ardour3_ui_dark.rc.in @@ -859,27 +859,31 @@ style "treeview_parent_node" style "treeview_display" = "small_bold_text" { + GtkWidget::focus-line-width = 0 + # expander arrow border and DnD "icon" text - fg[NORMAL] = { 0.8, 0.8, 0.8 } + #fg[NORMAL] = { 0.8, 0.8, 0.8 } + + bg[NORMAL] = { 0.8, 0.8, 0.8 } # background with no rows or no selection, plus # expander arrow core and DnD "icon" background - base[NORMAL] = { 0.20, 0.20, 0.25 } + #base[NORMAL] = { 0.20, 0.20, 0.25 } # selected row bg when window does not have focus (including during DnD) - base[ACTIVE] = { 0.0, 0.60, 0.60 } + #base[ACTIVE] = { 0.0, 0.60, 0.60 } # selected row bg when window has focus - base[SELECTED] = { 0, 0.75, 0.75 } + #base[SELECTED] = { 0, 0.75, 0.75 } # row text when in normal state and not a parent - text[NORMAL] = { 0.80, 0.80, 0.80 } + #text[NORMAL] = { 0.80, 0.80, 0.80 } # selected row text with window focus - text[SELECTED] = { 0, 1.0, 1.0 } + #text[SELECTED] = { 0, 1.0, 1.0 } # selected row text without window focus (including during DnD) - text[ACTIVE] = { 0, 1.0, 1.0 } + #text[ACTIVE] = { 0, 1.0, 1.0 } } style "main_canvas_area" diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 5121fe0425..3eba17a06e 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -446,7 +446,7 @@ Editor::Editor () selection->TimeChanged.connect (mem_fun(*this, &Editor::time_selection_changed)); selection->TracksChanged.connect (mem_fun(*this, &Editor::track_selection_changed)); - selection->RegionsChanged.connect (mem_fun(*this, &Editor::region_selection_changed)); + editor_regions_selection_changed_connection = selection->RegionsChanged.connect (mem_fun(*this, &Editor::region_selection_changed)); selection->PointsChanged.connect (mem_fun(*this, &Editor::point_selection_changed)); selection->MarkersChanged.connect (mem_fun(*this, &Editor::marker_selection_changed)); @@ -667,7 +667,7 @@ Editor::Editor () region_list_display.append_column (_("Used"), region_list_columns.used); region_list_display.append_column (_("Path"), region_list_columns.path); region_list_display.set_headers_visible (true); - region_list_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH); + //region_list_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH); CellRendererText* region_name_cell = dynamic_cast<CellRendererText*>(region_list_display.get_column_cell_renderer (0)); region_name_cell->property_editable() = true; @@ -701,7 +701,7 @@ Editor::Editor () region_list_display.signal_key_release_event().connect (mem_fun(*this, &Editor::region_list_display_key_release)); region_list_display.signal_button_press_event().connect (mem_fun(*this, &Editor::region_list_display_button_press), false); region_list_display.signal_button_release_event().connect (mem_fun(*this, &Editor::region_list_display_button_release)); - region_list_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::region_list_selection_changed)); + region_list_change_connection = region_list_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::region_list_selection_changed)); // region_list_display.signal_popup_menu().connect (bind (mem_fun (*this, &Editor::show_region_list_display_context_menu), 1, 0)); //ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (mem_fun(*this, &Editor::redisplay_regions)); @@ -3526,7 +3526,7 @@ Editor::restore_state (State *state) *selection = *state->selection; time_selection_changed (); - region_selection_changed (); + region_selection_changed (); /* XXX other selection change handlers? */ } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index bb194d5c76..622d288213 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -990,6 +990,9 @@ class Editor : public PublicEditor void region_list_region_changed (ARDOUR::Change, boost::weak_ptr<ARDOUR::Region>); void region_list_selection_changed (); + sigc::connection region_list_change_connection; + void set_selected_in_region_list(RegionSelection&); + bool set_selected_in_region_list_subrow(boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int); bool region_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn); void region_name_edit (const Glib::ustring&, const Glib::ustring&); void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions); @@ -1775,6 +1778,7 @@ public: void time_selection_changed (); void track_selection_changed (); void region_selection_changed (); + sigc::connection editor_regions_selection_changed_connection; void sensitize_the_right_region_actions (bool have_selected_regions); void point_selection_changed (); void marker_selection_changed (); diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc index c95c3e09eb..69a24b5c4c 100644 --- a/gtk2_ardour/editor_region_list.cc +++ b/gtk2_ardour/editor_region_list.cc @@ -111,9 +111,7 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region) TreeModel::Row child; if (!iter) { - parent = *(region_list_model->append()); - parent[region_list_columns.name] = _("Hidden"); boost::shared_ptr<Region> proxy = parent[region_list_columns.region]; proxy.reset (); @@ -136,7 +134,6 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region) TreeModel::Children rows = region_list_model->children(); for (i = rows.begin(); i != rows.end(); ++i) { - boost::shared_ptr<Region> rr = (*i)[region_list_columns.region]; if (rr && region->region_list_equivalent (rr)) { @@ -145,17 +142,24 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region) } row = *(region_list_model->append()); + if (missing_source) { c.set_rgb(65535,0,0); // FIXME: error color from style + } else if (region->automatic()){ c.set_rgb(0,65535,0); // FIXME: error color from style + } else { set_color(c, rgba_from_style ("RegionListWholeFile", 0xff, 0, 0, 0, "fg", Gtk::STATE_NORMAL, false )); + } + row[region_list_columns.color_] = c; if (region->source()->name()[0] == '/') { // external file + if (region->whole_file()) { + boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(region->source()); str = ".../"; @@ -186,8 +190,10 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region) if (missing_source) { row[region_list_columns.path] = _("(MISSING) ") + region->source()->name(); + } else { row[region_list_columns.path] = region->source()->name(); + } if (region->automatic()) { @@ -205,27 +211,29 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region) for (i = rows.begin(); i != rows.end(); ++i) { boost::shared_ptr<Region> rr = (*i)[region_list_columns.region]; boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion>(rr); - + if (r && r->whole_file()) { + if (region->source_equivalent (r)) { row = *(region_list_model->append ((*i).children())); found_parent = true; break; } } - + TreeModel::iterator ii; TreeModel::Children subrows = (*i).children(); for (ii = subrows.begin(); ii != subrows.end(); ++ii) { - boost::shared_ptr<Region> rrr = (*ii)[region_list_columns.region]; if (region->region_list_equivalent (rrr)) { return; + } } } + if (!found_parent) { row = *(region_list_model->append()); } @@ -290,13 +298,76 @@ Editor::region_list_selection_changed() boost::shared_ptr<Region> region = (*iter)[region_list_columns.region]; if (region) { - set_selected_regionview_from_region_list (region, Selection::Add); + if (region->automatic()) { + region_list_display.get_selection()->unselect(*i); + + } else { + region_list_change_connection.block(true); + //editor_regions_selection_changed_connection.block(true); + + set_selected_regionview_from_region_list (region, Selection::Add); + + region_list_change_connection.block(false); + //editor_regions_selection_changed_connection.block(false); + } + } + } + } + } else { + deselect_all(); + } +} + +void +Editor::set_selected_in_region_list(RegionSelection& regions) +{ + for (RegionSelection::iterator iter = regions.begin(); iter != regions.end(); ++iter) { + + TreeModel::iterator i; + TreeModel::Children rows = region_list_model->children(); + boost::shared_ptr<Region> r ((*iter)->region()); + + for (i = rows.begin(); i != rows.end(); ++i) { + + boost::shared_ptr<Region> compared_region = (*i)[region_list_columns.region]; + + if (r == compared_region) { + region_list_display.get_selection()->select(*i);; + break; + } + + if (!(*i).children().empty()) { + if (set_selected_in_region_list_subrow(r, (*i), 2)) { + break; } } } + } +} + +bool +Editor::set_selected_in_region_list_subrow (boost::shared_ptr<Region> region, TreeModel::Row const &parent_row, int level) +{ + TreeModel::iterator i; + TreeModel::Children subrows = (*parent_row).children(); + + for (i = subrows.begin(); i != subrows.end(); ++i) { + + boost::shared_ptr<Region> compared_region = (*i)[region_list_columns.region]; + if (region == compared_region) { + region_list_display.get_selection()->select(*i);; + return true; + } + + if (!(*i).children().empty()) { + if (update_region_subrows(region, (*i), level + 1)) { + return true; + } + } } + return false; } void @@ -630,10 +701,10 @@ Editor::populate_row (boost::shared_ptr<Region> region, TreeModel::Row const &ro row[region_list_columns.sync] = _("Multiple"); row[region_list_columns.fadein] = _("Multiple"); row[region_list_columns.fadeout] = _("Multiple"); - row[region_list_columns.locked] = _(" "); - row[region_list_columns.glued] = _(" "); - row[region_list_columns.muted] = _(" "); - row[region_list_columns.opaque] = _(" "); + row[region_list_columns.locked] = false; + row[region_list_columns.glued] = false; + row[region_list_columns.muted] = false; + row[region_list_columns.opaque] = false; } else { row[region_list_columns.start] = start_str; row[region_list_columns.end] = end_str; @@ -1024,9 +1095,9 @@ Editor::remove_region_from_region_list () void Editor::region_list_display_drag_data_received (const RefPtr<Gdk::DragContext>& context, - int x, int y, - const SelectionData& data, - guint info, guint time) + int x, int y, + const SelectionData& data, + guint info, guint time) { vector<ustring> paths; diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 50979c5ed5..305ad77902 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -852,13 +852,24 @@ Editor::sensitize_the_right_region_actions (bool have_selected_regions) void Editor::region_selection_changed () { + region_list_change_connection.block(true); + editor_regions_selection_changed_connection.block(true); + + region_list_display.get_selection()->unselect_all(); + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + (*i)->set_selected_regionviews (selection->regions); + set_selected_in_region_list(selection->regions); + } sensitize_the_right_region_actions (!selection->regions.empty()); zoomed_to_region = false; + + region_list_change_connection.block(false); + editor_regions_selection_changed_connection.block(false); } void diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index d8abf0f834..ab61338d2d 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -399,6 +399,7 @@ StreamView::set_selected_regionviews (RegionSelection& regions) for (RegionSelection::iterator ii = regions.begin(); ii != regions.end(); ++ii) { if (*i == *ii) { selected = true; + break; } } |