add nominal owners for all action groups
[ardour.git] / gtk2_ardour / region_layering_order_editor.cc
index dbf3fa9dcfdd063ec7d3859d605e53b9a31e6fba..63a39cd270e921326458f40ff5576bed3f900e1f 100644 (file)
@@ -20,6 +20,9 @@
 #include <gtkmm/table.h>
 #include <gtkmm/stock.h>
 #include <gtkmm/alignment.h>
+
+#include "pbd/stateful_diff_command.h"
+
 #include "ardour/region.h"
 
 #include "gui_thread.h"
 #include "region_layering_order_editor.h"
 #include "region_view.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
 using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
 
 RegionLayeringOrderEditor::RegionLayeringOrderEditor (PublicEditor& pe)
        : ArdourWindow (_("RegionLayeringOrderEditor"))
        , position (0)
        , in_row_change (false)
-        , regions_at_position (0)
+       , regions_at_position (0)
        , layering_order_model (Gtk::ListStore::create (layering_order_columns))
-        , clock ("layer dialog", true, "", false, false, false)
+       , clock ("layer dialog", true, "", false, false, false)
        , editor (pe)
        , _time_axis_view (0)
 {
@@ -58,29 +62,29 @@ RegionLayeringOrderEditor::RegionLayeringOrderEditor (PublicEditor& pe)
 
        clock.set_mode (AudioClock::BBT);
 
-        Gtk::Table* scroller_table = manage (new Gtk::Table);
-        scroller_table->set_size_request (300, 250);
-        scroller_table->attach (scroller, 0, 1, 0, 1);
-        scroller_table->set_col_spacings (5);
-        scroller_table->set_row_spacings (5);
+       Gtk::Table* scroller_table = manage (new Gtk::Table);
+       scroller_table->set_size_request (300, 250);
+       scroller_table->attach (scroller, 0, 1, 0, 1);
+       scroller_table->set_col_spacings (5);
+       scroller_table->set_row_spacings (5);
 
-        track_label.set_name ("RegionLayeringOrderEditorLabel");
-        track_label.set_text (_("Track:"));
+       track_label.set_name ("RegionLayeringOrderEditorLabel");
+       track_label.set_text (_("Track:"));
        track_label.set_alignment (0, 0.5);
-        clock_label.set_name ("RegionLayeringOrderEditorLabel");
-        clock_label.set_text (_("Position:"));
+       clock_label.set_name ("RegionLayeringOrderEditorLabel");
+       clock_label.set_text (_("Position:"));
        clock_label.set_alignment (0, 0.5);
-        track_name_label.set_name ("RegionLayeringOrderEditorNameLabel");
+       track_name_label.set_name ("RegionLayeringOrderEditorNameLabel");
        track_name_label.set_alignment (0, 0.5);
-        clock.set_mode (AudioClock::BBT);
+       clock.set_mode (AudioClock::BBT);
 
-        Gtk::Table* info_table = manage (new Gtk::Table (2, 2));
-        info_table->set_col_spacings (5);
-        info_table->set_row_spacings (5);
-        info_table->attach (track_label, 0, 1, 0, 1, FILL, FILL);
-        info_table->attach (track_name_label, 1, 2, 0, 1, FILL, FILL);
-        info_table->attach (clock_label, 0, 1, 1, 2, FILL, FILL);
-        info_table->attach (clock, 1, 2, 1, 2, FILL, FILL);
+       Gtk::Table* info_table = manage (new Gtk::Table (2, 2));
+       info_table->set_col_spacings (5);
+       info_table->set_row_spacings (5);
+       info_table->attach (track_label, 0, 1, 0, 1, FILL, FILL);
+       info_table->attach (track_name_label, 1, 2, 0, 1, FILL, FILL);
+       info_table->attach (clock_label, 0, 1, 1, 2, FILL, FILL);
+       info_table->attach (clock, 1, 2, 1, 2, Gtk::AttachOptions(0), FILL);
 
        Gtk::VBox* vbox = Gtk::manage (new Gtk::VBox ());
        vbox->set_spacing (12);
@@ -88,12 +92,12 @@ RegionLayeringOrderEditor::RegionLayeringOrderEditor (PublicEditor& pe)
        vbox->pack_start (*scroller_table, true, true);
        add (*vbox);
 
-        info_table->set_name ("RegionLayeringOrderTable");
-        scroller_table->set_name ("RegionLayeringOrderTable");
+       info_table->set_name ("RegionLayeringOrderTable");
+       scroller_table->set_name ("RegionLayeringOrderTable");
 
        layering_order_display.set_name ("RegionLayeringOrderDisplay");
-
-       layering_order_display.signal_row_activated ().connect (mem_fun (*this, &RegionLayeringOrderEditor::row_activated));
+       layering_order_display.get_selection()->set_mode (SELECTION_SINGLE);
+       layering_order_display.get_selection()->signal_changed ().connect (mem_fun (*this, &RegionLayeringOrderEditor::row_selected));
 
        layering_order_display.grab_focus ();
 
@@ -103,30 +107,36 @@ RegionLayeringOrderEditor::RegionLayeringOrderEditor (PublicEditor& pe)
 
 RegionLayeringOrderEditor::~RegionLayeringOrderEditor ()
 {
-       
+
 }
 
 void
-RegionLayeringOrderEditor::row_activated (const TreeModel::Path& path, TreeViewColumn*)
+RegionLayeringOrderEditor::row_selected ()
 {
        if (in_row_change) {
                return;
        }
 
-       TreeModel::iterator iter = layering_order_model->get_iter (path);
+       Glib::RefPtr<TreeSelection> selection = layering_order_display.get_selection();
+       TreeModel::iterator iter = selection->get_selected(); // only used with Gtk::SELECTION_SINGLE
 
        if (!iter) {
                return;
        }
-       
+
        TreeModel::Row row = *iter;
        RegionView* rv = row[layering_order_columns.region_view];
-       
+
        vector<RegionView*> eq;
-       editor.get_equivalent_regions (rv, eq, Properties::edit.property_id);
-       
+       editor.get_equivalent_regions (rv, eq, Properties::group_select.property_id);
+
+       /* XXX this should be reversible, really */
+
        for (vector<RegionView*>::iterator i = eq.begin(); i != eq.end(); ++i) {
-               (*i)->region()->raise_to_top ();
+               boost::shared_ptr<Playlist> pl = (*i)->region()->playlist();
+               if (pl) {
+                       pl->raise_region_to_top ((*i)->region());
+               }
        }
 }
 
@@ -140,7 +150,7 @@ void
 RegionLayeringOrderEditor::refill ()
 {
        assert (_time_axis_view);
-       
+
        regions_at_position = 0;
        in_row_change = true;
        layering_order_model->clear ();
@@ -167,18 +177,18 @@ RegionLayeringOrderEditor::refill ()
                newrow[layering_order_columns.name] = (*i)->region()->name();
                newrow[layering_order_columns.region_view] = *i;
 
-               if (i == region_list.begin()) {
-                       layering_order_display.get_selection()->select(newrow);
-               }
+              if (i == region_list.begin()) {
+                      layering_order_display.get_selection()->select(newrow);
+              }
        }
 
        in_row_change = false;
 }
 
 void
-RegionLayeringOrderEditor::set_context (const string& a_name, Session* s, TimeAxisView* tav, boost::shared_ptr<Playlist> pl, framepos_t pos)
+RegionLayeringOrderEditor::set_context (const string& a_name, Session* s, TimeAxisView* tav, boost::shared_ptr<Playlist> pl, samplepos_t pos)
 {
-        track_name_label.set_text (a_name);
+       track_name_label.set_text (a_name);
 
        clock.set_session (s);
        clock.set (pos, true);
@@ -212,7 +222,7 @@ RegionLayeringOrderEditor::on_key_press_event (GdkEventKey* ev)
        }
 
        if (!handled) {
-               handled = key_press_focus_accelerator_handler (editor, ev);
+               handled = relay_key_press (ev, this);
        }
 
        if (!handled) {