diff --git a/ChangeLog b/ChangeLog index 92de55392..4b77a5e2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15,6 +15,7 @@ add change detection blacklist add mount and unmount run-task socket commands new maximum Small and Large icon sizes to 256x256 + new View|Style|Large Icons options for Detailed/Compact #478 #480 Show|Display Name %n devnum open block device on command line eg spacefm /dev/sdd1 allow bookmark block devices @@ -22,6 +23,7 @@ [GTK2] select next file after delete/rename current #411 detect subdir mount fix evt_device not executed if Devices pane unshown + fix GLib-CRITICAL source ID not found warning on file prop close 0.9.4 2014-03-30: improve inotify error messages configure.ac default make options; fix -Wformat-security warning #416 diff --git a/src/main-window.c b/src/main-window.c index 14701e62a..7bedcddf2 100644 --- a/src/main-window.c +++ b/src/main-window.c @@ -1269,6 +1269,7 @@ void update_views_all_windows( GtkWidget* item, PtkFileBrowser* file_browser ) if ( !file_browser ) return; p = file_browser->mypanel; + ptk_file_browser_update_views( NULL, file_browser ); // do other windows @@ -1284,9 +1285,7 @@ void update_views_all_windows( GtkWidget* item, PtkFileBrowser* file_browser ) a_browser = PTK_FILE_BROWSER( gtk_notebook_get_nth_page( GTK_NOTEBOOK( notebook ), cur_tabx ) ); if ( a_browser != file_browser ) - { ptk_file_browser_update_views( NULL, a_browser ); - } } } } diff --git a/src/ptk/ptk-file-browser.c b/src/ptk/ptk-file-browser.c index 44b5b724a..657e2afe7 100644 --- a/src/ptk/ptk-file-browser.c +++ b/src/ptk/ptk-file-browser.c @@ -1744,7 +1744,7 @@ void create_side_views( PtkFileBrowser* file_browser, int mode ) void ptk_file_browser_update_views( GtkWidget* item, PtkFileBrowser* file_browser ) { int i; -//printf("ptk_file_browser_update_views fb=%#x (panel %d)\n", file_browser, file_browser->mypanel ); +//printf("ptk_file_browser_update_views fb=%p (panel %d)\n", file_browser, file_browser->mypanel ); FMMainWindow* main_window = (FMMainWindow*)file_browser->main_window; // hide/show browser widgets based on user settings @@ -1963,7 +1963,19 @@ void ptk_file_browser_update_views( GtkWidget* item, PtkFileBrowser* file_browse if ( pos < 20 ) pos = -1; //printf( "slide_s = %d\n", pos ); gtk_paned_set_position( GTK_PANED( file_browser->side_vpane_bottom ), pos ); - + + // Large Icons - option for Detailed and Compact list views + gboolean large_icons = xset_get_b_panel( p, "list_icons" ) || + xset_get_b_panel_mode( p, "list_large", mode ); + if ( large_icons != file_browser->large_icons && file_browser->folder_view ) + { + // force rebuild of folder_view for icon size change + gtk_widget_destroy( file_browser->folder_view ); + file_browser->folder_view = NULL; + } + file_browser->large_icons = large_icons; + + // List Styles if ( xset_get_b_panel( p, "list_detailed" ) ) { @@ -2099,6 +2111,10 @@ GtkWidget* ptk_file_browser_new( int curpanel, GtkWidget* notebook, } file_browser->view_mode = view_mode; //sfm was after next line + // Large Icons - option for Detailed and Compact list views + file_browser->large_icons = view_mode == PTK_FB_ICON_VIEW || + xset_get_b_panel_mode( file_browser->mypanel, "list_large", + ((FMMainWindow*)main_window)->panel_context[file_browser->mypanel-1] ); file_browser->folder_view = create_folder_view( file_browser, view_mode ); gtk_container_add ( GTK_CONTAINER ( file_browser->folder_view_scroll ), @@ -2847,7 +2863,7 @@ void ptk_file_browser_update_model( PtkFileBrowser* file_browser ) file_browser->sort_type ); show_thumbnails( file_browser, list, - file_browser->view_mode == PTK_FB_ICON_VIEW, + file_browser->large_icons, file_browser->max_thumbnail ); g_signal_connect( list, "sort-column-changed", G_CALLBACK( on_sort_col_changed ), file_browser ); @@ -2916,7 +2932,7 @@ void on_dir_file_listed( VFSDir* dir, { show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - file_browser->view_mode == PTK_FB_ICON_VIEW, + file_browser->large_icons, file_browser->max_thumbnail ); } } @@ -4457,15 +4473,20 @@ static GtkWidget* create_folder_view( PtkFileBrowser* file_browser, if( view_mode == PTK_FB_COMPACT_VIEW ) { + icon_size = file_browser->large_icons ? big_icon_size : + small_icon_size; + exo_icon_view_set_layout_mode( (ExoIconView*)folder_view, EXO_ICON_VIEW_LAYOUT_COLS ); exo_icon_view_set_orientation( (ExoIconView*)folder_view, GTK_ORIENTATION_HORIZONTAL ); } else { + icon_size = big_icon_size; + exo_icon_view_set_column_spacing( (ExoIconView*)folder_view, 4 ); exo_icon_view_set_item_width ( (ExoIconView*)folder_view, - app_settings.big_icon_size < 110 ? 110 : - app_settings.big_icon_size ); + icon_size < 110 ? 110 : + icon_size ); } exo_icon_view_set_selection_mode ( (ExoIconView*)folder_view, @@ -4494,10 +4515,13 @@ static GtkWidget* create_folder_view( PtkFileBrowser* file_browser, "follow_state", TRUE, NULL ); gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( folder_view ), renderer, FALSE ); + gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), + renderer, + "pixbuf", + file_browser->large_icons ? + COL_FILE_BIG_ICON : COL_FILE_SMALL_ICON ); gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, - "pixbuf", view_mode == PTK_FB_COMPACT_VIEW ? COL_FILE_SMALL_ICON : COL_FILE_BIG_ICON ); - gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, - "info", COL_FILE_INFO ); + "info", COL_FILE_INFO ); /* add the name renderer */ renderer = ptk_text_renderer_new (); @@ -4507,19 +4531,17 @@ static GtkWidget* create_folder_view( PtkFileBrowser* file_browser, "xalign", 0.0, "yalign", 0.5, NULL ); - icon_size = small_icon_size; } else { g_object_set ( G_OBJECT ( renderer ), "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", - app_settings.big_icon_size < 110 ? 109 : - app_settings.big_icon_size, + icon_size < 110 ? 109 : + icon_size, "xalign", 0.5, "yalign", 0.0, NULL ); - icon_size = big_icon_size; } gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT ( folder_view ), renderer, TRUE ); gtk_cell_layout_add_attribute ( GTK_CELL_LAYOUT ( folder_view ), renderer, @@ -4566,7 +4588,7 @@ static GtkWidget* create_folder_view( PtkFileBrowser* file_browser, exo_tree_view_set_single_click_timeout( (ExoTreeView*)folder_view, app_settings.no_single_hover ? 0 : SINGLE_CLICK_TIMEOUT ); - icon_size = small_icon_size; + icon_size = file_browser->large_icons ? big_icon_size : small_icon_size; gtk_tree_view_enable_model_drag_source ( GTK_TREE_VIEW( folder_view ), @@ -4752,8 +4774,11 @@ void init_list_view( PtkFileBrowser* file_browser, GtkTreeView* list_view ) gtk_tree_view_column_pack_start( col, pix_renderer, FALSE ); gtk_tree_view_column_set_attributes( col, pix_renderer, - "pixbuf", COL_FILE_SMALL_ICON, - "info", COL_FILE_INFO, NULL ); + "pixbuf", + file_browser->large_icons ? + COL_FILE_BIG_ICON : COL_FILE_SMALL_ICON, + "info", COL_FILE_INFO, NULL ); + gtk_tree_view_column_set_expand ( col, TRUE ); gtk_tree_view_column_set_sizing( col, GTK_TREE_VIEW_COLUMN_FIXED ); gtk_tree_view_column_set_min_width( col, 150 ); @@ -4817,7 +4842,7 @@ void ptk_file_browser_refresh( GtkWidget* item, PtkFileBrowser* file_browser ) { // clear thumbnails show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - file_browser->view_mode == PTK_FB_ICON_VIEW, 0 ); + file_browser->large_icons, 0 ); while( gtk_events_pending() ) gtk_main_iteration(); } @@ -6342,7 +6367,7 @@ void ptk_file_browser_view_as_compact_list( PtkFileBrowser* file_browser ) show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - FALSE, file_browser->max_thumbnail ); + file_browser->large_icons, file_browser->max_thumbnail ); file_browser->view_mode = PTK_FB_COMPACT_VIEW; if ( file_browser->folder_view ) @@ -6363,7 +6388,7 @@ void ptk_file_browser_view_as_list ( PtkFileBrowser* file_browser ) return ; show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - FALSE, file_browser->max_thumbnail ); + file_browser->large_icons, file_browser->max_thumbnail ); file_browser->view_mode = PTK_FB_LIST_VIEW; if ( file_browser->folder_view ) @@ -6693,11 +6718,14 @@ void ptk_file_browser_show_thumbnails( PtkFileBrowser* file_browser, if ( file_browser->file_list ) { show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - file_browser->view_mode == PTK_FB_ICON_VIEW, + file_browser->large_icons, max_file_size ); } } +#if 0 +// no longer used because icon size changes required a rebuild of folder_view +// due to text renderer not resizing void ptk_file_browser_update_display( PtkFileBrowser* file_browser ) { GtkTreeSelection * tree_sel; @@ -6711,20 +6739,28 @@ void ptk_file_browser_update_display( PtkFileBrowser* file_browser ) if ( file_browser->max_thumbnail ) show_thumbnails( file_browser, PTK_FILE_LIST( file_browser->file_list ), - file_browser->view_mode == PTK_FB_ICON_VIEW, + file_browser->large_icons, file_browser->max_thumbnail ); vfs_mime_type_get_icon_size( &big_icon_size, &small_icon_size ); - if ( file_browser->view_mode == PTK_FB_ICON_VIEW || file_browser->view_mode == PTK_FB_COMPACT_VIEW ) + if ( file_browser->view_mode == PTK_FB_ICON_VIEW || + file_browser->view_mode == PTK_FB_COMPACT_VIEW ) { - sel = exo_icon_view_get_selected_items( EXO_ICON_VIEW( file_browser->folder_view ) ); + sel = exo_icon_view_get_selected_items( + EXO_ICON_VIEW( file_browser->folder_view ) ); - exo_icon_view_set_model( EXO_ICON_VIEW( file_browser->folder_view ), NULL ); + exo_icon_view_set_model( EXO_ICON_VIEW( file_browser->folder_view ), + NULL ); if( file_browser->view_mode == PTK_FB_ICON_VIEW ) - gtk_cell_renderer_set_fixed_size( file_browser->icon_render, big_icon_size, big_icon_size ); + gtk_cell_renderer_set_fixed_size( file_browser->icon_render, + big_icon_size, big_icon_size ); else if( file_browser->view_mode == PTK_FB_COMPACT_VIEW ) - gtk_cell_renderer_set_fixed_size( file_browser->icon_render, small_icon_size, small_icon_size ); + gtk_cell_renderer_set_fixed_size( file_browser->icon_render, + file_browser->large_icons ? big_icon_size : + small_icon_size, + file_browser->large_icons ? big_icon_size : + small_icon_size ); exo_icon_view_set_model( EXO_ICON_VIEW( file_browser->folder_view ), GTK_TREE_MODEL( file_browser->file_list ) ); @@ -6738,11 +6774,17 @@ void ptk_file_browser_update_display( PtkFileBrowser* file_browser ) } else if ( file_browser->view_mode == PTK_FB_LIST_VIEW ) { - tree_sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( file_browser->folder_view ) ); + tree_sel = gtk_tree_view_get_selection( + GTK_TREE_VIEW( file_browser->folder_view ) ); sel = gtk_tree_selection_get_selected_rows( tree_sel, NULL ); - gtk_tree_view_set_model( GTK_TREE_VIEW( file_browser->folder_view ), NULL ); - gtk_cell_renderer_set_fixed_size( file_browser->icon_render, small_icon_size, small_icon_size ); + gtk_tree_view_set_model( GTK_TREE_VIEW( file_browser->folder_view ), + NULL ); + gtk_cell_renderer_set_fixed_size( file_browser->icon_render, + file_browser->large_icons ? big_icon_size : + small_icon_size, + file_browser->large_icons ? big_icon_size : + small_icon_size ); gtk_tree_view_set_model( GTK_TREE_VIEW( file_browser->folder_view ), GTK_TREE_MODEL( file_browser->file_list ) ); @@ -6756,6 +6798,7 @@ void ptk_file_browser_update_display( PtkFileBrowser* file_browser ) g_list_free( sel ); g_object_unref( G_OBJECT( file_browser->file_list ) ); } +#endif void ptk_file_browser_emit_open( PtkFileBrowser* file_browser, const char* path, @@ -7356,6 +7399,15 @@ void ptk_file_browser_on_action( PtkFileBrowser* browser, char* setname ) on_popup_list_icons( NULL, browser ); else if ( !strcmp( xname, "list_compact" ) ) // shared key on_popup_list_compact( NULL, browser ); + else if ( !strcmp( xname, "list_large" ) ) // shared key + { + if ( browser->view_mode != PTK_FB_ICON_VIEW ) + { + xset_set_b_panel( browser->mypanel, "list_large", + !browser->large_icons ); + on_popup_list_large( NULL, browser ); + } + } else if ( !strcmp( xname, "icon_tab" ) || g_str_has_prefix( xname, "font_" ) ) main_update_fonts( NULL, browser ); diff --git a/src/ptk/ptk-file-browser.h b/src/ptk/ptk-file-browser.h index ee0837faa..30be21147 100644 --- a/src/ptk/ptk-file-browser.h +++ b/src/ptk/ptk-file-browser.h @@ -81,6 +81,7 @@ struct _PtkFileBrowser gboolean show_side_pane : 1; gboolean show_side_pane_buttons : 1; gboolean show_hidden_files : 1; + gboolean large_icons : 1; gboolean busy : 1; gboolean pending_drag_status : 1; dev_t drag_source_dev; @@ -293,7 +294,7 @@ void ptk_file_browser_hide_selected( PtkFileBrowser* file_browser, void ptk_file_browser_show_thumbnails( PtkFileBrowser* file_browser, int max_file_size ); -void ptk_file_browser_update_display( PtkFileBrowser* file_browser ); +//void ptk_file_browser_update_display( PtkFileBrowser* file_browser ); void ptk_file_browser_emit_open( PtkFileBrowser* file_browser, const char* path, diff --git a/src/ptk/ptk-file-list.c b/src/ptk/ptk-file-list.c index dd364d4df..5668a81b6 100644 --- a/src/ptk/ptk-file-list.c +++ b/src/ptk/ptk-file-list.c @@ -1011,6 +1011,9 @@ void ptk_file_list_show_thumbnails( PtkFileList* list, gboolean is_big, VFSFileInfo* file; int old_max_thumbnail; + if ( !list ) + return; + old_max_thumbnail = list->max_thumbnail; list->max_thumbnail = max_file_size; list->big_thumbnail = is_big; @@ -1039,7 +1042,6 @@ void ptk_file_list_show_thumbnails( PtkFileList* list, gboolean is_big, } return; } - g_signal_connect( list->dir, "thumbnail-loaded", G_CALLBACK(on_thumbnail_loaded), list ); diff --git a/src/ptk/ptk-file-menu.c b/src/ptk/ptk-file-menu.c index 035c461f0..ba2fbce58 100644 --- a/src/ptk/ptk-file-menu.c +++ b/src/ptk/ptk-file-menu.c @@ -148,6 +148,17 @@ static void on_popup_open_all( GtkMenuItem *menuitem, PtkFileMenu* data ); void on_popup_canon ( GtkMenuItem *menuitem, PtkFileMenu* data ); +void on_popup_list_large( GtkMenuItem *menuitem, PtkFileBrowser* browser ) +{ + int p = browser->mypanel; + FMMainWindow* main_window = (FMMainWindow*)browser->main_window; + char mode = main_window->panel_context[p-1]; + + xset_set_b_panel_mode( p, "list_large", mode, + xset_get_b_panel( p, "list_large" ) ); + update_views_all_windows( NULL, browser ); +} + void on_popup_list_detailed( GtkMenuItem *menuitem, PtkFileBrowser* browser ) { int p = browser->mypanel; @@ -1333,6 +1344,19 @@ GtkWidget* ptk_file_menu_new( DesktopWindow* desktop, PtkFileBrowser* browser, xset_set( "rubberband", "disable", "1" ); } + if ( browser->view_mode == PTK_FB_ICON_VIEW ) + { + set = xset_set_b_panel( p, "list_large", TRUE ); + set->disable = TRUE; + } + else + { + set = xset_set_cb_panel( p, "list_large", on_popup_list_large, + browser ); + set->disable = FALSE; + set->b = xset_get_panel_mode( p, "list_large", mode )->b; + } + set = xset_set_cb_panel( p, "list_detailed", on_popup_list_detailed, browser ); xset_set_ob2( set, NULL, NULL ); @@ -1421,8 +1445,8 @@ GtkWidget* ptk_file_menu_new( DesktopWindow* desktop, PtkFileBrowser* browser, xset_set_cb_panel( p, "font_file", main_update_fonts, browser ); set = xset_get( "view_list_style" ); - desc = g_strdup_printf( "panel%d_list_detailed panel%d_list_compact panel%d_list_icons sep_v5 rubberband sep_v6 panel%d_font_file", - p, p, p, p ); + desc = g_strdup_printf( "panel%d_list_detailed panel%d_list_compact panel%d_list_icons sep_v5 panel%d_list_large rubberband sep_v6 panel%d_font_file", + p, p, p, p, p ); xset_set_set( set, "desc", desc ); g_free( desc ); set = xset_get( "view_fonts" ); diff --git a/src/ptk/ptk-file-menu.h b/src/ptk/ptk-file-menu.h index d13f45e04..139a3c721 100644 --- a/src/ptk/ptk-file-menu.h +++ b/src/ptk/ptk-file-menu.h @@ -52,6 +52,7 @@ void on_popup_sortby( GtkMenuItem *menuitem, PtkFileBrowser* file_browser, int o void on_popup_list_detailed( GtkMenuItem *menuitem, PtkFileBrowser* browser ); void on_popup_list_icons( GtkMenuItem *menuitem, PtkFileBrowser* browser ); void on_popup_list_compact( GtkMenuItem *menuitem, PtkFileBrowser* browser ); +void on_popup_list_large( GtkMenuItem *menuitem, PtkFileBrowser* browser ); void on_popup_rubber( GtkMenuItem *menuitem, PtkFileBrowser* file_browser ); G_END_DECLS diff --git a/src/settings.c b/src/settings.c index 1017cbb42..09934c701 100755 --- a/src/settings.c +++ b/src/settings.c @@ -11367,6 +11367,11 @@ void xset_defaults() if ( p != 1 ) xset_set_set( set, "shared_key", "panel1_list_compact" ); + set = xset_set_panel( p, "list_large", "lbl", _("_Large Icons") ); + set->menu_style = XSET_MENU_CHECK; + if ( p != 1 ) + xset_set_set( set, "shared_key", "panel1_list_large" ); + set = xset_set_panel( p, "show_hidden", "lbl", _("_Hidden Files") ); set->menu_style = XSET_MENU_CHECK; if ( p != 1 ) diff --git a/src/settings.h b/src/settings.h index 296775847..b39fe04e9 100644 --- a/src/settings.h +++ b/src/settings.h @@ -12,7 +12,7 @@ #define SINGLE_CLICK_TIMEOUT 150 // This limits the small icon size for side panes and task list -#define PANE_MAX_ICON_SIZE 32 +#define PANE_MAX_ICON_SIZE 48 typedef enum { WPM_STRETCH,