/* * 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 "kry_marker.h" enum { VALUE_CHANGED, LAST_SIGNAL }; static void kry_marker_class_init (KryMarkerClass *klass); static void kry_marker_init (KryMarker *marker); static guint kry_marker_signals[LAST_SIGNAL] = { 0 }; GType kry_marker_get_type (void) { static GType kry_marker_type = 0; if (!kry_marker_type) { static const GTypeInfo kry_marker_info = { sizeof (KryMarkerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) kry_marker_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (KryMarker), 0, /* n_preallocs */ (GInstanceInitFunc) kry_marker_init, }; kry_marker_type = g_type_register_static (G_TYPE_OBJECT, "KryMarker", &kry_marker_info, (GTypeFlags) 0); } return kry_marker_type; } static void kry_marker_class_init (KryMarkerClass *klass) { klass->value_changed = NULL; kry_marker_signals[VALUE_CHANGED] = g_signal_new ("value_changed", G_OBJECT_CLASS_TYPE (klass), (GSignalFlags) (G_SIGNAL_RUN_FIRST), G_STRUCT_OFFSET (KryMarkerClass, value_changed), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); } static void kry_marker_init (KryMarker *marker) { marker->value = -1; marker->isSet = FALSE; marker->multiple = 1; } GObject* kry_marker_new (enum marker_type type, int multiple) { KryMarker *marker; marker = KRY_MARKER(g_object_new (KRY_TYPE_MARKER, NULL)); marker->multiple = multiple; marker->type = type; return G_OBJECT (marker); } GObject *kry_marker_copy(KryMarker *marker) { KryMarker *marker_new; g_return_val_if_fail (KRY_IS_MARKER (marker), NULL); marker_new = KRY_MARKER(kry_marker_new(marker->type, marker->multiple)); kry_marker_set_value(marker_new, marker->value); return G_OBJECT(marker_new); } long kry_marker_get_value (KryMarker *marker) { g_return_val_if_fail (KRY_IS_MARKER (marker), 0); return marker->value; } void kry_marker_set_value (KryMarker *marker, long value) { g_return_if_fail (KRY_IS_MARKER (marker)); if(!marker->isSet || value != marker->value) { long old_value; int rem = value % marker->multiple; if(value != -1 && rem != 0) value += (marker->multiple / rem == 1 ? marker->multiple - rem : -rem); old_value = marker->value; marker->isSet = TRUE; marker->value = value; kry_marker_value_changed (marker, old_value); } } void kry_marker_set_multiple(KryMarker *marker, int multiple) { g_return_if_fail(KRY_IS_MARKER(marker)); marker->multiple = multiple; } void kry_marker_value_changed (KryMarker *marker, int old_val) { g_return_if_fail (KRY_IS_MARKER (marker)); g_signal_emit (marker, kry_marker_signals[VALUE_CHANGED], 0, old_val); } enum marker_type kry_marker_get_marker_type(KryMarker *marker) { g_return_val_if_fail (KRY_IS_MARKER (marker), (enum marker_type) 0); return marker->type; }