audioengine branch can now load and run at least one test session.
[ardour.git] / gtk2_ardour / generic_pluginui.cc
index f7110740eeeb0e6b30851ab88b995a971fe2bdc1..971dfc0e9ba7638426afa281f1808b6607d3973f 100644 (file)
@@ -101,6 +101,9 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
        VBox* v1_box = manage (new VBox);
        VBox* v2_box = manage (new VBox);
        pack_end (plugin_analysis_expander, false, false);
+       if (!plugin->get_docs().empty()) {
+               pack_end (description_expander, false, false);
+       }
 
        v1_box->pack_start (*smaller_hbox, false, true);
        v2_box->pack_start (focus_button, false, true);
@@ -127,11 +130,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
 
        pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context());
 
-       if (!pi->active()) {
-               bypass_button.set_active_state (Gtkmm2ext::Active);
-       } else {
-               bypass_button.unset_active_state ();
-       }
+       bypass_button.set_active (!pi->active());
 
        prefheight = 0;
        build ();
@@ -257,6 +256,10 @@ GenericPluginUI::build ()
                                continue;
                        }
 
+                       if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("hidden")) {
+                               continue;
+                       }
+
                        ControlUI* cui;
 
                        boost::shared_ptr<ARDOUR::AutomationControl> c
@@ -268,6 +271,11 @@ GenericPluginUI::build ()
                                continue;
                        }
 
+                       const std::string param_docs = plugin->get_parameter_docs(i);
+                       if (!param_docs.empty()) {
+                               ARDOUR_UI::instance()->set_tip(cui, param_docs.c_str());
+                       }
+
                        if (cui->controller || cui->clickbox || cui->combo) {
                                // Get all of the controls into a list, so that
                                // we can lay them out a bit more nicely later.
@@ -443,9 +451,8 @@ GenericPluginUI::automation_state_changed (ControlUI* cui)
 
        // don't lock to avoid deadlock because we're triggered by
        // AutomationControl::Changed() while the automation lock is taken
-       switch (insert->get_parameter_automation_state (cui->parameter())
-                       & (Off|Play|Touch|Write)) {
-       case Off:
+       switch (insert->get_parameter_automation_state (cui->parameter()) & (ARDOUR::Off|Play|Touch|Write)) {
+       case ARDOUR::Off:
                cui->automate_button.set_label (S_("Automation|Manual"));
                break;
        case Play:
@@ -464,9 +471,25 @@ GenericPluginUI::automation_state_changed (ControlUI* cui)
 }
 
 
-static void integer_printer (char buf[32], Adjustment &adj, void */*arg*/)
+bool
+GenericPluginUI::integer_printer (char buf[32], Adjustment &adj, ControlUI* cui)
 {
-       snprintf (buf, 32, "%.0f", adj.get_value());
+       float const v = adj.get_value ();
+       
+       if (cui->scale_points) {
+               Plugin::ScalePoints::const_iterator i = cui->scale_points->begin ();
+               while (i != cui->scale_points->end() && i->second != v) {
+                       ++i;
+               }
+
+               if (i != cui->scale_points->end ()) {
+                       snprintf (buf, 32, "%s", i->first.c_str());
+                       return true;
+               }
+       }
+               
+       snprintf (buf, 32, "%.0f", v);
+       return true;
 }
 
 void
@@ -499,15 +522,25 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 
        if (plugin->parameter_is_input(port_index)) {
 
-               /* Build a combo box */
+               /* See if there any named values for our input value */
+               control_ui->scale_points = plugin->get_scale_points (port_index);
+
+               /* If this parameter is an integer, work out the number of distinct values
+                  it can take on (assuming that lower and upper values are allowed).
+               */
+               int const steps = desc.integer_step ? (desc.upper - desc.lower + 1) / desc.step : 0;
 
-               control_ui->combo_map = plugin->get_scale_points (port_index);
+               if (control_ui->scale_points && ((steps && int (control_ui->scale_points->size()) == steps) || desc.enumeration)) {
+                       
+                       /* Either:
+                        *   a) There is a label for each possible value of this input, or
+                        *   b) This port is marked as being an enumeration.
+                        */
 
-               if (control_ui->combo_map) {
                        std::vector<std::string> labels;
                        for (
-                               ARDOUR::Plugin::ScalePoints::const_iterator i = control_ui->combo_map->begin();
-                               i != control_ui->combo_map->end();
+                               ARDOUR::Plugin::ScalePoints::const_iterator i = control_ui->scale_points->begin();
+                               i != control_ui->scale_points->end();
                                ++i) {
                                
                                labels.push_back(i->first);
@@ -579,7 +612,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                if (desc.integer_step) {
                        control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox");
                        Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
-                       control_ui->clickbox->set_print_func (integer_printer, 0);
+                       control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
                } else {
                        //sigc::slot<void,char*,uint32_t> pslot = sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::print_parameter), (uint32_t) port_index);
 
@@ -628,7 +661,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                control_ui->display_label->set_name ("ParameterValueDisplay");
 
                control_ui->display->add (*control_ui->display_label);
-               Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-99,99", 2, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-888.8g", 2, 6);
 
                control_ui->display->show_all ();
 
@@ -638,7 +671,17 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                MeterInfo * info = new MeterInfo(port_index);
                control_ui->meterinfo = info;
 
-               info->meter = new FastMeter (5, 5, FastMeter::Vertical);
+               info->meter = new FastMeter (
+                               5, 5, FastMeter::Vertical, 0,
+                               0x0000aaff,
+                               0x008800ff, 0x008800ff,
+                               0x00ff00ff, 0x00ff00ff,
+                               0xcccc00ff, 0xcccc00ff,
+                               0xffaa00ff, 0xffaa00ff,
+                               0xff0000ff,
+                               ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(),
+                               ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get()
+                               );
 
                info->min_unbound = desc.min_unbound;
                info->max_unbound = desc.max_unbound;
@@ -649,6 +692,9 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                control_ui->vbox = manage (new VBox);
                control_ui->hbox = manage (new HBox);
 
+               control_ui->hbox->set_spacing(1);
+               control_ui->vbox->set_spacing(3);
+
                control_ui->label.set_angle(90);
                control_ui->hbox->pack_start (control_ui->label, false, false);
                control_ui->hbox->pack_start (*info->meter, false, false);
@@ -698,7 +744,7 @@ GenericPluginUI::astate_clicked (ControlUI* cui, uint32_t /*port*/)
 
        items.clear ();
        items.push_back (MenuElem (S_("Automation|Manual"),
-                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Off, cui)));
+                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) ARDOUR::Off, cui)));
        items.push_back (MenuElem (_("Play"),
                                   sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Play, cui)));
        items.push_back (MenuElem (_("Write"),
@@ -749,8 +795,8 @@ GenericPluginUI::update_control_display (ControlUI* cui)
 
        cui->ignore_change++;
 
-       if (cui->combo && cui->combo_map) {
-               for (ARDOUR::Plugin::ScalePoints::iterator it = cui->combo_map->begin(); it != cui->combo_map->end(); ++it) {
+       if (cui->combo && cui->scale_points) {
+               for (ARDOUR::Plugin::ScalePoints::iterator it = cui->scale_points->begin(); it != cui->scale_points->end(); ++it) {
                        if (it->second == val) {
                                cui->combo->set_active_text(it->first);
                                break;
@@ -792,9 +838,9 @@ GenericPluginUI::control_port_toggled (ControlUI* cui)
 void
 GenericPluginUI::control_combo_changed (ControlUI* cui)
 {
-       if (!cui->ignore_change && cui->combo_map) {
+       if (!cui->ignore_change && cui->scale_points) {
                string value = cui->combo->get_active_text();
-               insert->automation_control (cui->parameter())->set_value ((*cui->combo_map)[value]);
+               insert->automation_control (cui->parameter())->set_value ((*cui->scale_points)[value]);
        }
 }
 
@@ -803,7 +849,7 @@ GenericPluginUI::start_updating (GdkEventAny*)
 {
        if (output_controls.size() > 0 ) {
                screen_update_connection.disconnect();
-               screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+               screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
                        (sigc::mem_fun(*this, &GenericPluginUI::output_update));
        }
        return false;