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