Set button labels sanely.
[ardour.git] / gtk2_ardour / plugin_ui.cc
index aa966ae4537156c0258b9a7736ebeafbc78faa4b..e0d22d8834d8f904a16c2b22510cc21d5f4484b4 100644 (file)
@@ -75,7 +75,7 @@ PluginUIWindow::PluginUIWindow (AudioEngine &engine, PluginInsert& insert, bool
                        VSTPluginUI* vpu = new VSTPluginUI (insert, *vp);
                        
                        _pluginui = vpu;
-                       add (*vpu);
+                       get_vbox()->add (*vpu);
                        vpu->package (*this);
                        
                } else {
@@ -92,17 +92,17 @@ PluginUIWindow::PluginUIWindow (AudioEngine &engine, PluginInsert& insert, bool
                PluginUI*  pu  = new PluginUI (engine, insert, scrollable);
                
                _pluginui = pu;
-               add (*pu);
+               get_vbox()->add (*pu);
                
-               map_event.connect (mem_fun (*pu, &PluginUI::start_updating));
-               unmap_event.connect (mem_fun (*pu, &PluginUI::stop_updating));
+               signal_map_event().connect (mem_fun (*pu, &PluginUI::start_updating));
+               signal_unmap_event().connect (mem_fun (*pu, &PluginUI::stop_updating));
        }
 
        set_position (Gtk::WIN_POS_MOUSE);
        set_name ("PluginEditor");
        add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
 
-       delete_event.connect (bind (ptr_fun (just_hide_it), reinterpret_cast<Window*> (this)));
+       signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window*> (this)));
        insert.GoingAway.connect (mem_fun(*this, &PluginUIWindow::plugin_going_away));
 
        if (scrollable) {
@@ -121,6 +121,9 @@ PluginUI::PluginUI (AudioEngine &engine, PluginInsert& pi, bool scrollable)
          engine(engine),
          button_table (initial_button_rows, initial_button_cols),
          output_table (initial_output_rows, initial_output_cols),
+         hAdjustment(0.0, 0.0, 0.0),
+         vAdjustment(0.0, 0.0, 0.0),
+         scroller_view(hAdjustment, vAdjustment),
          automation_menu (0),
          is_scrollable(scrollable)
 {
@@ -132,20 +135,17 @@ PluginUI::PluginUI (AudioEngine &engine, PluginInsert& pi, bool scrollable)
 
        HBox* constraint_hbox = manage (new HBox);
        HBox* smaller_hbox = manage (new HBox);
+       Label* combo_label = manage (new Label (_("<span size=\"large\">Presets</span>")));
+       combo_label->set_use_markup (true);
 
+       smaller_hbox->pack_start (*combo_label, false, false, 10);
        smaller_hbox->pack_start (combo, false, false);
        smaller_hbox->pack_start (save_button, false, false);
 
-       constraint_hbox->set_spacing (10);
+       constraint_hbox->set_spacing (5);
        constraint_hbox->pack_start (*smaller_hbox, true, false);
        constraint_hbox->pack_end (bypass_button, false, false);
 
-//     name_ebox.add (*text_hbox);
-//     info_vbox.pack_start (name_ebox, false, false);
-//     info_vbox.pack_start (makerinfo_label, false, false);
-//     info_vbox.pack_start (paraminfo_label, false, false, 5);
-
-//     settings_box.pack_start (info_vbox, false, false, 10);
        settings_box.pack_end (*constraint_hbox, false, false);
 
        pack_start (settings_box, false, false);
@@ -162,9 +162,6 @@ PluginUI::PluginUI (AudioEngine &engine, PluginInsert& pi, bool scrollable)
        }
        else {
                pack_start (hpacker, false, false);
-
-               // this is a hack to get the theme right
-               name_ebox.set_name ("PluginNameBox");
        }
 
        insert.active_changed.connect (mem_fun(*this, &PluginUI::redirect_active_changed));
@@ -189,7 +186,6 @@ PluginUI::build (AudioEngine &engine)
        Frame* frame;
        Frame* bt_frame;
        VBox* box;
-       char info[32];
        int output_row, output_col;
        int button_row, button_col;
        int output_rows, output_cols;
@@ -225,22 +221,29 @@ PluginUI::build (AudioEngine &engine)
        hpacker.pack_start(*bt_frame, true, true);
 
        box = manage (new VBox);
+       box->set_border_width (5);
+       box->set_spacing (1);
+
        frame = manage (new Frame);
        frame->set_name ("BaseFrame");
+       frame->set_label (_("Controls"));
        frame->add (*box);
        hpacker.pack_start(*frame, true, true);
 
-       box->set_border_width (5);
-       box->set_spacing (1);
-       
        /* find all ports. build control elements for all appropriate control ports */
 
        for (i = 0; i < plugin.parameter_count(); ++i) {
 
                if (plugin.parameter_is_control (i)) {
+                       
+                       /* Don't show latency control ports */
+
+                       if (plugin.describe_parameter (i) == X_("latency")) {
+                               continue;
+                       }
 
                        ControlUI* cui;
-                               
+       
                        /* if we are scrollable, just use one long column */
 
                        if (!is_scrollable) {
@@ -259,14 +262,8 @@ PluginUI::build (AudioEngine &engine)
                                }
                        }
 
-                       /* Don't show latency control ports */
-
-                       if (plugin.describe_parameter (i) == X_("latency")) {
-                               continue;
-                       }
-
                        if ((cui = build_control_ui (engine, i, plugin.get_nth_midi_control (i))) == 0) {
-                               error << compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
+                               error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
                                continue;
                        }
                                
@@ -285,11 +282,24 @@ PluginUI::build (AudioEngine &engine)
                                }
 
                                button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1, 
-                                                    Gtk::FILL|Gtk::EXPAND, 0);
+                                                    FILL|EXPAND, FILL);
                                button_row++;
 
                        } else if (cui->display) {
 
+                               output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1, 
+                                                    FILL|EXPAND, FILL);
+                               
+                               // TODO: The meters should be divided into multiple rows 
+                               
+                               if (++output_col == output_cols) {
+                                       output_cols ++;
+                                       output_table.resize (output_rows, output_cols);
+                               }
+                               
+                               /* old code, which divides meters into
+                                * columns first, rows later. New code divides into one row
+                                
                                if (output_row == output_rows) {
                                        output_row = 0;
                                        if (++output_col == output_cols) {
@@ -299,9 +309,10 @@ PluginUI::build (AudioEngine &engine)
                                }
                                
                                output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1, 
-                                                    Gtk::FILL|Gtk::EXPAND, 0);
+                                                    FILL|EXPAND, FILL);
  
                                output_row++;
+                               */
                        }
                                
                        /* HACK: ideally the preferred height would be queried from
@@ -334,42 +345,6 @@ PluginUI::build (AudioEngine &engine)
 
        output_update ();
 
-       string pname = plugin.name();
-       
-       if (pname.length() > 24) {
-               pname = pname.substr (0, 24);
-               pname += "...";
-               ARDOUR_UI::instance()->tooltips().set_tip(name_ebox, plugin.name());
-       }
-
-       
-       nameinfo_label.set_text (pname);
-       nameinfo_label.set_name ("PluginNameInfo");
-       nameinfo_label.set_alignment (0.0, 0.0);
-
-       string maker = plugin.maker();
-       string::size_type email_pos;
-
-       if ((email_pos = maker.find_first_of ('<')) != string::npos) {
-               maker = maker.substr (0, email_pos - 1);
-       }
-
-       if (maker.length() > 32) {
-               maker = maker.substr (0, 32);
-               maker += " ...";
-       }
-
-       makerinfo_label.set_text (maker);
-       makerinfo_label.set_name ("PluginMakerInfo");
-       makerinfo_label.set_alignment (0.0, 0.0);
-       
-       snprintf (info, sizeof(info),"[ %u %s | %u %s ]",
-                 n_ins, ngettext(_("in"), _("ins"), n_ins),
-                 n_outs, ngettext(_("out"), _("outs"), n_outs));
-       paraminfo_label.set_text (info);
-       paraminfo_label.set_name ("PluginParameterInfo");
-       paraminfo_label.set_alignment (0.0, 0.0);
-
        output_table.show_all ();
        button_table.show_all ();
 }
@@ -383,7 +358,7 @@ PluginUI::ControlUI::ControlUI ()
 
        /* don't fix the height, it messes up the bar controllers */
 
-       set_size_request_to_display_given_text (automate_button, X_("longenuff"), 2, -1);
+       set_size_request_to_display_given_text (automate_button, X_("longenuff"), 2, 2);
 
        ignore_change = 0;
        display = 0;
@@ -413,19 +388,19 @@ PluginUI::automation_state_changed (ControlUI* cui)
 
        switch (insert.get_port_automation_state (cui->port_index) & (Off|Play|Touch|Write)) {
        case Off:
-               static_cast<Gtk::Label*>(cui->automate_button.get_child())->set_text (_("off"));
+               cui->automate_button.set_label (_("off"));
                break;
        case Play:
-               static_cast<Gtk::Label*>(cui->automate_button.get_child())->set_text (_("play"));
+               cui->automate_button.set_label (_("play"));
                break;
        case Write:
-               static_cast<Gtk::Label*>(cui->automate_button.get_child())->set_text (_("write"));
+               cui->automate_button.set_label (_("write"));
                break;
        case Touch:
-               static_cast<Gtk::Label*>(cui->automate_button.get_child())->set_text (_("touch"));
+               cui->automate_button.set_label (_("touch"));
                break;
        default:
-               static_cast<Gtk::Label*>(cui->automate_button.get_child())->set_text (_("???"));
+               cui->automate_button.set_label (_("???"));
                break;
        }
 }
@@ -473,11 +448,11 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                        
                        if (defaults && defaults->count > 0)    {
                                
-                               control_ui->combo = new Gtk::Combo;
-                               control_ui->combo->set_value_in_list(true, false);
-                               control_ui->combo->set_popdown_strings(setup_scale_values(port_index, control_ui));
-                               control_ui->combo->get_popwin()->unmap_event.connect(bind (mem_fun(*this, &PluginUI::control_combo_changed), control_ui));
-                               plugin.ParameterChanged.connect (bind (mem_fun(*this, &PluginUI::parameter_changed), control_ui));
+                               control_ui->combo = new Gtk::ComboBoxText;
+                               //control_ui->combo->set_value_in_list(true, false);
+                               set_popdown_strings (*control_ui->combo, setup_scale_values(port_index, control_ui));
+                               control_ui->combo->signal_changed().connect (bind (mem_fun(*this, &PluginUI::control_combo_changed), control_ui));
+                               plugin.ParameterChanged.connect (bind (mem_fun (*this, &PluginUI::parameter_changed), control_ui));
                                control_ui->pack_start(control_ui->label, true, true);
                                control_ui->pack_start(*control_ui->combo, false, true);
                                
@@ -500,7 +475,7 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                        control_ui->pack_start (*control_ui->button, false, true);
                        control_ui->pack_start (control_ui->automate_button, false, false);
 
-                       control_ui->button-.signal_clicked().connect (bind (mem_fun(*this, &PluginUI::control_port_toggled), control_ui));
+                       control_ui->button->signal_clicked().connect (bind (mem_fun(*this, &PluginUI::control_port_toggled), control_ui));
                
                        if(plugin.get_parameter (port_index) == 1){
                                control_ui->button->set_active(true);
@@ -538,21 +513,15 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                        Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
                        control_ui->clickbox->set_print_func (integer_printer, 0);
                } else {
-//                     control_ui->control = new HSliderController (ARDOUR_UI::instance()->plugin_ui_slider_pix(),
-//                                                                  control_ui->adjustment,
-//                                                                  mcontrol);
-
                        sigc::slot<void,char*,uint32_t> pslot = sigc::bind (mem_fun(*this, &PluginUI::print_parameter), (uint32_t) port_index);
 
                        control_ui->control = new BarController (*control_ui->adjustment, mcontrol, pslot);
-                       control_ui->control->set_size_request (200, 15);
+                       // should really match the height of the text in the automation button+label
+                       control_ui->control->set_size_request (200, 22);
                        control_ui->control->set_name (X_("PluginSlider"));
                        control_ui->control->set_style (BarController::LeftToRight);
                        control_ui->control->set_use_parent (true);
 
-                       control_ui->control->get_spin_button().signal_focus_in_event().connect (mem_fun(*this, &PluginUI::entry_focus_event));
-                       control_ui->control->get_spin_button().signal_focus_out_event().connect (mem_fun(*this, &PluginUI::entry_focus_event));
-
                        control_ui->control->StartGesture.connect (bind (mem_fun(*this, &PluginUI::start_touch), control_ui));
                        control_ui->control->StopGesture.connect (bind (mem_fun(*this, &PluginUI::stop_touch), control_ui));
                        
@@ -577,7 +546,7 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                }
 
                control_ui->pack_start (control_ui->automate_button, false, false);
-               control_ui->adjustment->value_changed.connect (bind (mem_fun(*this, &PluginUI::control_adjustment_changed), control_ui));
+               control_ui->adjustment->signal_value_changed().connect (bind (mem_fun(*this, &PluginUI::control_adjustment_changed), control_ui));
                control_ui->automate_button.signal_clicked().connect (bind (mem_fun(*this, &PluginUI::astate_clicked), control_ui, (uint32_t) port_index));
 
                automation_state_changed (control_ui);
@@ -592,10 +561,11 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                control_ui->display->set_name ("ParameterValueDisplay");
 
                control_ui->display_label = manage (new Label);
+
                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, "g999999", 2, 2);
+               Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-99,99", 2, 2);
 
                control_ui->display->show_all ();
 
@@ -605,7 +575,7 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                MeterInfo * info = new MeterInfo(port_index);
                control_ui->meterinfo = info;
                
-               info->meter = new FastMeter (100, 5, FastMeter::Horizontal);
+               info->meter = new FastMeter (5, 100, FastMeter::Vertical);
 
                info->min_unbound = desc.min_unbound;
                info->max_unbound = desc.max_unbound;
@@ -614,12 +584,17 @@ PluginUI::build_control_ui (AudioEngine &engine, guint32 port_index, MIDI::Contr
                info->max = desc.upper;
 
                control_ui->vbox = manage (new VBox);
+               control_ui->hbox = manage (new HBox);
+               
+               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);
 
-               control_ui->vbox->pack_start (control_ui->label, false, false);
-               control_ui->vbox->pack_start (*info->meter, false, false);
+               control_ui->vbox->pack_start (*control_ui->hbox, false, false);
                
-               control_ui->pack_start (*control_ui->vbox, false, false);
-               control_ui->pack_start (*control_ui->display, false, false);
+               control_ui->vbox->pack_start (*control_ui->display, false, false);
+
+               control_ui->pack_start (*control_ui->vbox);
 
                control_ui->meterinfo->meter->show_all();
                control_ui->meterinfo->packed = true;
@@ -712,10 +687,10 @@ PluginUI::update_control_display (ControlUI* cui)
 
        cui->ignore_change++;
        if (cui->combo) {
-               map<string,float>::iterator it;
+               std::map<string,float>::iterator it;
                for (it = cui->combo_map->begin(); it != cui->combo_map->end(); ++it) {
                        if (it->second == val) {
-                               cui->combo->get_entry()->set_text(it->first);
+                               cui->combo->set_active_text(it->first);
                                break;
                        }
                }
@@ -746,16 +721,15 @@ PluginUI::control_port_toggled (ControlUI* cui)
        }
 }
 
-gint
-PluginUI::control_combo_changed (GdkEventAny* ignored, ControlUI* cui)
+void
+PluginUI::control_combo_changed (ControlUI* cui)
 {
        if (!cui->ignore_change) {
-               string value = cui->combo->get_entry()->get_text();
-               map<string,float> mapping = *cui->combo_map;
+               string value = cui->combo->get_active_text();
+               std::map<string,float> mapping = *cui->combo_map;
                insert.set_parameter (cui->port_index, mapping[value]);
        }
 
-       return FALSE;
 }
 
 void
@@ -767,17 +741,6 @@ PluginUIWindow::plugin_going_away (ARDOUR::Redirect* ignored)
        delete_when_idle (this);
 }
 
-gint
-PluginUI::entry_focus_event (GdkEventFocus* ev)
-{
-       if (ev->in) {
-               ARDOUR_UI::instance()->allow_focus (true);
-       } else {
-               ARDOUR_UI::instance()->allow_focus (false);
-       }
-       return TRUE;
-}
-
 void
 PluginUI::redirect_active_changed (Redirect* r, void* src)
 {
@@ -786,24 +749,24 @@ PluginUI::redirect_active_changed (Redirect* r, void* src)
        bypass_button.set_active (!r->active());
 }
 
-gint
-PluginUI::start_updating (GdkEventAny *ev)
+bool
+PluginUI::start_updating (GdkEventAny* ignored)
 {
        if (output_controls.size() > 0 ) {
                screen_update_connection.disconnect();
                screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect 
                        (mem_fun(*this, &PluginUI::output_update));
        }
-       return FALSE;
+       return false;
 }
 
-gint 
-PluginUI::stop_updating (GdkEventAny *ev)
+bool
+PluginUI::stop_updating (GdkEventAny* ignored)
 {
        if (output_controls.size() > 0 ) {
                screen_update_connection.disconnect();
        }
-       return FALSE;
+       return false;
 }
 
 void
@@ -840,13 +803,13 @@ PluginUI::output_update ()
        }
 }
 
-list<string> 
+vector<string> 
 PluginUI::setup_scale_values(guint32 port_index, ControlUI* cui)
 {
-       list<string> enums;
+       vector<string> enums;
        LadspaPlugin* lp = dynamic_cast<LadspaPlugin*> (&plugin);
 
-       cui->combo_map = new map<string, float>;
+       cui->combo_map = new std::map<string, float>;
        lrdf_defaults* defaults = lrdf_get_scale_values(lp->unique_id(), port_index);
        if (defaults)   {
                for (uint32_t i = 0; i < defaults->count; ++i) {
@@ -866,58 +829,57 @@ PluginUI::setup_scale_values(guint32 port_index, ControlUI* cui)
 PlugUIBase::PlugUIBase (PluginInsert& pi)
        : insert (pi),
          plugin (insert.plugin()),
-         save_button(_("save")),
-         bypass_button (_("bypass"))
+         save_button(_("Add")),
+         bypass_button (_("Bypass"))
 {
-       combo.set_value_in_list(true,true);
-       combo.set_use_arrows(true);
-       combo.set_use_arrows_always(true);
-       combo.set_popdown_strings(plugin.get_presets());
-       combo.get_entry()->set_text("");
-       combo.get_popwin()->unmap_event.connect(mem_fun(*this, &PlugUIBase::setting_selected));
+        //combo.set_use_arrows_always(true);
+       set_popdown_strings (combo, plugin.get_presets());
+       combo.set_size_request (100, -1);
+       combo.set_active_text ("");
+       combo.signal_changed().connect(mem_fun(*this, &PlugUIBase::setting_selected));
 
        save_button.set_name ("PluginSaveButton");
-       save_button.clicked.connect(mem_fun(*this, &PlugUIBase::save_plugin_setting));
+       save_button.signal_clicked().connect(mem_fun(*this, &PlugUIBase::save_plugin_setting));
 
        bypass_button.set_name ("PluginBypassButton");
-       bypass_button.toggled.connect (mem_fun(*this, &PlugUIBase::bypass_toggled));
+       bypass_button.signal_toggled().connect (mem_fun(*this, &PlugUIBase::bypass_toggled));
 }
 
-gint
-PlugUIBase::setting_selected(GdkEventAny* ignored)
+void
+PlugUIBase::setting_selected()
 {
-       Entry* entry = combo.get_entry();
-       if (entry->get_text().length() > 0) {
-               if (!plugin.load_preset(entry->get_text())) {
-                       warning << compose(_("Plugin preset %1 not found"), entry->get_text()) << endmsg;
+       if (combo.get_active_text().length() > 0) {
+               if (!plugin.load_preset(combo.get_active_text())) {
+                       warning << string_compose(_("Plugin preset %1 not found"), combo.get_active_text()) << endmsg;
                }
        }
 
-       return FALSE;
 }
 
 void
 PlugUIBase::save_plugin_setting ()
 {
        ArdourPrompter prompter (true);
-       prompter.set_prompt(_("Name for plugin settings:"));
+       prompter.set_prompt(_("Name of New Preset:"));
+       prompter.add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT);
+       prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
 
        prompter.show_all();
-       prompter.done.connect(Main::quit.slot());
 
-       Main::run();
+       switch (prompter.run ()) {
+       case Gtk::RESPONSE_ACCEPT:
 
-       if (prompter.status == Gtkmm2ext::Prompter::entered) {
                string name;
 
                prompter.get_result(name);
 
                if (name.length()) {
                        if(plugin.save_preset(name)){
-                               combo.set_popdown_strings(plugin.get_presets());
-                               combo.get_entry()->set_text(name);
+                               set_popdown_strings (combo, plugin.get_presets());
+                               combo.set_active_text (name);
                        }
                }
+               break;
        }
 }