summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Sullivan <sullivan@src.gnome.org>2000-02-21 21:34:19 +0000
committerJohn Sullivan <sullivan@src.gnome.org>2000-02-21 21:34:19 +0000
commit6f858ac91260177c3412170c4af20072d23c51df (patch)
tree2a32fe9dfc1eee7581d707b1a8a0b2e9835c581b /src
parent3d43e3d01947d5d90d9663e324e193adb8aee667 (diff)
downloadnautilus-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.c43
-rw-r--r--src/file-manager/fm-directory-view-list.c17
-rw-r--r--src/file-manager/fm-directory-view.c114
-rw-r--r--src/file-manager/fm-directory-view.h17
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 */