1 /*
2  *	Copyright (C) 2004-2005 Vadim Berezniker
3  *	http://www.kryptolus.com
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with GNU Make; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21 
22 #include "stdafx.h"
23 
24 #include "common.h"
25 
26 #include "sabbu.h"
27 
28 #include "kry_marker.h"
29 #include "kry_region.h"
30 #include "kry_waveform.h"
31 #include "kry_waveform_group_item.h"
32 #include "kry_waveform_group.h"
33 #include "sound.h"
34 
35 extern struct sabbu app;
36 
37 static void kry_waveform_group_class_init(KryWaveformGroupClass *klass);
38 static void kry_waveform_group_init(KryWaveformGroup *group);
39 static void kry_waveform_group_destroy(GtkObject *object);
40 static void kry_waveform_group_waveform_zoom_changed_cb(KryWaveform *waveform, double zoom, KryWaveformGroupItem *item);
41 static void kry_waveform_group_waveform_scale_changed_cb(KryWaveform *waveform, int scale, KryWaveformGroupItem *item);
42 static void kry_waveform_group_enable_simple_interface_item(KryWaveformGroup *group, KryWaveformGroupItem *item);
43 
kry_waveform_group_get_type()44 GType kry_waveform_group_get_type()
45 {
46   static GType kry_waveform_group_type = 0;
47 
48   if(!kry_waveform_group_type)
49   {
50     static const GTypeInfo kry_waveform_group_info =
51     {
52       sizeof (KryWaveformGroupClass),
53       NULL, /* base init */
54       NULL, /* base finalize */
55       (GClassInitFunc) kry_waveform_group_class_init,
56       NULL, /* class finalize */
57       NULL, /* class data */
58       sizeof(KryWaveformGroup),
59       0, /* n_preallocs */
60       (GInstanceInitFunc) kry_waveform_group_init,
61     };
62 
63     kry_waveform_group_type = g_type_register_static(GTK_TYPE_VBOX,
64       "KryWaveformGroup",
65       &kry_waveform_group_info,
66       (GTypeFlags) 0);
67   }
68 
69   return kry_waveform_group_type;
70 }
71 
72 enum
73 {
74   ZOOM_CHANGED_SIGNAL,
75   SCALE_CHANGED_SIGNAL,
76   LAST_SIGNAL
77 };
78 
79 static guint kry_waveform_group_signals[LAST_SIGNAL] = { 0 };
80 
81 
kry_waveform_group_class_init(KryWaveformGroupClass * klass)82 static void kry_waveform_group_class_init(KryWaveformGroupClass *klass)
83 {
84   GtkObjectClass *object_klass = (GtkObjectClass *) klass;
85   object_klass->destroy = kry_waveform_group_destroy;
86 
87   kry_waveform_group_signals[ZOOM_CHANGED_SIGNAL] =
88     g_signal_new ("zoom-changed",
89 		  G_OBJECT_CLASS_TYPE (klass),
90 		  (GSignalFlags) (G_SIGNAL_RUN_FIRST),
91       G_STRUCT_OFFSET (KryWaveformGroupClass, zoom_changed),
92 		  NULL, NULL,
93       g_cclosure_marshal_VOID__DOUBLE,
94 		  G_TYPE_NONE, 1, G_TYPE_DOUBLE);
95 
96   kry_waveform_group_signals[SCALE_CHANGED_SIGNAL] =
97     g_signal_new ("scale-changed",
98 		  G_OBJECT_CLASS_TYPE (klass),
99 		  (GSignalFlags) (G_SIGNAL_RUN_FIRST),
100       G_STRUCT_OFFSET (KryWaveformGroupClass, scale_changed),
101 		  NULL, NULL,
102       g_cclosure_marshal_VOID__INT,
103 		  G_TYPE_NONE, 1, G_TYPE_INT);}
104 
kry_waveform_group_init(KryWaveformGroup * group)105 static void kry_waveform_group_init(KryWaveformGroup *group)
106 {
107   group->common_adjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0));
108   g_object_ref(group->common_adjustment);
109 
110   kry_waveform_group_reset(group);
111 
112   group->drag_selection = TRUE;
113   group->marker_dragging = TRUE;
114 }
115 
kry_waveform_group_destroy(GtkObject * object)116 static void kry_waveform_group_destroy(GtkObject *object)
117 {
118   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(object));
119 
120   KryWaveformGroup *group = KRY_WAVEFORM_GROUP(object);
121 
122   g_object_unref(group->common_adjustment);
123 
124   kry_waveform_group_marker_remove_all(group);
125   kry_waveform_group_region_remove_all(group);
126 }
127 
kry_waveform_group_reset(KryWaveformGroup * group)128 void kry_waveform_group_reset(KryWaveformGroup *group)
129 {
130   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
131 
132   group->common_zoom = 3.0;
133   group->common_scale = 100;
134 
135   g_signal_emit(group, kry_waveform_group_signals[ZOOM_CHANGED_SIGNAL], 0, 3.0);
136   g_signal_emit(group, kry_waveform_group_signals[SCALE_CHANGED_SIGNAL], 0, 100);
137 
138   gtk_adjustment_set_value(group->common_adjustment, 0);
139 }
140 
kry_waveform_group_new(void)141 GtkWidget* kry_waveform_group_new(void)
142 {
143   return GTK_WIDGET (g_object_new (KRY_TYPE_WAVEFORM_GROUP, NULL));
144 }
145 
kry_waveform_group_get_adjustment(KryWaveformGroup * group)146 GtkAdjustment *kry_waveform_group_get_adjustment(KryWaveformGroup *group)
147 {
148   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
149 
150   return group->common_adjustment;
151 }
152 
kry_waveform_group_set_drag_selection(KryWaveformGroup * group,gboolean val)153 void kry_waveform_group_set_drag_selection(KryWaveformGroup *group, gboolean val)
154 {
155   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
156 
157   group->drag_selection = val;
158 
159   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
160   {
161     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
162     kry_waveform_set_drag_selection(kry_waveform_group_item_get_waveform(item), val);
163   }
164 }
165 
kry_waveform_group_set_marker_dragging(KryWaveformGroup * group,gboolean val)166 void kry_waveform_group_set_marker_dragging(KryWaveformGroup *group, gboolean val)
167 {
168   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
169 
170   group->marker_dragging = val;
171 
172   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
173   {
174     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
175     kry_waveform_set_marker_dragging(kry_waveform_group_item_get_waveform(item), val);
176   }
177 }
178 
kry_waveform_group_waveform_remove_all(KryWaveformGroup * group)179 void kry_waveform_group_waveform_remove_all(KryWaveformGroup *group)
180 {
181   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
182 
183   GList *ptr_next;
184   for(GList *ptr = group->waveform_list; ptr; ptr = ptr_next)
185   {
186     ptr_next = ptr->next;
187     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
188     kry_waveform_group_waveform_remove(group, item);
189   }
190 }
191 
kry_waveform_group_disable_draw(KryWaveformGroup * group)192 void kry_waveform_group_disable_draw(KryWaveformGroup *group)
193 {
194   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
195 
196   group->disable_draw = TRUE;
197 
198   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
199   {
200     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
201     kry_waveform_disable_draw(kry_waveform_group_item_get_waveform(item));
202   }
203 }
204 
kry_waveform_group_enable_draw(KryWaveformGroup * group)205 void kry_waveform_group_enable_draw(KryWaveformGroup *group)
206 {
207   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
208 
209   group->disable_draw = FALSE;
210 
211   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
212   {
213     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
214     kry_waveform_enable_draw(kry_waveform_group_item_get_waveform(item));
215   }
216 }
217 
kry_waveform_group_focus_selected(KryWaveformGroup * group)218 void kry_waveform_group_focus_selected(KryWaveformGroup *group)
219 {
220   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
221 
222   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
223   {
224     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
225     kry_waveform_focus_selected(kry_waveform_group_item_get_waveform(item));
226   }
227 }
228 
kry_waveform_group_region_add(KryWaveformGroup * group,KryRegion * region)229 void kry_waveform_group_region_add(KryWaveformGroup *group, KryRegion *region)
230 {
231   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
232 
233   g_object_ref(region);
234 
235   group->region_list = g_list_append(group->region_list, region);
236 
237   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
238   {
239     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
240     kry_waveform_region_add(kry_waveform_group_item_get_waveform(item), region);
241   }
242 }
243 
kry_waveform_group_region_add_new(KryWaveformGroup * group,KryMarker * marker_left,KryMarker * marker_right,int colorid)244 void kry_waveform_group_region_add_new(KryWaveformGroup *group, KryMarker *marker_left, KryMarker *marker_right, int colorid)
245 {
246   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
247 
248   KryRegion *region = KRY_REGION(kry_region_new(marker_left, marker_right, colorid));
249   kry_waveform_group_region_add(group, region);
250   g_object_unref(G_OBJECT(region));
251 }
252 
kry_waveform_group_region_fixed_list_set(KryWaveformGroup * group,KryRegionFixedList * list)253 void kry_waveform_group_region_fixed_list_set(KryWaveformGroup *group, KryRegionFixedList *list)
254 {
255   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
256 
257   group->region_fixed_list = list;
258 
259   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
260   {
261     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
262     kry_waveform_region_fixed_list_set(kry_waveform_group_item_get_waveform(item), list);
263   }
264 
265 }
266 
kry_waveform_group_region_remove_by_type(KryWaveformGroup * group,int colorid)267 void kry_waveform_group_region_remove_by_type(KryWaveformGroup *group, int colorid)
268 {
269   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
270 
271   GList *ptr_next;
272   for(GList *ptr = group->region_list; ptr; ptr = ptr_next)
273   {
274     ptr_next = ptr->next;
275     KryRegion *region = (KryRegion *) ptr->data;
276     if(region->color_id == colorid)
277     {
278       g_object_unref(G_OBJECT(region));
279       group->region_list = g_list_remove(group->region_list, region);
280     }
281   }
282 
283   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
284   {
285     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
286     kry_waveform_region_remove_by_type(kry_waveform_group_item_get_waveform(item), colorid);
287   }
288 }
289 
kry_waveform_group_region_remove_all(KryWaveformGroup * group)290 void kry_waveform_group_region_remove_all(KryWaveformGroup *group)
291 {
292   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
293 
294   for(GList *ptr = group->region_list; ptr; ptr = ptr->next)
295     g_object_unref(G_OBJECT(ptr->data));
296 
297   g_list_free(group->region_list);
298   group->region_list = NULL;
299 
300   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
301   {
302     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
303     kry_waveform_region_remove_all(kry_waveform_group_item_get_waveform(item));
304   }
305 }
306 
kry_waveform_group_marker_add(KryWaveformGroup * group,KryMarker * marker)307 void kry_waveform_group_marker_add(KryWaveformGroup *group, KryMarker *marker)
308 {
309   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
310 
311   g_object_ref(marker);
312 
313   group->marker_list = g_list_append(group->marker_list, marker);
314 
315   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
316   {
317     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
318     kry_waveform_marker_add(kry_waveform_group_item_get_waveform(item), marker);
319   }
320 }
321 
kry_waveform_group_marker_show(KryWaveformGroup * group,KryMarker * marker)322 void kry_waveform_group_marker_show(KryWaveformGroup *group, KryMarker *marker)
323 {
324   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
325 
326   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
327   {
328     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
329     kry_waveform_marker_show(kry_waveform_group_item_get_waveform(item), marker);
330   }
331 }
332 
kry_waveform_group_marker_hide(KryWaveformGroup * group,KryMarker * marker)333 void kry_waveform_group_marker_hide(KryWaveformGroup *group, KryMarker *marker)
334 {
335   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
336 
337   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
338   {
339     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
340     kry_waveform_marker_hide(kry_waveform_group_item_get_waveform(item), marker);
341   }
342 }
343 
kry_waveform_group_marker_set_active_start(KryWaveformGroup * group,KryMarker * marker)344 void kry_waveform_group_marker_set_active_start(KryWaveformGroup *group, KryMarker *marker)
345 {
346   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
347 
348   group->marker_active_start = marker;
349 
350   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
351   {
352     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
353     kry_waveform_marker_set_active_start(kry_waveform_group_item_get_waveform(item), marker);
354   }
355 }
356 
kry_waveform_group_marker_set_active_end(KryWaveformGroup * group,KryMarker * marker)357 void kry_waveform_group_marker_set_active_end(KryWaveformGroup *group, KryMarker *marker)
358 {
359   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
360 
361   group->marker_active_end = marker;
362 
363   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
364   {
365     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
366     kry_waveform_marker_set_active_end(kry_waveform_group_item_get_waveform(item), marker);
367   }
368 }
369 
kry_waveform_group_marker_set_autoscroll(KryWaveformGroup * group,KryMarker * marker)370 void kry_waveform_group_marker_set_autoscroll(KryWaveformGroup *group, KryMarker *marker)
371 {
372   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
373 
374   group->marker_autoscroll = marker;
375 
376   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
377   {
378     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
379     kry_waveform_marker_set_autoscroll(kry_waveform_group_item_get_waveform(item), marker);
380   }
381 }
382 
kry_waveform_group_marker_remove_all(KryWaveformGroup * group)383 void kry_waveform_group_marker_remove_all(KryWaveformGroup *group)
384 {
385   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
386 
387   for(GList *ptr = group->marker_list; ptr; ptr = ptr->next)
388     g_object_unref(G_OBJECT(ptr->data));
389 
390   g_list_free(group->marker_list);
391   group->marker_list = NULL;
392 
393   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
394   {
395     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
396     kry_waveform_marker_remove_all(kry_waveform_group_item_get_waveform(item));
397   }
398 }
399 
kry_waveform_group_marker_remove(KryWaveformGroup * group,KryMarker * marker_match)400 void kry_waveform_group_marker_remove(KryWaveformGroup *group, KryMarker *marker_match)
401 {
402   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
403 
404   GList *next;
405   for(GList *marker_ptr = group->marker_list; marker_ptr; marker_ptr = next)
406   {
407     next = marker_ptr->next;
408 
409     KryMarker *marker = KRY_MARKER(marker_ptr->data);
410     if(marker == marker_match)
411     {
412       for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
413       {
414         KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
415         kry_waveform_marker_remove(kry_waveform_group_item_get_waveform(item), marker_match);
416       }
417       group->marker_list = g_list_remove(group->marker_list, marker);
418       g_object_unref(marker);
419     }
420   }
421 }
422 
kry_waveform_group_get_keyframe_list(KryWaveformGroup * group)423 KryWaveformKeyframeList *kry_waveform_group_get_keyframe_list(KryWaveformGroup *group)
424 {
425   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
426 
427   return group->keyframe_list;
428 }
429 
kry_waveform_group_set_keyframe_list(KryWaveformGroup * group,KryWaveformKeyframeList * list)430 void kry_waveform_group_set_keyframe_list(KryWaveformGroup *group, KryWaveformKeyframeList *list)
431 {
432   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
433 
434   group->keyframe_list = list;
435 
436   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
437   {
438     KryWaveformGroupItem *item =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
439     kry_waveform_set_keyframe_list(kry_waveform_group_item_get_waveform(item), list);
440   }
441 }
442 
kry_waveform_group_waveform_remove(KryWaveformGroup * group,KryWaveformGroupItem * item)443 void kry_waveform_group_waveform_remove(KryWaveformGroup *group, KryWaveformGroupItem *item)
444 {
445   group->waveform_list = g_list_remove(group->waveform_list, item);
446 
447   if(item->toolbar)
448     gtk_container_remove(GTK_CONTAINER(group), item->toolbar);
449 
450   if(item->scrollbar)
451     gtk_container_remove(GTK_CONTAINER(group), item->scrollbar);
452 
453   gtk_container_remove(GTK_CONTAINER(group), GTK_WIDGET(kry_waveform_group_item_get_waveform(item)));
454 
455   kry_free(item);
456 }
457 
kry_waveform_group_waveform_add_internal(KryWaveformGroup * group,KryWaveformGroupItem * parent_item,KryWaveformGroupItem * item)458 static KryWaveformGroupItem *kry_waveform_group_waveform_add_internal(KryWaveformGroup *group, KryWaveformGroupItem *parent_item, KryWaveformGroupItem *item)
459 {
460   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
461 
462   KryWaveform *waveform = kry_waveform_group_item_get_waveform(item);
463 
464   kry_waveform_group_item_set_group(item, GTK_WIDGET(group));
465 
466   if(group->disable_draw)
467     kry_waveform_disable_draw(waveform);
468 
469   if(parent_item)
470   {
471     if(parent_item->parent_item)
472       item->parent_item = parent_item->parent_item;
473     else
474       item->parent_item = parent_item;
475   }
476 
477   if(parent_item && !parent_item->zoom_sync)
478   {
479     item->zoom = parent_item->zoom;
480     kry_waveform_group_item_set_zoom_sync(item, FALSE);
481     kry_waveform_set_zoom(waveform, parent_item->zoom);
482   }
483   else
484   {
485     item->zoom = group->common_zoom;
486     kry_waveform_set_zoom(waveform, group->common_zoom);
487   }
488 
489   if(parent_item && !parent_item->scale_sync)
490   {
491     item->scale = parent_item->scale;
492     kry_waveform_group_item_set_scale_sync(item, FALSE);
493     kry_waveform_set_scale(waveform, parent_item->scale);
494   }
495   else
496   {
497     item->scale = group->common_scale;
498     kry_waveform_set_scale(waveform, group->common_scale);
499   }
500 
501   if(parent_item && !parent_item->scroll_sync)
502     kry_waveform_group_item_set_scroll_sync(item, FALSE);
503 
504   for(GList *ptr = group->marker_list; ptr; ptr = ptr->next)
505     kry_waveform_marker_add(waveform, (KryMarker *) ptr->data);
506 
507   for(GList *ptr = group->region_list; ptr; ptr = ptr->next)
508     kry_waveform_region_add(waveform, (KryRegion *) ptr->data);
509 
510   if(group->keyframe_list)
511     kry_waveform_set_keyframe_list(waveform, group->keyframe_list);
512 
513   if(group->marker_active_start)
514     kry_waveform_marker_set_active_start(waveform, group->marker_active_start);
515 
516   if(group->marker_active_end)
517     kry_waveform_marker_set_active_end(waveform, group->marker_active_end);
518 
519   if(group->marker_autoscroll)
520     kry_waveform_marker_set_autoscroll(waveform, group->marker_autoscroll);
521 
522   if(group->region_fixed_list)
523     kry_waveform_region_fixed_list_set(waveform, group->region_fixed_list);
524 
525   kry_waveform_set_drag_selection(waveform, group->drag_selection);
526   kry_waveform_set_marker_dragging(waveform, group->marker_dragging);
527 
528   group->waveform_list = g_list_append(group->waveform_list, item);
529 
530   if(GtkWidget *toolbar = kry_waveform_group_item_get_toolbar(item))
531   {
532     gtk_box_pack_start(GTK_BOX(group), toolbar, FALSE, TRUE, 0);
533     if(group->simple_interface && g_list_length(group->waveform_list) > 1)
534       gtk_widget_hide(toolbar);
535     else
536       gtk_widget_show(toolbar);
537   }
538 
539   gtk_box_pack_start(GTK_BOX(group), GTK_WIDGET(waveform), TRUE, TRUE, 0);
540   gtk_widget_show(GTK_WIDGET(waveform));
541 
542   if(GtkWidget *scrollbar = kry_waveform_group_item_get_scrollbar(item))
543   {
544     gtk_box_pack_start(GTK_BOX(group), GTK_WIDGET(scrollbar), FALSE, TRUE, 0);
545     if(group->simple_interface)
546     {
547       kry_waveform_group_enable_simple_interface_item(group, item);
548       gtk_widget_hide(scrollbar);
549     }
550     else
551     {
552       gtk_widget_show(scrollbar);
553       gtk_widget_hide(group->scrollbar);
554     }
555   }
556 
557   if(group->simple_interface)
558   {
559     if(group->toolbar)
560       gtk_widget_show(group->toolbar);
561 
562     if(group->scrollbar)
563       gtk_widget_show(group->scrollbar);
564 
565     if(item != group->waveform_list->data)
566     {
567       kry_waveform_set_show_time_bar(waveform, FALSE);
568       kry_waveform_set_show_time_markers(waveform, TRUE);
569     }
570   }
571 
572   g_signal_connect(G_OBJECT(waveform), "zoom-changed", G_CALLBACK(kry_waveform_group_waveform_zoom_changed_cb), item);
573   g_signal_connect(G_OBJECT(waveform), "scale-changed", G_CALLBACK(kry_waveform_group_waveform_scale_changed_cb), item);
574 
575   return item;
576 }
577 
578 KryWaveformGroupItem *
kry_waveform_group_waveform_add(KryWaveformGroup * group,KryWaveformGroupItem * item)579   kry_waveform_group_waveform_add(KryWaveformGroup *group,
580                                   KryWaveformGroupItem *item)
581 {
582   return kry_waveform_group_waveform_add_internal(group, NULL, item);
583 }
584 
585 KryWaveformGroupItem *
kry_waveform_group_waveform_add_with_toolbar(KryWaveformGroup * group,KryWaveformGroupItem * item)586   kry_waveform_group_waveform_add_with_toolbar(KryWaveformGroup *group,
587                                                KryWaveformGroupItem *item)
588 {
589   return kry_waveform_group_waveform_add_internal(group, NULL, item);
590 }
591 
592 KryWaveformGroupItem *
kry_waveform_group_waveform_view_add(KryWaveformGroup * group,KryWaveformGroupItem * parent,KryWaveformGroupItem * item)593   kry_waveform_group_waveform_view_add(KryWaveformGroup *group, KryWaveformGroupItem *parent,
594                                        KryWaveformGroupItem *item)
595 {
596   return kry_waveform_group_waveform_add_internal(group, parent, item);
597 }
598 
599 KryWaveformGroupItem *
kry_waveform_group_waveform_view_add_with_toolbar(KryWaveformGroup * group,KryWaveformGroupItem * parent,KryWaveformGroupItem * item)600   kry_waveform_group_waveform_view_add_with_toolbar(KryWaveformGroup *group, KryWaveformGroupItem *parent,
601                                                     KryWaveformGroupItem *item)
602 {
603   return kry_waveform_group_waveform_add_internal(group, parent, item);
604 }
605 
kry_waveform_group_set_zoom_internal(KryWaveformGroup * group,KryWaveformGroupItem * item,double zoom)606 static void kry_waveform_group_set_zoom_internal(KryWaveformGroup *group, KryWaveformGroupItem *item, double zoom)
607 {
608   if(!item || item->zoom_sync)
609   {
610     if(group->common_zoom == zoom)
611       return;
612 
613     group->common_zoom = zoom;
614 
615     for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
616     {
617       KryWaveformGroupItem *item_cur =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
618       if(item_cur != item && item_cur->zoom_sync)
619         kry_waveform_set_zoom(kry_waveform_group_item_get_waveform(item_cur), zoom);
620     }
621 
622     g_signal_emit(group, kry_waveform_group_signals[ZOOM_CHANGED_SIGNAL], 0, zoom);
623   }
624   else
625   {
626     kry_waveform_set_zoom(kry_waveform_group_item_get_waveform(item), zoom);
627   }
628 }
629 
kry_waveform_group_waveform_zoom_changed_cb(KryWaveform * waveform,double zoom,KryWaveformGroupItem * item)630 static void kry_waveform_group_waveform_zoom_changed_cb(KryWaveform *waveform, double zoom, KryWaveformGroupItem *item)
631 {
632   if(!item->zoom_sync)
633     return;
634 
635   kry_waveform_group_set_zoom_internal(KRY_WAVEFORM_GROUP(item->group), item, zoom);
636 }
637 
kry_waveform_group_set_zoom(KryWaveformGroup * group,double zoom)638 void kry_waveform_group_set_zoom(KryWaveformGroup *group, double zoom)
639 {
640   kry_waveform_group_set_zoom_internal(group, NULL, zoom);
641 }
642 
kry_waveform_group_set_scale_internal(KryWaveformGroup * group,KryWaveformGroupItem * item,int scale)643 static void kry_waveform_group_set_scale_internal(KryWaveformGroup *group, KryWaveformGroupItem *item, int scale)
644 {
645   if(!item || item->scale_sync)
646   {
647     if(group->common_scale == scale)
648       return;
649 
650     group->common_scale = scale;
651 
652     for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
653     {
654       KryWaveformGroupItem *item_cur =  KRY_WAVEFORM_GROUP_ITEM(ptr->data);
655       if(item_cur != item && item_cur->scale_sync)
656         kry_waveform_set_scale(kry_waveform_group_item_get_waveform(item_cur), scale);
657     }
658 
659     g_signal_emit(group, kry_waveform_group_signals[SCALE_CHANGED_SIGNAL], 0, scale);
660   }
661   else
662   {
663     kry_waveform_set_scale(kry_waveform_group_item_get_waveform(item), scale);
664   }
665 }
666 
kry_waveform_group_waveform_scale_changed_cb(KryWaveform * waveform,int scale,KryWaveformGroupItem * item)667 static void kry_waveform_group_waveform_scale_changed_cb(KryWaveform *waveform, int scale, KryWaveformGroupItem *item)
668 {
669   if(!item->scale_sync)
670     return;
671 
672   kry_waveform_group_set_scale_internal(KRY_WAVEFORM_GROUP(item->group), item, scale);
673 }
674 
kry_waveform_group_set_scale(KryWaveformGroup * group,int scale)675 void kry_waveform_group_set_scale(KryWaveformGroup *group, int scale)
676 {
677   kry_waveform_group_set_scale_internal(group, NULL, scale);
678 }
679 
kry_waveform_group_waveform_get_list(KryWaveformGroup * group)680 GList *kry_waveform_group_waveform_get_list(KryWaveformGroup *group)
681 {
682   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
683 
684   return group->waveform_list;
685 }
686 
kry_waveform_group_enable_simple_interface_item(KryWaveformGroup * group,KryWaveformGroupItem * item)687 void kry_waveform_group_enable_simple_interface_item(KryWaveformGroup *group, KryWaveformGroupItem *item)
688 {
689   kry_waveform_group_item_set_scroll_sync(item, TRUE);
690   kry_waveform_group_item_set_zoom_sync(item, TRUE);
691   kry_waveform_group_item_set_scale_sync(item, TRUE);
692 
693   GtkWidget *toolbar = kry_waveform_group_item_get_toolbar(item);
694   if(toolbar)
695     gtk_widget_hide(toolbar);
696 
697   if(item != group->waveform_list->data)
698   {
699     kry_waveform_set_show_time_bar(kry_waveform_group_item_get_waveform(item), FALSE);
700     kry_waveform_set_show_scrub_bar(kry_waveform_group_item_get_waveform(item), FALSE);
701   }
702 
703   GtkWidget *scrollbar = kry_waveform_group_item_get_scrollbar(item);
704   if(scrollbar)
705     gtk_widget_hide(scrollbar);
706 }
707 
kry_waveform_group_enable_simple_interface(KryWaveformGroup * group)708 void kry_waveform_group_enable_simple_interface(KryWaveformGroup *group)
709 {
710   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
711 
712   group->simple_interface = TRUE;
713 
714   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
715     kry_waveform_group_enable_simple_interface_item(group, KRY_WAVEFORM_GROUP_ITEM(ptr->data));
716 
717   if(group->toolbar)
718     gtk_widget_show(group->toolbar);
719 
720   if(group->scrollbar)
721     gtk_widget_show(group->scrollbar);
722 }
723 
kry_waveform_group_disable_simple_interface(KryWaveformGroup * group)724 void kry_waveform_group_disable_simple_interface(KryWaveformGroup *group)
725 {
726   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
727 
728   group->simple_interface = FALSE;
729 
730   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
731   {
732     KryWaveformGroupItem *item = KRY_WAVEFORM_GROUP_ITEM(ptr->data);
733 
734     GtkWidget *toolbar = kry_waveform_group_item_get_toolbar(item);
735     if(toolbar)
736       gtk_widget_show(toolbar);
737 
738     kry_waveform_set_show_time_bar(kry_waveform_group_item_get_waveform(item), TRUE);
739     kry_waveform_set_show_scrub_bar(kry_waveform_group_item_get_waveform(item), TRUE);
740 
741     GtkWidget *scrollbar = kry_waveform_group_item_get_scrollbar(item);
742     if(scrollbar)
743       gtk_widget_show(scrollbar);
744   }
745 
746   if(group->toolbar)
747     gtk_widget_hide(group->toolbar);
748 
749   if(group->scrollbar)
750     gtk_widget_hide(group->scrollbar);
751 }
752 
kry_waveform_group_set_toolbar(KryWaveformGroup * group,GtkWidget * toolbar)753 void kry_waveform_group_set_toolbar(KryWaveformGroup *group, GtkWidget *toolbar)
754 {
755   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
756 
757   if(group->toolbar)
758     gtk_container_remove(GTK_CONTAINER(group), group->toolbar);
759 
760   group->toolbar = toolbar;
761 
762   if(group->simple_interface)
763     gtk_widget_show(toolbar);
764   else
765     gtk_widget_hide(toolbar);
766 
767   gtk_box_pack_start(GTK_BOX(group), toolbar, FALSE, TRUE, 0);
768   gtk_box_reorder_child(GTK_BOX(group), toolbar, 0);
769 }
770 
kry_waveform_group_set_scrollbar(KryWaveformGroup * group,GtkWidget * scrollbar)771 void kry_waveform_group_set_scrollbar(KryWaveformGroup *group, GtkWidget *scrollbar)
772 {
773   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
774 
775   if(group->scrollbar)
776     gtk_container_remove(GTK_CONTAINER(group), group->scrollbar);
777 
778   group->scrollbar = scrollbar;
779 
780   if(group->simple_interface)
781     gtk_widget_show(scrollbar);
782   else
783     gtk_widget_hide(scrollbar);
784 
785   gtk_box_pack_end(GTK_BOX(group), scrollbar, FALSE, TRUE, 0);
786 }
787 
kry_waveform_group_get_scrollbar(KryWaveformGroup * group)788 GtkWidget *kry_waveform_group_get_scrollbar(KryWaveformGroup *group)
789 {
790   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
791 
792   return group->scrollbar;
793 }
794 
kry_waveform_group_get_toolbar(KryWaveformGroup * group)795 GtkWidget *kry_waveform_group_get_toolbar(KryWaveformGroup *group)
796 {
797   g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP(group), NULL);
798 
799   return group->toolbar;
800 }
801 
kry_waveform_group_set_show_time_bar(KryWaveformGroup * group,gboolean val)802 void kry_waveform_group_set_show_time_bar(KryWaveformGroup *group, gboolean val)
803 {
804   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
805 
806   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
807   {
808     KryWaveformGroupItem *item = (KryWaveformGroupItem *) ptr->data;
809     KryWaveform *waveform = kry_waveform_group_item_get_waveform(item);
810     kry_waveform_set_show_time_bar(waveform, val);
811 
812     if(group->simple_interface)
813       break;
814   }
815 }
816 
kry_waveform_group_set_show_time_markers(KryWaveformGroup * group,gboolean val)817 void kry_waveform_group_set_show_time_markers(KryWaveformGroup *group, gboolean val)
818 {
819   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
820 
821   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
822   {
823     KryWaveformGroupItem *item = (KryWaveformGroupItem *) ptr->data;
824     KryWaveform *waveform = kry_waveform_group_item_get_waveform(item);
825     kry_waveform_set_show_time_markers(waveform, val);
826   }
827 }
828 
kry_waveform_group_set_show_keyframes(KryWaveformGroup * group,gboolean val)829 void kry_waveform_group_set_show_keyframes(KryWaveformGroup *group, gboolean val)
830 {
831   g_return_if_fail(KRY_IS_WAVEFORM_GROUP(group));
832 
833   for(GList *ptr = group->waveform_list; ptr; ptr = ptr->next)
834   {
835     KryWaveformGroupItem *item = (KryWaveformGroupItem *) ptr->data;
836     KryWaveform *waveform = kry_waveform_group_item_get_waveform(item);
837     kry_waveform_set_show_keyframes(waveform, val);
838   }
839 }
840