static void tb_editor_btn_add_clicked_cb(GtkWidget *button, TBEditorWidget *tbw) { GtkTreeModel *model_available; GtkTreeSelection *selection_available, *selection_used; GtkTreeIter iter_available, iter_new, iter_selected; gchar *action_name; selection_available = gtk_tree_view_get_selection(tbw->tree_available); if (gtk_tree_selection_get_selected(selection_available, &model_available, &iter_available)) { gtk_tree_model_get(model_available, &iter_available, TB_EDITOR_COL_ACTION, &action_name, -1); if (g_strcmp0(action_name, "Separator") != 0) { if (gtk_list_store_remove(tbw->store_available, &iter_available)) gtk_tree_selection_select_iter(selection_available, &iter_available); } selection_used = gtk_tree_view_get_selection(tbw->tree_used); if (gtk_tree_selection_get_selected(selection_used, NULL, &iter_selected)) { gtk_list_store_insert_before(tbw->store_used, &iter_new, &iter_selected); tb_editor_set_item_values(tbw, action_name, tbw->store_used, &iter_new); } else { gtk_list_store_append(tbw->store_used, &iter_new); tb_editor_set_item_values(tbw, action_name, tbw->store_used, &iter_new); } tb_editor_scroll_to_iter(tbw->tree_used, &iter_new); g_free(action_name); } }
static void tb_editor_menu_configure_toolbar_activate_cb(GtkWidget *menuitem, MidoriBrowser *browser) { GSList *node, *used_items, *all_items; GtkTreeIter iter; GtkTreePath *path; TBEditorWidget *tbw; /* read the current active toolbar items */ used_items = tb_editor_parse_active_items(browser); /* get all available actions */ all_items = tb_editor_get_available_actions(browser); /* create the GUI */ tbw = tb_editor_create_dialog(browser); /* cache some pointers, this is safe enough since the dialog is run modally */ tbw->action_group = midori_browser_get_action_group(browser); tbw->browser = browser; /* fill the stores */ for (node = all_items; node != NULL; node = node->next) { if (strcmp(node->data, "Separator") == 0 || g_slist_find_custom(used_items, node->data, (GCompareFunc) strcmp) == NULL) { gtk_list_store_append(tbw->store_available, &iter); tb_editor_set_item_values(tbw, node->data, tbw->store_available, &iter); } } for (node = used_items; node != NULL; node = node->next) { gtk_list_store_append(tbw->store_used, &iter); tb_editor_set_item_values(tbw, node->data, tbw->store_used, &iter); } /* select first item */ path = gtk_tree_path_new_from_string("0"); gtk_tree_selection_select_path(gtk_tree_view_get_selection(tbw->tree_used), path); gtk_tree_path_free(path); /* connect the changed signals after populating the store */ g_signal_connect(tbw->store_used, "row-changed", G_CALLBACK(tb_editor_available_items_changed_cb), tbw); g_signal_connect(tbw->store_used, "row-deleted", G_CALLBACK(tb_editor_available_items_deleted_cb), tbw); /* run it */ gtk_dialog_run(GTK_DIALOG(tbw->dialog)); gtk_widget_destroy(tbw->dialog); g_slist_foreach(used_items, (GFunc) g_free, NULL); g_slist_foreach(all_items, (GFunc) g_free, NULL); g_slist_free(used_items); g_slist_free(all_items); tb_editor_free_path(tbw); g_free(tbw); }
static void tb_editor_drag_data_rcvd_cb(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint ltime, TBEditorWidget *tbw) { GtkTreeView *tree = GTK_TREE_VIEW(widget); gboolean del = FALSE; if (gtk_selection_data_get_target (data) != GDK_NONE ) { gboolean is_sep; const guchar *text = gtk_selection_data_get_data (data); is_sep = (g_strcmp0(text, "Separator") == 0); /* If the source of the action is equal to the target, we do just re-order and ** so need to delete the separator to get it moved, not just copied. */ if (is_sep && widget == tbw->drag_source) is_sep = FALSE; if (tree != tbw->tree_available || ! is_sep) { GtkTreeIter iter, iter_before, *iter_before_ptr; GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(tree)); if (tbw->last_drag_path != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter_before, tbw->last_drag_path); if (gtk_list_store_iter_is_valid(store, &iter_before)) iter_before_ptr = &iter_before; else iter_before_ptr = NULL; if (tbw->last_drag_pos == GTK_TREE_VIEW_DROP_BEFORE || tbw->last_drag_pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE) gtk_list_store_insert_before(store, &iter, iter_before_ptr); else gtk_list_store_insert_after(store, &iter, iter_before_ptr); tb_editor_set_item_values(tbw, text, store, &iter); } else { gtk_list_store_append(store, &iter); tb_editor_set_item_values(tbw, text, store, &iter); } tb_editor_scroll_to_iter(tree, &iter); } if (tree != tbw->tree_used || ! is_sep) del = TRUE; } tbw->drag_source = NULL; /* reset the value just to be sure */ tb_editor_free_path(tbw); gtk_drag_finish(context, TRUE, del, ltime); }
void marlin_toolbar_editor_dialog_show (MarlinViewWindow *mvw) { GtkTreeIter iter; GtkTreePath *path; TBEditorWidget *tbw; char **used_item; char **used_items; char **all_items; char **all_item; /* read the current active toolbar items */ used_items = g_settings_get_strv (settings, CONF_UI_TOOLBAR_ITEMS); /* get all available actions */ all_items = rb_get_toolbar_actions (); /* create the GUI */ tbw = tb_editor_create_dialog(mvw); /* cache some pointers, this is safe enough since the dialog is run modally */ tbw->mvw = mvw; /* fill the stores */ for (all_item=all_items; *all_item; all_item++) { if (strcmp(*all_item, "Separator") == 0 || !find_in_used_items(used_items, *all_item)) { gtk_list_store_append(tbw->store_available, &iter); tb_editor_set_item_values(tbw, *all_item, tbw->store_available, &iter); } } for (used_item=used_items; *used_item; used_item++) { gtk_list_store_append(tbw->store_used, &iter); tb_editor_set_item_values(tbw, *used_item, tbw->store_used, &iter); } /* connect the changed signals after populating the store */ g_signal_connect(tbw->store_used, "row-changed", G_CALLBACK(tb_editor_available_items_changed_cb), tbw); g_signal_connect(tbw->store_used, "row-deleted", G_CALLBACK(tb_editor_available_items_deleted_cb), tbw); /* run it */ gtk_dialog_run(GTK_DIALOG(tbw->dialog)); gtk_widget_destroy(tbw->dialog); g_strfreev (used_items); tb_editor_free_path(tbw); g_free(tbw); }