Compact the port matrix slightly, and fix a couple of minor layout bugs.
[ardour.git] / gtk2_ardour / rc_option_editor.cc
index 2f232d37c48fe8672ac06e551bb4ee4edae3e1ae..1ce53e80aa08e662007d6f0e9d0b502ff62d5552 100644 (file)
@@ -2,9 +2,11 @@
 #include <gtkmm/stock.h>
 #include <gtkmm/scale.h>
 #include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/slider_controller.h>
 #include "pbd/fpu.h"
 #include "midi++/manager.h"
 #include "midi++/factory.h"
+#include "ardour/dB.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/control_protocol_manager.h"
 #include "control_protocol/control_protocol.h"
@@ -53,25 +55,25 @@ public:
                t->set_spacings (12);
 
                int n = 0;
-               Label* l = manage (new Label (_("MTC:")));
+               Label* l = manage (new Label (_("Receive MTC via:")));
                l->set_alignment (1, 0.5);
                t->attach (*l, 0, 1, n, n + 1, EXPAND | FILL, FILL);
                t->attach (_mtc_combo, 1, 2, n, n + 1, EXPAND | FILL, EXPAND | FILL);
                ++n;
-               
-               l = manage (new Label (_("MIDI clock:")));
+
+               l = manage (new Label (_("Receive MIDI clock via:")));
                l->set_alignment (1, 0.5);
                t->attach (*l, 0, 1, n, n + 1, FILL, FILL);
                t->attach (_midi_clock_combo, 1, 2, n, n + 1, FILL, FILL);
                ++n;
 
-               l = manage (new Label (_("MMC:")));
+               l = manage (new Label (_("Receive MMC via:")));
                l->set_alignment (1, 0.5);
                t->attach (*l, 0, 1, n, n + 1, FILL, FILL);
                t->attach (_mmc_combo, 1, 2, n, n + 1, FILL, FILL);
                ++n;
 
-               l = manage (new Label (_("MIDI parameter control:")));
+               l = manage (new Label (_("Receive MIDI parameter control via:")));
                l->set_alignment (1, 0.5);
                t->attach (*l, 0, 1, n, n + 1, FILL, FILL);
                t->attach (_mpc_combo, 1, 2, n, n + 1, FILL, FILL);
@@ -100,7 +102,7 @@ public:
                        _mpc_combo.set_active_text (_rc_config->get_midi_port_name());
                } else if (p == "midi-clock-port-name") {
                        _midi_clock_combo.set_active_text (_rc_config->get_midi_clock_port_name());
-               } 
+               }
        }
 
        void set_state_from_config ()
@@ -130,10 +132,10 @@ public:
        {
                _rc_config->set_midi_clock_port_name (_midi_clock_combo.get_active_text());
        }
-       
+
 private:
 
-       void model_changed (TreeModel::Path const & p, TreeModel::iterator const & i)
+       void model_changed (TreeModel::Path const &, TreeModel::iterator const & i)
        {
                TreeModel::Row r = *i;
 
@@ -143,7 +145,7 @@ private:
                }
 
                if (port->input()) {
-                       
+
                        if (r[_model.online] == port->input()->offline()) {
                                port->input()->set_offline (!r[_model.online]);
                        }
@@ -158,11 +160,11 @@ private:
                        if (r[_model.trace_output] != port->output()->tracing()) {
                                port->output()->trace (r[_model.trace_output], &cerr, string (port->name()) + _(" output: "));
                        }
-                       
+
                }
 
-               
-                               
+
+
        }
 
        void setup_ports_combo (ComboBoxText& c)
@@ -226,7 +228,7 @@ private:
                dialog.set_position (WIN_POS_MOUSE);
 
                dialog.show ();
-               
+
                int const r = dialog.run ();
 
                switch (r) {
@@ -249,17 +251,17 @@ private:
                }
 
                XMLNode node (X_("MIDI-port"));
-               
+
                node.add_property ("tag", dialog.port_name.get_text());
                node.add_property ("device", X_("ardour")); // XXX this can't be right for all types
                node.add_property ("type", MIDI::PortFactory::default_port_type());
                node.add_property ("mode", smod);
-               
+
                if (MIDI::Manager::instance()->add_port (node) != 0) {
                        ports_changed ();
                }
        }
-       
+
        class MIDIModelColumns : public TreeModelColumnRecord
        {
        public:
@@ -319,7 +321,7 @@ public:
 
                _box->pack_start (*t, false, false);
        }
-       
+
        void parameter_changed (string const & p)
        {
                if (p == "click-sound") {
@@ -335,7 +337,7 @@ public:
                parameter_changed ("click-emphasis-sound");
        }
 
-private:       
+private:
 
        void click_browse_clicked ()
        {
@@ -343,7 +345,7 @@ private:
 
                sfdb.show_all ();
                sfdb.present ();
-               
+
                if (sfdb.run () == RESPONSE_OK) {
                        click_chosen (sfdb.get_filename());
                }
@@ -361,7 +363,7 @@ private:
 
                sfdb.show_all ();
                sfdb.present ();
-               
+
                if (sfdb.run () == RESPONSE_OK) {
                        click_emphasis_chosen (sfdb.get_filename());
                }
@@ -461,7 +463,7 @@ public:
        {
                _rc_config->set_saved_history_depth (_save_undo_spin.get_value_as_int ());
        }
-       
+
 private:
        RCConfiguration* _rc_config;
        CheckButton _limit_undo_button;
@@ -477,12 +479,13 @@ static const struct {
     guint modifier;
 } modifiers[] = {
 
+       { "Unmodified", 0 },
+
 #ifdef GTKOSX
 
        /* Command = Meta
           Option/Alt = Mod1
        */
-
        { "Shift", GDK_SHIFT_MASK },
        { "Command", GDK_META_MASK },
        { "Control", GDK_CONTROL_MASK },
@@ -513,11 +516,11 @@ class KeyboardOptions : public OptionEditorBox
 {
 public:
        KeyboardOptions () :
-                 _delete_button_adjustment (3, 1, 5),
+                 _delete_button_adjustment (3, 1, 12),
                  _delete_button_spin (_delete_button_adjustment),
                  _edit_button_adjustment (3, 1, 5),
                  _edit_button_spin (_edit_button_adjustment)
-               
+
        {
                /* internationalize and prepare for use with combos */
 
@@ -593,7 +596,7 @@ public:
                        }
                }
 
-               l = manage (new Label (_("Ignore snap using:")));
+               l = manage (new Label (_("Toggle snap using:")));
                l->set_name ("OptionsLabel");
                l->set_alignment (1.0, 0.5);
 
@@ -620,7 +623,7 @@ public:
                _box->pack_start (*t, false, false);
        }
 
-       void parameter_changed (string const & p)
+       void parameter_changed (string const &)
        {
                /* XXX: these aren't really config options... */
        }
@@ -637,7 +640,7 @@ private:
                string const txt = _keyboard_layout_selector.get_active_text();
 
                /* XXX: config...?  for all this keyboard stuff */
-               
+
                for (map<string,string>::iterator i = Keyboard::binding_files.begin(); i != Keyboard::binding_files.end(); ++i) {
                        if (txt == i->first) {
                                if (Keyboard::load_keybindings (i->second)) {
@@ -650,7 +653,7 @@ private:
        void edit_modifier_chosen ()
        {
                string const txt = _edit_modifier_combo.get_active_text();
-               
+
                for (int i = 0; modifiers[i].name; ++i) {
                        if (txt == _(modifiers[i].name)) {
                                Keyboard::set_edit_modifier (modifiers[i].modifier);
@@ -662,7 +665,7 @@ private:
        void delete_modifier_chosen ()
        {
                string const txt = _delete_modifier_combo.get_active_text();
-               
+
                for (int i = 0; modifiers[i].name; ++i) {
                        if (txt == _(modifiers[i].name)) {
                                Keyboard::set_delete_modifier (modifiers[i].modifier);
@@ -670,11 +673,11 @@ private:
                        }
                }
        }
-       
+
        void snap_modifier_chosen ()
        {
                string const txt = _snap_modifier_combo.get_active_text();
-               
+
                for (int i = 0; modifiers[i].name; ++i) {
                        if (txt == _(modifiers[i].name)) {
                                Keyboard::set_snap_modifier (modifiers[i].modifier);
@@ -692,7 +695,7 @@ private:
        {
                Keyboard::set_edit_button (_edit_button_spin.get_value_as_int());
        }
-       
+
        ComboBoxText _keyboard_layout_selector;
        ComboBoxText _edit_modifier_combo;
        ComboBoxText _delete_modifier_combo;
@@ -711,7 +714,7 @@ public:
                _dpi_adjustment (50, 50, 250, 1, 10),
                _dpi_slider (_dpi_adjustment)
        {
-               _dpi_adjustment.set_value (_rc_config->get_font_scale ());
+               _dpi_adjustment.set_value (_rc_config->get_font_scale () / 1024);
 
                Label* l = manage (new Label (_("Font scaling:")));
                l->set_name ("OptionsLabel");
@@ -730,7 +733,7 @@ public:
        void parameter_changed (string const & p)
        {
                if (p == "font-scale") {
-                       _dpi_adjustment.set_value (_rc_config->get_font_scale() / 1024.);
+                       _dpi_adjustment.set_value (_rc_config->get_font_scale() / 1024);
                }
        }
 
@@ -738,9 +741,9 @@ public:
        {
                parameter_changed ("font-scale");
        }
-       
+
 private:
-       
+
        void dpi_changed ()
        {
                _rc_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024));
@@ -753,6 +756,80 @@ private:
        HScale _dpi_slider;
 };
 
+class SoloMuteOptions : public OptionEditorBox
+{
+public:
+       SoloMuteOptions (RCConfiguration* c) :
+               _rc_config (c),
+               // 0.781787 is the value needed for gain to be set to 0.
+               _db_adjustment (0.781787, 0.0, 1.0, 0.01, 0.1)
+
+       {
+               if ((pix = ::get_icon ("fader_belt_h")) == 0) {
+                       throw failed_constructor();
+               }
+
+               _db_slider = manage (new HSliderController (pix,
+                                                           &_db_adjustment,
+                                                           false));
+
+
+               parameter_changed ("solo-mute-gain");
+
+               Label* l = manage (new Label (_("Solo mute cut (dB):")));
+               l->set_name ("OptionsLabel");
+
+               HBox* h = manage (new HBox);
+               h->set_spacing (4);
+               h->pack_start (*l, false, false);
+               h->pack_start (*_db_slider, false, false);
+               h->pack_start (_db_display, false, false);
+
+               set_size_request_to_display_given_text (_db_display, "-99.0", 12, 12);
+
+               _box->pack_start (*h, false, false);
+
+               _db_adjustment.signal_value_changed().connect (mem_fun (*this, &SoloMuteOptions::db_changed));
+       }
+
+       void parameter_changed (string const & p)
+       {
+               if (p == "solo-mute-gain") {
+                       gain_t val = _rc_config->get_solo_mute_gain();
+
+                       _db_adjustment.set_value (gain_to_slider_position (val));
+
+                       char buf[16];
+
+                       if (val == 0.0) {
+                               snprintf (buf, sizeof (buf), "-inf");
+                       } else {
+                               snprintf (buf, sizeof (buf), "%.2f", accurate_coefficient_to_dB (val));
+                       }
+
+                       _db_display.set_text (buf);
+               }
+       }
+
+       void set_state_from_config ()
+       {
+               parameter_changed ("solo-mute-gain");
+       }
+
+private:
+
+       void db_changed ()
+       {
+               _rc_config->set_solo_mute_gain (slider_position_to_gain (_db_adjustment.get_value()));
+       }
+
+       RCConfiguration* _rc_config;
+       Adjustment _db_adjustment;
+        Gtkmm2ext::HSliderController* _db_slider;
+        Glib::RefPtr<Gdk::Pixbuf> pix;
+        Entry _db_display;
+};
+
 
 class ControlSurfacesOptions : public OptionEditorBox
 {
@@ -780,7 +857,7 @@ public:
        void set_state_from_config ()
        {
                _store->clear ();
-               
+
                ControlProtocolManager& m = ControlProtocolManager::instance ();
                for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
 
@@ -796,7 +873,7 @@ public:
 
 private:
 
-       void model_changed (TreeModel::Path const & p, TreeModel::iterator const & i)
+       void model_changed (TreeModel::Path const &, TreeModel::iterator const & i)
        {
                TreeModel::Row r = *i;
 
@@ -827,7 +904,7 @@ private:
         class ControlSurfacesModelColumns : public TreeModelColumnRecord
        {
        public:
-               
+
                ControlSurfacesModelColumns ()
                {
                        add (name);
@@ -855,7 +932,7 @@ RCOptionEditor::RCOptionEditor ()
        /* MISC */
 
        add_option (_("Misc"), new OptionEditorHeading (_("Metering")));
-       
+
        ComboOption<float>* mht = new ComboOption<float> (
                "meter-hold",
                _("Meter hold time"),
@@ -867,7 +944,7 @@ RCOptionEditor::RCOptionEditor ()
        mht->add (MeterHoldShort, _("short"));
        mht->add (MeterHoldMedium, _("medium"));
        mht->add (MeterHoldLong, _("long"));
-       
+
        add_option (_("Misc"), mht);
 
        ComboOption<float>* mfo = new ComboOption<float> (
@@ -888,15 +965,15 @@ RCOptionEditor::RCOptionEditor ()
        add_option (_("Misc"), mfo);
 
        add_option (_("Misc"), new OptionEditorHeading (_("Undo")));
-       
+
        add_option (_("Misc"), new UndoOptions (_rc_config));
 
        add_option (_("Misc"), new OptionEditorHeading (_("Misc")));
-       
+
 #ifndef GTKOSX
        /* font scaling does nothing with GDK/Quartz */
        add_option (_("Misc"), new FontScalingOptions (_rc_config));
-#endif 
+#endif
 
        add_option (_("Misc"),
             new BoolOption (
@@ -905,7 +982,7 @@ RCOptionEditor::RCOptionEditor ()
                     mem_fun (*_rc_config, &RCConfiguration::get_verify_remove_last_capture),
                     mem_fun (*_rc_config, &RCConfiguration::set_verify_remove_last_capture)
                     ));
-       
+
        add_option (_("Misc"),
             new BoolOption (
                     "periodic-safety-backups",
@@ -1065,7 +1142,7 @@ RCOptionEditor::RCOptionEditor ()
        wfs->add (Logarithmic, _("logarithmic"));
 
        add_option (_("Editor"), wfs);
-       
+
        ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
                "waveform-shape",
                _("Waveform shape"),
@@ -1082,18 +1159,27 @@ RCOptionEditor::RCOptionEditor ()
 
        add_option (_("Audio"), new OptionEditorHeading (_("Solo")));
 
-       ComboOption<SoloModel>* sm = new ComboOption<SoloModel> (
-               "solo-model",
-               _("Solo"),
-               mem_fun (*_rc_config, &RCConfiguration::get_solo_model),
-               mem_fun (*_rc_config, &RCConfiguration::set_solo_model)
+
+       add_option (_("Audio"),
+            new BoolOption (
+                    "solo-control-is-listen-control",
+                    _("Solo controls are Listen controls"),
+                    mem_fun (*_rc_config, &RCConfiguration::get_solo_control_is_listen_control),
+                    mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control)
+                    ));
+
+       ComboOption<ListenPosition>* lp = new ComboOption<ListenPosition> (
+               "listen-position",
+               _("Listen Position"),
+               mem_fun (*_rc_config, &RCConfiguration::get_listen_position),
+               mem_fun (*_rc_config, &RCConfiguration::set_listen_position)
                );
 
-       sm->add (SoloInPlace, _("in place"));
-       sm->add (SoloAFL, _("post-fader listen via monitor bus"));
-       sm->add (SoloPFL, _("pre-fader listen via monitor bus"));
+       lp->add (AfterFaderListen, _("after-fader listen"));
+       lp->add (PreFaderListen, _("pre-fader listen"));
 
-       add_option (_("Audio"), sm);
+       add_option (_("Audio"), lp);
+       add_option (_("Audio"), new SoloMuteOptions (_rc_config));
 
        add_option (_("Audio"),
             new BoolOption (
@@ -1193,23 +1279,23 @@ RCOptionEditor::RCOptionEditor ()
                mem_fun (*_rc_config, &RCConfiguration::get_denormal_model),
                mem_fun (*_rc_config, &RCConfiguration::set_denormal_model)
                );
-       
+
        dm->add (DenormalNone, _("no processor handling"));
-       
+
        FPU fpu;
-       
+
        if (fpu.has_flush_to_zero()) {
                dm->add (DenormalFTZ, _("use FlushToZero"));
        }
-       
+
        if (fpu.has_denormals_are_zero()) {
                dm->add (DenormalDAZ, _("use DenormalsAreZero"));
        }
-       
+
        if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
                dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZerO"));
        }
-       
+
        add_option (_("Audio"), dm);
 
        add_option (_("Audio"), new OptionEditorHeading (_("Plugins")));