*
* This file implements the HildonTimePicker widget. This widget
* is used with HildonTimeEditor widget to set time.
+ *
*/
/* HILDON DOC
* @seealso: #HildonTimeEditor
*/
-#include <hildon-widgets/hildon-time-picker.h>
+#include "hildon-time-picker.h"
#include <hildon-widgets/hildon-defines.h>
+#include <hildon-widgets/gtk-infoprint.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdk.h>
#define HILDON_TIME_PICKER_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
- HILDON_TYPE_TIME_PICKER, HildonTimePickerPriv));
+ HILDON_TYPE_TIME_PICKER, HildonTimePickerPrivate))
-typedef struct _HildonTimePickerPriv HildonTimePickerPriv;
+#define DEFAULT_HOURS 1
+#define DEFAULT_MINUTES 1
+#define DEFAULT_ARROW_WIDTH 26
+#define DEFAULT_ARROW_HEIGHT 26
+
+enum
+{
+ TABLE,
+
+ FRAME_HOURS,
+ FRAME_MMINUTES,
+ FRAME_LMINUTES,
+ FRAME_AMPM,
+
+ EBOX_HOURS,
+ EBOX_MMINUTES,
+ EBOX_LMINUTES,
+ EBOX_AMPM,
+
+ LABEL_HOURS,
+ LABEL_MMINUTES,
+ LABEL_LMINUTES,
+ LABEL_AMPM,
+ LABEL_COLON,
+
+ BUTTON_HOURS_UP,
+ BUTTON_HOURS_DOWN,
+ BUTTON_MMINUTES_UP,
+ BUTTON_MMINUTES_DOWN,
+ BUTTON_LMINUTES_UP,
+ BUTTON_LMINUTES_DOWN,
+
+ WIDGET_COUNT
+};
-/*
- * Pointer parent class
- */
static GtkDialogClass *parent_class;
-/*< private >*/
-struct _HildonTimePickerPriv
+/*< private > m == minutes and h == hours
+ m == more significant and l == less significant
+ mm == minutes more significant (==tens of minutes) etc.*/
+struct _HildonTimePickerPrivate
{
- GtkWidget *ht_label;
- GtkWidget *hs_label;
- GtkWidget *mt_label;
- GtkWidget *ms_label;
- GtkWidget *h_frame;
- GtkWidget *m_frame;
- GtkWidget *ampm_frame;
- GtkWidget *h_ebox;
- GtkWidget *mt_ebox;
- GtkWidget *ms_ebox;
- GtkWidget *h_up;
- GtkWidget *h_down;
- GtkWidget *mt_up;
- GtkWidget *mt_down;
- GtkWidget *ms_up;
- GtkWidget *ms_down;
- GtkWidget *d_label;
-
- /* Localisation stuff */
- GtkWidget *ampm_button; /* Eventbox to hold label */
- GtkWidget *ampm_label; /* Label to hold am or pm symbol */
-
- gboolean ampm_pos_after; /* Position eventbox before of after clock */
- gboolean clock_24h; /* 12h or 24h time */
- gboolean am; /* Indicates before or after noon */
-
- gchar *am_symbol; /* Local symbol for am */
- gchar *pm_symbol; /* Local symbol for pm */
-
- /* These are for timeout */
- guint id; /* key repeat timer id */
- guint start_id; /* key repeat start timer id */
- GtkWidget *press_button;
+ GtkWidget *child[WIDGET_COUNT];
+
+ gchar *am_symbol;
+ gchar *pm_symbol;
+
+ guint key_repeat;
+ guint minutes;
+ gint mul;
+ guint timer_id;
+
+ guint c12h : 1; /* 12 hour clock, show AM/PM */
+ guint ampm_pos : 1; /* FALSE = AM/PM at left, TRUE = at right */
+ guint button_press : 1;
+ guint start_key_repeat : 1;
+};
+
+enum
+{
+ PROP_MINUTES = 1,
+ PROP_AMPM
};
-/*
- * Private function prototype definitions
- */
-static void
-hildon_time_picker_class_init (HildonTimePickerClass *picker_class);
static void
-hildon_time_picker_init (HildonTimePicker *picker);
+hildon_time_picker_class_init( HildonTimePickerClass *klass );
static void
-hildon_time_picker_finalize (GObject *obj_self);
+hildon_time_picker_init( HildonTimePicker *picker );
static gboolean
-hildon_time_picker_key_press (GtkWidget *widget, GdkEventKey *event,
- gpointer data);
-
-static void
-hildon_time_picker_clicked (GtkButton *button, gpointer data);
+hildon_time_picker_timeout( gpointer data );
static void
-hildon_time_picker_add_style (void);
+hildon_time_picker_change_time( HildonTimePicker *picker, guint minutes );
static gboolean
-hildon_time_picker_timeout (gpointer data);
+hildon_time_picker_ampm_release( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker );
static gboolean
-hildon_time_picker_start_timer (gpointer data);
-
+hildon_time_picker_arrow_press( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker );
static gboolean
-hildon_time_picker_button_press (GtkWidget *widget, GdkEventButton *event,
- gpointer data);
+hildon_time_picker_arrow_release( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker );
+
+static void
+hildon_time_picker_get_property( GObject *object, guint param_id,
+ GValue *value, GParamSpec *pspec );
+
+static void
+hildon_time_picker_set_property( GObject *object, guint param_id,
+ const GValue *value, GParamSpec *pspec );
static gboolean
-hildon_time_picker_button_release (GtkWidget *widget, GdkEventButton *event,
- gpointer data);
+hildon_time_picker_event_box_focus_in( GtkWidget *widget, GdkEvent *event,
+ gpointer data );
+
static gboolean
-hildon_time_picker_focus_in (GtkWidget *widget, GdkEventFocus *event,
- gpointer data);
-static void
-hildon_time_picker_handle_hours (GtkButton *button, HildonTimePicker *tp);
+hildon_time_picker_event_box_focus_out( GtkWidget *widget, GdkEvent *event,
+ gpointer data );
static gboolean
-hildon_time_picker_check_locale (HildonTimePicker *picker);
+hildon_time_picker_event_box_key_press( GtkWidget *widget, GdkEventKey *event,
+ HildonTimePicker *picker );
static gboolean
-hildon_time_picker_ampm_clicked (GtkWidget *widget, GdkEventButton *event,
- gpointer data);
+hildon_time_picker_event_box_key_release( GtkWidget *widget, GdkEventKey *event,
+ HildonTimePicker *picker );
static gboolean
-hildon_time_picker_change_ampm_label (HildonTimePicker *picker);
+hildon_time_picker_event_box_press( GtkWidget *widget, GdkEventKey *event,
+ gpointer data );
-/*
- * Public functions start here
- */
-GType hildon_time_picker_get_type(void)
-{
- static GType picker_type = 0;
+static void
+hildon_time_picker_map( GtkWidget *widget );
- if (!picker_type)
- {
- static const GTypeInfo picker_info =
- {
- sizeof (HildonTimePickerClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) hildon_time_picker_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (HildonTimePicker),
- 0, /* n_preallocs */
- (GInstanceInitFunc) hildon_time_picker_init,
- };
- picker_type = g_type_register_static (GTK_TYPE_DIALOG,
- "HildonTimePicker",
- &picker_info, 0);
- }
- return picker_type;
-}
-/**
- * hildon_time_picker_new:
- * @parent: parent window.
- *
- * Hildon Time Picker shows time picker dialog. Close button is placed
- * in dialog's action area and time picker is placed in dialogs vbox.
- * Actual time picker consists two #GtkLabel fields one for hour and
- * one for minutes, arrow buttons and an AM/PM button. A : is placed
- * between hour and minute fields.
- *
- * Return value: pointer to a new #HildonTimePicker widget.
- **/
-GtkWidget *hildon_time_picker_new(GtkWindow * parent)
+GType hildon_time_picker_get_type( void )
{
- GtkWidget *widget = g_object_new (HILDON_TYPE_TIME_PICKER, NULL);
+ static GType picker_type = 0;
- if (parent)
+ if( !picker_type )
+ {
+ static const GTypeInfo picker_info =
{
- gtk_window_set_transient_for (GTK_WINDOW(widget), parent);
- }
-
- return GTK_WIDGET (widget);
+ sizeof(HildonTimePickerClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc)hildon_time_picker_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof(HildonTimePicker),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc)hildon_time_picker_init,
+ };
+ picker_type = g_type_register_static( GTK_TYPE_DIALOG, "HildonTimePicker",
+ &picker_info, 0 );
+ }
+ return picker_type;
}
-/**
- * hildon_time_picker_set_time:
- * @picker: the #HildonTimePicker widget.
- * @hours: hours
- * @minutes: minutes
- *
- * Sets the time of the #HildonTimePicker widget.
- **/
-void hildon_time_picker_set_time(HildonTimePicker * picker,
- guint hours, guint minutes)
-{
- HildonTimePickerPriv *priv;
- gchar h_str[3], m_str[3], mt_str[2], ms_str[2], ht_str[2], hs_str[2];
-
- g_return_if_fail (picker);
-
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
- if ((hours >= 0) && (hours < 24) && (minutes >= 0) && (minutes < 60))
- {
- /* If we are using 12h clock, convert the time and check if it's
- after or before noon */
- if (!priv->clock_24h)
- {
- if (hours > 12)
- {
- priv->am = FALSE;
- hours = hours - 12;
- }
- else if (hours < 12)
- {
- priv->am = TRUE;
- if (hours == 0)
- hours = 12;
- }
- else if (hours == 12)
- priv->am = FALSE;
- gtk_label_set_text (GTK_LABEL (priv->ampm_label),
- priv->am ? priv->am_symbol : priv->pm_symbol);
- }
-
- sprintf (h_str, "%02d", hours);
- sprintf (m_str, "%02d", minutes);
-
- mt_str[0] = m_str[0];
- ms_str[0] = m_str[1];
- ht_str[0] = h_str[0];
- hs_str[0] = h_str[1];
- mt_str[1] = ms_str[1] = ht_str[1] = hs_str[1] = '\0';
-
- gtk_label_set_text (GTK_LABEL (priv->ht_label), ht_str);
- gtk_label_set_text (GTK_LABEL (priv->hs_label), hs_str);
- gtk_label_set_text (GTK_LABEL (priv->mt_label), mt_str);
- gtk_label_set_text (GTK_LABEL (priv->ms_label), ms_str);
- }
+static void
+hildon_time_picker_class_init( HildonTimePickerClass *klass )
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+ parent_class = g_type_class_peek_parent( klass );
+
+ gobject_class->get_property = hildon_time_picker_get_property;
+ gobject_class->set_property = hildon_time_picker_set_property;
+ widget_class->map = hildon_time_picker_map;
+
+ /**
+ * HildonTimePicker:minutes:
+ *
+ * Currently selected minutes.
+ */
+ g_object_class_install_property( gobject_class, PROP_MINUTES,
+ g_param_spec_uint("minutes",
+ "Current minutes",
+ "The selected minutes",
+ 0, 1440, 0,
+ G_PARAM_READABLE | G_PARAM_WRITABLE) );
+
+ gtk_widget_class_install_style_property( widget_class,
+ g_param_spec_uint("arrow-width",
+ _("Arrow width"),
+ _("Increase/decrease arrows width."),
+ 0, G_MAXUINT,
+ DEFAULT_ARROW_WIDTH,
+ G_PARAM_READABLE) );
+
+ gtk_widget_class_install_style_property( widget_class,
+ g_param_spec_uint("arrow-height",
+ _("Arrow height"),
+ _("Increase/decrease arrows height."),
+ 0, G_MAXUINT,
+ DEFAULT_ARROW_HEIGHT,
+ G_PARAM_READABLE) );
+
+ g_type_class_add_private( klass, sizeof(HildonTimePickerPrivate) );
}
-/**
- * hildon_time_picker_get_time:
- * @picker: the #HildonTimePicker widget.
- * @hours: hours
- * @minutes: minutes
- *
- * Gets the time of the #HildonTimePicker widget.
- **/
-void hildon_time_picker_get_time(HildonTimePicker * picker,
- guint * hours, guint * minutes)
+static void hildon_time_picker_init( HildonTimePicker *picker )
{
- HildonTimePickerPriv *priv;
-
- g_return_if_fail (picker);
- g_return_if_fail (hours);
- g_return_if_fail (minutes);
-
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
-
- *hours = 10 * atoi (gtk_label_get_text (GTK_LABEL (priv->ht_label))) +
- atoi (gtk_label_get_text (GTK_LABEL (priv->hs_label)));
- *minutes = 10 * atoi (gtk_label_get_text (GTK_LABEL (priv->mt_label))) +
- atoi (gtk_label_get_text (GTK_LABEL (priv->ms_label)));
-
- /* If we use 12h clock, we convert time to 24h time, because all time
- related APIs use 24h clock */
- if (!priv->clock_24h && !priv->am)
- {
- if (*hours != 12)
- *hours += 12;
- }
- if (!priv->clock_24h && *hours == 12 && priv->am)
- *hours = 0;
+ HildonTimePickerPrivate *priv = HILDON_TIME_PICKER_GET_PRIVATE(picker);
+ GtkSettings *settings = NULL;
+ GtkDialog *dialog = GTK_DIALOG(picker);
+ GtkTable *table = NULL;
+ GtkWidget *maintocenter;
+ struct tm *local = NULL;
+ time_t stamp;
+ gint i = 0;
+ GtkSizeGroup *size_group;
+
+ picker->priv = priv;
+
+ gtk_widget_push_composite_child();
+
+ priv->child[TABLE] = gtk_table_new( 3, 6, FALSE );
+ table = GTK_TABLE(priv->child[TABLE]);
+
+ maintocenter = gtk_alignment_new( 0.5, 0, 0, 0 );
+
+ for( i = FRAME_HOURS; i <= FRAME_LMINUTES; i++ )
+ {
+ priv->child[i] = gtk_frame_new( NULL );
+ gtk_container_set_border_width( GTK_CONTAINER( priv->child[i] ), 0 );
+ }
+
+ for( i = BUTTON_HOURS_UP; i <= BUTTON_LMINUTES_DOWN; i++ )
+ priv->child[i] = gtk_button_new();
+
+ for( i = EBOX_HOURS; i <= EBOX_LMINUTES; i++ )
+ priv->child[i] = gtk_event_box_new();
+
+ for( i = LABEL_HOURS; i <= LABEL_LMINUTES; i++ )
+ {
+ priv->child[i] = gtk_label_new( "00" );
+ gtk_misc_set_padding( GTK_MISC( priv->child[i] ), 0, 1 );
+ gtk_widget_set_name( priv->child[i], "osso-LargeFont" );
+ }
+
+ priv->child[LABEL_COLON] = gtk_label_new(_("Ecdg_ti_time_picker_separator"));
+ gtk_widget_set_name( priv->child[LABEL_COLON], "osso-LargeFont" );
+
+ priv->minutes = 0;
+ priv->mul = 0;
+ priv->key_repeat = 0;
+ priv->start_key_repeat = FALSE;
+ priv->timer_id = 0;
+ priv->button_press = FALSE;
+
+ /* Load locales */
+ priv->am_symbol = nl_langinfo(AM_STR);
+ priv->pm_symbol = nl_langinfo(PM_STR);
+
+ priv->c12h = priv->am_symbol[0] == '\0' ? FALSE : TRUE;
+
+ stamp = time( NULL );
+ local = localtime( &stamp );
+
+ gtk_table_attach( table, priv->child[BUTTON_HOURS_UP], 1, 2, 0, 1,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[FRAME_HOURS], 1, 2, 1, 2,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[BUTTON_HOURS_DOWN], 1, 2, 2, 3,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[LABEL_COLON], 2, 3, 1, 2,
+ GTK_SHRINK, GTK_SHRINK, 6, 0 );
+ gtk_table_attach( table, priv->child[BUTTON_MMINUTES_UP], 3, 4, 0, 1,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[FRAME_MMINUTES], 3, 4, 1, 2,
+ GTK_FILL, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[BUTTON_MMINUTES_DOWN], 3, 4, 2, 3,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+
+ gtk_table_attach( table, priv->child[BUTTON_LMINUTES_UP], 4, 5, 0, 1,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[FRAME_LMINUTES], 4, 5, 1, 2,
+ GTK_FILL, GTK_SHRINK, 0, 0 );
+ gtk_table_attach( table, priv->child[BUTTON_LMINUTES_DOWN], 4, 5, 2, 3,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+
+ gtk_table_set_row_spacing( table, 0, 6 );
+ gtk_table_set_row_spacing( table, 1, 6 );
+
+ size_group = gtk_size_group_new( GTK_SIZE_GROUP_HORIZONTAL );
+ gtk_size_group_add_widget( size_group, priv->child[BUTTON_MMINUTES_UP] );
+ gtk_size_group_add_widget( size_group, priv->child[FRAME_MMINUTES] );
+ gtk_size_group_add_widget( size_group, priv->child[BUTTON_MMINUTES_DOWN] );
+ gtk_size_group_add_widget( size_group, priv->child[BUTTON_LMINUTES_UP] );
+ gtk_size_group_add_widget( size_group, priv->child[FRAME_LMINUTES] );
+ gtk_size_group_add_widget( size_group, priv->child[BUTTON_LMINUTES_DOWN] );
+ g_object_unref( size_group ); /* Added widgets hold references */
+
+ if( priv->c12h )
+ {
+ GtkWidget *ampmtotop = NULL;
+ guint placement = 0;
+ priv->ampm_pos = strncmp(nl_langinfo(T_FMT_AMPM), "%p", 2) ? TRUE : FALSE;
+ ampmtotop = gtk_alignment_new( 0, 0.5, 0, 0 );
+ priv->child[FRAME_AMPM] = gtk_frame_new( NULL );
+ priv->child[EBOX_AMPM] = gtk_event_box_new();
+ priv->child[LABEL_AMPM] = gtk_label_new( priv->pm_symbol );
+
+ placement = priv->ampm_pos * 5;
+
+ gtk_container_add( GTK_CONTAINER(ampmtotop), priv->child[FRAME_AMPM] );
+ gtk_container_add( GTK_CONTAINER(priv->child[FRAME_AMPM]),
+ priv->child[EBOX_AMPM] );
+ gtk_container_add( GTK_CONTAINER(priv->child[EBOX_AMPM]),
+ priv->child[LABEL_AMPM] );
+ gtk_table_attach( table, ampmtotop, placement, placement + 1, 1, 2,
+ GTK_SHRINK, GTK_SHRINK, 0, 0 );
+ gtk_table_set_col_spacing( table, placement - 1, 6 );
+
+ g_signal_connect( G_OBJECT(priv->child[EBOX_AMPM]), "button-release-event",
+ (GCallback)hildon_time_picker_ampm_release, picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_AMPM]), "focus-out-event",
+ (GCallback)hildon_time_picker_event_box_focus_out,
+ picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_AMPM]), "focus-in-event",
+ (GCallback)hildon_time_picker_event_box_focus_in, picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_AMPM]), "key-release-event",
+ (GCallback)hildon_time_picker_event_box_key_release,
+ picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_AMPM]), "key-press-event",
+ (GCallback)hildon_time_picker_event_box_key_press,
+ picker );
+
+ g_object_set( G_OBJECT(priv->child[EBOX_AMPM]), "can-focus", TRUE, NULL );
+ gtk_widget_set_events( priv->child[EBOX_AMPM],
+ GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_PRESS_MASK );
+ }
+ else
+ priv->child[FRAME_AMPM] = priv->child[LABEL_AMPM] =
+ priv->child[EBOX_AMPM] = NULL;
+
+ gtk_widget_pop_composite_child();
+
+ hildon_time_picker_set_time( picker, local->tm_hour, local->tm_min );
+
+ settings = gtk_settings_get_default();
+ g_object_get( settings, "gtk-update-timeout", &priv->key_repeat, NULL );
+
+ for( i = 0; i < 3; i++ )
+ {
+ gtk_container_add( GTK_CONTAINER(priv->child[FRAME_HOURS + i]),
+ priv->child[EBOX_HOURS + i] );
+ gtk_container_add( GTK_CONTAINER(priv->child[EBOX_HOURS + i]),
+ priv->child[LABEL_HOURS + i] );
+
+ /* Connect signals */
+ g_signal_connect( G_OBJECT(priv->child[EBOX_HOURS + i]), "key-release-event",
+ (GCallback)hildon_time_picker_event_box_key_release,
+ picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_HOURS + i]), "key-press-event",
+ (GCallback)hildon_time_picker_event_box_key_press,
+ picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_HOURS + i]), "focus-in-event",
+ (GCallback)hildon_time_picker_event_box_focus_in, picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_HOURS + i]), "focus-out-event",
+ (GCallback)hildon_time_picker_event_box_focus_out,
+ picker );
+ g_signal_connect( G_OBJECT(priv->child[EBOX_HOURS + i]),
+ "button-press-event",
+ (GCallback)hildon_time_picker_event_box_press, NULL );
+
+ /* Name the buttons */
+ gtk_widget_set_name( priv->child[BUTTON_HOURS_UP + i*2],
+ "hildon-time-picker-up" );
+ gtk_widget_set_name( priv->child[BUTTON_HOURS_DOWN + i*2],
+ "hildon-time-picker-down" );
+ }
+
+ for( i = BUTTON_HOURS_UP; i <= BUTTON_LMINUTES_DOWN; i++ )
+ {
+ g_object_set( G_OBJECT(priv->child[i]), "can-focus", FALSE, NULL );
+
+ /* Connect signals */
+ g_signal_connect( G_OBJECT(priv->child[i]), "button-press-event",
+ (GCallback)hildon_time_picker_arrow_press, picker );
+ g_signal_connect( G_OBJECT(priv->child[i]), "button-release-event",
+ (GCallback)hildon_time_picker_arrow_release, picker );
+ }
+
+ for( i = EBOX_HOURS; i <= EBOX_LMINUTES; i++ )
+ {
+ g_object_set( G_OBJECT(priv->child[i]), "can-focus", TRUE, NULL );
+
+ /* Set events */
+ gtk_widget_set_events( priv->child[i],
+ GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_PRESS_MASK );
+ }
+
+ gtk_window_set_modal( GTK_WINDOW(dialog), FALSE );
+ gtk_dialog_set_has_separator( dialog, FALSE );
+ gtk_dialog_add_button( dialog, _("ecdg_bd_time_picker_close"),
+ GTK_RESPONSE_OK );
+
+ gtk_container_add( GTK_CONTAINER(maintocenter), priv->child[TABLE] );
+ gtk_box_pack_start( GTK_BOX(dialog->vbox), maintocenter, TRUE, FALSE, 0 );
+ gtk_widget_show_all( maintocenter );
}
-/*
- * Private functions start here
- */
-
static void
-hildon_time_picker_class_init(HildonTimePickerClass * picker_class)
+hildon_time_picker_set_property( GObject *object, guint param_id,
+ const GValue *value, GParamSpec *pspec )
{
- GObjectClass *object_class = G_OBJECT_CLASS (picker_class);
- parent_class = g_type_class_peek_parent (picker_class);
- object_class->finalize = hildon_time_picker_finalize;
-
- g_type_class_add_private (picker_class, sizeof (HildonTimePickerPriv));
- hildon_time_picker_add_style();
+ HildonTimePicker *picker = HILDON_TIME_PICKER(object);
+
+ switch( param_id )
+ {
+ case PROP_MINUTES:
+ hildon_time_picker_change_time( picker, g_value_get_uint(value) );
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ break;
+ }
}
-static void hildon_time_picker_init(HildonTimePicker * picker)
+static void
+hildon_time_picker_get_property( GObject *object, guint param_id,
+ GValue *value, GParamSpec *pspec )
{
- HildonTimePickerPriv *priv;
- GtkDialog *dlg;
- GtkRequisition req;
- PangoFontDescription *font;
- GtkWidget *h_box, *hl_box, *ml_box, *mmain_box, *mup_box, *mmid_box,
- *mdown_box, *w_box, *ampm_box, *event_box, *event_label;
- GtkWidget *hu_img, *hd_img, *mtu_img, *mtd_img, *msu_img, *msd_img;
- GtkSizeGroup *sgroup;
- struct tm *local;
- time_t stamp;
-
- gint px, py;
-
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
-
- priv->ampm_pos_after = TRUE;
- priv->press_button = NULL;
- priv->id = 0;
-
- dlg = GTK_DIALOG (picker);
- gtk_dialog_set_has_separator (dlg, FALSE);
-
- priv->ht_label = gtk_label_new(NULL);
- priv->hs_label = gtk_label_new(NULL);
- priv->mt_label = gtk_label_new(NULL);
- priv->ms_label = gtk_label_new(NULL);
- priv->d_label = gtk_label_new (":");
- priv->ampm_label = gtk_label_new (NULL);
- event_label = gtk_label_new (NULL);
-
-/* +3/+1 -- Hildon specifications --
- * Forcing to the specification pixel cordinates
- */
- px = py = 0;
- gtk_misc_set_padding (GTK_MISC (priv->ht_label), 3, py + 1);
- gtk_misc_set_padding (GTK_MISC (priv->hs_label), 3, py + 1);
-
- gtk_misc_set_padding (GTK_MISC (priv->mt_label), 3, py + 1);
- gtk_misc_set_padding (GTK_MISC (priv->ms_label), 3, py + 1);
-
- gtk_misc_set_padding (GTK_MISC (priv->d_label), 0, py + 1);
-
- priv->h_frame = gtk_frame_new (NULL);
- priv->m_frame = gtk_frame_new (NULL);
- priv->ampm_frame = gtk_frame_new (NULL);
-
- priv->h_ebox = gtk_event_box_new();
- priv->mt_ebox = gtk_event_box_new();
- priv->ms_ebox = gtk_event_box_new();
- priv->ampm_button = gtk_event_box_new();
-
- GTK_WIDGET_SET_FLAGS (priv->h_ebox, GTK_CAN_FOCUS);
- GTK_WIDGET_SET_FLAGS (priv->mt_ebox, GTK_CAN_FOCUS);
- GTK_WIDGET_SET_FLAGS (priv->ms_ebox, GTK_CAN_FOCUS);
- GTK_WIDGET_SET_FLAGS (priv->ampm_button, GTK_CAN_FOCUS);
-
- gtk_widget_set_name (priv->ht_label, "timepickerlabel");
- gtk_widget_set_name (priv->hs_label, "timepickerlabel");
- gtk_widget_set_name (priv->mt_label, "timepickerlabel");
- gtk_widget_set_name (priv->ms_label, "timepickerlabel");
-
- gtk_widget_set_name (priv->h_ebox, "timepickerebox");
- gtk_widget_set_name (priv->mt_ebox, "timepickerebox");
- gtk_widget_set_name (priv->ms_ebox, "timepickerebox");
- gtk_widget_set_name (priv->ampm_button, "timepickerebox");
-
- gtk_widget_set_name (priv->h_frame, "numberframe");
- gtk_widget_set_name (priv->m_frame, "numberframe");
-
- gtk_widget_set_name (priv->ampm_frame, "am_pm_frame");
-
- hl_box = gtk_hbox_new (FALSE, 0);
- ml_box = gtk_hbox_new (FALSE, 0);
- ampm_box = gtk_vbox_new (FALSE, 0);
-
- /* Hour box */
- gtk_box_pack_start (GTK_BOX (hl_box), priv->ht_label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hl_box), priv->hs_label, FALSE, FALSE, 0);
-
- gtk_container_add (GTK_CONTAINER (priv->h_frame), hl_box);
- gtk_container_add (GTK_CONTAINER (priv->h_ebox), priv->h_frame);
-
- /* Minutes box */
- gtk_box_pack_start (GTK_BOX (ml_box), priv->mt_ebox, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (ml_box), priv->ms_ebox, FALSE, FALSE, 0);
-
- gtk_container_add (GTK_CONTAINER (priv->mt_ebox), priv->mt_label);
- gtk_container_add (GTK_CONTAINER (priv->ms_ebox), priv->ms_label);
-
- gtk_container_add (GTK_CONTAINER (priv->m_frame), ml_box);
-
- /* am/pm box */
- gtk_box_pack_start (GTK_BOX (ampm_box), priv->ampm_label, FALSE, FALSE,
- 0);
-
- gtk_container_add (GTK_CONTAINER (priv->ampm_frame), ampm_box);
- gtk_container_add (GTK_CONTAINER (priv->ampm_button), priv->ampm_frame);
-
- /* Check locale settings */
- priv->clock_24h = hildon_time_picker_check_locale (picker);
-
- stamp = time(NULL);
- local = localtime(&stamp);
- hildon_time_picker_set_time(picker, local->tm_hour, local->tm_min);
-
- sgroup = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
-
- priv->h_up = gtk_button_new();
- priv->h_down = gtk_button_new();
- priv->mt_up = gtk_button_new();
- priv->mt_down = gtk_button_new();
- priv->ms_up = gtk_button_new();
- priv->ms_down = gtk_button_new();
-
- hu_img =
- gtk_image_new_from_stock ("hildon-picker-up", HILDON_ICON_SIZE_WIDG);
- hd_img =
- gtk_image_new_from_stock ("hildon-picker-down", HILDON_ICON_SIZE_WIDG);
- mtu_img =
- gtk_image_new_from_stock ("hildon-picker-up", HILDON_ICON_SIZE_WIDG);
- mtd_img =
- gtk_image_new_from_stock ("hildon-picker-down", HILDON_ICON_SIZE_WIDG);
- msu_img =
- gtk_image_new_from_stock ("hildon-picker-up", HILDON_ICON_SIZE_WIDG);
- msd_img =
- gtk_image_new_from_stock ("hildon-picker-down", HILDON_ICON_SIZE_WIDG);
-
- gtk_container_add (GTK_CONTAINER (priv->h_up), hu_img);
- gtk_container_add (GTK_CONTAINER (priv->h_down), hd_img);
- gtk_container_add (GTK_CONTAINER (priv->mt_up), mtu_img);
- gtk_container_add (GTK_CONTAINER (priv->mt_down), mtd_img);
- gtk_container_add (GTK_CONTAINER (priv->ms_up), msu_img);
- gtk_container_add (GTK_CONTAINER (priv->ms_down), msd_img);
-
- gtk_widget_set_name (priv->h_up, "hildon-arrow-item");
- gtk_widget_set_name (priv->h_down, "hildon-arrow-item");
- gtk_widget_set_name (priv->mt_up, "hildon-arrow-item");
- gtk_widget_set_name (priv->mt_down, "hildon-arrow-item");
- gtk_widget_set_name (priv->ms_up, "hildon-arrow-item");
- gtk_widget_set_name (priv->ms_down, "hildon-arrow-item");
-
- h_box = gtk_vbox_new (FALSE, 0);
- mmain_box = gtk_vbox_new (FALSE, 0);
- mup_box = gtk_hbox_new (TRUE, 0);
- mmid_box = gtk_hbox_new (FALSE, 0);
- mdown_box = gtk_hbox_new (TRUE, 0);
- event_box = gtk_vbox_new (FALSE, 0);
- w_box = gtk_hbox_new (FALSE, 0);
-
- /* Add widgets to same group... makes am/pm eventbox look good */
- gtk_size_group_add_widget (sgroup, priv->h_up);
- gtk_size_group_add_widget (sgroup, priv->mt_up);
- gtk_size_group_add_widget (sgroup, priv->ms_up);
- gtk_size_group_add_widget (sgroup, event_label);
-
- gtk_box_pack_start (GTK_BOX (h_box), priv->h_up, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (h_box), priv->h_ebox, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (h_box), priv->h_down, FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (mmain_box), mup_box, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (mmain_box), mmid_box, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (mmain_box), mdown_box, FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (event_box), event_label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (event_box), priv->ampm_button, FALSE, FALSE,
- 0);
-
- gtk_box_pack_start (GTK_BOX (mup_box), priv->mt_up, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (mup_box), priv->ms_up, FALSE, FALSE, 0);
-
- gtk_box_pack_start (GTK_BOX (mmid_box), priv->m_frame, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (mdown_box), priv->mt_down, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (mdown_box), priv->ms_down, FALSE, FALSE, 0);
-
- /* Pack am/pm eventbox before time fields if locale says so */
- if (!priv->clock_24h && !priv->ampm_pos_after)
- gtk_box_pack_start (GTK_BOX (w_box), event_box, FALSE, FALSE, 12);
-
- /* Pack other stuff */
- gtk_box_pack_start (GTK_BOX (w_box), h_box, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (w_box), priv->d_label, FALSE, FALSE, 1);
- gtk_box_pack_start (GTK_BOX (w_box), mmain_box, FALSE, FALSE, 0);
-
- /* Pack am/pm eventbox after time fields if locale says so */
- if (!priv->clock_24h && priv->ampm_pos_after)
- gtk_box_pack_start (GTK_BOX (w_box), event_box, FALSE, FALSE, 12);
-
- gtk_box_pack_start (GTK_BOX (dlg->vbox), w_box, FALSE, FALSE, 0);
-
- gtk_widget_show_all (dlg->vbox);
- gtk_dialog_add_button (dlg, _("ecdg_bd_time_picker_close"),
- GTK_RESPONSE_OK);
-
- g_signal_connect (GTK_OBJECT (priv->h_up), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->h_up), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->h_up), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release), picker);
-
- g_signal_connect (GTK_OBJECT (priv->h_down), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->h_down), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->h_down), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release), picker);
-
- g_signal_connect (GTK_OBJECT (priv->mt_up), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_up), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_up), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release), picker);
-
- g_signal_connect (GTK_OBJECT (priv->mt_down), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_down), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_down), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release), picker);
-
- g_signal_connect (GTK_OBJECT (priv->ms_up), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_up), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_up), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release), picker);
-
- g_signal_connect (GTK_OBJECT (priv->ms_down), "clicked",
- G_CALLBACK (hildon_time_picker_clicked), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_down), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_down), "button-release-event",
- G_CALLBACK (hildon_time_picker_button_release),picker);
-
- g_signal_connect (GTK_OBJECT (priv->h_ebox), "focus-in-event",
- G_CALLBACK (hildon_time_picker_focus_in), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_ebox), "focus-in-event",
- G_CALLBACK (hildon_time_picker_focus_in), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_ebox), "focus-in-event",
- G_CALLBACK (hildon_time_picker_focus_in), picker);
- g_signal_connect (GTK_OBJECT (priv->ampm_button), "focus-in-event",
- G_CALLBACK (hildon_time_picker_focus_in), picker);
-
- g_signal_connect (GTK_OBJECT (priv->h_ebox), "key-press-event",
- G_CALLBACK (hildon_time_picker_key_press), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_ebox), "key-press-event",
- G_CALLBACK (hildon_time_picker_key_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_ebox), "key-press-event",
- G_CALLBACK (hildon_time_picker_key_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ampm_button), "key-press-event",
- G_CALLBACK (hildon_time_picker_key_press), picker);
-
- g_signal_connect (GTK_OBJECT (priv->h_ebox), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->mt_ebox), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ms_ebox), "button-press-event",
- G_CALLBACK (hildon_time_picker_button_press), picker);
- g_signal_connect (GTK_OBJECT (priv->ampm_button), "button-press-event",
- G_CALLBACK (hildon_time_picker_ampm_clicked), picker);
-
- gtk_widget_realize (GTK_WIDGET (dlg));
- gdk_window_set_decorations (GTK_WIDGET (dlg)->window, GDK_DECOR_BORDER);
- gtk_window_set_modal (GTK_WINDOW (dlg), FALSE);
-
- font = pango_font_description_copy (priv->ht_label->style->font_desc);
-
- pango_font_description_set_size (font, 34 * PANGO_SCALE);
- gtk_widget_modify_font (priv->d_label, font);
-
- pango_font_description_set_size (font, 42 * PANGO_SCALE);
- gtk_widget_modify_font (priv->mt_label, font);
- gtk_widget_modify_font (priv->ms_label, font);
- gtk_widget_modify_font (priv->ht_label, font);
- gtk_widget_modify_font (priv->hs_label, font);
-
- gtk_widget_size_request (priv->ht_label, &req);
- req.height += 1;
- gtk_widget_set_size_request (priv->ht_label, req.width, req.height);
-
- gtk_widget_size_request (priv->hs_label, &req);
- req.height += 1;
- gtk_widget_set_size_request (priv->hs_label, req.width, req.height);
-
- gtk_widget_size_request (priv->mt_label, &req);
- req.height += 1;
- gtk_widget_set_size_request (priv->mt_label, req.width, req.height);
-
- gtk_widget_size_request (priv->ms_label, &req);
- req.height += 1;
- gtk_widget_set_size_request (priv->ms_label, req.width, req.height);
-
- pango_font_description_free (font);
-
- gtk_widget_grab_focus (priv->h_ebox);
-
+ HildonTimePickerPrivate *priv = HILDON_TIME_PICKER(object)->priv;
+
+ switch( param_id )
+ {
+ case PROP_MINUTES:
+ g_value_set_uint( value, priv->minutes );
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ break;
+ }
}
static void
-hildon_time_picker_finalize (GObject *obj_self)
+hildon_time_picker_map( GtkWidget *widget )
{
- HildonTimePicker *picker;
- HildonTimePickerPriv *priv;
+ guint width, height;
+ gint i;
+ HildonTimePickerPrivate *priv = HILDON_TIME_PICKER(widget)->priv;
- picker = HILDON_TIME_PICKER (obj_self);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
+ gdk_window_set_decorations( widget->window, GDK_DECOR_BORDER );
- /* free timers */
- if (priv->start_id)
- g_source_remove (priv->start_id);
+ gtk_widget_style_get( widget,
+ "arrow-width", &width,
+ "arrow-height", &height, NULL );
+ for( i=BUTTON_HOURS_UP; i <= BUTTON_LMINUTES_DOWN; i++)
+ gtk_widget_set_size_request( priv->child[i], width, height );
- if (priv->id)
- g_source_remove (priv->id);
+ GTK_WIDGET_CLASS(parent_class)->map( widget );
+}
- g_free (priv->am_symbol);
- g_free (priv->pm_symbol);
- /* Call parent class finalize, if have one */
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize(obj_self);
+static gboolean
+hildon_time_picker_event_box_press( GtkWidget *widget, GdkEventKey *event,
+ gpointer data )
+{
+ gtk_widget_grab_focus( widget );
+ return FALSE;
}
static gboolean
-hildon_time_picker_check_locale(HildonTimePicker *picker)
+hildon_time_picker_ampm_release( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker )
{
- HildonTimePickerPriv *priv;
-
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
-
- /* Now am/pm symbols always contain a copy. Value returned by
- nl_langinfo must not be modified. */
- priv->am_symbol = g_ascii_strdown (nl_langinfo (AM_STR), -1);
- priv->pm_symbol = g_ascii_strdown (nl_langinfo (PM_STR), -1);
-
- if (priv->am_symbol[0] == 0)
- return TRUE;
-
- /* Check what format am/pm time should be */
- if (!strncmp (nl_langinfo (T_FMT_AMPM), "%p", 2))
- priv->ampm_pos_after = FALSE;
-
- return FALSE;
+ gtk_widget_grab_focus( widget );
+ hildon_time_picker_change_time( picker, picker->priv->minutes > 720 ?
+ picker->priv->minutes - 720 :
+ picker->priv->minutes + 720 );
+ return FALSE;
}
static gboolean
-hildon_time_picker_ampm_clicked(GtkWidget *widget, GdkEventButton *event,
- gpointer data)
+hildon_time_picker_arrow_press( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker )
{
- HildonTimePicker *picker;
- HildonTimePickerPriv *priv;
-
- g_return_val_if_fail (widget, FALSE);
- g_return_val_if_fail (data, FALSE);
-
- picker = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
-
- gtk_widget_grab_focus (widget);
- hildon_time_picker_change_ampm_label (picker);
+ HildonTimePickerPrivate *priv = picker->priv;
+ gint newval = 0;
+ if( priv->button_press )
return FALSE;
+
+ priv->start_key_repeat = priv->button_press = TRUE;
+
+ if( widget == priv->child[BUTTON_HOURS_UP] )
+ {
+ priv->mul = 60;
+ gtk_widget_grab_focus( priv->child[EBOX_HOURS] );
+ }
+ else if( widget == priv->child[BUTTON_MMINUTES_UP] )
+ {
+ priv->mul = 10;
+ gtk_widget_grab_focus( priv->child[EBOX_MMINUTES] );
+ }
+ else if( widget == priv->child[BUTTON_LMINUTES_UP] )
+ {
+ priv->mul = 1;
+ gtk_widget_grab_focus( priv->child[EBOX_LMINUTES] );
+ }
+ else if( widget == priv->child[BUTTON_HOURS_DOWN] )
+ {
+ priv->mul = -60;
+ gtk_widget_grab_focus( priv->child[EBOX_HOURS] );
+ }
+ else if( widget == priv->child[BUTTON_MMINUTES_DOWN] )
+ {
+ priv->mul = -10;
+ gtk_widget_grab_focus( priv->child[EBOX_MMINUTES] );
+ }
+ else
+ {
+ priv->mul = -1;
+ gtk_widget_grab_focus( priv->child[EBOX_LMINUTES] );
+ }
+
+ newval = priv->minutes + priv->mul;
+ if( newval < 0 )
+ newval += 1440;
+
+ hildon_time_picker_change_time( picker, newval );
+ priv->timer_id = g_timeout_add( priv->key_repeat * 3, hildon_time_picker_timeout, picker );
+ return FALSE;
}
static gboolean
-hildon_time_picker_change_ampm_label(HildonTimePicker * picker)
+hildon_time_picker_arrow_release( GtkWidget *widget, GdkEvent *event,
+ HildonTimePicker *picker )
{
- HildonTimePickerPriv *priv;
-
- g_return_val_if_fail (picker, FALSE);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (picker);
-
- if (priv->am)
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label), priv->pm_symbol);
- priv->am = FALSE;
- }
- else
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label), priv->am_symbol);
- priv->am = TRUE;
- }
- return TRUE;
+ HildonTimePickerPrivate *priv = picker->priv;
+ if( priv->timer_id )
+ {
+ g_source_remove( priv->timer_id );
+ priv->timer_id = 0;
+ }
+ priv->button_press = FALSE;
+ return FALSE;
}
static gboolean
-hildon_time_picker_key_press (GtkWidget *widget, GdkEventKey *event,
- gpointer data)
+hildon_time_picker_event_box_focus_in( GtkWidget *widget, GdkEvent *event,
+ gpointer data )
{
- HildonTimePicker *tp;
- HildonTimePickerPriv *priv;
+ gtk_widget_set_state( widget, GTK_STATE_SELECTED );
+ return FALSE;
+}
- g_return_val_if_fail (data, FALSE);
- g_return_val_if_fail (event, FALSE);
- g_return_val_if_fail (widget, FALSE);
+static gboolean
+hildon_time_picker_event_box_focus_out( GtkWidget *widget, GdkEvent *event,
+ gpointer data )
+{
+ gtk_widget_set_state( widget, GTK_STATE_NORMAL );
+ return FALSE;
+}
- tp = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (tp);
+static gboolean
+hildon_time_picker_event_box_key_press( GtkWidget *widget, GdkEventKey *event,
+ HildonTimePicker *picker )
+{
+ HildonTimePickerPrivate *priv = picker->priv;
- /* If ESC pressed we should close dialog and not select value */
+ if( priv->timer_id )
+ return TRUE;
- /* We don't want wrap */
- if ((event->keyval == GDK_KP_Left || event->keyval == GDK_Left)
- && (widget == priv->h_ebox))
- {
- return TRUE;
- }
- else if ((event->keyval == GDK_KP_Right || event->keyval == GDK_Right)
- && (widget == priv->ampm_button))
+ switch( event->keyval )
+ {
+ case GDK_Up:
+ if( widget == priv->child[EBOX_HOURS] )
{
- return TRUE;
+ hildon_time_picker_arrow_press( priv->child[BUTTON_HOURS_UP], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_HOURS_UP], GTK_STATE_SELECTED );
}
-
- /* Handle ampm button */
- if ((event->keyval == GDK_Up || event->keyval == GDK_Down)
- && widget == priv->ampm_button)
+ else if( widget == priv->child[EBOX_MMINUTES] )
{
- hildon_time_picker_change_ampm_label (tp);
- return TRUE;
+ hildon_time_picker_arrow_press( priv->child[BUTTON_MMINUTES_UP], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_MMINUTES_UP],
+ GTK_STATE_SELECTED );
}
-
- switch (event->keyval)
- {
- case GDK_Left:
- if (widget == priv->h_ebox)
- gtk_widget_grab_focus (priv->ampm_button);
- else if (widget == priv->ampm_button)
- gtk_widget_grab_focus (priv->ms_ebox);
- else if (widget == priv->ms_ebox)
- gtk_widget_grab_focus (priv->mt_ebox);
- else
- gtk_widget_grab_focus (priv->h_ebox);
-
- return TRUE;
-
- case GDK_Right:
- if (widget == priv->h_ebox)
- gtk_widget_grab_focus (priv->mt_ebox);
- else if (widget == priv->mt_ebox)
- gtk_widget_grab_focus (priv->ms_ebox);
- else if (widget == priv->ms_ebox)
- gtk_widget_grab_focus (priv->ampm_button);
- else
- gtk_widget_grab_focus (priv->h_ebox);
-
- return TRUE;
-
- case GDK_Up:
- if (widget == priv->h_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->h_up), data);
- if (widget == priv->mt_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->mt_up), data);
- if (widget == priv->ms_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->ms_up), data);
-
- return TRUE;
-
- case GDK_Down:
- if (widget == priv->h_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->h_down), data);
- if (widget == priv->mt_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->mt_down), data);
- if (widget == priv->ms_ebox)
- hildon_time_picker_clicked (GTK_BUTTON (priv->ms_down), data);
-
- return TRUE;
-
- case GDK_Escape:
- gtk_dialog_response (GTK_DIALOG (data), GTK_RESPONSE_REJECT);
- return TRUE;
-
- case GDK_KP_Enter:
- case GDK_Return:
- gtk_dialog_response (GTK_DIALOG (data), GTK_RESPONSE_ACCEPT);
- return TRUE;
-
- default:
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-hildon_time_picker_clicked (GtkButton *button, gpointer data)
-{
- gchar new_val[3];
- gint val, tval;
- HildonTimePicker *tp;
- HildonTimePickerPriv *priv;
-
- g_return_if_fail (button);
- g_return_if_fail (data);
-
- tp = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (tp);
-
- if (button == GTK_BUTTON (priv->h_up) ||
- button == GTK_BUTTON (priv->h_down))
+ else if( widget == priv->child[EBOX_LMINUTES] )
{
- hildon_time_picker_handle_hours (button, tp);
+ hildon_time_picker_arrow_press( priv->child[BUTTON_LMINUTES_UP], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_LMINUTES_UP],
+ GTK_STATE_SELECTED );
}
+ else
+ hildon_time_picker_ampm_release( priv->child[EBOX_AMPM], NULL, picker );
+ return TRUE;
- if (button == GTK_BUTTON (priv->mt_up))
+ case GDK_Down:
+ if( widget == priv->child[EBOX_HOURS] )
{
- val = atoi (gtk_label_get_text (GTK_LABEL (priv->mt_label)));
- val++;
- if (val > 5)
- {
- val = 0;
- hildon_time_picker_handle_hours (GTK_BUTTON (priv->h_up), tp);
- }
- sprintf (new_val, "%d", val);
- gtk_label_set_text (GTK_LABEL (priv->mt_label), new_val);
- gtk_widget_grab_focus (priv->mt_ebox);
+ hildon_time_picker_arrow_press( priv->child[BUTTON_HOURS_DOWN], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_HOURS_DOWN],
+ GTK_STATE_SELECTED );
}
-
- if (button == GTK_BUTTON (priv->mt_down))
+ else if( widget == priv->child[EBOX_MMINUTES] )
{
- val = atoi (gtk_label_get_text (GTK_LABEL (priv->mt_label)));
- val--;
-
- if (val < 0)
- {
- val = 5;
- hildon_time_picker_handle_hours (GTK_BUTTON (priv->h_down), tp);
- }
-
- sprintf (new_val, "%d", val);
- gtk_label_set_text (GTK_LABEL (priv->mt_label), new_val);
- gtk_widget_grab_focus (priv->mt_ebox);
+ hildon_time_picker_arrow_press( priv->child[BUTTON_MMINUTES_DOWN], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_MMINUTES_DOWN],
+ GTK_STATE_SELECTED );
}
-
- if (button == GTK_BUTTON (priv->ms_up))
+ else if( widget == priv->child[EBOX_LMINUTES] )
{
- tval = atoi (gtk_label_get_text (GTK_LABEL (priv->mt_label)));
- val = atoi (gtk_label_get_text (GTK_LABEL (priv->ms_label)));
- val++;
-
- if (val > 9)
- {
- val = 0;
- tval++;
-
- if (tval > 5)
- {
- tval = 0;
- hildon_time_picker_handle_hours (GTK_BUTTON (priv->h_up), tp);
- }
- sprintf (new_val, "%d", tval);
- gtk_label_set_text (GTK_LABEL (priv->mt_label), new_val);
- }
-
- sprintf (new_val, "%d", val);
- gtk_label_set_text (GTK_LABEL (priv->ms_label), new_val);
- gtk_widget_grab_focus (priv->ms_ebox);
+ hildon_time_picker_arrow_press( priv->child[BUTTON_LMINUTES_DOWN], NULL,
+ picker );
+ gtk_widget_set_state( priv->child[BUTTON_LMINUTES_DOWN],
+ GTK_STATE_SELECTED );
}
+ else
+ hildon_time_picker_ampm_release( priv->child[EBOX_AMPM], NULL, picker );
+ return TRUE;
- if (button == GTK_BUTTON (priv->ms_down))
+ case GDK_Left:
+ if( priv->c12h )
{
- tval = atoi(gtk_label_get_text (GTK_LABEL (priv->mt_label)));
- val = atoi(gtk_label_get_text (GTK_LABEL (priv->ms_label)));
- val--;
-
- if (val < 0)
- {
- val = 9;
- tval--;
-
- if (tval < 0)
- {
- tval = 5;
- hildon_time_picker_handle_hours (GTK_BUTTON (priv->h_down),
- tp);
- }
- sprintf (new_val, "%d", tval);
- gtk_label_set_text (GTK_LABEL (priv->mt_label), new_val);
- }
-
- sprintf (new_val, "%d", val);
- gtk_label_set_text (GTK_LABEL (priv->ms_label), new_val);
- gtk_widget_grab_focus (priv->ms_ebox);
+ if( !priv->ampm_pos )
+ {
+ if( widget == priv->child[EBOX_AMPM] )
+ return TRUE;
+ }
+ else if( widget == priv->child[EBOX_HOURS] )
+ return TRUE;
}
-}
-
-static void
-hildon_time_picker_handle_hours (GtkButton *button, HildonTimePicker *tp)
-{
- gchar new_val[3];
- gint val;
- HildonTimePickerPriv *priv;
-
- g_return_if_fail (button);
+ else if( widget == priv->child[EBOX_HOURS] )
+ return TRUE;
- priv = HILDON_TIME_PICKER_GET_PRIVATE (tp);
+ break;
- if (button == GTK_BUTTON (priv->h_up))
+ case GDK_Right:
+ if( priv->c12h )
{
- val = 10 * atoi (gtk_label_get_text (GTK_LABEL (priv->ht_label))) +
- atoi (gtk_label_get_text (GTK_LABEL (priv->hs_label)));
- val++;
-
- if (priv->clock_24h && val > 23)
- val = 0;
- else if (!priv->clock_24h && val == 12 && priv->am)
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label),
- priv->pm_symbol);
- priv->am = FALSE;
- }
- else if (!priv->clock_24h && val == 12 && !priv->am)
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label),
- priv->am_symbol);
- priv->am = TRUE;
- }
- else if (!priv->clock_24h && val > 12)
- val = 1;
-
- sprintf (new_val, "%02d", val);
- gtk_label_set_text (GTK_LABEL (priv->hs_label), &new_val[1]);
- new_val[1] = '\0';
- gtk_label_set_text (GTK_LABEL (priv->ht_label), new_val);
- gtk_widget_grab_focus (priv->h_ebox);
+ if( priv->ampm_pos )
+ {
+ if( widget == priv->child[EBOX_AMPM] )
+ return TRUE;
+ }
+ else if( widget == priv->child[EBOX_LMINUTES] )
+ return TRUE;
}
+ else if( widget == priv->child[EBOX_LMINUTES] )
+ return TRUE;
+ break;
+
+ case GDK_Escape:
+ gtk_dialog_response (GTK_DIALOG (picker), GTK_RESPONSE_CANCEL);
+ return TRUE;
- if (button == GTK_BUTTON (priv->h_down))
- {
- val = 10 * atoi (gtk_label_get_text (GTK_LABEL (priv->ht_label))) +
- atoi (gtk_label_get_text (GTK_LABEL (priv->hs_label)));
- val--;
-
- if (priv->clock_24h && val < 0)
- val = 23;
- else if (!priv->clock_24h && val == 11 && priv->am)
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label),
- priv->pm_symbol);
- priv->am = FALSE;
- }
- else if (!priv->clock_24h && val == 11 && !priv->am)
- {
- gtk_label_set_text (GTK_LABEL (priv->ampm_label),
- priv->am_symbol);
- priv->am = TRUE;
- }
- else if (!priv->clock_24h && val < 1)
- val = 12;
-
- sprintf (new_val, "%02d", val);
- gtk_label_set_text (GTK_LABEL (priv->hs_label), &new_val[1]);
- new_val[1] = '\0';
- gtk_label_set_text (GTK_LABEL (priv->ht_label), new_val);
- gtk_widget_grab_focus (priv->h_ebox);
- }
-}
+ case GDK_Return:
+ gtk_dialog_response (GTK_DIALOG (picker), GTK_RESPONSE_OK);
+ return TRUE;
+ }
-static void
-hildon_time_picker_add_style (void)
-{
- gtk_rc_parse_string (" style \"hildon-arrow-item\" {"
- " xthickness = 0"
- " ythickness = 0"
- " engine \"pixmap\" {"
- " image {"
- " function = BOX"
- " }"
- " }"
- " }"
- " widget \"*.hildon-arrow-item\""
- " style \"hildon-arrow-item\"");
+ return FALSE;
}
static gboolean
-hildon_time_picker_timeout (gpointer data)
+hildon_time_picker_event_box_key_release( GtkWidget *widget, GdkEventKey *event,
+ HildonTimePicker *picker )
{
- HildonTimePicker *p;
- HildonTimePickerPriv *priv;
- GtkWidget *b;
-
- if (!data)
- return FALSE;
-
- p = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (p);
-
- b = priv->press_button;
-
- if (b)
- {
- hildon_time_picker_clicked (GTK_BUTTON(b), data);
- return TRUE;
- }
-
- priv->id = 0;
- return FALSE;
+ gint i;
+
+ switch( event->keyval )
+ {
+ case GDK_Up:
+ for( i = BUTTON_HOURS_UP; i <= BUTTON_LMINUTES_UP; i += 2 )
+ gtk_widget_set_state( picker->priv->child[i], GTK_STATE_NORMAL );
+ hildon_time_picker_arrow_release( widget, NULL, picker );
+ break;
+
+ case GDK_Down:
+ for( i = BUTTON_HOURS_DOWN; i <= BUTTON_LMINUTES_DOWN; i += 2 )
+ gtk_widget_set_state( picker->priv->child[i], GTK_STATE_NORMAL );
+ hildon_time_picker_arrow_release( widget, NULL, picker );
+ break;
+ }
+ return FALSE;
}
static gboolean
-hildon_time_picker_start_timer (gpointer data)
+hildon_time_picker_timeout( gpointer data )
{
- HildonTimePicker *p;
- HildonTimePickerPriv *priv;
- GtkSettings *settings;
- guint interval;
+ HildonTimePicker *picker = NULL;
+ HildonTimePickerPrivate *priv = NULL;
+ gint newval = 0;
- if (!data)
- return FALSE;
+ if( !data )
+ return FALSE;
- p = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (p);
+ picker = HILDON_TIME_PICKER(data);
+ priv = picker->priv;
- settings = gtk_settings_get_default();
- g_object_get (settings, "gtk-update-timeout", &interval, NULL);
+ if( !picker->priv->timer_id )
+ return FALSE;
- if ((priv->press_button) && (priv->id == 0))
- priv->id = g_timeout_add (interval, hildon_time_picker_timeout, data);
+ newval = priv->minutes + priv->mul;
+ if( newval < 0 )
+ newval += 1440;
- priv->start_id = 0;
+ hildon_time_picker_change_time( picker, newval );
+ if( priv->start_key_repeat )
+ {
+ priv->timer_id = g_timeout_add( priv->key_repeat, hildon_time_picker_timeout, picker );
+ priv->start_key_repeat = FALSE;
return FALSE;
-}
+ }
-static gboolean
-hildon_time_picker_button_press (GtkWidget *widget, GdkEventButton *event,
- gpointer data)
-{
- HildonTimePicker *p;
- HildonTimePickerPriv *priv;
+ return TRUE;
+}
- g_return_val_if_fail (widget, FALSE);
- g_return_val_if_fail (data, FALSE);
- p = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (p);
- if ((widget == priv->h_ebox) || (widget == priv->ms_ebox) ||
- (widget == priv->mt_ebox))
- {
- gtk_widget_grab_focus(widget);
- return FALSE;
- }
+static void
+hildon_time_picker_change_time( HildonTimePicker *picker, guint minutes )
+{
+ HildonTimePickerPrivate *priv = picker->priv;
+ gchar str[3] = "00";
+ guint hours = 0;
+ gboolean ampm = TRUE;
- if ((widget == priv->h_up) || (widget == priv->h_down)
- || (widget == priv->mt_up) || (widget == priv->mt_down)
- || (widget == priv->ms_up) || (priv->ms_down))
- {
- GtkSettings *settings;
- guint interval;
+ minutes %= 1440;
- settings = gtk_settings_get_default();
- g_object_get (settings, "gtk-initial-timeout", &interval, NULL);
+ if( priv->minutes == minutes )
+ return;
- priv->press_button = widget;
- if (priv->start_id != 0)
- g_source_remove (priv->start_id);
- priv->start_id =
- g_timeout_add (interval, hildon_time_picker_start_timer, data);
- }
+ priv->minutes = minutes;
- if ((widget == priv->h_up) || (widget == priv->h_down))
- gtk_widget_grab_focus (priv->h_ebox);
- else if ((widget == priv->mt_up) || (widget == priv->mt_down))
- gtk_widget_grab_focus (priv->mt_ebox);
- else if ((widget == priv->ms_up) || (widget == priv->ms_down))
- gtk_widget_grab_focus (priv->ms_ebox);
+ if( priv->c12h )
+ {
+ ampm = !((guint)(minutes / 720));
+ minutes %= 720;
+ if( minutes < 60 )
+ minutes += 720;
- return FALSE;
-}
+ gtk_label_set_text( GTK_LABEL(priv->child[LABEL_AMPM]),
+ ampm ? priv->am_symbol : priv->pm_symbol );
+ }
-static gboolean
-hildon_time_picker_button_release (GtkWidget *widget, GdkEventButton *event,
- gpointer data)
-{
- HildonTimePicker *p;
- HildonTimePickerPriv *priv;
+ hours = minutes / 60;
+ minutes %= 60;
- g_return_val_if_fail (widget, FALSE);
- g_return_val_if_fail (data, FALSE);
+ sprintf( str, "%02d", hours );
+ gtk_label_set_text( GTK_LABEL(priv->child[LABEL_HOURS]), str );
- p = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE( p);
+ sprintf( str, "%02d", minutes );
+ gtk_label_set_text( GTK_LABEL(priv->child[LABEL_LMINUTES]), &str[1] );
- /* Setting this to NULL will result hanler to fail and return FALSE.
- Timeout will be removed if FALSE is returned. */
- priv->press_button = NULL;
+ str[1] = '\0';
+ gtk_label_set_text( GTK_LABEL(priv->child[LABEL_MMINUTES]), &str[0] );
- return FALSE;
+ g_object_notify( G_OBJECT(picker), "minutes" );
}
-static gboolean
-hildon_time_picker_focus_in (GtkWidget *widget, GdkEventFocus *event,
- gpointer data)
+/**
+ * hildon_time_picker_new:
+ * @parent: parent window.
+ *
+ * Hildon Time Picker shows time picker dialog. Close button is placed
+ * in dialog's action area and time picker is placed in dialogs vbox.
+ * Actual time picker consists two #GtkLabel fields one for hour and
+ * one for minutes, arrow buttons and an AM/PM button. A : is placed
+ * between hour and minute fields.
+ *
+ * Return value: pointer to a new #HildonTimePicker widget.
+ **/
+GtkWidget *hildon_time_picker_new( GtkWindow *parent )
{
- HildonTimePicker *p;
- HildonTimePickerPriv *priv;
+ GtkWidget *widget = g_object_new( HILDON_TYPE_TIME_PICKER, NULL );
- g_return_val_if_fail (widget, FALSE);
- g_return_val_if_fail (data, FALSE);
+ if( parent )
+ gtk_window_set_transient_for( GTK_WINDOW(widget), parent );
- p = HILDON_TIME_PICKER (data);
- priv = HILDON_TIME_PICKER_GET_PRIVATE (p);
+ return GTK_WIDGET(widget);
+}
- if (widget == priv->h_ebox)
- {
- gtk_widget_set_state (priv->h_ebox, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->ht_label, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->hs_label, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->mt_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_button, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_label, GTK_STATE_NORMAL);
- }
- if (widget == priv->mt_ebox)
- {
- gtk_widget_set_state (priv->h_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ht_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->hs_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_ebox, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->ms_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_label, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->ms_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_button, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_label, GTK_STATE_NORMAL);
- }
- if (widget == priv->ms_ebox)
- {
- gtk_widget_set_state (priv->h_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ht_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->hs_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_ebox, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->mt_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_label, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->ampm_button, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_label, GTK_STATE_NORMAL);
- }
- if (widget == priv->ampm_button)
- {
- gtk_widget_set_state (priv->h_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ht_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->hs_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_ebox, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->mt_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ms_label, GTK_STATE_NORMAL);
- gtk_widget_set_state (priv->ampm_button, GTK_STATE_SELECTED);
- gtk_widget_set_state (priv->ampm_label, GTK_STATE_SELECTED);
- }
+/**
+ * hildon_time_picker_set_time:
+ * @picker: the #HildonTimePicker widget.
+ * @hours: hours
+ * @minutes: minutes
+ *
+ * Sets the time of the #HildonTimePicker widget.
+ **/
+void hildon_time_picker_set_time( HildonTimePicker *picker,
+ guint hours, guint minutes )
+{
+ g_return_if_fail( HILDON_IS_TIME_PICKER(picker) );
+ hildon_time_picker_change_time( picker, hours * 60 + minutes );
+}
- return FALSE;
+/**
+ * hildon_time_picker_get_time:
+ * @picker: the #HildonTimePicker widget.
+ * @hours: hours
+ * @minutes: minutes
+ *
+ * Gets the time of the #HildonTimePicker widget.
+ **/
+void hildon_time_picker_get_time( HildonTimePicker *picker,
+ guint *hours, guint *minutes )
+{
+ guint current;
+ g_return_if_fail( HILDON_IS_TIME_PICKER(picker) );
+
+ current = picker->priv->minutes;
+ *hours = current / 60;
+ *minutes = current % 60;
}