Re: [PATCH 05/30] Have an intermediary screen for the "Create" action.

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

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Looks fine.  Same comment here about the isNew parameter, but that's probably
how it was before you started working on these UI patches.  Given the amount
of work involved with these patches, I think it makes sense to clean up isNew
and make it a real boolean.

On Wed, 16 Sep 2009, Joel Granados Moreno wrote:

* iw/partition_gui.py (createCB): New function.  All the create requests
will pass through this function.  It pops up a dialog that presents the
different creat options to the user. Use the new  storage/partitioning.py
function (hasFreeDiskSpace).
---
iw/partition_gui.py |  192 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 183 insertions(+), 9 deletions(-)

diff --git a/iw/partition_gui.py b/iw/partition_gui.py
index b16bd4b..c83e08f 100644
--- a/iw/partition_gui.py
+++ b/iw/partition_gui.py
@@ -22,6 +22,7 @@

import gobject
import gtk
+import gtk.glade
try:
    import gnomecanvas
except ImportError:
@@ -31,7 +32,6 @@ import gui
import parted
import string
import types
-from constants import *

import storage
from iw_gui import *
@@ -45,6 +45,7 @@ from partIntfHelpers import *
from constants import *
from partition_ui_helpers_gui import *
from storage.partitioning import doPartitioning
+from storage.partitioning import hasFreeDiskSpace
from storage.devicelibs import lvm
from storage.devices import devicePathToName, PartitionDevice

@@ -505,7 +506,7 @@ class DiskTreeModel(gtk.TreeStore):
        if selection is not None:
            selection.unselect_all()
        gtk.TreeStore.clear(self)
-
+
    def __getitem__(self, iter):
        if type(iter) == gtk.TreeIter:
            return DiskTreeModelHelper(self, self.titleSlot, iter)
@@ -968,7 +969,7 @@ class PartitionWindow(InstallWindow):

            self.diskStripeGraph.selectSlice(device)

-    def newCB(self, widget):
+    def makepartCB(self, widget):
        device = self.storage.newPartition(fmt_type=self.storage.defaultFSType,
                                           size=200)
        self.editPartition(device, isNew=1)
@@ -999,7 +1000,178 @@ class PartitionWindow(InstallWindow):
                    device.vg._removeLogVol(device)

            self.refresh(justRedraw=justRedraw)
-
+
+    def createCB(self, *args):
+        # First we must decide what parts of the create_storage_dialog
+        # we will activate.
+
+        # For the Partition checkboxes.
+        # If we see that there is free space in the "Hard Drive" list, then we
+        # must activate all the partition radio buttons (RAID partition,
+        # LVM partition and Standard partition).  We will have only one var to
+        # control all three activations (Since they all depend on the same
+        # thing)
+        activate_create_partition = False
+        free_part_available = hasFreeDiskSpace(self.storage)
+        if free_part_available:
+            activate_create_partition = True
+
+        # We activate the create Volume Group radio button if there is a free
+        # partition with a Physical Volume format.
+        activate_create_vg = False
+        if (lvm.has_lvm()
+                and getFormat("lvmpv").supported
+                and len(self.storage.unusedPVs()) > 0):
+            activate_create_vg = True
+
+        # We activate the create RAID dev if there are partitions that have
+        # raid format and are not related to any raid dev.
+        activate_create_raid_dev = False
+        availraidparts = len(self.storage.unusedMDMembers())
+        availminors = self.storage.unusedMDMinors
+        if (len(availminors) > 0
+                and getFormat("software RAID").supported
+                and availraidparts > 1):
+            activate_create_raid_dev = True
+
+        # FIXME: Why do I need availraidparts to clone?
+        activate_create_raid_clone = False
+        if (len(self.storage.disks) > 1
+                and availraidparts > 0):
+            activate_create_raid_clone = True
+
+        # Must check if all the possibilities are False.  In this case tell the
+        # user that he can't create anything and the reasons.
+        if (not activate_create_partition
+                and not activate_create_vg
+                and not activate_create_raid_dev
+                and not activate_create_raid_clone):
+            self.intf.messageWindow(_("Cannot perform any creation action"),
+                                    _("Follows an explination... "),
+                                    custom_icon="warning")
+            return
+
+        # GTK crap starts here.
+        create_storage_xml = gtk.glade.XML(
+                gui.findGladeFile("create-storage.glade"), domain="anaconda")
+        self.dialog = create_storage_xml.get_widget("create_storage_dialog")
+
+        # Activate the partition radio buttons if needed.
+        # sp_rb -> standard partition
+        sp_rb = create_storage_xml.get_widget("create_storage_rb_standard_part")
+        # lp_rb -> lvm partition (physical volume)
+        lp_rb = create_storage_xml.get_widget("create_storage_rb_lvm_part")
+        # rp_rb -> RAID partition
+        rp_rb = create_storage_xml.get_widget("create_storage_rb_raid_part")
+        if activate_create_partition:
+            sp_rb.set_sensitive(True)
+            lp_rb.set_sensitive(True)
+            rp_rb.set_sensitive(True)
+
+        # Activate the Volume Group radio buttons if needed.
+        # vg_rb -> Volume Group
+        vg_rb = create_storage_xml.get_widget("create_storage_rb_lvm_vg")
+        if activate_create_vg:
+            vg_rb.set_sensitive(True)
+
+        # Activate the RAID dev if needed.
+        # rd_rb -> RAID device
+        rd_rb = create_storage_xml.get_widget("create_storage_rb_raid_dev")
+        if activate_create_raid_dev:
+            rd_rb.set_sensitive(True)
+
+        # Activate RAID clone if needed.
+        # rc_rb -> RAID clone
+        rc_rb = create_storage_xml.get_widget("create_storage_rb_raid_clone")
+        if activate_create_raid_clone:
+            rc_rb.set_sensitive(True)
+
+        # Before drawing lets select the first radio button that is sensitive:
+        # How can I get sensitivity from gtk.radiobutton?
+        if activate_create_partition:
+            sp_rb.set_active(True)
+        elif activate_create_vg:
+            vg_rb.set_active(True)
+        elif activate_create_raid_dev:
+            rd_rb.set_active(True)
+        elif activate_create_raid_clone:
+            rc_rb.set_active(True)
+
+        gui.addFrame(self.dialog)
+        self.dialog.show_all()
+
+        # We loop in the self.dialog.run() only for the help screens.
+        # dialog_rc == 2 -> partition about
+        # dialog_rc == 3 -> raid about
+        # dialog_rc == 4 -> lvm about
+        while True:
+            dialog_rc = self.dialog.run()
+            if dialog_rc == 2 or dialog_rc == 3 or dialog_rc == 4:
+                # FIXME: Code to handle the About messages.
+                pass
+            else:
+                break
+
+        # If Cancel was pressed
+        if dialog_rc == 0:
+            self.dialog.destroy()
+            return
+
+        # If Create was pressed  Make sure we do a dialog.destroy before
+        # calling any other screen.  We don't want the create dialog to show
+        # in the back when we pop up other screens.
+        if dialog_rc != 1:
+            log.error("I received a dialog_rc != 1 (%d) witch should not "
+                    "happen" % rc)
+            self.dialog.destroy()
+            return
+
+        self.dialog.destroy()
+        if rp_rb.get_active():
+            member = self.storage.newPartition(fmt_type="software RAID",
+                                               size=200)
+            self.editPartition(member, isNew = 1, restrictfs=["mdmember"])
+            return
+
+        elif rc_rb.get_active():
+            cloneDialog = raid_dialog_gui.RaidCloneDialog(self.storage,
+                                                          self.intf,
+                                                          self.parent)
+            if cloneDialog is None:
+                self.intf.messageWindow(_("Couldn't Create Drive Clone Editor"),
+                                        _("The drive clone editor could not "
+                                          "be created for some reason."),
+                                        custom_icon="error")
+                return
+
+            if cloneDialog.run():
+                self.refresh()
+
+            cloneDialog.destroy()
+            return
+
+        elif rd_rb.get_active():
+            array = self.storage.newMDArray(fmt_type=self.storage.defaultFSType)
+            self.editRaidArray(array, isNew=1)
+            return
+
+        elif lp_rb.get_active():
+            member = self.storage.newPartition(fmt_type="physical volume (LVM)",
+                                               size=200)
+            self.editPartition(member, isNew = 1, restrictfs=["lvmpv"])
+            return
+
+        elif vg_rb.get_active():
+            tempvg = self.storage.newVG()
+            self.editLVMVolumeGroup(tempvg, isNew = 1)
+            return
+
+        elif sp_rb.get_active():
+            tempformat = self.storage.defaultFSType
+            device = self.storage.newPartition(fmt_type=tempformat, size=200)
+            self.editPartition(device, isNew=1)
+            return
+
    def resetCB(self, *args):
        if not confirmResetPartitionState(self.intf):
            return
@@ -1361,13 +1533,15 @@ class PartitionWindow(InstallWindow):
        buttonBox = gtk.HButtonBox()
        buttonBox.set_layout(gtk.BUTTONBOX_SPREAD)

-        ops = ((_("Ne_w"), self.newCB),
+        ops = ((_("_Create"), self.createCB),
               (_("_Edit"), self.editCB),
               (_("_Delete"), self.deleteCB),
-               (_("Re_set"), self.resetCB),
-               (_("R_AID"), self.makeraidCB),
-               (_("_LVM"), self.makeLvmCB))
-
+               (_("Re_set"), self.resetCB))
+
+#               (_("_Partition"), self.makepartCB),
+#               (_("R_AID"), self.makeraidCB),
+#               (_("_LVM"), self.makeLvmCB))
+
        for label, cb in ops:
            button = gtk.Button(label)
            buttonBox.add (button)


- -- David Cantrell <dcantrell@xxxxxxxxxx>
Red Hat / Honolulu, HI

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkqy++8ACgkQ5hsjjIy1Vknc5wCfUfXooOwzJNbeaUkiCmLx4Gwm
UHsAn15b2bQpQuB9cptXC6nCar9swYu9
=P1+J
-----END PGP SIGNATURE-----

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux