1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2021 Joël Krähemann
3  *
4  * This file is part of GSequencer.
5  *
6  * GSequencer is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSequencer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <ags/X/ags_plugin_browser.h>
21 #include <ags/X/ags_plugin_browser_callbacks.h>
22 
23 #include <ags/X/ags_lv2_browser.h>
24 #include <ags/X/ags_dssi_browser.h>
25 #include <ags/X/ags_ladspa_browser.h>
26 
27 #include <ags/i18n.h>
28 
29 void ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser);
30 void ags_plugin_browser_init(AgsPluginBrowser *plugin_browser);
31 void ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable);
32 void ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable);
33 
34 gboolean ags_plugin_browser_delete_event(GtkWidget *widget, GdkEventAny *event);
35 void ags_plugin_browser_show(GtkWidget *widget);
36 
37 void ags_plugin_browser_connect(AgsConnectable *connectable);
38 void ags_plugin_browser_disconnect(AgsConnectable *connectable);
39 
40 void ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update);
41 void ags_plugin_browser_apply(AgsApplicable *applicable);
42 void ags_plugin_browser_reset(AgsApplicable *applicable);
43 
44 /**
45  * SECTION:ags_plugin_browser
46  * @short_description: A composite to select plugin effect.
47  * @title: AgsPluginBrowser
48  * @section_id:
49  * @include: ags/X/ags_plugin_browser.h
50  *
51  * #AgsPluginBrowser is a composite widget to select plugin plugin and the desired
52  * effect.
53  */
54 
55 static gpointer ags_plugin_browser_parent_class = NULL;
56 
57 GType
ags_plugin_browser_get_type(void)58 ags_plugin_browser_get_type(void)
59 {
60   static volatile gsize g_define_type_id__volatile = 0;
61 
62   if(g_once_init_enter (&g_define_type_id__volatile)){
63     GType ags_type_plugin_browser = 0;
64 
65     static const GTypeInfo ags_plugin_browser_info = {
66       sizeof (AgsPluginBrowserClass),
67       NULL, /* base_init */
68       NULL, /* base_finalize */
69       (GClassInitFunc) ags_plugin_browser_class_init,
70       NULL, /* class_finalize */
71       NULL, /* class_data */
72       sizeof (AgsPluginBrowser),
73       0,    /* n_preallocs */
74       (GInstanceInitFunc) ags_plugin_browser_init,
75     };
76 
77     static const GInterfaceInfo ags_connectable_interface_info = {
78       (GInterfaceInitFunc) ags_plugin_browser_connectable_interface_init,
79       NULL, /* interface_finalize */
80       NULL, /* interface_data */
81     };
82 
83     static const GInterfaceInfo ags_applicable_interface_info = {
84       (GInterfaceInitFunc) ags_plugin_browser_applicable_interface_init,
85       NULL, /* interface_finalize */
86       NULL, /* interface_data */
87     };
88 
89     ags_type_plugin_browser = g_type_register_static(GTK_TYPE_DIALOG,
90 						     "AgsPluginBrowser", &ags_plugin_browser_info,
91 						     0);
92 
93     g_type_add_interface_static(ags_type_plugin_browser,
94 				AGS_TYPE_CONNECTABLE,
95 				&ags_connectable_interface_info);
96 
97     g_type_add_interface_static(ags_type_plugin_browser,
98 				AGS_TYPE_APPLICABLE,
99 				&ags_applicable_interface_info);
100 
101     g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_browser);
102   }
103 
104   return g_define_type_id__volatile;
105 }
106 
107 void
ags_plugin_browser_class_init(AgsPluginBrowserClass * plugin_browser)108 ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser)
109 {
110   GtkWidgetClass *widget;
111 
112   ags_plugin_browser_parent_class = g_type_class_peek_parent(plugin_browser);
113 
114   /* GtkWidgetClass */
115   widget = (GtkWidgetClass *) plugin_browser;
116 
117   widget->delete_event = ags_plugin_browser_delete_event;
118   widget->show = ags_plugin_browser_show;
119 }
120 
121 void
ags_plugin_browser_connectable_interface_init(AgsConnectableInterface * connectable)122 ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable)
123 {
124   connectable->is_ready = NULL;
125   connectable->is_connected = NULL;
126   connectable->connect = ags_plugin_browser_connect;
127   connectable->disconnect = ags_plugin_browser_disconnect;
128 }
129 
130 void
ags_plugin_browser_applicable_interface_init(AgsApplicableInterface * applicable)131 ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable)
132 {
133   applicable->set_update = ags_plugin_browser_set_update;
134   applicable->apply = ags_plugin_browser_apply;
135   applicable->reset = ags_plugin_browser_reset;
136 }
137 
138 void
ags_plugin_browser_init(AgsPluginBrowser * plugin_browser)139 ags_plugin_browser_init(AgsPluginBrowser *plugin_browser)
140 {
141   GtkBox *vbox;
142   GtkBox *hbox;
143   GtkLabel *label;
144 
145   plugin_browser->flags = 0;
146 
147   gtk_window_set_title((GtkWindow *) plugin_browser,
148 		       i18n("Plugin browser"));
149 
150   vbox = (GtkBox *) gtk_box_new(GTK_ORIENTATION_VERTICAL,
151 				0);
152   gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(plugin_browser)),
153 		     GTK_WIDGET(vbox),
154 		     FALSE, FALSE,
155 		     0);
156 
157   hbox = (GtkBox *) gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
158 				0);
159   gtk_box_pack_start((GtkBox *) vbox,
160 		     (GtkWidget *) hbox,
161 		     FALSE, FALSE,
162 		     0);
163 
164   label = (GtkLabel *) gtk_label_new(i18n("Plugin type:"));
165   gtk_box_pack_start((GtkBox *) hbox,
166 		     (GtkWidget *) label,
167 		     FALSE, FALSE,
168 		     0);
169 
170   plugin_browser->plugin_type = (GtkComboBoxText *) gtk_combo_box_text_new();
171   gtk_box_pack_start((GtkBox *) hbox,
172 		     (GtkWidget *) plugin_browser->plugin_type,
173 		     FALSE, FALSE,
174 		     0);
175 
176   gtk_combo_box_text_append_text(plugin_browser->plugin_type,
177 				 "lv2");
178   gtk_combo_box_text_append_text(plugin_browser->plugin_type,
179 				 "ladspa");
180 
181   plugin_browser->active_browser = NULL;
182 
183   plugin_browser->lv2_browser = (GtkWidget *) ags_lv2_browser_new();
184   gtk_box_pack_start((GtkBox *) vbox,
185 		     (GtkWidget *) plugin_browser->lv2_browser,
186 		     FALSE, FALSE,
187 		     0);
188 
189   plugin_browser->dssi_browser = NULL;
190 
191   plugin_browser->ladspa_browser = (GtkWidget *) ags_ladspa_browser_new();
192   gtk_box_pack_start((GtkBox *) vbox,
193 		     (GtkWidget *) plugin_browser->ladspa_browser,
194 		     FALSE, FALSE,
195 		     0);
196 
197   plugin_browser->vst_browser = NULL;
198 
199   /* action area */
200   gtk_dialog_add_buttons((GtkDialog *) plugin_browser,
201 			 i18n("_OK"), GTK_RESPONSE_ACCEPT,
202 			 i18n("_Cancel"), GTK_RESPONSE_REJECT,
203 			 NULL);
204 }
205 
206 gboolean
ags_plugin_browser_delete_event(GtkWidget * widget,GdkEventAny * event)207 ags_plugin_browser_delete_event(GtkWidget *widget, GdkEventAny *event)
208 {
209   gtk_widget_hide(widget);
210 
211   return(TRUE);
212 }
213 
214 void
ags_plugin_browser_show(GtkWidget * widget)215 ags_plugin_browser_show(GtkWidget *widget)
216 {
217   AgsPluginBrowser *plugin_browser;
218 
219   plugin_browser = AGS_PLUGIN_BROWSER(widget);
220 
221   GTK_WIDGET_CLASS(ags_plugin_browser_parent_class)->show(widget);
222 
223   gtk_widget_hide(plugin_browser->lv2_browser);
224   gtk_widget_hide(plugin_browser->ladspa_browser);
225 }
226 
227 void
ags_plugin_browser_connect(AgsConnectable * connectable)228 ags_plugin_browser_connect(AgsConnectable *connectable)
229 {
230   AgsPluginBrowser *plugin_browser;
231 
232   plugin_browser = AGS_PLUGIN_BROWSER(connectable);
233 
234   if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) != 0){
235     return;
236   }
237 
238   plugin_browser->flags |= AGS_PLUGIN_BROWSER_CONNECTED;
239 
240   g_signal_connect(plugin_browser->plugin_type, "changed",
241 		   G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback), plugin_browser);
242 
243   ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->lv2_browser));
244   ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->ladspa_browser));
245 
246   /* AgsPluginBrowser response */
247   g_signal_connect((GObject *) plugin_browser, "response",
248 		   G_CALLBACK(ags_plugin_browser_response_callback), NULL);
249 }
250 
251 void
ags_plugin_browser_disconnect(AgsConnectable * connectable)252 ags_plugin_browser_disconnect(AgsConnectable *connectable)
253 {
254   AgsPluginBrowser *plugin_browser;
255 
256   plugin_browser = AGS_PLUGIN_BROWSER(connectable);
257 
258   if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) == 0){
259     return;
260   }
261 
262   plugin_browser->flags &= (~AGS_PLUGIN_BROWSER_CONNECTED);
263 
264   g_object_disconnect(plugin_browser->plugin_type,
265 		      "any_signal::changed",
266 		      G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback),
267 		      plugin_browser,
268 		      NULL);
269 
270   ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->lv2_browser));
271   ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->ladspa_browser));
272 
273   /* AgsPluginBrowser buttons */
274   g_object_disconnect((GObject *) plugin_browser,
275 		      "any_signal::response",
276 		      G_CALLBACK(ags_plugin_browser_response_callback),
277 		      NULL,
278 		      NULL);
279 }
280 
281 void
ags_plugin_browser_set_update(AgsApplicable * applicable,gboolean update)282 ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update)
283 {
284   /* empty */
285 }
286 
287 void
ags_plugin_browser_apply(AgsApplicable * applicable)288 ags_plugin_browser_apply(AgsApplicable *applicable)
289 {
290   //TODO:JK: implement me
291 }
292 
293 void
ags_plugin_browser_reset(AgsApplicable * applicable)294 ags_plugin_browser_reset(AgsApplicable *applicable)
295 {
296   //TODO:JK: implement me
297 }
298 
299 /**
300  * ags_plugin_browser_get_plugin_filename:
301  * @plugin_browser: the #AgsPluginBrowser
302  *
303  * Retrieve selected plugin plugin filename.
304  *
305  * Returns: the active plugin filename
306  *
307  * Since: 3.0.0
308  */
309 gchar*
ags_plugin_browser_get_plugin_filename(AgsPluginBrowser * plugin_browser)310 ags_plugin_browser_get_plugin_filename(AgsPluginBrowser *plugin_browser)
311 {
312   if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){
313     return(ags_lv2_browser_get_plugin_filename((AgsLv2Browser *) plugin_browser->lv2_browser));
314   }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){
315     return(ags_ladspa_browser_get_plugin_filename((AgsLadspaBrowser *) plugin_browser->ladspa_browser));
316   }else{
317     return(NULL);
318   }
319 }
320 
321 /**
322  * ags_plugin_browser_get_plugin_effect:
323  * @plugin_browser: the #AgsPluginBrowser
324  *
325  * Retrieve selected plugin effect.
326  *
327  * Returns: the active plugin effect
328  *
329  * Since: 3.0.0
330  */
331 gchar*
ags_plugin_browser_get_plugin_effect(AgsPluginBrowser * plugin_browser)332 ags_plugin_browser_get_plugin_effect(AgsPluginBrowser *plugin_browser)
333 {
334   if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){
335     return(ags_lv2_browser_get_plugin_effect((AgsLv2Browser *) plugin_browser->lv2_browser));
336   }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){
337     return(ags_ladspa_browser_get_plugin_effect((AgsLadspaBrowser *) plugin_browser->ladspa_browser));
338   }else{
339     return(NULL);
340   }
341 }
342 
343 /**
344  * ags_plugin_browser_new:
345  * @parent_window: the #AgsWindow
346  *
347  * Create a new instance of #AgsPluginBrowser
348  *
349  * Returns: the new #AgsPluginBrowser
350  *
351  * Since: 3.0.0
352  */
353 AgsPluginBrowser*
ags_plugin_browser_new(GtkWidget * parent_window)354 ags_plugin_browser_new(GtkWidget *parent_window)
355 {
356   AgsPluginBrowser *plugin_browser;
357 
358   plugin_browser = (AgsPluginBrowser *) g_object_new(AGS_TYPE_PLUGIN_BROWSER,
359 						     NULL);
360 
361   plugin_browser->parent_window = parent_window;
362 
363   return(plugin_browser);
364 }
365