[gnome-disk-utility/wip/mdraid] Start working on the "Create RAID Array" dialog



commit 731cfe7501ef7f83dc7bae9f6d483700a2e7ca6e
Author: David Zeuthen <zeuthen gmail com>
Date:   Sun Sep 23 10:33:59 2012 -0400

    Start working on the "Create RAID Array" dialog
    
    Signed-off-by: David Zeuthen <zeuthen gmail com>

 data/ui/Makefile.am                  |    1 +
 data/ui/create-raid-array-dialog.ui  |  479 ++++++++++++++++++++++++++++++++++
 src/disks/Makefile.am                |    1 +
 src/disks/gducreateraidarraydialog.c |  313 ++++++++++++++++++++++
 src/disks/gducreateraidarraydialog.h |   22 ++
 src/disks/gduwindow.c                |    3 +-
 6 files changed, 818 insertions(+), 1 deletions(-)
---
diff --git a/data/ui/Makefile.am b/data/ui/Makefile.am
index bb68fb7..35d6596 100644
--- a/data/ui/Makefile.am
+++ b/data/ui/Makefile.am
@@ -25,6 +25,7 @@ ui_DATA = 				\
 	benchmark-dialog.ui		\
 	disk-settings-dialog.ui		\
 	md-raid-disks-dialog.ui		\
+	create-raid-array-dialog.ui	\
 	$(NULL)
 
 EXTRA_DIST = 				\
diff --git a/data/ui/create-raid-array-dialog.ui b/data/ui/create-raid-array-dialog.ui
new file mode 100644
index 0000000..1380cb6
--- /dev/null
+++ b/data/ui/create-raid-array-dialog.ui
@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkDialog" id="create-raid-array-dialog">
+    <property name="width_request">500</property>
+    <property name="height_request">550</property>
+    <property name="can_focus">False</property>
+    <property name="border_width">12</property>
+    <property name="title" translatable="yes">Create RAID Array</property>
+    <property name="type_hint">dialog</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button1">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button2">
+                <property name="label" translatable="yes">C_reate...</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="box1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">12</property>
+            <child>
+              <object class="GtkGrid" id="grid1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="row_spacing">10</property>
+                <property name="column_spacing">10</property>
+                <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">RAID _Level</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">level-combobox</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="GtkComboBox" id="level-combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="id_column">0</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="label2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">Chunk _Size</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">chunk-combobox</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="label3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Name</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">name-entry</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                  <packing>
+                    <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="GtkComboBox" id="chunk-combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="id_column">0</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>
+                <child>
+                  <object class="GtkEntry" id="name-entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
+                    <property name="invisible_char">â</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>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">&lt;b&gt;_Disks&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="box2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin_left">24</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkBox" id="box3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow">
+                        <property name="width_request">300</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <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>
+                          </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="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="has_tooltip">True</property>
+                            <property name="tooltip_markup" translatable="yes">Add Disk...</property>
+                            <property name="tooltip_text" translatable="yes">Add Disk...</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="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="has_tooltip">True</property>
+                            <property name="tooltip_markup" translatable="yes">Remove Disk...</property>
+                            <property name="tooltip_text" translatable="yes">Remove Disk...</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>
+                        <child>
+                          <object class="GtkSeparatorToolItem" id="toolbutton1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="homogeneous">True</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkToolButton" id="up-toolbutton">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="has_tooltip">True</property>
+                            <property name="tooltip_markup" translatable="yes">Move Disk Up</property>
+                            <property name="tooltip_text" translatable="yes">Move Disk Up</property>
+                            <property name="label" translatable="yes">Move Disk Up</property>
+                            <property name="use_underline">True</property>
+                            <property name="icon_name">go-up-symbolic</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="homogeneous">True</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkToolButton" id="down-toolbutton">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="tooltip_markup" translatable="yes">Move Disk Down</property>
+                            <property name="tooltip_text" translatable="yes">Move Disk Down</property>
+                            <property name="label" translatable="yes">Move Disk Down</property>
+                            <property name="use_underline">True</property>
+                            <property name="icon_name">go-down-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>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkGrid" id="grid2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="row_spacing">10</property>
+                    <property name="column_spacing">10</property>
+                    <child>
+                      <object class="GtkLabel" id="label7">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Serial Number</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                      <packing>
+                        <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="GtkLabel" id="label8">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Assessment</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                      <packing>
+                        <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="label9">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">Model or Name</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="label10">
+                        <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>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">button1</action-widget>
+      <action-widget response="-5">button2</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/src/disks/Makefile.am b/src/disks/Makefile.am
index aee0ece..e75d229 100644
--- a/src/disks/Makefile.am
+++ b/src/disks/Makefile.am
@@ -48,6 +48,7 @@ gnome_disks_SOURCES = 							\
 	gduchangepassphrasedialog.h	gduchangepassphrasedialog.c	\
 	gdudisksettingsdialog.h		gdudisksettingsdialog.c		\
 	gdumdraiddisksdialog.h		gdumdraiddisksdialog.c		\
+	gducreateraidarraydialog.h	gducreateraidarraydialog.c	\
 	$(enum_built_sources)						\
 	$(NULL)
 
diff --git a/src/disks/gducreateraidarraydialog.c b/src/disks/gducreateraidarraydialog.c
new file mode 100644
index 0000000..9a45c24
--- /dev/null
+++ b/src/disks/gducreateraidarraydialog.c
@@ -0,0 +1,313 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008-2012 Red Hat, Inc.
+ *
+ * Licensed under GPL version 2 or later.
+ *
+ * Author: David Zeuthen <zeuthen gmail com>
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include <math.h>
+
+#include "gduapplication.h"
+#include "gduwindow.h"
+#include "gducreateraidarraydialog.h"
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+typedef struct
+{
+  volatile gint ref_count;
+
+  gboolean in_update;
+
+  UDisksClient *client;
+  GduWindow *window;
+  GtkBuilder *builder;
+
+  GtkWidget *dialog;
+
+  GtkWidget *scrolledwindow;
+  GtkWidget *treeview;
+
+  GtkWidget *toolbar;
+  GtkWidget *add_toolbutton;
+  GtkWidget *remove_toolbutton;
+  GtkWidget *up_toolbutton;
+  GtkWidget *down_toolbutton;
+
+  GtkWidget *level_combobox;
+  GtkWidget *chunk_combobox;
+  GtkWidget *name_entry;
+
+  GtkListStore *store;
+} DialogData;
+
+static const struct {
+  goffset offset;
+  const gchar *name;
+} widget_mapping[] = {
+  {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, up_toolbutton), "up-toolbutton"},
+  {G_STRUCT_OFFSET (DialogData, down_toolbutton), "down-toolbutton"},
+
+  {G_STRUCT_OFFSET (DialogData, level_combobox), "level-combobox"},
+  {G_STRUCT_OFFSET (DialogData, chunk_combobox), "chunk-combobox"},
+  {G_STRUCT_OFFSET (DialogData, name_entry), "name-entry"},
+
+  {0, NULL}
+};
+
+static void update_dialog (DialogData *data);
+
+
+static void on_client_changed (UDisksClient  *client,
+                               gpointer       user_data);
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+G_GNUC_UNUSED static DialogData *
+dialog_data_ref (DialogData *data)
+{
+  g_atomic_int_inc (&data->ref_count);
+  return data;
+}
+
+static void
+dialog_data_unref (DialogData *data)
+{
+  if (g_atomic_int_dec_and_test (&data->ref_count))
+    {
+      if (data->dialog != NULL)
+        {
+          gtk_widget_hide (data->dialog);
+          gtk_widget_destroy (data->dialog);
+          data->dialog = NULL;
+        }
+
+      g_signal_handlers_disconnect_by_func (data->client,
+                                            G_CALLBACK (on_client_changed),
+                                            data);
+
+      g_clear_object (&data->window);
+      g_clear_object (&data->builder);
+
+      g_free (data);
+    }
+}
+
+static void
+dialog_data_close (DialogData *data)
+{
+  gtk_dialog_response (GTK_DIALOG (data->dialog), GTK_RESPONSE_CANCEL);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+update_dialog (DialogData *data)
+{
+  /* don't recurse */
+  if (data->in_update)
+    goto out;
+
+  data->in_update = TRUE;
+  /* TODO */
+  data->in_update = FALSE;
+
+ out:
+  ;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+G_GNUC_UNUSED static void
+on_property_changed (GObject     *object,
+                     GParamSpec  *pspec,
+                     gpointer     user_data)
+{
+  DialogData *data = user_data;
+  update_dialog (data);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+enum
+{
+  COMBOBOX_MODEL_COLUMN_ID,
+  COMBOBOX_MODEL_COLUMN_MARKUP,
+  COMBOBOX_MODEL_COLUMN_SEPARATOR,
+  COMBOBOX_MODEL_COLUMN_SENSITIVE,
+  COMBOBOX_MODEL_N_COLUMNS,
+};
+
+static gboolean
+combobox_separator_func (GtkTreeModel *model,
+                         GtkTreeIter  *iter,
+                         gpointer      user_data)
+{
+  gboolean is_separator;
+  gtk_tree_model_get (model, iter,
+                      COMBOBOX_MODEL_COLUMN_SEPARATOR, &is_separator,
+                      -1);
+  return is_separator;
+}
+
+static GtkListStore *
+combobox_init (DialogData  *data,
+               GtkWidget   *combobox)
+{
+  GtkListStore *model;
+  GtkCellRenderer *renderer;
+
+  model = gtk_list_store_new (COMBOBOX_MODEL_N_COLUMNS,
+                              G_TYPE_STRING,
+                              G_TYPE_STRING,
+                              G_TYPE_BOOLEAN,
+                              G_TYPE_BOOLEAN);
+  gtk_combo_box_set_model (GTK_COMBO_BOX (combobox), GTK_TREE_MODEL (model));
+  g_object_unref (model);
+
+  renderer = gtk_cell_renderer_text_new ();
+  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, FALSE);
+  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                  "markup", COMBOBOX_MODEL_COLUMN_MARKUP,
+                                  "sensitive", COMBOBOX_MODEL_COLUMN_SENSITIVE,
+                                  NULL);
+
+  gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox),
+                                        combobox_separator_func,
+                                        data,
+                                        NULL); /* GDestroyNotify */
+
+  return model;
+}
+
+static void
+combobox_add_item (GtkListStore *model,
+                   const gchar  *markup,
+                   const gchar  *id)
+{
+  gtk_list_store_insert_with_values (model, NULL /* out_iter */, G_MAXINT, /* position */
+                                     COMBOBOX_MODEL_COLUMN_ID, id,
+                                     COMBOBOX_MODEL_COLUMN_MARKUP, markup,
+                                     COMBOBOX_MODEL_COLUMN_SENSITIVE, TRUE,
+                                     -1);
+}
+
+G_GNUC_UNUSED static void
+combobox_add_separator (GtkListStore *model)
+{
+  gtk_list_store_insert_with_values (model, NULL /* out_iter */, G_MAXINT, /* position */
+                                     COMBOBOX_MODEL_COLUMN_SEPARATOR, TRUE,
+                                     COMBOBOX_MODEL_COLUMN_SENSITIVE, TRUE,
+                                     -1);
+}
+
+static void
+init_dialog (DialogData *data)
+{
+  GtkStyleContext *context;
+  GtkListStore *model;
+  gchar *s;
+
+  context = gtk_widget_get_style_context (data->scrolledwindow);
+  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
+  context = gtk_widget_get_style_context (data->toolbar);
+  gtk_style_context_add_class (context, GTK_STYLE_CLASS_INLINE_TOOLBAR);
+  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
+
+  /* 'RAID Level' combobox */
+  model = combobox_init (data, data->level_combobox);
+  s = gdu_utils_format_mdraid_level ("raid0", TRUE);  combobox_add_item (model, s, "raid0");  g_free (s);
+  s = gdu_utils_format_mdraid_level ("raid1", TRUE);  combobox_add_item (model, s, "raid1");  g_free (s);
+  s = gdu_utils_format_mdraid_level ("raid4", TRUE);  combobox_add_item (model, s, "raid4");  g_free (s);
+  s = gdu_utils_format_mdraid_level ("raid5", TRUE);  combobox_add_item (model, s, "raid5");  g_free (s);
+  s = gdu_utils_format_mdraid_level ("raid6", TRUE);  combobox_add_item (model, s, "raid6");  g_free (s);
+  s = gdu_utils_format_mdraid_level ("raid10", TRUE); combobox_add_item (model, s, "raid10"); g_free (s);
+
+  model = combobox_init (data, data->chunk_combobox);
+  s = udisks_client_get_size_for_display (data->client,   4*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_4"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,   8*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_8"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,  16*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_16"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,  32*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_32"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,  64*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_64"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client, 128*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_128"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client, 256*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_256"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client, 512*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_512"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,1024*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_1024"); g_free (s);
+  s = udisks_client_get_size_for_display (data->client,2048*1024, TRUE, FALSE); combobox_add_item (model, s, "chunk_2048"); g_free (s);
+
+
+  /* defaults: RAID6, 512 KiB Chunk */
+  gtk_combo_box_set_active_id (GTK_COMBO_BOX (data->level_combobox), "raid6");
+  gtk_combo_box_set_active_id (GTK_COMBO_BOX (data->chunk_combobox), "chunk_512");
+
+  update_dialog (data);
+}
+
+static void
+on_client_changed (UDisksClient   *client,
+                   gpointer        user_data)
+{
+  DialogData *data = user_data;
+  update_dialog (data);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+
+void
+gdu_create_raid_array_dialog_show (GduWindow    *window)
+{
+  DialogData *data;
+  guint n;
+
+  data = g_new0 (DialogData, 1);
+  data->ref_count = 1;
+  data->window = g_object_ref (window);
+  data->client = gdu_window_get_client (data->window);
+
+  data->dialog = GTK_WIDGET (gdu_application_new_widget (gdu_window_get_application (window),
+                                                         "create-raid-array-dialog.ui",
+                                                         "create-raid-array-dialog",
+                                                         &data->builder));
+  for (n = 0; widget_mapping[n].name != NULL; n++)
+    {
+      gpointer *p = (gpointer *) ((char *) data + widget_mapping[n].offset);
+      *p = gtk_builder_get_object (data->builder, widget_mapping[n].name);
+    }
+
+  gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (window));
+
+  init_dialog (data);
+
+  while (TRUE)
+    {
+      gint response;
+      response = gtk_dialog_run (GTK_DIALOG (data->dialog));
+      /* Keep in sync with .ui file */
+      switch (response)
+        {
+        case GTK_RESPONSE_CLOSE: /* Close */
+          goto out;
+          break;
+
+        default:
+          goto out;
+        }
+    }
+ out:
+  dialog_data_close (data);
+  dialog_data_unref (data);
+}
+
diff --git a/src/disks/gducreateraidarraydialog.h b/src/disks/gducreateraidarraydialog.h
new file mode 100644
index 0000000..f8fd39e
--- /dev/null
+++ b/src/disks/gducreateraidarraydialog.h
@@ -0,0 +1,22 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008-2012 Red Hat, Inc.
+ *
+ * Licensed under GPL version 2 or later.
+ *
+ * Author: David Zeuthen <zeuthen gmail com>
+ */
+
+#ifndef __GDU_CREATE_RAID_ARRAY_DIALOG_H__
+#define __GDU_CREATE_RAID_ARRAY_DIALOG_H__
+
+#include <gtk/gtk.h>
+#include "gdutypes.h"
+
+G_BEGIN_DECLS
+
+void   gdu_create_raid_array_dialog_show (GduWindow    *window);
+
+G_END_DECLS
+
+#endif /* __GDU_CREATE_RAID_ARRAY_DIALOG_H__ */
diff --git a/src/disks/gduwindow.c b/src/disks/gduwindow.c
index 01a0f0e..2fda782 100644
--- a/src/disks/gduwindow.c
+++ b/src/disks/gduwindow.c
@@ -38,6 +38,7 @@
 #include "gduchangepassphrasedialog.h"
 #include "gdudisksettingsdialog.h"
 #include "gdumdraiddisksdialog.h"
+#include "gducreateraidarraydialog.h"
 
 /* Keep in sync with tabs in disks.ui file */
 typedef enum
@@ -894,7 +895,7 @@ on_device_tree_menu_item_create_raid_array (GtkMenuItem *menu_item,
 void
 gdu_window_show_create_raid_array (GduWindow *window)
 {
-  g_print ("TODO: show create RAID array dialog\n");
+  gdu_create_raid_array_dialog_show (window);
 }
 
 /* ---------------------------------------------------------------------------------------------------- */



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