Beispiel #1
0
Datei: main.c Projekt: S010/misc
GtkWidget *
create_main_view(void) {
    int i;
    GtkWidget *vbox, *hbox;
    GtkWidget *tool_button;
    GtkWidget *scrolled_window;
    struct {
        const gchar *stock_id;
        void *click_handler;
    } tool_buttons[] = {
        { GTK_STOCK_GO_BACK,    handle_back_clicked    },
        { GTK_STOCK_GO_FORWARD, handle_forward_clicked },
        { GTK_STOCK_HOME,       handle_home_clicked    },
        { GTK_STOCK_GO_UP,      handle_up_clicked      }
    };

    vbox = gtk_vbox_new(FALSE, 0);
    hbox = gtk_hbox_new(FALSE, 0);
    path_entry = gtk_entry_new();
    icon_view = create_icon_view();
    scrolled_window = create_scrolled_window(icon_view);

    g_signal_connect(G_OBJECT(path_entry), "insert-at-cursor", G_CALLBACK(handle_path_entered), NULL);

    for (i = 0; i < NELEMS(tool_buttons); ++i) {
        tool_button = (GtkWidget *) gtk_tool_button_new_from_stock(tool_buttons[i].stock_id);
        g_signal_connect(G_OBJECT(tool_button), "clicked", G_CALLBACK(tool_buttons[i].click_handler), NULL);
        gtk_box_pack_start(GTK_BOX(hbox), tool_button, FALSE, FALSE, 0);
    }

    gtk_box_pack_start(GTK_BOX(hbox), path_entry, TRUE, TRUE, 0);
    
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);

    return vbox;
}
Beispiel #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"); */
    }
}