/* Copyright (C) 2000-2006 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $Id$ */ #ifndef __ardour_plugin_ui_h__ #define __ardour_plugin_ui_h__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ARDOUR { class PluginInsert; class Plugin; class VSTPlugin; class Redirect; class AUPlugin; } namespace PBD { class Controllable; } namespace Gtkmm2ext { class HSliderController; class BarController; class ClickBox; class FastMeter; class PixmapButton; } class PlugUIBase : public virtual sigc::trackable { public: PlugUIBase (boost::shared_ptr); virtual ~PlugUIBase() {} virtual gint get_preferred_height () = 0; virtual bool start_updating(GdkEventAny*) = 0; virtual bool stop_updating(GdkEventAny*) = 0; protected: boost::shared_ptr insert; boost::shared_ptr plugin; Gtk::ComboBoxText combo; Gtk::Button save_button; Gtk::ToggleButton bypass_button; void setting_selected(); void save_plugin_setting (void); void bypass_toggled(); }; class LadspaPluginUI : public PlugUIBase, public Gtk::VBox { public: LadspaPluginUI (boost::shared_ptr plug, bool scrollable=false); ~LadspaPluginUI (); gint get_preferred_height () { return prefheight; } bool start_updating(GdkEventAny*); bool stop_updating(GdkEventAny*); private: 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; bool packed; MeterInfo(int i) { meter = 0; packed = false; min = 1.0e10; max = -1.0e10; min_unbound = false; max_unbound = false; } }; static const int32_t initial_button_rows = 6; static const int32_t initial_button_cols = 1; static const int32_t initial_output_rows = 1; static const int32_t initial_output_cols = 4; struct ControlUI : public Gtk::HBox { uint32_t port_index; /* input */ Gtk::Adjustment* adjustment; Gtk::ComboBoxText* combo; std::map* combo_map; Gtk::ToggleButton* button; Gtkmm2ext::BarController* control; Gtkmm2ext::ClickBox* clickbox; Gtk::Label label; bool logarithmic; bool update_pending; char ignore_change; Gtk::Button automate_button; /* output */ Gtk::EventBox *display; Gtk::Label* display_label; Gtk::HBox * hbox; Gtk::VBox * vbox; MeterInfo * meterinfo; ControlUI (); ~ControlUI(); }; std::vector output_controls; sigc::connection screen_update_connection; void output_update(); void build (); ControlUI* build_control_ui (guint32 port_index, PBD::Controllable *); std::vector setup_scale_values(guint32 port_index, ControlUI* cui); void control_adjustment_changed (ControlUI* cui); void parameter_changed (uint32_t, float, ControlUI* cui); void update_control_display (ControlUI* cui); void control_port_toggled (ControlUI* cui); void control_combo_changed (ControlUI* cui); void redirect_active_changed (ARDOUR::Redirect*, void*); void astate_clicked (ControlUI*, uint32_t parameter); void automation_state_changed (ControlUI*); void set_automation_state (ARDOUR::AutoState state, ControlUI* cui); void start_touch (ControlUI*); void stop_touch (ControlUI*); void print_parameter (char *buf, uint32_t len, uint32_t param); }; class PluginUIWindow : public ArdourDialog { public: PluginUIWindow (boost::shared_ptr insert, bool scrollable=false); ~PluginUIWindow (); PlugUIBase& pluginui() { return *_pluginui; } void resize_preferred(); virtual bool on_key_press_event (GdkEventKey*); virtual bool on_key_release_event (GdkEventKey*); private: PlugUIBase* _pluginui; void plugin_going_away (); }; #ifdef VST_SUPPORT class VSTPluginUI : public PlugUIBase, public Gtk::VBox { public: VSTPluginUI (boost::shared_ptr, boost::shared_ptr); ~VSTPluginUI (); gint get_preferred_height (); bool start_updating(GdkEventAny*) {return false;} bool stop_updating(GdkEventAny*) {return false;} int package (Gtk::Window&); private: boost::shared_ptr vst; Gtk::Socket socket; Gtk::HBox preset_box; Gtk::VBox vpacker; bool configure_handler (GdkEventConfigure*, Gtk::Socket*); void save_plugin_setting (); }; #endif // VST_SUPPORT #endif /* __ardour_plugin_ui_h__ */