1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2020 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/editor/ags_composite_toolbar.h>
21 #include <ags/X/editor/ags_composite_toolbar_callbacks.h>
22 
23 #include <ags/X/ags_menu_bar.h>
24 
25 #include <ags/X/editor/ags_move_note_dialog.h>
26 #include <ags/X/editor/ags_crop_note_dialog.h>
27 #include <ags/X/editor/ags_select_note_dialog.h>
28 #include <ags/X/editor/ags_position_notation_cursor_dialog.h>
29 
30 #include <libxml/tree.h>
31 #include <libxml/xpath.h>
32 
33 #include <ags/i18n.h>
34 
35 void ags_composite_toolbar_class_init(AgsCompositeToolbarClass *composite_toolbar);
36 void ags_composite_toolbar_connectable_interface_init(AgsConnectableInterface *connectable);
37 void ags_composite_toolbar_init(AgsCompositeToolbar *composite_toolbar);
38 
39 AgsUUID* ags_composite_toolbar_get_uuid(AgsConnectable *connectable);
40 gboolean ags_composite_toolbar_has_resource(AgsConnectable *connectable);
41 gboolean ags_composite_toolbar_is_ready(AgsConnectable *connectable);
42 void ags_composite_toolbar_add_to_registry(AgsConnectable *connectable);
43 void ags_composite_toolbar_remove_from_registry(AgsConnectable *connectable);
44 xmlNode* ags_composite_toolbar_list_resource(AgsConnectable *connectable);
45 xmlNode* ags_composite_toolbar_xml_compose(AgsConnectable *connectable);
46 void ags_composite_toolbar_xml_parse(AgsConnectable *connectable,
47 				     xmlNode *node);
48 gboolean ags_composite_toolbar_is_connected(AgsConnectable *connectable);
49 void ags_composite_toolbar_connect(AgsConnectable *connectable);
50 void ags_composite_toolbar_disconnect(AgsConnectable *connectable);
51 void ags_composite_toolbar_connect_connection(AgsConnectable *connectable,
52 					      GObject *connection);
53 void ags_composite_toolbar_disconnect_connection(AgsConnectable *connectable,
54 						 GObject *connection);
55 
56 static gpointer ags_composite_toolbar_parent_class = NULL;
57 
58 /**
59  * SECTION:ags_composite_toolbar
60  * @short_description: composite_toolbar
61  * @title: AgsCompositeToolbar
62  * @section_id:
63  * @include: ags/X/editor/ags_composite_toolbar.h
64  *
65  * The #AgsCompositeToolbar lets you choose edit tool.
66  */
67 
68 GType
ags_composite_toolbar_get_type(void)69 ags_composite_toolbar_get_type(void)
70 {
71   static volatile gsize g_define_type_id__volatile = 0;
72 
73   if(g_once_init_enter (&g_define_type_id__volatile)){
74     GType ags_type_composite_toolbar = 0;
75 
76     static const GTypeInfo ags_composite_toolbar_info = {
77       sizeof (AgsCompositeToolbarClass),
78       NULL, /* base_init */
79       NULL, /* base_finalize */
80       (GClassInitFunc) ags_composite_toolbar_class_init,
81       NULL, /* class_finalize */
82       NULL, /* class_data */
83       sizeof (AgsCompositeToolbar),
84       0,    /* n_preallocs */
85       (GInstanceInitFunc) ags_composite_toolbar_init,
86     };
87 
88     static const GInterfaceInfo ags_connectable_interface_info = {
89 	(GInterfaceInitFunc) ags_composite_toolbar_connectable_interface_init,
90 	NULL, /* interface_finalize */
91 	NULL, /* interface_data */
92     };
93 
94     ags_type_composite_toolbar = g_type_register_static(GTK_TYPE_TOOLBAR,
95 							"AgsCompositeToolbar", &ags_composite_toolbar_info,
96 							0);
97 
98     g_type_add_interface_static(ags_type_composite_toolbar,
99 				AGS_TYPE_CONNECTABLE,
100 				&ags_connectable_interface_info);
101 
102     g_once_init_leave(&g_define_type_id__volatile, ags_type_composite_toolbar);
103   }
104 
105   return g_define_type_id__volatile;
106 }
107 
108 void
ags_composite_toolbar_class_init(AgsCompositeToolbarClass * composite_toolbar)109 ags_composite_toolbar_class_init(AgsCompositeToolbarClass *composite_toolbar)
110 {
111   ags_composite_toolbar_parent_class = g_type_class_peek_parent(composite_toolbar);
112 }
113 
114 void
ags_composite_toolbar_connectable_interface_init(AgsConnectableInterface * connectable)115 ags_composite_toolbar_connectable_interface_init(AgsConnectableInterface *connectable)
116 {
117   connectable->get_uuid = ags_composite_toolbar_get_uuid;
118   connectable->has_resource = ags_composite_toolbar_has_resource;
119 
120   connectable->is_ready = ags_composite_toolbar_is_ready;
121   connectable->add_to_registry = ags_composite_toolbar_add_to_registry;
122   connectable->remove_from_registry = ags_composite_toolbar_remove_from_registry;
123 
124   connectable->list_resource = ags_composite_toolbar_list_resource;
125   connectable->xml_compose = ags_composite_toolbar_xml_compose;
126   connectable->xml_parse = ags_composite_toolbar_xml_parse;
127 
128   connectable->is_connected = ags_composite_toolbar_is_connected;
129   connectable->connect = ags_composite_toolbar_connect;
130   connectable->disconnect = ags_composite_toolbar_disconnect;
131 
132   connectable->connect_connection = ags_composite_toolbar_connect_connection;
133   connectable->disconnect_connection = ags_composite_toolbar_disconnect_connection;
134 }
135 
136 void
ags_composite_toolbar_init(AgsCompositeToolbar * composite_toolbar)137 ags_composite_toolbar_init(AgsCompositeToolbar *composite_toolbar)
138 {
139   composite_toolbar->flags = 0;
140   composite_toolbar->tool = 0;
141   composite_toolbar->action = 0;
142   composite_toolbar->option = 0;
143 
144   composite_toolbar->version = g_strdup(AGS_COMPOSITE_TOOLBAR_DEFAULT_VERSION);
145   composite_toolbar->build_id = g_strdup(AGS_COMPOSITE_TOOLBAR_DEFAULT_BUILD_ID);
146 
147   /* uuid */
148   composite_toolbar->uuid = ags_uuid_alloc();
149   ags_uuid_generate(composite_toolbar->uuid);
150 
151   composite_toolbar->block_selected_tool = FALSE;
152   composite_toolbar->selected_tool = NULL;
153 
154   composite_toolbar->position = NULL;
155   composite_toolbar->edit = NULL;
156   composite_toolbar->clear = NULL;
157   composite_toolbar->select = NULL;
158 
159   composite_toolbar->invert = NULL;
160   composite_toolbar->copy = NULL;
161   composite_toolbar->cut = NULL;
162 
163   composite_toolbar->paste_mode = 0;
164   composite_toolbar->paste = NULL;
165   composite_toolbar->paste_popup = NULL;
166 
167   composite_toolbar->menu_tool_dialog = NULL;
168   composite_toolbar->menu_tool_value = NULL;
169   composite_toolbar->menu_tool = NULL;
170   composite_toolbar->menu_tool_popup = NULL;
171 
172   composite_toolbar->selected_zoom = 2;
173 
174   composite_toolbar->port = NULL;
175 
176   composite_toolbar->zoom = NULL;
177 
178   composite_toolbar->opacity = NULL;
179 
180   composite_toolbar->notation_move_note = NULL;
181   composite_toolbar->notation_crop_note = NULL;
182   composite_toolbar->notation_select_note = NULL;
183   composite_toolbar->notation_position_cursor = NULL;
184 
185   composite_toolbar->sheet_position_cursor = NULL;
186 
187   composite_toolbar->automation_select_acceleration = NULL;
188   composite_toolbar->automation_ramp_acceleration = NULL;
189   composite_toolbar->automation_position_cursor = NULL;
190 
191   composite_toolbar->wave_select_buffer = NULL;
192   composite_toolbar->wave_position_cursor = NULL;
193 }
194 
195 AgsUUID*
ags_composite_toolbar_get_uuid(AgsConnectable * connectable)196 ags_composite_toolbar_get_uuid(AgsConnectable *connectable)
197 {
198   AgsCompositeToolbar *composite_toolbar;
199 
200   AgsUUID *ptr;
201 
202   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
203 
204   ptr = composite_toolbar->uuid;
205 
206   return(ptr);
207 }
208 
209 gboolean
ags_composite_toolbar_has_resource(AgsConnectable * connectable)210 ags_composite_toolbar_has_resource(AgsConnectable *connectable)
211 {
212   return(FALSE);
213 }
214 
215 gboolean
ags_composite_toolbar_is_ready(AgsConnectable * connectable)216 ags_composite_toolbar_is_ready(AgsConnectable *connectable)
217 {
218   AgsCompositeToolbar *composite_toolbar;
219 
220   gboolean is_ready;
221 
222   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
223 
224   /* check is added */
225   is_ready = ags_composite_toolbar_test_flags(composite_toolbar, AGS_COMPOSITE_TOOLBAR_ADDED_TO_REGISTRY);
226 
227   return(is_ready);
228 }
229 
230 void
ags_composite_toolbar_add_to_registry(AgsConnectable * connectable)231 ags_composite_toolbar_add_to_registry(AgsConnectable *connectable)
232 {
233   AgsCompositeToolbar *composite_toolbar;
234 
235   AgsRegistry *registry;
236   AgsRegistryEntry *entry;
237 
238   AgsApplicationContext *application_context;
239 
240   if(ags_connectable_is_ready(connectable)){
241     return;
242   }
243 
244   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
245 
246   ags_composite_toolbar_set_flags(composite_toolbar, AGS_COMPOSITE_TOOLBAR_ADDED_TO_REGISTRY);
247 
248   application_context = ags_application_context_get_instance();
249 
250   registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context));
251 
252   if(registry != NULL){
253     entry = ags_registry_entry_alloc(registry);
254 
255     entry->id = composite_toolbar->uuid;
256     g_value_set_object(entry->entry,
257 		       (gpointer) composite_toolbar);
258 
259     ags_registry_add_entry(registry,
260 			   entry);
261   }
262 }
263 
264 void
ags_composite_toolbar_remove_from_registry(AgsConnectable * connectable)265 ags_composite_toolbar_remove_from_registry(AgsConnectable *connectable)
266 {
267   if(!ags_connectable_is_ready(connectable)){
268     return;
269   }
270 
271   //TODO:JK: implement me
272 }
273 
274 xmlNode*
ags_composite_toolbar_list_resource(AgsConnectable * connectable)275 ags_composite_toolbar_list_resource(AgsConnectable *connectable)
276 {
277   xmlNode *node;
278 
279   node = NULL;
280 
281   //TODO:JK: implement me
282 
283   return(node);
284 }
285 
286 xmlNode*
ags_composite_toolbar_xml_compose(AgsConnectable * connectable)287 ags_composite_toolbar_xml_compose(AgsConnectable *connectable)
288 {
289   xmlNode *node;
290 
291   node = NULL;
292 
293   //TODO:JK: implement me
294 
295   return(node);
296 }
297 
298 void
ags_composite_toolbar_xml_parse(AgsConnectable * connectable,xmlNode * node)299 ags_composite_toolbar_xml_parse(AgsConnectable *connectable,
300 				xmlNode *node)
301 {
302   //TODO:JK: implement me
303 }
304 
305 gboolean
ags_composite_toolbar_is_connected(AgsConnectable * connectable)306 ags_composite_toolbar_is_connected(AgsConnectable *connectable)
307 {
308   AgsCompositeToolbar *composite_toolbar;
309 
310   gboolean is_connected;
311 
312   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
313 
314   /* check is connected */
315   is_connected = ags_composite_toolbar_test_flags(composite_toolbar, AGS_COMPOSITE_TOOLBAR_CONNECTED);
316 
317   return(is_connected);
318 }
319 
320 void
ags_composite_toolbar_connect(AgsConnectable * connectable)321 ags_composite_toolbar_connect(AgsConnectable *connectable)
322 {
323   AgsCompositeToolbar *composite_toolbar;
324 
325   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
326 
327   if((AGS_COMPOSITE_TOOLBAR_CONNECTED & (composite_toolbar->flags)) != 0){
328     return;
329   }
330 
331   composite_toolbar->flags |= AGS_COMPOSITE_TOOLBAR_CONNECTED;
332 
333   //TODO:JK: implement me
334 }
335 
336 void
ags_composite_toolbar_disconnect(AgsConnectable * connectable)337 ags_composite_toolbar_disconnect(AgsConnectable *connectable)
338 {
339   AgsCompositeToolbar *composite_toolbar;
340 
341   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
342 
343   if((AGS_COMPOSITE_TOOLBAR_CONNECTED & (composite_toolbar->flags)) == 0){
344     return;
345   }
346 
347   composite_toolbar->flags &= (~AGS_COMPOSITE_TOOLBAR_CONNECTED);
348 
349   //TODO:JK: implement me
350 }
351 
352 void
ags_composite_toolbar_connect_connection(AgsConnectable * connectable,GObject * connection)353 ags_composite_toolbar_connect_connection(AgsConnectable *connectable,
354 					 GObject *connection)
355 {
356   AgsCompositeToolbar *composite_toolbar;
357 
358   if(connection == NULL){
359     return;
360   }
361 
362   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
363 
364   if(composite_toolbar->position == connection){
365     g_signal_connect_after(connection, "clicked",
366 			   G_CALLBACK(ags_composite_toolbar_position_callback), composite_toolbar);
367   }
368 
369   if(composite_toolbar->edit == connection){
370     g_signal_connect_after(connection, "clicked",
371 			   G_CALLBACK(ags_composite_toolbar_edit_callback), composite_toolbar);
372   }
373 
374   if(composite_toolbar->clear == connection){
375     g_signal_connect_after(connection, "clicked",
376 			   G_CALLBACK(ags_composite_toolbar_position_callback), composite_toolbar);
377   }
378 
379   if(composite_toolbar->select == connection){
380     g_signal_connect_after(connection, "clicked",
381 			   G_CALLBACK(ags_composite_toolbar_select_callback), composite_toolbar);
382   }
383 
384   if(composite_toolbar->invert == connection){
385     g_signal_connect_after(connection, "clicked",
386 			   G_CALLBACK(ags_composite_toolbar_invert_callback), composite_toolbar);
387   }
388 
389   if(composite_toolbar->copy == connection){
390     g_signal_connect_after(connection, "clicked",
391 			   G_CALLBACK(ags_composite_toolbar_copy_callback), composite_toolbar);
392   }
393 
394   if(composite_toolbar->cut == connection){
395     g_signal_connect_after(connection, "clicked",
396 			   G_CALLBACK(ags_composite_toolbar_cut_callback), composite_toolbar);
397   }
398 
399   if(composite_toolbar->paste == connection){
400     GList *start_list, *list;
401 
402     g_signal_connect_after(connection, "clicked",
403 			   G_CALLBACK(ags_composite_toolbar_paste_callback), composite_toolbar);
404 
405     list =
406       start_list = gtk_container_get_children(GTK_CONTAINER(composite_toolbar->paste_popup));
407 
408     if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_AUDIO_CHANNEL & (composite_toolbar->paste_mode)) != 0){
409       g_signal_connect_after(list->data, "activate",
410 			     G_CALLBACK(ags_composite_toolbar_paste_match_audio_channel_callback), composite_toolbar);
411 
412       list = list->next;
413     }
414 
415     if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_LINE & (composite_toolbar->paste_mode)) != 0){
416       g_signal_connect_after(list->data, "activate",
417 			     G_CALLBACK(ags_composite_toolbar_paste_match_line_callback), composite_toolbar);
418 
419       list = list->next;
420     }
421 
422     if((AGS_COMPOSITE_TOOLBAR_PASTE_NO_DUPLICATES & (composite_toolbar->paste_mode)) != 0){
423       g_signal_connect_after(list->data, "activate",
424 			     G_CALLBACK(ags_composite_toolbar_paste_no_duplicates_callback), composite_toolbar);
425 
426       list = list->next;
427     }
428 
429     g_list_free(start_list);
430   }
431 
432   if(composite_toolbar->menu_tool == connection){
433     GList *start_list, *list;
434 
435     guint i, j;
436 
437     list =
438       start_list = gtk_container_get_children(GTK_CONTAINER(composite_toolbar->menu_tool_popup));
439 
440     if(composite_toolbar->menu_tool_dialog != NULL &&
441        composite_toolbar->menu_tool_value != NULL) {
442       for(i = 0, j = 0; i < AGS_COMPOSITE_TOOLBAR_DIALOG_SCOPE_COUNT; i++){
443 	guint current_value;
444 
445 	if(composite_toolbar->menu_tool_dialog[j] != NULL){
446 	  current_value = g_value_get_uint(composite_toolbar->menu_tool_value + j);
447 
448 	  if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
449 			AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON)){
450 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
451 	      g_signal_connect_after(list->data, "activate",
452 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_enable_all_audio_channels_callback), composite_toolbar);
453 
454 	      list = list->next;
455 	    }
456 
457 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
458 	      g_signal_connect_after(list->data, "activate",
459 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_disable_all_audio_channels_callback), composite_toolbar);
460 
461 	      list = list->next;
462 	    }
463 
464 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_LINES & current_value) != 0){
465 	      g_signal_connect_after(list->data, "activate",
466 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_enable_all_lines_callback), composite_toolbar);
467 
468 	      list = list->next;
469 	    }
470 
471 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_LINES & current_value) != 0){
472 	      g_signal_connect_after(list->data, "activate",
473 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_disable_all_lines_callback), composite_toolbar);
474 
475 	      list = list->next;
476 	    }
477 
478 	    j++;
479 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
480 			      AGS_COMPOSITE_TOOLBAR_SCOPE_NOTATION)){
481 	    if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_MOVE_NOTE & current_value) != 0){
482 	      g_signal_connect_after(list->data, "activate",
483 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_move_note_callback), composite_toolbar);
484 
485 	      list = list->next;
486 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_CROP_NOTE & current_value) != 0){
487 	      g_signal_connect_after(list->data, "activate",
488 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_crop_note_callback), composite_toolbar);
489 
490 	      list = list->next;
491 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_SELECT_NOTE & current_value) != 0){
492 	      g_signal_connect_after(list->data, "activate",
493 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_select_note_callback), composite_toolbar);
494 
495 	      list = list->next;
496 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_POSITION_CURSOR & current_value) != 0){
497 	      g_signal_connect_after(list->data, "activate",
498 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_position_cursor_callback), composite_toolbar);
499 
500 	      list = list->next;
501 	    }
502 
503 	    j++;
504 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
505 			      AGS_COMPOSITE_TOOLBAR_SCOPE_SHEET)){
506 	    if((AGS_COMPOSITE_TOOLBAR_SHEET_DIALOG_POSITION_CURSOR & current_value) != 0){
507 	      g_signal_connect_after(list->data, "activate",
508 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_sheet_position_cursor_callback), composite_toolbar);
509 
510 	      list = list->next;
511 	    }
512 
513 	    j++;
514 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
515 			      AGS_COMPOSITE_TOOLBAR_SCOPE_AUTOMATION)){
516 	    if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_SELECT_ACCELERATION & current_value) != 0){
517 	      g_signal_connect_after(list->data, "activate",
518 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_select_acceleration_callback), composite_toolbar);
519 
520 	      list = list->next;
521 	    }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_RAMP_ACCELERATION & current_value) != 0){
522 	      g_signal_connect_after(list->data, "activate",
523 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_ramp_acceleration_callback), composite_toolbar);
524 
525 	      list = list->next;
526 	    }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_POSITION_CURSOR & current_value) != 0){
527 	      g_signal_connect_after(list->data, "activate",
528 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_position_cursor_callback), composite_toolbar);
529 
530 	      list = list->next;
531 	    }
532 
533 	    j++;
534 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
535 			      AGS_COMPOSITE_TOOLBAR_SCOPE_WAVE)){
536 	    if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_SELECT_BUFFER & current_value) != 0){
537 	      g_signal_connect_after(list->data, "activate",
538 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_wave_select_buffer_callback), composite_toolbar);
539 
540 	      list = list->next;
541 	    }else if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_POSITION_CURSOR & current_value) != 0){
542 	      g_signal_connect_after(list->data, "activate",
543 				     G_CALLBACK(ags_composite_toolbar_menu_tool_popup_wave_position_cursor_callback), composite_toolbar);
544 
545 	      list = list->next;
546 	    }
547 
548 	    j++;
549 	  }else{
550 	    g_warning("unknown dialog");
551 	  }
552 	}
553       }
554     }
555 
556     g_list_free(start_list);
557   }
558 
559   if(composite_toolbar->zoom == connection){
560     g_signal_connect_after(connection, "changed",
561 			   G_CALLBACK(ags_composite_toolbar_zoom_callback), composite_toolbar);
562   }
563 
564   if(composite_toolbar->opacity == connection){
565     g_signal_connect_after(connection, "value-changed",
566 			   G_CALLBACK(ags_composite_toolbar_opacity_callback), composite_toolbar);
567   }
568 }
569 
570 void
ags_composite_toolbar_disconnect_connection(AgsConnectable * connectable,GObject * connection)571 ags_composite_toolbar_disconnect_connection(AgsConnectable *connectable,
572 					    GObject *connection)
573 {
574   AgsCompositeToolbar *composite_toolbar;
575 
576   if(connection == NULL){
577     return;
578   }
579 
580   composite_toolbar = AGS_COMPOSITE_TOOLBAR(connectable);
581 
582   if(composite_toolbar->position == connection){
583     g_object_disconnect(connection,
584 			"any_signal::clicked",
585 			G_CALLBACK(ags_composite_toolbar_position_callback),
586 			composite_toolbar,
587 			NULL);
588   }
589 
590   if(composite_toolbar->edit == connection){
591     g_object_disconnect(connection, "any_signal::clicked",
592 			G_CALLBACK(ags_composite_toolbar_edit_callback),
593 			composite_toolbar,
594 			NULL);
595   }
596 
597   if(composite_toolbar->clear == connection){
598     g_object_disconnect(connection, "any_signal::clicked",
599 			G_CALLBACK(ags_composite_toolbar_position_callback),
600 			composite_toolbar,
601 			NULL);
602   }
603 
604   if(composite_toolbar->select == connection){
605     g_object_disconnect(connection, "any_signal::clicked",
606 			G_CALLBACK(ags_composite_toolbar_select_callback),
607 			composite_toolbar,
608 			NULL);
609   }
610 
611   if(composite_toolbar->invert == connection){
612     g_object_disconnect(connection, "any_signal::clicked",
613 			G_CALLBACK(ags_composite_toolbar_invert_callback),
614 			composite_toolbar,
615 			NULL);
616   }
617 
618   if(composite_toolbar->copy == connection){
619     g_object_disconnect(connection, "any_signal::clicked",
620 			G_CALLBACK(ags_composite_toolbar_copy_callback),
621 			composite_toolbar,
622 			NULL);
623   }
624 
625   if(composite_toolbar->cut == connection){
626     g_object_disconnect(connection, "any_signal::clicked",
627 			G_CALLBACK(ags_composite_toolbar_cut_callback),
628 			composite_toolbar,
629 			NULL);
630   }
631 
632   if(composite_toolbar->paste == connection){
633     GList *start_list, *list;
634 
635     g_object_disconnect(connection, "any_signal::clicked",
636 			G_CALLBACK(ags_composite_toolbar_paste_callback),
637 			composite_toolbar,
638 			NULL);
639 
640     list =
641       start_list = gtk_container_get_children(GTK_CONTAINER(composite_toolbar->paste_popup));
642 
643     if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_AUDIO_CHANNEL & (composite_toolbar->paste_mode)) != 0){
644       g_object_disconnect(list->data, "any_signal::activate",
645 			  G_CALLBACK(ags_composite_toolbar_paste_match_audio_channel_callback),
646 			  composite_toolbar,
647 			  NULL);
648 
649       list = list->next;
650     }
651 
652     if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_LINE & (composite_toolbar->paste_mode)) != 0){
653       g_object_disconnect(list->data, "any_signal::activate",
654 			  G_CALLBACK(ags_composite_toolbar_paste_match_line_callback),
655 			  composite_toolbar,
656 			  NULL);
657 
658       list = list->next;
659     }
660 
661     if((AGS_COMPOSITE_TOOLBAR_PASTE_NO_DUPLICATES & (composite_toolbar->paste_mode)) != 0){
662       g_object_disconnect(list->data, "any_signal::activate",
663 			  G_CALLBACK(ags_composite_toolbar_paste_no_duplicates_callback),
664 			  composite_toolbar,
665 			  NULL);
666 
667       list = list->next;
668     }
669 
670     g_list_free(start_list);
671   }
672 
673   if(composite_toolbar->menu_tool == connection){
674     GList *start_list, *list;
675 
676     guint i, j;
677 
678     list =
679       start_list = gtk_container_get_children(GTK_CONTAINER(composite_toolbar->menu_tool_popup));
680 
681     if(composite_toolbar->menu_tool_dialog != NULL &&
682        composite_toolbar->menu_tool_value != NULL) {
683       for(i = 0, j = 0; i < AGS_COMPOSITE_TOOLBAR_DIALOG_SCOPE_COUNT; i++){
684 	guint current_value;
685 
686 	if(composite_toolbar->menu_tool_dialog[j] != NULL){
687 	  current_value = g_value_get_uint(composite_toolbar->menu_tool_value + j);
688 
689 	  if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
690 			AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON)){
691 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
692 	      g_object_disconnect(list->data, "any_signal::activate",
693 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_enable_all_audio_channels_callback),
694 				  composite_toolbar,
695 				  NULL);
696 
697 	      list = list->next;
698 	    }
699 
700 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
701 	      g_object_disconnect(list->data, "any_signal::activate",
702 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_disable_all_audio_channels_callback),
703 				  composite_toolbar,
704 				  NULL);
705 
706 	      list = list->next;
707 	    }
708 
709 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_LINES & current_value) != 0){
710 	      g_object_disconnect(list->data, "any_signal::activate",
711 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_enable_all_lines_callback),
712 				  composite_toolbar,
713 				  NULL);
714 
715 	      list = list->next;
716 	    }
717 
718 	    if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_LINES & current_value) != 0){
719 	      g_object_disconnect(list->data, "any_signal::activate",
720 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_disable_all_lines_callback),
721 				  composite_toolbar,
722 				  NULL);
723 
724 	      list = list->next;
725 	    }
726 
727 	    j++;
728 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
729 			      AGS_COMPOSITE_TOOLBAR_SCOPE_NOTATION)){
730 	    if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_MOVE_NOTE & current_value) != 0){
731 	      g_object_disconnect(list->data, "any_signal::activate",
732 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_move_note_callback),
733 				  composite_toolbar,
734 				  NULL);
735 
736 	      list = list->next;
737 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_CROP_NOTE & current_value) != 0){
738 	      g_object_disconnect(list->data, "any_signal::activate",
739 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_crop_note_callback),
740 				  composite_toolbar,
741 				  NULL);
742 
743 	      list = list->next;
744 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_SELECT_NOTE & current_value) != 0){
745 	      g_object_disconnect(list->data, "any_signal::activate",
746 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_select_note_callback),
747 				  composite_toolbar,
748 				  NULL);
749 
750 	      list = list->next;
751 	    }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_POSITION_CURSOR & current_value) != 0){
752 	      g_object_disconnect(list->data, "any_signal::activate",
753 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_notation_position_cursor_callback),
754 				  composite_toolbar,
755 				  NULL);
756 
757 	      list = list->next;
758 	    }
759 
760 	    j++;
761 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
762 			      AGS_COMPOSITE_TOOLBAR_SCOPE_SHEET)){
763 	    if((AGS_COMPOSITE_TOOLBAR_SHEET_DIALOG_POSITION_CURSOR & current_value) != 0){
764 	      g_object_disconnect(list->data, "any_signal::activate",
765 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_sheet_position_cursor_callback),
766 				  composite_toolbar,
767 				  NULL);
768 
769 	      list = list->next;
770 	    }
771 
772 	    j++;
773 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
774 			      AGS_COMPOSITE_TOOLBAR_SCOPE_AUTOMATION)){
775 	    if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_SELECT_ACCELERATION & current_value) != 0){
776 	      g_object_disconnect(list->data, "any_signal::activate",
777 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_select_acceleration_callback),
778 				  composite_toolbar,
779 				  NULL);
780 
781 	      list = list->next;
782 	    }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_RAMP_ACCELERATION & current_value) != 0){
783 	      g_object_disconnect(list->data, "any_signal::activate",
784 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_ramp_acceleration_callback),
785 				  composite_toolbar,
786 				  NULL);
787 
788 	      list = list->next;
789 	    }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_POSITION_CURSOR & current_value) != 0){
790 	      g_object_disconnect(list->data, "any_signal::activate",
791 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_automation_position_cursor_callback),
792 				  composite_toolbar,
793 				  NULL);
794 
795 	      list = list->next;
796 	    }
797 
798 	    j++;
799 	  }else if(!g_strcmp0(composite_toolbar->menu_tool_dialog[j],
800 			      AGS_COMPOSITE_TOOLBAR_SCOPE_WAVE)){
801 	    if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_SELECT_BUFFER & current_value) != 0){
802 	      g_object_disconnect(list->data, "any_signal::activate",
803 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_wave_select_buffer_callback),
804 				  composite_toolbar,
805 				  NULL);
806 
807 	      list = list->next;
808 	    }else if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_POSITION_CURSOR & current_value) != 0){
809 	      g_object_disconnect(list->data, "any_signal::activate",
810 				  G_CALLBACK(ags_composite_toolbar_menu_tool_popup_wave_position_cursor_callback),
811 				  composite_toolbar,
812 				  NULL);
813 
814 	      list = list->next;
815 	    }
816 
817 	    j++;
818 	  }else{
819 	    g_warning("unknown dialog");
820 	  }
821 	}
822       }
823     }
824 
825     g_list_free(start_list);
826   }
827 
828   if(composite_toolbar->zoom == connection){
829     g_object_disconnect(connection, "any_signal::changed",
830 			G_CALLBACK(ags_composite_toolbar_zoom_callback),
831 			composite_toolbar,
832 			NULL);
833   }
834 
835   if(composite_toolbar->opacity == connection){
836     g_object_disconnect(connection, "any_signal::value-changed",
837 			G_CALLBACK(ags_composite_toolbar_opacity_callback),
838 			composite_toolbar,
839 			NULL);
840   }
841 }
842 
843 /**
844  * ags_composite_toolbar_test_flags:
845  * @composite_toolbar: the #AgsCompositeToolbar
846  * @flags: the flags
847  *
848  * Test @flags to be set on @composite_toolbar.
849  *
850  * Returns: %TRUE if flags are set, else %FALSE
851  *
852  * Since: 3.8.0
853  */
854 gboolean
ags_composite_toolbar_test_flags(AgsCompositeToolbar * composite_toolbar,guint flags)855 ags_composite_toolbar_test_flags(AgsCompositeToolbar *composite_toolbar, guint flags)
856 {
857   gboolean retval;
858 
859   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
860     return(FALSE);
861   }
862 
863   /* test */
864   retval = (flags & (composite_toolbar->flags)) ? TRUE: FALSE;
865 
866   return(retval);
867 }
868 
869 /**
870  * ags_composite_toolbar_set_flags:
871  * @composite_toolbar: the #AgsCompositeToolbar
872  * @flags: see enum AgsCompositeToolbarFlags
873  *
874  * Enable a feature of #AgsCompositeToolbar.
875  *
876  * Since: 3.8.0
877  */
878 void
ags_composite_toolbar_set_flags(AgsCompositeToolbar * composite_toolbar,guint flags)879 ags_composite_toolbar_set_flags(AgsCompositeToolbar *composite_toolbar, guint flags)
880 {
881   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
882     return;
883   }
884 
885   /* set flags */
886   composite_toolbar->flags |= flags;
887 }
888 
889 /**
890  * ags_composite_toolbar_unset_flags:
891  * @composite_toolbar: the #AgsCompositeToolbar
892  * @flags: see enum AgsCompositeToolbarFlags
893  *
894  * Disable a feature of AgsCompositeToolbar.
895  *
896  * Since: 3.8.0
897  */
898 void
ags_composite_toolbar_unset_flags(AgsCompositeToolbar * composite_toolbar,guint flags)899 ags_composite_toolbar_unset_flags(AgsCompositeToolbar *composite_toolbar, guint flags)
900 {
901   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
902     return;
903   }
904 
905   /* unset flags */
906   composite_toolbar->flags &= (~flags);
907 }
908 
909 /**
910  * ags_composite_toolbar_test_tool:
911  * @composite_toolbar: the #AgsCompositeToolbar
912  * @tool: the tool
913  *
914  * Test @tool to be set on @composite_toolbar.
915  *
916  * Returns: %TRUE if tool are set, else %FALSE
917  *
918  * Since: 3.8.0
919  */
920 gboolean
ags_composite_toolbar_test_tool(AgsCompositeToolbar * composite_toolbar,guint tool)921 ags_composite_toolbar_test_tool(AgsCompositeToolbar *composite_toolbar, guint tool)
922 {
923   gboolean retval;
924 
925   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
926     return(FALSE);
927   }
928 
929   /* test */
930   retval = (tool & (composite_toolbar->tool)) ? TRUE: FALSE;
931 
932   return(retval);
933 }
934 
935 /**
936  * ags_composite_toolbar_set_tool:
937  * @composite_toolbar: the #AgsCompositeToolbar
938  * @tool: see enum AgsCompositeToolbarTool
939  *
940  * Enable a feature of #AgsCompositeToolbar.
941  *
942  * Since: 3.8.0
943  */
944 void
ags_composite_toolbar_set_tool(AgsCompositeToolbar * composite_toolbar,guint tool)945 ags_composite_toolbar_set_tool(AgsCompositeToolbar *composite_toolbar, guint tool)
946 {
947   gint position;
948 
949   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
950     return;
951   }
952 
953   position = 0;
954 
955   /* position tool */
956   if((AGS_COMPOSITE_TOOLBAR_TOOL_POSITION & tool) != 0 &&
957      composite_toolbar->position == NULL){
958     composite_toolbar->position = (GtkToggleToolButton *) gtk_toggle_tool_button_new();
959     g_object_set(composite_toolbar->position,
960 		 "label", i18n("Position"),
961 		 "icon-name", "go-jump",
962 		 NULL);
963     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
964 		       (GtkWidget *) composite_toolbar->position,
965 		       position);
966 
967     position++;
968   }else if(composite_toolbar->position != NULL){
969     position++;
970   }
971 
972   /* edit tool */
973   if((AGS_COMPOSITE_TOOLBAR_TOOL_EDIT & tool) != 0 &&
974      composite_toolbar->edit == NULL){
975     composite_toolbar->edit = (GtkToggleToolButton *) gtk_toggle_tool_button_new();
976     g_object_set(composite_toolbar->edit,
977 		 "label", i18n("Edit"),
978 		 "icon-name", "document-edit",
979 		 NULL);
980     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
981 		       (GtkWidget *) composite_toolbar->edit,
982 		       position);
983 
984     position++;
985   }else if(composite_toolbar->edit != NULL){
986     position++;
987   }
988 
989   /* clear tool */
990   if((AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR & tool) != 0 &&
991      composite_toolbar->clear == NULL){
992     composite_toolbar->clear = (GtkToggleToolButton *) gtk_toggle_tool_button_new();
993     g_object_set(composite_toolbar->clear,
994 		 "label", i18n("Clear"),
995 		 "icon-name", "edit-clear",
996 		 NULL);
997     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
998 		       (GtkWidget *) composite_toolbar->clear,
999 		       position);
1000 
1001     position++;
1002   }else if(composite_toolbar->clear != NULL){
1003     position++;
1004   }
1005 
1006   /* select tool */
1007   if((AGS_COMPOSITE_TOOLBAR_TOOL_SELECT & tool) != 0 &&
1008      composite_toolbar->select == NULL){
1009     composite_toolbar->select = (GtkToggleToolButton *) gtk_toggle_tool_button_new();
1010     g_object_set(composite_toolbar->select,
1011 		 "label", i18n("Select"),
1012 		 "icon-name", "edit-select",
1013 		 NULL);
1014     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1015 		       (GtkWidget *) composite_toolbar->select,
1016 		       position);
1017 
1018     position++;
1019   }else if(composite_toolbar->select != NULL){
1020     position++;
1021   }
1022 
1023   /* set tool */
1024   composite_toolbar->tool |= tool;
1025 }
1026 
1027 /**
1028  * ags_composite_toolbar_unset_tool:
1029  * @composite_toolbar: the #AgsCompositeToolbar
1030  * @tool: see enum AgsCompositeToolbarTool
1031  *
1032  * Disable a feature of AgsCompositeToolbar.
1033  *
1034  * Since: 3.8.0
1035  */
1036 void
ags_composite_toolbar_unset_tool(AgsCompositeToolbar * composite_toolbar,guint tool)1037 ags_composite_toolbar_unset_tool(AgsCompositeToolbar *composite_toolbar, guint tool)
1038 {
1039   gint position;
1040 
1041   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1042     return;
1043   }
1044 
1045   if((AGS_COMPOSITE_TOOLBAR_TOOL_POSITION & tool) != 0 &&
1046      composite_toolbar->position != NULL){
1047     gtk_widget_destroy((GtkWidget *) composite_toolbar->position);
1048 
1049     composite_toolbar->position = NULL;
1050   }
1051 
1052   if((AGS_COMPOSITE_TOOLBAR_TOOL_EDIT & tool) != 0 &&
1053      composite_toolbar->edit != NULL){
1054     gtk_widget_destroy((GtkWidget *) composite_toolbar->edit);
1055 
1056     composite_toolbar->edit = NULL;
1057   }
1058 
1059   if((AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR & tool) != 0 &&
1060      composite_toolbar->clear != NULL){
1061     gtk_widget_destroy((GtkWidget *) composite_toolbar->clear);
1062 
1063     composite_toolbar->clear = NULL;
1064   }
1065 
1066   if((AGS_COMPOSITE_TOOLBAR_TOOL_SELECT & tool) != 0 &&
1067      composite_toolbar->select != NULL){
1068     gtk_widget_destroy((GtkWidget *) composite_toolbar->select);
1069 
1070     composite_toolbar->select = NULL;
1071   }
1072 
1073   /* unset tool */
1074   composite_toolbar->tool &= (~tool);
1075 }
1076 
1077 /**
1078  * ags_composite_toolbar_test_action:
1079  * @composite_toolbar: the #AgsCompositeToolbar
1080  * @action: the action
1081  *
1082  * Test @action to be set on @composite_toolbar.
1083  *
1084  * Returns: %TRUE if action are set, else %FALSE
1085  *
1086  * Since: 3.8.0
1087  */
1088 gboolean
ags_composite_toolbar_test_action(AgsCompositeToolbar * composite_toolbar,guint action)1089 ags_composite_toolbar_test_action(AgsCompositeToolbar *composite_toolbar, guint action)
1090 {
1091   gboolean retval;
1092 
1093   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1094     return(FALSE);
1095   }
1096 
1097   /* test */
1098   retval = (action & (composite_toolbar->action)) ? TRUE: FALSE;
1099 
1100   return(retval);
1101 }
1102 
1103 /**
1104  * ags_composite_toolbar_set_action:
1105  * @composite_toolbar: the #AgsCompositeToolbar
1106  * @action: see enum AgsCompositeToolbarAction
1107  *
1108  * Enable a feature of #AgsCompositeToolbar.
1109  *
1110  * Since: 3.8.0
1111  */
1112 void
ags_composite_toolbar_set_action(AgsCompositeToolbar * composite_toolbar,guint action)1113 ags_composite_toolbar_set_action(AgsCompositeToolbar *composite_toolbar, guint action)
1114 {
1115   gint position;
1116 
1117   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1118     return;
1119   }
1120 
1121   position = 0;
1122 
1123   if(composite_toolbar->position != NULL){
1124     position++;
1125   }
1126 
1127   if(composite_toolbar->edit != NULL){
1128     position++;
1129   }
1130 
1131   if(composite_toolbar->clear != NULL){
1132     position++;
1133   }
1134 
1135   if(composite_toolbar->select != NULL){
1136     position++;
1137   }
1138 
1139   /* invert action */
1140   if((AGS_COMPOSITE_TOOLBAR_ACTION_INVERT & action) != 0 &&
1141      composite_toolbar->invert == NULL){
1142     composite_toolbar->invert = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON,
1143 							       NULL);
1144     g_object_set(composite_toolbar->invert,
1145 		 "label", i18n("Invert"),
1146 		 "icon-name", "object-flip-vertical",
1147 		 NULL);
1148     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1149 		       (GtkWidget *) composite_toolbar->invert,
1150 		       position);
1151 
1152     position++;
1153   }else if(composite_toolbar->invert != NULL){
1154     position++;
1155   }
1156 
1157   /* copy action */
1158   if((AGS_COMPOSITE_TOOLBAR_ACTION_COPY & action) != 0 &&
1159      composite_toolbar->copy == NULL){
1160     composite_toolbar->copy = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON,
1161 							     NULL);
1162     g_object_set(composite_toolbar->copy,
1163 		 "label", i18n("Copy"),
1164 		 "icon-name", "edit-copy",
1165 		 NULL);
1166     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1167 		       (GtkWidget *) composite_toolbar->copy,
1168 		       position);
1169 
1170     position++;
1171   }else if(composite_toolbar->copy != NULL){
1172     position++;
1173   }
1174 
1175   /* cut action */
1176   if((AGS_COMPOSITE_TOOLBAR_ACTION_CUT & action) != 0 &&
1177      composite_toolbar->cut == NULL){
1178     composite_toolbar->cut = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON,
1179 							    NULL);
1180     g_object_set(composite_toolbar->cut,
1181 		 "label", i18n("Cut"),
1182 		 "icon-name", "edit-cut",
1183 		 NULL);
1184     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1185 		       (GtkWidget *) composite_toolbar->cut,
1186 		       position);
1187 
1188     position++;
1189   }else if(composite_toolbar->cut != NULL){
1190     position++;
1191   }
1192 
1193   /* paste action */
1194   if((AGS_COMPOSITE_TOOLBAR_ACTION_PASTE & action) != 0 &&
1195      composite_toolbar->paste == NULL){
1196     composite_toolbar->paste = (GtkMenuToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON,
1197 								  NULL);
1198     g_object_set(composite_toolbar->paste,
1199 		 "label", i18n("Paste"),
1200 		 "icon-name", "edit-paste",
1201 		 NULL);
1202     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1203 		       (GtkWidget *) composite_toolbar->paste,
1204 		       position);
1205 
1206     composite_toolbar->paste_popup = (GtkMenu *) ags_composite_toolbar_paste_popup_new(composite_toolbar->paste_mode);
1207     gtk_menu_tool_button_set_menu(composite_toolbar->paste,
1208 				  (GtkWidget *) composite_toolbar->paste_popup);
1209 
1210     position++;
1211   }else if(composite_toolbar->paste != NULL){
1212     position++;
1213   }
1214 
1215   /* set action */
1216   composite_toolbar->action |= action;
1217 }
1218 
1219 /**
1220  * ags_composite_toolbar_unset_action:
1221  * @composite_toolbar: the #AgsCompositeToolbar
1222  * @action: see enum AgsCompositeToolbarAction
1223  *
1224  * Disable a feature of AgsCompositeToolbar.
1225  *
1226  * Since: 3.8.0
1227  */
1228 void
ags_composite_toolbar_unset_action(AgsCompositeToolbar * composite_toolbar,guint action)1229 ags_composite_toolbar_unset_action(AgsCompositeToolbar *composite_toolbar, guint action)
1230 {
1231   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1232     return;
1233   }
1234 
1235   if((AGS_COMPOSITE_TOOLBAR_ACTION_INVERT & action) != 0 &&
1236      composite_toolbar->invert != NULL){
1237     gtk_widget_destroy((GtkWidget *) composite_toolbar->invert);
1238 
1239     composite_toolbar->invert = NULL;
1240   }
1241 
1242   if((AGS_COMPOSITE_TOOLBAR_ACTION_COPY & action) != 0 &&
1243      composite_toolbar->copy != NULL){
1244     gtk_widget_destroy((GtkWidget *) composite_toolbar->copy);
1245 
1246     composite_toolbar->copy = NULL;
1247   }
1248 
1249   if((AGS_COMPOSITE_TOOLBAR_ACTION_CUT & action) != 0 &&
1250      composite_toolbar->cut != NULL){
1251     gtk_widget_destroy((GtkWidget *) composite_toolbar->cut);
1252 
1253     composite_toolbar->cut = NULL;
1254   }
1255 
1256   if((AGS_COMPOSITE_TOOLBAR_ACTION_PASTE & action) != 0 &&
1257      composite_toolbar->paste != NULL){
1258     gtk_widget_destroy((GtkWidget *) composite_toolbar->paste);
1259 
1260     //TODO:JK: check if needed
1261     //    composite_toolbar->paste_mode = 0;
1262 
1263     composite_toolbar->paste = NULL;
1264     composite_toolbar->paste_popup = NULL;
1265   }
1266 
1267   /* unset action */
1268   composite_toolbar->action &= (~action);
1269 }
1270 
1271 /**
1272  * ags_composite_toolbar_test_option:
1273  * @composite_toolbar: the #AgsCompositeToolbar
1274  * @option: the option
1275  *
1276  * Test @option to be set on @composite_toolbar.
1277  *
1278  * Returns: %TRUE if option are set, else %FALSE
1279  *
1280  * Since: 3.8.0
1281  */
1282 gboolean
ags_composite_toolbar_test_option(AgsCompositeToolbar * composite_toolbar,guint option)1283 ags_composite_toolbar_test_option(AgsCompositeToolbar *composite_toolbar, guint option)
1284 {
1285   gboolean retval;
1286 
1287   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1288     return(FALSE);
1289   }
1290 
1291   /* test */
1292   retval = (option & (composite_toolbar->option)) ? TRUE: FALSE;
1293 
1294   return(retval);
1295 }
1296 
1297 /**
1298  * ags_composite_toolbar_set_option:
1299  * @composite_toolbar: the #AgsCompositeToolbar
1300  * @option: see enum AgsCompositeToolbarOption
1301  *
1302  * Enable a feature of #AgsCompositeToolbar.
1303  *
1304  * Since: 3.8.0
1305  */
1306 void
ags_composite_toolbar_set_option(AgsCompositeToolbar * composite_toolbar,guint option)1307 ags_composite_toolbar_set_option(AgsCompositeToolbar *composite_toolbar, guint option)
1308 {
1309   gint position;
1310 
1311   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1312     return;
1313   }
1314 
1315   position = 0;
1316 
1317   if(composite_toolbar->position != NULL){
1318     position++;
1319   }
1320 
1321   if(composite_toolbar->edit != NULL){
1322     position++;
1323   }
1324 
1325   if(composite_toolbar->clear != NULL){
1326     position++;
1327   }
1328 
1329   if(composite_toolbar->select != NULL){
1330     position++;
1331   }
1332 
1333   if(composite_toolbar->invert != NULL){
1334     position++;
1335   }
1336 
1337   if(composite_toolbar->copy != NULL){
1338     position++;
1339   }
1340 
1341   if(composite_toolbar->cut != NULL){
1342     position++;
1343   }
1344 
1345   if(composite_toolbar->paste != NULL){
1346     position++;
1347   }
1348 
1349   /* menu tool */
1350   if((AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL & option) != 0 &&
1351      composite_toolbar->menu_tool == NULL){
1352     composite_toolbar->menu_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON,
1353 								      NULL);
1354     g_object_set(composite_toolbar->menu_tool,
1355 		 "label", i18n("Tool"),
1356 		 NULL);
1357     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1358 		       (GtkWidget *) composite_toolbar->menu_tool,
1359 		       position);
1360 
1361     composite_toolbar->menu_tool_popup = (GtkMenu *) ags_composite_toolbar_menu_tool_popup_new(composite_toolbar->menu_tool_dialog,
1362 											       composite_toolbar->menu_tool_value);
1363     gtk_menu_tool_button_set_menu(composite_toolbar->menu_tool,
1364 				  (GtkWidget *) composite_toolbar->menu_tool_popup);
1365   }else if(composite_toolbar->menu_tool != NULL){
1366     position++;
1367   }
1368 
1369   /* zoom */
1370   if((AGS_COMPOSITE_TOOLBAR_HAS_ZOOM & option) != 0 &&
1371      composite_toolbar->zoom == NULL){
1372     GtkToolItem *tool_item;
1373     GtkBox *box;
1374     GtkLabel *label;
1375 
1376     tool_item = gtk_tool_item_new();
1377     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1378 		       (GtkWidget *) tool_item,
1379 		       position);
1380 
1381     box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
1382 		      0);
1383     gtk_container_add((GtkContainer *) tool_item,
1384 		      (GtkWidget *) box);
1385 
1386 
1387     label = (GtkLabel *) gtk_label_new(i18n("Zoom"));
1388     gtk_box_pack_start(box,
1389 		       (GtkWidget *) label,
1390 		       FALSE, FALSE,
1391 		       0);
1392 
1393     composite_toolbar->selected_zoom = 2;
1394     composite_toolbar->zoom = ags_zoom_combo_box_new();
1395     gtk_combo_box_set_active(GTK_COMBO_BOX(composite_toolbar->zoom),
1396 			     2);
1397     gtk_box_pack_start(box,
1398 		       (GtkWidget *) composite_toolbar->zoom,
1399 		       FALSE, FALSE,
1400 		       0);
1401   }else if(composite_toolbar->zoom != NULL){
1402     position++;
1403   }
1404 
1405   /* opacity */
1406   if((AGS_COMPOSITE_TOOLBAR_HAS_OPACITY & option) != 0 &&
1407      composite_toolbar->opacity == NULL){
1408     GtkToolItem *tool_item;
1409     GtkBox *box;
1410     GtkLabel *label;
1411 
1412     tool_item = gtk_tool_item_new();
1413     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1414 		       (GtkWidget *) tool_item,
1415 		       -1);
1416 
1417     box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
1418 		      0);
1419     gtk_container_add((GtkContainer *) tool_item,
1420 		      (GtkWidget *) box);
1421 
1422     label = (GtkLabel *) gtk_label_new(i18n("Opacity"));
1423     gtk_box_pack_start(box,
1424 		       (GtkWidget *) label,
1425 		       FALSE, FALSE,
1426 		       0);
1427 
1428     composite_toolbar->opacity = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001);
1429     gtk_spin_button_set_digits(composite_toolbar->opacity, 4);
1430     gtk_spin_button_set_value(composite_toolbar->opacity, 1.0);
1431     gtk_box_pack_start(box,
1432 		       (GtkWidget *) composite_toolbar->opacity,
1433 		       FALSE, FALSE,
1434 		       0);
1435   }else if(composite_toolbar->opacity != NULL){
1436     position++;
1437   }
1438 
1439   /* port */
1440   if((AGS_COMPOSITE_TOOLBAR_HAS_PORT & option) != 0 &&
1441      composite_toolbar->port == NULL){
1442     GtkToolItem *tool_item;
1443     GtkBox *box;
1444     GtkLabel *label;
1445 
1446     GtkCellRenderer *cell_renderer_toggle;
1447     GtkCellRenderer *scope_cell_renderer_text;
1448     GtkCellRenderer *port_cell_renderer_text;
1449 
1450     tool_item = gtk_tool_item_new();
1451     gtk_toolbar_insert((GtkToolbar *) composite_toolbar,
1452 		       (GtkWidget *) tool_item,
1453 		       position);
1454 
1455     box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
1456 		      0);
1457     gtk_container_add((GtkContainer *) tool_item,
1458 		      (GtkWidget *) box);
1459 
1460     label = (GtkLabel *) gtk_label_new(i18n("Port"));
1461     gtk_box_pack_start(box,
1462 		       (GtkWidget *) label,
1463 		       FALSE, FALSE,
1464 		       0);
1465 
1466     composite_toolbar->port = (GtkComboBox *) gtk_combo_box_new();
1467 
1468     cell_renderer_toggle = gtk_cell_renderer_toggle_new();
1469     gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(composite_toolbar->port),
1470 			       cell_renderer_toggle,
1471 			       FALSE);
1472     gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(composite_toolbar->port), cell_renderer_toggle,
1473 				   "active", 0,
1474 				   NULL);
1475     gtk_cell_renderer_toggle_set_activatable(GTK_CELL_RENDERER_TOGGLE(cell_renderer_toggle),
1476 					     TRUE);
1477 
1478     scope_cell_renderer_text = gtk_cell_renderer_text_new();
1479     gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(composite_toolbar->port),
1480 			       scope_cell_renderer_text,
1481 			       FALSE);
1482     gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(composite_toolbar->port), scope_cell_renderer_text,
1483 				   "text", 1,
1484 				   NULL);
1485 
1486     port_cell_renderer_text = gtk_cell_renderer_text_new();
1487     gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(composite_toolbar->port),
1488 			       port_cell_renderer_text,
1489 			       FALSE);
1490     gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(composite_toolbar->port), port_cell_renderer_text,
1491 				   "text", 2,
1492 				   NULL);
1493 
1494     gtk_box_pack_start(box,
1495 		       (GtkWidget *) composite_toolbar->port,
1496 		       FALSE, FALSE,
1497 		       0);
1498 
1499     position++;
1500   }else if(composite_toolbar->port != NULL){
1501     position++;
1502   }
1503 
1504   /* set option */
1505   composite_toolbar->option |= option;
1506 }
1507 
1508 /**
1509  * ags_composite_toolbar_unset_option:
1510  * @composite_toolbar: the #AgsCompositeToolbar
1511  * @option: see enum AgsCompositeToolbarOption
1512  *
1513  * Disable a feature of AgsCompositeToolbar.
1514  *
1515  * Since: 3.8.0
1516  */
1517 void
ags_composite_toolbar_unset_option(AgsCompositeToolbar * composite_toolbar,guint option)1518 ags_composite_toolbar_unset_option(AgsCompositeToolbar *composite_toolbar, guint option)
1519 {
1520   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1521     return;
1522   }
1523 
1524   if((AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL & option) != 0 &&
1525      composite_toolbar->menu_tool != NULL){
1526     gtk_widget_destroy((GtkWidget *) composite_toolbar->menu_tool);
1527 
1528     composite_toolbar->menu_tool = NULL;
1529     composite_toolbar->menu_tool_popup = NULL;
1530   }
1531 
1532   if((AGS_COMPOSITE_TOOLBAR_HAS_OPACITY & option) != 0 &&
1533      composite_toolbar->opacity != NULL){
1534     gtk_widget_destroy((GtkWidget *) composite_toolbar->opacity);
1535 
1536     composite_toolbar->opacity = NULL;
1537   }
1538 
1539   if((AGS_COMPOSITE_TOOLBAR_HAS_PORT & option) != 0 &&
1540      composite_toolbar->port != NULL){
1541     gtk_widget_destroy((GtkWidget *) composite_toolbar->port);
1542 
1543     composite_toolbar->port = NULL;
1544   }
1545 
1546   /* unset option */
1547   composite_toolbar->option &= (~option);
1548 }
1549 
1550 /**
1551  * ags_composite_toolbar_paste_popup_new:
1552  * @paste_mode: the paste mode
1553  *
1554  * Create a new #GtkMenu suitable for menu tool button.
1555  *
1556  * Returns: a new #GtkMenu
1557  *
1558  * Since: 3.8.0
1559  */
1560 GtkMenu*
ags_composite_toolbar_paste_popup_new(guint paste_mode)1561 ags_composite_toolbar_paste_popup_new(guint paste_mode)
1562 {
1563   GtkMenu *menu;
1564   GtkMenuItem *item;
1565 
1566   menu = (GtkMenu *) gtk_menu_new();
1567 
1568   if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_AUDIO_CHANNEL & paste_mode) != 0){
1569     item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM,
1570 			"label", i18n("match audio channel"),
1571 			"active", TRUE,
1572 			NULL);
1573     gtk_menu_shell_append((GtkMenuShell *) menu,
1574 			  (GtkWidget *) item);
1575   }
1576 
1577   if((AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_LINE & paste_mode) != 0){
1578     item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM,
1579 			"label", "match line",
1580 			"active", TRUE,
1581 			NULL);
1582     gtk_menu_shell_append((GtkMenuShell *) menu,
1583 			  (GtkWidget *) item);
1584   }
1585 
1586   if((AGS_COMPOSITE_TOOLBAR_PASTE_NO_DUPLICATES & paste_mode) != 0){
1587     item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM,
1588 			"label", i18n("no duplicates"),
1589 			"active", TRUE,
1590 			NULL);
1591     gtk_menu_shell_append((GtkMenuShell *) menu,
1592 			  (GtkWidget *) item);
1593   }
1594 
1595   return(menu);
1596 }
1597 
1598 /**
1599  * ags_composite_toolbar_menu_tool_popup_new:
1600  * @dialog: the tool dialog string vector
1601  * @value: the #GValue-struct array
1602  *
1603  * Create a new #GtkMenu suitable for menu tool button.
1604  *
1605  * Returns: a new #GtkMenu
1606  *
1607  * Since: 3.8.0
1608  */
1609 GtkMenu*
ags_composite_toolbar_menu_tool_popup_new(gchar ** dialog,GValue * value)1610 ags_composite_toolbar_menu_tool_popup_new(gchar **dialog,
1611 					  GValue *value)
1612 {
1613   GtkMenu *menu;
1614   GtkMenuItem *item;
1615 
1616   guint i, j;
1617 
1618   menu = (GtkMenu *) gtk_menu_new();
1619 
1620   if(dialog != NULL &&
1621      value != NULL){
1622     for(i = 0, j = 0; i < AGS_COMPOSITE_TOOLBAR_DIALOG_SCOPE_COUNT; i++){
1623       guint current_value;
1624 
1625       if(dialog[j] != NULL){
1626 	current_value = g_value_get_uint(value + j);
1627 
1628 	if(!g_strcmp0(dialog[j],
1629 		      AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON)){
1630 	  if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
1631 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("enable all audio channels"));
1632 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1633 				  (GtkWidget *) item);
1634 	  }
1635 
1636 	  if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_AUDIO_CHANNELS & current_value) != 0){
1637 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("disable all audio channels"));
1638 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1639 				  (GtkWidget *) item);
1640 	  }
1641 
1642 	  if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_LINES & current_value) != 0){
1643 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("enable all lines"));
1644 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1645 				  (GtkWidget *) item);
1646 	  }
1647 
1648 	  if((AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_LINES & current_value) != 0){
1649 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("disable all lines"));
1650 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1651 				  (GtkWidget *) item);
1652 	  }
1653 
1654 	  j++;
1655 	}else if(!g_strcmp0(dialog[j],
1656 			    AGS_COMPOSITE_TOOLBAR_SCOPE_NOTATION)){
1657 	  if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_MOVE_NOTE & current_value) != 0){
1658 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("move notes"));
1659 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1660 				  (GtkWidget *) item);
1661 	  }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_CROP_NOTE & current_value) != 0){
1662 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("crop notes"));
1663 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1664 				  (GtkWidget *) item);
1665  	  }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_SELECT_NOTE & current_value) != 0){
1666 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select notes"));
1667 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1668 				  (GtkWidget *) item);
1669 	  }else if((AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_POSITION_CURSOR & current_value) != 0){
1670 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor"));
1671 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1672 				  (GtkWidget *) item);
1673 	  }
1674 
1675 	  j++;
1676 	}else if(!g_strcmp0(dialog[j],
1677 			    AGS_COMPOSITE_TOOLBAR_SCOPE_SHEET)){
1678 	  if((AGS_COMPOSITE_TOOLBAR_SHEET_DIALOG_POSITION_CURSOR & current_value) != 0){
1679 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor"));
1680 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1681 				  (GtkWidget *) item);
1682 	  }
1683 
1684 	  j++;
1685 	}else if(!g_strcmp0(dialog[j],
1686 			    AGS_COMPOSITE_TOOLBAR_SCOPE_AUTOMATION)){
1687 	  if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_SELECT_ACCELERATION & current_value) != 0){
1688 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select acceleration"));
1689 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1690 				  (GtkWidget *) item);
1691 	  }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_RAMP_ACCELERATION & current_value) != 0){
1692 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("ramp acceleration"));
1693 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1694 				  (GtkWidget *) item);
1695 	  }else if((AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_POSITION_CURSOR & current_value) != 0){
1696 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor"));
1697 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1698 				  (GtkWidget *) item);
1699 	  }
1700 
1701 	  j++;
1702 	}else if(!g_strcmp0(dialog[j],
1703 			    AGS_COMPOSITE_TOOLBAR_SCOPE_WAVE)){
1704 	  if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_SELECT_BUFFER & current_value) != 0){
1705 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select buffer"));
1706 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1707 				  (GtkWidget *) item);
1708 	  }else if((AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_POSITION_CURSOR & current_value) != 0){
1709 	    item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor"));
1710 	    gtk_menu_shell_append((GtkMenuShell *) menu,
1711 				  (GtkWidget *) item);
1712 	  }
1713 
1714 	  j++;
1715 	}else{
1716 	  g_warning("unknown dialog");
1717 	}
1718       }
1719     }
1720   }
1721 
1722   return(menu);
1723 }
1724 
1725 /**
1726  * ags_composite_toolbar_set_selected_tool:
1727  * @composite_toolbar: the #AgsCompositeToolbar
1728  * @selected_tool: the #GtkToggleToolButton
1729  *
1730  * Set @selected_tool of @composite_toolbar.
1731  *
1732  * Since: 3.8.0
1733  */
1734 void
ags_composite_toolbar_set_selected_tool(AgsCompositeToolbar * composite_toolbar,GtkToggleToolButton * selected_tool)1735 ags_composite_toolbar_set_selected_tool(AgsCompositeToolbar *composite_toolbar,
1736 					GtkToggleToolButton *selected_tool)
1737 {
1738   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1739     return;
1740   }
1741 
1742   if(composite_toolbar->selected_tool != selected_tool){
1743     GtkToggleToolButton *old_selected_tool;
1744 
1745     old_selected_tool = composite_toolbar->selected_tool;
1746 
1747     composite_toolbar->selected_tool = selected_tool;
1748 
1749     if(old_selected_tool != NULL){
1750       gtk_toggle_tool_button_set_active(old_selected_tool,
1751 					FALSE);
1752     }
1753   }else{
1754     if(selected_tool != NULL &&
1755        !gtk_toggle_tool_button_get_active(selected_tool)){
1756       gtk_toggle_tool_button_set_active(selected_tool,
1757 					TRUE);
1758     }
1759   }
1760 }
1761 
1762 /**
1763  * ags_composite_toolbar_scope_create_and_connect:
1764  * @composite_toolbar: the #AgsCompositeToolbar
1765  * @scope: the scope
1766  *
1767  * Create and connect @scope of @composite_toolbar.
1768  *
1769  * Since: 3.8.0
1770  */
1771 void
ags_composite_toolbar_scope_create_and_connect(AgsCompositeToolbar * composite_toolbar,gchar * scope)1772 ags_composite_toolbar_scope_create_and_connect(AgsCompositeToolbar *composite_toolbar,
1773 					       gchar *scope)
1774 {
1775   gboolean success;
1776 
1777   if(!AGS_IS_COMPOSITE_TOOLBAR(composite_toolbar)){
1778     return;
1779   }
1780 
1781   success = FALSE;
1782 
1783   /* destroy current */
1784   ags_composite_toolbar_unset_tool(composite_toolbar,
1785 				   (AGS_COMPOSITE_TOOLBAR_TOOL_POSITION |
1786 				    AGS_COMPOSITE_TOOLBAR_TOOL_EDIT |
1787 				    AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR |
1788 				    AGS_COMPOSITE_TOOLBAR_TOOL_SELECT));
1789   ags_composite_toolbar_unset_action(composite_toolbar,
1790 				     (AGS_COMPOSITE_TOOLBAR_ACTION_INVERT |
1791 				      AGS_COMPOSITE_TOOLBAR_ACTION_COPY |
1792 				      AGS_COMPOSITE_TOOLBAR_ACTION_CUT |
1793 				      AGS_COMPOSITE_TOOLBAR_ACTION_PASTE));
1794   ags_composite_toolbar_unset_option(composite_toolbar,
1795 				     (AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL |
1796 				      AGS_COMPOSITE_TOOLBAR_HAS_ZOOM |
1797 				      AGS_COMPOSITE_TOOLBAR_HAS_OPACITY |
1798 				      AGS_COMPOSITE_TOOLBAR_HAS_PORT));
1799 
1800   /* create new */
1801   if(scope != NULL){
1802     if(!g_strcmp0(scope,
1803 		  AGS_COMPOSITE_TOOLBAR_SCOPE_NOTATION)){
1804       static const gchar **notation_menu_tool_dialog = {
1805 							AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON,
1806 							AGS_COMPOSITE_TOOLBAR_SCOPE_NOTATION,
1807 							NULL,
1808       };
1809 
1810       static GValue *notation_menu_tool_value = NULL;
1811 
1812       static gboolean initialized = FALSE;
1813 
1814       /* static initializers */
1815       if(!initialized){
1816 	notation_menu_tool_value = (GValue *) g_new0(GValue,
1817 						     2);
1818 
1819 	g_value_init(notation_menu_tool_value,
1820 		     G_TYPE_UINT);
1821 	g_value_set_uint(notation_menu_tool_value,
1822 			 (AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_AUDIO_CHANNELS |
1823 			  AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_AUDIO_CHANNELS));
1824 
1825 	g_value_init(notation_menu_tool_value + 1,
1826 		     G_TYPE_UINT);
1827 	g_value_set_uint(notation_menu_tool_value + 1,
1828 			 (AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_MOVE_NOTE |
1829 			  AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_CROP_NOTE |
1830 			  AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_SELECT_NOTE |
1831 			  AGS_COMPOSITE_TOOLBAR_NOTATION_DIALOG_POSITION_CURSOR));
1832 
1833 	initialized = TRUE;
1834       }
1835 
1836       /* set tool, action and option */
1837       ags_composite_toolbar_set_tool(composite_toolbar,
1838 				     (AGS_COMPOSITE_TOOLBAR_TOOL_POSITION |
1839 				      AGS_COMPOSITE_TOOLBAR_TOOL_EDIT |
1840 				      AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR |
1841 				      AGS_COMPOSITE_TOOLBAR_TOOL_SELECT));
1842 
1843       composite_toolbar->paste_mode = (AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_AUDIO_CHANNEL |
1844 				       AGS_COMPOSITE_TOOLBAR_PASTE_NO_DUPLICATES);
1845       ags_composite_toolbar_set_action(composite_toolbar,
1846 				       (AGS_COMPOSITE_TOOLBAR_ACTION_INVERT |
1847 					AGS_COMPOSITE_TOOLBAR_ACTION_COPY |
1848 					AGS_COMPOSITE_TOOLBAR_ACTION_CUT |
1849 					AGS_COMPOSITE_TOOLBAR_ACTION_PASTE));
1850 
1851       ags_composite_toolbar_set_option(composite_toolbar,
1852 				       (AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL |
1853 					AGS_COMPOSITE_TOOLBAR_HAS_ZOOM |
1854 					AGS_COMPOSITE_TOOLBAR_HAS_OPACITY));
1855 
1856       /* connect */
1857       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1858 					 composite_toolbar->position);
1859       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1860 					 composite_toolbar->edit);
1861       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1862 					 composite_toolbar->clear);
1863       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1864 					 composite_toolbar->select);
1865 
1866       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1867 					 composite_toolbar->invert);
1868       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1869 					 composite_toolbar->copy);
1870       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1871 					 composite_toolbar->cut);
1872       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1873 					 composite_toolbar->paste);
1874 
1875       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1876 					 composite_toolbar->menu_tool);
1877 
1878       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1879 					 composite_toolbar->zoom);
1880 
1881       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1882 					 composite_toolbar->opacity);
1883 
1884       gtk_toggle_tool_button_set_active(composite_toolbar->position,
1885 					TRUE);
1886 
1887       success = TRUE;
1888     }else if(!g_strcmp0(scope,
1889 			AGS_COMPOSITE_TOOLBAR_SCOPE_SHEET)){
1890       //TODO:JK: implement me
1891 
1892       success = TRUE;
1893     }else if(!g_strcmp0(scope,
1894 			AGS_COMPOSITE_TOOLBAR_SCOPE_AUTOMATION)){
1895       static const gchar **automation_menu_tool_dialog = {
1896 							  AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON,
1897 							  AGS_COMPOSITE_TOOLBAR_SCOPE_AUTOMATION,
1898 							  NULL,
1899       };
1900 
1901       static GValue *automation_menu_tool_value = NULL;
1902 
1903       static gboolean initialized = FALSE;
1904 
1905       /* static initializers */
1906       if(!initialized){
1907 	automation_menu_tool_value = (GValue *) g_new0(GValue,
1908 						       2);
1909 
1910 	g_value_init(automation_menu_tool_value,
1911 		     G_TYPE_UINT);
1912 	g_value_set_uint(automation_menu_tool_value,
1913 			 (AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_LINES |
1914 			  AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_LINES));
1915 
1916 	g_value_init(automation_menu_tool_value + 1,
1917 		     G_TYPE_UINT);
1918 	g_value_set_uint(automation_menu_tool_value + 1,
1919 			 (AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_SELECT_ACCELERATION |
1920 			  AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_RAMP_ACCELERATION |
1921 			  AGS_COMPOSITE_TOOLBAR_AUTOMATION_DIALOG_POSITION_CURSOR));
1922 
1923 	initialized = TRUE;
1924       }
1925 
1926       /* set tool, action and option */
1927       ags_composite_toolbar_set_tool(composite_toolbar,
1928 				     (AGS_COMPOSITE_TOOLBAR_TOOL_POSITION |
1929 				      AGS_COMPOSITE_TOOLBAR_TOOL_EDIT |
1930 				      AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR |
1931 				      AGS_COMPOSITE_TOOLBAR_TOOL_SELECT));
1932 
1933       composite_toolbar->paste_mode = (AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_LINE);
1934       ags_composite_toolbar_set_action(composite_toolbar,
1935 				       (AGS_COMPOSITE_TOOLBAR_ACTION_COPY |
1936 					AGS_COMPOSITE_TOOLBAR_ACTION_CUT |
1937 					AGS_COMPOSITE_TOOLBAR_ACTION_PASTE));
1938 
1939       ags_composite_toolbar_set_option(composite_toolbar,
1940 				       (AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL |
1941 					AGS_COMPOSITE_TOOLBAR_HAS_ZOOM |
1942 					AGS_COMPOSITE_TOOLBAR_HAS_OPACITY |
1943 					AGS_COMPOSITE_TOOLBAR_HAS_PORT));
1944 
1945       /* connect */
1946       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1947 					 composite_toolbar->position);
1948       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1949 					 composite_toolbar->edit);
1950       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1951 					 composite_toolbar->clear);
1952       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1953 					 composite_toolbar->select);
1954 
1955       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1956 					 composite_toolbar->copy);
1957       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1958 					 composite_toolbar->cut);
1959       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1960 					 composite_toolbar->paste);
1961 
1962       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1963 					 composite_toolbar->menu_tool);
1964 
1965       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1966 					 composite_toolbar->port);
1967 
1968       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1969 					 composite_toolbar->zoom);
1970 
1971       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
1972 					 composite_toolbar->opacity);
1973 
1974       gtk_toggle_tool_button_set_active(composite_toolbar->position,
1975 					TRUE);
1976 
1977       success = TRUE;
1978     }else if(!g_strcmp0(scope,
1979 			AGS_COMPOSITE_TOOLBAR_SCOPE_WAVE)){
1980       static const gchar **wave_menu_tool_dialog = {
1981 						    AGS_COMPOSITE_TOOLBAR_SCOPE_COMMON,
1982 						    AGS_COMPOSITE_TOOLBAR_SCOPE_WAVE,
1983 						    NULL,
1984       };
1985 
1986       static GValue *wave_menu_tool_value = NULL;
1987 
1988       static gboolean initialized = FALSE;
1989 
1990       /* static initializers */
1991       if(!initialized){
1992 	wave_menu_tool_value = (GValue *) g_new0(GValue,
1993 						 2);
1994 
1995 	g_value_init(wave_menu_tool_value,
1996 		     G_TYPE_UINT);
1997 	g_value_set_uint(wave_menu_tool_value,
1998 			 (AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_ENABLE_ALL_AUDIO_CHANNELS |
1999 			  AGS_COMPOSITE_TOOLBAR_COMMON_DIALOG_DISABLE_ALL_AUDIO_CHANNELS));
2000 
2001 	g_value_init(wave_menu_tool_value + 1,
2002 		     G_TYPE_UINT);
2003 	g_value_set_uint(wave_menu_tool_value + 1,
2004 			 (AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_SELECT_BUFFER |
2005 			  AGS_COMPOSITE_TOOLBAR_WAVE_DIALOG_POSITION_CURSOR));
2006 
2007 	initialized = TRUE;
2008       }
2009 
2010       /* set tool, action and option */
2011       ags_composite_toolbar_set_tool(composite_toolbar,
2012 				     (AGS_COMPOSITE_TOOLBAR_TOOL_POSITION |
2013 				      AGS_COMPOSITE_TOOLBAR_TOOL_EDIT |
2014 				      AGS_COMPOSITE_TOOLBAR_TOOL_CLEAR |
2015 				      AGS_COMPOSITE_TOOLBAR_TOOL_SELECT));
2016 
2017       composite_toolbar->paste_mode = (AGS_COMPOSITE_TOOLBAR_PASTE_MATCH_AUDIO_CHANNEL);
2018       ags_composite_toolbar_set_action(composite_toolbar,
2019 				       (AGS_COMPOSITE_TOOLBAR_ACTION_COPY |
2020 					AGS_COMPOSITE_TOOLBAR_ACTION_CUT |
2021 					AGS_COMPOSITE_TOOLBAR_ACTION_PASTE));
2022 
2023       ags_composite_toolbar_set_option(composite_toolbar,
2024 				       (AGS_COMPOSITE_TOOLBAR_HAS_MENU_TOOL |
2025 					AGS_COMPOSITE_TOOLBAR_HAS_ZOOM |
2026 					AGS_COMPOSITE_TOOLBAR_HAS_OPACITY));
2027 
2028       /* connect */
2029       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2030 					 composite_toolbar->position);
2031       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2032 					 composite_toolbar->select);
2033 
2034       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2035 					 composite_toolbar->copy);
2036       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2037 					 composite_toolbar->cut);
2038       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2039 					 composite_toolbar->paste);
2040 
2041       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2042 					 composite_toolbar->menu_tool);
2043 
2044       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2045 					 composite_toolbar->zoom);
2046 
2047       ags_connectable_connect_connection(AGS_CONNECTABLE(composite_toolbar),
2048 					 composite_toolbar->opacity);
2049 
2050       gtk_toggle_tool_button_set_active(composite_toolbar->position,
2051 					TRUE);
2052 
2053       success = TRUE;
2054     }
2055   }
2056 }
2057 
2058 /**
2059  * ags_composite_toolbar_new:
2060  *
2061  * Create a new #AgsCompositeToolbar.
2062  *
2063  * Returns: a new #AgsCompositeToolbar
2064  *
2065  * Since: 3.8.0
2066  */
2067 AgsCompositeToolbar*
ags_composite_toolbar_new()2068 ags_composite_toolbar_new()
2069 {
2070   AgsCompositeToolbar *composite_toolbar;
2071 
2072   composite_toolbar = (AgsCompositeToolbar *) g_object_new(AGS_TYPE_COMPOSITE_TOOLBAR,
2073 							   NULL);
2074 
2075   return(composite_toolbar);
2076 }
2077