From 85c0987872152f345ccee4c1449e91deca42a647 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Fri, 30 Jul 1999 13:07:21 +0000 Subject: [PATCH] r38: Rescanning a directory only shrinks the item width at the end rather than the beginning to reduce flicker. Added Select All and Clear Selection. File '' menu item is now updated to reflect what is actually selected. --- ROX-Filer/src/dnd.c | 18 -------------- ROX-Filer/src/filer.c | 26 ++++++++++++++++++- ROX-Filer/src/filer.h | 2 ++ ROX-Filer/src/menu.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------- ROX-Filer/src/type.c | 30 ++++++++++++++++++++++ ROX-Filer/src/type.h | 2 ++ 6 files changed, 119 insertions(+), 28 deletions(-) diff --git a/ROX-Filer/src/dnd.c b/ROX-Filer/src/dnd.c index 42b6b976..56de13cc 100644 --- a/ROX-Filer/src/dnd.c +++ b/ROX-Filer/src/dnd.c @@ -44,7 +44,6 @@ static char *get_dest_path(FilerWindow *filer_window, GdkDragContext *context); static void create_uri_list(GString *string, Collection *collection, FilerWindow *filer_window); -static FileItem *selected_item(Collection *collection); static gboolean drag_drop(GtkWidget *widget, GdkDragContext *context, gint x, @@ -263,23 +262,6 @@ static void create_uri_list(GString *string, g_string_free(leader, TRUE); } -static FileItem *selected_item(Collection *collection) -{ - int i; - - g_return_val_if_fail(collection != NULL, NULL); - g_return_val_if_fail(IS_COLLECTION(collection), NULL); - g_return_val_if_fail(collection->number_selected == 1, NULL); - - for (i = 0; i < collection->number_of_items; i++) - if (collection->items[i].selected) - return (FileItem *) collection->items[i].data; - - g_warning("selected_item: number_selected is wrong\n"); - - return NULL; -} - /* DRAGGING FROM US */ /* The user has held the mouse button down over an item and moved - diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index 31f2a7b5..6fed581e 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -152,6 +152,9 @@ static gboolean idle_scan_dir(gpointer data) closedir(filer_window->dir); filer_window->dir = NULL; + collection_set_item_size(filer_window->collection, + filer_window->scan_min_width, + filer_window->collection->item_height); collection_qsort(filer_window->collection, sort_by_name); return FALSE; /* Finished */ @@ -283,6 +286,9 @@ static void add_item(FilerWindow *filer_window, char *leafname) item_width = MAX(item->pix_width, item->text_width) + 4; + if (item_width > filer_window->scan_min_width) + filer_window->scan_min_width = item_width; + if (item_width > filer_window->collection->item_width) collection_set_item_size(filer_window->collection, item_width, @@ -406,7 +412,6 @@ void scan_dir(FilerWindow *filer_window) mount_update(); - collection_set_item_size(filer_window->collection, 64, 64); free_temp_icons(filer_window); collection_clear(filer_window->collection); gtk_window_set_title(GTK_WINDOW(filer_window->window), @@ -426,6 +431,8 @@ void scan_dir(FilerWindow *filer_window) return; } + filer_window->scan_min_width = 64; + filer_window->idle_scan_id = gtk_idle_add(idle_scan_dir, filer_window); } @@ -630,6 +637,22 @@ static gint key_press_event(GtkWidget *widget, return FALSE; } +FileItem *selected_item(Collection *collection) +{ + int i; + + g_return_val_if_fail(collection != NULL, NULL); + g_return_val_if_fail(IS_COLLECTION(collection), NULL); + g_return_val_if_fail(collection->number_selected == 1, NULL); + + for (i = 0; i < collection->number_of_items; i++) + if (collection->items[i].selected) + return (FileItem *) collection->items[i].data; + + g_warning("selected_item: number_selected is wrong\n"); + + return NULL; +} void filer_opendir(char *path, gboolean panel, Side panel_side) { @@ -649,6 +672,7 @@ void filer_opendir(char *path, gboolean panel, Side panel_side) gtk_object_set_data(GTK_OBJECT(collection), "filer_window", filer_window); filer_window->collection = COLLECTION(collection); + collection_set_item_size(filer_window->collection, 64, 64); collection_set_functions(filer_window->collection, draw_item, test_point); diff --git a/ROX-Filer/src/filer.h b/ROX-Filer/src/filer.h index a93ebcd6..cd1d2ca0 100644 --- a/ROX-Filer/src/filer.h +++ b/ROX-Filer/src/filer.h @@ -41,6 +41,7 @@ struct _FilerWindow /* Scanning */ DIR *dir; gint idle_scan_id; /* (only if dir != NULL) */ + guint scan_min_width; /* Min width possible so far */ }; struct _FileItem @@ -64,5 +65,6 @@ void filer_init(); void filer_opendir(char *path, gboolean panel, Side panel_side); void scan_dir(FilerWindow *filer_window); void panel_set_timeout(FilerWindow *filer_window, gulong msec); +FileItem *selected_item(Collection *collection); #endif /* _FILER_H */ diff --git a/ROX-Filer/src/menu.c b/ROX-Filer/src/menu.c index 9ac45203..36aac799 100644 --- a/ROX-Filer/src/menu.c +++ b/ROX-Filer/src/menu.c @@ -13,6 +13,7 @@ #include #include "filer.h" +#include "type.h" #include "support.h" #include "gui_support.h" #include "options.h" @@ -33,6 +34,8 @@ static void menu_closed(GtkWidget *widget); static void refresh(gpointer data, guint action, GtkWidget *widget); static void mount(gpointer data, guint action, GtkWidget *widget); static void delete(gpointer data, guint action, GtkWidget *widget); +static void select_all(gpointer data, guint action, GtkWidget *widget); +static void clear_selection(gpointer data, guint action, GtkWidget *widget); static void show_options(gpointer data, guint action, GtkWidget *widget); static void new_directory(gpointer data, guint action, GtkWidget *widget); static void xterm_here(gpointer data, guint action, GtkWidget *widget); @@ -42,7 +45,9 @@ static void open_as_dir(gpointer data, guint action, GtkWidget *widget); static void close_panel(gpointer data, guint action, GtkWidget *widget); static GtkWidget *filer_menu; /* The popup filer menu */ +static GtkWidget *filer_file_item; /* The File '' menu */ static GtkWidget *panel_menu; /* The popup panel menu */ +static GtkWidget *panel_file_item; /* The File '' menu */ static GtkItemFactoryEntry filer_menu_def[] = { {"/Display", NULL, NULL, 0, ""}, @@ -69,8 +74,8 @@ static GtkItemFactoryEntry filer_menu_def[] = { {"/File/Permissions", NULL, NULL, 0, NULL}, {"/File/Stamp", NULL, NULL, 0, NULL}, {"/File/Find", NULL, NULL, 0, NULL}, -{"/Select All", C_"A", NULL, 0, NULL}, -{"/Clear Selection", C_"Z", NULL, 0, NULL}, +{"/Select All", C_"A", select_all, 0, NULL}, +{"/Clear Selection", C_"Z", clear_selection, 0, NULL}, {"/Options...", NULL, show_options, 0, NULL}, {"/New directory", NULL, new_directory, 0, NULL}, {"/Xterm here", NULL, xterm_here, 0, NULL}, @@ -101,6 +106,7 @@ void menu_init() { GtkItemFactory *item_factory; char *menurc; + GList *items; filer_keys = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU, @@ -111,6 +117,9 @@ void menu_init() filer_menu_def, NULL); filer_menu = gtk_item_factory_get_widget(item_factory, ""); + items = gtk_container_children(GTK_CONTAINER(filer_menu)); + filer_file_item = GTK_BIN(g_list_nth(items, 1)->data)->child; + g_list_free(items); panel_keys = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU, @@ -121,6 +130,9 @@ void menu_init() panel_menu_def, NULL); panel_menu = gtk_item_factory_get_widget(item_factory, ""); + items = gtk_container_children(GTK_CONTAINER(panel_menu)); + panel_file_item = GTK_BIN(g_list_nth(items, 1)->data)->child; + g_list_free(items); menurc = choices_find_path_load("menus"); if (menurc) @@ -175,7 +187,9 @@ static void position_menu(GtkMenu *menu, gint *x, gint *y, gpointer data) void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event, int item) { - int pos[] = {event->x_root, event->y_root}; + GString *buffer; + FileItem *file_item; + int pos[] = {event->x_root, event->y_root}; window_with_focus = filer_window; @@ -190,12 +204,6 @@ void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event, } } - if (filer_window->panel) - { - collection_clear_selection(filer_window->collection); - panel_set_timeout(NULL, 0); - } - if (filer_window->collection->number_selected == 0 && item >= 0) { collection_select_item(filer_window->collection, item); @@ -204,6 +212,35 @@ void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event, else filer_window->temp_item_selected = FALSE; + buffer = g_string_new(NULL); + switch (filer_window->collection->number_selected) + { + case 0: + g_string_assign(buffer, ""); + break; + case 1: + file_item = selected_item(filer_window->collection); + g_string_sprintf(buffer, "%s '%s'", + basetype_name(file_item), + file_item->leafname); + break; + default: + g_string_sprintf(buffer, "%d items", + filer_window->collection->number_selected); + break; + } + + if (filer_window->panel) + { + collection_clear_selection(filer_window->collection); + panel_set_timeout(NULL, 0); + gtk_label_set_text(GTK_LABEL(panel_file_item), buffer->str); + } + else + gtk_label_set_text(GTK_LABEL(filer_file_item), buffer->str); + + g_string_free(buffer, TRUE); + gtk_menu_popup(filer_window->panel ? GTK_MENU(panel_menu) : GTK_MENU(filer_menu), NULL, NULL, position_menu, @@ -316,6 +353,20 @@ static void mount(gpointer data, guint action, GtkWidget *widget) report_error("ROX-Filer", error); } +static void select_all(gpointer data, guint action, GtkWidget *widget) +{ + g_return_if_fail(window_with_focus != NULL); + + collection_select_all(window_with_focus->collection); +} + +static void clear_selection(gpointer data, guint action, GtkWidget *widget) +{ + g_return_if_fail(window_with_focus != NULL); + + collection_clear_selection(window_with_focus->collection); +} + static void show_options(gpointer data, guint action, GtkWidget *widget) { g_return_if_fail(window_with_focus != NULL); diff --git a/ROX-Filer/src/type.c b/ROX-Filer/src/type.c index 75ceb06d..3aa6974e 100644 --- a/ROX-Filer/src/type.c +++ b/ROX-Filer/src/type.c @@ -12,6 +12,8 @@ #include #include +#include "filer.h" +#include "pixmaps.h" #include "apps.h" #include "gui_support.h" #include "choices.h" @@ -27,6 +29,34 @@ void type_init() { } +char *basetype_name(FileItem *item) +{ + if (item->flags & ITEM_FLAG_SYMLINK) + return "Sym link"; + else if (item->flags & ITEM_FLAG_MOUNT_POINT) + return "Mount point"; + else if (item->flags & ITEM_FLAG_APPDIR) + return "App dir"; + + switch (item->base_type) + { + case TYPE_FILE: + return "File"; + case TYPE_DIRECTORY: + return "Dir"; + case TYPE_CHAR_DEVICE: + return "Char dev"; + case TYPE_BLOCK_DEVICE: + return "Block dev"; + case TYPE_PIPE: + return "Pipe"; + case TYPE_SOCKET: + return "Socket"; + } + + return "Unknown"; +} + /* MIME-type guessing */ /* Returns a pointer to the MIME-type string, or NULL if we have diff --git a/ROX-Filer/src/type.h b/ROX-Filer/src/type.h index ee08f078..93da1a2e 100644 --- a/ROX-Filer/src/type.h +++ b/ROX-Filer/src/type.h @@ -17,6 +17,8 @@ struct _MIME_type /* Prototypes */ void type_init(); +char *basetype_name(FileItem *item); + MIME_type *type_from_path(char *path); gboolean type_open(char *path, MIME_type *type); -- 2.11.4.GIT