aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'iw/autopart_type.py')
-rw-r--r--iw/autopart_type.py284
1 files changed, 284 insertions, 0 deletions
diff --git a/iw/autopart_type.py b/iw/autopart_type.py
new file mode 100644
index 0000000..2ba1075
--- /dev/null
+++ b/iw/autopart_type.py
@@ -0,0 +1,284 @@
+#
+# autopart_type.py: Allows the user to choose how they want to partition
+#
+# Copyright (C) 2005, 2006 Red Hat, Inc. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author(s): Jeremy Katz <katzj@redhat.com>
+#
+
+import gtk
+import gobject
+import math
+
+from constants import *
+import gui
+from partition_ui_helpers_gui import *
+from pixmapRadioButtonGroup_gui import pixmapRadioButtonGroup
+
+from iw_gui import *
+from flags import flags
+from storage.deviceaction import *
+
+import gettext
+_ = lambda x: gettext.ldgettext("anaconda", x)
+
+def whichToShrink(storage, intf):
+ def getActive(combo):
+ act = combo.get_active_iter()
+ return combo.get_model().get_value(act, 1)
+
+ def comboCB(combo, shrinkSB):
+ # partition to resize changed, let's update our spinbutton
+ newSize = shrinkSB.get_value_as_int()
+
+ part = getActive(combo)
+ reqlower = long(math.ceil(part.format.minSize))
+ requpper = long(math.floor(part.format.currentSize))
+
+ adj = shrinkSB.get_adjustment()
+ adj.lower = reqlower
+ adj.upper = requpper
+ adj.set_value(reqlower)
+
+
+ (dxml, dialog) = gui.getGladeWidget("autopart.glade", "shrinkDialog")
+
+ store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
+ combo = dxml.get_widget("shrinkPartCombo")
+ combo.set_model(store)
+ crt = gtk.CellRendererText()
+ combo.pack_start(crt, True)
+ combo.set_attributes(crt, text = 0)
+ combo.connect("changed", comboCB, dxml.get_widget("shrinkSB"))
+
+ biggest = -1
+ for part in storage.partitions:
+ if not part.exists:
+ continue
+
+ entry = None
+ if part.resizable and part.format.resizable:
+ entry = ("%s (%s, %d MB)" % (part.name,
+ part.format.name,
+ math.floor(part.format.size)),
+ part)
+
+ if entry:
+ i = store.append(None)
+ store[i] = entry
+ combo.set_active_iter(i)
+
+ if biggest == -1:
+ biggest = i
+ else:
+ current = store.get_value(biggest, 1)
+ if part.format.targetSize > current.format.targetSize:
+ biggest = i
+
+ if biggest > -1:
+ combo.set_active_iter(biggest)
+
+ if len(store) == 0:
+ dialog.destroy()
+ intf.messageWindow(_("Error"),
+ _("No partitions are available to resize. Only "
+ "physical partitions with specific filesystems "
+ "can be resized."),
+ type="warning", custom_icon="error")
+ return (gtk.RESPONSE_CANCEL, [])
+
+ gui.addFrame(dialog)
+ dialog.show_all()
+ runResize = True
+
+ while runResize:
+ rc = dialog.run()
+ if rc != gtk.RESPONSE_OK:
+ dialog.destroy()
+ return (rc, [])
+
+ request = getActive(combo)
+ newSize = dxml.get_widget("shrinkSB").get_value_as_int()
+ actions = []
+
+ try:
+ actions.append(ActionResizeFormat(request, newSize))
+ except ValueError as e:
+ intf.messageWindow(_("Resize FileSystem Error"),
+ _("%(device)s: %(msg)s")
+ % {'device': request.format.device,
+ 'msg': e.message},
+ type="warning", custom_icon="error")
+ continue
+
+ try:
+ actions.append(ActionResizeDevice(request, newSize))
+ except ValueError as e:
+ intf.messageWindow(_("Resize Device Error"),
+ _("%(name)s: %(msg)s")
+ % {'name': request.name, 'msg': e.message},
+ type="warning", custom_icon="error")
+ continue
+
+ runResize = False
+
+ dialog.destroy()
+ return (rc, actions)
+
+class PartitionTypeWindow(InstallWindow):
+ def __init__(self, ics):
+ InstallWindow.__init__(self, ics)
+ ics.setTitle("Automatic Partitioning")
+ ics.setNextEnabled(True)
+
+ def getNext(self):
+ if self.storage.checkNoDisks():
+ raise gui.StayOnScreen
+
+ 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 self.buttonGroup.getCurrent() == "shrink":
+ (rc, actions) = whichToShrink(self.storage, self.intf)
+ if rc == gtk.RESPONSE_OK:
+ for action in actions:
+ self.storage.devicetree.registerAction(action)
+ else:
+ raise gui.StayOnScreen
+
+ # we're not going to delete any partitions in the resize case
+ 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.encryptButton.get_active():
+ self.storage.encryptedAutoPart = True
+ else:
+ self.storage.encryptionPassphrase = ""
+ self.storage.retrofitPassphrase = False
+ self.storage.encryptedAutoPart = False
+
+ self.storage.doAutoPart = True
+
+ if self.reviewButton.get_active():
+ self.dispatch.skipStep("partition", skip = 0)
+ self.dispatch.skipStep("bootloader", skip = 0)
+ else:
+ self.dispatch.skipStep("partition")
+ self.dispatch.skipStep("bootloader")
+ self.dispatch.skipStep("bootloaderadvanced")
+
+ return None
+
+ def typeChanged(self, *args):
+ if self.buttonGroup.getCurrent() == "custom":
+ if not self.prevrev:
+ self.prevrev = self.reviewButton.get_active()
+
+ self.reviewButton.set_active(True)
+ self.reviewButton.set_sensitive(False)
+ self.encryptButton.set_sensitive(False)
+ else:
+ 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
+ self.storage = anaconda.storage
+ self.intf = anaconda.intf
+ self.dispatch = anaconda.dispatch
+
+ (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.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 all Linux partitions on the "
+ "selected device(s). 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)
+
+ # 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.reviewButton.get_active()
+
+ self.reviewButton.set_active(True)
+ self.reviewButton.set_sensitive(False)
+ self.encryptButton.set_sensitive(False)
+
+ return vbox