diff --git a/src/browser.c b/src/browser.c index 2323936..a12ad6c 100644 --- a/src/browser.c +++ b/src/browser.c @@ -87,6 +87,7 @@ static struct _menu _menu_view[] = { "_Details", G_CALLBACK(on_view_details), NULL, 0 }, { "_Icons", G_CALLBACK(on_view_icons), NULL, 0 }, { "_List", G_CALLBACK(on_view_list), NULL, 0 }, + { "_Thumbnails", G_CALLBACK(on_view_thumbnails), NULL, 0 }, #endif { NULL, NULL, NULL, 0 } }; @@ -218,6 +219,10 @@ Browser * browser_new(char const * directory) g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK( on_view_list), browser); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + menuitem = gtk_menu_item_new_with_label("Thumbnails"); + g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK( + on_view_thumbnails), browser); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show_all(menu); gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolitem), menu); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); @@ -325,8 +330,22 @@ static int _new_pixbufs(Browser * browser) p++) browser->pb_executable_48 = gtk_icon_theme_load_icon( browser->theme, *p, 48, 0, NULL); + browser->pb_file_96 = NULL; + for(p = file; *p != NULL && browser->pb_file_96 == NULL; p++) + browser->pb_file_96 = gtk_icon_theme_load_icon(browser->theme, + *p, 96, 0, NULL); + browser->pb_folder_96 = NULL; + for(p = folder; *p != NULL && browser->pb_folder_96 == NULL; p++) + browser->pb_folder_96 = gtk_icon_theme_load_icon(browser->theme, + *p, 96, 0, NULL); + browser->pb_executable_96 = NULL; + for(p = executable; *p != NULL && browser->pb_executable_96 == NULL; + p++) + browser->pb_executable_96 = gtk_icon_theme_load_icon( + browser->theme, *p, 96, 0, NULL); return browser->pb_file_24 == NULL || browser->pb_folder_24 == NULL - || browser->pb_file_48 == NULL || browser->pb_folder_48 == NULL; + || browser->pb_file_48 == NULL || browser->pb_folder_48 == NULL + || browser->pb_file_96 == NULL || browser->pb_folder_96 == NULL; #endif } @@ -413,7 +432,7 @@ static GtkListStore * _create_store(Browser * browser) store = gtk_list_store_new(BR_NUM_COLS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, #if GTK_CHECK_VERSION(2, 6, 0) - GDK_TYPE_PIXBUF, + GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, #endif G_TYPE_UINT64, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -662,6 +681,7 @@ static void _loop_insert(Browser * browser, GtkTreeIter * iter, GdkPixbuf * icon_24 = browser->pb_file_24; #if GTK_CHECK_VERSION(2, 6, 0) GdkPixbuf * icon_48 = browser->pb_file_48; + GdkPixbuf * icon_96 = browser->pb_file_96; #endif if((p = g_filename_to_utf8(display, -1, NULL, NULL, NULL)) != NULL) @@ -677,26 +697,35 @@ static void _loop_insert(Browser * browser, GtkTreeIter * iter, icon_24 = browser->pb_folder_24; #if GTK_CHECK_VERSION(2, 6, 0) icon_48 = browser->pb_folder_48; + icon_96 = browser->pb_folder_96; #endif } - else if(!S_ISLNK(st->st_mode) && st->st_mode & S_IXUSR -#if GTK_CHECK_VERSION(2, 6, 0) - && browser->pb_executable_48 != NULL -#endif - && browser->pb_executable_24 != NULL) + else if(!S_ISLNK(st->st_mode) && st->st_mode & S_IXUSR) { - icon_24 = browser->pb_executable_24; + icon_24 = browser->pb_executable_24 + ? browser->pb_executable_24 + : browser->pb_file_24; #if GTK_CHECK_VERSION(2, 6, 0) - icon_48 = browser->pb_executable_48; + icon_48 = browser->pb_executable_48 + ? browser->pb_executable_48 + : browser->pb_file_48; + icon_96 = browser->pb_executable_96 + ? browser->pb_executable_96 + : browser->pb_file_96; #endif } else if((type = mime_type(browser->mime, display)) != NULL) + { icon_24 = mime_icons(browser->mime, browser->theme, #if GTK_CHECK_VERSION(2, 6, 0) type, &icon_48); + if(strncmp(type, "image/", 6) == 0) + icon_96 = gdk_pixbuf_new_from_file_at_size( + path, 96, 96, NULL); #else type, NULL); #endif + } } #if GTK_CHECK_VERSION(2, 6, 0) gtk_list_store_insert_with_values(browser->store, iter, -1, @@ -713,6 +742,8 @@ static void _loop_insert(Browser * browser, GtkTreeIter * iter, #if GTK_CHECK_VERSION(2, 6, 0) BR_COL_PIXBUF_48, icon_48 != NULL ? icon_48 : browser->pb_file_48, + BR_COL_PIXBUF_96, icon_96 != NULL ? icon_96 + : browser->pb_file_96, #endif BR_COL_MIME_TYPE, type != NULL ? type : "", BR_COL_SIZE, size, @@ -860,6 +891,7 @@ static void _loop_update(Browser * browser, GtkTreeIter * iter, GdkPixbuf * icon_24 = browser->pb_file_24; #if GTK_CHECK_VERSION(2, 6, 0) GdkPixbuf * icon_48 = browser->pb_file_48; + GdkPixbuf * icon_96 = browser->pb_file_96; #endif if((p = g_filename_to_utf8(display, -1, NULL, NULL, NULL)) != NULL) @@ -889,12 +921,17 @@ static void _loop_update(Browser * browser, GtkTreeIter * iter, #endif } else if((type = mime_type(browser->mime, display)) != NULL) + { icon_24 = mime_icons(browser->mime, browser->theme, #if GTK_CHECK_VERSION(2, 6, 0) type, &icon_48); + if(strncmp(type, "image/", 6) == 0) + icon_96 = gdk_pixbuf_new_from_file_at_size( + path, 96, 96, NULL); #else type, NULL); #endif + } } gtk_list_store_set(browser->store, iter, BR_COL_UPDATED, 1, BR_COL_PATH, path, BR_COL_DISPLAY_NAME, display, @@ -1029,6 +1066,7 @@ static void _view_details(Browser * browser); #if GTK_CHECK_VERSION(2, 6, 0) static void _view_icons(Browser * browser); static void _view_list(Browser * browser); +static void _view_thumbnails(Browser * browser); #endif void browser_set_view(Browser * browser, BrowserView view) { @@ -1044,6 +1082,9 @@ void browser_set_view(Browser * browser, BrowserView view) case BV_LIST: _view_list(browser); break; + case BV_THUMBNAILS: + _view_thumbnails(browser); + break; #endif } } @@ -1206,6 +1247,41 @@ static void _view_list(Browser * browser) GTK_ORIENTATION_HORIZONTAL); gtk_widget_show(browser->iconview); } + +static void _view_thumbnails(Browser * browser) +{ +#if GTK_CHECK_VERSION(2, 8, 0) + GtkCellRenderer * renderer; + + _view_icon_view(browser); + renderer = gtk_cell_renderer_pixbuf_new(); + g_object_set(renderer, "follow-state", TRUE, NULL); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(browser->iconview), renderer, + TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(browser->iconview), + renderer, "pixbuf", BR_COL_PIXBUF_96, NULL); + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "editable", TRUE, "xalign", 0.5, + "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", 112, + NULL); + g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK( + on_filename_edited), browser); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(browser->iconview), renderer, + TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(browser->iconview), + renderer, "text", BR_COL_DISPLAY_NAME, NULL); +#else + _view_icon_view(browser); + gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(browser->iconview), + BR_COL_PIXBUF_96); + gtk_icon_view_set_text_column(GTK_ICON_VIEW(browser->iconview), + BR_COL_DISPLAY_NAME); +#endif /* !GTK_CHECK_VERSION(2, 8, 0) */ + gtk_icon_view_set_item_width(GTK_ICON_VIEW(browser->iconview), 112); + gtk_icon_view_set_orientation(GTK_ICON_VIEW(browser->iconview), + GTK_ORIENTATION_VERTICAL); + gtk_widget_show(browser->iconview); +} #endif diff --git a/src/browser.h b/src/browser.h index a69d9cd..37c39cf 100644 --- a/src/browser.h +++ b/src/browser.h @@ -34,6 +34,7 @@ enum BR_COL_PIXBUF_24, # if GTK_CHECK_VERSION(2, 6, 0) BR_COL_PIXBUF_48, + BR_COL_PIXBUF_96, # endif BR_COL_INODE, BR_COL_IS_DIRECTORY, @@ -50,9 +51,10 @@ typedef enum _BrowserView BV_DETAILS = 0, # if GTK_CHECK_VERSION(2, 6, 0) BV_ICONS, - BV_LIST + BV_LIST, + BV_THUMBNAILS } BrowserView; -# define BV_LAST BV_LIST +# define BV_LAST BV_THUMBNAILS # else } BrowserView; # define BV_LAST BV_DETAILS @@ -95,6 +97,9 @@ typedef struct _Browser GdkPixbuf * pb_file_48; GdkPixbuf * pb_folder_48; GdkPixbuf * pb_executable_48; + GdkPixbuf * pb_file_96; + GdkPixbuf * pb_folder_96; + GdkPixbuf * pb_executable_96; #endif GtkWidget * window; GtkToolItem * tb_back; diff --git a/src/callbacks.c b/src/callbacks.c index 485c950..f6f27c2 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -365,6 +365,14 @@ void on_view_list(GtkWidget * widget, gpointer data) browser_set_view(browser, BV_LIST); } + + +void on_view_thumbnails(GtkWidget * widget, gpointer data) +{ + Browser * browser = data; + + browser_set_view(browser, BV_THUMBNAILS); +} #endif /* GTK_CHECK_VERSION(2, 6, 0) */ @@ -654,7 +662,10 @@ void on_view_as(GtkWidget * widget, gpointer data) if(browser->iconview == NULL) browser_set_view(browser, BV_ICONS); else if(gtk_icon_view_get_orientation(GTK_ICON_VIEW(browser->iconview)) - == GTK_ORIENTATION_VERTICAL) + == GTK_ORIENTATION_HORIZONTAL) + browser_set_view(browser, BV_THUMBNAILS); + else if(gtk_icon_view_get_item_width(GTK_ICON_VIEW(browser->iconview)) + != 112) browser_set_view(browser, BV_LIST); else browser_set_view(browser, BV_DETAILS); diff --git a/src/callbacks.h b/src/callbacks.h index ed3452f..aef9afe 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -46,6 +46,7 @@ void on_view_home(GtkWidget * widget, gpointer data); void on_view_details(GtkWidget * widget, gpointer data); void on_view_icons(GtkWidget * widget, gpointer data); void on_view_list(GtkWidget * widget, gpointer data); +void on_view_thumbnails(GtkWidget * widget, gpointer data); #endif /* toolbar */