summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSampo Savolainen <v2@iki.fi>2009-01-18 10:41:56 +0000
committerSampo Savolainen <v2@iki.fi>2009-01-18 10:41:56 +0000
commitef038c1a84ecd541a540d5a5baa677d7663e535c (patch)
tree5050a38f07f804551e5ab0dc8da5b63113511289
parentc174fa61749e3deb54551ca37598c41aedf0a40c (diff)
Oofus's work on region lists: highlight selected canvas regions on the region list
git-svn-id: svn://localhost/ardour2/branches/3.0@4414 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour3_ui_dark.rc.in18
-rw-r--r--gtk2_ardour/editor.cc8
-rw-r--r--gtk2_ardour/editor.h4
-rw-r--r--gtk2_ardour/editor_region_list.cc99
-rw-r--r--gtk2_ardour/editor_selection.cc11
-rw-r--r--gtk2_ardour/streamview.cc1
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;
}
}