mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
bf33bf879f
commit
bbe7f06189
3 changed files with 69 additions and 4 deletions
3
dive.c
3
dive.c
|
@ -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
3
dive.h
|
@ -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
67
info.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue