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_temperature(&dive->watertemp, mintemp);
|
||||||
update_depth(&dive->maxdepth, maxdepth);
|
update_depth(&dive->maxdepth, maxdepth);
|
||||||
|
|
||||||
|
add_people(dive->buddy);
|
||||||
|
add_people(dive->divemaster);
|
||||||
|
add_location(dive->location);
|
||||||
for (i = 0; i < MAX_CYLINDERS; i++) {
|
for (i = 0; i < MAX_CYLINDERS; i++) {
|
||||||
cylinder_type_t *type = &dive->cylinder[i].type;
|
cylinder_type_t *type = &dive->cylinder[i].type;
|
||||||
add_cylinder_description(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 report_error(GError* error);
|
||||||
|
|
||||||
extern void add_cylinder_description(cylinder_type_t *);
|
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 dive_list_update_dives(void);
|
||||||
extern void flush_divelist(struct dive *dive);
|
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);
|
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 *entry;
|
||||||
GtkWidget *frame = gtk_frame_new(label);
|
GtkWidget *frame = gtk_frame_new(label);
|
||||||
|
@ -133,6 +133,14 @@ static GtkEntry *text_entry(GtkWidget *box, const char *label)
|
||||||
entry = gtk_entry_new();
|
entry = gtk_entry_new();
|
||||||
gtk_container_add(GTK_CONTAINER(frame), entry);
|
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);
|
return GTK_ENTRY(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,19 +170,70 @@ static GtkTextBuffer *text_view(GtkWidget *box, const char *label)
|
||||||
return buffer;
|
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 *extended_dive_info_widget(void)
|
||||||
{
|
{
|
||||||
GtkWidget *vbox, *hbox;
|
GtkWidget *vbox, *hbox;
|
||||||
vbox = gtk_vbox_new(FALSE, 6);
|
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);
|
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);
|
hbox = gtk_hbox_new(FALSE, 3);
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
|
||||||
|
|
||||||
divemaster = text_entry(hbox, "Divemaster");
|
divemaster = text_entry(hbox, "Divemaster", people_list);
|
||||||
buddy = text_entry(hbox, "Buddy");
|
buddy = text_entry(hbox, "Buddy", people_list);
|
||||||
|
|
||||||
notes = text_view(vbox, "Notes");
|
notes = text_view(vbox, "Notes");
|
||||||
return vbox;
|
return vbox;
|
||||||
|
|
Loading…
Add table
Reference in a new issue