summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-16 22:11:03 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-07-24 19:20:39 -0300
commite602d19f8ec14cc33668a40cf4d40a20166610b4 (patch)
treee25421772fa916ff6ebb751f2139f9dbe19c56db
parente72d41b5c68bcee0bed154baf0cf450a2e8b815d (diff)
downloadnautilus-e602d19f8ec14cc33668a40cf4d40a20166610b4.tar.gz
view: add NautilusView interface
Nautilus is receiving the new Other Locations view from the latest Gtk+ versions to match the new proposed mockups that shrink the sidebar. The current hierarchy of classes, however, makes it difficult to happen without some refactoring of the class hierarchy chain, as they are very coupled. Create a new abstraction layer by adding an interface named NautilusView, that will contain all the necessary methods to dettach NautilusFilesView code.
-rw-r--r--src/Makefile.am3
-rw-r--r--src/nautilus-view.c286
-rw-r--r--src/nautilus-view.h106
3 files changed, 395 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index fddb7676f..3fe9ad814 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -81,6 +81,7 @@ $(dbus_shell_search_provider_built_sources) : Makefile.am $(top_srcdir)/data/she
headers = \
nautilus-special-location-bar.h \
+ nautilus-view.h \
$(NULL)
resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/nautilus.gresource.xml)
@@ -209,6 +210,8 @@ nautilus_SOURCES = \
nautilus-toolbar.h \
nautilus-trash-bar.c \
nautilus-trash-bar.h \
+ nautilus-view.c \
+ nautilus-view.h \
nautilus-window-slot.c \
nautilus-window-slot.h \
nautilus-window-slot-dnd.c \
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
new file mode 100644
index 000000000..5438ae1f4
--- /dev/null
+++ b/src/nautilus-view.c
@@ -0,0 +1,286 @@
+/* nautilus-view.c
+ *
+ * Copyright (C) 2015 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "nautilus-view.h"
+#include "nautilus-enum-types.h"
+
+#include <glib/gi18n.h>
+
+G_DEFINE_INTERFACE (NautilusView, nautilus_view, GTK_TYPE_WIDGET)
+
+static void
+nautilus_view_default_init (NautilusViewInterface *iface)
+{
+ /**
+ * NautilusView::action-group:
+ *
+ * The action group of the implementing view. Different views may
+ * have different sets of actions.
+ *
+ * Since: 3.18
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_object ("action-group",
+ _("Action group of the view"),
+ _("The action group of the view"),
+ G_TYPE_ACTION_GROUP,
+ G_PARAM_READABLE));
+
+ /**
+ * NautilusView::loading:
+ *
+ * Whether the view is loading or not.
+ *
+ * Since: 3.18
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boolean ("loading",
+ _("Whether the view is loading"),
+ _("Whether the view is loading or not"),
+ FALSE,
+ G_PARAM_READABLE));
+
+ /**
+ * NautilusView::location:
+ *
+ * The current location of the view.
+ *
+ * Since: 3.18
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_object ("location",
+ _("Location the view is displaying"),
+ _("The location the view is displaying"),
+ G_TYPE_FILE,
+ G_PARAM_READABLE));
+
+ /**
+ * NautilusView::search-query:
+ *
+ * The search query the view should search for.
+ *
+ * Since: 3.18
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_object ("search-query",
+ _("Search query that view is performing"),
+ _("The search query that view is performing"),
+ NAUTILUS_TYPE_QUERY,
+ G_PARAM_READWRITE));
+
+ /**
+ * NautilusView::operations:
+ *
+ * The operations the view supports.
+ *
+ * Since: 3.18
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_flags ("operations",
+ _("Operations that view supports"),
+ _("The operations that view supports"),
+ NAUTILUS_TYPE_VIEW_OPERATION,
+ NAUTILUS_VIEW_OPERATION_NONE,
+ G_PARAM_READABLE));
+
+ /**
+ * NautilusView::open-location:
+ * @view: the object which received the signal.
+ * @location: (type Gio.File): #GFile to which the caller should switch.
+ * @flags: a single value from #GtkPlacesOpenFlags specifying how the @location
+ * should be opened.
+ *
+ * Emited when the view wants the parent slot to open a location.
+ *
+ * Since: 3.18
+ */
+ g_signal_new ("open-location",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (NautilusViewInterface, open_location),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_FILE,
+ GTK_TYPE_PLACES_OPEN_FLAGS);
+}
+
+/**
+ * nautilus_view_activate_selection:
+ * @view: a #NautilusView
+ *
+ * Activates the selection of @view, or the first visible item in case
+ * nothing is selected.
+ *
+ * Returns:
+ */
+void
+nautilus_view_activate_selection (NautilusView *view)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW (view));
+ g_return_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->activate_selection);
+
+ NAUTILUS_VIEW_GET_IFACE (view)->activate_selection (view);
+}
+
+/**
+ * nautilus_view_get_action_group:
+ * @view: a #NautilusView
+ *
+ * Retrieves the #GActionGroup grom @view, or %NULL if none is set.
+ *
+ * Returns: (transfer none): the @view's #GActionGroup
+ */
+GActionGroup*
+nautilus_view_get_action_group (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+ g_return_val_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->get_action_group, NULL);
+
+ return NAUTILUS_VIEW_GET_IFACE (view)->get_action_group (view);
+}
+
+/**
+ * nautilus_view_get_loading:
+ * @view: a #NautilusView
+ *
+ * Retrieves the loading state of @view.
+ *
+ * Returns: %TRUE if @view is loading, %FALSE if it's ready.
+ */
+gboolean
+nautilus_view_get_loading (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), FALSE);
+ g_return_val_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->get_loading, FALSE);
+
+ return NAUTILUS_VIEW_GET_IFACE (view)->get_loading (view);
+}
+
+/**
+ * nautilus_view_get_location:
+ *
+ * Retrieves the current location that @view is displaying, or %NULL
+ * if none is set.
+ *
+ * Returns: (transfer none): A #GFile representing the location that
+ * @view is displaying.
+ */
+GFile*
+nautilus_view_get_location (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+ g_return_val_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->get_location, NULL);
+
+ return NAUTILUS_VIEW_GET_IFACE (view)->get_location (view);
+}
+
+/**
+ * nautilus_view_get_search_query:
+ *
+ * Retrieves the current search query that @view is performing, or %NULL
+ * if none is set.
+ *
+ * Returns: (transfer none): A #NautilusQuery representing the search that
+ * @view is displaying.
+ */
+NautilusQuery*
+nautilus_view_get_search_query (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), NULL);
+ g_return_val_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->get_search_query, NULL);
+
+ return NAUTILUS_VIEW_GET_IFACE (view)->get_search_query (view);
+}
+
+/**
+ * nautilus_view_set_search_query:
+ *
+ * Sets the search query that @view should perform, or %NULL to stop
+ * the current search. It is required that the implementing class supports
+ * %NAUTILUS_VIEW_OPERATION_SEARCH operation.
+ *
+ * Returns:
+ */
+void
+nautilus_view_set_search_query (NautilusView *view,
+ NautilusQuery *query)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW (view));
+ g_return_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->set_search_query);
+ g_return_if_fail (nautilus_view_is_operation_supported (view, NAUTILUS_VIEW_OPERATION_SEARCH));
+
+ NAUTILUS_VIEW_GET_IFACE (view)->set_search_query (view, query);
+}
+
+/**
+ * nautilus_view_popup_menu:
+ * @view: a #NautilusView
+ * @event: a #GdkEventButton
+ * @location: the location the popup-menu should be created for, or %NULL
+ * for the currently displayed location.
+ *
+ * Shows a popup context menu for the window's pathbar.
+ *
+ * Returns: %TRUE if @view is loading, %FALSE if it's ready.
+ */
+void
+nautilus_view_popup_menu (NautilusView *view,
+ NautilusViewMenutype menu_type,
+ GdkEventButton *event,
+ const gchar *location)
+{
+ g_return_if_fail (NAUTILUS_IS_VIEW (view));
+ g_return_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->popup_menu);
+
+ NAUTILUS_VIEW_GET_IFACE (view)->popup_menu (view, menu_type, event, location);
+}
+
+/**
+ * nautilus_view_get_supported_actions:
+ *
+ * Retrieves the supported #NautilusViewAction flags.
+ *
+ * Returns: a bitflag representing the supported #NautilusViewAction
+ * values
+ */
+gint
+nautilus_view_get_supported_operations (NautilusView *view)
+{
+ g_return_val_if_fail (NAUTILUS_IS_VIEW (view), 0);
+ g_return_val_if_fail (NAUTILUS_VIEW_GET_IFACE (view)->get_supported_operations, 0);
+
+ return NAUTILUS_VIEW_GET_IFACE (view)->get_supported_operations (view);
+}
+
+/**
+ * nautilus_view_get_supported_actions:
+ *
+ * Checks whether @view supports @action.
+ *
+ * Returns: %TRUE if @action is supported by @view,
+ * %FALSE otherwise.
+ */
+gboolean
+nautilus_view_is_operation_supported (NautilusView *view,
+ NautilusViewOperation operation)
+{
+ return nautilus_view_get_supported_operations (view) & operation;
+}
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
new file mode 100644
index 000000000..618564396
--- /dev/null
+++ b/src/nautilus-view.h
@@ -0,0 +1,106 @@
+/* nautilus-view.h
+ *
+ * Copyright (C) 2015 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NAUTILUS_VIEW_H
+#define NAUTILUS_VIEW_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <libnautilus-private/nautilus-query.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ NAUTILUS_VIEW_MENU_BACKGROUND,
+ NAUTILUS_VIEW_MENU_PATHBAR,
+ NAUTILUS_VIEW_MENU_SELECTION
+} NautilusViewMenutype;
+
+typedef enum
+{
+ NAUTILUS_VIEW_OPERATION_NONE = 0,
+ NAUTILUS_VIEW_OPERATION_BROWSE_GRID = 1 << 1,
+ NAUTILUS_VIEW_OPERATION_BROWSE_LIST = 1 << 2,
+ NAUTILUS_VIEW_OPERATION_SEARCH = 1 << 3,
+ NAUTILUS_VIEW_OPERATION_SELECTION = 1 << 4,
+ NAUTILUS_VIEW_OPERATION_SORT = 1 << 5
+} NautilusViewOperation;
+
+#define NAUTILUS_TYPE_VIEW (nautilus_view_get_type ())
+
+G_DECLARE_INTERFACE (NautilusView, nautilus_view, NAUTILUS, VIEW, GtkWidget)
+
+struct _NautilusViewInterface
+{
+ GTypeInterface parent;
+
+ /* methods */
+ void (*activate_selection) (NautilusView *view);
+
+ GActionGroup* (*get_action_group) (NautilusView *view);
+
+ gboolean (*get_loading) (NautilusView *view);
+
+ GFile* (*get_location) (NautilusView *view);
+
+ NautilusQuery* (*get_search_query) (NautilusView *view);
+
+ void (*set_search_query) (NautilusView *view,
+ NautilusQuery *query);
+
+ gint (*get_supported_operations) (NautilusView *view);
+
+ void (*popup_menu) (NautilusView *view,
+ NautilusViewMenutype menu_type,
+ GdkEventButton *event,
+ const gchar *location);
+
+ /* signal slots */
+ void (*open_location) (NautilusView *view,
+ GFile *location,
+ GtkPlacesOpenFlags flags);
+};
+
+void nautilus_view_activate_selection (NautilusView *view);
+
+GActionGroup* nautilus_view_get_action_group (NautilusView *view);
+
+gboolean nautilus_view_get_loading (NautilusView *view);
+
+GFile* nautilus_view_get_location (NautilusView *view);
+
+NautilusQuery* nautilus_view_get_search_query (NautilusView *view);
+
+void nautilus_view_set_search_query (NautilusView *view,
+ NautilusQuery *query);
+
+gint nautilus_view_get_supported_operations (NautilusView *view);
+
+void nautilus_view_popup_menu (NautilusView *view,
+ NautilusViewMenutype menu_type,
+ GdkEventButton *event,
+ const gchar *location);
+
+gboolean nautilus_view_is_operation_supported (NautilusView *view,
+ NautilusViewOperation action);
+
+G_END_DECLS
+
+#endif /* NAUTILUS_VIEW_H */