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, 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));