FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Gentoo > Gentoo User

 
 
LinkBack Thread Tools
 
Old 12-01-2009, 07:15 PM
Chris Lumens
 
Default Add the updated and simplified parttype screen.

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(defbo ot)
- 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(Tru e)
- self.xml.get_widget("reviewButton").set_sensitive( False)
- self.xml.get_widget("driveScroll").set_sensitive(F alse)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(False)
- self.xml.get_widget("encryptButton").set_sensitive (False)
- else:
- if self.prevrev == None:
- self.xml.get_widget("reviewButton").set_active(sel f.review)
- else:
- self.xml.get_widget("reviewButton").set_active(sel f.prevrev)
- self.prevrev = None
-
- self.xml.get_widget("reviewButton").set_sensitive( True)
- self.xml.get_widget("driveScroll").set_sensitive(T rue)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(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]ort
- if idx != -1:
- ip = target[1:idx]
- port = target[idx+2:]
- # Check for IPV4 aaa.bbb.ccc.dddort
- 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.drivel ist)
-
- 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(sel f.review)
-
- self.xml.get_widget("encryptButton").set_active(se lf.storage.encryptedAutoPart)
+ self.reviewButton.set_active(not self.dispatch.stepInSkipList("partition"))
+ self.encryptButton.set_active(self.storage.encrypt edAutoPart)
+
+ 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.

"
+ "<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).

"
+ "<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.typeChange d)
+
+ 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(Tru e)
- self.xml.get_widget("reviewButton").set_sensitive( False)
-
- self.xml.get_widget("driveScroll").set_sensitive(F alse)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(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(Fal se)
+ 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..7c541ce4 13628f6051df13f64fa4f7c49094edc3
GIT binary patch
literal 1739
zcmV;+1~mDJP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H121rRnK~z|U&6wM76jdC@zvs-E>E63-Q8uIq5e1~uQc);8Ac;zd
z4+cSu@M2=32?^m6d1y=w@kv5zn)0Cj1%?D#Y6uszR476LBU*} zA`lS8a%;Ek&TMz*
za(vj%?p)4nElBj2oXpIbGw1g?zuP&xgmaGngRr0%yLRoWA;en 3DJ2i9gjg2moPOKd
z+BzIK#%qzbwzg<hn0+?0zJApcvt~~t4~+qE4&3<t#@#<|-c09n#-<%RcBtMlK8r{)
zd3(i*7dOTeF=;%X!@uD<LV%{G#?+iA=WOih={XDFQ|}n+?WnF !yq8Q?OIl8aWm(|-
z;hSYy&~hpg)d?w4op@IS>jSB)o0cjVg}~Ku&XLRI;B~2GSx{B Y*Y6bFDB!WWx|Hah
z&oz`%9^{YF(J}P@&<{mXkT2xX*w~1gnk4f1JkFjy2Srv8i$$@ pabeIZK&T{q6__<5
zxpws$X3Us@r=FgJ>(_7K>XoZ_{)NTJX0xD#Vrk0~kOz!zpKB_ KrfEo2CjbEPcpR!$
z4E~y$8pPvq^qoF~(b3UI4-yK6plKQaU_6&YC=@DALMawCH=%xJJ$||L>jQyI$u+ZQ
z&%(gKMT}%dFg!er1r5&t0B+s7g~7qwFmwa)c<j-G)YjEv+42^sSrzl<&n;Obl}aHL
z3V{%UWHR~aK>&a;hSc;F7*kyRu}A`jp(B^qAW7oPm=cJpsd>g ^<O_M>2bN_aSzQam
z(EXD|V^9aPfgp^@$Y!(SqIbSvy?f_Q+B7UsB93EjamY*#Y}^v pAWA4KljHvVdubu0
zw<D)!+xpJ*y}G#hxyO?=wai=GG);xX#2%FxLo6CYBocMMAOs_ s5u@+)>DyX%>=V(q
zzTFo9+S}X1kgctZvbEscRiR?>SbW`@^>a<r@Kr8JV!X3^-{tIBcFY694a?|)PCK@5
z-<}h$f^$BlmQEj8IWn3thKBBOZyOoS80qwpl~bLQb3S?2^qlzWe MM24>}RIPDM~3Z
z1!F0tgemd|-}D`S$L=c_#`%|4ywWk5p2^eK<muXEZR`Ab4bybJm?@@d2!|4Yw k%ox
z3INEmj7yh)zB~Bm&5tM5fr%K|y?b{&9Ig6LX3_>lQG9UWNTjM |>9Xq7^b{Q*7iOPJ
zLZJ};x;<!}JJ*-dw4CrvQ7GuTVHlmJp806oww)OU0O6>-vw2bT)`kTQffgDX9>Q35
z4ADpox?Y~U80+PLSClG@j*S7_qN`qBUF)8OJH7#ayK;HUcjwR N0kkpzU`$!pu%Ll$
z-n<3TXe4l@3!9$BhPO5%916j9Q*qZXCXg)4$c^W)ckdVY@#3Yxc >q9FRqWZ*PWuNg
zyj}uPWLW`#Xfy&VpdbN2|MvrkMxt2%#+zVFcEyS$F_@->?(PE^xbV}Y=aO(ZT!d$G
z445QXMQL{8_(_B#A*^|AEjR}_H$eymr4(Nt?8eF7Qy_#0n}7c DeIQ8j;9Lf9J|8-G
z6p=^_t5>atVHEd}!$%L}$f2X)93{n+QWprN!N;E|9gLiio%_3 R@>DMrr3$?#PoQi6
zfr@SwOL=_JA_B8fN?jHanf5?uH%3M>IF>#R##m|Bb&jp%8mCl @5!;-$iETjV`>&7n
zLZT8Pkw^*H8&|elefIb#G2(=9!Z@M4tF)Clm0OnOYC*qygdmb 6m6Y4}P6*p7K_E^D
z`)ZnI3C1+-or=Sr!2wd7gfZp<a6);r!0CHYsyi(~2q{4jLP`bEWf9IfDK3UU k|Y;|
z7bM6kB5Qa-YzWgdq3ilY9V(u8T&^JmCFLR*Ns?T#69i(z*zT}hVMB=A%8GU< p}1D=
zgz~zol53nUD8~a_<DB6jjFBJ+FOU<)sle+Bued=x7AX#Z3&fk gm0)ZI{;cp@$}W`N
z`X)?YZ&rB0oIp+x(==h4rcbeLA$Nr(l?$4;SUImEK)bBlfhkI D@s-0LBb1<gdJ4XZ
z>Vz%c-P#!oLDvbxxGlmtkj-Wt)WuQ$=knLid!YPBlV2gXYeuPGRW+9<7y#%KhtQ6W
z_R@zoTv^Hw<$ibcSMC>WdK`vf7D^zNX??!GYu_fu<ls%vp~Ab NbI-5AisBe)nwD;w
hMkf&Plk>ljzX2EIBFC(wZ;}82002ovPDHLkV1h6eH#q<R

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-custom.png b/pixmaps/partscheme-custom.png
new file mode 100644
index 0000000000000000000000000000000000000000..62e2e6bd d35ba2b091d802f6b3daef1e1b57ccf5
GIT binary patch
literal 953
zcmV;q14jIbP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H112#!SK~z|U?U=t$+%Oc!zmDxxAy?oZ;3gR 01nT_(`~z&IQx_!0
zN{BLcsZduIek~oDY3X)53tN${6;oRlbV48yzr<C#%h~Rb+Hst OQm6_;o@8C}WaoYK
zeeXHW5v3F!gLw}PpsfUPtpstc1aYkdajgV#tpstc1aYkdajgV #jRC;Y($do)eDanv
z`qKA(_Adhzort^LDC+fkTOzu6x3I8y!2lo#`C|Q9{dH}ub_WQ B{PTC7KXz#U_aEQp
zKkx2#0K8!Uz?lD{HdbSEbMpwpzS|?*;{%}GZewk2*=v6N^4x& <ocjO}hJBFo|9oBq
zK>z^Yj8}jME>>I7N7FU;1_^=yzVF|0bs|aJC4}5+86gCO5QJf f>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|xikxI EBlu{F1
zU)vC#=Rqk2&N(Qhn3|eGrBcDw)fM*l_rVxTDIukV5W>I+A+#n SS&*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!(7WT U%$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..9c999168 f6174ba44eac5b735791d8895cb64db9
GIT binary patch
literal 1832
zcmV+@2iN$CP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12Bk?vK~z|U&6rzk9Mu`e|KFK&W@f#<#HLU ;cAPkYlExLpTvU>9
z5flY@s;WL!6%?rwqAC<nNfZeXa@D5@3PON*rf<2mg$RR_kV+7 UYI_5T)LiVu;KZSj
z7&dlxygM^z4iB?4JGWhDtyJnK9qsNpbI$pl|96?$A*B@lAB@) <7#bSlxtzGmBW7Hc
zog^l=ZQC|kZ<w+adHwZQpIz3~^~Bn>Kkn8vUKh3*yEuDs?)1d uu?6e$@1A)k4U__T
z>7~E)58itF`1Lp3&}l7{;CWZab-K`@a~;F)4<C5^u|M3O9B0W6v!(6HzLl#w=P%De
zN(rUBtI{fV8IH8k+p}U|XlST)agbc@e#6iko~~Rj!*yk>Pbme <vLL0bGYhEL74-Bj
z?=)NaEy=Nz{}}_JjyGJ_MPa-E*Ojns8~v;Mv2tY}0APHqfJ&tT0NA)`1Bj>&4v|tS
zB|uYwc>erX01-BB+JL#ad5r#h6urGYAR-itMci@6&ya7;H-M;bDY8apSr*#c+W`P=
zZLRP;59Nh27-Lv-{c4Pkj$vlzeA5t3gP4W^t7HN2<AjJ{n0}e*@9)R0x7~sh$4|g<
zoTfpVa?SFd<v4rx914Xauq+FGeJj8@$AYzhqsNZHFbtTc3BH8 V)6@)I*ZugoGzTFB
zTHE|A%(dk3leKH%xDGlxI+he8O`~g?hR$W3$miP-Eru;-D~N#NrSF=C05W2vT&|q=
zJg?y-!!Xg>l80#+vDVqq)v%6e8pqt+oTVwuEDBPxO0RtT?RN`Yt1lK2 gAf9OCz=oq
zKnN{n9#d0O|J}0X`HAFcYPVIrYxa$ejZF>?u3yvL-QAMqZ`YB~G=b#(Qqwqe-N3T;
z&eWVrrJ_DNQn+~OQt_{un01~<=;c?p|3cUGKS9Av4nFw6L+iV L_#^JR@ifilTCo4%
z$n4aasi}-Lk1mw#7q)KQnptS-fi$!)zC1H~P1g^)vOq=)hyQlh#(N)WcFjezX5WXy
zn+?PK4G}^g^{-qlvacp6g*!j`<lx&uk96g%UG|>eym@n}(LReRGBPrfZ|lsD-?skt
z8$Hj1QVL2bl*<dLYl9d86f}+F!o{zxiPI;y+;iv8-)y)^0J44i_O@K!ctLRO*SfB!
zRMIrg)(s3?bJI_6)-0>x!2kf9b2zSxj}QH;bm7A6eAYF#?KrOM?v_q*=;^0lEOG$I
z<;9DG>j$42ST|7DRh3EwUrtY<Z^f#Z8Z|*x6<Pyh8qUp}!KMv &=K<tvtEkwViOExc
z92+060NBR;6X?GhSU12Qd+Ir`_TFrg`5CO~>A=H}JdFNTt3#M tb`uz5;6lfH!+SCE
z{(dxad#O~yYp=b+K0EsPFGCPr2ps@edoSF+`!XkL(;woSZ@$3 J9Xs*cM<2y?*IozP
zu7u-61j8_K;NU*&```c;tIoMx4gesyXa$;l3;=-X>2uh%YX|1%=OKg+A_5VEY3A_h
z;X~N_&TzvrAGN4pO@jcy@&BB{p1<#g<2c})!!%7C`MiKVyZ-^(wwJQx(m()UY_x!P
z_x=+^8ct1|#LgYNU|H#uZfrG4{4B}1pRj757tzmm1BKrYeS8> P2%I>65|`&o&@?R!
z(4gL2sb!|C#t5v+Mv5Rk1tJ3H9E`Cz%txOB0E7@Rh-mQ(zNhqvbY=XVAZUz2kx119
z6hfpx;tQuiJkN`@dMc$ssM@NMc%A|ye^Vg@i2Qod2qX#-d`c-pm|9k;@CFtEQ2_aB
z1gZq4DL_R)k}ZHpwx|+B6haVD>Peqh7a^qpf*+)Qj8s7w;3)u vSd1i9$x<T;5<o~P
z;W!SI^7l@;hRAOLjK4C#NWn|ErV&U06SyOAMF5fIRu2ELp)n# b22}Tf0>C_iB7&xA
z)tee?=$fbtl2taI*2y{&=}ao36hNdvRo4U{QJClkNmnGTUVY) U3w&jw?(xBV2m(Sy
zk}$yr>8waA#TbK9Dpf<{=}QCxRpX!v;`x2SZJsd}1B!x3DXTA c;u{AFMHQ?*R@MOt
zFF~!c))-T18$baF12ZeNvp*HmF~TU;8MrF>JF89v7A@(~7O0i=89iw%Mr3 gs_UZkQ
z1eAlysuZLL$l_U?DF>xLI9XIP6~d=CRN+B_{!;bzMobaMacls 1<K;hx6Vs~Hek7k$
zudF}orl;V#(hfm9>AkgU&(7a-F6ur!*UlZUJJkiR{5?eEN+~@@N_RJ~#D9AK3;Q0Q
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..f2fcf18c 0bfd84e7de8dd2ad8fb87d403f4eb75b
GIT binary patch
literal 1930
zcmV;52X**~P)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12M0++K~z|U%~wr~97h%YUR8DP%+Alw?iw< (9Ae>+7_YL<65=>H
zm`IQaaRQ<ok_!R}q)1T`3m;ZUDB^@=8LgZHa3ma%z_AG@6Rj-AkllD=uW+0!Ax><?
zn3%Pl?9a^f%+7RIJr4ad-90_Kc8mojmAdEE>sQ}<?|ZLmh?(*KFjT*V{rmS16PaBs
z1l{T;WDGNlw<aeim;36ZBXaQI!NNdZ{p!vwTOR+yU0XNNEyDn qflL3qbp2nKFHg5y
z-ZT65?Q_yPJrR)>eQ(d6uRUEV7v);Jh5tt8h=83t$E(}Exb5lV$ B&-^@XNH0NDGFB
z%0H@9hGetlz!(GOTc5@lG+PeJLuFYWD*rGGY!8sp(M{Ek*Xip WGo#gNA)QiV3>>G~
zBaaW)>)>;vqt&dnp412-xL-bMwK~rJ?JR8DM!VC-`1m-6hbw5e+c<S<4z^{ZSS;Ya
z@%#FD0TMEEsc+R}jf)p9V)N$Bxcf`n@X<$?aN)xX`09fXpwVb RkibK`cY!`5yL(cz
z-e@+PC=ZnZ0Hsn1PSYp<@bEB7r4nXm-bAfdyZu0Nxg46!CIDcq)j}?p^Nk3B`zLl{
z%bi>BkN4jHOh9fbHCwmdg>&cL!RpE?mY0{YW9-WSfGbz7U~%y(Jl8|1RJ{E_Mn*^Q
z@FTn7G#uQ!{hlZy)oK;FTn<EpN~Lo9fdGI~3e`KRP|8loi-To&o{Lty2`RHH<EDT(
zO{cAtg?6W%`GGM8m7x)Mp4)4zP=vGC=nF(C3ynr&Eo-fZtk<tyo7SFzpllwqVOYxQ
zJK1FSAVC5~Gd}(Flj%&5X+g_r9Grb~_FE53eC6|%;SrT?Zq23 xsj@RFl|r#l#Nc2d
zxj=-~l~r$cX69<MQU68Ow>_sX08C9y<zboUl~CUWbD~2POU2R?-+uBQt-YSkC8gpc
zuO2?%s5j~<AnY0MC|q%9@7}$wOfQ)ErsnkYu}4>HE8f!5C!C( EwH0rA`q-m4Ym=Eb
zuA1YozxHF>ws(fVm2Fjp5TrA7g%G4{>nDGmJ@JE3*73agukU& 6&_?@gT)vv8M=B$e
z+wUFQ<hp*PXzgXH5+HW(dgL(xuq+Gjo&Wpw#g8xle8W8uaOA* &1EqXn;HQ?7PuaHJ
z11>)}II#Pnhli?nRK?m_X7wdTE|<f<uP&Oox!ILwvz2+L=yY7 y^SmS4UHRDyFTA*-
z03ctmUYxjp;`y;1V|^pEw7i6RqmII05w6>{?Q^|Lc-tO8tzHM%h{wP2&5@)Pj(r1s
z@ZtIA&dkrZ0Zb|YP|AK{Y{!^-_Sxr9C=6x-(OP5s#Dn<$Q%@qF8$g&Q|J3&j$g(W7
z*4FUy@BV-f7T)RS69B+*9K7_>lsJ3t?e74X6aZjbmJI-f!XS*{%*hPQT_PMlxd6?6
zmn5QSDrG?%;P<aD;LQ8iHms6-KJSB9RuS0X8o<mj#z1Qg&-0+&Hjcg9#-C1{hLj3I
zC=d~ZkPuShk0;LHwS_jc=lc3u2lw9WZW|Z(1!9azOszGv_MqJ k4xet|&u_d1+qNO4
zgl*e6_LtLm<#Zj|?f7~Di1=J@-0;OHyaEyd+5j)Vv5b>*^RVp!oH#X)-_9(<aLAb(
z9o>+q$a)%~5IuR7QUPiJU;_ijZ)WOPs-MKGZyOkqgOmi2fRYvzho-wcT5qh|(ER)h
z2q9pMLCea4>^ubdo_NGKx<FvX7?1=8z)Y|#8#$GW9O%cBxTr6 XIEWAkh#;hZ6a+y8
zBEN7MfMLKGhBgcm0+z5M5b@cMxS2qtlo5dNU26>r0TMw7Lj3P J83u$O6_DRk!i__+
z$B7@r1fhu-5Fe>hDghvTM!6O~2%iq*M}*<i-Y}Q|K@<TAClN&;h$w1^iHI;Wao~!S
zG65od_tOOk0wf`bh@T#2AfOEd14IH!sU9F92(2|-*9Eh`cTZ}F5N)0Y1NfeXX$g4(
z@*5uv1<_y#;YTD)N0^EbMEKqlk*+97&^Rb&27*38LHLCL2tEL SgFfP?P)eEDI3hq$
zNpU)4awH3cl+q8cjz<NM0Y?mn(Ex}zID2Fdh+ZJ6i1-Rf07;jxloDjR5ech@g8DVg
zkvvRseB-cs!bX|yZ<#GV-VH-QM1I%w6X=(&AOu_qzKPOI31`ywLK>`l=ylJO-e=?l
zb#+C!9+StN>2H$}=ZFtP5W2Ug{?F($?mnXRm^{*7$5t1y|44A 8(P$)2S)l8cF&bLe
z0Ou+U0dA_rGcz>%t=_GDjEk*gbp$;l0^&GL#D@X^H@JizIy9A VIZ5vB4^D^XhU8g?
z9>eo=Cjw%$`SmMD4?m-n)&CHTZIM3EIrVRF-4WB&+PGSKM}R(mIsX^qKSy6MDv+IC
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..1822cb8f 04d8dc26fb2f2a30fb170c0d53b8172a
GIT binary patch
literal 2049
zcmV+c2>$npP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12YyLJK~z|U&6xXd6xS8UKljd^@vgnQe&Vd Cc{G&paKTU-0=R{!
zZK4SEhbA<UN~=by)JXZI1eG69t14=LDMCajk^1-xsz@nmki#Q!EFc795GVv%C<I3V
zT8w%5wY%fpdEEZ6p7B0rAr3|DSzX=Pb6?+k&i9;qXN1<8{|8a E8g}g1(JX|&T1zP&
zbP?hET5EZ7`}XZ4HTzUrWY?};4Rvw#r#T%RPtTn<zfC+a4A2^ `T)lGZU)Qen=56=o
zZQHhGEBjPg#4yE+>(_7CoJ=K*$-K>f!*fDFSJ(3Nf=3r@?(6Ft0RC9nM^-8t8&fYe
zH8mPJJB#o8X#L>D_kD79mQ-WPNHwN@9tE}vNNa0by5JUS?oMlsZQE43)c1X|*<6*r
zR2;X!tk%|aR9ls6q?EdrKgP!=IP>utEXyKa$g_O;a+;f)$mjD 644l9+EfR?amMvda
zYZnM<L^joonke~f@H1x5p3T=5F5vUeuP}IdkZ(S|icBVh6p|; _tVVoEc2~LPUXsh@
zNHwMaNG6kHb4BtuH#d_^Ch0$RobmDThYutci;>Ia0GPCGVzF3 p5-C}+vWt#69sKjc
z#V-Y9My{DZe;#Mgo?~oujFFKMmUb=y;QICJ+_*7}>$oJ7iH8rQrL~ 2%>(-FXWLdQM
zvCtyvbedQ!h7f|LrlyAv1VAZ8`jIqBS!Mb}eG1ogu=6<#BRVo >1SFfw=9MzZ7xIw<
zeBY<3u?5$4swZnmkiC(q2}CKAOeQlK)mBB;TQ_g^dajQY(LC0 ^##Cm_qW$O`B!$HH
zG<WXY?u`Ulsj#z|UH!-VH?CUwjrOMI7FC(ta=9#qiuS0X6p4le_4N(q4MH$BI_CBt
zJ2srlOuQB~w(9f+*u8sq9Mj*Tq<Rjm%Q93VnMiK>!Sj!Ko?Df <3`6NX@4R&>Gm)97
z0HR&reH%x<zIE$XJ8~CV>lu~a-UCmLjgPu_@7~sxWo&%Z?d?7A<V@$(THilv`VPPM
zOUtslg8#}g(^5*|Mf8<Y3T2tUI@*8eXMwKZx~IRp{;AjRx6b{ ;*VDZ%O)c9OFY0V_
zoMNPSo*UU!fLybB-BSRjX>#Gx`CB*seeL)6U4to(?A*CC8E>fjjj4<uS(a4=E?!?>
zx8{kpjp;|ya&j^<`pP60i!n5O!#{DNe>9h~BkvT2g5$WZyT@} zfBVWSuZ}8!c!T-s
z$`vcObS~|zX`#C#cbUjc&`_Viai-@ka($ZcmQ~02!~|$xKK;FCTFPh9C1c>z%a?v}
z>h$S6uw4NtWo_zQ+NoaJ@@r(OBNB*qa&&)v7C+wn6XLNLft!k _eldVd)5M;%dGpP`
z@b_~UYV8StY&OdqZ|s(5&VKT22*ff?3qYniaOZv}dSqsZk5Bi IOeT4L(+enNmT|=}
z6rShv&fdRq?(F${f&hre<3;dFC4>;hjIIFy{T~gm|KL6h!$3-f5CSO;q#@aV;9Um#
zPk!OKv<9uU1R7=x#HzCx8XBVSP%oBcVi*RNW${7Z`}BQqc&5{ #H3Epu==4pclKk+6
zO^l9=u&?JJ@pwJ!zqNrQA0B4^yYJoe;#>np_*4WEanF=fI!*B |-O-|W@!6lUqH7iV
z5BA{uK0SN)F*Y{BkweD-FbpFE6J*T$i4bUDGSVW36a+7tz7{NLciG(C$-IuQ;5Y?@
z5SXTk=Xo6JI|>vdrW8c+ok*8GSJ^{@5W)vC)vpsmAWMLB&vn? ;y^y9<65GyEU*CXX
z7|d#KLkNMLv&rWRA%IFCzVDZnYCr<5wIA_b1BL*@5InQcVdJ` GD8ryIby0Gh0^RGr
z&FaV3;JPk7J$t!yaj*<XDTtu<JTC;}dBI7g2}n@_M1v5aMY`u qvT<D(rcz~@G)QDp
z2oi||hM}-5EAm7wwS*8N1R;b7=LrokwG*LrF+WOK1afL9&Y@H1(G-(aAWA9fVsVr*
zaS9HGVPKjjrfFhXR`{%xsw#$Igmu6XJ$2tHbBz!n1sFmAf&&* V#_cnFzq^x|Wl<>P
zv8+0d9y`LPmo5Wf+xar0mU1C*N8kz}MA>txs3KiTOeBg#m9nV +=xU4+`yV{Fc0TQG
zt)Uku#<K_^!U(E#N#KHMJ`nO~ny{65q(mu1(LIKo&Lf`;*Kud x88&bDDvK8_2^SB5
zlrB)piAoUFKq@Q}_)AOyDY{4?1o#@H&<x&m>FL==&Mtm>P)Z@ CECW&<6;xSDN{QCG
zDu<SbuMh;kqH6?FOj|0O$ue;KB<<~OA?Zqic%Fync~uJs7Am! 1F@Mwo5&{Z9gny^N
z2wcbI=J4&Q(^rNO5D>F;!C=woT2svtDaw>obPMZ<JP}A~N-r(JxTv~xmt`FBMz2yB
z?8Os;d_YzWp0CmQEZ3c3?%cT@jxN2O!Ssiw>IHR>GeUhfn=9M 60&u2M=O14CU6~Ea
z$vypNT3=zsd+MVOJ&o&ng%F7E`G5ZF+i$(Blv(qBGQIEeyfZc 77yn*W($n*N$Mf7h
fP~(;Je<A+?<)d#*r+!BB00000NkvXXu0mjfMnT)5

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>
--
1.6.5.1

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 
Old 12-02-2009, 09:17 AM
Hans de Goede
 
Default Add the updated and simplified parttype screen.

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(defbo ot)
- 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(Tru e)
- self.xml.get_widget("reviewButton").set_sensitive( False)
- self.xml.get_widget("driveScroll").set_sensitive(F alse)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(False)
- self.xml.get_widget("encryptButton").set_sensitive (False)
- else:
- if self.prevrev == None:
- self.xml.get_widget("reviewButton").set_active(sel f.review)
- else:
- self.xml.get_widget("reviewButton").set_active(sel f.prevrev)
- self.prevrev = None
-
- self.xml.get_widget("reviewButton").set_sensitive( True)
- self.xml.get_widget("driveScroll").set_sensitive(T rue)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(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]ort
- if idx != -1:
- ip = target[1:idx]
- port = target[idx+2:]
- # Check for IPV4 aaa.bbb.ccc.dddort
- 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.drivel ist)
-
- 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(sel f.review)
-
- self.xml.get_widget("encryptButton").set_active(se lf.storage.encryptedAutoPart)
+ self.reviewButton.set_active(not self.dispatch.stepInSkipList("partition"))
+ self.encryptButton.set_active(self.storage.encrypt edAutoPart)
+
+ 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.

"
+ "<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).

"
+ "<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.typeChange d)
+
+ 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(Tru e)
- self.xml.get_widget("reviewButton").set_sensitive( False)
-
- self.xml.get_widget("driveScroll").set_sensitive(F alse)
- self.xml.get_widget("bootDriveCombo").set_sensitiv e(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(Fal se)
+ 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..7c541ce4 13628f6051df13f64fa4f7c49094edc3
GIT binary patch
literal 1739
zcmV;+1~mDJP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H121rRnK~z|U&6wM76jdC@zvs-E>E63-Q8uIq5e1~uQc);8Ac;zd
z4+cSu@M2=32?^m6d1y=w@kv5zn)0Cj1%?D#Y6uszR476LBU*} zA`lS8a%;Ek&TMz*
za(vj%?p)4nElBj2oXpIbGw1g?zuP&xgmaGngRr0%yLRoWA;en 3DJ2i9gjg2moPOKd
z+BzIK#%qzbwzg<hn0+?0zJApcvt~~t4~+qE4&3<t#@#<|-c09n#-<%RcBtMlK8r{)
zd3(i*7dOTeF=;%X!@uD<LV%{G#?+iA=WOih={XDFQ|}n+?WnF !yq8Q?OIl8aWm(|-
z;hSYy&~hpg)d?w4op@IS>jSB)o0cjVg}~Ku&XLRI;B~2GSx{B Y*Y6bFDB!WWx|Hah
z&oz`%9^{YF(J}P@&<{mXkT2xX*w~1gnk4f1JkFjy2Srv8i$$@ pabeIZK&T{q6__<5
zxpws$X3Us@r=FgJ>(_7K>XoZ_{)NTJX0xD#Vrk0~kOz!zpKB_ KrfEo2CjbEPcpR!$
z4E~y$8pPvq^qoF~(b3UI4-yK6plKQaU_6&YC=@DALMawCH=%xJJ$||L>jQyI$u+ZQ
z&%(gKMT}%dFg!er1r5&t0B+s7g~7qwFmwa)c<j-G)YjEv+42^sSrzl<&n;Obl}aHL
z3V{%UWHR~aK>&a;hSc;F7*kyRu}A`jp(B^qAW7oPm=cJpsd>g ^<O_M>2bN_aSzQam
z(EXD|V^9aPfgp^@$Y!(SqIbSvy?f_Q+B7UsB93EjamY*#Y}^v pAWA4KljHvVdubu0
zw<D)!+xpJ*y}G#hxyO?=wai=GG);xX#2%FxLo6CYBocMMAOs_ s5u@+)>DyX%>=V(q
zzTFo9+S}X1kgctZvbEscRiR?>SbW`@^>a<r@Kr8JV!X3^-{tIBcFY694a?|)PCK@5
z-<}h$f^$BlmQEj8IWn3thKBBOZyOoS80qwpl~bLQb3S?2^qlzWe MM24>}RIPDM~3Z
z1!F0tgemd|-}D`S$L=c_#`%|4ywWk5p2^eK<muXEZR`Ab4bybJm?@@d2!|4Yw k%ox
z3INEmj7yh)zB~Bm&5tM5fr%K|y?b{&9Ig6LX3_>lQG9UWNTjM |>9Xq7^b{Q*7iOPJ
zLZJ};x;<!}JJ*-dw4CrvQ7GuTVHlmJp806oww)OU0O6>-vw2bT)`kTQffgDX9>Q35
z4ADpox?Y~U80+PLSClG@j*S7_qN`qBUF)8OJH7#ayK;HUcjwR N0kkpzU`$!pu%Ll$
z-n<3TXe4l@3!9$BhPO5%916j9Q*qZXCXg)4$c^W)ckdVY@#3Yxc >q9FRqWZ*PWuNg
zyj}uPWLW`#Xfy&VpdbN2|MvrkMxt2%#+zVFcEyS$F_@->?(PE^xbV}Y=aO(ZT!d$G
z445QXMQL{8_(_B#A*^|AEjR}_H$eymr4(Nt?8eF7Qy_#0n}7c DeIQ8j;9Lf9J|8-G
z6p=^_t5>atVHEd}!$%L}$f2X)93{n+QWprN!N;E|9gLiio%_3 R@>DMrr3$?#PoQi6
zfr@SwOL=_JA_B8fN?jHanf5?uH%3M>IF>#R##m|Bb&jp%8mCl @5!;-$iETjV`>&7n
zLZT8Pkw^*H8&|elefIb#G2(=9!Z@M4tF)Clm0OnOYC*qygdmb 6m6Y4}P6*p7K_E^D
z`)ZnI3C1+-or=Sr!2wd7gfZp<a6);r!0CHYsyi(~2q{4jLP`bEWf9IfDK3UU k|Y;|
z7bM6kB5Qa-YzWgdq3ilY9V(u8T&^JmCFLR*Ns?T#69i(z*zT}hVMB=A%8GU< p}1D=
zgz~zol53nUD8~a_<DB6jjFBJ+FOU<)sle+Bued=x7AX#Z3&fk gm0)ZI{;cp@$}W`N
z`X)?YZ&rB0oIp+x(==h4rcbeLA$Nr(l?$4;SUImEK)bBlfhkI D@s-0LBb1<gdJ4XZ
z>Vz%c-P#!oLDvbxxGlmtkj-Wt)WuQ$=knLid!YPBlV2gXYeuPGRW+9<7y#%KhtQ6W
z_R@zoTv^Hw<$ibcSMC>WdK`vf7D^zNX??!GYu_fu<ls%vp~Ab NbI-5AisBe)nwD;w
hMkf&Plk>ljzX2EIBFC(wZ;}82002ovPDHLkV1h6eH#q<R

literal 0
HcmV?d00001

diff --git a/pixmaps/partscheme-custom.png b/pixmaps/partscheme-custom.png
new file mode 100644
index 0000000000000000000000000000000000000000..62e2e6bd d35ba2b091d802f6b3daef1e1b57ccf5
GIT binary patch
literal 953
zcmV;q14jIbP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H112#!SK~z|U?U=t$+%Oc!zmDxxAy?oZ;3gR 01nT_(`~z&IQx_!0
zN{BLcsZduIek~oDY3X)53tN${6;oRlbV48yzr<C#%h~Rb+Hst OQm6_;o@8C}WaoYK
zeeXHW5v3F!gLw}PpsfUPtpstc1aYkdajgV#tpstc1aYkdajgV #jRC;Y($do)eDanv
z`qKA(_Adhzort^LDC+fkTOzu6x3I8y!2lo#`C|Q9{dH}ub_WQ B{PTC7KXz#U_aEQp
zKkx2#0K8!Uz?lD{HdbSEbMpwpzS|?*;{%}GZewk2*=v6N^4x& <ocjO}hJBFo|9oBq
zK>z^Yj8}jME>>I7N7FU;1_^=yzVF|0bs|aJC4}5+86gCO5QJf f>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|xikxI EBlu{F1
zU)vC#=Rqk2&N(Qhn3|eGrBcDw)fM*l_rVxTDIukV5W>I+A+#n SS&*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!(7WT U%$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..9c999168 f6174ba44eac5b735791d8895cb64db9
GIT binary patch
literal 1832
zcmV+@2iN$CP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12Bk?vK~z|U&6rzk9Mu`e|KFK&W@f#<#HLU ;cAPkYlExLpTvU>9
z5flY@s;WL!6%?rwqAC<nNfZeXa@D5@3PON*rf<2mg$RR_kV+7 UYI_5T)LiVu;KZSj
z7&dlxygM^z4iB?4JGWhDtyJnK9qsNpbI$pl|96?$A*B@lAB@) <7#bSlxtzGmBW7Hc
zog^l=ZQC|kZ<w+adHwZQpIz3~^~Bn>Kkn8vUKh3*yEuDs?)1d uu?6e$@1A)k4U__T
z>7~E)58itF`1Lp3&}l7{;CWZab-K`@a~;F)4<C5^u|M3O9B0W6v!(6HzLl#w=P%De
zN(rUBtI{fV8IH8k+p}U|XlST)agbc@e#6iko~~Rj!*yk>Pbme <vLL0bGYhEL74-Bj
z?=)NaEy=Nz{}}_JjyGJ_MPa-E*Ojns8~v;Mv2tY}0APHqfJ&tT0NA)`1Bj>&4v|tS
zB|uYwc>erX01-BB+JL#ad5r#h6urGYAR-itMci@6&ya7;H-M;bDY8apSr*#c+W`P=
zZLRP;59Nh27-Lv-{c4Pkj$vlzeA5t3gP4W^t7HN2<AjJ{n0}e*@9)R0x7~sh$4|g<
zoTfpVa?SFd<v4rx914Xauq+FGeJj8@$AYzhqsNZHFbtTc3BH8 V)6@)I*ZugoGzTFB
zTHE|A%(dk3leKH%xDGlxI+he8O`~g?hR$W3$miP-Eru;-D~N#NrSF=C05W2vT&|q=
zJg?y-!!Xg>l80#+vDVqq)v%6e8pqt+oTVwuEDBPxO0RtT?RN`Yt1lK2 gAf9OCz=oq
zKnN{n9#d0O|J}0X`HAFcYPVIrYxa$ejZF>?u3yvL-QAMqZ`YB~G=b#(Qqwqe-N3T;
z&eWVrrJ_DNQn+~OQt_{un01~<=;c?p|3cUGKS9Av4nFw6L+iV L_#^JR@ifilTCo4%
z$n4aasi}-Lk1mw#7q)KQnptS-fi$!)zC1H~P1g^)vOq=)hyQlh#(N)WcFjezX5WXy
zn+?PK4G}^g^{-qlvacp6g*!j`<lx&uk96g%UG|>eym@n}(LReRGBPrfZ|lsD-?skt
z8$Hj1QVL2bl*<dLYl9d86f}+F!o{zxiPI;y+;iv8-)y)^0J44i_O@K!ctLRO*SfB!
zRMIrg)(s3?bJI_6)-0>x!2kf9b2zSxj}QH;bm7A6eAYF#?KrOM?v_q*=;^0lEOG$I
z<;9DG>j$42ST|7DRh3EwUrtY<Z^f#Z8Z|*x6<Pyh8qUp}!KMv &=K<tvtEkwViOExc
z92+060NBR;6X?GhSU12Qd+Ir`_TFrg`5CO~>A=H}JdFNTt3#M tb`uz5;6lfH!+SCE
z{(dxad#O~yYp=b+K0EsPFGCPr2ps@edoSF+`!XkL(;woSZ@$3 J9Xs*cM<2y?*IozP
zu7u-61j8_K;NU*&```c;tIoMx4gesyXa$;l3;=-X>2uh%YX|1%=OKg+A_5VEY3A_h
z;X~N_&TzvrAGN4pO@jcy@&BB{p1<#g<2c})!!%7C`MiKVyZ-^(wwJQx(m()UY_x!P
z_x=+^8ct1|#LgYNU|H#uZfrG4{4B}1pRj757tzmm1BKrYeS8> P2%I>65|`&o&@?R!
z(4gL2sb!|C#t5v+Mv5Rk1tJ3H9E`Cz%txOB0E7@Rh-mQ(zNhqvbY=XVAZUz2kx119
z6hfpx;tQuiJkN`@dMc$ssM@NMc%A|ye^Vg@i2Qod2qX#-d`c-pm|9k;@CFtEQ2_aB
z1gZq4DL_R)k}ZHpwx|+B6haVD>Peqh7a^qpf*+)Qj8s7w;3)u vSd1i9$x<T;5<o~P
z;W!SI^7l@;hRAOLjK4C#NWn|ErV&U06SyOAMF5fIRu2ELp)n# b22}Tf0>C_iB7&xA
z)tee?=$fbtl2taI*2y{&=}ao36hNdvRo4U{QJClkNmnGTUVY) U3w&jw?(xBV2m(Sy
zk}$yr>8waA#TbK9Dpf<{=}QCxRpX!v;`x2SZJsd}1B!x3DXTA c;u{AFMHQ?*R@MOt
zFF~!c))-T18$baF12ZeNvp*HmF~TU;8MrF>JF89v7A@(~7O0i=89iw%Mr3 gs_UZkQ
z1eAlysuZLL$l_U?DF>xLI9XIP6~d=CRN+B_{!;bzMobaMacls 1<K;hx6Vs~Hek7k$
zudF}orl;V#(hfm9>AkgU&(7a-F6ur!*UlZUJJkiR{5?eEN+~@@N_RJ~#D9AK3;Q0Q
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..f2fcf18c 0bfd84e7de8dd2ad8fb87d403f4eb75b
GIT binary patch
literal 1930
zcmV;52X**~P)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12M0++K~z|U%~wr~97h%YUR8DP%+Alw?iw< (9Ae>+7_YL<65=>H
zm`IQaaRQ<ok_!R}q)1T`3m;ZUDB^@=8LgZHa3ma%z_AG@6Rj-AkllD=uW+0!Ax><?
zn3%Pl?9a^f%+7RIJr4ad-90_Kc8mojmAdEE>sQ}<?|ZLmh?(*KFjT*V{rmS16PaBs
z1l{T;WDGNlw<aeim;36ZBXaQI!NNdZ{p!vwTOR+yU0XNNEyDn qflL3qbp2nKFHg5y
z-ZT65?Q_yPJrR)>eQ(d6uRUEV7v);Jh5tt8h=83t$E(}Exb5lV$ B&-^@XNH0NDGFB
z%0H@9hGetlz!(GOTc5@lG+PeJLuFYWD*rGGY!8sp(M{Ek*Xip WGo#gNA)QiV3>>G~
zBaaW)>)>;vqt&dnp412-xL-bMwK~rJ?JR8DM!VC-`1m-6hbw5e+c<S<4z^{ZSS;Ya
z@%#FD0TMEEsc+R}jf)p9V)N$Bxcf`n@X<$?aN)xX`09fXpwVb RkibK`cY!`5yL(cz
z-e@+PC=ZnZ0Hsn1PSYp<@bEB7r4nXm-bAfdyZu0Nxg46!CIDcq)j}?p^Nk3B`zLl{
z%bi>BkN4jHOh9fbHCwmdg>&cL!RpE?mY0{YW9-WSfGbz7U~%y(Jl8|1RJ{E_Mn*^Q
z@FTn7G#uQ!{hlZy)oK;FTn<EpN~Lo9fdGI~3e`KRP|8loi-To&o{Lty2`RHH<EDT(
zO{cAtg?6W%`GGM8m7x)Mp4)4zP=vGC=nF(C3ynr&Eo-fZtk<tyo7SFzpllwqVOYxQ
zJK1FSAVC5~Gd}(Flj%&5X+g_r9Grb~_FE53eC6|%;SrT?Zq23 xsj@RFl|r#l#Nc2d
zxj=-~l~r$cX69<MQU68Ow>_sX08C9y<zboUl~CUWbD~2POU2R?-+uBQt-YSkC8gpc
zuO2?%s5j~<AnY0MC|q%9@7}$wOfQ)ErsnkYu}4>HE8f!5C!C( EwH0rA`q-m4Ym=Eb
zuA1YozxHF>ws(fVm2Fjp5TrA7g%G4{>nDGmJ@JE3*73agukU& 6&_?@gT)vv8M=B$e
z+wUFQ<hp*PXzgXH5+HW(dgL(xuq+Gjo&Wpw#g8xle8W8uaOA* &1EqXn;HQ?7PuaHJ
z11>)}II#Pnhli?nRK?m_X7wdTE|<f<uP&Oox!ILwvz2+L=yY7 y^SmS4UHRDyFTA*-
z03ctmUYxjp;`y;1V|^pEw7i6RqmII05w6>{?Q^|Lc-tO8tzHM%h{wP2&5@)Pj(r1s
z@ZtIA&dkrZ0Zb|YP|AK{Y{!^-_Sxr9C=6x-(OP5s#Dn<$Q%@qF8$g&Q|J3&j$g(W7
z*4FUy@BV-f7T)RS69B+*9K7_>lsJ3t?e74X6aZjbmJI-f!XS*{%*hPQT_PMlxd6?6
zmn5QSDrG?%;P<aD;LQ8iHms6-KJSB9RuS0X8o<mj#z1Qg&-0+&Hjcg9#-C1{hLj3I
zC=d~ZkPuShk0;LHwS_jc=lc3u2lw9WZW|Z(1!9azOszGv_MqJ k4xet|&u_d1+qNO4
zgl*e6_LtLm<#Zj|?f7~Di1=J@-0;OHyaEyd+5j)Vv5b>*^RVp!oH#X)-_9(<aLAb(
z9o>+q$a)%~5IuR7QUPiJU;_ijZ)WOPs-MKGZyOkqgOmi2fRYvzho-wcT5qh|(ER)h
z2q9pMLCea4>^ubdo_NGKx<FvX7?1=8z)Y|#8#$GW9O%cBxTr6 XIEWAkh#;hZ6a+y8
zBEN7MfMLKGhBgcm0+z5M5b@cMxS2qtlo5dNU26>r0TMw7Lj3P J83u$O6_DRk!i__+
z$B7@r1fhu-5Fe>hDghvTM!6O~2%iq*M}*<i-Y}Q|K@<TAClN&;h$w1^iHI;Wao~!S
zG65od_tOOk0wf`bh@T#2AfOEd14IH!sU9F92(2|-*9Eh`cTZ}F5N)0Y1NfeXX$g4(
z@*5uv1<_y#;YTD)N0^EbMEKqlk*+97&^Rb&27*38LHLCL2tEL SgFfP?P)eEDI3hq$
zNpU)4awH3cl+q8cjz<NM0Y?mn(Ex}zID2Fdh+ZJ6i1-Rf07;jxloDjR5ech@g8DVg
zkvvRseB-cs!bX|yZ<#GV-VH-QM1I%w6X=(&AOu_qzKPOI31`ywLK>`l=ylJO-e=?l
zb#+C!9+StN>2H$}=ZFtP5W2Ug{?F($?mnXRm^{*7$5t1y|44A 8(P$)2S)l8cF&bLe
z0Ou+U0dA_rGcz>%t=_GDjEk*gbp$;l0^&GL#D@X^H@JizIy9A VIZ5vB4^D^XhU8g?
z9>eo=Cjw%$`SmMD4?m-n)&CHTZIM3EIrVRF-4WB&+PGSKM}R(mIsX^qKSy6MDv+IC
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..1822cb8f 04d8dc26fb2f2a30fb170c0d53b8172a
GIT binary patch
literal 2049
zcmV+c2>$npP)<h;3K|Lk000e1NJLTq001HY001lq1^@s608MJ L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!E LWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H12YyLJK~z|U&6xXd6xS8UKljd^@vgnQe&Vd Cc{G&paKTU-0=R{!
zZK4SEhbA<UN~=by)JXZI1eG69t14=LDMCajk^1-xsz@nmki#Q!EFc795GVv%C<I3V
zT8w%5wY%fpdEEZ6p7B0rAr3|DSzX=Pb6?+k&i9;qXN1<8{|8a E8g}g1(JX|&T1zP&
zbP?hET5EZ7`}XZ4HTzUrWY?};4Rvw#r#T%RPtTn<zfC+a4A2^ `T)lGZU)Qen=56=o
zZQHhGEBjPg#4yE+>(_7CoJ=K*$-K>f!*fDFSJ(3Nf=3r@?(6Ft0RC9nM^-8t8&fYe
zH8mPJJB#o8X#L>D_kD79mQ-WPNHwN@9tE}vNNa0by5JUS?oMlsZQE43)c1X|*<6*r
zR2;X!tk%|aR9ls6q?EdrKgP!=IP>utEXyKa$g_O;a+;f)$mjD 644l9+EfR?amMvda
zYZnM<L^joonke~f@H1x5p3T=5F5vUeuP}IdkZ(S|icBVh6p|; _tVVoEc2~LPUXsh@
zNHwMaNG6kHb4BtuH#d_^Ch0$RobmDThYutci;>Ia0GPCGVzF3 p5-C}+vWt#69sKjc
z#V-Y9My{DZe;#Mgo?~oujFFKMmUb=y;QICJ+_*7}>$oJ7iH8rQrL~ 2%>(-FXWLdQM
zvCtyvbedQ!h7f|LrlyAv1VAZ8`jIqBS!Mb}eG1ogu=6<#BRVo >1SFfw=9MzZ7xIw<
zeBY<3u?5$4swZnmkiC(q2}CKAOeQlK)mBB;TQ_g^dajQY(LC0 ^##Cm_qW$O`B!$HH
zG<WXY?u`Ulsj#z|UH!-VH?CUwjrOMI7FC(ta=9#qiuS0X6p4le_4N(q4MH$BI_CBt
zJ2srlOuQB~w(9f+*u8sq9Mj*Tq<Rjm%Q93VnMiK>!Sj!Ko?Df <3`6NX@4R&>Gm)97
z0HR&reH%x<zIE$XJ8~CV>lu~a-UCmLjgPu_@7~sxWo&%Z?d?7A<V@$(THilv`VPPM
zOUtslg8#}g(^5*|Mf8<Y3T2tUI@*8eXMwKZx~IRp{;AjRx6b{ ;*VDZ%O)c9OFY0V_
zoMNPSo*UU!fLybB-BSRjX>#Gx`CB*seeL)6U4to(?A*CC8E>fjjj4<uS(a4=E?!?>
zx8{kpjp;|ya&j^<`pP60i!n5O!#{DNe>9h~BkvT2g5$WZyT@} zfBVWSuZ}8!c!T-s
z$`vcObS~|zX`#C#cbUjc&`_Viai-@ka($ZcmQ~02!~|$xKK;FCTFPh9C1c>z%a?v}
z>h$S6uw4NtWo_zQ+NoaJ@@r(OBNB*qa&&)v7C+wn6XLNLft!k _eldVd)5M;%dGpP`
z@b_~UYV8StY&OdqZ|s(5&VKT22*ff?3qYniaOZv}dSqsZk5Bi IOeT4L(+enNmT|=}
z6rShv&fdRq?(F${f&hre<3;dFC4>;hjIIFy{T~gm|KL6h!$3-f5CSO;q#@aV;9Um#
zPk!OKv<9uU1R7=x#HzCx8XBVSP%oBcVi*RNW${7Z`}BQqc&5{ #H3Epu==4pclKk+6
zO^l9=u&?JJ@pwJ!zqNrQA0B4^yYJoe;#>np_*4WEanF=fI!*B |-O-|W@!6lUqH7iV
z5BA{uK0SN)F*Y{BkweD-FbpFE6J*T$i4bUDGSVW36a+7tz7{NLciG(C$-IuQ;5Y?@
z5SXTk=Xo6JI|>vdrW8c+ok*8GSJ^{@5W)vC)vpsmAWMLB&vn? ;y^y9<65GyEU*CXX
z7|d#KLkNMLv&rWRA%IFCzVDZnYCr<5wIA_b1BL*@5InQcVdJ` GD8ryIby0Gh0^RGr
z&FaV3;JPk7J$t!yaj*<XDTtu<JTC;}dBI7g2}n@_M1v5aMY`u qvT<D(rcz~@G)QDp
z2oi||hM}-5EAm7wwS*8N1R;b7=LrokwG*LrF+WOK1afL9&Y@H1(G-(aAWA9fVsVr*
zaS9HGVPKjjrfFhXR`{%xsw#$Igmu6XJ$2tHbBz!n1sFmAf&&* V#_cnFzq^x|Wl<>P
zv8+0d9y`LPmo5Wf+xar0mU1C*N8kz}MA>txs3KiTOeBg#m9nV +=xU4+`yV{Fc0TQG
zt)Uku#<K_^!U(E#N#KHMJ`nO~ny{65q(mu1(LIKo&Lf`;*Kud x88&bDDvK8_2^SB5
zlrB)piAoUFKq@Q}_)AOyDY{4?1o#@H&<x&m>FL==&Mtm>P)Z@ CECW&<6;xSDN{QCG
zDu<SbuMh;kqH6?FOj|0O$ue;KB<<~OA?Zqic%Fync~uJs7Am! 1F@Mwo5&{Z9gny^N
z2wcbI=J4&Q(^rNO5D>F;!C=woT2svtDaw>obPMZ<JP}A~N-r(JxTv~xmt`FBMz2yB
z?8Os;d_YzWp0CmQEZ3c3?%cT@jxN2O!Ssiw>IHR>GeUhfn=9M 60&u2M=O14CU6~Ea
z$vypNT3=zsd+MVOJ&o&ng%F7E`G5ZF+i$(Blv(qBGQIEeyfZc 77yn*W($n*N$Mf7h
fP~(;Je<A+?<)d#*r+!BB00000NkvXXu0mjfMnT)5

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@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 06:46 AM.

VBulletin, Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright ©2007 - 2008, www.linux-archive.org