46 #define COLUMN_DESCRIPTION 0 47 #define COLUMN_VALUE 1 48 #define GET_OBJECT(object_name) gtk_builder_get_object(string_list->builder, object_name) 53 gint items_count = gtk_tree_model_iter_n_children(
56 gtk_widget_set_sensitive(GTK_WIDGET(string_list->
button_remove), items_count > 0);
57 gtk_widget_set_sensitive(GTK_WIDGET(string_list->
button_up), items_count > 1);
58 gtk_widget_set_sensitive(GTK_WIDGET(string_list->
button_down), items_count > 1);
67 GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
70 gtk_tree_model_get_iter(GTK_TREE_MODEL(string_list->
liststore_items), &iter, path);
74 gtk_list_store_set(string_list->
liststore_items, &iter, COLUMN_DESCRIPTION, text, -1);
86 gtk_list_store_set(string_list->
liststore_items, &iter, COLUMN_VALUE, text, -1);
88 gtk_tree_path_free(path);
99 path = gtk_tree_model_get_path(GTK_TREE_MODEL(string_list->
liststore_items), from);
100 gtk_tree_view_scroll_to_cell(string_list->
treeview_items, path, NULL, 0, 0, 0);
101 gtk_tree_path_free(path);
107 TRACE_CALL(__func__);
109 GtkTreeIter target_iter;
113 if (gtk_tree_model_iter_next(GTK_TREE_MODEL(string_list->
liststore_items), &target_iter)) {
122 TRACE_CALL(__func__);
124 GtkTreeIter target_iter;
129 path = gtk_tree_model_get_path(GTK_TREE_MODEL(string_list->
liststore_items), &target_iter);
131 if (gtk_tree_path_prev(path)) {
132 gtk_tree_model_get_iter(GTK_TREE_MODEL(string_list->
liststore_items), &target_iter, path);
133 gtk_tree_path_free(path);
142 TRACE_CALL(__func__);
149 path = gtk_tree_model_get_path(GTK_TREE_MODEL(string_list->
liststore_items), &iter);
150 gtk_tree_view_set_cursor_on_cell(string_list->
treeview_items, path,
154 gtk_tree_path_free(path);
161 TRACE_CALL(__func__);
174 TRACE_CALL(__func__);
183 items = g_strsplit(text, STRING_DELIMITOR, -1);
184 for (i = 0; i < g_strv_length(items); i++) {
187 if (g_strv_length(values) > 1) {
190 COLUMN_DESCRIPTION, values[0],
191 COLUMN_VALUE, values[1],
196 COLUMN_VALUE, values[0],
208 TRACE_CALL(__func__);
213 const gchar *item_description;
214 const gchar *item_value;
216 str = g_string_new(NULL);
219 ret = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(string_list->
liststore_items), &iter);
221 gtk_tree_model_get(GTK_TREE_MODEL(string_list->
liststore_items), &iter,
222 COLUMN_DESCRIPTION, &item_description,
223 COLUMN_VALUE, &item_value,
225 if (!item_description)
226 item_description =
"";
227 if (item_value && strlen(item_value) > 0) {
230 g_string_append(str, STRING_DELIMITOR);
236 g_string_append(str, item_description);
240 g_string_append(str, item_value);
242 ret = gtk_tree_model_iter_next(GTK_TREE_MODEL(string_list->
liststore_items), &iter);
244 return g_string_free(str, FALSE);
250 TRACE_CALL(__func__);
258 gtk_window_set_title(GTK_WINDOW(string_list->
dialog),
259 (title1 && strlen(title1) > 0) ? title1 :
"");
261 if (title2 && strlen(title2) > 0) {
262 gtk_label_set_text(string_list->
label_title, title2);
263 gtk_widget_show(GTK_WIDGET(string_list->
label_title));
265 gtk_widget_hide(GTK_WIDGET(string_list->
label_title));
272 TRACE_CALL(__func__);
283 TRACE_CALL(__func__);
288 string_list->
dialog = GTK_DIALOG(gtk_builder_get_object(string_list->
builder,
"DialogStringList"));
290 string_list->
liststore_items = GTK_LIST_STORE(GET_OBJECT(
"liststore_items"));
291 string_list->
treeview_items = GTK_TREE_VIEW(GET_OBJECT(
"treeview_items"));
292 string_list->
treeviewcolumn_item = GTK_TREE_VIEW_COLUMN(GET_OBJECT(
"treeviewcolumn_item"));
293 string_list->
treeview_selection = GTK_TREE_SELECTION(GET_OBJECT(
"treeview_selection"));
296 string_list->
button_add = GTK_BUTTON(GET_OBJECT(
"button_add"));
297 string_list->
button_remove = GTK_BUTTON(GET_OBJECT(
"button_remove"));
298 string_list->
button_up = GTK_BUTTON(GET_OBJECT(
"button_up"));
299 string_list->
button_down = GTK_BUTTON(GET_OBJECT(
"button_down"));
300 string_list->
label_title = GTK_LABEL(GET_OBJECT(
"label_title"));
301 string_list->
label_status = GTK_LABEL(GET_OBJECT(
"label_status"));
304 gtk_builder_connect_signals(string_list->
builder, NULL);
306 if (!fields_separator)
307 fields_separator = STRING_DELIMITOR2;
312 return string_list->
dialog;
static RemminaStringList * string_list
GtkDialog * remmina_string_list_new(gboolean two_columns, const gchar *fields_separator)
RemminaStringListPriv * priv
void remmina_string_list_set_validation_func(RemminaStringListValidationFunc func)
GtkCellRendererText * cellrenderertext_item1
void remmina_string_list_on_action_remove(GtkWidget *widget, gpointer user_data)
static void remmina_string_list_init(void)
GtkBuilder * remmina_public_gtk_builder_new_from_file(gchar *filename)
RemminaStringListValidationFunc validation_func
GtkTreeViewColumn * treeviewcolumn_item
GtkTreeSelection * treeview_selection
GtkCellRendererText * cellrenderertext_item2
const gchar * fields_separator
void remmina_string_list_on_action_down(GtkWidget *widget, gpointer user_data)
GtkTreeView * treeview_items
gboolean(* RemminaStringListValidationFunc)(const gchar *new_str, gchar **error)
gchar * remmina_public_str_replace(const gchar *string, const gchar *search, const gchar *replacement)
void remmina_string_list_set_text(const gchar *text, const gboolean clear_data)
void remmina_string_list_on_cell_edited(GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text)
void remmina_string_list_set_titles(gchar *title1, gchar *title2)
GtkListStore * liststore_items
void remmina_string_list_update_buttons_state(void)
void remmina_string_list_on_action_add(GtkWidget *widget, gpointer user_data)
static void remmina_string_list_move_iter(GtkTreeIter *from, GtkTreeIter *to)
GtkButton * button_remove
gchar * remmina_string_list_get_text(void)
void remmina_string_list_on_action_up(GtkWidget *widget, gpointer user_data)