forked from AuroraMiddleware/gtk
Emit the populate-popup signal so the caller can spice things up
Also, we factor out the process of getting the selected item's info out of the liststore. Signed-off-by: Federico Mena Quintero <federico@gnome.org>
This commit is contained in:
parent
d0d02357e0
commit
bfa1f4ac0b
@ -1737,6 +1737,56 @@ check_visibility (GMount *mount,
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
PlaceType type;
|
||||
GDrive *drive;
|
||||
GVolume *volume;
|
||||
GMount *mount;
|
||||
char *uri;
|
||||
} SelectionInfo;
|
||||
|
||||
static void
|
||||
get_selection_info (GtkPlacesSidebar *sidebar, SelectionInfo *info)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
|
||||
info->type = PLACES_BUILT_IN;
|
||||
info->drive = NULL;
|
||||
info->volume = NULL;
|
||||
info->mount = NULL;
|
||||
info->uri = NULL;
|
||||
|
||||
if (get_selected_iter (sidebar, &iter)) {
|
||||
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
|
||||
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &info->type,
|
||||
PLACES_SIDEBAR_COLUMN_DRIVE, &info->drive,
|
||||
PLACES_SIDEBAR_COLUMN_VOLUME, &info->volume,
|
||||
PLACES_SIDEBAR_COLUMN_MOUNT, &info->mount,
|
||||
PLACES_SIDEBAR_COLUMN_URI, &info->uri,
|
||||
-1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
free_selection_info (SelectionInfo *info)
|
||||
{
|
||||
if (info->drive)
|
||||
g_object_unref (info->drive);
|
||||
|
||||
if (info->volume)
|
||||
g_object_unref (info->volume);
|
||||
|
||||
if (info->mount)
|
||||
g_object_unref (info->mount);
|
||||
|
||||
g_free (info->uri);
|
||||
|
||||
info->drive = NULL;
|
||||
info->volume = NULL;
|
||||
info->mount = NULL;
|
||||
info->uri = NULL;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *add_shortcut_item;
|
||||
GtkWidget *remove_item;
|
||||
@ -1751,46 +1801,23 @@ typedef struct {
|
||||
} PopupMenuData;
|
||||
|
||||
static void
|
||||
check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data)
|
||||
check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data, SelectionInfo *info)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
PlaceType type;
|
||||
GDrive *drive = NULL;
|
||||
GVolume *volume = NULL;
|
||||
GMount *mount = NULL;
|
||||
gboolean show_mount;
|
||||
gboolean show_unmount;
|
||||
gboolean show_eject;
|
||||
gboolean show_rescan;
|
||||
gboolean show_start;
|
||||
gboolean show_stop;
|
||||
char *uri = NULL;
|
||||
|
||||
type = PLACES_BUILT_IN;
|
||||
gtk_widget_set_visible (data->add_shortcut_item, (info->type == PLACES_MOUNTED_VOLUME));
|
||||
|
||||
if (get_selected_iter (sidebar, &iter)) {
|
||||
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
|
||||
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
|
||||
PLACES_SIDEBAR_COLUMN_DRIVE, &drive,
|
||||
PLACES_SIDEBAR_COLUMN_VOLUME, &volume,
|
||||
PLACES_SIDEBAR_COLUMN_MOUNT, &mount,
|
||||
PLACES_SIDEBAR_COLUMN_URI, &uri,
|
||||
-1);
|
||||
}
|
||||
gtk_widget_set_sensitive (data->remove_item, (info->type == PLACES_BOOKMARK));
|
||||
gtk_widget_set_sensitive (data->rename_item, (info->type == PLACES_BOOKMARK));
|
||||
|
||||
gtk_widget_set_visible (data->add_shortcut_item, (type == PLACES_MOUNTED_VOLUME));
|
||||
|
||||
gtk_widget_set_sensitive (data->remove_item, (type == PLACES_BOOKMARK));
|
||||
gtk_widget_set_sensitive (data->rename_item, (type == PLACES_BOOKMARK));
|
||||
|
||||
check_visibility (mount, volume, drive,
|
||||
check_visibility (info->mount, info->volume, info->drive,
|
||||
&show_mount, &show_unmount, &show_eject, &show_rescan, &show_start, &show_stop);
|
||||
|
||||
/* For mounts,
|
||||
*
|
||||
* location = g_mount_get_default_location (mount);
|
||||
*/
|
||||
|
||||
gtk_widget_set_visible (data->separator_item, show_mount || show_unmount || show_eject);
|
||||
gtk_widget_set_visible (data->mount_item, show_mount);
|
||||
gtk_widget_set_visible (data->unmount_item, show_unmount);
|
||||
@ -1802,8 +1829,8 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data)
|
||||
/* Adjust start/stop items to reflect the type of the drive */
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Start"));
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Stop"));
|
||||
if ((show_start || show_stop) && drive != NULL) {
|
||||
switch (g_drive_get_start_stop_type (drive)) {
|
||||
if ((show_start || show_stop) && info->drive != NULL) {
|
||||
switch (g_drive_get_start_stop_type (info->drive)) {
|
||||
case G_DRIVE_START_STOP_TYPE_SHUTDOWN:
|
||||
/* start() for type G_DRIVE_START_STOP_TYPE_SHUTDOWN is normally not used */
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Power On"));
|
||||
@ -1829,9 +1856,6 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
g_free (uri);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2772,6 +2796,8 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
|
||||
{
|
||||
PopupMenuData menu_data;
|
||||
GtkWidget *item;
|
||||
SelectionInfo sel_info;
|
||||
GFile *file;
|
||||
|
||||
sidebar->popup_menu = gtk_menu_new ();
|
||||
gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu),
|
||||
@ -2858,7 +2884,22 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
|
||||
|
||||
/* Update everything! */
|
||||
|
||||
check_popup_sensitivity (sidebar, &menu_data);
|
||||
get_selection_info (sidebar, &sel_info);
|
||||
|
||||
check_popup_sensitivity (sidebar, &menu_data, &sel_info);
|
||||
|
||||
/* And let the caller spice things up */
|
||||
|
||||
if (sel_info.uri)
|
||||
file = g_file_new_for_uri (sel_info.uri);
|
||||
else
|
||||
file = NULL;
|
||||
|
||||
emit_populate_popup (sidebar, GTK_MENU (sidebar->popup_menu), file);
|
||||
|
||||
g_object_unref (file);
|
||||
|
||||
free_selection_info (&sel_info);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user