NO-OP: mark various state property names as explicitly non-translated
[ardour.git] / gtk2_ardour / route_ui.cc
index feeea3a793687f07bf0312936e1e617d0a4ee900..dd36aa05c981df70dcc1885751390c675b7ba038 100644 (file)
@@ -66,6 +66,7 @@
 #include "keyboard.h"
 #include "latency_gui.h"
 #include "mixer_strip.h"
+#include "patch_change_widget.h"
 #include "plugin_pin_dialog.h"
 #include "rgb_macros.h"
 #include "route_time_axis.h"
@@ -121,6 +122,8 @@ RouteUI::~RouteUI()
                ARDOUR_UI::instance()->gui_object_state->remove_node (route_state_id());
        }
 
+       delete_patch_change_dialog ();
+
        _route.reset (); /* drop reference to route, so that it can be cleaned up */
        route_connections.drop_connections ();
 
@@ -246,6 +249,7 @@ RouteUI::reset ()
        delete mute_menu;
        mute_menu = 0;
 
+       delete_patch_change_dialog ();
        _color_picker.reset ();
 
        denormal_menu_item = 0;
@@ -902,17 +906,10 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
        MonitorChoice mc;
        boost::shared_ptr<RouteList> rl;
 
-       /* XXX for now, monitoring choices are orthogonal. cue monitoring
-          will follow in 3.X but requires mixing the input and playback (disk)
-          signal together, which requires yet more buffers.
-       */
-
        if (t->monitoring_control()->monitoring_choice() & monitor_choice) {
                mc = MonitorChoice (t->monitoring_control()->monitoring_choice() & ~monitor_choice);
        } else {
-               /* this line will change when the options are non-orthogonal */
-               // mc = MonitorChoice (t->monitoring_choice() | monitor_choice);
-               mc = monitor_choice;
+               mc = MonitorChoice (t->monitoring_control()->monitoring_choice() | monitor_choice);
        }
 
        if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
@@ -1613,6 +1610,39 @@ RouteUI::toggle_solo_safe (Gtk::CheckMenuItem* check)
        _route->solo_safe_control()->set_value (check->get_active() ? 1.0 : 0.0, Controllable::UseGroup);
 }
 
+void
+RouteUI::delete_patch_change_dialog ()
+{
+       if (!_route) {
+               return;
+       }
+       delete _route->patch_selector_dialog ();
+       _route->set_patch_selector_dialog (0);
+}
+
+PatchChangeGridDialog*
+RouteUI::patch_change_dialog () const
+{
+       return _route->patch_selector_dialog ();
+}
+
+void
+RouteUI::select_midi_patch ()
+{
+       if (patch_change_dialog ()) {
+               patch_change_dialog()->present ();
+               return;
+       }
+
+       /* note: RouteTimeAxisView is resoponsible to updating
+        * the Dialog (PatchChangeGridDialog::refresh())
+        * when the midnam model changes.
+        */
+       PatchChangeGridDialog* d = new PatchChangeGridDialog (_route);
+       _route->set_patch_selector_dialog (d);
+       d->present ();
+}
+
 /** Ask the user to choose a colour, and then apply that color to my route */
 void
 RouteUI::choose_color ()
@@ -1900,7 +1930,7 @@ RouteUI::save_as_template_dialog_response (int response, SaveTemplateDialog* d)
        if (response == RESPONSE_ACCEPT) {
                const string name = d->get_template_name ();
                const string desc = d->get_description ();
-               const string path = Glib::build_filename(ARDOUR::user_route_template_directory (), name);
+               const string path = Glib::build_filename(ARDOUR::user_route_template_directory (), name + ARDOUR::template_suffix);
 
                if (Glib::file_test (path, Glib::FILE_TEST_EXISTS)) { /* file already exists. */
                        bool overwrite = overwrite_file_dialog (*d,
@@ -2396,3 +2426,11 @@ RouteUI::stripable () const
 {
        return _route;
 }
+
+void
+RouteUI::set_disk_io_point (DiskIOPoint diop)
+{
+       if (_route && is_track()) {
+               track()->set_disk_io_point (diop);
+       }
+}