OSC: fix monitor input/disk buttons so both can be on
[ardour.git] / libs / surfaces / osc / osc_gui.cc
index 7a64aa27bf9737b7541ff0e903a245043e926f8f..e1ae8bdea5d0eaf05548c78d3fb8e66839b1a007 100644 (file)
@@ -22,7 +22,6 @@
 #include <list>
 #include <string>
 #include <vector>
-//#include <glibmm/miscutils.h>
 
 #include <errno.h>
 
@@ -59,8 +58,7 @@ OSC_GUI::OSC_GUI (OSC& p)
        int n = 0; // table row
        Table* table = manage (new Table);
        Label* label;
-       Button* button;
-       table->set_row_spacings (10);
+       table->set_row_spacings (16);
        table->set_col_spacings (6);
        table->set_border_width (12);
        get_session ();
@@ -80,8 +78,8 @@ OSC_GUI::OSC_GUI (OSC& p)
        table->attach (*label, 0, 1, n, n+1, AttachOptions(FILL|EXPAND), AttachOptions(0));
        table->attach (portmode_combo, 1, 2, n, n+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
        std::vector<std::string> portmode_options;
-       portmode_options.push_back (_("Auto"));
-       portmode_options.push_back (_("Manual"));
+       portmode_options.push_back (_("Auto - Reply to Originating Port"));
+       portmode_options.push_back (_("Manual - Specify Below"));
 
        set_popdown_strings (portmode_combo, portmode_options);
        portmode_combo.set_active ((int)cp.get_portmode());
@@ -182,21 +180,17 @@ OSC_GUI::OSC_GUI (OSC& p)
        preset_combo.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::preset_changed));
        ++n;
 
-       // refresh button
-       button = manage (new Gtk::Button(_("Clear OSC Devices")));
-       table->attach (*button, 0, 2, n, n+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 10);
-
        table->show_all ();
        append_page (*table, _("OSC Setup"));
 
        debug_combo.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::debug_changed));
        portmode_combo.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::portmode_changed));
        gainmode_combo.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::gainmode_changed));
-       button->signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::clear_device));
-       port_entry.signal_activate().connect (sigc::mem_fun (*this, &OSC_GUI::port_changed));
-       bank_entry.signal_activate().connect (sigc::mem_fun (*this, &OSC_GUI::bank_changed));
-       send_page_entry.signal_activate().connect (sigc::mem_fun (*this, &OSC_GUI::send_page_changed));
-       plugin_page_entry.signal_activate().connect (sigc::mem_fun (*this, &OSC_GUI::plugin_page_changed));
+       port_entry.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::port_changed));
+       port_entry.signal_focus_out_event().connect (sigc::mem_fun (*this, &OSC_GUI::port_focus_out));
+       bank_entry.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::bank_changed));
+       send_page_entry.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::send_page_changed));
+       plugin_page_entry.signal_changed().connect (sigc::mem_fun (*this, &OSC_GUI::plugin_page_changed));
 
        // Strip Types Calculate Page
        int stn = 0; // table row
@@ -278,6 +272,12 @@ OSC_GUI::OSC_GUI (OSC& p)
        sttable->attach (hidden_tracks, 1, 2, stn, stn+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
        ++stn;
 
+       label = manage (new Gtk::Label(_("Use Groups:")));
+       label->set_alignment(1, .5);
+       sttable->attach (*label, 0, 1, stn, stn+1, AttachOptions(FILL|EXPAND), AttachOptions(0));
+       sttable->attach (usegroups, 1, 2, stn, stn+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
+       ++stn;
+
 
        sttable->show_all ();
        append_page (*sttable, _("Default Strip Types"));
@@ -408,6 +408,7 @@ OSC_GUI::OSC_GUI (OSC& p)
        monitor_type.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
        selected_tracks.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
        hidden_tracks.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
+       usegroups.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
        strip_buttons_button.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
        strip_control_button.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
        ssid_as_path.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
@@ -503,18 +504,12 @@ OSC_GUI::debug_changed ()
 void
 OSC_GUI::portmode_changed ()
 {
-       std::string str = portmode_combo.get_active_text ();
-       if (str == _("Auto")) {
-               cp.set_portmode (0);
-               port_entry.set_sensitive (false);
-       }
-       else if (str == _("Manual")) {
-               cp.set_portmode (1);
+       int pm = portmode_combo.get_active_row_number ();
+       cp.set_portmode (pm);
+       if (pm) {
                port_entry.set_sensitive (true);
-       }
-       else {
-               std::cerr << "Invalid OSC Port Mode\n";
-               assert (0);
+       } else {
+               port_entry.set_sensitive (false);
        }
        save_user ();
 }
@@ -523,18 +518,34 @@ void
 OSC_GUI::port_changed ()
 {
        std::string str = port_entry.get_text ();
-       if (port_entry.get_value() == 3819) {
-               str = "8000";
-               port_entry.set_value (8000);
+       int prt = atoi (str.c_str());
+       if (prt == 3819 || prt < 1024) {
+               // indicate non-valid text
+               port_entry.set_progress_fraction (1.0);
+       } else {
+               port_entry.set_progress_fraction (0.0);
+               cp.set_remote_port (string_compose ("%1", prt));
+               save_user ();
        }
-       cp.set_remote_port (str);
-       save_user ();
+}
+
+bool
+OSC_GUI::port_focus_out (GdkEventFocus* )
+{
+       std::string str = port_entry.get_text ();
+       int prt = atoi (str.c_str());
+       if (prt == 3819 || prt < 1024) {
+               port_entry.set_text(cp.get_remote_port().c_str());
+               port_entry.set_progress_fraction (0.0);
+       }
+       return false;
 }
 
 void
 OSC_GUI::bank_changed ()
 {
-       uint32_t bsize = bank_entry.get_value ();
+       uint32_t bsize = atoi(bank_entry.get_text ());
+       bank_entry.set_text (string_compose ("%1", bsize));
        cp.set_banksize (bsize);
        save_user ();
 
@@ -543,7 +554,8 @@ OSC_GUI::bank_changed ()
 void
 OSC_GUI::send_page_changed ()
 {
-       uint32_t ssize = send_page_entry.get_value ();
+       uint32_t ssize = atoi (send_page_entry.get_text ());
+       send_page_entry.set_text (string_compose ("%1", ssize));
        cp.set_send_size (ssize);
        save_user ();
 
@@ -552,7 +564,8 @@ OSC_GUI::send_page_changed ()
 void
 OSC_GUI::plugin_page_changed ()
 {
-       uint32_t psize = plugin_page_entry.get_value ();
+       uint32_t psize = atoi (plugin_page_entry.get_text ());
+       plugin_page_entry.set_text (string_compose ("%1", psize));
        cp.set_plugin_size (psize);
        save_user ();
 
@@ -606,20 +619,20 @@ void
 OSC_GUI::factory_reset ()
 {
        cp.set_banksize (0);
-       bank_entry.set_value (0);
+       bank_entry.set_text ("0");
        cp.set_send_size (0);
-       send_page_entry.set_value (0);
+       send_page_entry.set_text ("0");
        cp.set_plugin_size (0);
-       plugin_page_entry.set_value (0);
+       plugin_page_entry.set_text ("0");
        cp.set_defaultstrip (159);
        cp.set_defaultfeedback (0);
        reshow_values ();
        cp.set_gainmode (0);
        gainmode_combo.set_active (0);
-       cp.set_portmode (0);
-       portmode_combo.set_active (0);
+       cp.set_portmode (1);
+       portmode_combo.set_active (1);
        cp.set_remote_port ("8000");
-       port_entry.set_value (8000);
+       port_entry.set_text ("8000");
        cp.clear_devices ();
        cp.gui_changed ();
 }
@@ -638,6 +651,7 @@ OSC_GUI::reshow_values ()
        audio_auxes.set_active(def_strip & 128);
        selected_tracks.set_active(def_strip & 256);
        hidden_tracks.set_active(def_strip & 512);
+       usegroups.set_active(def_strip & 1024);
        def_feedback = cp.get_defaultfeedback();
        strip_buttons_button.set_active(def_feedback & 1);
        strip_control_button.set_active(def_feedback & 2);
@@ -746,6 +760,9 @@ OSC_GUI::calculate_strip_types ()
        if (hidden_tracks.get_active()) {
                stvalue += 512;
        }
+       if (usegroups.get_active()) {
+               stvalue += 1024;
+       }
 
        current_strip_types.set_text(string_compose("%1", stvalue));
 }
@@ -874,6 +891,7 @@ OSC_GUI::save_user ()
        }
        preset_combo.set_active (2);
        cp.gui_changed();
+       clear_device ();
 
 }
 
@@ -923,24 +941,24 @@ OSC_GUI::load_preset (std::string preset)
                }
                if ((child = root->child ("Bank-Size")) == 0 || (prop = child->property ("value")) == 0) {
                        cp.set_banksize (sesn_bank);
-                       bank_entry.set_value (sesn_bank);
+                       bank_entry.set_text (string_compose("%1", sesn_bank));
                } else {
                        cp.set_banksize (atoi (prop->value().c_str()));
-                       bank_entry.set_value (atoi (prop->value().c_str()));
+                       bank_entry.set_text (prop->value().c_str());
                }
                if ((child = root->child ("Send-Size")) == 0 || (prop = child->property ("value")) == 0) {
                        cp.set_send_size (sesn_send);
-                       send_page_entry.set_value (sesn_send);
+                       send_page_entry.set_text (string_compose("%1", sesn_send));
                } else {
                        cp.set_send_size (atoi (prop->value().c_str()));
-                       send_page_entry.set_value (atoi (prop->value().c_str()));
+                       send_page_entry.set_text (prop->value().c_str());
                }
                if ((child = root->child ("Plugin-Size")) == 0 || (prop = child->property ("value")) == 0) {
                        cp.set_plugin_size (sesn_plugin);
-                       plugin_page_entry.set_value (sesn_plugin);
+                       plugin_page_entry.set_text (string_compose("%1", sesn_plugin));
                } else {
                        cp.set_plugin_size (atoi (prop->value().c_str()));
-                       plugin_page_entry.set_value (atoi (prop->value().c_str()));
+                       plugin_page_entry.set_text (prop->value().c_str());
                }
                if ((child = root->child ("Strip-Types")) == 0 || (prop = child->property ("value")) == 0) {
                        cp.set_defaultstrip (sesn_strips);
@@ -962,6 +980,7 @@ OSC_GUI::load_preset (std::string preset)
                        gainmode_combo.set_active (atoi (prop->value().c_str()));
                }
                cp.gui_changed();
+               clear_device ();
 
        }
 }
@@ -987,11 +1006,11 @@ OSC_GUI::restore_sesn_values ()
        cp.set_remote_port (sesn_port);
        port_entry.set_text (sesn_port);
        cp.set_banksize (sesn_bank);
-       bank_entry.set_value (sesn_bank);
+       bank_entry.set_text (string_compose ("%1", sesn_bank));
        cp.set_send_size (sesn_send);
-       send_page_entry.set_value (sesn_send);
+       send_page_entry.set_text (string_compose ("%1", sesn_send));
        cp.set_plugin_size (sesn_plugin);
-       plugin_page_entry.set_value (sesn_plugin);
+       plugin_page_entry.set_text (string_compose ("%1", sesn_plugin));
        cp.set_defaultstrip (sesn_strips);
        cp.set_defaultfeedback (sesn_feedback);
        reshow_values ();