[gnome-disk-utility/wip/mdraid] Slightly rework RAID Disks dialog
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-disk-utility/wip/mdraid] Slightly rework RAID Disks dialog
- Date: Tue, 18 Sep 2012 16:13:50 +0000 (UTC)
commit aa9a980298edcac58327b397095da5788fed4a2b
Author: David Zeuthen <zeuthen gmail com>
Date: Tue Sep 18 12:13:28 2012 -0400
Slightly rework RAID Disks dialog
Signed-off-by: David Zeuthen <zeuthen gmail com>
data/ui/md-raid-disks-dialog.ui | 207 ++++++++++++++++++++++++++++++++-----
src/disks/gdumdraiddisksdialog.c | 200 ++++++++++++++++++++++++++++++------
2 files changed, 346 insertions(+), 61 deletions(-)
---
diff --git a/data/ui/md-raid-disks-dialog.ui b/data/ui/md-raid-disks-dialog.ui
index 3585a4d..38b6fed 100644
--- a/data/ui/md-raid-disks-dialog.ui
+++ b/data/ui/md-raid-disks-dialog.ui
@@ -3,7 +3,7 @@
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkDialog" id="dialog">
<property name="width_request">600</property>
- <property name="height_request">500</property>
+ <property name="height_request">550</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">RAID Disks</property>
@@ -46,22 +46,77 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow">
- <property name="width_request">300</property>
+ <object class="GtkBox" id="box2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">in</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkTreeView" id="treeview">
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="width_request">300</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="show_expanders">False</property>
- <property name="level_indentation">12</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="treeview-selection1"/>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_expanders">False</property>
+ <property name="level_indentation">12</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
+ </child>
+ </object>
</child>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolbar" id="toolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_size">1</property>
+ <child>
+ <object class="GtkToolButton" id="add-toolbutton">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="label" translatable="yes">Add Disk...</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">list-add-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="remove-toolbutton">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="label" translatable="yes">Remove Disk...</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">list-remove-symbolic</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
@@ -71,38 +126,134 @@
</packing>
</child>
<child>
- <object class="GtkToolbar" id="toolbar">
+ <object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="icon_size">1</property>
+ <property name="margin_left">12</property>
+ <property name="row_spacing">10</property>
+ <property name="column_spacing">10</property>
<child>
- <object class="GtkToolButton" id="add-toolbutton">
- <property name="use_action_appearance">False</property>
+ <object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
- <property name="label" translatable="yes">Add Disk...</property>
- <property name="use_underline">True</property>
- <property name="icon_name">list-add-symbolic</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Serial Number</property>
+ <style><class name="dim-label"/></style>
</object>
<packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
</packing>
</child>
<child>
- <object class="GtkToolButton" id="remove-toolbutton">
- <property name="use_action_appearance">False</property>
+ <object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
- <property name="label" translatable="yes">Remove Disk...</property>
- <property name="use_underline">True</property>
- <property name="icon_name">list-remove-symbolic</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Assessment</property>
+ <style><class name="dim-label"/></style>
</object>
<packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="serial-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="assessment-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Model</property>
+ <style><class name="dim-label"/></style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="model-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Device</property>
+ <style><class name="dim-label"/></style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="device-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
</packing>
</child>
</object>
diff --git a/src/disks/gdumdraiddisksdialog.c b/src/disks/gdumdraiddisksdialog.c
index 14c82cc..72b52ba 100644
--- a/src/disks/gdumdraiddisksdialog.c
+++ b/src/disks/gdumdraiddisksdialog.c
@@ -16,6 +16,7 @@
#include "gduapplication.h"
#include "gduwindow.h"
#include "gdumdraiddisksdialog.h"
+#include "gduatasmartdialog.h"
/* ---------------------------------------------------------------------------------------------------- */
@@ -23,6 +24,8 @@ typedef struct
{
volatile gint ref_count;
+ gboolean in_update;
+
UDisksClient *client;
UDisksObject *object;
UDisksMDRaid *mdraid;
@@ -36,10 +39,16 @@ typedef struct
GtkWidget *close_button;
GtkWidget *scrolledwindow;
GtkWidget *treeview;
+
GtkWidget *toolbar;
GtkWidget *add_toolbutton;
GtkWidget *remove_toolbutton;
+ GtkWidget *model_label;
+ GtkWidget *device_label;
+ GtkWidget *serial_label;
+ GtkWidget *assessment_label;
+
GtkListStore *store;
} DialogData;
@@ -51,10 +60,16 @@ static const struct {
{G_STRUCT_OFFSET (DialogData, scrolledwindow), "scrolledwindow"},
{G_STRUCT_OFFSET (DialogData, treeview), "treeview"},
+
{G_STRUCT_OFFSET (DialogData, toolbar), "toolbar"},
{G_STRUCT_OFFSET (DialogData, add_toolbutton), "add-toolbutton"},
{G_STRUCT_OFFSET (DialogData, remove_toolbutton), "remove-toolbutton"},
+ {G_STRUCT_OFFSET (DialogData, model_label), "model-label"},
+ {G_STRUCT_OFFSET (DialogData, device_label), "device-label"},
+ {G_STRUCT_OFFSET (DialogData, serial_label), "serial-label"},
+ {G_STRUCT_OFFSET (DialogData, assessment_label), "assessment-label"},
+
{0, NULL}
};
@@ -64,6 +79,9 @@ static void update_dialog (DialogData *data);
static void on_client_changed (UDisksClient *client,
gpointer user_data);
+static void on_tree_selection_changed (GtkTreeSelection *selection,
+ gpointer user_data);
+
enum
{
COLUMN_SLOT,
@@ -87,6 +105,10 @@ dialog_data_unref (DialogData *data)
{
if (g_atomic_int_dec_and_test (&data->ref_count))
{
+ g_signal_handlers_disconnect_by_func (data->treeview,
+ G_CALLBACK (on_tree_selection_changed),
+ data);
+
if (data->dialog != NULL)
{
gtk_widget_hide (data->dialog);
@@ -117,7 +139,7 @@ dialog_data_close (DialogData *data)
/* ---------------------------------------------------------------------------------------------------- */
static void
-update_dialog (DialogData *data)
+update_dialog_treeview (DialogData *data)
{
GVariantIter iter;
gint disk_slot;
@@ -185,6 +207,106 @@ update_dialog (DialogData *data)
g_clear_object (&selected_block);
}
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+update_dialog_labels (DialogData *data)
+{
+ GtkTreeIter titer;
+ UDisksBlock *block = NULL;
+ UDisksDrive *drive = NULL;
+ gchar *model_markup = NULL;
+ gchar *device_markup = NULL;
+ gchar *serial_markup = NULL;
+ gchar *assessment_markup = NULL;
+
+ if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (data->treeview)),
+ NULL, /* out_model */
+ &titer))
+ {
+ gtk_tree_model_get (GTK_TREE_MODEL (data->store),
+ &titer,
+ COLUMN_BLOCK, &block,
+ -1);
+ }
+
+ if (block == NULL)
+ goto out;
+
+ if (udisks_block_get_read_only (block))
+ {
+ /* Translators: Shown for a read-only device. The %s is the device file, e.g. /dev/sdb1 */
+ device_markup = g_strdup_printf (_("%s <span size=\"smaller\">(Read-Only)</span>"),
+ udisks_block_get_preferred_device (block));
+ }
+ else
+ {
+ device_markup = g_strdup (udisks_block_get_preferred_device (block));
+ }
+
+ drive = udisks_client_get_drive_for_block (data->client, block);
+ if (drive != NULL)
+ {
+ UDisksObject *drive_object = NULL;
+ UDisksDriveAta *ata = NULL;
+ gchar *name = NULL;
+
+ udisks_client_get_drive_info (data->client,
+ drive,
+ &name, /* out_name */
+ NULL, /* out_description */
+ NULL, /* out_drive_icon */
+ NULL, /* out_media_description */
+ NULL); /* out_media_icon */
+ model_markup = g_strdup_printf ("%s (%s)", name,
+ udisks_drive_get_revision (drive));
+ g_free (name);
+ serial_markup = udisks_drive_dup_serial (drive);
+
+ drive_object = (UDisksObject *) g_dbus_interface_get_object (G_DBUS_INTERFACE (drive));
+ ata = udisks_object_peek_drive_ata (drive_object);
+ if (ata != NULL && !udisks_drive_get_media_removable (drive))
+ {
+ assessment_markup = gdu_ata_smart_get_one_liner_assessment (ata,
+ NULL, /* out_smart_is_supported */
+ NULL); /* out_warning */
+ }
+ }
+
+ out:
+ gtk_label_set_markup (GTK_LABEL (data->model_label), model_markup != NULL ? model_markup : "â");
+ gtk_label_set_markup (GTK_LABEL (data->device_label), device_markup != NULL ? device_markup : "â");
+ gtk_label_set_markup (GTK_LABEL (data->serial_label), serial_markup != NULL ? serial_markup : "â");
+ gtk_label_set_markup (GTK_LABEL (data->assessment_label), assessment_markup != NULL ? assessment_markup : "â");
+
+ g_free (model_markup);
+ g_free (device_markup);
+ g_free (serial_markup);
+ g_free (assessment_markup);
+ g_clear_object (&drive);
+ g_clear_object (&block);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+update_dialog (DialogData *data)
+{
+ /* don't recurse */
+ if (data->in_update)
+ goto out;
+
+ data->in_update = TRUE;
+ update_dialog_treeview (data);
+ update_dialog_labels (data);
+ data->in_update = FALSE;
+
+ out:
+ ;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
G_GNUC_UNUSED static void
on_property_changed (GObject *object,
GParamSpec *pspec,
@@ -377,37 +499,36 @@ name_cell_func (GtkTreeViewColumn *column,
else
{
UDisksDrive *drive = NULL;
- gchar *name = NULL;
- gchar *desc = NULL;
drive = udisks_client_get_drive_for_block (data->client, block);
if (drive != NULL)
{
UDisksPartition *partition = NULL;
UDisksObject *object = NULL;
+ gchar *desc = NULL;
udisks_client_get_drive_info (data->client,
drive,
- &name, /* out_name */
- &desc, /* out_description */
- NULL, /* out_drive_icon */
- NULL, /* out_media_description */
- NULL); /* out_media_icon */
+ NULL, /* out_name */
+ &desc, /* out_description */
+ NULL, /* out_drive_icon */
+ NULL, /* out_media_description */
+ NULL); /* out_media_icon */
object = (UDisksObject *) g_dbus_interface_get_object (G_DBUS_INTERFACE (block));
if (object != NULL)
partition = udisks_object_peek_partition (object);
-
if (partition != NULL)
{
- s = g_strdup_printf (C_("mdraid-disks", "Partition %d of %s"),
- udisks_partition_get_number (partition),
- desc);
- g_free (desc); desc = s;
+ markup = g_strdup_printf (C_("mdraid-disks", "Partition %d of %s"),
+ udisks_partition_get_number (partition),
+ desc);
+ g_free (desc);
+ }
+ else
+ {
+ markup = desc;
}
-
- s = g_strdup_printf ("%s â %s", name, udisks_block_get_preferred_device (block));
- g_free (name); name = s;
g_object_unref (drive);
}
@@ -417,20 +538,9 @@ name_cell_func (GtkTreeViewColumn *column,
/* Translators: Shown in list for a disk/member that is not a drive.
* The %s is the size (e.g. "42.0 GB").
*/
- desc = g_strdup_printf (C_("mdraid-disks", "%s Block Device"), s);
+ markup = g_strdup_printf (C_("mdraid-disks", "%s Block Device"), s);
g_free (s);
- name = udisks_block_dup_preferred_device (block);
}
-
- /* TODO: once https://bugzilla.gnome.org/show_bug.cgi?id=657194 is resolved, use that instead
- * of hard-coding the color
- */
- markup = g_strdup_printf ("%s\n"
- "<small><span foreground=\"#555555\">%s</span></small>",
- desc,
- name);
- g_free (desc);
- g_free (name);
}
g_object_set (renderer,
@@ -484,11 +594,13 @@ state_cell_func (GtkTreeViewColumn *column,
gpointer user_data)
{
/* DialogData *data = user_data; */
+ gint slot = -1;
gchar *state = NULL;
gchar *markup = NULL;
gtk_tree_model_get (model,
iter,
+ COLUMN_SLOT, &slot,
COLUMN_STATE, &state,
-1);
@@ -499,8 +611,8 @@ state_cell_func (GtkTreeViewColumn *column,
else if (g_strcmp0 (state, "faulty") == 0)
{
/* Translators: MD-RAID member state for 'faulty' */
- markup = g_strdup_printf ("<span foreground=\"#ff0000\">%s</span>\n",
- C_("mdraid-disks-state", "FAILING"));
+ markup = g_strdup_printf ("<span foreground=\"#ff0000\">%s</span>",
+ C_("mdraid-disks-state", "FAILED"));
}
else if (g_strcmp0 (state, "in_sync") == 0)
{
@@ -519,8 +631,16 @@ state_cell_func (GtkTreeViewColumn *column,
}
else if (g_strcmp0 (state, "spare") == 0)
{
- /* Translators: MD-RAID member state for 'spare' */
- markup = g_strdup (C_("mdraid-disks-state", "Spare"));
+ if (slot < 0)
+ {
+ /* Translators: MD-RAID member state for 'spare' */
+ markup = g_strdup (C_("mdraid-disks-state", "Spare"));
+ }
+ else
+ {
+ /* Translators: MD-RAID member state for 'spare' but is being recovered to */
+ markup = g_strdup (C_("mdraid-disks-state", "Recovering"));
+ }
}
else
{
@@ -628,7 +748,7 @@ init_dialog (DialogData *data)
/* -- */
renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set (G_OBJECT (renderer),
- "stock-size", GTK_ICON_SIZE_DND,
+ "stock-size", GTK_ICON_SIZE_SMALL_TOOLBAR,
NULL);
gtk_tree_view_column_pack_start (column, renderer, FALSE);
gtk_tree_view_column_set_cell_data_func (column,
@@ -641,6 +761,7 @@ init_dialog (DialogData *data)
gtk_tree_view_column_pack_start (column, renderer, TRUE);
g_object_set (G_OBJECT (renderer),
"yalign", 0.5,
+ "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
NULL);
gtk_tree_view_column_set_cell_data_func (column,
renderer,
@@ -696,6 +817,11 @@ init_dialog (DialogData *data)
G_CALLBACK (on_client_changed),
data);
+ g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (data->treeview)),
+ "changed",
+ G_CALLBACK (on_tree_selection_changed),
+ data);
+
update_dialog (data);
}
@@ -707,6 +833,14 @@ on_client_changed (UDisksClient *client,
update_dialog (data);
}
+static void
+on_tree_selection_changed (GtkTreeSelection *selection,
+ gpointer user_data)
+{
+ DialogData *data = user_data;
+ update_dialog (data);
+}
+
/* ---------------------------------------------------------------------------------------------------- */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]