2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Contact: Michael Dominic Kostrzewa <michael.kostrzewa@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-number-editor
27 * @short_description: A widget used to enter a number within a pre-defined range
29 * HildonNumberEditor is used to enter a number from a specific range.
30 * There are two buttons to scroll the value in number field.
31 * Manual input is also possible.
38 #include "hildon-number-editor.h"
39 #include <gdk/gdkkeysyms.h>
44 #include "hildon-marshalers.h"
45 #include "hildon-private.h"
46 #include "hildon-input-mode-hint.h"
47 #include "hildon-defines.h"
48 #include "hildon-enum-types.h"
49 #include "hildon-banner.h"
51 #include "hildon-number-editor-private.h"
53 #define _(String) dgettext("hildon-libs", String)
55 /*Pixel spec defines*/
56 #define NUMBER_EDITOR_HEIGHT 30
58 /* Size of plus and minus buttons */
59 #define BUTTON_HEIGHT 30
61 #define BUTTON_WIDTH 30
64 hildon_number_editor_class_init (HildonNumberEditorClass *editor_class);
67 hildon_number_editor_init (HildonNumberEditor *editor);
70 hildon_number_editor_entry_focusout (GtkWidget *widget,
75 hildon_number_editor_entry_changed (GtkWidget *widget,
79 hildon_number_editor_size_request (GtkWidget *widget,
80 GtkRequisition *requisition);
83 set_widget_allocation (GtkWidget *widget,
85 const GtkAllocation *allocation);
88 hildon_number_editor_size_allocate (GtkWidget *widget,
89 GtkAllocation *allocation);
92 hildon_number_editor_entry_keypress (GtkWidget *widget,
97 hildon_number_editor_button_pressed (GtkWidget *widget,
98 GdkEventButton *event,
102 hildon_number_editor_entry_button_released (GtkWidget *widget,
103 GdkEventButton *event,
106 hildon_number_editor_button_released (GtkWidget *widget,
108 HildonNumberEditor *editor);
110 do_mouse_timeout (HildonNumberEditor *editor);
113 change_numbers (HildonNumberEditor *editor,
117 hildon_number_editor_forall (GtkContainer *container,
118 gboolean include_internals,
119 GtkCallback callback,
120 gpointer callback_data);
123 hildon_number_editor_destroy (GtkObject *self);
126 hildon_number_editor_start_timer (HildonNumberEditor *editor);
129 hildon_number_editor_finalize (GObject *self);
132 hildon_number_editor_range_error (HildonNumberEditor *editor,
133 HildonNumberEditorErrorType type);
136 hildon_number_editor_select_all (HildonNumberEditorPrivate *priv);
139 hildon_number_editor_validate_value (HildonNumberEditor *editor,
140 gboolean allow_intermediate);
143 hildon_number_editor_set_property (GObject * object,
145 const GValue * value,
149 hildon_number_editor_get_property (GObject *object,
165 static GtkContainerClass* parent_class;
167 static guint HildonNumberEditor_signal[LAST_SIGNAL] = {0};
170 * hildon_number_editor_get_type:
172 * Returns GType for HildonNumberEditor.
174 * Returns: HildonNumberEditor type
177 hildon_number_editor_get_type (void)
179 static GType editor_type = 0;
183 static const GTypeInfo editor_info =
185 sizeof (HildonNumberEditorClass),
186 NULL, /* base_init */
187 NULL, /* base_finalize */
188 (GClassInitFunc) hildon_number_editor_class_init,
189 NULL, /* class_finalize */
190 NULL, /* class_data */
191 sizeof (HildonNumberEditor),
193 (GInstanceInitFunc) hildon_number_editor_init,
195 editor_type = g_type_register_static (GTK_TYPE_CONTAINER,
196 "HildonNumberEditor",
203 hildon_number_editor_class_init (HildonNumberEditorClass *editor_class)
205 GtkContainerClass *container_class = GTK_CONTAINER_CLASS (editor_class);
206 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (editor_class);
207 GObjectClass *gobject_class = G_OBJECT_CLASS (editor_class);
209 g_type_class_add_private (editor_class,
210 sizeof (HildonNumberEditorPrivate));
212 parent_class = g_type_class_peek_parent (editor_class);
214 widget_class->size_request = hildon_number_editor_size_request;
215 widget_class->size_allocate = hildon_number_editor_size_allocate;
216 widget_class->focus = hildon_private_composite_focus;
218 editor_class->range_error = hildon_number_editor_range_error;
220 /* Because we derived our widget from GtkContainer, we should override
222 container_class->forall = hildon_number_editor_forall;
223 GTK_OBJECT_CLASS(editor_class)->destroy = hildon_number_editor_destroy;
224 gobject_class->finalize = hildon_number_editor_finalize;
225 gobject_class->set_property = hildon_number_editor_set_property;
226 gobject_class->get_property = hildon_number_editor_get_property;
229 * HildonNumberEditor:value:
231 * The current value of the number editor.
233 g_object_class_install_property (gobject_class, PROP_VALUE,
234 g_param_spec_int ("value",
236 "The current value of number editor",
239 0, G_PARAM_READWRITE));
241 HildonNumberEditor_signal[RANGE_ERROR] =
242 g_signal_new ("range_error", HILDON_TYPE_NUMBER_EDITOR,
243 G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET
244 (HildonNumberEditorClass, range_error),
245 g_signal_accumulator_true_handled, NULL,
246 _hildon_marshal_BOOLEAN__ENUM,
247 G_TYPE_BOOLEAN, 1, HILDON_TYPE_NUMBER_EDITOR_ERROR_TYPE);
251 hildon_number_editor_forall (GtkContainer *container,
252 gboolean include_internals,
253 GtkCallback callback,
254 gpointer callback_data)
256 HildonNumberEditorPrivate *priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (container);
258 g_assert (callback != NULL);
261 if (! include_internals)
264 /* Enumerate child widgets */
265 (*callback) (priv->minus, callback_data);
266 (*callback) (priv->num_entry, callback_data);
267 (*callback) (priv->plus, callback_data);
271 hildon_number_editor_destroy (GtkObject *self)
273 HildonNumberEditorPrivate *priv;
275 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (self);
278 /* Free child widgets */
281 gtk_widget_unparent (priv->minus);
286 gtk_widget_unparent (priv->num_entry);
287 priv->num_entry = NULL;
291 gtk_widget_unparent (priv->plus);
295 if (GTK_OBJECT_CLASS (parent_class)->destroy)
296 GTK_OBJECT_CLASS (parent_class)->destroy(self);
300 hildon_number_editor_stop_repeat_timer (HildonNumberEditorPrivate *priv)
302 g_assert (priv != NULL);
304 if (priv->button_event_id)
306 g_source_remove (priv->button_event_id);
307 priv->button_event_id = 0;
312 hildon_number_editor_finalize (GObject *self)
314 HildonNumberEditorPrivate *priv;
316 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (self);
320 hildon_number_editor_stop_repeat_timer (priv);
322 if (priv->select_all_idle_id)
323 g_source_remove (priv->select_all_idle_id);
325 /* Call parent class finalize, if have one */
326 if (G_OBJECT_CLASS (parent_class)->finalize)
327 G_OBJECT_CLASS (parent_class)->finalize(self);
331 hildon_number_editor_init (HildonNumberEditor *editor)
333 HildonNumberEditorPrivate *priv;
335 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
338 GTK_WIDGET_SET_FLAGS (GTK_WIDGET (editor), GTK_NO_WINDOW);
340 /* Create child widgets */
341 priv->num_entry = gtk_entry_new ();
342 priv->minus = gtk_button_new ();
343 priv->plus = gtk_button_new ();
345 gtk_widget_set_name (priv->minus, "ne-minus-button");
346 gtk_widget_set_name (priv->plus, "ne-plus-button" );
347 gtk_widget_set_size_request (priv->minus, BUTTON_WIDTH, BUTTON_HEIGHT);
348 gtk_widget_set_size_request (priv->plus, BUTTON_WIDTH, BUTTON_HEIGHT);
349 gtk_entry_set_alignment (GTK_ENTRY(priv->num_entry), 1);
351 GTK_WIDGET_UNSET_FLAGS (priv->minus, GTK_CAN_FOCUS);
352 GTK_WIDGET_UNSET_FLAGS (priv->plus, GTK_CAN_FOCUS);
354 priv->button_event_id = 0;
355 priv->select_all_idle_id = 0;
357 gtk_widget_set_parent (priv->minus, GTK_WIDGET (editor));
358 gtk_widget_set_parent (priv->num_entry, GTK_WIDGET (editor));
359 gtk_widget_set_parent (priv->plus, GTK_WIDGET (editor));
361 /* Connect child widget signals */
362 g_signal_connect (GTK_OBJECT (priv->num_entry), "changed",
363 G_CALLBACK (hildon_number_editor_entry_changed),
366 g_signal_connect (GTK_OBJECT (priv->num_entry), "focus-out-event",
367 G_CALLBACK (hildon_number_editor_entry_focusout),
370 g_signal_connect (GTK_OBJECT (priv->num_entry), "key-press-event",
371 G_CALLBACK (hildon_number_editor_entry_keypress),
374 g_signal_connect (GTK_OBJECT (priv->num_entry), "button-release-event",
375 G_CALLBACK (hildon_number_editor_entry_button_released),
378 g_signal_connect (GTK_OBJECT (priv->minus), "button-press-event",
379 G_CALLBACK (hildon_number_editor_button_pressed),
382 g_signal_connect (GTK_OBJECT (priv->plus), "button-press-event",
383 G_CALLBACK (hildon_number_editor_button_pressed),
386 g_signal_connect (GTK_OBJECT (priv->minus), "button-release-event",
387 G_CALLBACK (hildon_number_editor_button_released),
390 g_signal_connect (GTK_OBJECT (priv->plus), "button-release-event",
391 G_CALLBACK (hildon_number_editor_button_released),
394 g_signal_connect (GTK_OBJECT (priv->minus), "leave-notify-event",
395 G_CALLBACK(hildon_number_editor_button_released),
398 g_signal_connect (GTK_OBJECT (priv->plus), "leave-notify-event",
399 G_CALLBACK (hildon_number_editor_button_released),
402 g_object_set (G_OBJECT (priv->num_entry),
403 "input-mode", HILDON_INPUT_MODE_HINT_NUMERIC, NULL);
405 gtk_widget_show (priv->num_entry);
406 gtk_widget_show (priv->minus);
407 gtk_widget_show (priv->plus);
409 hildon_number_editor_set_range (editor, G_MININT, G_MAXINT);
413 hildon_number_editor_entry_button_released (GtkWidget *widget,
414 GdkEventButton *event,
417 gtk_editable_select_region (GTK_EDITABLE (widget), 0, -1);
422 hildon_number_editor_button_released (GtkWidget *widget,
424 HildonNumberEditor *editor)
426 HildonNumberEditorPrivate *priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
429 hildon_number_editor_stop_repeat_timer (priv);
433 /* Format given number to editor field, no checks performed, all signals
434 are sent normally. */
436 hildon_number_editor_real_set_value (HildonNumberEditorPrivate *priv,
439 /* FIXME: That looks REALLY bad */
442 /* Update text in entry to new value */
443 g_snprintf (buffer, sizeof (buffer), "%d", value);
444 gtk_entry_set_text (GTK_ENTRY (priv->num_entry), buffer);
448 hildon_number_editor_button_pressed (GtkWidget *widget,
449 GdkEventButton *event,
452 /* FIXME: XXX Why aren't we using hildon_number_editor_start_timer here? XXX */
453 /* Need to fetch current value from entry and increment or decrement
456 HildonNumberEditor *editor;
457 HildonNumberEditorPrivate *priv;
458 GtkSettings *settings;
461 g_assert (HILDON_IS_NUMBER_EDITOR (data));
463 editor = HILDON_NUMBER_EDITOR (data);
464 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
467 settings = gtk_settings_get_default ();
468 g_object_get (settings, "gtk-timeout-initial", &timeout, NULL);
470 /* Save type of button pressed */
471 if (GTK_BUTTON (widget) == GTK_BUTTON (priv->plus))
472 priv->button_type = 1;
474 priv->button_type = -1;
476 /* Start repetition timer */
477 if (! priv->button_event_id)
479 change_numbers (editor, priv->button_type);
480 priv->button_event_id = g_timeout_add (timeout,
481 (GSourceFunc) hildon_number_editor_start_timer,
489 hildon_number_editor_start_timer (HildonNumberEditor *editor)
491 HildonNumberEditorPrivate *priv;
492 GtkSettings *settings;
495 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
496 settings = gtk_settings_get_default ();
497 g_object_get (settings, "gtk-timeout-update", &timeout, NULL);
499 priv->button_event_id = g_timeout_add (timeout,
500 (GSourceFunc) do_mouse_timeout,
507 do_mouse_timeout (HildonNumberEditor *editor)
509 HildonNumberEditorPrivate *priv;
510 g_assert (HILDON_IS_NUMBER_EDITOR (editor));
512 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
515 GDK_THREADS_ENTER ();
517 /* Update value based on button held */
518 change_numbers (editor, priv->button_type);
520 GDK_THREADS_LEAVE ();
525 /* Changes the current number value by the amount of update
526 and verifies the result. */
528 change_numbers (HildonNumberEditor *editor,
531 HildonNumberEditorPrivate *priv;
534 g_assert (HILDON_IS_NUMBER_EDITOR (editor));
536 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
539 current_value = hildon_number_editor_get_value (editor);
541 /* We need to rerun validation by hand, since validation
542 done in "changed" callback allows intermediate values */
543 hildon_number_editor_real_set_value (priv, current_value + update);
544 hildon_number_editor_validate_value (editor, FALSE);
545 g_object_notify (G_OBJECT (editor), "value");
549 add_select_all_idle (HildonNumberEditorPrivate *priv)
553 if (! priv->select_all_idle_id)
555 priv->select_all_idle_id =
556 g_idle_add((GSourceFunc) hildon_number_editor_select_all, priv);
561 hildon_number_editor_validate_value (HildonNumberEditor *editor,
562 gboolean allow_intermediate)
564 HildonNumberEditorPrivate *priv;
565 gint error_code, fixup_value;
571 g_assert (HILDON_IS_NUMBER_EDITOR(editor));
573 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
576 text = gtk_entry_get_text (GTK_ENTRY (priv->num_entry));
578 fixup_value = priv->default_val;
582 /* Try to convert entry text to number */
583 value = strtol (text, &tail, 10);
585 /* Check if conversion succeeded */
588 /* Check if value is in allowed range. This is tricky in those
589 cases when user is editing a value.
590 For example: Range = [100, 500] and user have just inputted "4".
591 This should not lead into error message. Otherwise value is
592 resetted back to "100" and next "4" press will reset it back
594 if (allow_intermediate)
596 /* We now have the following error cases:
597 * If inputted value as above maximum and
598 maximum is either positive or then maximum
599 negative and value is positive.
600 * If inputted value is below minimum and minimum
601 is negative or minumum positive and value
603 In all other cases situation can be fixed just by
604 adding new numbers to the string.
606 if (value > priv->end && (priv->end >= 0 || (priv->end < 0 && value >= 0)))
608 error_code = MAXIMUM_VALUE_EXCEED;
609 fixup_value = priv->end;
611 else if (value < priv->start && (priv->start < 0 || (priv->start >= 0 && value <= 0)))
613 error_code = MINIMUM_VALUE_EXCEED;
614 fixup_value = priv->start;
619 if (value > priv->end) {
620 error_code = MAXIMUM_VALUE_EXCEED;
621 fixup_value = priv->end;
623 else if (value < priv->start) {
624 error_code = MINIMUM_VALUE_EXCEED;
625 fixup_value = priv->start;
629 /* The only valid case when conversion can fail is when we
630 have plain '-', intermediate forms are allowed AND
631 minimum bound is negative */
632 else if (! allow_intermediate || strcmp (text, "-") != 0 || priv->start >= 0)
633 error_code = ERRONEOUS_VALUE;
635 else if (! allow_intermediate)
636 error_code = ERRONEOUS_VALUE;
638 if (error_code != -1)
640 /* If entry is empty and intermediate forms are nor allowed,
642 /* Change to default value */
643 hildon_number_editor_set_value (editor, fixup_value);
644 g_signal_emit (editor, HildonNumberEditor_signal[RANGE_ERROR], 0, error_code, &r);
645 add_select_all_idle (priv);
650 hildon_number_editor_entry_changed (GtkWidget *widget,
653 g_assert (HILDON_IS_NUMBER_EDITOR (data));
654 hildon_number_editor_validate_value (HILDON_NUMBER_EDITOR (data), TRUE);
655 g_object_notify (G_OBJECT (data), "value");
659 hildon_number_editor_size_request (GtkWidget *widget,
660 GtkRequisition *requisition)
662 HildonNumberEditor *editor;
663 HildonNumberEditorPrivate *priv;
666 editor = HILDON_NUMBER_EDITOR (widget);
667 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
670 /* Requested size is size of all child widgets plus border space */
671 gtk_widget_size_request (priv->minus, &req);
672 requisition->width = req.width;
674 gtk_widget_size_request (priv->num_entry, &req);
675 requisition->width += req.width;
677 gtk_widget_size_request (priv->plus, &req);
678 requisition->width += req.width;
680 requisition->width += HILDON_MARGIN_DEFAULT * 2;
682 /* FIXME: XXX Height is fixed */
683 requisition->height = NUMBER_EDITOR_HEIGHT;
686 /* Update alloc->width so widget fits, update alloc->x to point to free space */
688 set_widget_allocation (GtkWidget *widget,
689 GtkAllocation *alloc,
690 const GtkAllocation *allocation)
692 GtkRequisition child_requisition;
694 gtk_widget_get_child_requisition (widget, &child_requisition);
696 /* Fit to widget width */
697 if (allocation->width + allocation->x > alloc->x + child_requisition.width)
698 alloc->width = child_requisition.width;
701 alloc->width = allocation->width - (alloc->x - allocation->x);
702 if (alloc->width < 0)
706 gtk_widget_size_allocate (widget, alloc);
707 /* Update x position */
708 alloc->x += alloc->width;
712 hildon_number_editor_size_allocate (GtkWidget *widget,
713 GtkAllocation *allocation)
715 HildonNumberEditor *editor;
716 HildonNumberEditorPrivate *priv;
719 editor = HILDON_NUMBER_EDITOR (widget);
720 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
723 widget->allocation = *allocation;
725 /* Add upper border */
726 alloc.y = widget->allocation.y + widget->style->ythickness;
729 if (widget->allocation.height > NUMBER_EDITOR_HEIGHT)
731 alloc.height = NUMBER_EDITOR_HEIGHT - widget->style->ythickness * 2;
732 alloc.y += (widget->allocation.height - NUMBER_EDITOR_HEIGHT) / 2;
735 alloc.height = widget->allocation.height - widget->style->ythickness * 2;
737 if (alloc.height < 0)
740 /* Add left border */
741 alloc.x = allocation->x + widget->style->xthickness;
743 /* Allocate positions for widgets (left-to-right) */
744 set_widget_allocation(priv->minus, &alloc, &widget->allocation);
745 alloc.x += HILDON_MARGIN_DEFAULT;
747 set_widget_allocation(priv->num_entry, &alloc, &widget->allocation);
748 alloc.x += HILDON_MARGIN_DEFAULT;
750 set_widget_allocation(priv->plus, &alloc, &widget->allocation);
754 hildon_number_editor_entry_focusout (GtkWidget *widget,
755 GdkEventFocus *event,
758 g_assert (HILDON_IS_NUMBER_EDITOR(data));
760 hildon_number_editor_validate_value (HILDON_NUMBER_EDITOR(data), FALSE);
765 hildon_number_editor_entry_keypress (GtkWidget *widget,
769 GtkEditable *editable;
772 g_assert (HILDON_IS_NUMBER_EDITOR (data));
774 editable = GTK_EDITABLE (widget);
775 cursor_pos = gtk_editable_get_position (editable);
777 switch (event->keyval)
780 /* If the cursor is on the left, try to decrement */
781 if (cursor_pos == 0) {
782 change_numbers (HILDON_NUMBER_EDITOR (data), -1);
788 /* If the cursor is on the right, try to increment */
789 if (cursor_pos >= g_utf8_strlen(gtk_entry_get_text (GTK_ENTRY (widget)), -1))
791 change_numbers (HILDON_NUMBER_EDITOR (data), 1);
792 gtk_editable_set_position(editable, cursor_pos);
805 hildon_number_editor_range_error (HildonNumberEditor *editor,
806 HildonNumberEditorErrorType type)
810 gchar *err_msg = NULL;
811 HildonNumberEditorPrivate *priv;
813 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
819 /* Construct error message */
822 case MAXIMUM_VALUE_EXCEED:
823 err_msg = g_strdup_printf (_("ckct_ib_maximum_value"), max, max);
826 case MINIMUM_VALUE_EXCEED:
827 err_msg = g_strdup_printf (_("ckct_ib_minimum_value"), min, min);
830 case ERRONEOUS_VALUE:
832 g_strdup_printf (_("ckct_ib_set_a_value_within_range"), min, max);
836 /* Infoprint error */
839 hildon_banner_show_information (GTK_WIDGET (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET(editor),
840 GTK_TYPE_WINDOW))), NULL, err_msg);
848 * hildon_number_editor_new:
849 * @min: minimum accepted value
850 * @max: maximum accepted value
852 * Creates new number editor
854 * Returns: a new #HildonNumberEditor widget
857 hildon_number_editor_new (gint min,
860 HildonNumberEditor *editor = g_object_new (HILDON_TYPE_NUMBER_EDITOR, NULL);
862 /* Set user inputted range to editor */
863 hildon_number_editor_set_range (editor, min, max);
865 return GTK_WIDGET (editor);
869 * hildon_number_editor_set_range:
870 * @editor: a #HildonNumberEditor widget
871 * @min: minimum accepted value
872 * @max: maximum accepted value
874 * Sets accepted number range for editor
877 hildon_number_editor_set_range (HildonNumberEditor *editor,
881 HildonNumberEditorPrivate *priv;
882 gchar buffer_min[32], buffer_max[32];
885 g_return_if_fail (HILDON_IS_NUMBER_EDITOR (editor));
887 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
890 /* Set preferences */
891 priv->start = MIN (min, max);
892 priv->end = MAX (min, max);
894 /* Find maximum allowed length of value */
895 g_snprintf (buffer_min, sizeof (buffer_min), "%d", min);
896 g_snprintf (buffer_max, sizeof (buffer_max), "%d", max);
897 a = strlen (buffer_min);
898 b = strlen (buffer_max);
900 /* Set maximum size of entry */
901 gtk_entry_set_width_chars (GTK_ENTRY (priv->num_entry), MAX (a, b));
902 hildon_number_editor_set_value (editor, priv->start);
906 * hildon_number_editor_get_value:
907 * @editor: pointer to #HildonNumberEditor
909 * Returns: current NumberEditor value
912 hildon_number_editor_get_value (HildonNumberEditor *editor)
914 HildonNumberEditorPrivate *priv;
916 g_return_val_if_fail (HILDON_IS_NUMBER_EDITOR (editor), 0);
918 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
921 return atoi (gtk_entry_get_text (GTK_ENTRY (priv->num_entry)));
925 * hildon_number_editor_set_value:
926 * @editor: pointer to #HildonNumberEditor
927 * @value: numeric value for number editor
929 * Sets numeric value for number editor
932 hildon_number_editor_set_value (HildonNumberEditor *editor,
935 HildonNumberEditorPrivate *priv;
937 g_return_if_fail (HILDON_IS_NUMBER_EDITOR (editor));
939 priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
942 g_return_if_fail (value <= priv->end);
943 g_return_if_fail (value >= priv->start);
945 priv->default_val = value;
946 hildon_number_editor_real_set_value (priv, value);
947 g_object_notify (G_OBJECT(editor), "value");
950 /* When calling gtk_entry_set_text, the entry widget does things that can
951 * cause the whole widget to redraw. This redrawing is delayed and if any
952 * selections are made right after calling the gtk_entry_set_text the
953 * setting of the selection might seem to have no effect.
955 * If the selection is delayed with a lower priority than the redrawing,
956 * the selection should stick. Calling this function with g_idle_add should
960 hildon_number_editor_select_all (HildonNumberEditorPrivate *priv)
962 GDK_THREADS_ENTER ();
963 gtk_editable_select_region (GTK_EDITABLE (priv->num_entry), 0, -1);
964 priv->select_all_idle_id = 0;
965 GDK_THREADS_LEAVE ();
970 hildon_number_editor_set_property (GObject *object,
975 HildonNumberEditor *editor;
977 editor = HILDON_NUMBER_EDITOR (object);
982 hildon_number_editor_set_value (editor, g_value_get_int (value));
986 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
992 hildon_number_editor_get_property (GObject *object,
997 HildonNumberEditor *editor;
999 editor = HILDON_NUMBER_EDITOR (object);
1004 g_value_set_int(value, hildon_number_editor_get_value (editor));
1008 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);