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