gtk_popover_present (GTK_POPOVER (self->menu));
}
+static void update_actions (Demo3Widget *self);
+
static void
demo3_widget_set_property (GObject *object,
guint prop_id,
case PROP_SCALE:
self->scale = g_value_get_float (value);
+ update_actions (self);
gtk_widget_queue_resize (GTK_WIDGET (object));
break;
gtk_popover_popup (GTK_POPOVER (self->menu));
}
+static void
+update_actions (Demo3Widget *self)
+{
+ gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.in", self->scale < 1024.);
+ gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.out", self->scale > 1./1024.);
+ gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.reset", self->scale != 1.);
+}
+
static void
zoom_cb (GtkWidget *widget,
const char *action_name,
float scale;
if (g_str_equal (action_name, "zoom.in"))
- scale = MIN (10, self->scale * M_SQRT2);
+ scale = MIN (1024., self->scale * M_SQRT2);
else if (g_str_equal (action_name, "zoom.out"))
- scale = MAX (0.01, self->scale / M_SQRT2);
- else
+ scale = MAX (1./1024., self->scale / M_SQRT2);
+ else if (g_str_equal (action_name, "zoom.reset"))
scale = 1.0;
-
- gtk_widget_action_set_enabled (widget, "zoom.in", scale < 10);
- gtk_widget_action_set_enabled (widget, "zoom.out", scale > 0.01);
- gtk_widget_action_set_enabled (widget, "zoom.reset", scale != 1);
+ else
+ g_assert_not_reached ();
g_object_set (widget, "scale", scale, NULL);
}
g_object_class_install_property (object_class, PROP_SCALE,
g_param_spec_float ("scale", NULL, NULL,
- 0.0, 1024.0, 1.0,
+ 1./1024., 1024., 1.0,
G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_ANGLE,
g_object_set (demo, "angle", angle, NULL);
}
-static void
-scale_changed (GtkRange *range,
- GtkWidget *widget)
+static gboolean
+transform_to (GBinding *binding,
+ const GValue *src,
+ GValue *dest,
+ gpointer user_data)
{
- float scale;
+ double from;
+ float to;
+
+ from = g_value_get_double (src);
+ to = (float) pow (2., from);
+ g_value_set_float (dest, to);
+
+ return TRUE;
+}
+
+static gboolean
+transform_from (GBinding *binding,
+ const GValue *src,
+ GValue *dest,
+ gpointer user_data)
+{
+ float to;
+ double from;
+
+ to = g_value_get_float (src);
+ from = log2 (to);
+ g_value_set_double (dest, from);
- scale = (float) pow (2., gtk_range_get_value (range));
- g_object_set (widget, "scale", scale, NULL);
+ return TRUE;
}
GtkWidget *
g_signal_connect (button, "clicked", G_CALLBACK (rotate), widget);
gtk_box_append (GTK_BOX (box2), button);
- scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, -10, 10.0, 0.1);
+ scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, -10., 10., 0.1);
+ gtk_scale_add_mark (GTK_SCALE (scale), 0., GTK_POS_TOP, NULL);
gtk_widget_set_tooltip_text (scale, "Zoom");
- gtk_range_set_value (GTK_RANGE (scale), 1.0);
+ gtk_range_set_value (GTK_RANGE (scale), 0.);
gtk_widget_set_hexpand (scale, TRUE);
gtk_box_append (GTK_BOX (box2), scale);
g_object_bind_property (dropdown, "selected", widget, "filter", G_BINDING_DEFAULT);
- g_signal_connect (scale, "value-changed", G_CALLBACK (scale_changed), widget);
+ g_object_bind_property_full (gtk_range_get_adjustment (GTK_RANGE (scale)), "value",
+ widget, "scale",
+ G_BINDING_BIDIRECTIONAL,
+ transform_to,
+ transform_from,
+ NULL, NULL);
}
if (!gtk_widget_get_visible (window))