X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_regions.cc;h=1acb5805833fb21526e30c6fd53ec500f49b50d1;hb=7110f48619af3b93fd2b1e2893462a63f6bf96fd;hp=6704fce7d883d5ff92c2814c1d01019332e8c232;hpb=d1624f9ed2c5197e7302904ab69996ba897b9ce8;p=ardour.git diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 6704fce7d8..1acb580583 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -33,8 +33,6 @@ #include "ardour/silentfilesource.h" #include "ardour/profile.h" -#include - #include "editor.h" #include "editing.h" #include "keyboard.h" @@ -44,6 +42,7 @@ #include "region_view.h" #include "utils.h" #include "editor_regions.h" +#include "editor_drag.h" #include "i18n.h" @@ -103,6 +102,30 @@ EditorRegions::EditorRegions (Editor* e) tv_col->add_attribute(renderer->property_text(), _columns.name); tv_col->add_attribute(renderer->property_foreground_gdk(), _columns.color_); + CellRendererToggle* locked_cell = dynamic_cast (_display.get_column_cell_renderer (7)); + locked_cell->property_activatable() = true; + locked_cell->signal_toggled().connect (sigc::mem_fun (*this, &EditorRegions::locked_changed)); + TreeViewColumn* locked_col = _display.get_column (7); + locked_col->add_attribute (locked_cell->property_visible(), _columns.property_toggles_visible); + + CellRendererToggle* glued_cell = dynamic_cast (_display.get_column_cell_renderer (8)); + glued_cell->property_activatable() = true; + glued_cell->signal_toggled().connect (sigc::mem_fun (*this, &EditorRegions::glued_changed)); + TreeViewColumn* glued_col = _display.get_column (8); + glued_col->add_attribute (glued_cell->property_visible(), _columns.property_toggles_visible); + + CellRendererToggle* muted_cell = dynamic_cast (_display.get_column_cell_renderer (9)); + muted_cell->property_activatable() = true; + muted_cell->signal_toggled().connect (sigc::mem_fun (*this, &EditorRegions::muted_changed)); + TreeViewColumn* muted_col = _display.get_column (9); + muted_col->add_attribute (muted_cell->property_visible(), _columns.property_toggles_visible); + + CellRendererToggle* opaque_cell = dynamic_cast (_display.get_column_cell_renderer (10)); + opaque_cell->property_activatable() = true; + opaque_cell->signal_toggled().connect (sigc::mem_fun (*this, &EditorRegions::opaque_changed)); + TreeViewColumn* opaque_col = _display.get_column (10); + opaque_col->add_attribute (opaque_cell->property_visible(), _columns.property_toggles_visible); + _display.get_selection()->set_mode (SELECTION_MULTIPLE); _display.add_object_drag (_columns.region.index(), "regions"); @@ -134,7 +157,7 @@ EditorRegions::EditorRegions (Editor* e) void EditorRegions::set_session (ARDOUR::Session* s) { - EditorComponent::set_session (s); + SessionHandlePtr::set_session (s); redisplay (); } @@ -244,6 +267,7 @@ EditorRegions::add_region (boost::shared_ptr region) row[_columns.name] = str; row[_columns.region] = region; + row[_columns.property_toggles_visible] = false; if (missing_source) { row[_columns.path] = _("(MISSING) ") + region->source()->name(); @@ -294,6 +318,8 @@ EditorRegions::add_region (boost::shared_ptr region) if (!found_parent) { row = *(_model->append()); } + + row[_columns.property_toggles_visible] = true; } row[_columns.region] = region; @@ -304,8 +330,16 @@ EditorRegions::add_region (boost::shared_ptr region) void EditorRegions::region_changed (boost::shared_ptr r, const PropertyChange& what_changed) { - if (what_changed.contains (ARDOUR::Properties::name)) { - /* find the region in our model and change its name */ + if (what_changed.contains (ARDOUR::Properties::name) || + what_changed.contains (ARDOUR::Properties::start) || + what_changed.contains (ARDOUR::Properties::position) || + what_changed.contains (ARDOUR::Properties::length) || + what_changed.contains (ARDOUR::Properties::locked) || + what_changed.contains (ARDOUR::Properties::position_lock_style) || + what_changed.contains (ARDOUR::Properties::muted) || + what_changed.contains (ARDOUR::Properties::opaque)) { + + /* find the region in our model and update its row */ TreeModel::Children rows = _model->children (); TreeModel::iterator i = rows.begin (); while (i != rows.end ()) { @@ -320,8 +354,7 @@ EditorRegions::region_changed (boost::shared_ptr r, const PropertyChange } if (j != children.end()) { - (*j)[_columns.name] = r->name (); - break; + populate_row (r, *j); } ++i; @@ -363,7 +396,6 @@ EditorRegions::selection_changed () } else { _change_connection.block (true); - cerr << "\tpush to region selection\n"; _editor->set_selected_regionview_from_region_list (region, Selection::Add); _change_connection.block (false); @@ -390,13 +422,11 @@ EditorRegions::set_selected (RegionSelection& regions) boost::shared_ptr compared_region = (*i)[_columns.region]; if (r == compared_region) { - cerr << "\tpush into region list\n"; _display.get_selection()->select(*i); break; } if (!(*i).children().empty()) { - cerr << "\tlook for " << r->name() << " among children of " << (compared_region ? compared_region->name() : string ("NO REGION")) << endl; if (set_selected_in_subrow(r, (*i), 2)) { break; } @@ -557,7 +587,6 @@ EditorRegions::update_all_rows () boost::shared_ptr region = (*i)[_columns.region]; if (!region->automatic()) { - cerr << "level 1 : Updating " << region->name() << "\n"; populate_row(region, (*i)); } @@ -578,7 +607,6 @@ EditorRegions::update_all_subrows (TreeModel::Row const &parent_row, int level) boost::shared_ptr region = (*i)[_columns.region]; if (!region->automatic()) { - cerr << "level " << level << " : Updating " << region->name() << "\n"; populate_row(region, (*i)); } @@ -718,7 +746,7 @@ EditorRegions::populate_row (boost::shared_ptr region, TreeModel::Row co case AudioClock::Frames: snprintf (start_str, sizeof (start_str), "%" PRId64, region->position()); - snprintf (end_str, sizeof (end_str), "%" PRId64, (region->position() + region->length() - 1)); + snprintf (end_str, sizeof (end_str), "%" PRId64, (region->last_frame())); snprintf (length_str, sizeof (length_str), "%" PRId64, region->length()); snprintf (sync_str, sizeof (sync_str), "%" PRId64, region->sync_position() + region->position()); @@ -806,7 +834,7 @@ EditorRegions::populate_row (boost::shared_ptr region, TreeModel::Row co row[_columns.locked] = region->locked(); - if (region->positional_lock_style() == Region::MusicTime) { + if (region->position_lock_style() == MusicTime) { row[_columns.glued] = true; } else { row[_columns.glued] = false; @@ -934,7 +962,7 @@ EditorRegions::button_press (GdkEventButton *ev) if (Keyboard::is_context_menu_event (ev)) { show_context_menu (ev->button, ev->time); - return true; + return false; } if (region != 0 && Keyboard::is_button2_event (ev)) { @@ -1094,6 +1122,8 @@ EditorRegions::drag_data_received (const RefPtr& context, vector paths; if (data.get_target() == "GTK_TREE_MODEL_ROW") { + /* something is being dragged over the region list */ + _editor->_drags->abort (); _display.on_drag_data_received (context, x, y, data, info, time); return; } @@ -1152,12 +1182,18 @@ EditorRegions::name_edit (const Glib::ustring& path, const Glib::ustring& new_te } +/** @return Region that has been dragged out of the list, or 0 */ boost::shared_ptr EditorRegions::get_dragged_region () { list > regions; TreeView* source; _display.get_object_drag_data (regions, &source); + + if (regions.empty()) { + return boost::shared_ptr (); + } + assert (regions.size() == 1); return regions.front (); } @@ -1191,3 +1227,55 @@ EditorRegions::get_single_selection () return (*iter)[_columns.region]; } + +void +EditorRegions::locked_changed (Glib::ustring const & path) +{ + TreeIter i = _model->get_iter (path); + if (i) { + boost::shared_ptr region = (*i)[_columns.region]; + if (region) { + region->set_locked (!(*i)[_columns.locked]); + } + } +} + +void +EditorRegions::glued_changed (Glib::ustring const & path) +{ + TreeIter i = _model->get_iter (path); + if (i) { + boost::shared_ptr 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 (Glib::ustring const & path) +{ + TreeIter i = _model->get_iter (path); + if (i) { + boost::shared_ptr region = (*i)[_columns.region]; + if (region) { + region->set_muted (!(*i)[_columns.muted]); + } + } + +} + +void +EditorRegions::opaque_changed (Glib::ustring const & path) +{ + TreeIter i = _model->get_iter (path); + if (i) { + boost::shared_ptr region = (*i)[_columns.region]; + if (region) { + region->set_opaque (!(*i)[_columns.opaque]); + } + } + +}