Allow edit group creation from the route UI's menu. Allow new tracks to be put in...
[ardour.git] / gtk2_ardour / route_time_axis.cc
index 2b622bda2822fc27665be00d7a07f519d83b6596..3a75ea5b19ce8932bcec4f37650e14dfa8192935 100644 (file)
@@ -40,6 +40,7 @@
 #include <gtkmm2ext/bindable_button.h>
 #include <gtkmm2ext/utils.h>
 
+#include "ardour/amp.h"
 #include "ardour/audioplaylist.h"
 #include "ardour/diskstream.h"
 #include "ardour/event_type_map.h"
@@ -74,6 +75,7 @@
 #include "simplerect.h"
 #include "streamview.h"
 #include "utils.h"
+#include "route_group_dialog.h"
 
 #include "ardour/track.h"
 
@@ -110,7 +112,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
          visual_button (_("v")),
          gm (sess, slider, true)
 {
-       gm.set_io (rt);
+       gm.set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp());
        gm.get_level_meter().set_no_show_all();
        gm.get_level_meter().setup_meters(50);
 
@@ -187,8 +189,8 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
        controls_hbox.pack_start(gm.get_level_meter(), false, false);
        _route->meter_change.connect (mem_fun(*this, &RouteTimeAxisView::meter_changed));
-       _route->input_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
-       _route->output_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+       _route->input()->changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+       _route->output()->changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
 
        controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
        controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
@@ -231,7 +233,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
        _route->solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
        _route->processors_changed.connect (mem_fun(*this, &RouteTimeAxisView::processors_changed));
        _route->NameChanged.connect (mem_fun(*this, &RouteTimeAxisView::route_name_changed));
-       _route->solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
+       _route->solo_isolated_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
 
 
        if (is_track()) {
@@ -319,13 +321,18 @@ RouteTimeAxisView::edit_click (GdkEventButton *ev)
        RadioMenuItem::Group group;
 
        items.clear ();
+
+       items.push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteTimeAxisView::set_edit_group_to_new)));
+
+       items.push_back (SeparatorElem ());
+       
        items.push_back (RadioMenuElem (group, _("No group"), 
                                        bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), (RouteGroup *) 0)));
        
        if (_route->edit_group() == 0) {
                static_cast<RadioMenuItem*>(&items.back())->set_active ();
        }
-       
+
        _session.foreach_edit_group (bind (mem_fun (*this, &RouteTimeAxisView::add_edit_group_menu_item), &group));
        edit_group_menu.popup (ev->button, ev->time);
 
@@ -821,7 +828,11 @@ RouteTimeAxisView::set_height (uint32_t h)
 
                gm.get_gain_slider().show();
                mute_button->show();
-               solo_button->show();
+               if (!_route || _route->is_master()) {
+                       solo_button->hide();
+               } else {
+                       solo_button->show();
+               }
                if (rec_enable_button)
                        rec_enable_button->show();
 
@@ -843,7 +854,11 @@ RouteTimeAxisView::set_height (uint32_t h)
 
                gm.get_gain_slider().hide();
                mute_button->show();
-               solo_button->show();
+               if (!_route || _route->is_master()) {
+                       solo_button->hide();
+               } else {
+                       solo_button->show();
+               }
                if (rec_enable_button)
                        rec_enable_button->show();
 
@@ -1346,11 +1361,14 @@ RouteTimeAxisView::name_entry_changed ()
                return;
        }
 
-       if (_session.route_name_unique (x)) {
-               _route->set_name (x);
-       } else {
+       if (!_session.route_name_unique (x)) {
                ARDOUR_UI::instance()->popup_error (_("A track already exists with that name"));
                name_entry.set_text (_route->name());
+       } else if (_session.route_name_internal (x)) {
+               ARDOUR_UI::instance()->popup_error (_("You cannot create a track with that name as it is reserved for Ardour"));
+               name_entry.set_text (_route->name());
+       } else {
+               _route->set_name (x);
        }
 }
 
@@ -2389,3 +2407,19 @@ RouteTimeAxisView::remove_underlay(StreamView* v)
        }
 }
 
+void
+RouteTimeAxisView::set_edit_group_to_new ()
+{
+       RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
+       g->set_active (true, this);
+
+       RouteGroupDialog d (g);
+       int const r = d.do_run ();
+
+       if (r == Gtk::RESPONSE_OK) {
+               _session.add_edit_group (g);
+               _route->set_edit_group (g, this);
+       } else {
+               delete g;
+       }
+}