diff options
Diffstat (limited to 'src/idoscalemenuitem.c')
-rw-r--r-- | src/idoscalemenuitem.c | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/src/idoscalemenuitem.c b/src/idoscalemenuitem.c index 7baac17..50c323a 100644 --- a/src/idoscalemenuitem.c +++ b/src/idoscalemenuitem.c @@ -1,5 +1,6 @@ /* * Copyright 2010 Canonical, Ltd. + * Copyright 2021-2024 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of either or both of the following licenses: @@ -21,9 +22,11 @@ * * Authors: * Cody Russell <crussell@canonical.com> + * Robert Tari <robert@tari.in> */ #include <gtk/gtk.h> +#include <math.h> #include "idorange.h" #include "idoscalemenuitem.h" #include "idotypebuiltins.h" @@ -75,6 +78,7 @@ typedef struct { IdoRangeStyle range_style; gboolean ignore_value_changed; gboolean has_focus; + gboolean bCloseOnChange; } IdoScaleMenuItemPrivate; enum { @@ -140,8 +144,16 @@ ido_scale_menu_item_scale_value_changed (GtkRange *range, /* The signal is not sent when it was set through * ido_scale_menu_item_set_value(). */ - if (!priv->ignore_value_changed) - g_signal_emit (self, signals[VALUE_CHANGED], 0, gtk_range_get_value (range)); + if (!priv->ignore_value_changed) + { + g_signal_emit (self, signals[VALUE_CHANGED], 0, gtk_range_get_value (range)); + + if (priv->bCloseOnChange) + { + GtkWidget *pParent = gtk_widget_get_parent (GTK_WIDGET (self)); + gtk_menu_shell_deactivate (GTK_MENU_SHELL (pParent)); + } + } } static void @@ -166,7 +178,6 @@ ido_scale_menu_item_constructed (GObject *object) gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_widget_set_margin_end(hbox, 16); priv->primary_image = gtk_image_new (); g_signal_connect (priv->primary_image, "notify", @@ -365,7 +376,7 @@ static void ido_scale_menu_item_init (IdoScaleMenuItem *self) { IdoScaleMenuItemPrivate *priv = ido_scale_menu_item_get_instance_private (self); - + priv->bCloseOnChange = FALSE; priv->reverse_scroll = TRUE; gtk_widget_set_size_request (GTK_WIDGET (self), 200, -1); @@ -473,8 +484,6 @@ ido_scale_menu_item_select (GtkMenuItem *item) priv->has_focus = TRUE; gtk_widget_set_state_flags (priv->scale, GTK_STATE_FLAG_FOCUSED, FALSE); - - GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->select (item); } static void @@ -485,8 +494,6 @@ ido_scale_menu_item_deselect (GtkMenuItem *item) priv->has_focus = FALSE; gtk_widget_unset_state_flags (priv->scale, GTK_STATE_FLAG_FOCUSED); - - GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->deselect (item); } static gboolean @@ -700,7 +707,7 @@ ido_scale_menu_item_new_with_range (const gchar *label, gdouble max, gdouble step) { - GObject *adjustment = G_OBJECT (gtk_adjustment_new (value, min, max, step, 10 * step, 0)); + GObject *adjustment = G_OBJECT (gtk_adjustment_new (value, min, max, step, step, 0)); return GTK_WIDGET (g_object_new (IDO_TYPE_SCALE_MENU_ITEM, "label", label, @@ -1047,6 +1054,13 @@ menu_item_get_icon (GMenuItem *menuitem, return value ? g_icon_deserialize (value) : NULL; } +static gchar* onFormatValue (GtkScale *pScale, gdouble fValue) +{ + gint nValue = fValue * 100; + gchar *sValue = g_strdup_printf ("%i%%", nValue); + + return sValue; +} /** * ido_scale_menu_item_new_from_model: * @@ -1088,6 +1102,32 @@ ido_scale_menu_item_new_from_model (GMenuItem *menuitem, g_free (action); } + IdoScaleMenuItemPrivate *pPrivate = ido_scale_menu_item_get_instance_private (IDO_SCALE_MENU_ITEM (item)); + guchar nDigits = 0; + gboolean bFound = g_menu_item_get_attribute (menuitem, "digits", "y", &nDigits); + + if (bFound) + { + gtk_scale_set_digits (GTK_SCALE (pPrivate->scale), nDigits); + gtk_range_set_round_digits (GTK_RANGE (pPrivate->scale), nDigits); + } + + gboolean bMarks = FALSE; + bFound = g_menu_item_get_attribute (menuitem, "marks", "b", &bMarks); + + if (bFound) + { + gtk_scale_set_draw_value (GTK_SCALE (pPrivate->scale), TRUE); + + for (gdouble fValue = min; fValue < (max + step); fValue += step) + { + gtk_scale_add_mark (GTK_SCALE (pPrivate->scale), round (fValue * 10) / 10, GTK_POS_BOTTOM, NULL); + } + + g_signal_connect (pPrivate->scale, "format-value", G_CALLBACK (onFormatValue), NULL); + } + + g_menu_item_get_attribute (menuitem, "close-on-change", "b", &pPrivate->bCloseOnChange); min_icon = menu_item_get_icon (menuitem, "min-icon"); max_icon = menu_item_get_icon (menuitem, "max-icon"); ido_scale_menu_item_set_icons (IDO_SCALE_MENU_ITEM (item), min_icon, max_icon); |