Minor copy-edit.
[ardour.git] / gtk2_ardour / editor_regions.cc
index 6704fce7d883d5ff92c2814c1d01019332e8c232..1acb5805833fb21526e30c6fd53ec500f49b50d1 100644 (file)
@@ -33,8 +33,6 @@
 #include "ardour/silentfilesource.h"
 #include "ardour/profile.h"
 
-#include <gtkmm2ext/stop_signal.h>
-
 #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<CellRendererToggle*> (_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<CellRendererToggle*> (_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<CellRendererToggle*> (_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<CellRendererToggle*> (_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> 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> 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> region)
 void
 EditorRegions::region_changed (boost::shared_ptr<Region> 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<Region> 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<Region> 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> 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> 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> 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> 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<Gdk::DragContext>& context,
        vector<ustring> 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<Region>
 EditorRegions::get_dragged_region ()
 {
        list<boost::shared_ptr<Region> > regions;
        TreeView* source;
        _display.get_object_drag_data (regions, &source);
+
+       if (regions.empty()) {
+               return boost::shared_ptr<Region> ();
+       }
+       
        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<ARDOUR::Region> 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<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 (Glib::ustring 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 (Glib::ustring 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]);
+               }
+       }
+
+}