summaryrefslogtreecommitdiff
path: root/src/nautilus-places-view.c
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-08-18 15:23:02 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2015-08-20 17:38:35 -0300
commit404f1492dbe03b407abd4ca0c2b743f7810f4b3e (patch)
treebabcbe37fa37648d8731acd20a19e0967ebe8cc9 /src/nautilus-places-view.c
parentabef8cac2f1df4b808fcb66b35877b75b54774e4 (diff)
downloadnautilus-404f1492dbe03b407abd4ca0c2b743f7810f4b3e.tar.gz
places-view: implement a view for Other Locations
GtkFileChooser received a Other Locations view that lists persistent devices, as well as networks and the root location for the computer's hard drive. Since Nautilus is a file management tool too, it should keep consistency between Gtk+ file chooser, something that doesn't happen since it doesn't display Other Locations. To fix that, add NautilusPlacesView, a NautilusView implementation that displays the GtkPlacesView widget. In order to implement that, update window-slot to correctly display the places-view whenever Other Locations is clicked. https://bugzilla.gnome.org/show_bug.cgi?id=753871
Diffstat (limited to 'src/nautilus-places-view.c')
-rw-r--r--src/nautilus-places-view.c359
1 files changed, 359 insertions, 0 deletions
diff --git a/src/nautilus-places-view.c b/src/nautilus-places-view.c
new file mode 100644
index 000000000..7a4d15fc3
--- /dev/null
+++ b/src/nautilus-places-view.c
@@ -0,0 +1,359 @@
+/* nautilus-places-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-mime-actions.h"
+#include "nautilus-places-view.h"
+#include "nautilus-window-slot.h"
+#include "gtk/gtkplacesviewprivate.h"
+
+typedef struct
+{
+ GFile *location;
+ GIcon *icon;
+ NautilusQuery *search_query;
+
+ GtkWidget *places_view;
+} NautilusPlacesViewPrivate;
+
+struct _NautilusPlacesView
+{
+ GtkFrameClass parent;
+};
+
+static void nautilus_places_view_iface_init (NautilusViewInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (NautilusPlacesView, nautilus_places_view, GTK_TYPE_BOX,
+ G_ADD_PRIVATE (NautilusPlacesView)
+ G_IMPLEMENT_INTERFACE (NAUTILUS_TYPE_VIEW, nautilus_places_view_iface_init));
+
+enum {
+ PROP_0,
+ PROP_ICON,
+ PROP_LOCATION,
+ PROP_SEARCH_QUERY,
+ PROP_VIEW_WIDGET,
+ PROP_IS_LOADING,
+ PROP_IS_SEARCHING,
+ LAST_PROP
+};
+
+static void
+open_location_cb (NautilusPlacesView *view,
+ GFile *location,
+ GtkPlacesOpenFlags open_flags)
+{
+ NautilusWindowOpenFlags flags;
+ GtkWidget *slot;
+
+ slot = gtk_widget_get_ancestor (GTK_WIDGET (view), NAUTILUS_TYPE_WINDOW_SLOT);
+
+ switch (open_flags) {
+ case GTK_PLACES_OPEN_NEW_TAB:
+ flags = NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB;
+ break;
+
+ case GTK_PLACES_OPEN_NEW_WINDOW:
+ flags = NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW;
+ break;
+
+ case GTK_PLACES_OPEN_NORMAL: /* fall-through */
+ default:
+ flags = 0;
+ break;
+ }
+
+ if (slot) {
+ NautilusFile *file;
+ GtkWidget *window;
+ char *path;
+
+ path = "other-locations:///";
+ file = nautilus_file_get (location);
+ window = gtk_widget_get_toplevel (GTK_WIDGET (view));
+
+ nautilus_mime_activate_file (GTK_WINDOW (window),
+ NAUTILUS_WINDOW_SLOT (slot),
+ file,
+ path,
+ flags);
+
+ }
+}
+
+static void
+loading_cb (NautilusView *view)
+{
+ g_object_notify (G_OBJECT (view), "is-loading");
+}
+
+static void
+nautilus_places_view_finalize (GObject *object)
+{
+ NautilusPlacesView *self = (NautilusPlacesView *)object;
+ NautilusPlacesViewPrivate *priv = nautilus_places_view_get_instance_private (self);
+
+ g_clear_object (&priv->icon);
+ g_clear_object (&priv->location);
+ g_clear_object (&priv->search_query);
+
+ G_OBJECT_CLASS (nautilus_places_view_parent_class)->finalize (object);
+}
+
+static void
+nautilus_places_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_LOCATION:
+ g_value_set_object (value, nautilus_view_get_location (view));
+ break;
+
+ case PROP_SEARCH_QUERY:
+ g_value_set_object (value, nautilus_view_get_search_query (view));
+ break;
+
+ case PROP_VIEW_WIDGET:
+ g_value_set_object (value, nautilus_view_get_view_widget (view));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+nautilus_places_view_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusView *view = NAUTILUS_VIEW (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ nautilus_view_set_location (view, g_value_get_object (value));
+ break;
+
+ case PROP_SEARCH_QUERY:
+ nautilus_view_set_search_query (view, g_value_get_object (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static GIcon*
+nautilus_places_view_get_icon (NautilusView *view)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return priv->icon;
+}
+
+static GFile*
+nautilus_places_view_get_location (NautilusView *view)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return priv->location;
+}
+
+static void
+nautilus_places_view_set_location (NautilusView *view,
+ GFile *location)
+{
+ if (location) {
+ NautilusPlacesViewPrivate *priv;
+ gchar *uri;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+ uri = g_file_get_uri (location);
+
+ /*
+ * If it's not trying to open the places view itself, simply
+ * delegates the location to window-slot, which takes care of
+ * selecting the appropriate view.
+ */
+ if (!g_strcmp0 (uri, "other-locations:///") == 0) {
+ GtkWidget *slot;
+
+ slot = gtk_widget_get_ancestor (GTK_WIDGET (view), NAUTILUS_TYPE_WINDOW_SLOT);
+ g_assert (slot != NULL);
+
+ nautilus_window_slot_open_location (NAUTILUS_WINDOW_SLOT (slot), location, 0);
+ } else {
+ g_set_object (&priv->location, location);
+ }
+
+ g_free (uri);
+ }
+}
+
+static GList*
+nautilus_places_view_get_selection (NautilusView *view)
+{
+ /* STUB */
+ return NULL;
+}
+
+static void
+nautilus_places_view_set_selection (NautilusView *view,
+ GList *selection)
+{
+ /* STUB */
+}
+
+static NautilusQuery*
+nautilus_places_view_get_search_query (NautilusView *view)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return priv->search_query;
+}
+
+static void
+nautilus_places_view_set_search_query (NautilusView *view,
+ NautilusQuery *query)
+{
+ NautilusPlacesViewPrivate *priv;
+ gchar *text;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ g_set_object (&priv->search_query, query);
+
+ text = query ? nautilus_query_get_text (query) : NULL;
+
+ gtk_places_view_set_search_query (GTK_PLACES_VIEW (priv->places_view), text);
+
+ g_free (text);
+}
+
+static GtkWidget*
+nautilus_places_view_get_view_widget (NautilusView *view)
+{
+ /* By returning NULL, the view menu button turns insensitive */
+ return NULL;
+}
+
+static gboolean
+nautilus_places_view_is_loading (NautilusView *view)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return gtk_places_view_get_loading (GTK_PLACES_VIEW (priv->places_view));
+}
+
+static gboolean
+nautilus_places_view_is_searching (NautilusView *view)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (NAUTILUS_PLACES_VIEW (view));
+
+ return priv->search_query != NULL;
+}
+
+static void
+nautilus_places_view_iface_init (NautilusViewInterface *iface)
+{
+ iface->get_icon = nautilus_places_view_get_icon;
+ iface->get_location = nautilus_places_view_get_location;
+ iface->set_location = nautilus_places_view_set_location;
+ iface->get_selection = nautilus_places_view_get_selection;
+ iface->set_selection = nautilus_places_view_set_selection;
+ iface->get_search_query = nautilus_places_view_get_search_query;
+ iface->set_search_query = nautilus_places_view_set_search_query;
+ iface->get_view_widget = nautilus_places_view_get_view_widget;
+ iface->is_loading = nautilus_places_view_is_loading;
+ iface->is_searching = nautilus_places_view_is_searching;
+}
+
+static void
+nautilus_places_view_class_init (NautilusPlacesViewClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = nautilus_places_view_finalize;
+ object_class->get_property = nautilus_places_view_get_property;
+ object_class->set_property = nautilus_places_view_set_property;
+
+ g_object_class_override_property (object_class, PROP_ICON, "icon");
+ g_object_class_override_property (object_class, PROP_IS_LOADING, "is-loading");
+ g_object_class_override_property (object_class, PROP_IS_SEARCHING, "is-searching");
+ g_object_class_override_property (object_class, PROP_LOCATION, "location");
+ g_object_class_override_property (object_class, PROP_SEARCH_QUERY, "search-query");
+ g_object_class_override_property (object_class, PROP_VIEW_WIDGET, "view-widget");
+}
+
+static void
+nautilus_places_view_init (NautilusPlacesView *self)
+{
+ NautilusPlacesViewPrivate *priv;
+
+ priv = nautilus_places_view_get_instance_private (self);
+
+ /* Icon */
+ priv->icon = g_themed_icon_new_with_default_fallbacks ("view-list-symbolic");
+
+ /* Location */
+ priv->location = g_file_new_for_uri ("other-locations:///");
+
+ /* Places view */
+ priv->places_view = gtk_places_view_new ();
+ gtk_places_view_set_open_flags (GTK_PLACES_VIEW (priv->places_view),
+ GTK_PLACES_OPEN_NEW_TAB | GTK_PLACES_OPEN_NEW_WINDOW | GTK_PLACES_OPEN_NORMAL);
+ gtk_widget_set_hexpand (priv->places_view, TRUE);
+ gtk_widget_set_vexpand (priv->places_view, TRUE);
+ gtk_widget_show (priv->places_view);
+ gtk_container_add (GTK_CONTAINER (self), priv->places_view);
+
+ g_signal_connect_swapped (priv->places_view,
+ "notify::loading",
+ G_CALLBACK (loading_cb),
+ self);
+
+ g_signal_connect_swapped (priv->places_view,
+ "open-location",
+ G_CALLBACK (open_location_cb),
+ self);
+
+}
+
+NautilusPlacesView *
+nautilus_places_view_new (void)
+{
+ return g_object_new (NAUTILUS_TYPE_PLACES_VIEW, NULL);
+}