summaryrefslogtreecommitdiff
path: root/src/nautilus-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-view.c')
-rw-r--r--src/nautilus-view.c228
1 files changed, 217 insertions, 11 deletions
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 073bacc0e..120b13e89 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -141,6 +141,8 @@ enum {
enum {
PROP_WINDOW_SLOT = 1,
PROP_SUPPORTS_ZOOMING,
+ PROP_ICON,
+ PROP_VIEW_WIDGET,
NUM_PROPERTIES
};
@@ -238,6 +240,21 @@ struct NautilusViewDetails
guint floating_bar_set_status_timeout_id;
guint floating_bar_loading_timeout_id;
GtkWidget *floating_bar;
+
+ /* View menu */
+ GtkWidget *view_menu_widget;
+ GtkWidget *view_icon;
+ GtkWidget *sort_menu;
+ GtkWidget *sort_trash_time;
+ GtkWidget *sort_search_relevance;
+ GtkWidget *visible_columns;
+ GtkWidget *stop;
+ GtkWidget *reload;
+ GtkAdjustment *zoom_adjustment;
+ GtkWidget *zoom_level_scale;
+
+ gulong stop_signal_handler;
+ gulong reload_signal_handler;
};
typedef struct {
@@ -593,6 +610,39 @@ nautilus_view_using_manual_layout (NautilusView *view)
}
/**
+ * nautilus_view_get_icon:
+ * @view: a #NautilusView
+ *
+ * Retrieves the #GIcon that represents @view.
+ *
+ * Returns: (transfer none): the #Gicon that represents @view
+ */
+GIcon*
+nautilus_view_get_icon (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+
+ return NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->get_icon (view);
+}
+
+/**
+ * nautilus_view_get_view_widget:
+ * @view: a #NautilusView
+ *
+ * Retrieves the view menu, as a #GtkWidget. If it's %NULL,
+ * the button renders insensitive.
+ *
+ * Returns: (transfer none): a #GtkWidget for the view menu
+ */
+GtkWidget*
+nautilus_view_get_view_widget (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+
+ return view->details->view_menu_widget;
+}
+
+/**
* nautilus_view_can_rename_file
*
* Determine whether a file can be renamed.
@@ -1514,6 +1564,15 @@ action_select_pattern (GSimpleAction *action,
}
static void
+zoom_level_changed (GtkRange *range,
+ NautilusView *view)
+{
+ g_action_group_change_action_state (view->details->view_action_group,
+ "zoom-to-level",
+ g_variant_new_int32 (gtk_range_get_value (range)));
+}
+
+static void
reveal_newly_added_folder (NautilusView *view, NautilusFile *new_file,
NautilusDirectory *directory, GFile *target_location)
{
@@ -2617,6 +2676,10 @@ slot_active (NautilusWindowSlot *slot,
nautilus_view_update_toolbar_menus (view);
schedule_update_context_menus (view);
+
+ gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)),
+ "view",
+ G_ACTION_GROUP (view->details->view_action_group));
}
static void
@@ -2630,6 +2693,9 @@ slot_inactive (NautilusWindowSlot *slot,
view->details->active = FALSE;
remove_update_context_menus_timeout_callback (view);
+ gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)),
+ "view",
+ NULL);
}
static void
@@ -6734,6 +6800,52 @@ nautilus_view_update_context_menus (NautilusView *view)
NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->update_context_menus (view);
}
+static void
+nautilus_view_reset_view_menu (NautilusView *view)
+{
+ GActionGroup *view_action_group;
+ GVariant *variant;
+ GVariantIter iter;
+ gboolean show_sort_trash, show_sort_search, show_sort_access, show_sort_modification, enable_sort;
+ const gchar *hint;
+
+ /* Allow actions from the current view to be activated through
+ * the view menu and action menu of the toolbar */
+ view_action_group = nautilus_view_get_action_group (view);
+ gtk_widget_insert_action_group (GTK_WIDGET (view),
+ "view",
+ G_ACTION_GROUP (view_action_group));
+
+ gtk_widget_set_visible (view->details->visible_columns,
+ g_action_group_has_action (view_action_group, "visible-columns"));
+
+ enable_sort = g_action_group_get_action_enabled (view_action_group, "sort");
+ show_sort_trash = show_sort_search = show_sort_modification = show_sort_access = FALSE;
+ gtk_widget_set_visible (view->details->sort_menu, enable_sort);
+
+ if (enable_sort) {
+ variant = g_action_group_get_action_state_hint (view_action_group, "sort");
+ g_variant_iter_init (&iter, variant);
+
+ while (g_variant_iter_next (&iter, "&s", &hint)) {
+ if (g_strcmp0 (hint, "trash-time") == 0)
+ show_sort_trash = TRUE;
+ if (g_strcmp0 (hint, "search-relevance") == 0)
+ show_sort_search = TRUE;
+ }
+
+ g_variant_unref (variant);
+ }
+
+ gtk_widget_set_visible (view->details->sort_trash_time, show_sort_trash);
+ gtk_widget_set_visible (view->details->sort_search_relevance, show_sort_search);
+
+ variant = g_action_group_get_action_state (view_action_group, "zoom-to-level");
+ gtk_adjustment_set_value (view->details->zoom_adjustment,
+ g_variant_get_int32 (variant));
+ g_variant_unref (variant);
+}
+
/* Convenience function to reset the menus owned by the view but managed on
* the toolbar, and update them with the current state.
* It will also update the actions state, which will also update children
@@ -6742,9 +6854,6 @@ nautilus_view_update_context_menus (NautilusView *view)
void
nautilus_view_update_toolbar_menus (NautilusView *view)
{
- NautilusToolbar *toolbar;
- NautilusWindow *window;
-
g_assert (NAUTILUS_IS_VIEW (view));
/* Don't update after destroy (#349551),
@@ -6754,11 +6863,7 @@ nautilus_view_update_toolbar_menus (NautilusView *view)
!view->details->active) {
return;
}
- window = nautilus_view_get_window (view);
- toolbar = NAUTILUS_TOOLBAR (nautilus_window_get_toolbar (window));
- nautilus_toolbar_reset_menus (toolbar);
- nautilus_window_reset_menus (window);
-
+ nautilus_view_reset_view_menu (view);
nautilus_view_update_actions_state (view);
}
@@ -7424,6 +7529,29 @@ real_get_selected_icon_locations (NautilusView *view)
}
static void
+nautilus_view_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusView *view = NAUTILUS_VIEW (object);
+
+ switch (prop_id) {
+ case PROP_ICON:
+ g_value_set_object (value, nautilus_view_get_icon (view));
+ break;
+
+ case PROP_VIEW_WIDGET:
+ g_value_set_object (value, nautilus_view_get_view_widget (view));
+ break;
+
+ default:
+ g_assert_not_reached ();
+
+ }
+}
+
+static void
nautilus_view_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -7526,31 +7654,78 @@ nautilus_view_scroll_event (GtkWidget *widget,
return FALSE;
}
+
+static void
+action_reload_enabled_changed (GActionGroup *action_group,
+ gchar *action_name,
+ gboolean enabled,
+ NautilusView *view)
+{
+ gtk_widget_set_visible (view->details->reload, enabled);
+}
+
+static void
+action_stop_enabled_changed (GActionGroup *action_group,
+ gchar *action_name,
+ gboolean enabled,
+ NautilusView *view)
+{
+ gtk_widget_set_visible (view->details->stop, enabled);
+}
+
static void
nautilus_view_parent_set (GtkWidget *widget,
GtkWidget *old_parent)
{
+ NautilusWindow *window;
NautilusView *view;
GtkWidget *parent;
view = NAUTILUS_VIEW (widget);
parent = gtk_widget_get_parent (widget);
+ window = nautilus_view_get_window (view);
g_assert (parent == NULL || old_parent == NULL);
if (GTK_WIDGET_CLASS (nautilus_view_parent_class)->parent_set != NULL) {
GTK_WIDGET_CLASS (nautilus_view_parent_class)->parent_set (widget, old_parent);
}
+ if (view->details->stop_signal_handler > 0) {
+ g_signal_handler_disconnect (window, view->details->stop_signal_handler);
+ view->details->stop_signal_handler = 0;
+ }
+
+ if (view->details->reload_signal_handler > 0) {
+ g_signal_handler_disconnect (window, view->details->reload_signal_handler);
+ view->details->reload_signal_handler = 0;
+ }
+
if (parent != NULL) {
g_assert (old_parent == NULL);
- if (view->details->slot ==
- nautilus_window_get_active_slot (nautilus_view_get_window (view))) {
+ if (view->details->slot == nautilus_window_get_active_slot (window)) {
view->details->active = TRUE;
+ gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)),
+ "view",
+ G_ACTION_GROUP (view->details->view_action_group));
}
+
+ view->details->stop_signal_handler =
+ g_signal_connect (window,
+ "action-enabled-changed::stop",
+ G_CALLBACK (action_stop_enabled_changed),
+ view);
+ view->details->reload_signal_handler =
+ g_signal_connect (window,
+ "action-enabled-changed::reload",
+ G_CALLBACK (action_reload_enabled_changed),
+ view);
} else {
remove_update_context_menus_timeout_callback (view);
+ gtk_widget_insert_action_group (GTK_WIDGET (nautilus_view_get_window (view)),
+ "view",
+ NULL);
}
}
@@ -7564,6 +7739,7 @@ nautilus_view_class_init (NautilusViewClass *klass)
oclass = G_OBJECT_CLASS (klass);
oclass->finalize = nautilus_view_finalize;
+ oclass->get_property = nautilus_view_get_property;
oclass->set_property = nautilus_view_set_property;
widget_class->destroy = nautilus_view_destroy;
@@ -7671,6 +7847,19 @@ nautilus_view_class_init (NautilusViewClass *klass)
TRUE,
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ properties[PROP_ICON] =
+ g_param_spec_object ("icon",
+ "Icon",
+ "The icon that represents the view",
+ G_TYPE_ICON,
+ G_PARAM_READABLE);
+
+ properties[PROP_VIEW_WIDGET] =
+ g_param_spec_object ("view-widget",
+ "View widget",
+ "The view's widget that will appear under the view menu button",
+ GTK_TYPE_WIDGET,
+ G_PARAM_READABLE);
g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
}
@@ -7702,6 +7891,24 @@ nautilus_view_init (NautilusView *view)
gtk_widget_add_events (GTK_WIDGET (view),
GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+ /* View menu */
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-toolbar-view-menu.xml");
+ view->details->view_menu_widget = g_object_ref (gtk_builder_get_object (builder, "view_menu_widget"));
+ view->details->zoom_level_scale = GTK_WIDGET (gtk_builder_get_object (builder, "zoom_level_scale"));
+ view->details->zoom_adjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "zoom_adjustment"));
+
+ view->details->sort_menu = GTK_WIDGET (gtk_builder_get_object (builder, "sort_menu"));
+ view->details->sort_trash_time = GTK_WIDGET (gtk_builder_get_object (builder, "sort_trash_time"));
+ view->details->sort_search_relevance = GTK_WIDGET (gtk_builder_get_object (builder, "sort_search_relevance"));
+ view->details->visible_columns = GTK_WIDGET (gtk_builder_get_object (builder, "visible_columns"));
+ view->details->reload = GTK_WIDGET (gtk_builder_get_object (builder, "reload"));
+ view->details->stop = GTK_WIDGET (gtk_builder_get_object (builder, "stop"));
+
+ g_signal_connect (view->details->zoom_level_scale, "value-changed",
+ G_CALLBACK (zoom_level_changed), view);
+
+ g_object_unref (builder);
+
/* Scrolled Window */
view->details->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view->details->scrolled_window),
@@ -7812,7 +8019,6 @@ nautilus_view_init (NautilusView *view)
gtk_widget_insert_action_group (GTK_WIDGET (view),
"view",
G_ACTION_GROUP (view->details->view_action_group));
-
app = g_application_get_default ();
/* Toolbar menu */