GenericUI: Update all input controls on preset load
[ardour.git] / gtk2_ardour / plugin_ui.h
index fefa9996183b42fa71cd99564c61dcc527e32eae..d534a99d707126aefc3ab873086c869dabb5e01d 100644 (file)
 #include <gtkmm/adjustment.h>
 #include <gtkmm/togglebutton.h>
 #include <gtkmm/socket.h>
-#include <gtkmm/comboboxtext.h>
 #include <gtkmm/socket.h>
 
 #include "ardour/types.h"
 #include "ardour/plugin.h"
+#include "ardour/variant.h"
 
-#include "automation_controller.h"
 #include "ardour_button.h"
+#include "ardour_dropdown.h"
+#include "ardour_spinner.h"
 #include "ardour_window.h"
+#include "automation_controller.h"
 
 namespace ARDOUR {
        class PluginInsert;
@@ -102,7 +104,8 @@ 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;
 
@@ -113,15 +116,17 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
        /* UI elements that can subclasses can add to their widgets */
 
        /** a ComboBoxText which lists presets and manages their selection */
-       Gtk::ComboBoxText _preset_combo;
+       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;
+       ArdourButton add_button;
        /** a button to save the current settings as a new user preset */
-       Gtk::Button save_button;
+       ArdourButton save_button;
        /** a button to delete the current preset (if it is a user one) */
-       Gtk::Button delete_button;
+       ArdourButton delete_button;
+       /** a button to delete the reset the plugin params */
+       ArdourButton reset_button;
        /** a button to bypass the plugin */
        ArdourButton bypass_button;
        /** a button to acquire keyboard focus */
@@ -130,34 +135,40 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
        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;
        /** a button which, when clicked, opens the latency GUI */
-       Gtk::Button latency_button;
-       
+       ArdourButton latency_button;
+       /** a button which sets all controls' automation setting to Manual */
+       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;
+       /** a button which sets all controls' automation setting to Touch */
+       ArdourButton automation_touch_all_button;
+
        void set_latency_label ();
 
        LatencyGUI* latency_gui;
        ArdourWindow* latency_dialog;
 
        PluginEqGui* eqgui;
-       Gtk::Requisition pre_eq_size;
 
        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 ();
        bool focus_toggled(GdkEventButton*);
        bool bypass_button_release(GdkEventButton*);
        void toggle_description ();
        void toggle_plugin_analysis ();
        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 ();
 
@@ -182,17 +193,8 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
   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;
@@ -207,7 +209,7 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
                bool            max_unbound;
                bool packed;
 
-               MeterInfo (int /*i*/) {
+               MeterInfo () {
                        meter = 0;
                        packed = false;
                        min = 1.0e10;
@@ -217,30 +219,29 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
                }
        };
 
-       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 {
 
-               uint32_t port_index;
-               boost::shared_ptr<ARDOUR::AutomationControl> control;
+               const Evoral::Parameter parameter() const { return param; }
 
-               Evoral::Parameter parameter() { return control->parameter(); }
+               Evoral::Parameter                            param;
+               boost::shared_ptr<ARDOUR::AutomationControl> control;
 
                /* input */
 
-               Gtk::ComboBoxText*                      combo;
-               boost::shared_ptr<ARDOUR::Plugin::ScalePoints> scale_points;
-               Gtk::ToggleButton*                      button;
+               boost::shared_ptr<ARDOUR::ScalePoints>  scale_points;
                boost::shared_ptr<AutomationController> controller;
-               Gtkmm2ext::ClickBox*                    clickbox;
+
+               ArdourButton                            automate_button;
                Gtk::Label                              label;
+               ArdourDropdown*                         combo;
+               Gtkmm2ext::ClickBox*                    clickbox;
+               Gtk::FileChooserButton*                 file_button;
+               ArdourSpinner*                          spin_box;
+
+               bool                                    button;
                bool                                    update_pending;
-               char                                    ignore_change;
-               Gtk::Button                             automate_button;
+               bool                                    ignore_change;
 
                /* output */
 
@@ -251,33 +252,54 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
                Gtk::VBox*     vbox;
                MeterInfo*     meterinfo;
 
-               ControlUI ();
+               ControlUI (const Evoral::Parameter& param);
                ~ControlUI ();
+
+               /* layout */
+               Gtk::Table* knobtable;
+               int x0, x1, y0, y1;
        };
 
-       std::vector<ControlUI*>   input_controls;
+       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 ();
-       ControlUI* build_control_ui (guint32 port_index, boost::shared_ptr<ARDOUR::AutomationControl>);
+       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                                         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*, uint32_t parameter);
+       void astate_clicked (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);
 
        /* 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 *);
+
+       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);
+
 };
 
 class PluginUIWindow : public ArdourWindow