/* * Copyright (C) 2004-2005 Vadim Berezniker * http://www.kryptolus.com * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * http://www.gnu.org/copyleft/gpl.html * */ #include "stdafx.h" #include "pavl.h" #include "kryList.h" #include "krySignal.h" #include "kryObject.h" #include "kryColor.h" #include "kryColorTable.h" #include "kry_marker.h" #include "kry_region.h" #include "kry_region_fixed_list.h" #include "kry_waveform.h" #include "kry_waveform_group_item.h" #include "kry_waveform_group.h" enum { ZOOM_SYNC_CHANGED, SCALE_SYNC_CHANGED, SCROLL_SYNC_CHANGED, LAST_SIGNAL }; static void kry_waveform_group_item_class_init (KryWaveformGroupItemClass *klass); static void kry_waveform_group_item_init (KryWaveformGroupItem *item); static guint kry_waveform_group_item_signals[LAST_SIGNAL] = { 0 }; GType kry_waveform_group_item_get_type (void) { static GType kry_waveform_group_item_type = 0; if (!kry_waveform_group_item_type) { static const GTypeInfo kry_waveform_group_item_info = { sizeof (KryWaveformGroupItemClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) kry_waveform_group_item_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (KryWaveformGroupItem), 0, /* n_preallocs */ (GInstanceInitFunc) kry_waveform_group_item_init, }; kry_waveform_group_item_type = g_type_register_static (G_TYPE_OBJECT, "KryWaveformGroupItem", &kry_waveform_group_item_info, (GTypeFlags) 0); } return kry_waveform_group_item_type; } static void kry_waveform_group_item_class_init (KryWaveformGroupItemClass *klass) { kry_waveform_group_item_signals[ZOOM_SYNC_CHANGED] = g_signal_new ("zoom-sync-changed", G_OBJECT_CLASS_TYPE (klass), (GSignalFlags) (G_SIGNAL_RUN_FIRST), G_STRUCT_OFFSET (KryWaveformGroupItemClass, zoom_sync_changed), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); kry_waveform_group_item_signals[SCALE_SYNC_CHANGED] = g_signal_new ("scale-sync-changed", G_OBJECT_CLASS_TYPE (klass), (GSignalFlags) (G_SIGNAL_RUN_FIRST), G_STRUCT_OFFSET (KryWaveformGroupItemClass, zoom_sync_changed), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); kry_waveform_group_item_signals[SCROLL_SYNC_CHANGED] = g_signal_new ("scroll-sync-changed", G_OBJECT_CLASS_TYPE (klass), (GSignalFlags) (G_SIGNAL_RUN_FIRST), G_STRUCT_OFFSET (KryWaveformGroupItemClass, zoom_sync_changed), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); } static void kry_waveform_group_item_init (KryWaveformGroupItem *item) { item->zoom_sync = TRUE; item->scale_sync = TRUE; item->scroll_sync = TRUE; } void kry_waveform_group_item_zoom_cb(KryWaveform *waveform, double zoom, KryWaveformGroupItem *item) { item->zoom = zoom; } void kry_waveform_group_item_scale_cb(KryWaveform *waveform, int scale, KryWaveformGroupItem *item) { item->scale = scale; } GObject* kry_waveform_group_item_new(KryWaveform *waveform) { KryWaveformGroupItem *item; item = KRY_WAVEFORM_GROUP_ITEM(g_object_new (KRY_TYPE_WAVEFORM_GROUP_ITEM, NULL)); item->waveform = waveform; g_signal_connect(G_OBJECT(waveform), "zoom-changed", G_CALLBACK(kry_waveform_group_item_zoom_cb), item); g_signal_connect(G_OBJECT(waveform), "scale-changed", G_CALLBACK(kry_waveform_group_item_scale_cb), item); return G_OBJECT (item); } void kry_waveform_group_item_set_group(KryWaveformGroupItem *item, GtkWidget *group) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); item->group = group; } KryWaveform *kry_waveform_group_item_get_waveform(KryWaveformGroupItem *item) { g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item), NULL); return item->waveform; } GtkWidget *kry_waveform_group_item_get_toolbar(KryWaveformGroupItem *item) { g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item), NULL); return item->toolbar; } void kry_waveform_group_item_set_toolbar(KryWaveformGroupItem *item, GtkWidget *widget) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); item->toolbar = widget; } GtkWidget *kry_waveform_group_item_get_scrollbar(KryWaveformGroupItem *item) { g_return_val_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item), NULL); return item->scrollbar; } void kry_waveform_group_item_set_scrollbar(KryWaveformGroupItem *item, GtkWidget *widget) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); item->scrollbar = widget; } void kry_waveform_group_item_show(KryWaveformGroupItem *item) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); gtk_widget_show(GTK_WIDGET(item->waveform)); if(item->scrollbar && !KRY_WAVEFORM_GROUP(item->group)->simple_interface) gtk_widget_show(GTK_WIDGET(item->scrollbar)); } void kry_waveform_group_item_hide(KryWaveformGroupItem *item) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); gtk_widget_hide(GTK_WIDGET(item->waveform)); if(item->scrollbar) gtk_widget_hide(GTK_WIDGET(item->scrollbar)); } void kry_waveform_group_item_set_zoom_sync(KryWaveformGroupItem *item, gboolean zoom_sync) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); if(item->zoom_sync == zoom_sync) return; item->zoom = KRY_WAVEFORM_GROUP(item->group)->common_zoom; item->zoom_sync = zoom_sync; g_signal_emit(G_OBJECT(item), kry_waveform_group_item_signals[ZOOM_SYNC_CHANGED], 0, zoom_sync); if(zoom_sync) kry_waveform_set_zoom(kry_waveform_group_item_get_waveform(item), KRY_WAVEFORM_GROUP(item->group)->common_zoom); else kry_waveform_group_item_set_scroll_sync(item, FALSE); } void kry_waveform_group_item_set_scale_sync(KryWaveformGroupItem *item, gboolean scale_sync) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); if(item->scale_sync == scale_sync) return; item->scale = KRY_WAVEFORM_GROUP(item->group)->common_scale; item->scale_sync = scale_sync; g_signal_emit(G_OBJECT(item), kry_waveform_group_item_signals[SCALE_SYNC_CHANGED], 0, scale_sync); if(scale_sync) kry_waveform_set_scale(kry_waveform_group_item_get_waveform(item), KRY_WAVEFORM_GROUP(item->group)->common_scale); } void kry_waveform_group_item_set_scroll_sync(KryWaveformGroupItem *item, gboolean scroll_sync) { g_return_if_fail(KRY_IS_WAVEFORM_GROUP_ITEM(item)); if(item->scroll_sync == scroll_sync) return; item->scroll_sync = scroll_sync; g_signal_emit(G_OBJECT(item), kry_waveform_group_item_signals[SCROLL_SYNC_CHANGED], 0, scroll_sync); if(scroll_sync) { kry_waveform_set_adjustment(item->waveform, KRY_WAVEFORM_GROUP(item->group)->common_adjustment); gtk_range_set_adjustment(GTK_RANGE(item->scrollbar), KRY_WAVEFORM_GROUP(item->group)->common_adjustment); gtk_adjustment_value_changed(KRY_WAVEFORM_GROUP(item->group)->common_adjustment); kry_waveform_group_item_set_zoom_sync(item, TRUE); } else { GtkAdjustment *adj; if(item->parent_item && !item->parent_item->scroll_sync) adj = kry_waveform_get_adjustment(item->parent_item->waveform); else adj = KRY_WAVEFORM_GROUP(item->group)->common_adjustment; GtkAdjustment *adj_copy = GTK_ADJUSTMENT(gtk_adjustment_new(adj->value, adj->lower, adj->upper, adj->step_increment, adj->page_increment, adj->page_size)); g_object_ref(adj_copy); kry_waveform_set_adjustment(item->waveform, adj_copy); gtk_range_set_adjustment(GTK_RANGE(item->scrollbar), adj_copy); } }