Re: [PATCH 09/14] Add the updated and simplified parttype screen.

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

 



Nothing wrong from a quick glance, ack.

On 12/01/2009 09:15 PM, Chris Lumens wrote:
This revised screen is part of the simple flow for the new storage
filtering UI.  It only offers you to pick the kind of install you want
to do, check to review, and check to encrypt.  Everything else will go
on another screen later.
---
  iw/autopart_type.py              |  496 +++++++-------------------------------
  pixmaps/partscheme-all.png       |  Bin 0 ->  1739 bytes
  pixmaps/partscheme-custom.png    |  Bin 0 ->  953 bytes
  pixmaps/partscheme-freespace.png |  Bin 0 ->  1832 bytes
  pixmaps/partscheme-replace.png   |  Bin 0 ->  1930 bytes
  pixmaps/partscheme-shrink.png    |  Bin 0 ->  2049 bytes
  ui/autopart.glade                |  285 ++--------------------
  7 files changed, 111 insertions(+), 670 deletions(-)
  create mode 100644 pixmaps/partscheme-all.png
  create mode 100644 pixmaps/partscheme-custom.png
  create mode 100644 pixmaps/partscheme-freespace.png
  create mode 100644 pixmaps/partscheme-replace.png
  create mode 100644 pixmaps/partscheme-shrink.png

diff --git a/iw/autopart_type.py b/iw/autopart_type.py
index fc0e4be..9134e68 100644
--- a/iw/autopart_type.py
+++ b/iw/autopart_type.py
@@ -26,13 +26,10 @@ import math
  from constants import *
  import gui
  from partition_ui_helpers_gui import *
-from netconfig_dialog import NetworkConfigurator
+from pixmapRadioButtonGroup_gui import pixmapRadioButtonGroup

  from iw_gui import *
  from flags import flags
-import network
-from storage import iscsi
-from storage import fcoe
  from storage.deviceaction import *

  import gettext
@@ -150,16 +147,15 @@ class PartitionTypeWindow(InstallWindow):
      def getNext(self):
          if self.storage.checkNoDisks():
              raise gui.StayOnScreen
-
-        active = self.combo.get_active_iter()
-        val = self.combo.get_model().get_value(active, 1)

-        if val == -1:
+        if self.buttonGroup.getCurrent() == "custom":
              self.dispatch.skipStep("autopartitionexecute", skip = 1)
              self.dispatch.skipStep("partition", skip = 0)
              self.dispatch.skipStep("bootloader", skip = 0)
+
+            self.storage.clearPartType = CLEARPART_TYPE_NONE
          else:
-            if val == -2:
+            if self.buttonGroup.getCurrent() == "shrink":
                  (rc, actions) = whichToShrink(self.storage, self.intf)
                  if rc == gtk.RESPONSE_OK:
                      for action in actions:
@@ -168,53 +164,26 @@ class PartitionTypeWindow(InstallWindow):
                      raise gui.StayOnScreen

                  # we're not going to delete any partitions in the resize case
-                val = CLEARPART_TYPE_NONE
+                self.storage.clearPartType = CLEARPART_TYPE_NONE
+            elif self.buttonGroup.getCurrent() == "all":
+                self.storage.clearPartType = CLEARPART_TYPE_ALL
+            elif self.buttonGroup.getCurrent() == "replace":
+                self.storage.clearPartType = CLEARPART_TYPE_LINUX
+            elif self.buttonGroup.getCurrent() == "freespace":
+                self.storage.clearPartType = CLEARPART_TYPE_NONE

              self.dispatch.skipStep("autopartitionexecute", skip = 0)

-            if self.xml.get_widget("encryptButton").get_active():
+            if self.encryptButton.get_active():
                  self.storage.encryptedAutoPart = True
              else:
                  self.storage.encryptionPassphrase = ""
                  self.storage.retrofitPassphrase = False
                  self.storage.encryptedAutoPart = False
-
+
              self.storage.doAutoPart = True
-            self.storage.clearPartType = val
-
-            allowdrives = []
-            model = self.drivelist.get_model()
-            for row in model:
-                if row[0]:
-                    allowdrives.append(row[1])
-
-            if len(allowdrives)<  1:
-                mustHaveSelectedDrive(self.intf)
-                raise gui.StayOnScreen
-
-            self.storage.clearPartDisks = allowdrives
-
-            # pop the boot device to be first in the drive list
-            defiter = self.bootcombo.get_active_iter()
-            if defiter is None:
-                self.intf.messageWindow(_("Error"),
-                                        "Must select a drive to use as "
-                                        "the bootable device.",
-                                        type="warning", custom_icon="error")
-                raise gui.StayOnScreen
-
-            defboot = self.bootcombo.get_model().get_value(defiter, 1)
-
-            if not defboot in allowdrives:
-                msg = _("Do you really want to boot from a disk which is not used for installation?")
-                rc = self.intf.messageWindow(_("Warning"), msg, type="yesno", default="no", custom_icon ="warning")
-                if not rc:
-                    raise gui.StayOnScreen
-
-            self.anaconda.id.bootloader.drivelist.remove(defboot)
-            self.anaconda.id.bootloader.drivelist.insert(0, defboot)

-            if self.xml.get_widget("reviewButton").get_active():
+            if self.reviewButton.get_active():
                  self.dispatch.skipStep("partition", skip = 0)
                  self.dispatch.skipStep("bootloader", skip = 0)
              else:
@@ -224,296 +193,21 @@ class PartitionTypeWindow(InstallWindow):

          return None

-    def comboChanged(self, *args):
-        active = self.combo.get_active_iter()
-        val = self.combo.get_model().get_value(active, 1)
-        self.review = self.xml.get_widget("reviewButton").get_active()
-
-        # -1 is the combo box choice for 'create custom layout'
-        if val == -1:
-            if self.prevrev == None:
-               self.prevrev = self.xml.get_widget("reviewButton").get_active()
-
-            self.xml.get_widget("reviewButton").set_active(True)
-            self.xml.get_widget("reviewButton").set_sensitive(False)
-            self.xml.get_widget("driveScroll").set_sensitive(False)
-            self.xml.get_widget("bootDriveCombo").set_sensitive(False)
-            self.xml.get_widget("encryptButton").set_sensitive(False)
-        else:
-            if self.prevrev == None:
-               self.xml.get_widget("reviewButton").set_active(self.review)
-            else:
-               self.xml.get_widget("reviewButton").set_active(self.prevrev)
-               self.prevrev = None
-
-            self.xml.get_widget("reviewButton").set_sensitive(True)
-            self.xml.get_widget("driveScroll").set_sensitive(True)
-            self.xml.get_widget("bootDriveCombo").set_sensitive(True)
-            self.xml.get_widget("encryptButton").set_sensitive(True)
-
-    def addIscsiDrive(self):
-        if not network.hasActiveNetDev():
-            net = NetworkConfigurator(self.anaconda.id.network)
-            ret = net.run()
-            net.destroy()
-            if ret != gtk.RESPONSE_OK:
-                return ret
-
-        (dxml, dialog) = gui.getGladeWidget("iscsi-config.glade",
-                                            "iscsiDialog")
-        gui.addFrame(dialog)
-        dialog.show_all()
-        sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
-        map(lambda x: sg.add_widget(dxml.get_widget(x)),
-            ("iscsiAddrEntry", "iscsiInitiatorEntry", "userEntry", "passEntry",
-             "userinEntry", "passinEntry"))
-
-        # get the initiator name if it exists and don't allow changing
-        # once set
-        e = dxml.get_widget("iscsiInitiatorEntry")
-        e.set_text(self.storage.iscsi.initiator)
-        if self.storage.iscsi.initiatorSet: # this is uglyyyy....
-            e.set_sensitive(False)
-
-        while 1:
-            rc = dialog.run()
-            if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
-                break
-
-            initiator = dxml.get_widget("iscsiInitiatorEntry").get_text()
-            initiator.strip()
-            if len(initiator) == 0:
-                self.intf.messageWindow(_("Invalid Initiator Name"),
-                                        _("You must provide an initiator name."),
-                                        custom_icon="error")
-                continue
-
-            self.storage.iscsi.initiator = initiator
-
-            target = dxml.get_widget("iscsiAddrEntry").get_text().strip()
-            user = dxml.get_widget("userEntry").get_text().strip()
-            pw = dxml.get_widget("passEntry").get_text().strip()
-            user_in = dxml.get_widget("userinEntry").get_text().strip()
-            pw_in = dxml.get_widget("passinEntry").get_text().strip()
-
-            err = None
-            try:
-                count = len(target.split(":"))
-                idx = target.rfind("]:")
-                # Check for IPV6 [IPV6-ip]:port
-                if idx != -1:
-                    ip = target[1:idx]
-                    port = target[idx+2:]
-                # Check for IPV4 aaa.bbb.ccc.ddd:port
-                elif count == 2:
-                    idx = target.rfind(":")
-                    ip = target[:idx]
-                    port = target[idx+1:]
-                else:
-                    ip = target
-                    port = "3260"
-                network.sanityCheckIPString(ip)
-            except network.IPMissing, msg:
-                err = msg
-            except network.IPError, msg:
-                err = msg
-            if err:
-                self.intf.messageWindow(_("Error"), str(err),
-                                        custom_icon="error")
-                continue
-
-            try:
-                self.storage.iscsi.addTarget(ip, port, user, pw,
-                                             user_in, pw_in, self.intf)
-            except ValueError, e:
-                self.intf.messageWindow(_("Error"), str(e),
-                                        custom_icon="error")
-                continue
-            except IOError, e:
-                self.intf.messageWindow(_("Error"), str(e),
-                                        custom_icon="error")
-                rc = gtk.RESPONSE_CANCEL
-            break
-
-        dialog.destroy()
-        return rc
-
-
-    def addFcoeDrive(self):
-        (dxml, dialog) = gui.getGladeWidget("fcoe-config.glade",
-                                            "fcoeDialog")
-        combo = dxml.get_widget("fcoeNicCombo")
-        dcb_cb = dxml.get_widget("dcbCheckbutton")
-
-        # Populate the combo
-        cell = gtk.CellRendererText()
-        combo.pack_start(cell, True)
-        combo.set_attributes(cell, text = 0)
-        cell.set_property("wrap-width", 525)
-        combo.set_size_request(480, -1)
-        store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
-        combo.set_model(store)
-
-        netdevs = self.anaconda.id.network.available()
-        keys = netdevs.keys()
-        keys.sort()
-        selected_interface = None
-        for dev in keys:
-            # Skip NIC's which are connected (iow in use for a net install)
-            if dev in network.getActiveNetDevs():
-                continue
-
-            i = store.append(None)
-
-            desc = netdevs[dev].get("DESC")
-            if desc:
-                desc = "%s - %s" %(dev, desc)
-            else:
-                desc = "%s" %(dev,)
-
-            mac = netdevs[dev].get("HWADDR")
-            if mac:
-                desc = "%s - %s" %(desc, mac)
-
-            if selected_interface is None:
-                selected_interface = i
+    def typeChanged(self, *args):
+        if self.buttonGroup.getCurrent() == "custom":
+            if not self.prevrev:
+                self.prevrev = self.reviewButton.get_active()

-            store[i] = (desc, dev)
-
-        if selected_interface:
-            combo.set_active_iter(selected_interface)
+            self.reviewButton.set_active(True)
+            self.reviewButton.set_sensitive(False)
+            self.encryptButton.set_sensitive(False)
          else:
-            combo.set_active(0)
-
-        # Show the dialog
-        gui.addFrame(dialog)
-        dialog.show_all()
-        sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
-        sg.add_widget(dxml.get_widget("fcoeNicCombo"))
-
-        while 1:
-            rc = dialog.run()
-
-            if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
-                break
-
-            iter = combo.get_active_iter()
-            if iter is None:
-                self.intf.messageWindow(_("Error"),
-                                        "Must select a NIC to use.",
-                                        type="warning", custom_icon="error")
-                continue
-
-            try:
-                self.storage.fcoe.addSan(nic=store.get_value(iter, 1),
-                                         dcb=dcb_cb.get_active(),
-                                         intf=self.intf)
-            except IOError, e:
-                self.intf.messageWindow(_("Error"), str(e),
-                                        custom_icon="error")
-                rc = gtk.RESPONSE_CANCEL
-
-            break
-
-        dialog.destroy()
-        return rc
-
-    def addZfcpDrive(self):
-        (dxml, dialog) = gui.getGladeWidget("zfcp-config.glade",
-                                            "zfcpDialog")
-        gui.addFrame(dialog)
-        dialog.show_all()
-        sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
-        map(lambda x: sg.add_widget(dxml.get_widget(x)),
-            ("devnumEntry", "wwpnEntry", "fcplunEntry"))
-
-        while 1:
-            rc = dialog.run()
-            if rc != gtk.RESPONSE_APPLY:
-                break
-
-            devnum = dxml.get_widget("devnumEntry").get_text().strip()
-            wwpn = dxml.get_widget("wwpnEntry").get_text().strip()
-            fcplun = dxml.get_widget("fcplunEntry").get_text().strip()
-
-            try:
-                self.storage.zfcp.addFCP(devnum, wwpn, fcplun)
-            except ValueError, e:
-                self.intf.messageWindow(_("Error"), str(e),
-                                        custom_icon="error")
-                continue
-            break
-
-        dialog.destroy()
-        return rc
-
-
-    def addDrive(self, button):
-        (dxml, dialog) = gui.getGladeWidget("adddrive.glade", "addDriveDialog")
-        gui.addFrame(dialog)
-        dialog.show_all()
-        if not iutil.isS390():
-            dxml.get_widget("zfcpRadio").hide()
-            dxml.get_widget("zfcpRadio").set_group(None)
-
-        if not iscsi.has_iscsi():
-            dxml.get_widget("iscsiRadio").set_sensitive(False)
-            dxml.get_widget("iscsiRadio").set_active(False)
-
-        if not fcoe.has_fcoe():
-            dxml.get_widget("fcoeRadio").set_sensitive(False)
-            dxml.get_widget("fcoeRadio").set_active(False)
-
-        #figure out what advanced devices we have available and set sensible default
-        group = dxml.get_widget("iscsiRadio").get_group()
-        for button in group:
-            if button is not None and button.get_property("sensitive"):
-                button.set_active(True)
-                break
-
-        rc = dialog.run()
-        dialog.hide()
-        if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
-            return
-        if dxml.get_widget("iscsiRadio").get_active() and iscsi.has_iscsi():
-            rc = self.addIscsiDrive()
-        elif dxml.get_widget("fcoeRadio").get_active() and fcoe.has_fcoe():
-            rc = self.addFcoeDrive()
-        elif dxml.get_widget("zfcpRadio") is not None and dxml.get_widget("zfcpRadio").get_active():
-            rc = self.addZfcpDrive()
-        dialog.destroy()
-
-        if rc not in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
-            w = self.intf.waitWindow(_("Rescanning disks"),
-                                     _("Rescanning disks"))
-            self.storage.reset()
-            createAllowedDrivesStore(self.storage.disks,
-                                     self.storage.clearPartDisks,
-                                     self.drivelist,
-                                     disallowDrives=[self.anaconda.updateSrc])
-            self._fillBootStore()
-            w.pop()
-
-    def _fillBootStore(self):
-        self.anaconda.id.bootloader.updateDriveList()
-        bootstore = self.bootcombo.get_model()
-        bootstore.clear()
-        if len(self.anaconda.id.bootloader.drivelist)>  0:
-            defaultBoot = self.anaconda.id.bootloader.drivelist[0]
-        else:
-            defaultBoot = None
-        for disk in self.storage.disks:
-            if disk.name not in self.anaconda.id.bootloader.drivelist:
-                continue
-            dispstr = "%s %8.0f MB %s" %(disk.name, disk.size, disk.description)
-            i = bootstore.append(None)
-            bootstore[i] = (dispstr, disk.name)
-            if disk.name == defaultBoot:
-                self.bootcombo.set_active_iter(i)
-
-        if len(bootstore)<= 1:
-            self.bootcombo.set_sensitive(False)
+            if self.prevrev:
+                self.reviewButton.set_active(self.prevrev)
+                self.prevrev = None

+            self.reviewButton.set_sensitive(True)
+            self.encryptButton.set_sensitive(True)

      def getScreen(self, anaconda):
          self.anaconda = anaconda
@@ -521,88 +215,70 @@ class PartitionTypeWindow(InstallWindow):
          self.intf = anaconda.intf
          self.dispatch = anaconda.dispatch

-        (self.xml, vbox) = gui.getGladeWidget("autopart.glade", "parttypeBox")
-
-        # make some labels bold...
-        map(lambda l: l and l.set_markup("<b>%s</b>" %(l.get_text(),)),
-            map(lambda x: self.xml.get_widget(x),("selectLabel", "bootLabel")))
-
-        gui.widgetExpander(self.xml.get_widget("mainlabel"))
-
-        self.combo = self.xml.get_widget("partitionTypeCombo")
-        gui.widgetExpander(self.combo)
-        cell = gtk.CellRendererText()
-        self.combo.pack_start(cell, True)
-        self.combo.set_attributes(cell, text = 0)
-        cell.set_property("wrap-width", 495)
-        self.combo.set_size_request(500, -1)
-
-        store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_INT)
-        self.combo.set_model(store)
-        opts = ((_("Use entire drive"), CLEARPART_TYPE_ALL),
-                (_("Replace existing Linux system"), CLEARPART_TYPE_LINUX),
-                (_("Shrink current system"), -2),
-                (_("Use free space"), CLEARPART_TYPE_NONE),
-                (_("Create custom layout"), -1))
-
-        # if not set in ks, use UI default
-        if self.storage.clearPartType is None:
-            preselected = CLEARPART_TYPE_LINUX
-        else:
-            preselected = self.storage.clearPartType
-
-        for (txt, val) in opts:
-            iter = store.append(None)
-            store[iter] = (txt, val)
-            if val == preselected:
-                self.combo.set_active_iter(iter)
-
-        if ((self.combo.get_active() == -1) or
-            self.dispatch.stepInSkipList("autopartitionexecute")):
-            self.combo.set_active(len(opts) - 1) # yeah, it's a hack
-
-        self.drivelist = createAllowedDrivesList(self.storage.disks,
-                                                 self.storage.clearPartDisks,
-                                                 disallowDrives=[self.anaconda.updateSrc])
-        self.drivelist.set_size_request(375, 80)
-
-        self.xml.get_widget("driveScroll").add(self.drivelist)
-
-        self.bootcombo = self.xml.get_widget("bootDriveCombo")
-        thecell = gtk.CellRendererText()
-        self.bootcombo.pack_start(thecell, True)
-
-        bootstore = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
-        self.bootcombo.set_model(bootstore)
-        self._fillBootStore()
+        (self.xml, vbox) = gui.getGladeWidget("autopart.glade", "parttypeTable")
+        self.encryptButton = self.xml.get_widget("encryptButton")
+        self.reviewButton = self.xml.get_widget("reviewButton")
+        self.table = self.xml.get_widget("parttypeTable")

          self.prevrev = None
-        self.review = not self.dispatch.stepInSkipList("partition")
-        self.xml.get_widget("reviewButton").set_active(self.review)
-
-        self.xml.get_widget("encryptButton").set_active(self.storage.encryptedAutoPart)
+        self.reviewButton.set_active(not self.dispatch.stepInSkipList("partition"))
+        self.encryptButton.set_active(self.storage.encryptedAutoPart)
+
+        self.buttonGroup = pixmapRadioButtonGroup()
+        self.buttonGroup.addEntry("all", _("Use All Space"),
+                                  pixmap=gui.readImageFromFile("partscheme-all.png"),
+                                  descr=_("Removes all partitions on the selected "
+                                          "device(s).  This includes partitions "
+                                          "created by other operating systems.\n\n"
+                                          "<b>Tip:</b>  This option will remove "
+                                          "data from the selected device(s).  Make "
+                                          "sure you have backups."))
+        self.buttonGroup.addEntry("replace", _("Replace Existing Linux System(s)"),
+                                  pixmap=gui.readImageFromFile("partscheme-replace.png"),
+                                  descr=_("Removes only Linux partitions (created from "
+                                          "a previous Linux installation).  This does "
+                                          "not remove other partitions you may have "
+                                          "on your storage device(s) (such as VFAT or "
+                                          "FAT32).\n\n"
+                                          "<b>Tip:</b>  This option will remove "
+                                          "data from the selected device(s).  Make "
+                                          "sure you have backups."))
+        self.buttonGroup.addEntry("shrink", _("Shrink Current System"),
+                                  pixmap=gui.readImageFromFile("partscheme-shrink.png"),
+                                  descr=_("Shrinks existing partitions to create free "
+                                          "space for the default layout."))
+        self.buttonGroup.addEntry("freespace", _("Use Free Space"),
+                                  pixmap=gui.readImageFromFile("partscheme-freespace.png"),
+                                  descr=_("Retains your current data and partitions and "
+                                          "uses only the unpartitioned space on the "
+                                          "selected device(s), assuming you have enough "
+                                          "free space available."))
+        self.buttonGroup.addEntry("custom", _("Create Custom Layout"),
+                                  pixmap=gui.readImageFromFile("partscheme-custom.png"),
+                                  descr=_("Manually create your own custom layout on "
+                                          "the selected device(s) using our partitioning "
+                                          "tool."))
+
+        self.buttonGroup.setToggleCallback(self.typeChanged)
+
+        widget = self.buttonGroup.render()
+        self.table.attach(widget, 0, 1, 1, 2)

-        active = self.combo.get_active_iter()
-        val = self.combo.get_model().get_value(active, 1)
-
-        # -1 is the combo box choice for 'create custom layout'
-        if val == -1:
+        # if not set in ks, use UI default
+        if self.storage.clearPartType is None or self.storage.clearPartType == CLEARPART_TYPE_LINUX:
+            self.buttonGroup.setCurrent("replace")
+        elif self.storage.clearPartType == CLEARPART_TYPE_NONE:
+            self.buttonGroup.setCurrent("freespace")
+        elif self.storage.clearPartType == CLEARPART_TYPE_ALL:
+            self.buttonGroup.setCurrent("all")
+
+        if self.buttonGroup.getCurrent() == "custom":
              # make sure reviewButton is active and not sensitive
              if self.prevrev == None:
-               self.prevrev = self.xml.get_widget("reviewButton").get_active()
-
-            self.xml.get_widget("reviewButton").set_active(True)
-            self.xml.get_widget("reviewButton").set_sensitive(False)
-
-            self.xml.get_widget("driveScroll").set_sensitive(False)
-            self.xml.get_widget("bootDriveCombo").set_sensitive(False)
-            self.xml.get_widget("encryptButton").set_sensitive(False)
-
-        if not iutil.isS390() and not iscsi.has_iscsi() and not fcoe.has_fcoe():
-            self.xml.get_widget("addButton").set_sensitive(False)
+                self.prevrev = self.reviewButton.get_active()

-        sigs = { "on_partitionTypeCombo_changed": self.comboChanged,
-                 "on_addButton_clicked": self.addDrive }
-        self.xml.signal_autoconnect(sigs)
+            self.reviewButton.set_active(True)
+            self.reviewButton.set_sensitive(False)
+            self.encryptButton.set_sensitive(False)

          return vbox
diff --git a/pixmaps/partscheme-all.png b/pixmaps/partscheme-all.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c541ce413628f6051df13f64fa4f7c49094edc3
GIT binary patch
literal 1739
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

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-custom.png b/pixmaps/partscheme-custom.png
new file mode 100644
index 0000000000000000000000000000000000000000..62e2e6bdd35ba2b091d802f6b3daef1e1b57ccf5
GIT binary patch
literal 953
zcmV;q14jIbP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJL00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H112#!SK~z|U?U=t$+%Oc!zmDxxAy?oZ;3gR01nT_(`~z&IQx_!0
zN{BLcsZduIek~oDY3X)53tN${6;oRlbV48yzr<C#%h~Rb+HstOQm6_;o@8C}WaoYK
zeeXHW5v3F!gLw}PpsfUPtpstc1aYkdajgV#tpstc1aYkdajgV#jRC;Y($do)eDanv
z`qKA(_Adhzort^LDC+fkTOzu6x3I8y!2lo#`C|Q9{dH}ub_WQB{PTC7KXz#U_aEQp
zKkx2#0K8!Uz?lD{HdbSEbMpwpzS|?*;{%}GZewk2*=v6N^4x&<ocjO}hJBFo|9oBq
zK>z^Yj8}jME>>I7N7FU;1_^=yzVF|0bs|aJC4}5+86gCO5QJff>FH@qOiW;4U;qGc
zdU}dRqk)~Boj8P2_?yq!Kej6&1fJ&^2+#8%guw9dFfK1I(QG!+-`|gVy^fig85|xS
zqSb0aN@-y9wQIJk5JU&HhYhu|vVtgz%>0p&5mYJ_3=Iw8`1sfamr|xikxIEBlu{F1
zU)vC#=Rqk2&N(Qhn3|eGrBcDw)fM*l_rVxTDIukV5W>I+A+#nSS&*2NF_r?bq3je9
zLg4#8W@l$ntyXbxaDdItO>{aPaLzMo5JC(DAta@y0Z~ekSTO=hX$ryxu~iu#A4j!X
zMXS}q#>R$GDK9025Cb8EKomt#Dvq5=4IwbW^I#~YsoFU?IYFb*z}eXu7>gfe*Md%m
zPKAch*BM0;SGquLC^uC)J%fXT=ytnC3A-ljz@`9FZSC$Oma_=L1@b%(larGe9UX;~
z66@>hxv6liXn$eJ1f)RR_RWLY+uH+U3`a*tV2tH-MG{ymr8~~uLv!2L?hLnWZK(6}
zb8K&K0{}SZ5JEr*kqN97(nFWQjT@StnD?6pNGSyXQ<(0Y;%6#kYs4c+PEW<Z?vPTN
z2iaS?J#KpDZ(-7kC<R<!Ut84itn7WV+P=1rhS`8h?-|D5ZvRYWf&oAjMO^?`U0pT{
zHC$rJP2x{i|IPlqm!3keC%Ohi3i<xyrw^|f<HavQD};M!(7WTU%$g~LjD+ZI0RVX{
be}Vr3mm2|vOw*|K00000NkvXXu0mjfX|<tO

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-freespace.png b/pixmaps/partscheme-freespace.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c999168f6174ba44eac5b735791d8895cb64db9
GIT binary patch
literal 1832
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
W%FlDR(zVe50000<MNUMnLSTabHfZVq

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-replace.png b/pixmaps/partscheme-replace.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2fcf18c0bfd84e7de8dd2ad8fb87d403f4eb75b
GIT binary patch
literal 1930
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
Q3jhEB07*qoM6N<$f)uHgZ~y=R

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-shrink.png b/pixmaps/partscheme-shrink.png
new file mode 100644
index 0000000000000000000000000000000000000000..1822cb8f04d8dc26fb2f2a30fb170c0d53b8172a
GIT binary patch
literal 2049
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

literal 0
HcmV?d00001

diff --git a/ui/autopart.glade b/ui/autopart.glade
index 9131ccf..acf7d24 100644
--- a/ui/autopart.glade
+++ b/ui/autopart.glade
@@ -22,15 +22,18 @@
    <property name="urgency_hint">False</property>

    <child>
-<widget class="GtkVBox" id="parttypeBox">
-<property name="border_width">5</property>
+<widget class="GtkTable" id="parttypeTable">
+<property name="visible">True</property>
+<property name="n_rows">4</property>
+<property name="n_columns">1</property>
        <property name="homogeneous">False</property>
-<property name="spacing">10</property>
+<property name="row_spacing">0</property>
+<property name="column_spacing">0</property>

        <child>
  	<widget class="GtkLabel" id="mainlabel">
  	<property name="visible">True</property>
-	<property name="label" translatable="yes">Installation requires partitioning of your hard drive.  The default layout is suitable for most users.  Select what space to use and which drives to use as the install target. You can also choose to create your own custom layout.</property>
+	<property name="label" translatable="yes">Which type of installation would you like?</property>
  	<property name="use_underline">False</property>
  	<property name="use_markup">False</property>
  	<property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -46,36 +49,12 @@
  	<property name="angle">0</property>
  	</widget>
  	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
-	</packing>
-</child>
-
-<child>
-	<widget class="GtkAlignment" id="partalign">
-	<property name="visible">True</property>
-	<property name="xalign">0.5</property>
-	<property name="yalign">0.5</property>
-	<property name="xscale">1</property>
-	<property name="yscale">1</property>
-	<property name="top_padding">0</property>
-	<property name="bottom_padding">0</property>
-	<property name="left_padding">0</property>
-	<property name="right_padding">50</property>
-
-	<child>
-	<widget class="GtkComboBox" id="partitionTypeCombo">
-	<property name="add_tearoffs">False</property>
-	<property name="focus_on_click">True</property>
-	<signal name="changed" handler="on_partitionTypeCombo_changed" last_modification_time="Tue, 04 Oct 2005 15:46:17 GMT"/>
-	</widget>
-	</child>
-	</widget>
-	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
+	<property name="left_attach">0</property>
+	<property name="right_attach">1</property>
+	<property name="top_attach">0</property>
+	<property name="bottom_attach">1</property>
+	<property name="x_options">fill</property>
+	<property name="y_options"></property>
  	</packing>
        </child>

@@ -92,229 +71,12 @@
  	<property name="draw_indicator">True</property>
  	</widget>
  	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
-	</packing>
-</child>
-
-<child>
-	<widget class="GtkLabel" id="selectLabel">
-	<property name="label" translatable="yes" context="yes">_Select the drive(s) to use for this installation.</property>
-	<property name="use_underline">True</property>
-	<property name="use_markup">True</property>
-	<property name="justify">GTK_JUSTIFY_LEFT</property>
-	<property name="wrap">False</property>
-	<property name="selectable">False</property>
-	<property name="xalign">0</property>
-	<property name="yalign">0.5</property>
-	<property name="xpad">0</property>
-	<property name="ypad">0</property>
-	<property name="mnemonic_widget">partitionTypeCombo</property>
-	<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	<property name="width_chars">-1</property>
-	<property name="single_line_mode">False</property>
-	<property name="angle">0</property>
-	</widget>
-	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
-	</packing>
-</child>
-
-<child>
-	<widget class="GtkAlignment" id="drivealign">
-	<property name="visible">True</property>
-	<property name="xalign">0.5</property>
-	<property name="yalign">0.5</property>
-	<property name="xscale">1</property>
-	<property name="yscale">1</property>
-	<property name="top_padding">0</property>
-	<property name="bottom_padding">0</property>
-	<property name="left_padding">30</property>
-	<property name="right_padding">50</property>
-
-	<child>
-	<widget class="GtkVBox" id="drivevbox">
-	<property name="visible">True</property>
-	<property name="homogeneous">False</property>
-	<property name="spacing">10</property>
-
-	<child>
-		<widget class="GtkScrolledWindow" id="driveScroll">
-		<property name="visible">True</property>
-		<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-		<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-		<property name="shadow_type">GTK_SHADOW_IN</property>
-		<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
-		<child>
-		<placeholder/>
-		</child>
-		</widget>
-		<packing>
-		<property name="padding">0</property>
-		<property name="expand">False</property>
-		<property name="fill">False</property>
-		</packing>
-	</child>
-
-	<child>
-		<widget class="GtkHBox" id="hbox2">
-		<property name="visible">True</property>
-		<property name="homogeneous">False</property>
-		<property name="spacing">0</property>
-
-		<child>
-		<widget class="GtkButton" id="addButton">
-		<property name="visible">True</property>
-		<property name="can_focus">True</property>
-		<property name="relief">GTK_RELIEF_NORMAL</property>
-		<property name="focus_on_click">True</property>
-		<signal name="clicked" handler="on_addButton_clicked" last_modification_time="Thu, 13 Jul 2006 15:16:40 GMT"/>
-
-		<child>
-			<widget class="GtkAlignment" id="buttonlabelalign">
-			<property name="visible">True</property>
-			<property name="xalign">0.5</property>
-			<property name="yalign">0.5</property>
-			<property name="xscale">0</property>
-			<property name="yscale">0</property>
-			<property name="top_padding">0</property>
-			<property name="bottom_padding">0</property>
-			<property name="left_padding">0</property>
-			<property name="right_padding">0</property>
-
-			<child>
-			<widget class="GtkHBox" id="hbox1">
-			<property name="border_width">1</property>
-			<property name="visible">True</property>
-			<property name="homogeneous">False</property>
-			<property name="spacing">4</property>
-
-			<child>
-				<widget class="GtkImage" id="image1">
-				<property name="visible">True</property>
-				<property name="stock">gtk-add</property>
-				<property name="icon_size">4</property>
-				<property name="xalign">0.5</property>
-				<property name="yalign">0.5</property>
-				<property name="xpad">0</property>
-				<property name="ypad">0</property>
-				</widget>
-				<packing>
-				<property name="padding">0</property>
-				<property name="expand">False</property>
-				<property name="fill">False</property>
-				</packing>
-			</child>
-
-			<child>
-				<widget class="GtkLabel" id="label3">
-				<property name="visible">True</property>
-				<property name="label" translatable="yes">_Advanced storage configuration</property>
-				<property name="use_underline">True</property>
-				<property name="use_markup">True</property>
-				<property name="justify">GTK_JUSTIFY_LEFT</property>
-				<property name="wrap">False</property>
-				<property name="selectable">False</property>
-				<property name="xalign">0.5</property>
-				<property name="yalign">0.5</property>
-				<property name="xpad">0</property>
-				<property name="ypad">0</property>
-				<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-				<property name="width_chars">-1</property>
-				<property name="single_line_mode">False</property>
-				<property name="angle">0</property>
-				</widget>
-				<packing>
-				<property name="padding">0</property>
-				<property name="expand">False</property>
-				<property name="fill">False</property>
-				</packing>
-			</child>
-			</widget>
-			</child>
-			</widget>
-		</child>
-		</widget>
-		<packing>
-		<property name="padding">0</property>
-		<property name="expand">False</property>
-		<property name="fill">False</property>
-		</packing>
-		</child>
-
-		<child>
-		<placeholder/>
-		</child>
-		</widget>
-		<packing>
-		<property name="padding">0</property>
-		<property name="expand">False</property>
-		<property name="fill">False</property>
-		</packing>
-	</child>
-	</widget>
-	</child>
-	</widget>
-	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
-	</packing>
-</child>
-
-<child>
-	<widget class="GtkLabel" id="bootLabel">
-	<property name="label" translatable="yes" context="yes">What drive would you like to _boot this installation from?</property>
-	<property name="use_underline">True</property>
-	<property name="use_markup">True</property>
-	<property name="justify">GTK_JUSTIFY_LEFT</property>
-	<property name="wrap">False</property>
-	<property name="selectable">False</property>
-	<property name="xalign">0</property>
-	<property name="yalign">0.5</property>
-	<property name="xpad">0</property>
-	<property name="ypad">0</property>
-	<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	<property name="width_chars">-1</property>
-	<property name="single_line_mode">False</property>
-	<property name="angle">0</property>
-	</widget>
-	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
-	</packing>
-</child>
-
-<child>
-	<widget class="GtkAlignment" id="bootalign">
-	<property name="visible">True</property>
-	<property name="xalign">0.5</property>
-	<property name="yalign">0.5</property>
-	<property name="xscale">1</property>
-	<property name="yscale">1</property>
-	<property name="top_padding">0</property>
-	<property name="bottom_padding">0</property>
-	<property name="left_padding">30</property>
-	<property name="right_padding">50</property>
-
-	<child>
-	<widget class="GtkComboBox" id="bootDriveCombo">
-	<property name="visible">True</property>
-	<property name="items" translatable="yes"></property>
-	<property name="add_tearoffs">False</property>
-	<property name="focus_on_click">True</property>
-	</widget>
-	</child>
-	</widget>
-	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
+	<property name="left_attach">0</property>
+	<property name="right_attach">1</property>
+	<property name="top_attach">2</property>
+	<property name="bottom_attach">3</property>
+	<property name="x_options">fill</property>
+	<property name="y_options"></property>
  	</packing>
        </child>

@@ -329,9 +91,12 @@
  	<property name="draw_indicator">True</property>
  	</widget>
  	<packing>
-	<property name="padding">0</property>
-	<property name="expand">False</property>
-	<property name="fill">False</property>
+	<property name="left_attach">0</property>
+	<property name="right_attach">1</property>
+	<property name="top_attach">3</property>
+	<property name="bottom_attach">4</property>
+	<property name="x_options">fill</property>
+	<property name="y_options"></property>
  	</packing>
        </child>
      </widget>

_______________________________________________
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