57 const char *trigger_char = (
const char *)user_data;
58 const size_t trigger_char_len = strnlen(trigger_char, -1);
61 GtkEditable *e = (GtkEditable *)gtk_entry_completion_get_entry(widget);
62 gchar *s = gtk_editable_get_chars(e, 0, -1);
63 gint cur_pos = gtk_editable_get_position(e);
70 varname = g_value_get_string(&
value);
72 for(
p = cur_pos;
p - trigger_char_len > 0;
p--)
74 if(strncmp(s +
p - trigger_char_len, trigger_char, trigger_char_len) == 0)
80 size_t text_len = strlen(varname) + trigger_char_len;
81 gchar *addtext = (gchar *)g_malloc(text_len);
82 snprintf(addtext, text_len,
"%s)", varname);
84 gtk_editable_delete_text(e,
p, cur_pos);
85 gtk_editable_insert_text(e, addtext, -1, &
p);
86 gtk_editable_set_position(e,
p);
87 g_value_unset(&
value);
106static gboolean
on_match_func(GtkEntryCompletion *completion,
const gchar *
key, GtkTreeIter *iter,
109 gboolean ret =
FALSE;
110 const char *trigger_char = (
const char *)user_data;
111 const size_t trigger_char_len = strnlen(trigger_char, -1);
113 GtkEditable *e = (GtkEditable *)gtk_entry_completion_get_entry(completion);
114 gint cur_pos = gtk_editable_get_position(e);
116 gboolean var_present =
FALSE;
118 for(gint
p = cur_pos;
p >= 0;
p--)
120 gchar *ss = gtk_editable_get_chars(e,
p, cur_pos);
121 if(strncmp(ss, trigger_char, trigger_char_len) == 0)
123 var_start =
p + trigger_char_len;
133 gchar *varname = gtk_editable_get_chars(e, var_start, cur_pos);
135 GtkTreeModel *
model = gtk_entry_completion_get_model(completion);
143 gchar *normalized_string = g_utf8_normalize(item, -1, G_NORMALIZE_ALL);
147 gchar *case_normalized_string = g_utf8_casefold(normalized_string, -1);
149 if(!g_ascii_strncasecmp(varname, case_normalized_string, strlen(varname))) ret =
TRUE;
151 dt_free(case_normalized_string);
175 GtkEntryCompletion *completion = gtk_entry_completion_new();
176 GtkListStore *
model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
180 gtk_entry_set_completion(entry, completion);
181 g_signal_connect(G_OBJECT(completion),
"match-selected", G_CALLBACK(
on_match_select), (gpointer)trigger_char);
186 gtk_list_store_append(
model, &iter);
189 gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(
model));
190 gtk_entry_completion_set_match_func(completion,
on_match_func, (gpointer)trigger_char, NULL);
191 g_object_unref(
model);
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)
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()