summaryrefslogtreecommitdiffstats
path: root/iw/cleardisks_gui.py
diff options
context:
space:
mode:
authorChris Lumens <clumens@redhat.com>2009-10-05 15:12:36 -0400
committerChris Lumens <clumens@redhat.com>2009-12-11 17:15:35 -0500
commit2984bbb90f3be6568cdeb9af1834b56ba245c92f (patch)
tree051d2d40714a466b84ccddfcb1e92598901f6104 /iw/cleardisks_gui.py
parent92cb83bec3dcd1b2590538b10af58332ab017522 (diff)
downloadanaconda-2984bbb90f3be6568cdeb9af1834b56ba245c92f.tar.gz
anaconda-2984bbb90f3be6568cdeb9af1834b56ba245c92f.tar.xz
anaconda-2984bbb90f3be6568cdeb9af1834b56ba245c92f.zip
Add a step to prompt for the cleardisks UI.
This UI is the screen that allows the user to select which devices will be wiped during installation and which should just be mounted. It also allows selecting which device the bootloader should be installed to.
Diffstat (limited to 'iw/cleardisks_gui.py')
-rw-r--r--iw/cleardisks_gui.py201
1 files changed, 201 insertions, 0 deletions
diff --git a/iw/cleardisks_gui.py b/iw/cleardisks_gui.py
new file mode 100644
index 000000000..2ac8c6812
--- /dev/null
+++ b/iw/cleardisks_gui.py
@@ -0,0 +1,201 @@
+#
+# Select which disks to clear and which ones to just mount.
+#
+# Copyright (C) 2009 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/>.
+#
+
+import gtk, gobject
+import gui
+from DeviceSelector import *
+from constants import *
+import isys
+from iw_gui import *
+from storage.udev import *
+
+import gettext
+_ = lambda x: gettext.ldgettext("anaconda", x)
+
+class ClearDisksWindow (InstallWindow):
+ windowTitle = N_("Clear Disks Selector")
+
+ def getNext (self):
+ # All the rows that are visible in the right hand side should be cleared.
+ cleardisks = []
+ for row in self.store:
+ if row[self.rightVisible]:
+ cleardisks.append(row[OBJECT_COL].name)
+
+ if len(cleardisks) == 0:
+ self.anaconda.intf.messageWindow(_("Error"),
+ _("You must select at least one "
+ "drive to be used for installation."),
+ custom_icon="error")
+ raise gui.StayOnScreen
+
+ # The selected row is the disk to boot from.
+ selected = self.rightDS.getSelected()
+
+ if len(selected) == 0:
+ self.anaconda.intf.messageWindow(_("Error"),
+ _("You must select one drive to "
+ "boot from."),
+ custom_icon="error")
+ raise gui.StayOnScreen
+
+ bootDisk = selected[0][OBJECT_COL].name
+
+ cleardisks.sort(isys.compareDrives)
+
+ self.anaconda.id.storage.clearPartDisks.extend(cleardisks + [bootDisk])
+ self.anaconda.id.bootloader.drivelist = [bootDisk] + cleardisks
+
+ def getScreen (self, anaconda):
+ (xml, self.vbox) = gui.getGladeWidget("cleardisks.glade", "vbox")
+ self.leftScroll = xml.get_widget("leftScroll")
+ self.rightScroll = xml.get_widget("rightScroll")
+ self.addButton = xml.get_widget("addButton")
+ self.removeButton = xml.get_widget("removeButton")
+ self.installTargetImage = xml.get_widget("installTargetImage")
+ self.installTargetTip = xml.get_widget("installTargetTip")
+
+ self.anaconda = anaconda
+
+ self.leftVisible = 1
+ self.leftActive = 2
+ self.rightVisible = 3
+ self.rightActive = 4
+
+ # One store for both views. First the obejct, then a visible/active for
+ # the left hand side, then a visible/active for the right hand side, then
+ # all the other stuff.
+ self.store = gtk.TreeStore(gobject.TYPE_PYOBJECT,
+ gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN,
+ gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN,
+ gobject.TYPE_STRING, gobject.TYPE_STRING,
+ gobject.TYPE_STRING, gobject.TYPE_STRING,
+ gobject.TYPE_STRING)
+ self.store.set_sort_column_id(5, gtk.SORT_ASCENDING)
+
+ # The left view shows all the drives that will just be mounted, but
+ # can still be moved to the right hand side.
+ self.leftSortedModel = gtk.TreeModelSort(self.store)
+ self.leftFilteredModel = self.store.filter_new()
+ self.leftTreeView = gtk.TreeView(self.leftFilteredModel)
+
+ self.leftFilteredModel.set_visible_func(lambda model, iter, view: model.get_value(iter, self.leftVisible), self.leftTreeView)
+
+ self.leftScroll.add(self.leftTreeView)
+
+ self.leftDS = DeviceSelector(self.store, self.leftFilteredModel,
+ self.leftTreeView, visible=self.leftVisible,
+ active=self.leftActive)
+ self.leftDS.createMenu()
+ self.leftDS.addColumn(_("Model"), 5)
+ self.leftDS.addColumn(_("Capacity"), 6)
+ self.leftDS.addColumn(_("Vendor"), 7)
+ self.leftDS.addColumn(_("Interconnect"), 8, displayed=False)
+ self.leftDS.addColumn(_("Serial Number"), 9, displayed=False)
+
+ # The right view show all the drives that will be wiped during install.
+ self.rightSortedModel = gtk.TreeModelSort(self.store)
+ self.rightFilteredModel = self.store.filter_new()
+ self.rightTreeView = gtk.TreeView(self.rightFilteredModel)
+
+ self.rightFilteredModel.set_visible_func(lambda model, iter, view: model.get_value(iter, self.rightVisible), self.rightTreeView)
+
+ self.rightScroll.add(self.rightTreeView)
+
+ self.rightDS = DeviceSelector(self.store, self.rightFilteredModel,
+ self.rightTreeView, visible=self.rightVisible,
+ active=self.rightActive)
+ self.rightDS.createSelectionCol(title=_("Boot"), radioButton=True)
+ self.rightDS.addColumn(_("Model"), 5)
+ self.rightDS.addColumn(_("Capacity"), 6)
+
+ # The device filtering UI set up exclusiveDisks as a list of the names
+ # of all the disks we should use later on. Now we need to go get those,
+ # look up some more information in the devicetree, and set up the
+ # selector.
+ for d in self.anaconda.id.storage.exclusiveDisks:
+ device = self.anaconda.id.storage.devicetree.getDeviceByName(d)
+ if not device:
+ continue
+
+ self.store.append(None, (device, True, True, False, False,
+ device.partedDevice.model,
+ str(int(device.size)) + " MB",
+ device.vendor, "", device.serial))
+
+ self.addButton.connect("clicked", self._add_clicked)
+ self.removeButton.connect("clicked", self._remove_clicked)
+
+ if self.anaconda.id.storage.clearPartType == CLEARPART_TYPE_LINUX:
+ self.installTargetTip.set_markup(_("<b>Tip:</b> All Linux filesystems on install target devices will be reformatted and wiped of any data. Make sure you have backups."))
+ elif self.anaconda.id.storage.clearPartType == CLEARPART_TYPE_ALL:
+ self.installTargetTip.set_markup(_("<b>Tip:</b> Install target devices will be reformatted and wiped of any data. Make sure you have backups."))
+ else:
+ self.installTargetTip.set_markup(_("<b>Tip:</b> Your filesystems on install target devices will not be wiped unless you choose to do so during customization."))
+
+ return self.vbox
+
+ def _add_clicked(self, button):
+ (filteredModel, filteredIter) = self.leftTreeView.get_selection().get_selected()
+
+ if not filteredIter:
+ return
+
+ # If this is the first row going into the rightDS, it should be checked
+ # by default.
+ if self.rightDS.getNVisible() == 0:
+ active = True
+ else:
+ active = False
+
+ sortedIter = self.leftFilteredModel.convert_iter_to_child_iter(filteredIter)
+
+ self.store.set_value(sortedIter, self.leftVisible, False)
+ self.store.set_value(sortedIter, self.rightVisible, True)
+ self.store.set_value(sortedIter, self.rightActive, active)
+
+ self.leftFilteredModel.refilter()
+ self.rightFilteredModel.refilter()
+
+ def _remove_clicked(self, button):
+ (filteredModel, filteredIter) = self.rightTreeView.get_selection().get_selected()
+
+ if not filteredIter:
+ return
+
+ sortedIter = self.rightFilteredModel.convert_iter_to_child_iter(filteredIter)
+
+ # If we're removing a row that was checked and there are other rows
+ # available, check the first visible one.
+ if self.store.get_value(sortedIter, self.rightActive) and self.rightDS.getNVisible() > 1:
+ i = 0
+
+ # Make sure to skip the current row, of course.
+ while not self.store[i][self.rightVisible] or self.store[i][0] == self.store[sortedIter][0]:
+ i += 1
+
+ self.store[i][self.rightActive] = True
+
+ self.store.set_value(sortedIter, self.leftVisible, True)
+ self.store.set_value(sortedIter, self.rightVisible, False)
+ self.store.set_value(sortedIter, self.rightActive, False)
+
+ self.leftFilteredModel.refilter()
+ self.rightFilteredModel.refilter()