diff options
author | John Sullivan <sullivan@src.gnome.org> | 2000-02-21 21:34:19 +0000 |
---|---|---|
committer | John Sullivan <sullivan@src.gnome.org> | 2000-02-21 21:34:19 +0000 |
commit | 6f858ac91260177c3412170c4af20072d23c51df (patch) | |
tree | 2a32fe9dfc1eee7581d707b1a8a0b2e9835c581b /src | |
parent | 3d43e3d01947d5d90d9663e324e193adb8aee667 (diff) | |
download | nautilus-6f858ac91260177c3412170c4af20072d23c51df.tar.gz |
Made right-click context-menu selection behavior in the file manager more
sensible. (It now modifies the selection exactly as it would on a normal
left-click, and the context menu applies to the whole set of selected items.)
Note that nautilus is quite broken right now; I can't activate an icon or switch
to View as List without dying in Bonobo-land. I managed to test these changes
even so by tiptoeing around the problems.
Diffstat (limited to 'src')
-rw-r--r-- | src/file-manager/fm-directory-view-icons.c | 43 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view-list.c | 17 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view.c | 114 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view.h | 17 |
4 files changed, 110 insertions, 81 deletions
diff --git a/src/file-manager/fm-directory-view-icons.c b/src/file-manager/fm-directory-view-icons.c index 7836dd52e..81616154d 100644 --- a/src/file-manager/fm-directory-view-icons.c +++ b/src/file-manager/fm-directory-view-icons.c @@ -63,10 +63,10 @@ static void fm_directory_view_icons_add_entry (FMDirectoryView *view, static void fm_directory_view_icons_append_background_context_menu_items (FMDirectoryView *view, GtkMenu *menu); -static void fm_directory_view_icons_append_item_context_menu_items +static void fm_directory_view_icons_append_selection_context_menu_items (FMDirectoryView *view, GtkMenu *menu, - NautilusFile *file); + NautilusFileList *files); static void fm_directory_view_icons_background_changed_cb (NautilusBackground *background, FMDirectoryViewIcons *icon_view); static void fm_directory_view_icons_begin_loading @@ -97,8 +97,7 @@ static void icon_container_activate_cb (GnomeIconContainer *container, static void icon_container_selection_changed_cb (GnomeIconContainer *container, FMDirectoryViewIcons *icon_view); -static void icon_container_context_click_icon_cb (GnomeIconContainer *container, - NautilusFile *icon_data, +static void icon_container_context_click_selection_cb (GnomeIconContainer *container, FMDirectoryViewIcons *icon_view); static void icon_container_context_click_background_cb (GnomeIconContainer *container, FMDirectoryViewIcons *icon_view); @@ -148,8 +147,8 @@ fm_directory_view_icons_initialize_class (FMDirectoryViewIconsClass *klass) = fm_directory_view_icons_can_zoom_out; fm_directory_view_class->select_all = fm_directory_view_icons_select_all; - fm_directory_view_class->append_item_context_menu_items - = fm_directory_view_icons_append_item_context_menu_items; + fm_directory_view_class->append_selection_context_menu_items + = fm_directory_view_icons_append_selection_context_menu_items; fm_directory_view_class->append_background_context_menu_items = fm_directory_view_icons_append_background_context_menu_items; @@ -208,8 +207,8 @@ create_icon_container (FMDirectoryViewIcons *icon_view) icon_view); gtk_signal_connect (GTK_OBJECT (icon_container), - "context_click_icon", - GTK_SIGNAL_FUNC (icon_container_context_click_icon_cb), + "context_click_selection", + GTK_SIGNAL_FUNC (icon_container_context_click_selection_cb), icon_view); gtk_signal_connect (GTK_OBJECT (icon_container), @@ -304,25 +303,29 @@ unstretch_item_cb (GtkMenuItem *menu_item, gpointer view) } static void -fm_directory_view_icons_append_item_context_menu_items (FMDirectoryView *view, - GtkMenu *menu, - NautilusFile *file) +fm_directory_view_icons_append_selection_context_menu_items (FMDirectoryView *view, + GtkMenu *menu, + NautilusFileList *files) { GnomeIconContainer *icon_container; GtkWidget *menu_item; + gboolean exactly_one_item_selected; g_assert (FM_IS_DIRECTORY_VIEW (view)); g_assert (GTK_IS_MENU (menu)); - g_assert (file != NULL); NAUTILUS_CALL_PARENT_CLASS (FM_DIRECTORY_VIEW_CLASS, - append_item_context_menu_items, - (view, menu, file)); + append_selection_context_menu_items, + (view, menu, files)); icon_container = get_icon_container (FM_DIRECTORY_VIEW_ICONS (view)); + /* Current stretching UI only works on one item at a time, so we'll + * desensitize the menu item if that's not the case. + */ + exactly_one_item_selected = g_list_length (files) == 1; menu_item = gtk_menu_item_new_with_label (_("Stretch Icon")); - if (gnome_icon_container_has_stretch_handles (icon_container)) + if (!exactly_one_item_selected || gnome_icon_container_has_stretch_handles (icon_container)) gtk_widget_set_sensitive (menu_item, FALSE); gtk_widget_show (menu_item); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", @@ -693,15 +696,13 @@ icon_text_changed_cb (FMSignaller *signaller, } static void -icon_container_context_click_icon_cb (GnomeIconContainer *container, - NautilusFile *file, - FMDirectoryViewIcons *icon_view) +icon_container_context_click_selection_cb (GnomeIconContainer *container, + FMDirectoryViewIcons *icon_view) { g_assert (GNOME_IS_ICON_CONTAINER (container)); - /* g_assert (NAUTILUS_IS_FILE (file)); */ g_assert (FM_IS_DIRECTORY_VIEW_ICONS (icon_view)); - fm_directory_view_popup_item_context_menu (FM_DIRECTORY_VIEW (icon_view), file); + fm_directory_view_pop_up_selection_context_menu (FM_DIRECTORY_VIEW (icon_view)); } static void @@ -711,7 +712,7 @@ icon_container_context_click_background_cb (GnomeIconContainer *container, g_assert (GNOME_IS_ICON_CONTAINER (container)); g_assert (FM_IS_DIRECTORY_VIEW_ICONS (icon_view)); - fm_directory_view_popup_background_context_menu (FM_DIRECTORY_VIEW (icon_view)); + fm_directory_view_pop_up_background_context_menu (FM_DIRECTORY_VIEW (icon_view)); } static void diff --git a/src/file-manager/fm-directory-view-list.c b/src/file-manager/fm-directory-view-list.c index d7a830407..e48d84454 100644 --- a/src/file-manager/fm-directory-view-list.c +++ b/src/file-manager/fm-directory-view-list.c @@ -83,8 +83,7 @@ static void column_clicked_cb (GtkCList *clist, static int compare_rows (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2); -static void context_click_row_cb (GtkCList *clist, - int row, +static void context_click_selection_cb (GtkCList *clist, FMDirectoryViewList *list_view); static void context_click_background_cb (GtkCList *clist, FMDirectoryViewList *list_view); @@ -280,16 +279,12 @@ compare_rows (GtkCList *clist, } static void -context_click_row_cb (GtkCList *clist, int row, FMDirectoryViewList *list_view) +context_click_selection_cb (GtkCList *clist, FMDirectoryViewList *list_view) { - NautilusFile * file; - g_assert (GTK_IS_CLIST (clist)); g_assert (FM_IS_DIRECTORY_VIEW_LIST (list_view)); - file = NAUTILUS_FILE(gtk_clist_get_row_data (clist, row)); - - fm_directory_view_popup_item_context_menu (FM_DIRECTORY_VIEW (list_view), file); + fm_directory_view_pop_up_selection_context_menu (FM_DIRECTORY_VIEW (list_view)); } @@ -298,7 +293,7 @@ context_click_background_cb (GtkCList *clist, FMDirectoryViewList *list_view) { g_assert (FM_IS_DIRECTORY_VIEW_LIST (list_view)); - fm_directory_view_popup_background_context_menu (FM_DIRECTORY_VIEW (list_view)); + fm_directory_view_pop_up_background_context_menu (FM_DIRECTORY_VIEW (list_view)); } @@ -402,8 +397,8 @@ create_flist (FMDirectoryViewList *list_view) column_clicked_cb, list_view); gtk_signal_connect (GTK_OBJECT (flist), - "context_click_row", - context_click_row_cb, + "context_click_selection", + context_click_selection_cb, list_view); gtk_signal_connect (GTK_OBJECT (flist), "context_click_background", diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index 1a3d278bd..be44cac62 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -50,7 +50,7 @@ enum CLEAR, DONE_ADDING_ENTRIES, BEGIN_LOADING, - APPEND_ITEM_CONTEXT_MENU_ITEMS, + APPEND_SELECTION_CONTEXT_MENU_ITEMS, APPEND_BACKGROUND_CONTEXT_MENU_ITEMS, LAST_SIGNAL }; @@ -86,12 +86,11 @@ static void fm_directory_view_append_background_context_menu_items static void fm_directory_view_real_append_background_context_menu_items (FMDirectoryView *view, GtkMenu *menu); -static void fm_directory_view_real_append_item_context_menu_items +static void fm_directory_view_real_append_selection_context_menu_items (FMDirectoryView *view, GtkMenu *menu, - NautilusFile *file); -static GtkMenu *create_item_context_menu (FMDirectoryView *view, - NautilusFile *file); + NautilusFileList *files); +static GtkMenu *create_selection_context_menu (FMDirectoryView *view); static GtkMenu *create_background_context_menu (FMDirectoryView *view); static void stop_location_change_cb (NautilusViewFrame *view_frame, FMDirectoryView *directory_view); @@ -99,7 +98,7 @@ static void notify_location_change_cb (NautilusViewFrame *view_frame, Nautilus_NavigationInfo *nav_context, FMDirectoryView *directory_view); static void open_cb (GtkMenuItem *item, NautilusFile *file); -static void open_in_new_window_cb (GtkMenuItem *item, NautilusFile *file); +static void open_in_new_window_cb (GtkMenuItem *item, NautilusFileList *files); static void select_all_cb (GtkMenuItem *item, FMDirectoryView *directory_view); static void zoom_in_cb (GtkMenuItem *item, FMDirectoryView *directory_view); static void zoom_out_cb (GtkMenuItem *item, FMDirectoryView *directory_view); @@ -165,11 +164,11 @@ fm_directory_view_initialize_class (FMDirectoryViewClass *klass) GTK_SIGNAL_OFFSET (FMDirectoryViewClass, begin_loading), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); - fm_directory_view_signals[APPEND_ITEM_CONTEXT_MENU_ITEMS] = - gtk_signal_new ("append_item_context_menu_items", + fm_directory_view_signals[APPEND_SELECTION_CONTEXT_MENU_ITEMS] = + gtk_signal_new ("append_selection_context_menu_items", GTK_RUN_FIRST, object_class->type, - GTK_SIGNAL_OFFSET (FMDirectoryViewClass, append_item_context_menu_items), + GTK_SIGNAL_OFFSET (FMDirectoryViewClass, append_selection_context_menu_items), gtk_marshal_NONE__BOXED_BOXED, GTK_TYPE_NONE, 2, GTK_TYPE_BOXED, GTK_TYPE_BOXED); fm_directory_view_signals[APPEND_BACKGROUND_CONTEXT_MENU_ITEMS] = @@ -180,7 +179,7 @@ fm_directory_view_initialize_class (FMDirectoryViewClass *klass) gtk_marshal_NONE__BOXED, GTK_TYPE_NONE, 1, GTK_TYPE_BOXED); - klass->append_item_context_menu_items = fm_directory_view_real_append_item_context_menu_items; + klass->append_selection_context_menu_items = fm_directory_view_real_append_selection_context_menu_items; klass->append_background_context_menu_items = fm_directory_view_real_append_background_context_menu_items; /* Function pointers that subclasses must override */ @@ -791,13 +790,22 @@ open_cb (GtkMenuItem *item, NautilusFile *file) } static void -open_in_new_window_cb (GtkMenuItem *item, NautilusFile *file) +open_one_in_new_window (gpointer data, gpointer user_data) +{ + g_assert (NAUTILUS_IS_FILE (data)); + g_assert (FM_IS_DIRECTORY_VIEW (user_data)); + + fm_directory_view_activate_entry (FM_DIRECTORY_VIEW (user_data), NAUTILUS_FILE (data), TRUE); +} + +static void +open_in_new_window_cb (GtkMenuItem *item, NautilusFileList *files) { FMDirectoryView *directory_view; directory_view = FM_DIRECTORY_VIEW (gtk_object_get_data (GTK_OBJECT (item), "directory_view")); - fm_directory_view_activate_entry (directory_view, file, TRUE); + g_list_foreach (files, open_one_in_new_window, directory_view); } static void @@ -857,19 +865,32 @@ fm_directory_view_real_append_background_context_menu_items (FMDirectoryView *vi } static void -fm_directory_view_real_append_item_context_menu_items (FMDirectoryView *view, - GtkMenu *menu, - NautilusFile *file) +fm_directory_view_real_append_selection_context_menu_items (FMDirectoryView *view, + GtkMenu *menu, + NautilusFileList *files) { GtkWidget *menu_item; + gboolean exactly_one_item_selected; + + g_assert (g_list_length (files) >= 1); + + exactly_one_item_selected = g_list_length (files) == 1; menu_item = gtk_menu_item_new_with_label ("Open"); - /* Store directory view in menu item so callback can access it. */ - gtk_object_set_data_full (GTK_OBJECT (menu_item), "directory_view", - view, (GtkDestroyNotify) gtk_object_unref); - gtk_object_ref (GTK_OBJECT (view)); - gtk_signal_connect(GTK_OBJECT (menu_item), "activate", - GTK_SIGNAL_FUNC (open_cb), file); + if (!exactly_one_item_selected) + { + /* Can only open a single item in the same window */ + gtk_widget_set_sensitive (menu_item, FALSE); + } + else + { + /* Store directory view in menu item so callback can access it. */ + gtk_object_set_data_full (GTK_OBJECT (menu_item), "directory_view", + view, (GtkDestroyNotify) gtk_object_unref); + gtk_object_ref (GTK_OBJECT (view)); + gtk_signal_connect(GTK_OBJECT (menu_item), "activate", + GTK_SIGNAL_FUNC (open_cb), files->data); + } gtk_widget_show (menu_item); gtk_menu_append (menu, menu_item); @@ -879,7 +900,7 @@ fm_directory_view_real_append_item_context_menu_items (FMDirectoryView *view, view, (GtkDestroyNotify) gtk_object_unref); gtk_object_ref (GTK_OBJECT (view)); gtk_signal_connect(GTK_OBJECT (menu_item), "activate", - GTK_SIGNAL_FUNC (open_in_new_window_cb), file); + GTK_SIGNAL_FUNC (open_in_new_window_cb), files); gtk_widget_show (menu_item); gtk_menu_append (menu, menu_item); @@ -892,25 +913,38 @@ fm_directory_view_real_append_item_context_menu_items (FMDirectoryView *view, /* FIXME - need better architecture for setting these. */ static GtkMenu * -create_item_context_menu (FMDirectoryView *view, - NautilusFile *file) +create_selection_context_menu (FMDirectoryView *view) { GtkMenu *menu; GtkWidget *menu_item; + NautilusFileList *selected_files; g_assert (FM_IS_DIRECTORY_VIEW (view)); - g_assert (NAUTILUS_IS_FILE (file)); menu = GTK_MENU (gtk_menu_new ()); + selected_files = fm_directory_view_get_selection (view); + if (selected_files != NULL) + { + /* Attach selection to menu, and free it when menu is freed. + * This lets menu item callbacks use the files parameter. + */ + gtk_object_set_data_full (GTK_OBJECT (menu), + "selected_items", + selected_files, + (GtkDestroyNotify)g_list_free); + + gtk_signal_emit (GTK_OBJECT (view), + fm_directory_view_signals[APPEND_SELECTION_CONTEXT_MENU_ITEMS], + menu, selected_files); + + /* Add separator between selection-specific + * and view-general menu items. + */ + menu_item = gtk_menu_item_new (); + gtk_widget_show (menu_item); + gtk_menu_append (menu, menu_item); - gtk_signal_emit (GTK_OBJECT (view), - fm_directory_view_signals[APPEND_ITEM_CONTEXT_MENU_ITEMS], - menu, file); - - /* separator between item-specific and view-general menu items */ - menu_item = gtk_menu_item_new (); - gtk_widget_show (menu_item); - gtk_menu_append (menu, menu_item); + } /* Show commands not specific to this item also, since it might * be hard (especially in list view) to find a place to click @@ -955,9 +989,9 @@ create_background_context_menu (FMDirectoryView *view) } /** - * fm_directory_view_popup_item_context_menu + * fm_directory_view_pop_up_selection_context_menu * - * Pop up a context menu appropriate to a specific view item at the last right click location. + * Pop up a context menu appropriate to the selected items at the last right click location. * @view: FMDirectoryView of interest. * @file: The model object for which a menu should be popped up. * @@ -965,19 +999,17 @@ create_background_context_menu (FMDirectoryView *view) * **/ void -fm_directory_view_popup_item_context_menu (FMDirectoryView *view, - NautilusFile *file) +fm_directory_view_pop_up_selection_context_menu (FMDirectoryView *view) { g_assert (FM_IS_DIRECTORY_VIEW (view)); - g_assert (NAUTILUS_IS_FILE (file)); - nautilus_pop_up_context_menu (create_item_context_menu (view, file), + nautilus_pop_up_context_menu (create_selection_context_menu (view), NAUTILUS_DEFAULT_POPUP_MENU_DISPLACEMENT, NAUTILUS_DEFAULT_POPUP_MENU_DISPLACEMENT); } /** - * fm_directory_view_popup_background_context_menu + * fm_directory_view_pop_up_background_context_menu * * Pop up a context menu appropriate to the view globally at the last right click location. * @view: FMDirectoryView of interest. @@ -986,7 +1018,7 @@ fm_directory_view_popup_item_context_menu (FMDirectoryView *view, * **/ void -fm_directory_view_popup_background_context_menu (FMDirectoryView *view) +fm_directory_view_pop_up_background_context_menu (FMDirectoryView *view) { g_assert (FM_IS_DIRECTORY_VIEW (view)); diff --git a/src/file-manager/fm-directory-view.h b/src/file-manager/fm-directory-view.h index 1ebd897e0..a1f110629 100644 --- a/src/file-manager/fm-directory-view.h +++ b/src/file-manager/fm-directory-view.h @@ -81,15 +81,17 @@ struct _FMDirectoryViewClass { */ void (* begin_loading) (FMDirectoryView *view); - /* The 'append_item_context_menu_items' signal is emitted - * when creating a context menu, either an item-specific one or - * a background one. Subclasses might want to override this to + /* The 'append_selection_context_menu_items' signal is emitted + * when creating a context menu for the selected items. @files is + * the list of selected files; it isn't destroyed until the menu + * is destroyed so it can be used in callbacks. + * Subclasses might want to override this function to * modify the menu contents. */ - void (* append_item_context_menu_items) + void (* append_selection_context_menu_items) (FMDirectoryView *view, GtkMenu *menu, - NautilusFile *file); + NautilusFileList *files); /* The 'append_background_context_menu_items' signal is emitted * when creating a context menu, either an item-specific one or @@ -168,8 +170,7 @@ void fm_directory_view_activate_entry (FMDir gboolean request_new_window); void fm_directory_view_notify_selection_changed (FMDirectoryView *view); NautilusDirectory * fm_directory_view_get_model (FMDirectoryView *view); -void fm_directory_view_popup_background_context_menu (FMDirectoryView *view); -void fm_directory_view_popup_item_context_menu (FMDirectoryView *view, - NautilusFile *file); +void fm_directory_view_pop_up_background_context_menu (FMDirectoryView *view); +void fm_directory_view_pop_up_selection_context_menu (FMDirectoryView *view); #endif /* FM_DIRECTORY_VIEW_H */ |