X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-combo-box.c;h=8956df873694b7cc0e4ebff278d393136c0a74c4;hp=3132d1a471a3e69c3fcf749397ef2afc9f9a5d97;hb=46a234c81bceecac16ac22ae3f281b79247d46f7;hpb=9ad90e9053e1e0cc87885f714f513061ac734632 diff --git a/src/widgets/modest-combo-box.c b/src/widgets/modest-combo-box.c index 3132d1a..8956df8 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,11 +125,11 @@ modest_combo_box_finalize (GObject *obj) } static GtkTreeModel* -get_model (const GSList *pairs) +get_model (ModestPairList *pairs) { GtkTreeIter iter; GtkListStore *store; - const GSList *cursor; + GSList *cursor; store = gtk_list_store_new (2, G_TYPE_POINTER, /* the id */ @@ -147,55 +149,115 @@ get_model (const GSList *pairs) GtkWidget* -modest_combo_box_new (const GSList *pairs) +modest_combo_box_new (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,}; + + g_return_val_if_fail (self, NULL); + + /* Do not unset the GValue */ + get_active (self, &val, COLUMN_ID); + + return g_value_get_pointer (&val); +} + + +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)) { + 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) +{ + const GValue val = {0,}; + const gchar *retval; + + g_return_val_if_fail (self, NULL); + + /* Do not unset the GValue */ + get_active (self, (GValue *)&val, COLUMN_DISPLAY_NAME); + retval = g_value_get_string (&val); - retval = g_value_get_pointer (&val); - g_value_unset (&val); - } return retval; }