places-sidebar: add a Connect to Server sidebar item

https://bugzilla.gnome.org/show_bug.cgi?id=686968
This commit is contained in:
Cosimo Cecchi 2013-02-12 18:43:52 -05:00
parent d2bfffc574
commit 500770e8de
3 changed files with 112 additions and 60 deletions

View file

@ -750,7 +750,7 @@ on_connect_server_response (GtkDialog *dialog,
gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
GtkWidget *
nautilus_application_connect_server (NautilusApplication *application,
NautilusWindow *window)
{
@ -770,6 +770,8 @@ nautilus_application_connect_server (NautilusApplication *application,
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
gtk_window_set_screen (GTK_WINDOW (dialog), gtk_window_get_screen (GTK_WINDOW (window)));
gtk_window_present (GTK_WINDOW (dialog));
return dialog;
}
static void

View file

@ -78,4 +78,7 @@ NautilusBookmarkList *
void nautilus_application_edit_bookmarks (NautilusApplication *application,
NautilusWindow *window);
GtkWidget * nautilus_application_connect_server (NautilusApplication *application,
NautilusWindow *window);
#endif /* __NAUTILUS_APPLICATION_H__ */

View file

@ -144,6 +144,7 @@ typedef enum {
PLACES_MOUNTED_VOLUME,
PLACES_BOOKMARK,
PLACES_HEADING,
PLACES_CONNECT_SERVER
} PlaceType;
typedef enum {
@ -782,6 +783,14 @@ update_places (NautilusPlacesSidebar *sidebar)
_("Browse the contents of the network"));
g_object_unref (icon);
icon = g_themed_icon_new (NAUTILUS_ICON_NETWORK_SERVER);
add_place (sidebar, PLACES_CONNECT_SERVER,
SECTION_NETWORK,
_("Connect to Server"), icon, NULL,
NULL, NULL, NULL, 0,
_("Connect to a network server address"));
g_object_unref (icon);
network_volumes = g_list_reverse (network_volumes);
for (l = network_volumes; l != NULL; l = l->next) {
volume = l->data;
@ -1783,80 +1792,115 @@ drive_start_from_bookmark_cb (GObject *source_object,
}
}
static void
open_selected_volume (NautilusPlacesSidebar *sidebar,
GtkTreeModel *model,
GtkTreeIter *iter,
NautilusWindowOpenFlags flags)
{
GDrive *drive;
GVolume *volume;
NautilusWindowSlot *slot;
gtk_tree_model_get (model, iter,
PLACES_SIDEBAR_COLUMN_DRIVE, &drive,
PLACES_SIDEBAR_COLUMN_VOLUME, &volume,
-1);
if (volume != NULL && !sidebar->mounting) {
sidebar->mounting = TRUE;
g_assert (sidebar->go_to_after_mount_slot == NULL);
slot = nautilus_window_get_active_slot (sidebar->window);
sidebar->go_to_after_mount_slot = slot;
g_object_add_weak_pointer (G_OBJECT (sidebar->go_to_after_mount_slot),
(gpointer *) &sidebar->go_to_after_mount_slot);
sidebar->go_to_after_mount_flags = flags;
nautilus_file_operations_mount_volume_full (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))),
volume,
volume_mounted_cb,
G_OBJECT (sidebar));
} else if (volume == NULL && drive != NULL &&
(g_drive_can_start (drive) || g_drive_can_start_degraded (drive))) {
GMountOperation *mount_op;
mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
g_drive_start (drive, G_DRIVE_START_NONE, mount_op, NULL, drive_start_from_bookmark_cb, NULL);
g_object_unref (mount_op);
}
if (drive != NULL)
g_object_unref (drive);
if (volume != NULL)
g_object_unref (volume);
}
static void
open_selected_uri (NautilusPlacesSidebar *sidebar,
const gchar *uri,
NautilusWindowOpenFlags flags)
{
NautilusWindowSlot *slot;
GFile *location;
DEBUG ("Activating bookmark %s", uri);
location = g_file_new_for_uri (uri);
/* Navigate to the clicked location */
if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) {
slot = nautilus_window_get_active_slot (sidebar->window);
nautilus_window_slot_open_location (slot, location, flags);
} else {
NautilusWindow *cur, *new;
cur = NAUTILUS_WINDOW (sidebar->window);
new = nautilus_application_create_window (NAUTILUS_APPLICATION (g_application_get_default ()),
gtk_window_get_screen (GTK_WINDOW (cur)));
nautilus_window_go_to (new, location);
}
g_object_unref (location);
}
static void
open_connect_to_server (NautilusPlacesSidebar *sidebar)
{
NautilusApplication *application = NAUTILUS_APPLICATION (g_application_get_default ());
GtkWidget *dialog;
dialog = nautilus_application_connect_server (application, sidebar->window);
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
}
static void
open_selected_bookmark (NautilusPlacesSidebar *sidebar,
GtkTreeModel *model,
GtkTreeIter *iter,
NautilusWindowOpenFlags flags)
{
NautilusWindowSlot *slot;
GFile *location;
char *uri;
PlaceType row_type;
if (!iter) {
return;
}
gtk_tree_model_get (model, iter, PLACES_SIDEBAR_COLUMN_URI, &uri, -1);
gtk_tree_model_get (model, iter,
PLACES_SIDEBAR_COLUMN_URI, &uri,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &row_type,
-1);
if (uri != NULL) {
DEBUG ("Activating bookmark %s", uri);
location = g_file_new_for_uri (uri);
/* Navigate to the clicked location */
if ((flags & NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW) == 0) {
slot = nautilus_window_get_active_slot (sidebar->window);
nautilus_window_slot_open_location (slot, location, flags);
} else {
NautilusWindow *cur, *new;
cur = NAUTILUS_WINDOW (sidebar->window);
new = nautilus_application_create_window (NAUTILUS_APPLICATION (g_application_get_default ()),
gtk_window_get_screen (GTK_WINDOW (cur)));
nautilus_window_go_to (new, location);
}
g_object_unref (location);
open_selected_uri (sidebar, uri, flags);
g_free (uri);
} else if (row_type == PLACES_CONNECT_SERVER) {
open_connect_to_server (sidebar);
} else {
GDrive *drive;
GVolume *volume;
NautilusWindowSlot *slot;
gtk_tree_model_get (model, iter,
PLACES_SIDEBAR_COLUMN_DRIVE, &drive,
PLACES_SIDEBAR_COLUMN_VOLUME, &volume,
-1);
if (volume != NULL && !sidebar->mounting) {
sidebar->mounting = TRUE;
g_assert (sidebar->go_to_after_mount_slot == NULL);
slot = nautilus_window_get_active_slot (sidebar->window);
sidebar->go_to_after_mount_slot = slot;
g_object_add_weak_pointer (G_OBJECT (sidebar->go_to_after_mount_slot),
(gpointer *) &sidebar->go_to_after_mount_slot);
sidebar->go_to_after_mount_flags = flags;
nautilus_file_operations_mount_volume_full (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))),
volume,
volume_mounted_cb,
G_OBJECT (sidebar));
} else if (volume == NULL && drive != NULL &&
(g_drive_can_start (drive) || g_drive_can_start_degraded (drive))) {
GMountOperation *mount_op;
mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
g_drive_start (drive, G_DRIVE_START_NONE, mount_op, NULL, drive_start_from_bookmark_cb, NULL);
g_object_unref (mount_op);
}
if (drive != NULL)
g_object_unref (drive);
if (volume != NULL)
g_object_unref (volume);
open_selected_volume (sidebar, model, iter, flags);
}
}
@ -2882,7 +2926,8 @@ bookmarks_button_release_event_cb (GtkWidget *widget,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &row_type,
-1);
if (row_type != PLACES_HEADING) {
if (row_type != PLACES_HEADING &&
row_type != PLACES_CONNECT_SERVER) {
bookmarks_popup_menu (sidebar, event);
}
}
@ -3101,6 +3146,8 @@ places_sidebar_sort_func (GtkTreeModel *model,
g_free (name_a);
g_free (name_b);
} else if (place_type_a == PLACES_CONNECT_SERVER) {
retval = 1;
}
return retval;