[gnome-disk-utility/udisks2-port] Simplify user interaction for disk image handling



commit a37fc9e34db0b8941bd4478f8e60861255eb7809
Author: David Zeuthen <davidz redhat com>
Date:   Wed Jul 27 11:42:08 2011 -0400

    Simplify user interaction for disk image handling
    
    No need to show a menu with only one option
    
    Signed-off-by: David Zeuthen <davidz redhat com>

 data/ui/palimpsest.ui      |   20 ++------
 src/palimpsest/gduwindow.c |  122 +++++++++++++++++++++-----------------------
 2 files changed, 62 insertions(+), 80 deletions(-)
---
diff --git a/data/ui/palimpsest.ui b/data/ui/palimpsest.ui
index 6687c4a..b216154 100644
--- a/data/ui/palimpsest.ui
+++ b/data/ui/palimpsest.ui
@@ -286,18 +286,6 @@
       <action-widget response="-5">button2</action-widget>
     </action-widgets>
   </object>
-  <object class="GtkMenu" id="device-tree-popup-menu">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="dtpm-attach-disk-image">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">Attach Disk Image...</property>
-      </object>
-    </child>
-  </object>
   <object class="GtkWindow" id="palimpsest-window">
     <property name="can_focus">False</property>
     <property name="border_width">12</property>
@@ -343,10 +331,10 @@
                 <property name="can_focus">False</property>
                 <property name="icon_size">1</property>
                 <child>
-                  <object class="GtkToolButton" id="device-tree-add-button">
+                  <object class="GtkToolButton" id="device-tree-attach-disk-image-button">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Add a new device</property>
+                    <property name="tooltip_text" translatable="yes">Attach Disk Image...</property>
                     <property name="use_action_appearance">False</property>
                     <property name="icon_name">list-add-symbolic</property>
                   </object>
@@ -356,10 +344,10 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkToolButton" id="device-tree-remove-button">
+                  <object class="GtkToolButton" id="device-tree-detach-disk-image-button">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Remove device</property>
+                    <property name="tooltip_text" translatable="yes">Detach Disk Image</property>
                     <property name="use_action_appearance">False</property>
                     <property name="icon_name">list-remove-symbolic</property>
                   </object>
diff --git a/src/palimpsest/gduwindow.c b/src/palimpsest/gduwindow.c
index a40b550..afa0f6d 100644
--- a/src/palimpsest/gduwindow.c
+++ b/src/palimpsest/gduwindow.c
@@ -76,6 +76,12 @@ enum
   PROP_CLIENT
 };
 
+typedef enum
+{
+  TOOLBAR_BUTTONS_NONE = 0,
+  TOOLBAR_BUTTONS_DETACH_DISK_IMAGE = (1<<0)
+} ToolbarButtons;
+
 static void gdu_window_show_error (GduWindow   *window,
                                    const gchar *message,
                                    GError      *orig_error);
@@ -85,7 +91,7 @@ static gboolean on_activate_link (GtkLabel    *label,
                                   gpointer     user_data);
 
 static void setup_device_page (GduWindow *window, UDisksObject *object);
-static gboolean update_device_page (GduWindow *window);
+static void update_device_page (GduWindow *window, ToolbarButtons *buttons);
 static void teardown_device_page (GduWindow *window);
 
 static void on_volume_grid_changed (GduVolumeGrid  *grid,
@@ -203,15 +209,16 @@ on_row_inserted (GtkTreeModel *tree_model,
   gtk_tree_view_expand_all (GTK_TREE_VIEW (gdu_window_get_widget (window, "device-tree-treeview")));
 }
 
-static gboolean select_details_page (GduWindow    *window,
-                                     UDisksObject *object,
-                                     DetailsPage   page);
+static void select_details_page (GduWindow       *window,
+                                 UDisksObject    *object,
+                                 DetailsPage      page,
+                                 ToolbarButtons  *buttons);
 
 static void
 set_selected_object (GduWindow    *window,
                      UDisksObject *object)
 {
-  gboolean can_remove;
+  ToolbarButtons buttons;
   GtkTreeIter iter;
 
   if (gdu_device_tree_model_get_iter_for_object (window->model, object, &iter))
@@ -221,27 +228,28 @@ set_selected_object (GduWindow    *window,
       gtk_tree_selection_select_iter (tree_selection, &iter);
     }
 
-  can_remove = FALSE;
+  buttons = TOOLBAR_BUTTONS_NONE;
   if (object != NULL)
     {
       if (udisks_object_peek_drive (object) != NULL ||
           udisks_object_peek_block_device (object) != NULL)
         {
-          can_remove = select_details_page (window, object, DETAILS_PAGE_DEVICE);
+          select_details_page (window, object, DETAILS_PAGE_DEVICE, &buttons);
         }
       else
         {
           g_warning ("no page for object %s", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
-          can_remove = select_details_page (window, NULL, DETAILS_PAGE_NOT_IMPLEMENTED);
+          select_details_page (window, NULL, DETAILS_PAGE_NOT_IMPLEMENTED, &buttons);
         }
     }
   else
     {
-      can_remove = select_details_page (window, NULL, DETAILS_PAGE_NOT_SELECTED);
+      select_details_page (window, NULL, DETAILS_PAGE_NOT_SELECTED, &buttons);
     }
 
-  gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (window->builder, "device-tree-remove-button")),
-                            can_remove);
+  gtk_widget_set_visible (GTK_WIDGET (gtk_builder_get_object (window->builder,
+                                                              "device-tree-detach-disk-image-button")),
+                          buttons & TOOLBAR_BUTTONS_DETACH_DISK_IMAGE);
 }
 
 static void
@@ -272,19 +280,6 @@ on_tree_selection_changed (GtkTreeSelection *tree_selection,
 /* ---------------------------------------------------------------------------------------------------- */
 
 static void
-on_device_tree_add_button_clicked (GtkToolButton *button,
-                                   gpointer       user_data)
-{
-  GduWindow *window = GDU_WINDOW (user_data);
-  GtkMenu *menu;
-
-  menu = GTK_MENU (gtk_builder_get_object (window->builder, "device-tree-popup-menu"));
-  gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time ());
-}
-
-/* ---------------------------------------------------------------------------------------------------- */
-
-static void
 loop_delete_cb (UDisksLoop   *loop,
                 GAsyncResult *res,
                 gpointer      user_data)
@@ -304,8 +299,8 @@ loop_delete_cb (UDisksLoop   *loop,
 }
 
 static void
-on_device_tree_remove_button_clicked (GtkToolButton *button,
-                                      gpointer       user_data)
+on_device_tree_detach_disk_image_button_clicked (GtkToolButton *button,
+                                                 gpointer       user_data)
 {
   GduWindow *window = GDU_WINDOW (user_data);
   UDisksLoop *loop;
@@ -391,9 +386,11 @@ loop_setup_cb (UDisksManager  *manager,
   loop_setup_data_free (data);
 }
 
+/* ---------------------------------------------------------------------------------------------------- */
+
 static void
-on_dtpm_attach_disk_image_activated (GtkMenuItem *item,
-                                     gpointer     user_data)
+on_device_tree_attach_disk_image_button_clicked (GtkToolButton *button,
+                                                 gpointer       user_data)
 {
   GduWindow *window = GDU_WINDOW (user_data);
   GtkWidget *dialog;
@@ -677,18 +674,14 @@ gdu_window_constructed (GObject *object)
   gtk_widget_set_name (gdu_window_get_widget (window, "devtab-grid-toolbar"), "devtab-grid-toolbar");
   gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
 
-  /* popup menu */
-  g_signal_connect (gtk_builder_get_object (window->builder, "device-tree-add-button"),
+  /* main toolbar */
+  g_signal_connect (gtk_builder_get_object (window->builder, "device-tree-attach-disk-image-button"),
                     "clicked",
-                    G_CALLBACK (on_device_tree_add_button_clicked),
+                    G_CALLBACK (on_device_tree_attach_disk_image_button_clicked),
                     window);
-  g_signal_connect (gtk_builder_get_object (window->builder, "device-tree-remove-button"),
+  g_signal_connect (gtk_builder_get_object (window->builder, "device-tree-detach-disk-image-button"),
                     "clicked",
-                    G_CALLBACK (on_device_tree_remove_button_clicked),
-                    window);
-  g_signal_connect (gtk_builder_get_object (window->builder, "dtpm-attach-disk-image"),
-                    "activate",
-                    G_CALLBACK (on_dtpm_attach_disk_image_activated),
+                    G_CALLBACK (on_device_tree_detach_disk_image_button_clicked),
                     window);
 
   /* actions */
@@ -1014,11 +1007,14 @@ setup_details_page (GduWindow     *window,
     }
 }
 
-static gboolean
-update_details_page (GduWindow   *window,
-                     DetailsPage  page)
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+update_details_page (GduWindow      *window,
+                     DetailsPage     page,
+                     ToolbarButtons *buttons)
 {
-  gboolean can_remove;
+  ;
   //g_debug ("update for %s, page %d",
   //         object != NULL ? g_dbus_object_get_object_path (object) : "<none>",
   //         page);
@@ -1032,20 +1028,18 @@ update_details_page (GduWindow   *window,
       break;
 
     case DETAILS_PAGE_DEVICE:
-      can_remove = update_device_page (window);
+      update_device_page (window, buttons);
       break;
     }
-
-  return can_remove;
 }
 
-static gboolean
-select_details_page (GduWindow     *window,
-                     UDisksObject  *object,
-                     DetailsPage    page)
+static void
+select_details_page (GduWindow      *window,
+                     UDisksObject   *object,
+                     DetailsPage     page,
+                     ToolbarButtons *buttons)
 {
   GtkNotebook *notebook;
-  gboolean can_remove;
 
   notebook = GTK_NOTEBOOK (gdu_window_get_widget (window, "palimpsest-notebook"));
 
@@ -1064,14 +1058,16 @@ select_details_page (GduWindow     *window,
                       window->current_object,
                       window->current_page);
 
-  can_remove = update_details_page (window, window->current_page);
-  return can_remove;
+  update_details_page (window, window->current_page, buttons);
 }
 
 static void
 update_all (GduWindow     *window,
             UDisksObject  *object)
 {
+  ToolbarButtons buttons;
+
+  buttons = TOOLBAR_BUTTONS_NONE;
   switch (window->current_page)
     {
     case DETAILS_PAGE_NOT_SELECTED:
@@ -1086,7 +1082,7 @@ update_all (GduWindow     *window,
       /* this is a little too inclusive.. */
       if (gdu_volume_grid_includes_object (GDU_VOLUME_GRID (window->volume_grid), object))
         {
-          update_details_page (window, window->current_page);
+          update_details_page (window, window->current_page, &buttons);
         }
       break;
     }
@@ -1200,9 +1196,9 @@ setup_device_page (GduWindow     *window,
 }
 
 static void
-update_device_page_for_drive (GduWindow     *window,
-                              UDisksObject  *object,
-                              UDisksDrive   *drive)
+update_device_page_for_drive (GduWindow      *window,
+                              UDisksObject   *object,
+                              UDisksDrive    *drive)
 {
   gchar *s;
   GList *block_devices;
@@ -1589,8 +1585,9 @@ update_device_page_for_free_space (GduWindow          *window,
                                                               "devtab-action-partition-create")), TRUE);
 }
 
-static gboolean
-update_device_page (GduWindow *window)
+static void
+update_device_page (GduWindow      *window,
+                    ToolbarButtons *buttons)
 {
   UDisksObject *object;
   GduVolumeGridElementType type;
@@ -1599,9 +1596,6 @@ update_device_page (GduWindow *window)
   guint64 size;
   GList *children;
   GList *l;
-  gboolean can_remove;
-
-  can_remove = FALSE;
 
   /* first hide everything */
   gtk_container_foreach (GTK_CONTAINER (gdu_window_get_widget (window, "devtab-drive-table")),
@@ -1625,7 +1619,7 @@ update_device_page (GduWindow *window)
   size = gdu_volume_grid_get_selected_size (GDU_VOLUME_GRID (window->volume_grid));
 
   if (udisks_object_peek_loop (object) != NULL)
-    can_remove = TRUE;
+    *buttons |= TOOLBAR_BUTTONS_DETACH_DISK_IMAGE;
 
   if (drive != NULL)
     update_device_page_for_drive (window, object, drive);
@@ -1663,8 +1657,6 @@ update_device_page (GduWindow *window)
             }
         }
     }
-
-  return can_remove;
 }
 
 static void
@@ -1680,7 +1672,9 @@ on_volume_grid_changed (GduVolumeGrid  *grid,
                         gpointer        user_data)
 {
   GduWindow *window = GDU_WINDOW (user_data);
-  update_device_page (window);
+  ToolbarButtons buttons;
+  buttons = TOOLBAR_BUTTONS_NONE;
+  update_device_page (window, &buttons);
 }
 
 /* ---------------------------------------------------------------------------------------------------- */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]