ardour
plugin_ui.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2000-2006 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18 */
19 
20 #ifndef __ardour_plugin_ui_h__
21 #define __ardour_plugin_ui_h__
22 
23 #ifdef WAF_BUILD
24 #include "gtk2ardour-config.h"
25 #endif
26 
27 #include <vector>
28 #include <map>
29 #include <list>
30 
31 #include <sigc++/signal.h>
32 
33 #include <gtkmm/button.h>
34 #include <gtkmm/box.h>
35 #include <gtkmm/table.h>
36 #include <gtkmm/eventbox.h>
37 #include <gtkmm/viewport.h>
38 #include <gtkmm/scrolledwindow.h>
39 #include <gtkmm/label.h>
40 #include <gtkmm/menu.h>
41 #include <gtkmm/image.h>
42 #include <gtkmm/adjustment.h>
43 #include <gtkmm/togglebutton.h>
44 #include <gtkmm/socket.h>
45 #include <gtkmm/comboboxtext.h>
46 #include <gtkmm/socket.h>
47 
48 #include "ardour/types.h"
49 #include "ardour/plugin.h"
50 #include "ardour/variant.h"
51 
52 #include "ardour_button.h"
53 #include "ardour_dropdown.h"
54 #include "ardour_window.h"
55 #include "automation_controller.h"
56 
57 namespace ARDOUR {
58  class PluginInsert;
59  class Plugin;
60  class WindowsVSTPlugin;
61  class LXVSTPlugin;
62  class IOProcessor;
63  class AUPlugin;
64  class Processor;
65 }
66 
67 namespace PBD {
68  class Controllable;
69 }
70 
71 namespace Gtkmm2ext {
72  class HSliderController;
73  class BarController;
74  class ClickBox;
75  class FastMeter;
76  class PixmapButton;
77 }
78 
79 class LatencyGUI;
80 class ArdourWindow;
81 class PluginEqGui;
82 
83 class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionList
84 {
85  public:
87  virtual ~PlugUIBase();
88 
89  virtual gint get_preferred_height () = 0;
90  virtual gint get_preferred_width () = 0;
91  virtual bool resizable () { return true; }
92  virtual bool start_updating(GdkEventAny*) = 0;
93  virtual bool stop_updating(GdkEventAny*) = 0;
94 
95  virtual void activate () {}
96  virtual void deactivate () {}
97 
98  void update_preset_list ();
99  void update_preset ();
100 
101  void latency_button_clicked ();
102 
103  virtual bool on_window_show(const std::string& /*title*/) { return true; }
104  virtual void on_window_hide() {}
105 
106  virtual void forward_key_event (GdkEventKey*) {}
107  virtual void grab_focus () {}
108  virtual bool non_gtk_gui() const { return false; }
109 
110  sigc::signal<void,bool> KeyboardFocused;
111 
112  protected:
115 
116  /* UI elements that can subclasses can add to their widgets */
117 
121  Gtk::Label _preset_modified;
133  Gtk::EventBox focus_button;
135  Gtk::Expander description_expander;
148 
149  void set_latency_label ();
150 
153 
155  Gtk::Requisition pre_eq_size;
156 
157  Gtk::Image* focus_out_image;
158  Gtk::Image* focus_in_image;
160 
161  virtual void preset_selected (ARDOUR::Plugin::PresetRecord preset);
162  void add_plugin_setting ();
163  void save_plugin_setting ();
164  void delete_plugin_setting ();
165  void reset_plugin_parameters ();
166  bool focus_toggled(GdkEventButton*);
167  bool bypass_button_release(GdkEventButton*);
168  void toggle_description ();
169  void toggle_plugin_analysis ();
171  void plugin_going_away ();
172  void automation_state_changed ();
173  virtual void parameter_changed (uint32_t, float);
174  void preset_added_or_removed ();
175  void update_preset_modified ();
176 
182 };
183 
184 class GenericPluginUI : public PlugUIBase, public Gtk::VBox
185 {
186  public:
187  GenericPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> plug, bool scrollable=false);
188  ~GenericPluginUI ();
189 
190  gint get_preferred_height () { return prefheight; }
191  gint get_preferred_width () { return -1; }
192 
193  bool start_updating(GdkEventAny*);
194  bool stop_updating(GdkEventAny*);
195 
196  private:
197  Gtk::VBox main_contents;
198 
199  Gtk::HBox settings_box;
200  Gtk::HBox hpacker;
201 
202  Gtk::Table button_table;
203  Gtk::Table output_table;
204 
205  Gtk::ScrolledWindow scroller;
206  Gtk::Adjustment hAdjustment;
207  Gtk::Adjustment vAdjustment;
208  Gtk::Viewport scroller_view;
209  Gtk::Menu* automation_menu;
210 
213 
214  struct MeterInfo {
216 
217  float min;
218  float max;
221  bool packed;
222 
224  meter = 0;
225  packed = false;
226  min = 1.0e10;
227  max = -1.0e10;
228  min_unbound = false;
229  max_unbound = false;
230  }
231  };
232 
233  static const int32_t initial_button_rows = 12;
234  static const int32_t initial_button_cols = 1;
235  static const int32_t initial_output_rows = 1;
236  static const int32_t initial_output_cols = 4;
237 
238  /* FIXME: Unify with AutomationController */
239  struct ControlUI : public Gtk::HBox {
240 
241  const Evoral::Parameter parameter() const { return param; }
242 
245 
246  /* input */
247 
248  Gtk::ComboBoxText* combo;
250  Gtk::ToggleButton* button;
253  Gtk::Label label;
256  Gtk::Button automate_button;
257  Gtk::FileChooserButton* file_button;
258 
259  /* output */
260 
261  Gtk::EventBox* display;
262  Gtk::Label* display_label;
263 
264  Gtk::HBox* hbox;
265  Gtk::VBox* vbox;
267 
268  ControlUI (const Evoral::Parameter& param);
269  ~ControlUI ();
270  };
271 
272  std::vector<ControlUI*> input_controls;
273  std::vector<ControlUI*> input_controls_with_automation;
274  std::vector<ControlUI*> output_controls;
275  sigc::connection screen_update_connection;
276  void output_update();
277 
278  void build ();
280  const ARDOUR::ParameterDescriptor& desc,
282  float value,
283  bool is_input);
284 
285  void ui_parameter_changed (ControlUI* cui);
287  void update_control_display (ControlUI* cui);
288  void control_port_toggled (ControlUI* cui);
289  void control_combo_changed (ControlUI* cui);
290 
291  void astate_clicked (ControlUI*);
295 
296  /* XXX: remove */
297  void print_parameter (char *buf, uint32_t len, uint32_t param);
298  bool integer_printer (char* buf, Gtk::Adjustment &, ControlUI *);
299  bool midinote_printer(char* buf, Gtk::Adjustment &, ControlUI *);
300 
301  void set_property (const ARDOUR::ParameterDescriptor& desc,
302  Gtk::FileChooserButton* widget);
303  void property_changed (uint32_t key, const ARDOUR::Variant& value);
304 
305  typedef std::map<uint32_t, Gtk::FileChooserButton*> PropertyControls;
306  PropertyControls _property_controls;
307 };
308 
310 {
311  public:
313  bool scrollable=false,
314  bool editor=true);
315  ~PluginUIWindow ();
316 
317  PlugUIBase& pluginui() { return *_pluginui; }
318 
319  void resize_preferred();
320  void set_parent (Gtk::Window*);
321  void set_title(const std::string& title);
322 
323 
324  bool on_key_press_event (GdkEventKey*);
325  bool on_key_release_event (GdkEventKey*);
326  void on_show ();
327  void on_hide ();
328 
329  private:
330  std::string _title;
333  Gtk::Window* parent;
334  Gtk::VBox vbox;
337 #ifdef AUDIOUNIT_SUPPORT
338  int pre_deactivate_x;
339  int pre_deactivate_y;
340 #endif
341 
342  void keyboard_focused (bool yn);
343 
344  void app_activated (bool);
345  void plugin_going_away ();
346 
351 };
352 
353 #ifdef AUDIOUNIT_SUPPORT
354 /* this function has to be in a .mm file */
356 #endif
357 
358 #endif /* __ardour_plugin_ui_h__ */
void set_automation_state(ARDOUR::AutoState state, ControlUI *cui)
bool integer_printer(char *buf, Gtk::Adjustment &, ControlUI *)
PlugUIBase * create_au_gui(boost::shared_ptr< PluginInsert > plugin_insert, VBox **box)
Definition: au_pluginui.mm:808
void set_parent(Gtk::Window *)
PluginEqGui * eqgui
Definition: plugin_ui.h:154
const Evoral::Parameter parameter() const
Definition: plugin_ui.h:241
bool stop_updating(GdkEventAny *)
void toggle_description()
Definition: plugin_ui.cc:700
std::vector< ControlUI * > output_controls
Definition: plugin_ui.h:274
sigc::signal< void, bool > KeyboardFocused
Definition: plugin_ui.h:110
Gtk::Table button_table
Definition: plugin_ui.h:202
std::string _title
Definition: plugin_ui.h:330
void update_control_display(ControlUI *cui)
bool _keyboard_focused
Definition: plugin_ui.h:336
virtual void deactivate()
Definition: plugin_ui.h:96
PluginUIWindow(boost::shared_ptr< ARDOUR::PluginInsert > insert, bool scrollable=false, bool editor=true)
Definition: plugin_ui.cc:81
Gtk::Image * focus_in_image
Definition: plugin_ui.h:158
void set_latency_label()
Definition: plugin_ui.cc:509
void ui_parameter_changed(ControlUI *cui)
void latency_button_clicked()
Definition: plugin_ui.cc:526
void update_preset()
Definition: plugin_ui.cc:783
ArdourDropdown _preset_combo
Definition: plugin_ui.h:119
void preset_added_or_removed()
Definition: plugin_ui.cc:823
PlugUIBase & pluginui()
Definition: plugin_ui.h:317
Gtkmm2ext::FastMeter * meter
Definition: plugin_ui.h:215
void print_parameter(char *buf, uint32_t len, uint32_t param)
Gtk::VBox vbox
Definition: plugin_ui.h:334
virtual bool non_gtk_gui() const
Definition: plugin_ui.h:108
void astate_clicked(ControlUI *)
virtual bool start_updating(GdkEventAny *)=0
void update_preset_modified()
Definition: plugin_ui.cc:802
ArdourButton delete_button
Definition: plugin_ui.h:127
void automation_state_changed()
Definition: plugin_ui.cc:650
static const int32_t initial_button_rows
Definition: plugin_ui.h:233
boost::shared_ptr< ARDOUR::PluginInsert > insert
Definition: plugin_ui.h:113
ArdourButton latency_button
Definition: plugin_ui.h:139
static const int32_t initial_output_rows
Definition: plugin_ui.h:235
virtual void grab_focus()
Definition: plugin_ui.h:107
Gtk::ComboBoxText * combo
Definition: plugin_ui.h:248
std::map< uint32_t, Gtk::FileChooserButton * > PropertyControls
Definition: plugin_ui.h:305
Gtk::FileChooserButton * file_button
Definition: plugin_ui.h:257
bool was_visible
Definition: plugin_ui.h:335
ArdourButton bypass_button
Definition: plugin_ui.h:131
void processor_active_changed(boost::weak_ptr< ARDOUR::Processor > p)
Definition: plugin_ui.cc:547
Gtk::ScrolledWindow scroller
Definition: plugin_ui.h:205
PBD::ScopedConnectionList control_connections
Definition: plugin_ui.h:181
Gtk::Requisition pre_eq_size
Definition: plugin_ui.h:155
PBD::ScopedConnection preset_removed_connection
Definition: plugin_ui.h:180
virtual void activate()
Definition: plugin_ui.h:95
void control_combo_changed(ControlUI *cui)
virtual gint get_preferred_height()=0
void save_plugin_setting()
Definition: plugin_ui.cc:619
bool create_lv2_editor(boost::shared_ptr< ARDOUR::PluginInsert >)
Definition: plugin_ui.cc:323
gint get_preferred_width()
Definition: plugin_ui.h:191
Gtk::Expander description_expander
Definition: plugin_ui.h:135
Gtk::EventBox * display
Definition: plugin_ui.h:261
bool bypass_button_release(GdkEventButton *)
Definition: plugin_ui.cc:662
virtual void forward_key_event(GdkEventKey *)
Definition: plugin_ui.h:106
std::vector< ControlUI * > input_controls
Definition: plugin_ui.h:272
bool create_windows_vst_editor(boost::shared_ptr< ARDOUR::PluginInsert >)
Definition: plugin_ui.cc:217
Gtk::Expander plugin_analysis_expander
Definition: plugin_ui.h:137
LatencyGUI * latency_gui
Definition: plugin_ui.h:151
void control_port_toggled(ControlUI *cui)
bool on_key_release_event(GdkEventKey *)
Definition: plugin_ui.cc:388
PBD::ScopedConnection preset_added_connection
Definition: plugin_ui.h:179
Gtk::EventBox focus_button
Definition: plugin_ui.h:133
virtual bool stop_updating(GdkEventAny *)=0
void set_property(const ARDOUR::ParameterDescriptor &desc, Gtk::FileChooserButton *widget)
Gtkmm2ext::ClickBox * clickbox
Definition: plugin_ui.h:252
Gtk::ToggleButton * button
Definition: plugin_ui.h:250
void plugin_going_away()
Definition: plugin_ui.cc:501
Gtk::Viewport scroller_view
Definition: plugin_ui.h:208
Definition: amp.h:29
virtual bool on_window_show(const std::string &)
Definition: plugin_ui.h:103
Gtk::VBox main_contents
Definition: plugin_ui.h:197
ArdourButton automation_write_all_button
Definition: plugin_ui.h:145
boost::shared_ptr< ARDOUR::AutomationControl > control
Definition: plugin_ui.h:244
boost::shared_ptr< ARDOUR::ScalePoints > scale_points
Definition: plugin_ui.h:249
Gtk::Image * focus_out_image
Definition: plugin_ui.h:157
void add_plugin_setting()
Definition: plugin_ui.cc:589
Gtk::Adjustment hAdjustment
Definition: plugin_ui.h:206
virtual bool resizable()
Definition: plugin_ui.h:91
PBD::ScopedConnection death_connection
Definition: plugin_ui.h:177
Gtk::Button automate_button
Definition: plugin_ui.h:256
void set_title(const std::string &title)
Definition: plugin_ui.cc:207
bool create_audiounit_editor(boost::shared_ptr< ARDOUR::PluginInsert >)
Definition: plugin_ui.cc:277
ControlUI * build_control_ui(const Evoral::Parameter &param, const ARDOUR::ParameterDescriptor &desc, boost::shared_ptr< ARDOUR::AutomationControl > mcontrol, float value, bool is_input)
void toggle_parameter_changed(ControlUI *cui)
ArdourButton automation_manual_all_button
Definition: plugin_ui.h:141
void keyboard_focused(bool yn)
Definition: plugin_ui.cc:346
static const int32_t initial_output_cols
Definition: plugin_ui.h:236
boost::shared_ptr< AutomationController > controller
Definition: plugin_ui.h:251
Gtk::Table output_table
Definition: plugin_ui.h:203
PBD::ScopedConnection active_connection
Definition: plugin_ui.h:178
void app_activated(bool)
Definition: plugin_ui.cc:298
bool focus_toggled(GdkEventButton *)
Definition: plugin_ui.cc:678
Gtk::HBox settings_box
Definition: plugin_ui.h:199
void property_changed(uint32_t key, const ARDOUR::Variant &value)
ArdourButton automation_touch_all_button
Definition: plugin_ui.h:147
PBD::ScopedConnection death_connection
Definition: plugin_ui.h:332
ArdourButton add_button
Definition: plugin_ui.h:123
Definition: debug.h:30
bool create_lxvst_editor(boost::shared_ptr< ARDOUR::PluginInsert >)
Definition: plugin_ui.cc:247
virtual gint get_preferred_width()=0
Gtk::Menu * automation_menu
Definition: plugin_ui.h:209
PlugUIBase * _pluginui
Definition: plugin_ui.h:331
Gtk::Adjustment vAdjustment
Definition: plugin_ui.h:207
void update_preset_list()
Definition: plugin_ui.cc:759
GenericPluginUI(boost::shared_ptr< ARDOUR::PluginInsert > plug, bool scrollable=false)
void delete_plugin_setting()
Definition: plugin_ui.cc:637
PropertyControls _property_controls
Definition: plugin_ui.h:306
virtual ~PlugUIBase()
Definition: plugin_ui.cc:494
void on_show()
Definition: plugin_ui.cc:170
bool is_scrollable
Definition: plugin_ui.h:212
boost::shared_ptr< ARDOUR::Plugin > plugin
Definition: plugin_ui.h:114
virtual void on_window_hide()
Definition: plugin_ui.h:104
void resize_preferred()
void toggle_plugin_analysis()
Definition: plugin_ui.cc:723
Gtk::Label _preset_modified
Definition: plugin_ui.h:121
virtual void parameter_changed(uint32_t, float)
Definition: plugin_ui.cc:817
Evoral::Parameter param
Definition: plugin_ui.h:243
gint get_preferred_height()
Definition: plugin_ui.h:190
ArdourWindow * latency_dialog
Definition: plugin_ui.h:152
Gtk::Label * display_label
Definition: plugin_ui.h:262
bool start_updating(GdkEventAny *)
std::vector< ControlUI * > input_controls_with_automation
Definition: plugin_ui.h:273
ArdourButton automation_play_all_button
Definition: plugin_ui.h:143
int _no_load_preset
Definition: plugin_ui.h:159
ArdourButton reset_button
Definition: plugin_ui.h:129
Gtk::Window * parent
Definition: plugin_ui.h:333
sigc::connection screen_update_connection
Definition: plugin_ui.h:275
bool on_key_press_event(GdkEventKey *)
Definition: plugin_ui.cc:352
bool midinote_printer(char *buf, Gtk::Adjustment &, ControlUI *)
Gtk::HBox hpacker
Definition: plugin_ui.h:200
void plugin_going_away()
Definition: plugin_ui.cc:404
PlugUIBase(boost::shared_ptr< ARDOUR::PluginInsert >)
Definition: plugin_ui.cc:415
virtual void preset_selected(ARDOUR::Plugin::PresetRecord preset)
Definition: plugin_ui.cc:558
void reset_plugin_parameters()
Definition: plugin_ui.cc:656
ControlUI(const Evoral::Parameter &param)
void on_hide()
Definition: plugin_ui.cc:193
void set_all_automation(ARDOUR::AutoState state)
ArdourButton save_button
Definition: plugin_ui.h:125
AutoState
Definition: types.h:145
static const int32_t initial_button_cols
Definition: plugin_ui.h:234