NO-OP: Clarify function name
[ardour.git] / gtk2_ardour / plugin_ui.h
index bb15b2ef081906fdd8623cfd2ba686828d1da9f0..b3420f2924599cc3758aa48d37f2da1a0c1723a5 100644 (file)
 
 #include <sigc++/signal.h>
 
-#include <gtkmm/button.h>
+#include <gtkmm/adjustment.h>
 #include <gtkmm/box.h>
-#include <gtkmm/table.h>
+#include <gtkmm/button.h>
 #include <gtkmm/eventbox.h>
-#include <gtkmm/viewport.h>
-#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/expander.h>
+#include <gtkmm/filechooserbutton.h>
+#include <gtkmm/image.h>
 #include <gtkmm/label.h>
 #include <gtkmm/menu.h>
-#include <gtkmm/image.h>
-#include <gtkmm/adjustment.h>
-#include <gtkmm/togglebutton.h>
-#include <gtkmm/socket.h>
-#include <gtkmm/comboboxtext.h>
+#include <gtkmm/scrolledwindow.h>
 #include <gtkmm/socket.h>
+#include <gtkmm/table.h>
+#include <gtkmm/togglebutton.h>
+#include <gtkmm/viewport.h>
 
 #include "ardour/types.h"
 #include "ardour/plugin.h"
 #include "ardour/variant.h"
 
-#include "automation_controller.h"
-#include "ardour_button.h"
+#include "widgets/ardour_button.h"
+#include "widgets/ardour_dropdown.h"
+#include "widgets/ardour_spinner.h"
+
 #include "ardour_window.h"
+#include "automation_controller.h"
+#include "gtk_pianokeyboard.h"
 
 namespace ARDOUR {
        class PluginInsert;
@@ -67,21 +71,19 @@ namespace PBD {
        class Controllable;
 }
 
-namespace Gtkmm2ext {
-       class HSliderController;
-       class BarController;
-       class ClickBox;
+namespace ArdourWidgets {
        class FastMeter;
-       class PixmapButton;
 }
 
 class LatencyGUI;
 class ArdourWindow;
 class PluginEqGui;
+class PluginLoadStatsGui;
+class VSTPluginUI;
 
 class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionList
 {
-  public:
+public:
        PlugUIBase (boost::shared_ptr<ARDOUR::PluginInsert>);
        virtual ~PlugUIBase();
 
@@ -103,70 +105,79 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
        virtual void on_window_hide() {}
 
        virtual void forward_key_event (GdkEventKey*) {}
-        virtual bool non_gtk_gui() const { return false; }
+       virtual void grab_focus () {}
+       virtual bool non_gtk_gui() const { return false; }
 
        sigc::signal<void,bool> KeyboardFocused;
 
-  protected:
+protected:
        boost::shared_ptr<ARDOUR::PluginInsert> insert;
        boost::shared_ptr<ARDOUR::Plugin> plugin;
 
        /* UI elements that can subclasses can add to their widgets */
 
        /** a ComboBoxText which lists presets and manages their selection */
-       Gtk::ComboBoxText _preset_combo;
+       ArdourWidgets::ArdourDropdown _preset_combo;
        /** a label which has a * in if the current settings are different from the preset being shown */
        Gtk::Label _preset_modified;
        /** a button to add a preset */
-       Gtk::Button add_button;
+       ArdourWidgets::ArdourButton add_button;
        /** a button to save the current settings as a new user preset */
-       Gtk::Button save_button;
+       ArdourWidgets::ArdourButton save_button;
        /** a button to delete the current preset (if it is a user one) */
-       Gtk::Button delete_button;
+       ArdourWidgets::ArdourButton delete_button;
+       /** a button to delete the reset the plugin params */
+       ArdourWidgets::ArdourButton reset_button;
        /** a button to bypass the plugin */
-       ArdourButton bypass_button;
+       ArdourWidgets::ArdourButton bypass_button;
+       /** and self-explaining button :) */
+       ArdourWidgets::ArdourButton pin_management_button;
        /** a button to acquire keyboard focus */
        Gtk::EventBox focus_button;
        /** an expander containing the plugin description */
        Gtk::Expander description_expander;
        /** an expander containing the plugin analysis graph */
        Gtk::Expander plugin_analysis_expander;
-       /** a label indicating the plugin latency */
-       Gtk::Label latency_label;
+       /** an expander containing the plugin cpu profile */
+       Gtk::Expander cpuload_expander;
        /** a button which, when clicked, opens the latency GUI */
-       Gtk::Button latency_button;
+       ArdourWidgets::ArdourButton latency_button;
        /** a button which sets all controls' automation setting to Manual */
-       ArdourButton automation_manual_all_button;
+       ArdourWidgets::ArdourButton automation_manual_all_button;
        /** a button which sets all controls' automation setting to Play */
-       ArdourButton automation_play_all_button;
-    /** a button which sets all controls' automation setting to Write */
-       ArdourButton automation_write_all_button;
+       ArdourWidgets::ArdourButton automation_play_all_button;
+       /** a button which sets all controls' automation setting to Write */
+       ArdourWidgets::ArdourButton automation_write_all_button;
        /** a button which sets all controls' automation setting to Touch */
-       ArdourButton automation_touch_all_button;
-       
-       void set_latency_label ();
+       ArdourWidgets::ArdourButton automation_touch_all_button;
+       /** a button which sets all controls' automation setting to Latch */
+       ArdourWidgets::ArdourButton automation_latch_all_button;
 
+       void set_latency_label ();
        LatencyGUI* latency_gui;
        ArdourWindow* latency_dialog;
 
        PluginEqGui* eqgui;
-       Gtk::Requisition pre_eq_size;
+       PluginLoadStatsGui* stats_gui;
 
        Gtk::Image* focus_out_image;
        Gtk::Image* focus_in_image;
        int _no_load_preset;
 
-       virtual void preset_selected ();
+       virtual void preset_selected (ARDOUR::Plugin::PresetRecord preset);
        void add_plugin_setting ();
        void save_plugin_setting ();
        void delete_plugin_setting ();
+       void reset_plugin_parameters ();
+       void manage_pins ();
        bool focus_toggled(GdkEventButton*);
        bool bypass_button_release(GdkEventButton*);
        void toggle_description ();
        void toggle_plugin_analysis ();
+       void toggle_cpuload_display ();
        void processor_active_changed (boost::weak_ptr<ARDOUR::Processor> p);
        void plugin_going_away ();
-       virtual void parameter_changed (uint32_t, float);
+       void automation_state_changed ();
        void preset_added_or_removed ();
        void update_preset_modified ();
 
@@ -179,7 +190,7 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
 
 class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 {
-  public:
+public:
        GenericPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> plug, bool scrollable=false);
        ~GenericPluginUI ();
 
@@ -189,48 +200,25 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
        bool start_updating(GdkEventAny*);
        bool stop_updating(GdkEventAny*);
 
-  private:
+private:
        Gtk::VBox main_contents;
-
        Gtk::HBox settings_box;
        Gtk::HBox hpacker;
-
-       Gtk::Table button_table;
-       Gtk::Table output_table;
-
-       Gtk::ScrolledWindow scroller;
-       Gtk::Adjustment hAdjustment;
-       Gtk::Adjustment vAdjustment;
-       Gtk::Viewport scroller_view;
        Gtk::Menu* automation_menu;
 
        gint prefheight;
        bool is_scrollable;
 
        struct MeterInfo {
-               Gtkmm2ext::FastMeter *meter;
-
-               float           min;
-               float           max;
-               bool            min_unbound;
-               bool            max_unbound;
+               ArdourWidgets::FastMeter* meter;
                bool packed;
 
                MeterInfo () {
                        meter = 0;
                        packed = false;
-                       min = 1.0e10;
-                       max = -1.0e10;
-                       min_unbound = false;
-                       max_unbound = false;
                }
        };
 
-       static const int32_t initial_button_rows = 12;
-       static const int32_t initial_button_cols = 1;
-       static const int32_t initial_output_rows = 1;
-       static const int32_t initial_output_cols = 4;
-
        /* FIXME: Unify with AutomationController */
        struct ControlUI : public Gtk::HBox {
 
@@ -241,16 +229,19 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
                /* input */
 
-               Gtk::ComboBoxText*                      combo;
                boost::shared_ptr<ARDOUR::ScalePoints>  scale_points;
-               Gtk::ToggleButton*                      button;
                boost::shared_ptr<AutomationController> controller;
-               Gtkmm2ext::ClickBox*                    clickbox;
+
+               ArdourWidgets::ArdourButton             automate_button;
                Gtk::Label                              label;
-               bool                                    update_pending;
-               char                                    ignore_change;
-               Gtk::Button                             automate_button;
+               ArdourWidgets::ArdourDropdown*          combo;
                Gtk::FileChooserButton*                 file_button;
+               ArdourWidgets::ArdourSpinner*           spin_box;
+
+               bool                                    button;
+               bool                                    update_pending;
+               bool                                    ignore_change;
+
 
                /* output */
 
@@ -263,50 +254,86 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
                ControlUI (const Evoral::Parameter& param);
                ~ControlUI ();
+
+               /* layout */
+               Gtk::Table* knobtable;
+               int x0, x1, y0, y1;
+
+               bool short_autostate; // modify with set_short_autostate below
        };
 
-       std::vector<ControlUI*>   input_controls;
+       void set_short_autostate(ControlUI* cui, bool value);
+
+       std::vector<ControlUI*>   input_controls; // workaround for preset load
        std::vector<ControlUI*>   input_controls_with_automation;
        std::vector<ControlUI*>   output_controls;
+
        sigc::connection screen_update_connection;
+
        void output_update();
 
        void build ();
+       void automatic_layout (const std::vector<ControlUI *>& control_uis);
+       void custom_layout (const std::vector<ControlUI *>& control_uis);
+
        ControlUI* build_control_ui (const Evoral::Parameter&                     param,
                                     const ARDOUR::ParameterDescriptor&           desc,
                                     boost::shared_ptr<ARDOUR::AutomationControl> mcontrol,
                                     float                                        value,
-                                    bool                                         is_input);
+                                    bool                                         is_input,
+                                    bool                                         use_knob = false);
 
        void ui_parameter_changed (ControlUI* cui);
-       void toggle_parameter_changed (ControlUI* cui);
        void update_control_display (ControlUI* cui);
-       void control_port_toggled (ControlUI* cui);
-       void control_combo_changed (ControlUI* cui);
+       void update_input_displays (); // workaround for preset load
+       void control_combo_changed (ControlUI* cui, float value);
 
-       void astate_clicked (ControlUI*);
+       bool astate_button_event (GdkEventButton* ev, ControlUI*);
        void automation_state_changed (ControlUI*);
        void set_automation_state (ARDOUR::AutoState state, ControlUI* cui);
-       void start_touch (ControlUI*);
-       void stop_touch (ControlUI*);
        void set_all_automation (ARDOUR::AutoState state);
 
+       void knob_size_request(Gtk::Requisition* req, ControlUI* cui);
+
        /* XXX: remove */
        void print_parameter (char *buf, uint32_t len, uint32_t param);
        bool integer_printer (char* buf, Gtk::Adjustment &, ControlUI *);
        bool midinote_printer(char* buf, Gtk::Adjustment &, ControlUI *);
 
-       void set_property (const ARDOUR::ParameterDescriptor& desc,
-                          Gtk::FileChooserButton*            widget);
-       void property_changed (uint32_t key, const ARDOUR::Variant& value);
+       typedef std::map<uint32_t, Gtk::FileChooserButton*> FilePathControls;
+       FilePathControls _filepath_controls;
+       void set_path_property (const ARDOUR::ParameterDescriptor& desc,
+                               Gtk::FileChooserButton*            widget);
+       void path_property_changed (uint32_t key, const ARDOUR::Variant& value);
+
+       void scroller_size_request (Gtk::Requisition*);
+       Gtk::ScrolledWindow scroller;
 
-       typedef std::map<uint32_t, Gtk::FileChooserButton*> PropertyControls;
-       PropertyControls _property_controls;
+       Gtk::Expander   _plugin_pianokeyboard_expander;
+       PianoKeyboard*  _piano;
+       Gtk::Widget*    _pianomm;
+       Gtk::VBox       _pianobox;
+       Gtk::SpinButton _piano_velocity;
+       Gtk::SpinButton _piano_channel;
+
+       static void _note_on_event_handler (GtkWidget*, int, gpointer);
+       static void _note_off_event_handler (GtkWidget*, int, gpointer);
+       void note_on_event_handler (int);
+       void note_off_event_handler (int);
+
+       void toggle_pianokeyboard ();
+       void build_midi_table ();
+       void midi_refill_patches ();
+       void midi_bank_patch_change (uint8_t chn);
+       void midi_bank_patch_select (uint8_t chn, uint32_t bankpgm);
+       std::vector<ArdourWidgets::ArdourDropdown*> midi_pgmsel;
+       PBD::ScopedConnectionList midi_connections;
+       std::map<uint32_t, std::string> pgm_names;
 };
 
 class PluginUIWindow : public ArdourWindow
 {
-  public:
+public:
        PluginUIWindow (boost::shared_ptr<ARDOUR::PluginInsert> insert,
                        bool scrollable=false,
                        bool editor=true);
@@ -324,7 +351,7 @@ class PluginUIWindow : public ArdourWindow
        void on_show ();
        void on_hide ();
 
-  private:
+private:
        std::string _title;
        PlugUIBase* _pluginui;
        PBD::ScopedConnection death_connection;
@@ -333,8 +360,8 @@ class PluginUIWindow : public ArdourWindow
        bool was_visible;
        bool _keyboard_focused;
 #ifdef AUDIOUNIT_SUPPORT
-        int pre_deactivate_x;
-        int pre_deactivate_y;
+       int pre_deactivate_x;
+       int pre_deactivate_y;
 #endif
 
        void keyboard_focused (bool yn);
@@ -344,10 +371,18 @@ class PluginUIWindow : public ArdourWindow
 
        bool create_windows_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_lxvst_editor(boost::shared_ptr<ARDOUR::PluginInsert>);
+       bool create_mac_vst_editor(boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_lv2_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
 };
 
+#ifdef MACVST_SUPPORT
+/* this function has to be in a .mm file
+ * because MacVSTPluginUI has Cocoa members
+ */
+extern VSTPluginUI* create_mac_vst_gui (boost::shared_ptr<ARDOUR::PluginInsert>);
+#endif
+
 #ifdef AUDIOUNIT_SUPPORT
 /* this function has to be in a .mm file */
 extern PlugUIBase* create_au_gui (boost::shared_ptr<ARDOUR::PluginInsert>, Gtk::VBox**);