Port to master of commit aa843e2.. from Aleksander Chumakov:
[modest] / src / hildon2 / modest-selector-picker.c
index 7011653..d72e4b3 100644 (file)
@@ -32,6 +32,8 @@
 #include <gtk/gtkliststore.h>
 #include "modest-selector-picker.h"
 
+#define TOUCH_SELECTOR_PICKER "calling-picker"
+
 /* 'private'/'protected' functions */
 static void modest_selector_picker_class_init (ModestSelectorPickerClass *klass);
 static void modest_selector_picker_init       (ModestSelectorPicker *obj);
@@ -46,7 +48,9 @@ enum {
 typedef struct _ModestSelectorPickerPrivate ModestSelectorPickerPrivate;
 struct _ModestSelectorPickerPrivate {
        GEqualFunc id_equal_func;
-       
+
+       gint value_max_chars;
+       gboolean center_aligned;
 };
 #define MODEST_SELECTOR_PICKER_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                                                MODEST_TYPE_SELECTOR_PICKER, \
@@ -104,16 +108,34 @@ modest_selector_picker_finalize (GObject *obj)
 }
 
 static gchar *
-touch_selector_print_func (HildonTouchSelector *selector)
+touch_selector_print_func (HildonTouchSelector *selector, gpointer userdata)
 {
        GtkTreeIter iter;
+       ModestSelectorPicker *picker;
+
+       picker = MODEST_SELECTOR_PICKER (g_object_get_data (G_OBJECT (selector), TOUCH_SELECTOR_PICKER));
+       g_return_val_if_fail (MODEST_IS_SELECTOR_PICKER (picker), NULL);
        if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (selector), 0, &iter)) {
                GtkTreeModel *model;
+               ModestSelectorPickerPrivate *priv;
                GValue value = {0,};
                
+               priv = MODEST_SELECTOR_PICKER_GET_PRIVATE (picker);
                model = hildon_touch_selector_get_model (HILDON_TOUCH_SELECTOR (selector), 0);
                gtk_tree_model_get_value (model, &iter, COLUMN_DISPLAY_NAME, &value);
-               return g_value_dup_string (&value);
+               if (priv->value_max_chars == -1) {
+                       return g_value_dup_string (&value);
+               } else {
+                       const gchar *str;
+                       str = g_value_get_string (&value);
+                       if (g_utf8_strlen (str, -1) > priv->value_max_chars) {
+                               const gchar *end;
+                               end = g_utf8_offset_to_pointer (str, priv->value_max_chars);
+                               return g_strndup (str, end - str);
+                       } else {
+                               return g_strdup (str);
+                       }
+               }
        }
        return NULL;
 }
@@ -142,20 +164,27 @@ get_model (ModestPairList *pairs)
 }
 
 static GtkWidget *
-create_touch_selector (GtkTreeModel *model)
+create_touch_selector (ModestSelectorPicker *self, GtkTreeModel *model)
 {
        GtkCellRenderer *renderer;
        GtkWidget *selector;
+       ModestSelectorPickerPrivate *priv;
 
        renderer = gtk_cell_renderer_text_new ();
        g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 
+       priv = MODEST_SELECTOR_PICKER_GET_PRIVATE(self);
+       if (priv->center_aligned) {
+               g_object_set (G_OBJECT (renderer), "alignment", PANGO_ALIGN_CENTER, NULL);
+       }
+
        selector = hildon_touch_selector_new ();
        hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL (model),
                                             renderer, "text", COLUMN_DISPLAY_NAME, NULL);
 
        hildon_touch_selector_set_model (HILDON_TOUCH_SELECTOR(selector), 0, model);
-       hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), touch_selector_print_func);
+       g_object_set_data (G_OBJECT (selector), TOUCH_SELECTOR_PICKER, (gpointer) self);
+       hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), (HildonTouchSelectorPrintFunc) touch_selector_print_func);
 
        return selector;
 }
@@ -169,9 +198,9 @@ modest_selector_picker_set_pair_list (ModestSelectorPicker *self, ModestPairList
 
        model = get_model (pairs);
 
-       selector = create_touch_selector (model);       
-       gtk_tree_model_get_iter_first (GTK_TREE_MODEL(model), &iter);
-       hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0, &iter, TRUE);
+       selector = create_touch_selector (self, model);
+       if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(model), &iter))
+               hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0, &iter, TRUE);
        g_object_unref (model);
 
        hildon_picker_button_set_selector (HILDON_PICKER_BUTTON (self), HILDON_TOUCH_SELECTOR (selector));
@@ -180,7 +209,10 @@ modest_selector_picker_set_pair_list (ModestSelectorPicker *self, ModestPairList
 
 
 GtkWidget*
-modest_selector_picker_new (ModestPairList *pairs, GEqualFunc id_equal_func)
+modest_selector_picker_new (HildonSizeType size,
+                           HildonButtonArrangement arrangement,
+                           ModestPairList *pairs, GEqualFunc id_equal_func,
+                           gboolean center_aligned)
 {
        GtkTreeModel *model;
        GObject *obj;
@@ -188,16 +220,19 @@ modest_selector_picker_new (ModestPairList *pairs, GEqualFunc id_equal_func)
        GtkTreeIter iter;
 
        obj  = G_OBJECT(g_object_new(MODEST_TYPE_SELECTOR_PICKER,
-                                    "size", HILDON_SIZE_AUTO,
-                                    "arrangement", HILDON_BUTTON_ARRANGEMENT_VERTICAL,
+                                    "size", size,
+                                    "arrangement", arrangement,
                                     NULL));
+
        priv = MODEST_SELECTOR_PICKER_GET_PRIVATE(obj);
+       priv->value_max_chars = -1;
+       priv->center_aligned = center_aligned;
        
        model = get_model (pairs);
        if (model) {
                GtkWidget *selector;
 
-               selector = create_touch_selector (model);
+               selector = create_touch_selector (MODEST_SELECTOR_PICKER (obj), model);
                if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter)) {
                        hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (selector), 0, &iter, TRUE);
                }
@@ -210,7 +245,10 @@ modest_selector_picker_new (ModestPairList *pairs, GEqualFunc id_equal_func)
                priv->id_equal_func = id_equal_func;
        else
                priv->id_equal_func = g_direct_equal; /* compare the ptr values */
-       
+
+       /* For theming purpouses. Widget name must end in Button-finger */
+       gtk_widget_set_name ((GtkWidget *) obj, "ModestSelectorPickerButton-finger");
+
        return GTK_WIDGET(obj);
 }
 
@@ -298,3 +336,32 @@ modest_selector_picker_get_active_display_name (ModestSelectorPicker *self)
 
        return retval;
 }
+
+void
+modest_selector_picker_set_value_max_chars (ModestSelectorPicker *self, 
+                                           gint value_max_chars)
+{
+       ModestSelectorPickerPrivate *priv;
+
+       g_return_if_fail (self);
+       priv = MODEST_SELECTOR_PICKER_GET_PRIVATE(self);
+
+       if (value_max_chars != priv->value_max_chars) {
+               GtkWidget *selector;
+
+               priv->value_max_chars = value_max_chars;
+               selector = GTK_WIDGET (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (self)));
+               hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (selector), (HildonTouchSelectorPrintFunc) touch_selector_print_func);
+       }
+}
+
+gint
+modest_selector_picker_get_value_max_chars (ModestSelectorPicker *self)
+{
+       ModestSelectorPickerPrivate *priv;
+       g_return_val_if_fail (self, -1);
+
+       priv = MODEST_SELECTOR_PICKER_GET_PRIVATE(self);
+
+       return priv->value_max_chars;
+}