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>
This commit is contained in:
Linus Torvalds 2011-10-23 09:47:19 +03:00
parent bf33bf879f
commit bbe7f06189
3 changed files with 69 additions and 4 deletions

3
dive.c
View file

@ -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);

3
dive.h
View file

@ -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);

67
info.c
View file

@ -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;