60 const char *trigger_char = (
const char *)user_data;
61 const size_t trigger_char_len = strlen(trigger_char);
64 GtkEditable *e = (GtkEditable *)gtk_entry_completion_get_entry(widget);
65 gchar *s = gtk_editable_get_chars(e, 0, -1);
66 gint cur_pos = gtk_editable_get_position(e);
73 varname = g_value_get_string(&
value);
75 for(
p = cur_pos;
p - trigger_char_len > 0;
p--)
77 if(strncmp(s +
p - trigger_char_len, trigger_char, trigger_char_len) == 0)
83 size_t text_len = strlen(varname) + trigger_char_len;
84 gchar *addtext = (gchar *)g_malloc(text_len);
85 snprintf(addtext, text_len,
"%s)", varname);
87 gtk_editable_delete_text(e,
p, cur_pos);
88 gtk_editable_insert_text(e, addtext, -1, &
p);
89 gtk_editable_set_position(e,
p);
90 g_value_unset(&
value);
109static gboolean
on_match_func(GtkEntryCompletion *completion,
const gchar *
key, GtkTreeIter *iter,
112 gboolean ret =
FALSE;
113 const char *trigger_char = (
const char *)user_data;
114 const size_t trigger_char_len = strlen(trigger_char);
116 GtkEditable *e = (GtkEditable *)gtk_entry_completion_get_entry(completion);
117 gint cur_pos = gtk_editable_get_position(e);
119 gboolean var_present =
FALSE;
121 for(gint
p = cur_pos;
p >= 0;
p--)
123 gchar *ss = gtk_editable_get_chars(e,
p, cur_pos);
124 if(strncmp(ss, trigger_char, trigger_char_len) == 0)
126 var_start =
p + trigger_char_len;
136 gchar *varname = gtk_editable_get_chars(e, var_start, cur_pos);
138 GtkTreeModel *
model = gtk_entry_completion_get_model(completion);
146 gchar *normalized_string = g_utf8_normalize(item, -1, G_NORMALIZE_ALL);
150 gchar *case_normalized_string = g_utf8_casefold(normalized_string, -1);
152 if(!g_ascii_strncasecmp(varname, case_normalized_string, strlen(varname))) ret =
TRUE;
154 dt_free(case_normalized_string);
178 GtkEntryCompletion *completion = gtk_entry_completion_new();
179 GtkListStore *
model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
183 gtk_entry_set_completion(entry, completion);
184 g_signal_connect(G_OBJECT(completion),
"match-selected", G_CALLBACK(
on_match_select), (gpointer)trigger_char);
189 gtk_list_store_append(
model, &iter);
192 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(
model));
193 gtk_entry_completion_set_match_func(completion,
on_match_func, (gpointer)trigger_char, NULL);
194 g_object_unref(
model);
331 gtk_widget_grab_focus(widget);
333 gtk_entry_set_text(GTK_ENTRY(entry),
"");
335 if(GTK_IS_TREE_VIEW(widget))
337 GtkTreePath *path = NULL;
338 gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL);
339 gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), path);
340 gtk_tree_path_free(path);
void dt_gui_search_stop(GtkSearchEntry *entry, GtkWidget *widget)
gchar * dt_gtkentry_build_completion_tooltip_text(const gchar *header, const dt_gtkentry_completion_spec *compl_list)
void dt_gtkentry_setup_completion(GtkEntry *entry, const dt_gtkentry_completion_spec *compl_list, const char *trigger_char)
gboolean dt_gui_search_start(GtkWidget *widget, GdkEventKey *event, GtkSearchEntry *entry)
static gboolean on_match_func(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data)
static gboolean on_match_select(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
const dt_gtkentry_completion_spec * dt_gtkentry_get_default_path_compl_list()
G_BEGIN_DECLS struct completion_spec dt_gtkentry_completion_spec