2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Contact: Rodrigo Novo <rodrigo.novo@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
11 * the License, or (at your option) any later version.
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-range-editor
27 * @short_description: A widget is used to ask bounds of a range.
29 * HidlonRangeEditor allows entering a pair of integers, e.g. the lower
30 * and higher bounds of a range. A minimum and maximum can also be set
35 * range_editor = hildon_range_editor_new ();
36 * hildon_range_editor_set_limits (editor, start, end );
37 * hildon_range_editor_get_range (editor, &start, &end);
42 #undef HILDON_DISABLE_DEPRECATED
51 #include <glib/gprintf.h>
52 #include <gdk/gdkkeysyms.h>
54 #include "hildon-range-editor.h"
55 #include "hildon-banner.h"
56 #include "hildon-range-editor-private.h"
59 dgettext("hildon-libs", string)
61 /* Alignment in entry box ( 0 = left, 1 = right ) */
63 #define DEFAULT_ALIGNMENT 1
65 /* Amount of padding to add to each side of the separator */
67 #define DEFAULT_PADDING 3
69 #define DEFAULT_START -999
71 #define DEFAULT_END 999
73 #define DEFAULT_LENGTH 4
75 static GtkContainerClass *parent_class = NULL;
78 hildon_range_editor_class_init (HildonRangeEditorClass *editor_class);
81 hildon_range_editor_init (HildonRangeEditor *editor);
84 hildon_range_editor_forall (GtkContainer *container,
85 gboolean include_internals,
87 gpointer callback_data);
90 hildon_range_editor_destroy (GtkObject *self);
93 hildon_range_editor_size_request (GtkWidget *widget,
94 GtkRequisition *requisition);
97 hildon_range_editor_size_allocate (GtkWidget *widget,
98 GtkAllocation *allocation);
101 hildon_range_editor_entry_focus_in (GtkEditable *editable,
102 GdkEventFocus *event,
103 HildonRangeEditor *editor);
106 hildon_range_editor_entry_focus_out (GtkEditable *editable,
107 GdkEventFocus *event,
108 HildonRangeEditor *editor);
111 hildon_range_editor_entry_keypress (GtkWidget *widget,
113 HildonRangeEditor *editor);
116 hildon_range_editor_released (GtkEditable *editable,
117 GdkEventButton *event,
118 HildonRangeEditor *editor);
121 hildon_range_editor_press (GtkEditable *editable,
122 GdkEventButton *event,
123 HildonRangeEditor *editor);
126 hildon_range_editor_set_property (GObject *object,
132 hildon_range_editor_get_property (GObject *object,
138 hildon_range_editor_entry_changed (GtkWidget *widget,
139 HildonRangeEditor *editor);
152 hildon_range_editor_class_init (HildonRangeEditorClass *editor_class)
154 GObjectClass *gobject_class = G_OBJECT_CLASS (editor_class);
155 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (editor_class);
156 GtkContainerClass *container_class = GTK_CONTAINER_CLASS (editor_class);
158 parent_class = g_type_class_peek_parent (editor_class);
160 g_type_class_add_private (editor_class, sizeof (HildonRangeEditorPrivate));
162 gobject_class->set_property = hildon_range_editor_set_property;
163 gobject_class->get_property = hildon_range_editor_get_property;
164 widget_class->size_request = hildon_range_editor_size_request;
165 widget_class->size_allocate = hildon_range_editor_size_allocate;
167 container_class->forall = hildon_range_editor_forall;
168 GTK_OBJECT_CLASS (editor_class)->destroy = hildon_range_editor_destroy;
170 gtk_widget_class_install_style_property (widget_class,
171 g_param_spec_int ("hildon_range_editor_entry_alignment",
172 "Hildon RangeEditor entry alignment",
173 "Hildon RangeEditor entry alignment", 0, 1,
177 gtk_widget_class_install_style_property (widget_class,
178 g_param_spec_int ("hildon_range_editor_separator_padding",
179 "Hildon RangeEditor separator padding",
180 "Hildon RangeEditor separaror padding",
186 * HildonRangeEditor:min:
188 * Minimum value in a range.
191 g_object_class_install_property (gobject_class, PROP_MIN,
192 g_param_spec_int ("min",
194 "Minimum value in a range",
196 DEFAULT_START, G_PARAM_CONSTRUCT |
197 G_PARAM_READABLE | G_PARAM_WRITABLE));
200 * HildonRangeEditor:max:
202 * Maximum value in a range.
205 g_object_class_install_property (gobject_class, PROP_MAX,
206 g_param_spec_int ("max",
208 "Maximum value in a range",
210 DEFAULT_END, G_PARAM_CONSTRUCT |
211 G_PARAM_READABLE | G_PARAM_WRITABLE));
214 * HildonRangeEditor:lower:
216 * Current value in the entry presenting lower end of selected range.
219 g_object_class_install_property (gobject_class, PROP_LOWER,
220 g_param_spec_int ("lower",
221 "Current lower value",
222 "Current value in the entry presenting lower end of selected range",
224 DEFAULT_START, G_PARAM_CONSTRUCT |
225 G_PARAM_READABLE | G_PARAM_WRITABLE));
228 * HildonRangeEditor:higher:
230 * Current value in the entry presenting higher end of selected range.
233 g_object_class_install_property (gobject_class, PROP_HIGHER,
234 g_param_spec_int ("higher",
235 "Current higher value",
236 "Current value in the entry presenting higher end of selected range",
238 DEFAULT_END, G_PARAM_CONSTRUCT |
239 G_PARAM_READABLE | G_PARAM_WRITABLE));
242 * HildonRangeEditor:separator:
244 * Separator string to separate range editor entries.
247 g_object_class_install_property (gobject_class, PROP_SEPARATOR,
248 g_param_spec_string ("separator",
250 "Separator string to separate entries",
251 _("ckct_wi_range_separator"),
253 G_PARAM_READABLE | G_PARAM_WRITABLE));
257 hildon_range_editor_init (HildonRangeEditor *editor)
259 HildonRangeEditorPrivate *priv;
261 gint range_editor_entry_alignment;
262 gint range_editor_separator_padding;
264 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
267 GTK_WIDGET_SET_FLAGS (editor, GTK_NO_WINDOW);
269 gtk_widget_push_composite_child ();
271 priv->start_entry = gtk_entry_new ();
272 priv->end_entry = gtk_entry_new ();
273 priv->label = gtk_label_new (_("ckct_wi_range_separator"));
276 /* Get values from gtkrc (or use defaults) */
277 /* FIXME: This is broken, styles are not yet attached */
278 gtk_widget_style_get (GTK_WIDGET (editor),
279 "hildon_range_editor_entry_alignment",
280 &range_editor_entry_alignment,
281 "hildon_range_editor_separator_padding",
282 &range_editor_separator_padding, NULL);
284 /* Add padding to separator */
285 gtk_misc_set_padding (GTK_MISC (priv->label),
286 range_editor_separator_padding, 0);
288 /* Align the text to right in entry box */
289 gtk_entry_set_alignment (GTK_ENTRY (priv->start_entry),
290 range_editor_entry_alignment);
291 gtk_entry_set_alignment (GTK_ENTRY (priv->end_entry),
292 range_editor_entry_alignment);
294 gtk_widget_set_composite_name (priv->start_entry, "start_entry");
295 gtk_widget_set_composite_name (priv->end_entry, "end_entry");
296 gtk_widget_set_composite_name (priv->label, "separator_label");
297 gtk_widget_set_parent (priv->start_entry, GTK_WIDGET (editor));
298 gtk_widget_set_parent (priv->end_entry, GTK_WIDGET (editor));
299 gtk_widget_set_parent (priv->label, GTK_WIDGET (editor));
301 g_signal_connect (G_OBJECT (priv->start_entry), "button-release-event",
302 G_CALLBACK (hildon_range_editor_released), editor);
303 g_signal_connect (G_OBJECT (priv->end_entry), "button-release-event",
304 G_CALLBACK (hildon_range_editor_released), editor);
306 g_signal_connect (G_OBJECT (priv->start_entry), "button-press-event",
307 G_CALLBACK (hildon_range_editor_press), editor);
308 g_signal_connect (G_OBJECT (priv->end_entry), "button-press-event",
309 G_CALLBACK (hildon_range_editor_press), editor);
311 g_signal_connect (G_OBJECT (priv->start_entry), "key-press-event",
312 G_CALLBACK (hildon_range_editor_entry_keypress), editor);
313 g_signal_connect (G_OBJECT (priv->end_entry), "key-press-event",
314 G_CALLBACK (hildon_range_editor_entry_keypress), editor);
316 g_signal_connect (G_OBJECT (priv->start_entry), "focus-in-event",
317 G_CALLBACK (hildon_range_editor_entry_focus_in), editor);
318 g_signal_connect (G_OBJECT (priv->end_entry), "focus-in-event",
319 G_CALLBACK (hildon_range_editor_entry_focus_in), editor);
321 g_signal_connect (G_OBJECT (priv->start_entry), "focus-out-event",
322 G_CALLBACK (hildon_range_editor_entry_focus_out), editor);
323 g_signal_connect (G_OBJECT (priv->end_entry), "focus-out-event",
324 G_CALLBACK (hildon_range_editor_entry_focus_out), editor);
325 g_signal_connect (priv->start_entry, "changed",
326 G_CALLBACK (hildon_range_editor_entry_changed), editor);
327 g_signal_connect (priv->end_entry, "changed",
328 G_CALLBACK (hildon_range_editor_entry_changed), editor);
331 g_object_set (G_OBJECT (priv->start_entry),
332 "hildon-input-mode", HILDON_GTK_INPUT_MODE_NUMERIC, NULL);
334 g_object_set( G_OBJECT (priv->end_entry),
335 "hildon-input-mode", HILDON_GTK_INPUT_MODE_NUMERIC, NULL);
338 gtk_widget_show (priv->start_entry);
339 gtk_widget_show (priv->end_entry);
340 gtk_widget_show (priv->label);
342 gtk_widget_pop_composite_child();
346 hildon_range_editor_set_property (GObject *object,
351 HildonRangeEditor *editor = HILDON_RANGE_EDITOR(object);
356 hildon_range_editor_set_lower (editor, g_value_get_int (value));
360 hildon_range_editor_set_higher (editor, g_value_get_int (value));
364 hildon_range_editor_set_min (editor, g_value_get_int (value));
368 hildon_range_editor_set_max (editor, g_value_get_int (value));
372 hildon_range_editor_set_separator (editor,
373 g_value_get_string (value));
377 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
383 hildon_range_editor_get_property (GObject *object,
388 HildonRangeEditor *editor = HILDON_RANGE_EDITOR(object);
393 g_value_set_int (value, hildon_range_editor_get_lower (editor));
397 g_value_set_int (value, hildon_range_editor_get_higher (editor));
401 g_value_set_int (value, hildon_range_editor_get_min (editor));
405 g_value_set_int (value, hildon_range_editor_get_max (editor));
409 g_value_set_string (value, hildon_range_editor_get_separator (editor));
413 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
419 hildon_range_editor_entry_validate (HildonRangeEditor *editor,
420 GtkWidget *edited_entry,
421 gboolean allow_intermediate)
423 HildonRangeEditorPrivate *priv;
426 gint min, max, fixup;
429 gboolean error = FALSE;
431 g_assert(HILDON_IS_RANGE_EDITOR(editor));
432 g_assert(GTK_IS_ENTRY(edited_entry));
434 priv = HILDON_RANGE_EDITOR_GET_PRIVATE(editor);
437 /* Find the valid range for the modified component */
438 if (edited_entry == priv->start_entry) {
439 min = hildon_range_editor_get_min (editor);
440 max = hildon_range_editor_get_higher (editor);
442 min = hildon_range_editor_get_lower (editor);
443 max = hildon_range_editor_get_max (editor);
446 text = gtk_entry_get_text (GTK_ENTRY (edited_entry));
448 if (text && text [0])
450 /* Try to convert entry text to number */
451 value = strtol(text, &tail, 10);
453 /* Check if conversion succeeded */
456 /* Check if value is in allowed range. This is tricky in those
457 cases when user is editing a value.
458 For example: Range = [100, 500] and user have just inputted "4".
459 This should not lead into error message. Otherwise value is
460 resetted back to "100" and next "4" press will reset it back
462 if (allow_intermediate)
464 /* We now have the following error cases:
465 * If inputted value as above maximum and
466 maximum is either positive or then maximum
467 negative and value is positive.
468 * If inputted value is below minimum and minimum
469 is negative or minumum positive and value
471 In all other cases situation can be fixed just by
472 adding new numbers to the string.
474 if (value > max && (max >= 0 || (max < 0 && value >= 0)))
478 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_maximum_value"), max);
480 else if (value < min && (min < 0 || (min >= 0 && value < 0)))
484 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_minimum_value"), min);
492 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_maximum_value"), max);
494 else if (value < min) {
497 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_minimum_value"), min);
502 if (edited_entry == priv->start_entry)
503 hildon_range_editor_set_lower (editor, fixup);
505 hildon_range_editor_set_higher (editor, fixup);
508 /* The only valid case when conversion can fail is when we
509 have plain '-', intermediate forms are allowed AND
510 minimum bound is negative */
511 else if (!allow_intermediate || strcmp(text, "-") != 0 || min >= 0) {
513 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_set_a_value_within_range"), min, max);
516 else if (! allow_intermediate) {
518 g_snprintf (buffer, sizeof (buffer), _("ckct_ib_set_a_value_within_range"), min, max);
523 hildon_banner_show_information (edited_entry, NULL, buffer);
524 gtk_widget_grab_focus (edited_entry);
529 hildon_range_editor_entry_focus_in (GtkEditable *editable,
530 GdkEventFocus *event,
531 HildonRangeEditor *editor)
533 HildonRangeEditorPrivate *priv = HILDON_RANGE_EDITOR_GET_PRIVATE(editor);
542 if (GTK_WIDGET (editable) == priv->start_entry)
543 gtk_editable_select_region (editable, -1, 0);
545 gtk_editable_select_region (editable, 0, -1);
549 /* Gets and sets the current range. This has two useful side effects:
550 * Values are now sorted to the correct order
551 * Out of range values are clamped to range */
553 hildon_range_editor_apply_current_range (HildonRangeEditor *editor)
555 g_assert (HILDON_IS_RANGE_EDITOR (editor));
557 hildon_range_editor_set_range (editor,
558 hildon_range_editor_get_lower (editor),
559 hildon_range_editor_get_higher (editor));
563 hildon_range_editor_entry_changed (GtkWidget *widget,
564 HildonRangeEditor *editor)
566 g_assert (HILDON_IS_RANGE_EDITOR (editor));
568 hildon_range_editor_entry_validate (editor, widget, TRUE);
572 hildon_range_editor_entry_focus_out (GtkEditable *editable,
573 GdkEventFocus *event,
574 HildonRangeEditor *editor)
576 g_assert (HILDON_IS_RANGE_EDITOR(editor));
578 hildon_range_editor_entry_validate (editor, GTK_WIDGET (editable), FALSE);
583 hildon_range_editor_press (GtkEditable *editable,
584 GdkEventButton *event,
585 HildonRangeEditor *editor)
587 HildonRangeEditorPrivate *priv = HILDON_RANGE_EDITOR_GET_PRIVATE(editor);
595 hildon_range_editor_forall (GtkContainer *container,
596 gboolean include_internals,
597 GtkCallback callback,
598 gpointer callback_data)
600 HildonRangeEditorPrivate *priv;
602 g_assert (HILDON_IS_RANGE_EDITOR (container));
603 g_assert (callback != NULL);
605 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (container);
608 if (! include_internals)
611 (*callback) (priv->start_entry, callback_data);
612 (*callback) (priv->end_entry, callback_data);
613 (*callback) (priv->label, callback_data);
617 hildon_range_editor_destroy (GtkObject *self)
619 HildonRangeEditorPrivate *priv = HILDON_RANGE_EDITOR_GET_PRIVATE (self);
621 if (priv->start_entry)
623 gtk_widget_unparent (priv->start_entry);
624 priv->start_entry = NULL;
628 gtk_widget_unparent (priv->end_entry);
629 priv->end_entry = NULL;
633 gtk_widget_unparent (priv->label);
637 if (GTK_OBJECT_CLASS (parent_class)->destroy)
638 GTK_OBJECT_CLASS (parent_class)->destroy (self);
643 hildon_range_editor_size_request (GtkWidget *widget,
644 GtkRequisition *requisition)
646 HildonRangeEditorPrivate *priv = NULL;
647 GtkRequisition lab_req, mreq;
649 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (widget);
652 gtk_entry_get_width_chars (GTK_ENTRY (priv->end_entry));
654 gtk_widget_size_request (priv->start_entry, &mreq);
655 gtk_widget_size_request (priv->end_entry, &mreq);
656 gtk_widget_size_request (priv->label, &lab_req);
658 /* Width for entries and separator label and border */
659 requisition->width = mreq.width * 2 + lab_req.width +
660 widget->style->xthickness * 2;
661 /* Add vertical border */
662 requisition->height = mreq.height + widget->style->ythickness * 2;
663 /* Fit label height */
664 requisition->height = MAX (requisition->height, lab_req.height);
668 hildon_range_editor_size_allocate (GtkWidget *widget,
669 GtkAllocation *allocation)
671 HildonRangeEditorPrivate *priv;
672 GtkAllocation child1_allocation = {0};
673 GtkAllocation child2_allocation = {0};
674 GtkAllocation child3_allocation = {0};
676 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (widget);
679 widget->allocation = *allocation;
681 /* Allocate entries, left-to-right */
682 if (priv->start_entry && GTK_WIDGET_VISIBLE (priv->start_entry))
684 GtkRequisition child_requisition;
686 gtk_widget_get_child_requisition (priv->start_entry,
689 child1_allocation.x = allocation->x;
690 child1_allocation.y = allocation->y;
692 child1_allocation.width = child_requisition.width;
693 child1_allocation.height = allocation->height;
695 gtk_widget_size_allocate (priv->start_entry, &child1_allocation);
698 if (priv->label && GTK_WIDGET_VISIBLE (priv->label))
700 GtkRequisition child_requisition;
702 gtk_widget_get_child_requisition (priv->label, &child_requisition);
704 child2_allocation.x = child1_allocation.x + child1_allocation.width;
705 child2_allocation.y = allocation->y;
707 child2_allocation.width = child_requisition.width + 4;
708 child2_allocation.height = allocation->height;
710 gtk_widget_size_allocate (priv->label, &child2_allocation);
713 if (priv->end_entry && GTK_WIDGET_VISIBLE (priv->end_entry))
715 GtkRequisition child_requisition;
717 gtk_widget_get_child_requisition (priv->end_entry, &child_requisition);
719 child3_allocation.x = child2_allocation.x + child2_allocation.width;
720 child3_allocation.y = allocation->y;
722 child3_allocation.width = child_requisition.width;
723 child3_allocation.height = allocation->height;
725 gtk_widget_size_allocate (priv->end_entry, &child3_allocation);
729 /* Button released inside entries */
731 hildon_range_editor_released (GtkEditable *editable,
732 GdkEventButton *event,
733 HildonRangeEditor *editor)
735 HildonRangeEditorPrivate *priv = HILDON_RANGE_EDITOR_GET_PRIVATE(editor);
738 if (GTK_WIDGET (editable) == priv->start_entry)
739 gtk_editable_select_region(editable, -1, 0);
741 gtk_editable_select_region(editable, 0, -1);
747 hildon_range_editor_entry_keypress (GtkWidget *widget,
749 HildonRangeEditor *editor)
754 g_assert(HILDON_IS_RANGE_EDITOR (editor));
756 text = gtk_entry_get_text (GTK_ENTRY (widget));
757 cursor_pos = gtk_editable_get_position (GTK_EDITABLE (widget));
759 switch (event->keyval)
762 /* If we are on the first character and press left,
763 try to move to previous field */
764 if (cursor_pos == 0) {
765 (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_LEFT);
771 /* If the cursor is on the right, try to move to the next field */
772 if (cursor_pos >= g_utf8_strlen (text, -1)) {
773 (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_RIGHT);
786 hildon_range_editor_refresh_widths (HildonRangeEditorPrivate *priv)
788 gchar start_range[32], end_range[32];
791 /* Calculate length of entry so extremes would fit */
792 g_snprintf (start_range, sizeof (start_range), "%d", priv->range_limits_start);
793 g_snprintf (end_range, sizeof (end_range), "%d", priv->range_limits_end);
794 length = MAX (g_utf8_strlen (start_range, -1), g_utf8_strlen (end_range, -1));
796 gtk_entry_set_width_chars (GTK_ENTRY (priv->start_entry), length);
797 gtk_entry_set_max_length (GTK_ENTRY (priv->start_entry), length);
798 gtk_entry_set_width_chars (GTK_ENTRY (priv->end_entry), length);
799 gtk_entry_set_max_length (GTK_ENTRY (priv->end_entry), length);
803 * hildon_range_editor_get_type:
805 * Initializes, and returns the type of a hildon range editor.
807 * Returns: GType of #HildonRangeEditor
811 hildon_range_editor_get_type (void)
813 static GType editor_type = 0;
817 static const GTypeInfo editor_info =
819 sizeof (HildonRangeEditorClass),
820 NULL, /* base_init */
821 NULL, /* base_finalize */
822 (GClassInitFunc) hildon_range_editor_class_init,
823 NULL, /* class_finalize */
824 NULL, /* class_data */
825 sizeof (HildonRangeEditor),
827 (GInstanceInitFunc) hildon_range_editor_init,
829 editor_type = g_type_register_static (GTK_TYPE_CONTAINER,
837 * hildon_range_editor_new:
839 * HildonRangeEditor contains two GtkEntrys that accept numbers and minus.
841 * Returns: pointer to a new @HildonRangeEditor widget
844 hildon_range_editor_new (void)
846 return GTK_WIDGET (g_object_new (HILDON_TYPE_RANGE_EDITOR, NULL));
850 * hildon_range_editor_new_with_separator:
851 * @separator: a string that is shown between the numbers
853 * HildonRangeEditor contains two Gtk entries that accept numbers.
854 * A separator is displayed between two entries.
855 * CHECKME: Use '-' as a separator in the case of null separator?
857 * Returns: pointer to a new @HildonRangeEditor widget
860 hildon_range_editor_new_with_separator (const gchar *separator)
862 return GTK_WIDGET (g_object_new (HILDON_TYPE_RANGE_EDITOR,
863 "separator", separator, NULL));
867 * hildon_range_editor_set_range:
868 * @editor: the #HildonRangeEditor widget
869 * @start: range's start value
870 * @end: range's end value
872 * Sets a range to the editor. (The current value)
874 * Sets the range of the @HildonRangeEditor widget.
877 hildon_range_editor_set_range (HildonRangeEditor *editor,
881 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
883 /* Make sure that the start/end appear in the correct order */
884 hildon_range_editor_set_lower (editor, MIN (start, end));
885 hildon_range_editor_set_higher (editor, MAX (start, end));
889 * hildon_range_editor_get_range:
890 * @editor: the #HildonRangeEditor widget
891 * @start: ranges start value
892 * @end: ranges end value
894 * Gets the range of the @HildonRangeEditor widget.
897 hildon_range_editor_get_range (HildonRangeEditor *editor,
901 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor) && start && end);
903 *start = hildon_range_editor_get_lower (editor);
904 *end = hildon_range_editor_get_higher (editor);
908 * hildon_range_editor_set_limits:
909 * @editor: the #HildonRangeEditor widget
910 * @start: minimum acceptable value (default: no limit)
911 * @end: maximum acceptable value (default: no limit)
913 * Sets the range of the @HildonRangeEditor widget.
916 hildon_range_editor_set_limits (HildonRangeEditor *editor,
920 /* FIXME: Setting start/end as separate steps can modify
921 the inputted range unneedlesly */
922 hildon_range_editor_set_min (editor, start);
923 hildon_range_editor_set_max (editor, end);
927 hildon_range_editor_set_lower (HildonRangeEditor *editor,
930 HildonRangeEditorPrivate *priv;
933 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
934 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
936 g_snprintf(buffer, sizeof (buffer), "%d",
937 CLAMP (value, priv->range_limits_start, priv->range_limits_end));
939 /* Update entry text with new value */
940 gtk_entry_set_text (GTK_ENTRY (priv->start_entry), buffer);
941 g_object_notify (G_OBJECT (editor), "lower");
945 hildon_range_editor_set_higher (HildonRangeEditor *editor,
948 HildonRangeEditorPrivate *priv;
951 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
952 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
954 g_snprintf(buffer, sizeof(buffer), "%d",
955 CLAMP(value, priv->range_limits_start, priv->range_limits_end));
957 /* Update entry text with new value */
958 gtk_entry_set_text (GTK_ENTRY (priv->end_entry), buffer);
959 g_object_notify (G_OBJECT (editor), "higher");
963 hildon_range_editor_get_lower (HildonRangeEditor *editor)
965 HildonRangeEditorPrivate *priv;
966 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
967 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
968 return atoi(gtk_entry_get_text(GTK_ENTRY(priv->start_entry)));
972 hildon_range_editor_get_higher (HildonRangeEditor *editor)
974 HildonRangeEditorPrivate *priv;
975 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
976 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
977 return atoi (gtk_entry_get_text(GTK_ENTRY (priv->end_entry)));
981 hildon_range_editor_set_min (HildonRangeEditor *editor,
984 HildonRangeEditorPrivate *priv;
986 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
988 /* We can cause many properties to change */
989 g_object_freeze_notify (G_OBJECT(editor));
990 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
991 priv->range_limits_start = value;
993 if (priv->range_limits_end < value)
994 hildon_range_editor_set_max (editor, value);
995 /* Setting maximum applies widths and range in this case */
997 hildon_range_editor_refresh_widths (priv);
998 hildon_range_editor_apply_current_range (editor);
1001 g_object_notify (G_OBJECT (editor), "min");
1002 g_object_thaw_notify (G_OBJECT (editor));
1006 hildon_range_editor_set_max (HildonRangeEditor *editor,
1009 HildonRangeEditorPrivate *priv;
1011 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
1013 /* We can cause many properties to change */
1014 g_object_freeze_notify (G_OBJECT (editor));
1015 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1016 priv->range_limits_end = value;
1018 if (priv->range_limits_start > value)
1019 hildon_range_editor_set_min (editor, value);
1020 /* Setting minimum applies widths and range in this case */
1022 hildon_range_editor_refresh_widths (priv);
1023 hildon_range_editor_apply_current_range (editor);
1026 g_object_notify (G_OBJECT (editor), "max");
1027 g_object_thaw_notify (G_OBJECT (editor));
1031 hildon_range_editor_get_min (HildonRangeEditor *editor)
1033 HildonRangeEditorPrivate *priv;
1034 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
1035 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1037 return priv->range_limits_start;
1041 hildon_range_editor_get_max (HildonRangeEditor *editor)
1043 HildonRangeEditorPrivate *priv;
1044 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
1045 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1047 return priv->range_limits_end;
1051 hildon_range_editor_set_separator (HildonRangeEditor *editor,
1052 const gchar *separator)
1054 HildonRangeEditorPrivate *priv;
1055 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
1056 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1058 gtk_label_set_text (GTK_LABEL (priv->label), separator);
1059 g_object_notify (G_OBJECT(editor), "separator");
1063 hildon_range_editor_get_separator (HildonRangeEditor *editor)
1065 HildonRangeEditorPrivate *priv;
1066 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), NULL);
1067 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1069 return gtk_label_get_text (GTK_LABEL (priv->label));