3 * Copyright (C) 2007 Krzysztof Foltman
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02111-1307, USA.
28 #include "custom_ctl.h"
34 namespace calf_plugins
{
40 typedef std::map
<std::string
, std::string
> xml_attribute_map
;
41 xml_attribute_map attribs
;
43 void require_attribute(const char *name
);
44 void require_int_attribute(const char *name
);
45 int get_int(const char *name
, int def_value
= 0);
46 float get_float(const char *name
, float def_value
= 0.f
);
49 #define _GUARD_CHANGE_ if (in_change) return; guard_change __gc__(this);
51 struct param_control
: public control_base
54 std::string param_variable
;
55 GtkWidget
*label
, *widget
;
60 guard_change(param_control
*_pc
) : pc(_pc
) { pc
->in_change
++; }
61 ~guard_change() { pc
->in_change
--; }
64 param_control() { gui
= NULL
; param_no
= -1; label
= NULL
; in_change
= 0;}
65 inline parameter_properties
&get_props();
67 virtual void init_xml(const char *element
) {}
68 virtual GtkWidget
*create_label();
69 virtual void update_label();
70 /// called to create a widget for a control
71 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
)=0;
72 /// called to transfer the value from control to parameter(s)
74 /// called to transfer the value from parameter(s) to control
76 /// called on DSSI configure()
77 virtual void configure(const char *key
, const char *value
) {}
78 virtual void hook_params();
79 virtual void on_idle() {}
80 virtual ~param_control();
83 /////////////////////////////////////////////////////////////////////////////////////////////
86 struct control_container
: public control_base
88 GtkContainer
*container
;
90 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
)=0;
91 virtual void add(GtkWidget
*w
, control_base
*base
) { gtk_container_add(container
, w
); }
92 virtual ~control_container() {}
95 struct table_container
: public control_container
97 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
98 virtual void add(GtkWidget
*w
, control_base
*base
);
101 struct alignment_container
: public control_container
103 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
106 struct frame_container
: public control_container
108 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
111 struct box_container
: public control_container
113 virtual void add(GtkWidget
*w
, control_base
*base
);
116 struct vbox_container
: public box_container
118 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
121 struct hbox_container
: public box_container
123 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
126 struct notebook_container
: public control_container
128 virtual void add(GtkWidget
*w
, control_base
*base
);
129 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
132 struct scrolled_container
: public control_container
134 virtual void add(GtkWidget
*w
, control_base
*base
);
135 virtual GtkWidget
*create(plugin_gui
*_gui
, const char *element
, xml_attribute_map
&attributes
);
138 ////////////////////////////////////////////////////////////////////////////////////////////////////
141 /// Display-only control: static text
142 struct label_param_control
: public param_control
144 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
145 virtual void get() {}
146 virtual void set() {}
149 /// Display-only control: value text
150 struct value_param_control
: public param_control
, public send_updates_iface
152 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
153 virtual void get() {}
155 virtual void send_status(const char *key
, const char *value
);
158 /// Display-only control: volume meter
159 struct vumeter_param_control
: public param_control
161 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
162 virtual void get() {}
166 /// Display-only control: LED
167 struct led_param_control
: public param_control
169 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
170 virtual void get() {}
174 /// Horizontal slider
175 struct hscale_param_control
: public param_control
177 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
180 virtual void init_xml(const char *element
);
181 static void hscale_value_changed(GtkHScale
*widget
, gpointer value
);
182 static gchar
*hscale_format_value(GtkScale
*widget
, double arg1
, gpointer value
);
186 struct vscale_param_control
: public param_control
188 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
191 virtual void init_xml(const char *element
);
192 static void vscale_value_changed(GtkHScale
*widget
, gpointer value
);
196 struct spin_param_control
: public param_control
198 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
201 static void value_changed(GtkSpinButton
*widget
, gpointer value
);
205 struct toggle_param_control
: public param_control
207 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
210 static void toggle_value_changed(GtkCheckButton
*widget
, gpointer value
);
214 struct button_param_control
: public param_control
216 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
219 static void button_clicked(GtkButton
*widget
, gpointer value
);
223 struct combo_box_param_control
: public param_control
, public send_updates_iface
225 GtkListStore
*lstore
;
226 std::map
<std::string
, GtkTreeIter
> key2pos
;
227 std::string last_key
;
229 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
232 virtual void send_status(const char *key
, const char *value
);
233 void set_to_last_key();
234 static void combo_value_changed(GtkComboBox
*widget
, gpointer value
);
238 struct line_graph_param_control
: public param_control
242 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
243 virtual void get() {}
245 virtual void on_idle();
246 virtual ~line_graph_param_control();
250 struct knob_param_control
: public param_control
252 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
255 static void knob_value_changed(GtkWidget
*widget
, gpointer value
);
258 /// Static keyboard image
259 struct keyboard_param_control
: public param_control
263 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
264 virtual void get() {}
265 virtual void set() {}
269 struct curve_param_control
: public param_control
, public send_configure_iface
273 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
274 virtual void get() {}
275 virtual void set() {}
276 virtual void send_configure(const char *key
, const char *value
);
280 struct entry_param_control
: public param_control
, public send_configure_iface
284 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
285 virtual void get() {}
286 virtual void set() {}
287 virtual void send_configure(const char *key
, const char *value
);
288 static void entry_value_changed(GtkWidget
*widget
, gpointer value
);
291 /// File chooser button
292 struct filechooser_param_control
: public param_control
, public send_configure_iface
294 GtkFileChooserButton
*filechooser
;
296 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
297 virtual void get() {}
298 virtual void set() {}
299 virtual void send_configure(const char *key
, const char *value
);
300 static void filechooser_value_changed(GtkWidget
*widget
, gpointer value
);
303 /// List view used for variable-length tabular data
304 struct listview_param_control
: public param_control
, public send_configure_iface
307 GtkListStore
*lstore
;
308 calf_plugins::table_edit_iface
*teif
;
310 std::vector
<GtkTreeIter
> positions
;
312 virtual GtkWidget
*create(plugin_gui
*_gui
, int _param_no
);
313 virtual void get() {}
314 virtual void set() {}
315 virtual void send_configure(const char *key
, const char *value
);
317 static void on_edited(GtkCellRenderer
*renderer
, gchar
*path
, gchar
*new_text
, listview_param_control
*pThis
);
318 static void on_editing_canceled(GtkCellRenderer
*renderer
, listview_param_control
*pThis
);
321 class plugin_gui_window
;
323 class plugin_gui
: public send_configure_iface
, public send_updates_iface
327 std::multimap
<int, param_control
*> par2ctl
;
329 param_control
*current_control
;
330 std::vector
<control_container
*> container_stack
;
331 control_container
*top_container
;
332 std::map
<std::string
, int> param_name_map
;
334 int last_status_serial_no
;
336 plugin_gui_window
*window
;
337 GtkWidget
*container
;
338 const char *effect_name
;
339 plugin_ctl_iface
*plugin
;
340 std::vector
<param_control
*> params
;
342 plugin_gui(plugin_gui_window
*_window
);
343 GtkWidget
*create_from_xml(plugin_ctl_iface
*_plugin
, const char *xml
);
344 param_control
*create_control_from_xml(const char *element
, const char *attributes
[]);
345 control_container
*create_container_from_xml(const char *element
, const char *attributes
[]);
347 void add_param_ctl(int param
, param_control
*ctl
) { par2ctl
.insert(std::pair
<int, param_control
*>(param
, ctl
)); }
349 void refresh(int param_no
, param_control
*originator
= NULL
);
350 void xml_element_start(const char *element
, const char *attributes
[]);
351 void set_param_value(int param_no
, float value
, param_control
*originator
= NULL
);
352 /// Called on change of configure variable
353 void send_configure(const char *key
, const char *value
);
354 /// Called on change of status variable
355 void send_status(const char *key
, const char *value
);
358 static void xml_element_start(void *data
, const char *element
, const char *attributes
[]);
359 static void xml_element_end(void *data
, const char *element
);
362 class main_window_owner_iface
;
364 class main_window_iface
367 virtual void set_owner(main_window_owner_iface
*owner
)=0;
369 virtual void add_plugin(plugin_ctl_iface
*plugin
)=0;
370 virtual void del_plugin(plugin_ctl_iface
*plugin
)=0;
372 virtual void set_window(plugin_ctl_iface
*plugin
, plugin_gui_window
*window
)=0;
373 virtual void refresh_all_presets(bool builtin_too
)=0;
374 virtual bool check_condition(const char *name
)=0;
375 virtual ~main_window_iface() {}
378 class main_window_owner_iface
381 virtual void new_plugin(const char *name
) = 0;
382 virtual void remove_plugin(plugin_ctl_iface
*plugin
) = 0;
383 virtual ~main_window_owner_iface() {}
386 class plugin_gui_window
391 GtkUIManager
*ui_mgr
;
392 GtkActionGroup
*std_actions
, *builtin_preset_actions
, *user_preset_actions
, *command_actions
;
393 main_window_iface
*main
;
396 plugin_gui_window(main_window_iface
*_main
);
397 std::string
make_gui_preset_list(GtkActionGroup
*grp
, bool builtin
, char &ch
);
398 std::string
make_gui_command_list(GtkActionGroup
*grp
);
399 void fill_gui_presets(bool builtin
, char &ch
);
400 void create(plugin_ctl_iface
*_plugin
, const char *title
, const char *effect
);
402 static gboolean
on_idle(void *data
);
403 ~plugin_gui_window();
407 inline parameter_properties
¶m_control::get_props()
409 return *gui
->plugin
->get_param_props(param_no
);
412 class null_audio_module
;
414 struct activate_command_params
416 typedef void (*CommandFunc
)(null_audio_module
*);
420 activate_command_params(plugin_gui
*_gui
, int _idx
)
421 : gui(_gui
), function_idx(_idx
)
426 void activate_command(GtkAction
*action
, activate_command_params
*params
);