diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2011-09-20 10:14:58 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2011-09-20 10:14:58 +0000 |
commit | c3cb0e6dd9d51a6febe343e68529b708a83f7ffb (patch) | |
tree | 5a1c2e701e3c7872e59dd810030d1a9f2f3040fe /gtk | |
parent | e672fdc60f464dbab3614412782ba1d7db8deb66 (diff) |
From Dirk via bug 6361:
Add a File/Directory Dialog as a field type for UAT preferences.
svn path=/trunk/; revision=39058
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/uat_gui.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/gtk/uat_gui.c b/gtk/uat_gui.c index dc6ee7b53e..f315ddad36 100644 --- a/gtk/uat_gui.c +++ b/gtk/uat_gui.c @@ -158,6 +158,8 @@ static char* fld_tostr(void* rec, uat_field_t* f) { switch(f->mode) { case PT_TXTMOD_STRING: case PT_TXTMOD_ENUM: + case PT_TXTMOD_FILENAME: + case PT_TXTMOD_DIRECTORYNAME: out = ep_strndup(ptr,len); break; case PT_TXTMOD_HEXBYTES: { @@ -302,10 +304,22 @@ static gboolean uat_dlg_cb(GtkWidget *win _U_, gpointer user_data) { for ( colnum = 0; colnum < ncols; colnum++ ) { void* e = g_ptr_array_index(dd->entries,colnum); - const char* text; + const char *text = NULL; + char *text_free = NULL; unsigned len = 0; switch(f[colnum].mode) { + case PT_TXTMOD_FILENAME: + case PT_TXTMOD_DIRECTORYNAME: + text = text_free = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(e)); + if (text) { + len = (unsigned) strlen(text); + } else { + text = ""; + len = 0; + } + break; + case PT_TXTMOD_STRING: text = gtk_entry_get_text(GTK_ENTRY(e)); len = (unsigned) strlen(text); @@ -333,7 +347,6 @@ static gboolean uat_dlg_cb(GtkWidget *win _U_, gpointer user_data) { return FALSE; } - if (f[colnum].cb.chk) { if (! f[colnum].cb.chk(dd->rec, text, len, f[colnum].cbdata.chk, f[colnum].fld_data, &err)) { err = ep_strdup_printf("error in column '%s': %s",f[colnum].title,err); @@ -342,6 +355,8 @@ static gboolean uat_dlg_cb(GtkWidget *win _U_, gpointer user_data) { } f[colnum].cb.set(dd->rec,text,len, f[colnum].cbdata.set, f[colnum].fld_data); + + g_free(text_free); } if (dd->uat->update_cb) { @@ -477,17 +492,28 @@ static void uat_edit_dialog(uat_t* uat, gint row, gboolean copy) { gtk_container_add(GTK_CONTAINER(event_box), label); switch(f[colnum].mode) { - case PT_TXTMOD_STRING: - case PT_TXTMOD_HEXBYTES: { - entry = gtk_entry_new(); + case PT_TXTMOD_FILENAME: + case PT_TXTMOD_DIRECTORYNAME: + entry = gtk_file_chooser_button_new(f[colnum].desc, + (f[colnum].mode == PT_TXTMOD_FILENAME) ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + if (! dd->is_new || copy) { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(entry), text); + } g_ptr_array_add(dd->entries,entry); gtk_table_attach_defaults(GTK_TABLE(main_tb), entry, 1, 2, colnum+1, colnum + 2); + break; + + case PT_TXTMOD_STRING: + case PT_TXTMOD_HEXBYTES: + entry = gtk_entry_new(); if (! dd->is_new || copy) { gtk_entry_set_text(GTK_ENTRY(entry),text); } + g_ptr_array_add(dd->entries,entry); + gtk_table_attach_defaults(GTK_TABLE(main_tb), entry, 1, 2, colnum+1, colnum + 2); dlg_set_activate(entry, bt_ok); break; - } + case PT_TXTMOD_ENUM: { GtkWidget *combo_box; int idx; |