Example #1
0
static void fm_dnd_src_finalize(GObject *object)
{
	FmDndSrc *ds;

	g_return_if_fail(object != NULL);
	g_return_if_fail(FM_IS_DND_SRC(object));

	ds = FM_DND_SRC(object);

	if(ds->files)
		fm_list_unref(ds->files);

	fm_dnd_src_set_widget(ds, NULL);

	G_OBJECT_CLASS(fm_dnd_src_parent_class)->finalize(object);
}
Example #2
0
void fm_folder_view_set_mode(FmFolderView* fv, FmFolderViewMode mode)
{
    if( mode != fv->mode )
    {
        GtkTreeSelection* ts;
        GList *sels, *cells;
        FmFolderModel* model = (FmFolderModel*)fv->model;
        gboolean has_focus;

        if( G_LIKELY(fv->view) )
        {
            has_focus = GTK_WIDGET_HAS_FOCUS(fv->view);
            /* preserve old selections */
            sels = fm_folder_view_get_selected_tree_paths(fv);

            g_signal_handlers_disconnect_by_func(fv->view, on_drag_motion, fv);
            g_signal_handlers_disconnect_by_func(fv->view, on_drag_leave, fv);
            g_signal_handlers_disconnect_by_func(fv->view, on_drag_drop, fv);
            g_signal_handlers_disconnect_by_func(fv->view, on_drag_data_received, fv);

            fm_dnd_unset_dest_auto_scroll(fv->view);

            gtk_widget_destroy(fv->view );
            /* FIXME: compact view and icon view actually use the same
             * type of widget, ExoIconView. So it may be better to
             * reuse the widget when available. */
        }
        else
        {
            sels = NULL;
            has_focus = FALSE;
        }

        if(fv->icon_size_changed_handler)
        {
            g_signal_handler_disconnect(fm_config, fv->icon_size_changed_handler);
            fv->icon_size_changed_handler = 0;
        }

        fv->mode = mode;
        switch(fv->mode)
        {
        case FM_FV_COMPACT_VIEW:
        case FM_FV_ICON_VIEW:
        case FM_FV_THUMBNAIL_VIEW:
            create_icon_view(fv, sels);
            break;
        case FM_FV_LIST_VIEW: /* detailed list view */
            create_list_view(fv, sels);
        }
        g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL);
        g_list_free(sels);

        /* FIXME: maybe calling set_icon_size here is a good idea */

        gtk_drag_source_set(fv->view, GDK_BUTTON1_MASK,
            fm_default_dnd_src_targets, N_FM_DND_SRC_DEFAULT_TARGETS,
            GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK|GDK_ACTION_ASK);
        fm_dnd_src_set_widget(fv->dnd_src, fv->view);

        gtk_drag_dest_set(fv->view, 0,
            fm_default_dnd_dest_targets, N_FM_DND_DEST_DEFAULT_TARGETS,
            GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK|GDK_ACTION_ASK);
        fm_dnd_dest_set_widget(fv->dnd_dest, fv->view);
        g_signal_connect_after(fv->view, "drag-motion", G_CALLBACK(on_drag_motion), fv);
        g_signal_connect(fv->view, "drag-leave", G_CALLBACK(on_drag_leave), fv);
        g_signal_connect(fv->view, "drag-drop", G_CALLBACK(on_drag_drop), fv);
        g_signal_connect(fv->view, "drag-data-received", G_CALLBACK(on_drag_data_received), fv);
        g_signal_connect(fv->view, "button-press-event", G_CALLBACK(on_btn_pressed), fv);

        fm_dnd_set_dest_auto_scroll(fv->view, gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(fv)), gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(fv)));

        gtk_widget_show(fv->view);
        gtk_container_add((GtkContainer*)fv, fv->view);

        if(has_focus) /* restore the focus if needed. */
            gtk_widget_grab_focus(fv->view);
    }
    else
    {
        /* g_debug("same mode"); */
    }
}
Example #3
0
FmDndSrc *fm_dnd_src_new(GtkWidget* w)
{
	FmDndSrc* ds = (FmDndSrc*)g_object_new(FM_TYPE_DND_SRC, NULL);
	fm_dnd_src_set_widget(ds, w);
	return ds;
}