summaryrefslogtreecommitdiff
path: root/src/trg-destination-combo.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-25 21:25:50 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-10-25 21:25:50 +0000
commit48780131a32188263501c094bff8afcbc687e189 (patch)
treeeb79b55d14709b5fef778017b3db28b21eed2438 /src/trg-destination-combo.c
parent33256bc2004f729c6829d812a3ca6c89fa7e7b7a (diff)
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.
Diffstat (limited to 'src/trg-destination-combo.c')
-rw-r--r--src/trg-destination-combo.c123
1 files changed, 97 insertions, 26 deletions
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));
}