X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-combo-box.c;h=e44aef1d264ea92f56eabb4b93f8cc0de33d76b4;hb=c5637dfb0beccca9e090c874336a387277433ab6;hp=3132d1a471a3e69c3fcf749397ef2afc9f9a5d97;hpb=9ad90e9053e1e0cc87885f714f513061ac734632;p=modest diff --git a/src/widgets/modest-combo-box.c b/src/widgets/modest-combo-box.c index 3132d1a..e44aef1 100644 --- a/src/widgets/modest-combo-box.c +++ b/src/widgets/modest-combo-box.c @@ -27,7 +27,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - +#include +#include +#include #include "modest-combo-box.h" /* 'private'/'protected' functions */ @@ -50,8 +52,8 @@ enum { typedef struct _ModestComboBoxPrivate ModestComboBoxPrivate; struct _ModestComboBoxPrivate { - /* my private members go here, eg. */ - /* gboolean frobnicate_mode; */ + GEqualFunc id_equal_func; + }; #define MODEST_COMBO_BOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_COMBO_BOX, \ @@ -79,7 +81,7 @@ modest_combo_box_get_type (void) (GInstanceInitFunc) modest_combo_box_init, NULL }; - my_type = g_type_register_static (G_TYPE_OBJECT, + my_type = g_type_register_static (GTK_TYPE_COMBO_BOX, "ModestComboBox", &my_info, 0); } @@ -123,7 +125,7 @@ modest_combo_box_finalize (GObject *obj) } static GtkTreeModel* -get_model (const GSList *pairs) +get_model (const ModestPairList *pairs) { GtkTreeIter iter; GtkListStore *store; @@ -147,55 +149,117 @@ get_model (const GSList *pairs) GtkWidget* -modest_combo_box_new (const GSList *pairs) +modest_combo_box_new (const ModestPairList *pairs, GEqualFunc id_equal_func) { GtkTreeModel *model; GtkCellRenderer *renderer; GObject *obj; + ModestComboBoxPrivate *priv; + g_return_val_if_fail (pairs, NULL); + obj = G_OBJECT(g_object_new(MODEST_TYPE_COMBO_BOX, NULL)); - + priv = MODEST_COMBO_BOX_GET_PRIVATE(obj); + model = get_model (pairs); - if (model) { gtk_combo_box_set_model (GTK_COMBO_BOX(obj), model); g_object_unref (model); gtk_cell_layout_clear (GTK_CELL_LAYOUT(obj)); renderer = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(obj), - renderer, FALSE); + renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(obj), renderer, "text", COLUMN_DISPLAY_NAME, NULL); } + + gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 0); + + if (id_equal_func) + priv->id_equal_func = id_equal_func; + else + priv->id_equal_func = g_direct_equal; /* compare the ptr values */ return GTK_WIDGET(obj); } -gpointer -modest_combo_box_get_active_id (ModestComboBox *self) +static void +get_active (ModestComboBox *self, GValue *val, gint column) { GtkTreeIter iter; - gpointer retval; - - g_return_val_if_fail (self, NULL); + g_return_if_fail (self); - if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX(self), &iter)) - retval = NULL; /* nothing found */ - else { + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(self), &iter)) { GtkTreeModel *model; - GValue val; model = gtk_combo_box_get_model (GTK_COMBO_BOX(self)); + gtk_tree_model_get_value (model, &iter, column, val); + } +} - g_value_init (&val, G_TYPE_POINTER); - gtk_tree_model_get_value (model, &iter, COLUMN_ID, &val); +gpointer +modest_combo_box_get_active_id (ModestComboBox *self) +{ + GValue val = {0,}; + gpointer retval; + + g_return_val_if_fail (self, NULL); + + /* Do not unset the GValue */ + get_active (self, &val, COLUMN_ID); + retval = g_value_peek_pointer (&val); - retval = g_value_get_pointer (&val); - g_value_unset (&val); - } return retval; } + + +void +modest_combo_box_set_active_id (ModestComboBox *self, gpointer id) +{ + GtkTreeModel *model; + GtkTreeIter iter; + ModestComboBoxPrivate *priv; + gboolean found = FALSE; + + g_return_if_fail (self); + + priv = MODEST_COMBO_BOX_GET_PRIVATE(self); + + model = gtk_combo_box_get_model (GTK_COMBO_BOX(self)); + if (!gtk_tree_model_get_iter_first (model, &iter)) + return; /* empty list */ + + do { + gpointer row_id; + gtk_tree_model_get (model, &iter, COLUMN_ID, &row_id, -1); + if ((priv->id_equal_func)(id, row_id) == 0) { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX(self), &iter); + found = TRUE; + } + } while (!found && gtk_tree_model_iter_next (model, &iter)); + + if (!found) + g_printerr ("modest: could not set the active id\n"); +} + + + +const gchar* +modest_combo_box_get_active_display_name (ModestComboBox *self) +{ + GValue val = {0,}; + gpointer retval; + + g_return_val_if_fail (self, NULL); + + /* Do not unset the GValue */ + get_active (self, &val, COLUMN_DISPLAY_NAME); + retval = g_value_peek_pointer (&val); + + return (gchar*) retval; +}