X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-combo-box.c;h=810e02f59694cc6246f59b9f2b760136eadc5b26;hp=bfe58f5df591a2fcda3e569fb3cfadcb9741a53b;hb=HEAD;hpb=8885ff625adf8c47b51e306b1d9a9ae4c8bb8d67 diff --git a/src/widgets/modest-combo-box.c b/src/widgets/modest-combo-box.c index bfe58f5..810e02f 100644 --- a/src/widgets/modest-combo-box.c +++ b/src/widgets/modest-combo-box.c @@ -27,9 +27,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include +#include #include "modest-combo-box.h" /* 'private'/'protected' functions */ @@ -52,8 +50,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, \ @@ -125,11 +123,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,32 +145,54 @@ get_model (const GSList *pairs) return GTK_TREE_MODEL (store); } +void +modest_combo_box_set_pair_list (ModestComboBox *combo, ModestPairList *pairs) +{ + GtkTreeModel *model; + + model = get_model (pairs); + + gtk_combo_box_set_model (GTK_COMBO_BOX(combo), model); + g_object_unref (model); + + gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0); +} + + 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; 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); } @@ -182,7 +202,6 @@ static void get_active (ModestComboBox *self, GValue *val, gint column) { GtkTreeIter iter; - g_return_if_fail (self); if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX(self), &iter)) { @@ -196,27 +215,59 @@ get_active (ModestComboBox *self, GValue *val, gint column) gpointer modest_combo_box_get_active_id (ModestComboBox *self) { - g_return_val_if_fail (self, NULL); 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); - return retval; + return g_value_get_pointer (&val); } -gpointer + +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); - GValue val = {0,}; - gpointer retval; /* Do not unset the GValue */ - get_active (self, &val, COLUMN_DISPLAY_NAME); - retval = g_value_peek_pointer (&val); + get_active (self, (GValue *)&val, COLUMN_DISPLAY_NAME); + retval = g_value_get_string (&val); return retval; }