diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-23 09:47:19 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-23 09:47:19 +0300 |
commit | bbe7f061891e4410423697cbc9d5f4ab19bcde16 (patch) | |
tree | a08ca94919b1d4e64916cae68ca9461bc1ccee84 | |
parent | bf33bf879faf08ef515be9c539e537a5d6df1f17 (diff) | |
download | subsurface-bbe7f061891e4410423697cbc9d5f4ab19bcde16.tar.gz |
Add completions to the dive location, buddy and divemaster entries
This way you can just type the first few characters of a location you've
been to before, and it will show you a list of possible completions.
Same for buddies and divemasters (which take the completions from a list
of people you've used before).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | dive.c | 3 | ||||
-rw-r--r-- | dive.h | 3 | ||||
-rw-r--r-- | info.c | 67 |
3 files changed, 69 insertions, 4 deletions
@@ -240,6 +240,9 @@ struct dive *fixup_dive(struct dive *dive) update_temperature(&dive->watertemp, mintemp); update_depth(&dive->maxdepth, maxdepth); + add_people(dive->buddy); + add_people(dive->divemaster); + add_location(dive->location); for (i = 0; i < MAX_CYLINDERS; i++) { cylinder_type_t *type = &dive->cylinder[i].type; add_cylinder_description(type); @@ -260,6 +260,9 @@ extern void run_ui(void); extern void report_error(GError* error); extern void add_cylinder_description(cylinder_type_t *); +extern void add_people(const char *string); +extern void add_location(const char *string); + extern void dive_list_update_dives(void); extern void flush_divelist(struct dive *dive); @@ -123,7 +123,7 @@ void show_dive_info(struct dive *dive) gtk_text_buffer_set_text(notes, dive && dive->notes ? dive->notes : "", -1); } -static GtkEntry *text_entry(GtkWidget *box, const char *label) +static GtkEntry *text_entry(GtkWidget *box, const char *label, GtkListStore *completions) { GtkWidget *entry; GtkWidget *frame = gtk_frame_new(label); @@ -133,6 +133,14 @@ static GtkEntry *text_entry(GtkWidget *box, const char *label) entry = gtk_entry_new(); gtk_container_add(GTK_CONTAINER(frame), entry); + if (completions) { + GtkEntryCompletion *completion; + completion = gtk_entry_completion_new(); + gtk_entry_completion_set_text_column(completion, 0); + gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(completions)); + gtk_entry_set_completion(GTK_ENTRY(entry), completion); + } + return GTK_ENTRY(entry); } @@ -162,19 +170,70 @@ static GtkTextBuffer *text_view(GtkWidget *box, const char *label) return buffer; } +static int found_string_entry; + +static gboolean match_string_entry(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) +{ + const char *string = data; + char *entry; + + gtk_tree_model_get(model, iter, 0, &entry, -1); + if (strcmp(entry, string)) + return FALSE; + found_string_entry = 1; + return TRUE; +} + +static int match_list(GtkListStore *list, const char *string) +{ + found_string_entry = 0; + gtk_tree_model_foreach(GTK_TREE_MODEL(list), match_string_entry, (void *)string); + return found_string_entry; +} + +static GtkListStore *location_list, *people_list; + +static void add_string_list_entry(const char *string, GtkListStore *list) +{ + GtkTreeIter iter; + + if (!string || !*string) + return; + + if (match_list(list, string)) + return; + + /* Fixme! Check for duplicates! */ + gtk_list_store_append(list, &iter); + gtk_list_store_set(list, &iter, 0, string, -1); +} + +void add_people(const char *string) +{ + add_string_list_entry(string, people_list); +} + +void add_location(const char *string) +{ + add_string_list_entry(string, location_list); +} + GtkWidget *extended_dive_info_widget(void) { GtkWidget *vbox, *hbox; vbox = gtk_vbox_new(FALSE, 6); + people_list = gtk_list_store_new(1, G_TYPE_STRING); + location_list = gtk_list_store_new(1, G_TYPE_STRING); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); - location = text_entry(vbox, "Location"); + location = text_entry(vbox, "Location", location_list); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - divemaster = text_entry(hbox, "Divemaster"); - buddy = text_entry(hbox, "Buddy"); + divemaster = text_entry(hbox, "Divemaster", people_list); + buddy = text_entry(hbox, "Buddy", people_list); notes = text_view(vbox, "Notes"); return vbox; |