+
+static void set_visible_if_not_text(GtkTreeViewColumn *col,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ gboolean is_text;
+ GdkPixbuf *pixbuf;
+
+ gtk_tree_model_get(model, iter, SET_ICON_IS_TEXT, &is_text, -1);
+ if (is_text) {
+ g_object_set(renderer, "visible", FALSE, NULL);
+ } else {
+ pixbuf = NULL;
+ gtk_tree_model_get(model, iter,
+ SET_ICON, &pixbuf,
+ -1);
+ /* note getting a pixbuf from a tree model increases
+ * its refcount ... */
+ g_object_unref(pixbuf);
+
+ g_object_set(renderer, "visible", TRUE, NULL);
+ g_object_set(renderer, "pixbuf", pixbuf, NULL);
+ }
+}
+
+static GtkWidget *create_icon_list_view(ToolbarPage *prefs_toolbar)
+{
+ GtkTreeView *list_view;
+ GtkListStore *store;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkTreeSelection *selector;
+
+ /* XXX: for icon list we don't need SET_TEXT, and SET_EVENT */
+ store = gtk_list_store_new(N_SET_COLUMNS,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ -1);
+ list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
+ g_object_unref(G_OBJECT(store));
+
+ column = gtk_tree_view_column_new();
+ renderer = gtk_cell_renderer_pixbuf_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+
+ /* tell pixbuf renderer it is only visible if
+ * the icon is not represented by text */
+ gtk_tree_view_column_set_cell_data_func(column, renderer,
+ set_visible_if_not_text,
+ NULL, NULL);
+
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+
+ /* tell the text renderer it is only visible if the icon
+ * is represented by an image */
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "visible", SET_ICON_IS_TEXT,
+ "text", SET_ICON_TEXT,
+ NULL);
+
+ gtk_tree_view_append_column(list_view, column);
+
+ column = gtk_tree_view_column_new();
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "text", SET_FILENAME,
+ NULL);
+
+ gtk_tree_view_append_column(list_view, column);
+
+ /* various other tree view attributes */
+ gtk_tree_view_set_rules_hint(list_view, TRUE);
+ gtk_tree_view_set_headers_visible(list_view, FALSE);
+
+ selector = gtk_tree_view_get_selection(list_view);
+ gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
+ gtk_tree_selection_set_select_function
+ (selector, (GtkTreeSelectionFunc) icon_list_selected,
+ prefs_toolbar, NULL);
+
+ return GTK_WIDGET(list_view);
+}
+
+static GtkWidget *create_set_list_view(ToolbarPage *prefs_toolbar)
+{
+ GtkTreeView *list_view;
+ GtkListStore *store;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkTreeSelection *selector;
+
+ store = gtk_list_store_new(N_SET_COLUMNS,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_BOOLEAN,
+ -1);
+ list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
+ g_object_unref(G_OBJECT(store));
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Icon"));
+ renderer = gtk_cell_renderer_pixbuf_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+
+ /* tell pixbuf renderer it is only visible if
+ * the icon is not represented by text */
+ gtk_tree_view_column_set_cell_data_func(column, renderer,
+ set_visible_if_not_text,
+ NULL, NULL);
+
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+
+ /* tell the text renderer it is only visible if the icon
+ * is represented by an image */
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "visible", SET_ICON_IS_TEXT,
+ "text", SET_ICON_TEXT,
+ NULL);
+
+ gtk_tree_view_append_column(list_view, column);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("File name"));
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "text", SET_FILENAME,
+ NULL);
+
+ gtk_tree_view_append_column(list_view, column);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Icon text"));
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "text", SET_TEXT,
+ NULL);
+ gtk_tree_view_append_column(list_view, column);
+
+ column = gtk_tree_view_column_new();
+ gtk_tree_view_column_set_title(column, _("Mapped event"));
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_attributes(column, renderer,
+ "text", SET_EVENT,
+ NULL);
+ gtk_tree_view_append_column(list_view, column);
+
+ /* various other tree view attributes */
+ gtk_tree_view_set_rules_hint(list_view, TRUE);
+
+ selector = gtk_tree_view_get_selection(list_view);
+ gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
+ gtk_tree_selection_set_select_function
+ (selector, (GtkTreeSelectionFunc) set_list_selected,
+ prefs_toolbar, NULL);
+
+ return GTK_WIDGET(list_view);
+
+}
+
+static gboolean icon_list_selected(GtkTreeSelection *selector,
+ GtkTreeModel *model,
+ GtkTreePath *path,
+ gboolean currently_selected,
+ ToolbarPage *prefs_toolbar)
+{
+ GtkTreeIter iter;
+ GtkTreeView *list_ico = gtk_tree_selection_get_tree_view(selector);
+ gchar *text;
+
+ if (currently_selected ||!gtk_tree_model_get_iter(model, &iter, path))
+ return TRUE;
+
+ text = NULL;
+ gtk_tree_model_get(model, &iter,
+ SET_FILENAME, &text,
+ -1);
+ if (!text)
+ return TRUE;
+
+ if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR), text) == 0) {
+ gtk_widget_set_sensitive(prefs_toolbar->combo_action, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->entry_icon_text, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, FALSE);
+ } else {
+ gtk_widget_set_sensitive(prefs_toolbar->combo_action, TRUE);
+ gtk_widget_set_sensitive(prefs_toolbar->entry_icon_text, TRUE);
+ gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, TRUE);
+ }
+
+ g_free(text);
+
+ return TRUE;
+}
+
+static gboolean set_list_selected(GtkTreeSelection *selector,
+ GtkTreeModel *model,
+ GtkTreePath *path,
+ gboolean currently_selected,
+ ToolbarPage *prefs_toolbar)
+{
+ GtkTreeIter iter;
+ GtkTreeView *list_ico = GTK_TREE_VIEW(prefs_toolbar->list_view_icons);
+ GtkTreeView *list_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
+ gchar *syl_act;
+ gchar *file, *icon_text, *descr;
+ GList *cur;
+ gint item_num;
+ GtkTreeModel *model_ico;
+
+ if (currently_selected ||!gtk_tree_model_get_iter(model, &iter, path))
+ return TRUE;
+
+ gtk_tree_model_get(model, &iter,
+ SET_FILENAME, &file,
+ SET_TEXT, &icon_text,
+ SET_EVENT, &descr,
+ -1);
+
+ if (g_utf8_collate(descr, syl_act))
+ gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->entry_icon_text),
+ icon_text);
+
+ /* scan combo list for selected description an set combo item accordingly */
+ for (cur = prefs_toolbar->combo_action_list, item_num = 0; cur != NULL;
+ cur = cur->next) {
+ gchar *item_str = (gchar*)cur->data;
+ if (g_utf8_collate(item_str, descr) == 0) {
+ gtk_list_select_item(GTK_LIST(prefs_toolbar->combo_list), item_num);
+ break;
+ }
+ else
+ item_num++;
+ }
+
+ model_ico = gtk_tree_view_get_model(list_ico);
+ if (gtk_tree_model_get_iter_first(model_ico, &iter)) {
+ gchar *entry;
+ gboolean found = FALSE;
+
+ /* find in icon list, scroll to item */
+ do {
+ entry = NULL;
+ gtk_tree_model_get(model_ico, &iter,
+ SET_FILENAME, &entry,
+ -1);
+ found = entry && !g_utf8_collate(entry, file);
+ g_free(entry);
+ if (found)
+ break;
+ } while(gtk_tree_model_iter_next(model_ico, &iter));
+
+ if (found) {
+ GtkTreePath *path;
+
+ gtk_tree_selection_select_iter
+ (gtk_tree_view_get_selection(list_ico), &iter);
+ path = gtk_tree_model_get_path(model_ico, &iter);
+ gtk_tree_view_set_cursor(list_ico, path, NULL, FALSE);
+ gtk_tree_path_free(path);
+ }
+ }
+
+ g_free(file);
+ g_free(icon_text);
+ g_free(descr);
+
+ return TRUE;
+}