From 48780131a32188263501c094bff8afcbc687e189 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Tue, 25 Oct 2011 21:25:50 +0000 Subject: When implementing labels in TrgDestinationCombo, I somehow overlooked the fact that I made it no longer editable and some work would be needed to make it actually send the directory and not the label. Fixed, I have some more ideas for this widget though. --- src/trg-destination-combo.c | 123 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 97 insertions(+), 26 deletions(-) (limited to 'src/trg-destination-combo.c') diff --git a/src/trg-destination-combo.c b/src/trg-destination-combo.c index 33acfb6..ff35325 100644 --- a/src/trg-destination-combo.c +++ b/src/trg-destination-combo.c @@ -40,6 +40,14 @@ enum { PROP_0, PROP_CLIENT }; +enum { + DEST_DEFAULT, DEST_LABEL, DEST_EXISTING +}; + +enum { + DEST_COLUMN_LABEL, DEST_COLUMN_DIR, DEST_COLUMN_TYPE, N_DEST_COLUMNS +}; + static void trg_destination_combo_get_property(GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { TrgDestinationComboPrivate *priv = @@ -80,6 +88,61 @@ static gboolean g_slist_str_set_add(GSList ** list, const gchar * string) { return TRUE; } +/*static void trg_destination_combo_entry_changed(GtkEntry *entry, + gpointer user_data) { + GtkComboBox *combo = GTK_COMBO_BOX(user_data); + GtkTreeIter iter; + + if (gtk_combo_box_get_active_iter(combo, &iter)) { + GtkTreeModel *model = gtk_combo_box_get_model(combo); + const gchar *text = gtk_entry_get_text(entry); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, DEST_COLUMN_DIR, text, + DEST_COLUMN_LABEL, text, -1); + } + }*/ + +static void gtk_combo_box_entry_active_changed(GtkComboBox *combo_box, + gpointer user_data) { + GtkTreeModel *model; + GtkTreeIter iter; + gboolean editableEntry = TRUE; + + if (gtk_combo_box_get_active_iter(combo_box, &iter)) { + GtkEntry *entry = trg_destination_combo_get_entry( + TRG_DESTINATION_COMBO(combo_box)); + + if (entry) { + GValue value = { 0, }; + guint type; + + model = gtk_combo_box_get_model(combo_box); + + gtk_tree_model_get_value(model, &iter, DEST_COLUMN_LABEL, &value); + gtk_tree_model_get(model, &iter, DEST_COLUMN_TYPE, &type, -1); + + g_object_set_property(G_OBJECT (entry), "text", &value); + g_value_unset(&value); + + if (type == DEST_LABEL) + editableEntry = FALSE; + } + } + + gtk_entry_set_editable( + trg_destination_combo_get_entry(TRG_DESTINATION_COMBO(combo_box)), + editableEntry); +} + +gboolean trg_destination_combo_has_text(TrgDestinationCombo *combo) { + const gchar *text = gtk_entry_get_text( + trg_destination_combo_get_entry(TRG_DESTINATION_COMBO(combo))); + return strlen(text) > 0; +} + +GtkEntry *trg_destination_combo_get_entry(TrgDestinationCombo *combo) { + return GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo))); +} + static GObject *trg_destination_combo_constructor(GType type, guint n_construct_properties, GObjectConstructParam * construct_params) { GObject *object = G_OBJECT_CLASS @@ -90,11 +153,8 @@ static GObject *trg_destination_combo_constructor(GType type, TrgClient *client = priv->client; TrgPrefs *prefs = trg_client_get_prefs(client); - GSList *dirs = NULL; - GSList *sli; - GList *li; - GList *list; - GtkCellRenderer *renderer; + GSList *dirs = NULL, *sli; + GList *li, *list; GtkTreeRowReference *rr; GtkTreeModel *model; GtkTreePath *path; @@ -102,16 +162,16 @@ static GObject *trg_destination_combo_constructor(GType type, JsonArray *saved_destinations; JsonObject *t; gchar *defaultDir; - gchar *defaultLabel; - comboModel = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + comboModel = gtk_list_store_new(N_DEST_COLUMNS, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_UINT); defaultDir = g_strdup( session_get_download_dir(trg_client_get_session(client))); rm_trailing_slashes(defaultDir); - defaultLabel = g_strdup_printf(_("Default - %s"), defaultDir); - gtk_list_store_insert_with_values(comboModel, NULL, INT_MAX, 0, - defaultLabel, 1, defaultDir, -1); + gtk_list_store_insert_with_values(comboModel, NULL, INT_MAX, + DEST_COLUMN_LABEL, defaultDir, DEST_COLUMN_DIR, defaultDir, + DEST_COLUMN_TYPE, DEST_DEFAULT, -1); saved_destinations = trg_prefs_get_array(prefs, TRG_PREFS_KEY_DESTINATIONS, TRG_PREFS_CONNECTION); @@ -124,12 +184,13 @@ static GObject *trg_destination_combo_constructor(GType type, comboModel, NULL, INT_MAX, - 0, + DEST_COLUMN_LABEL, json_object_get_string_member(obj, TRG_PREFS_SUBKEY_LABEL), - 1, + DEST_COLUMN_DIR, json_object_get_string_member(obj, - TRG_PREFS_KEY_DESTINATIONS_SUBKEY_DIR), -1); + TRG_PREFS_KEY_DESTINATIONS_SUBKEY_DIR), + DEST_COLUMN_TYPE, DEST_LABEL, -1); } g_list_free(list); } @@ -166,33 +227,43 @@ static GObject *trg_destination_combo_constructor(GType type, g_list_free(list); for (sli = dirs; sli; sli = g_slist_next(sli)) - gtk_list_store_insert_with_values(comboModel, NULL, INT_MAX, 0, - (gchar *) sli->data, 1, (gchar *) sli->data, -1); + gtk_list_store_insert_with_values(comboModel, NULL, INT_MAX, + DEST_COLUMN_LABEL, (gchar *) sli->data, DEST_COLUMN_DIR, + (gchar *) sli->data, DEST_COLUMN_TYPE, DEST_EXISTING, -1); gtk_combo_box_set_model(GTK_COMBO_BOX(object), GTK_TREE_MODEL(comboModel)); - renderer = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(object), renderer, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(object), renderer, "text", - 0, NULL); + gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(object), 0); g_object_unref(comboModel); g_slist_foreach(dirs, (GFunc) g_free, NULL); g_slist_free(dirs); g_free(defaultDir); - g_free(defaultLabel); + + g_signal_connect (object, "changed", + G_CALLBACK (gtk_combo_box_entry_active_changed), NULL); return object; } gchar *trg_destination_combo_get_dir(TrgDestinationCombo *combo) { + GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo)); GtkTreeIter iter; - gchar *value; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter); - gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(combo)), &iter, 1, - &value, -1); - return value; + + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) { + gchar *value; + guint type; + + gtk_tree_model_get(model, &iter, DEST_COLUMN_TYPE, &type, -1); + + if (type == DEST_LABEL) { + gtk_tree_model_get(model, &iter, DEST_COLUMN_DIR, &value, -1); + return value; + } + } + + return g_strdup(gtk_entry_get_text(trg_destination_combo_get_entry(combo))); } static void trg_destination_combo_class_init(TrgDestinationComboClass * klass) { @@ -221,5 +292,5 @@ static void trg_destination_combo_init(TrgDestinationCombo * self) { GtkWidget *trg_destination_combo_new(TrgClient * client) { return GTK_WIDGET(g_object_new(TRG_TYPE_DESTINATION_COMBO, - "trg-client", client, NULL)); + "trg-client", client, "has-entry", TRUE, NULL)); } -- cgit v1.2.3