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-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);
46 #include "hildon-range-editor.h"
47 #include <gtk/gtkbox.h>
48 #include <gtk/gtklabel.h>
49 #include <gtk/gtksignal.h>
50 #include <gtk/gtkentry.h>
51 #include <gdk/gdkkeysyms.h>
52 #include <glib/gprintf.h>
55 #include "hildon-input-mode-hint.h"
56 #include "hildon-banner.h"
58 #include "hildon-range-editor-private.h"
61 dgettext("hildon-libs", string)
63 /* Alignment in entry box ( 0 = left, 1 = right ) */
65 #define DEFAULT_ALIGNMENT 1
67 /* Amount of padding to add to each side of the separator */
69 #define DEFAULT_PADDING 3
71 #define DEFAULT_START -999
73 #define DEFAULT_END 999
75 #define DEFAULT_LENGTH 4
77 static GtkContainerClass *parent_class = NULL;
80 hildon_range_editor_class_init (HildonRangeEditorClass *editor_class);
83 hildon_range_editor_init (HildonRangeEditor *editor);
86 hildon_range_editor_forall (GtkContainer *container,
87 gboolean include_internals,
89 gpointer callback_data);
92 hildon_range_editor_destroy (GtkObject *self);
95 hildon_range_editor_size_request (GtkWidget *widget,
96 GtkRequisition *requisition);
99 hildon_range_editor_size_allocate (GtkWidget *widget,
100 GtkAllocation *allocation);
103 hildon_range_editor_entry_focus_in (GtkEditable *editable,
104 GdkEventFocus *event,
105 HildonRangeEditor *editor);
108 hildon_range_editor_entry_focus_out (GtkEditable *editable,
109 GdkEventFocus *event,
110 HildonRangeEditor *editor);
113 hildon_range_editor_entry_keypress (GtkWidget *widget,
115 HildonRangeEditor *editor);
118 hildon_range_editor_released (GtkEditable *editable,
119 GdkEventButton *event,
120 HildonRangeEditor *editor);
123 hildon_range_editor_press (GtkEditable *editable,
124 GdkEventButton *event,
125 HildonRangeEditor *editor);
128 hildon_range_editor_set_property (GObject *object,
134 hildon_range_editor_get_property (GObject *object,
140 hildon_range_editor_entry_changed (GtkWidget *widget,
141 HildonRangeEditor *editor);
154 hildon_range_editor_class_init (HildonRangeEditorClass *editor_class)
156 GObjectClass *gobject_class = G_OBJECT_CLASS (editor_class);
157 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (editor_class);
158 GtkContainerClass *container_class = GTK_CONTAINER_CLASS (editor_class);
160 parent_class = g_type_class_peek_parent (editor_class);
162 g_type_class_add_private (editor_class, sizeof (HildonRangeEditorPrivate));
164 gobject_class->set_property = hildon_range_editor_set_property;
165 gobject_class->get_property = hildon_range_editor_get_property;
166 widget_class->size_request = hildon_range_editor_size_request;
167 widget_class->size_allocate = hildon_range_editor_size_allocate;
169 container_class->forall = hildon_range_editor_forall;
170 GTK_OBJECT_CLASS (editor_class)->destroy = hildon_range_editor_destroy;
172 gtk_widget_class_install_style_property (widget_class,
173 g_param_spec_int ("hildon_range_editor_entry_alignment",
174 "Hildon RangeEditor entry alignment",
175 "Hildon RangeEditor entry alignment", 0, 1,
179 gtk_widget_class_install_style_property (widget_class,
180 g_param_spec_int ("hildon_range_editor_separator_padding",
181 "Hildon RangeEditor separator padding",
182 "Hildon RangeEditor separaror padding",
188 * HildonRangeEditor:min:
190 * Minimum value in a range.
193 g_object_class_install_property (gobject_class, PROP_MIN,
194 g_param_spec_int ("min",
196 "Minimum value in a range",
198 DEFAULT_START, G_PARAM_CONSTRUCT |
199 G_PARAM_READABLE | G_PARAM_WRITABLE));
202 * HildonRangeEditor:max:
204 * Maximum value in a range.
207 g_object_class_install_property (gobject_class, PROP_MAX,
208 g_param_spec_int ("max",
210 "Maximum value in a range",
212 DEFAULT_END, G_PARAM_CONSTRUCT |
213 G_PARAM_READABLE | G_PARAM_WRITABLE));
216 * HildonRangeEditor:lower:
218 * Current value in the entry presenting lower end of selected range.
221 g_object_class_install_property (gobject_class, PROP_LOWER,
222 g_param_spec_int ("lower",
223 "Current lower value",
224 "Current value in the entry presenting lower end of selected range",
226 DEFAULT_START, G_PARAM_CONSTRUCT |
227 G_PARAM_READABLE | G_PARAM_WRITABLE));
230 * HildonRangeEditor:higher:
232 * Current value in the entry presenting higher end of selected range.
235 g_object_class_install_property (gobject_class, PROP_HIGHER,
236 g_param_spec_int ("higher",
237 "Current higher value",
238 "Current value in the entry presenting higher end of selected range",
240 DEFAULT_END, G_PARAM_CONSTRUCT |
241 G_PARAM_READABLE | G_PARAM_WRITABLE));
244 * HildonRangeEditor:separator:
246 * Separator string to separate range editor entries.
249 g_object_class_install_property (gobject_class, PROP_SEPARATOR,
250 g_param_spec_string ("separator",
252 "Separator string to separate entries",
253 _("ckct_wi_range_separator"),
255 G_PARAM_READABLE | G_PARAM_WRITABLE));
259 hildon_range_editor_init (HildonRangeEditor *editor)
261 HildonRangeEditorPrivate *priv;
263 gint range_editor_entry_alignment;
264 gint range_editor_separator_padding;
266 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
269 GTK_WIDGET_SET_FLAGS (editor, GTK_NO_WINDOW);
271 gtk_widget_push_composite_child ();
273 priv->start_entry = gtk_entry_new ();
274 priv->end_entry = gtk_entry_new ();
275 priv->label = gtk_label_new (_("ckct_wi_range_separator"));
278 /* Get values from gtkrc (or use defaults) */
279 /* FIXME: This is broken, styles are not yet attached */
280 gtk_widget_style_get (GTK_WIDGET (editor),
281 "hildon_range_editor_entry_alignment",
282 &range_editor_entry_alignment,
283 "hildon_range_editor_separator_padding",
284 &range_editor_separator_padding, NULL);
286 /* Add padding to separator */
287 gtk_misc_set_padding (GTK_MISC (priv->label),
288 range_editor_separator_padding, 0);
290 /* Align the text to right in entry box */
291 gtk_entry_set_alignment (GTK_ENTRY (priv->start_entry),
292 range_editor_entry_alignment);
293 gtk_entry_set_alignment (GTK_ENTRY (priv->end_entry),
294 range_editor_entry_alignment);
296 gtk_widget_set_composite_name (priv->start_entry, "start_entry");
297 gtk_widget_set_composite_name (priv->end_entry, "end_entry");
298 gtk_widget_set_composite_name (priv->label, "separator_label");
299 gtk_widget_set_parent (priv->start_entry, GTK_WIDGET (editor));
300 gtk_widget_set_parent (priv->end_entry, GTK_WIDGET (editor));
301 gtk_widget_set_parent (priv->label, GTK_WIDGET (editor));
303 g_signal_connect (G_OBJECT (priv->start_entry), "button-release-event",
304 G_CALLBACK (hildon_range_editor_released), editor);
305 g_signal_connect (G_OBJECT (priv->end_entry), "button-release-event",
306 G_CALLBACK (hildon_range_editor_released), editor);
308 g_signal_connect (G_OBJECT (priv->start_entry), "button-press-event",
309 G_CALLBACK (hildon_range_editor_press), editor);
310 g_signal_connect (G_OBJECT (priv->end_entry), "button-press-event",
311 G_CALLBACK (hildon_range_editor_press), editor);
313 g_signal_connect (G_OBJECT (priv->start_entry), "key-press-event",
314 G_CALLBACK (hildon_range_editor_entry_keypress), editor);
315 g_signal_connect (G_OBJECT (priv->end_entry), "key-press-event",
316 G_CALLBACK (hildon_range_editor_entry_keypress), editor);
318 g_signal_connect (G_OBJECT (priv->start_entry), "focus-in-event",
319 G_CALLBACK (hildon_range_editor_entry_focus_in), editor);
320 g_signal_connect (G_OBJECT (priv->end_entry), "focus-in-event",
321 G_CALLBACK (hildon_range_editor_entry_focus_in), editor);
323 g_signal_connect (G_OBJECT (priv->start_entry), "focus-out-event",
324 G_CALLBACK (hildon_range_editor_entry_focus_out), editor);
325 g_signal_connect (G_OBJECT (priv->end_entry), "focus-out-event",
326 G_CALLBACK (hildon_range_editor_entry_focus_out), editor);
327 g_signal_connect (priv->start_entry, "changed",
328 G_CALLBACK (hildon_range_editor_entry_changed), editor);
329 g_signal_connect (priv->end_entry, "changed",
330 G_CALLBACK (hildon_range_editor_entry_changed), editor);
332 g_object_set (G_OBJECT (priv->start_entry),
333 "input-mode", HILDON_INPUT_MODE_HINT_NUMERIC, NULL);
335 g_object_set( G_OBJECT (priv->end_entry),
336 "input-mode", HILDON_INPUT_MODE_HINT_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 usefull 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, child2_allocation, child3_allocation;
674 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (widget);
677 widget->allocation = *allocation;
679 /* Allocate entries, left-to-right */
680 if (priv->start_entry && GTK_WIDGET_VISIBLE (priv->start_entry))
682 GtkRequisition child_requisition;
684 gtk_widget_get_child_requisition (priv->start_entry,
687 child1_allocation.x = allocation->x;
688 child1_allocation.y = allocation->y;
690 child1_allocation.width = child_requisition.width;
691 child1_allocation.height = allocation->height;
693 gtk_widget_size_allocate (priv->start_entry, &child1_allocation);
696 if (priv->label && GTK_WIDGET_VISIBLE (priv->label))
698 GtkRequisition child_requisition;
700 gtk_widget_get_child_requisition (priv->label, &child_requisition);
702 child2_allocation.x = child1_allocation.x + child1_allocation.width;
703 child2_allocation.y = allocation->y;
705 child2_allocation.width = child_requisition.width + 4;
706 child2_allocation.height = allocation->height;
708 gtk_widget_size_allocate (priv->label, &child2_allocation);
711 if (priv->end_entry && GTK_WIDGET_VISIBLE (priv->end_entry))
713 GtkRequisition child_requisition;
715 gtk_widget_get_child_requisition (priv->end_entry, &child_requisition);
717 child3_allocation.x = child2_allocation.x + child2_allocation.width;
718 child3_allocation.y = allocation->y;
720 child3_allocation.width = child_requisition.width;
721 child3_allocation.height = allocation->height;
723 gtk_widget_size_allocate (priv->end_entry, &child3_allocation);
727 /* Button released inside entries */
729 hildon_range_editor_released (GtkEditable *editable,
730 GdkEventButton *event,
731 HildonRangeEditor *editor)
733 HildonRangeEditorPrivate *priv = HILDON_RANGE_EDITOR_GET_PRIVATE(editor);
736 if (GTK_WIDGET (editable) == priv->start_entry)
737 gtk_editable_select_region(editable, -1, 0);
739 gtk_editable_select_region(editable, 0, -1);
745 hildon_range_editor_entry_keypress (GtkWidget *widget,
747 HildonRangeEditor *editor)
752 g_assert(HILDON_IS_RANGE_EDITOR (editor));
754 text = gtk_entry_get_text (GTK_ENTRY (widget));
755 cursor_pos = gtk_editable_get_position (GTK_EDITABLE (widget));
757 switch (event->keyval)
760 /* If we are on the first character and press left,
761 try to move to previous field */
762 if (cursor_pos == 0) {
763 (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_LEFT);
769 /* If the cursor is on the right, try to move to the next field */
770 if (cursor_pos >= g_utf8_strlen (text, -1)) {
771 (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_RIGHT);
784 hildon_range_editor_refresh_widths (HildonRangeEditorPrivate *priv)
786 gchar start_range[32], end_range[32];
789 /* Calculate length of entry so extremes would fit */
790 g_snprintf (start_range, sizeof (start_range), "%d", priv->range_limits_start);
791 g_snprintf (end_range, sizeof (end_range), "%d", priv->range_limits_end);
792 length = MAX (g_utf8_strlen (start_range, -1), g_utf8_strlen (end_range, -1));
794 gtk_entry_set_width_chars (GTK_ENTRY (priv->start_entry), length);
795 gtk_entry_set_max_length (GTK_ENTRY (priv->start_entry), length);
796 gtk_entry_set_width_chars (GTK_ENTRY (priv->end_entry), length);
797 gtk_entry_set_max_length (GTK_ENTRY (priv->end_entry), length);
801 * hildon_range_editor_get_type:
803 * Initializes, and returns the type of a hildon range editor.
805 * @Returns : GType of #HildonRangeEditor
809 hildon_range_editor_get_type (void)
811 static GType editor_type = 0;
815 static const GTypeInfo editor_info =
817 sizeof (HildonRangeEditorClass),
818 NULL, /* base_init */
819 NULL, /* base_finalize */
820 (GClassInitFunc) hildon_range_editor_class_init,
821 NULL, /* class_finalize */
822 NULL, /* class_data */
823 sizeof (HildonRangeEditor),
825 (GInstanceInitFunc) hildon_range_editor_init,
827 editor_type = g_type_register_static (GTK_TYPE_CONTAINER,
835 * hildon_range_editor_new:
837 * HildonRangeEditor contains two GtkEntrys that accept numbers and minus.
839 * Returns: pointer to a new @HildonRangeEditor widget
842 hildon_range_editor_new (void)
844 return GTK_WIDGET (g_object_new (HILDON_TYPE_RANGE_EDITOR, NULL));
848 * hildon_range_editor_new_with_separator:
849 * @separator: a string that is shown between the numbers
851 * HildonRangeEditor contains two Gtk entries that accept numbers.
852 * A separator is displayed between two entries.
853 * CHECKME: Use '-' as a separator in the case of null separator?
855 * Returns: pointer to a new @HildonRangeEditor widget
858 hildon_range_editor_new_with_separator (const gchar *separator)
860 return GTK_WIDGET (g_object_new (HILDON_TYPE_RANGE_EDITOR,
861 "separator", separator, NULL));
865 * hildon_range_editor_set_range:
866 * @editor: the #HildonRangeEditor widget
867 * @start: range's start value
868 * @end: range's end value
870 * Sets a range to the editor. (The current value)
872 * Sets the range of the @HildonRangeEditor widget.
875 hildon_range_editor_set_range (HildonRangeEditor *editor,
879 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
881 /* Make sure that the start/end appear in the correct order */
882 hildon_range_editor_set_lower (editor, MIN (start, end));
883 hildon_range_editor_set_higher (editor, MAX (start, end));
887 * hildon_range_editor_get_range:
888 * @editor: the #HildonRangeEditor widget
889 * @start: ranges start value
890 * @end: ranges end value
892 * Gets the range of the @HildonRangeEditor widget.
895 hildon_range_editor_get_range (HildonRangeEditor *editor,
899 HildonRangeEditorPrivate *priv;
901 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor) && start && end);
902 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
904 *start = hildon_range_editor_get_lower (editor);
905 *end = hildon_range_editor_get_higher (editor);
909 * hildon_range_editor_set_limits:
910 * @editor: the #HildonRangeEditor widget
911 * @start: minimum acceptable value (default: no limit)
912 * @end: maximum acceptable value (default: no limit)
914 * Sets the range of the @HildonRangeEditor widget.
917 hildon_range_editor_set_limits (HildonRangeEditor *editor,
921 /* FIXME: Setting start/end as separate steps can modify
922 the inputted range unneedlesly */
923 hildon_range_editor_set_min (editor, start);
924 hildon_range_editor_set_max (editor, end);
928 hildon_range_editor_set_lower (HildonRangeEditor *editor,
931 HildonRangeEditorPrivate *priv;
934 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
935 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
937 g_snprintf(buffer, sizeof (buffer), "%d",
938 CLAMP (value, priv->range_limits_start, priv->range_limits_end));
940 /* Update entry text with new value */
941 gtk_entry_set_text (GTK_ENTRY (priv->start_entry), buffer);
942 g_object_notify (G_OBJECT (editor), "lower");
946 hildon_range_editor_set_higher (HildonRangeEditor *editor,
949 HildonRangeEditorPrivate *priv;
952 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
953 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
955 g_snprintf(buffer, sizeof(buffer), "%d",
956 CLAMP(value, priv->range_limits_start, priv->range_limits_end));
958 /* Update entry text with new value */
959 gtk_entry_set_text (GTK_ENTRY (priv->end_entry), buffer);
960 g_object_notify (G_OBJECT (editor), "higher");
964 hildon_range_editor_get_lower (HildonRangeEditor *editor)
966 HildonRangeEditorPrivate *priv;
967 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
968 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
969 return atoi(gtk_entry_get_text(GTK_ENTRY(priv->start_entry)));
973 hildon_range_editor_get_higher (HildonRangeEditor *editor)
975 HildonRangeEditorPrivate *priv;
976 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
977 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
978 return atoi (gtk_entry_get_text(GTK_ENTRY (priv->end_entry)));
982 hildon_range_editor_set_min (HildonRangeEditor *editor,
985 HildonRangeEditorPrivate *priv;
987 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
989 /* We can cause many properties to change */
990 g_object_freeze_notify (G_OBJECT(editor));
991 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
992 priv->range_limits_start = value;
994 if (priv->range_limits_end < value)
995 hildon_range_editor_set_max (editor, value);
996 /* Setting maximum applies widths and range in this case */
998 hildon_range_editor_refresh_widths (priv);
999 hildon_range_editor_apply_current_range (editor);
1002 g_object_notify (G_OBJECT (editor), "min");
1003 g_object_thaw_notify (G_OBJECT (editor));
1007 hildon_range_editor_set_max (HildonRangeEditor *editor,
1010 HildonRangeEditorPrivate *priv;
1012 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
1014 /* We can cause many properties to change */
1015 g_object_freeze_notify (G_OBJECT (editor));
1016 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1017 priv->range_limits_end = value;
1019 if (priv->range_limits_start > value)
1020 hildon_range_editor_set_min (editor, value);
1021 /* Setting minimum applies widths and range in this case */
1023 hildon_range_editor_refresh_widths (priv);
1024 hildon_range_editor_apply_current_range (editor);
1027 g_object_notify (G_OBJECT (editor), "max");
1028 g_object_thaw_notify (G_OBJECT (editor));
1032 hildon_range_editor_get_min (HildonRangeEditor *editor)
1034 HildonRangeEditorPrivate *priv;
1035 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
1036 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1038 return priv->range_limits_start;
1042 hildon_range_editor_get_max (HildonRangeEditor *editor)
1044 HildonRangeEditorPrivate *priv;
1045 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), 0);
1046 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1048 return priv->range_limits_end;
1052 hildon_range_editor_set_separator (HildonRangeEditor *editor,
1053 const gchar *separator)
1055 HildonRangeEditorPrivate *priv;
1056 g_return_if_fail (HILDON_IS_RANGE_EDITOR (editor));
1057 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1059 gtk_label_set_text (GTK_LABEL (priv->label), separator);
1060 g_object_notify (G_OBJECT(editor), "separator");
1064 hildon_range_editor_get_separator (HildonRangeEditor *editor)
1066 HildonRangeEditorPrivate *priv;
1067 g_return_val_if_fail (HILDON_IS_RANGE_EDITOR (editor), NULL);
1068 priv = HILDON_RANGE_EDITOR_GET_PRIVATE (editor);
1070 return gtk_label_get_text (GTK_LABEL (priv->label));