Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}