/* * Copyright 2010 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of either or both of the following licenses: * * 1) the GNU Lesser General Public License version 3, as published by the * Free Software Foundation; and/or * 2) the GNU Lesser General Public License version 2.1, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License version 3 and version 2.1 along with this program. If not, see * * * Authors: * Cody Russell */ #include "idorange.h" #include "idotypebuiltins.h" typedef struct { IdoRangeStyle style; } IdoRangePrivate; static void ido_range_constructed (GObject *object); static void ido_range_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void ido_range_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); G_DEFINE_TYPE_WITH_PRIVATE (IdoRange, ido_range, GTK_TYPE_SCALE) enum { PROP_0, PROP_STYLE }; static void ido_range_class_init (IdoRangeClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); gobject_class->constructed = ido_range_constructed; gobject_class->set_property = ido_range_set_property; gobject_class->get_property = ido_range_get_property; g_object_class_install_property (gobject_class, PROP_STYLE, g_param_spec_enum ("range-style", "Range style", "The style of the range", IDO_TYPE_RANGE_STYLE, IDO_RANGE_STYLE_SMALL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("knob-width", "The knob width", "The knob width", G_MININT, G_MAXINT, 8, G_PARAM_READABLE)); gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("knob-height", "The knob height", "The knob height", G_MININT, G_MAXINT, 8, G_PARAM_READABLE)); } static void ido_range_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { IdoRange *range = IDO_RANGE (object); IdoRangePrivate *priv = ido_range_get_instance_private (range); switch (prop_id) { case PROP_STYLE: g_value_set_enum (value, priv->style); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void ido_range_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { IdoRange *range = IDO_RANGE (object); IdoRangePrivate *priv = ido_range_get_instance_private (range); switch (prop_id) { case PROP_STYLE: priv->style = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void ido_range_constructed (GObject *object) { IdoRange *range = IDO_RANGE (object); IdoRangeStyle style; char buf[1024]; g_object_get (range, "range-style", &style, NULL); g_snprintf (buf, sizeof (buf), "idorange-%p", range); gtk_widget_set_name (GTK_WIDGET (range), buf); if (style == IDO_RANGE_STYLE_SMALL) { gint width, height; gtk_widget_style_get (GTK_WIDGET (range), "knob-width", &width, "knob-height", &height, NULL); } gtk_range_set_slider_size_fixed (GTK_RANGE (range), TRUE); G_OBJECT_CLASS (ido_range_parent_class)->constructed (object); } static void ido_range_init (IdoRange *range) { /* no-op */ } /** * ido_range_new: * @adj: A #GtkAdjustment providing the range values * @style: The range style * * Creates a new #IdoRange widget. * * Return Value: A new #IdoRange **/ GtkWidget * ido_range_new (GObject *adj, IdoRangeStyle style) { g_return_val_if_fail (GTK_IS_ADJUSTMENT (adj), NULL); return g_object_new (IDO_TYPE_RANGE, "orientation", GTK_ORIENTATION_HORIZONTAL, "adjustment", adj, "range-style", style, NULL); }