X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_region_list.cc;h=69a24b5c4c20f54a6f47cc661e87c8762f1c6134;hb=7e1b86aceeef477e13b4c35f524034d909acd92c;hp=a623340d36dba084501643eda1dae1d231f4c79e;hpb=6129057f868dc37bc82db3cf70cbff9730cc541d;p=ardour.git diff --git a/gtk2_ardour/editor_region_list.cc b/gtk2_ardour/editor_region_list.cc index a623340d36..69a24b5c4c 100644 --- a/gtk2_ardour/editor_region_list.cc +++ b/gtk2_ardour/editor_region_list.cc @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -110,9 +111,7 @@ Editor::add_region_to_region_display (boost::shared_ptr region) TreeModel::Row child; if (!iter) { - parent = *(region_list_model->append()); - parent[region_list_columns.name] = _("Hidden"); boost::shared_ptr proxy = parent[region_list_columns.region]; proxy.reset (); @@ -135,7 +134,6 @@ Editor::add_region_to_region_display (boost::shared_ptr region) TreeModel::Children rows = region_list_model->children(); for (i = rows.begin(); i != rows.end(); ++i) { - boost::shared_ptr rr = (*i)[region_list_columns.region]; if (rr && region->region_list_equivalent (rr)) { @@ -144,17 +142,24 @@ Editor::add_region_to_region_display (boost::shared_ptr 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 afs = boost::dynamic_pointer_cast(region->source()); str = ".../"; @@ -185,8 +190,10 @@ Editor::add_region_to_region_display (boost::shared_ptr 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()) { @@ -204,27 +211,29 @@ Editor::add_region_to_region_display (boost::shared_ptr region) for (i = rows.begin(); i != rows.end(); ++i) { boost::shared_ptr rr = (*i)[region_list_columns.region]; boost::shared_ptr r = boost::dynamic_pointer_cast(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 rrr = (*ii)[region_list_columns.region]; if (region->region_list_equivalent (rrr)) { return; + } } } + if (!found_parent) { row = *(region_list_model->append()); } @@ -276,37 +285,91 @@ Editor::region_list_region_changed (Change what_changed, boost::weak_ptr void Editor::region_list_selection_changed() { - bool selected = false; - if (region_list_display.get_selection()->count_selected_rows() > 0) { - selected = true; - } - - if (selected) { - TreeView::Selection::ListHandle_Path rows = region_list_display.get_selection()->get_selected_rows (); + TreeIter iter; - + TreeView::Selection::ListHandle_Path rows = region_list_display.get_selection()->get_selected_rows (); + + deselect_all(); + for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) { - if (iter = region_list_model->get_iter (*i)) { - boost::shared_ptr r = (*iter)[region_list_columns.region]; - - /* they could have clicked on a row that is just a placeholder, like "Hidden" */ + if (iter = region_list_model->get_iter (*i)) { // they could have clicked on a row that is just a placeholder, like "Hidden" + boost::shared_ptr region = (*iter)[region_list_columns.region]; - if (r) { + if (region) { + + if (region->automatic()) { + region_list_display.get_selection()->unselect(*i); - /* just set the first selected region (in fact, the selection model might be SINGLE, which - means there can only be one. - */ - - set_selected_regionview_from_region_list (r, Selection::Set); + } 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 r ((*iter)->region()); + for (i = rows.begin(); i != rows.end(); ++i) { + + boost::shared_ptr 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, 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 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 Editor::insert_into_tmp_regionlist(boost::shared_ptr region) { @@ -366,12 +429,12 @@ Editor::update_region_row (boost::shared_ptr region) for (i = rows.begin(); i != rows.end(); ++i) { - cerr << "Level 1: Compare " << region->name() << " with parent " << (*i)[region_list_columns.name] << "\n"; +// cerr << "Level 1: Compare " << region->name() << " with parent " << (*i)[region_list_columns.name] << "\n"; boost::shared_ptr compared_region = (*i)[region_list_columns.region]; if (region == compared_region) { - cerr << "Matched\n"; +// cerr << "Matched\n"; populate_row(region, (*i)); return; } @@ -382,7 +445,7 @@ Editor::update_region_row (boost::shared_ptr region) } } } - cerr << "Returning - No match\n\n"; +// cerr << "Returning - No match\n"; } bool @@ -393,13 +456,13 @@ Editor::update_region_subrows (boost::shared_ptr region, TreeModel::Row for (i = subrows.begin(); i != subrows.end(); ++i) { - cerr << "Level " << level << ": Compare " << region->name() << " with child " << (*i)[region_list_columns.name] << "\n"; +// cerr << "Level " << level << ": Compare " << region->name() << " with child " << (*i)[region_list_columns.name] << "\n"; boost::shared_ptr compared_region = (*i)[region_list_columns.region]; if (region == compared_region) { populate_row(region, (*i)); - cerr << "Matched\n"; +// cerr << "Matched\n"; return true; } @@ -426,9 +489,8 @@ Editor::update_all_region_rows () boost::shared_ptr region = (*i)[region_list_columns.region]; - cerr << "level 1 : Updating " << region->name() << "\n"; - if (!region->automatic()) { + cerr << "level 1 : Updating " << region->name() << "\n"; populate_row(region, (*i)); } @@ -448,9 +510,8 @@ Editor::update_all_region_subrows (TreeModel::Row const &parent_row, int level) boost::shared_ptr region = (*i)[region_list_columns.region]; - cerr << "level " << level << " : Updating " << region->name() << "\n"; - if (!region->automatic()) { + cerr << "level " << level << " : Updating " << region->name() << "\n"; populate_row(region, (*i)); } @@ -640,10 +701,10 @@ Editor::populate_row (boost::shared_ptr 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; @@ -788,8 +849,6 @@ Editor::region_list_display_button_press (GdkEventButton *ev) int cellx; int celly; - // cerr << "Button press release, button = " << ev->button << endl; - if (region_list_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { if ((iter = region_list_model->get_iter (path))) { region = (*iter)[region_list_columns.region]; @@ -798,12 +857,12 @@ Editor::region_list_display_button_press (GdkEventButton *ev) if (Keyboard::is_context_menu_event (ev)) { show_region_list_display_context_menu (ev->button, ev->time); - cerr << "\tcontext menu event, event handled\n"; return true; } if (region == 0) { - cerr << "\tno region, event not handled\n"; + region_list_display.get_selection()->unselect_all(); + deselect_all(); return false; } @@ -816,7 +875,6 @@ Editor::region_list_display_button_press (GdkEventButton *ev) if (!Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { consider_auditioning (region); } - cerr << "\taudition, event handled\n"; return true; break; @@ -824,7 +882,6 @@ Editor::region_list_display_button_press (GdkEventButton *ev) break; } - cerr << "\tnot handled\n"; return false; } @@ -1038,21 +1095,24 @@ Editor::remove_region_from_region_list () void Editor::region_list_display_drag_data_received (const RefPtr& context, - int x, int y, - const SelectionData& data, - guint info, guint time) + int x, int y, + const SelectionData& data, + guint info, guint time) { vector paths; if (data.get_target() == "GTK_TREE_MODEL_ROW") { - cerr << "Delete drag data drop to treeview\n"; region_list_display.on_drag_data_received (context, x, y, data, info, time); return; } if (convert_drop_to_paths (paths, context, x, y, data, info, time) == 0) { nframes64_t pos = 0; - do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos); + if (Profile->get_sae() || Config->get_only_copy_imported_files()) { + do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsRegion, SrcBest, pos); + } else { + do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos); + } context->drag_finish (true, false, time); } }