fix crash when trying to create a non-template track/bus with >2 channels; put MIDI...
[ardour.git] / gtk2_ardour / group_tabs.cc
index d9c34ed675a8280a2dfc68c1933a4fd959e74bfd..995d41dfef8b370ae5fe5a94882ce611ec1cbf21 100644 (file)
 #include "ardour/route_group.h"
 #include "route_group_dialog.h"
 #include "group_tabs.h"
+#include "keyboard.h"
 #include "i18n.h"
 
 using namespace std;
 using namespace Gtk;
 using namespace ARDOUR;
 
-GroupTabs::GroupTabs ()
-       : _session (0),
+GroupTabs::GroupTabs (Editor* e)
+       : EditorComponent (e),
          _dragging (0)
 {
 
 }
 
 void
-GroupTabs::set_session (Session* s)
+GroupTabs::connect_to_session (Session* s)
 {
-       _session = s;
-       s->RouteGroupChanged.connect (mem_fun (*this, &GroupTabs::set_dirty));
+       EditorComponent::connect_to_session (s);
+
+       _session_connections.push_back (_session->RouteGroupChanged.connect (mem_fun (*this, &GroupTabs::set_dirty)));
 }
 
 
@@ -85,7 +87,10 @@ GroupTabs::on_button_press_event (GdkEventButton* ev)
        } else if (ev->button == 3) {
 
                RouteGroup* g = t ? t->group : 0;
-               get_menu(g)->popup (ev->button, ev->time);
+               Menu* m = get_menu (g);
+               if (m) {
+                       m->popup (ev->button, ev->time);
+               }
                
        }
 
@@ -158,9 +163,21 @@ GroupTabs::on_button_release_event (GdkEventButton* ev)
        }
 
        if (!_drag_moved) {
-               /* toggle active state */
-               _dragging->group->set_active (!_dragging->group->is_active (), this);
-               _dragging = 0;
+
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+
+                       /* edit */
+                       RouteGroupDialog d (_dragging->group, Gtk::Stock::APPLY);
+                       d.do_run ();
+
+               } else {
+               
+                       /* toggle active state */
+                       _dragging->group->set_active (!_dragging->group->is_active (), this);
+                       _dragging = 0;
+                       
+               }
+               
        } else {
                /* finish drag */
                _dragging = 0;