[PATCH 2/2] Allow deleting whole disks using the reclaim dialog (#880686).
Chris Lumens
clumens at redhat.com
Fri Jan 4 21:42:17 UTC 2013
This could probably be further extended to putting new disk labels on, should
we want to do that in the future.
---
pyanaconda/ui/gui/spokes/lib/resize.py | 52 +++++++++++++++++++++++-----------
1 file changed, 35 insertions(+), 17 deletions(-)
diff --git a/pyanaconda/ui/gui/spokes/lib/resize.py b/pyanaconda/ui/gui/spokes/lib/resize.py
index b500c97..31d3624 100644
--- a/pyanaconda/ui/gui/spokes/lib/resize.py
+++ b/pyanaconda/ui/gui/spokes/lib/resize.py
@@ -103,6 +103,12 @@ class ResizeDialog(GUIObject):
else:
return ""
+ def _get_tooltip(self, device):
+ if device.protected:
+ return _("This device contains the installation source.")
+ else:
+ return None
+
def populate(self, disks):
totalDisks = 0
totalReclaimableSpace = 0
@@ -113,14 +119,13 @@ class ResizeDialog(GUIObject):
for disk in disks:
# First add the disk itself.
+ editable = not disk.protected
+ percent = 100
+
if disk.partitioned:
- editable = False
- percent = 0
fstype = ""
diskReclaimableSpace = 0
else:
- editable = not disk.protected
- percent = 100
fstype = disk.format.type
diskReclaimableSpace = disk.size
@@ -131,7 +136,7 @@ class ResizeDialog(GUIObject):
percent,
_(PRESERVE),
editable,
- _("Whole disks are not editable.")])
+ self._get_tooltip(disk)])
if disk.partitioned:
# Then add all its partitions.
@@ -147,11 +152,6 @@ class ResizeDialog(GUIObject):
else:
freeSize = dev.size
- if dev.protected:
- tooltip = _("This device contains the installation source.")
- else:
- tooltip = None
-
self._diskStore.append(itr, [dev.id,
self._description(dev),
dev.format.type,
@@ -159,7 +159,7 @@ class ResizeDialog(GUIObject):
int((freeSize/dev.size) * 100),
_(PRESERVE),
not dev.protected,
- tooltip])
+ self._get_tooltip(dev)])
diskReclaimableSpace += freeSize
# And then go back and fill in the total reclaimable space for the
@@ -198,10 +198,12 @@ class ResizeDialog(GUIObject):
self._selected_label.set_markup(text)
def _update_buttons(self, row):
- # If this is a disk header, it's not editable, so make all the
- # buttons insensitive.
+ device = self.storage.devicetree.getDeviceByID(row[DEVICE_ID_COL])
+
+ # Disks themselves may be editable in certain ways, but they are never
+ # shrinkable.
self._preserveButton.set_sensitive(row[EDITABLE_COL])
- self._shrinkButton.set_sensitive(row[EDITABLE_COL])
+ self._shrinkButton.set_sensitive(row[EDITABLE_COL] and not device.isDisk)
self._deleteButton.set_sensitive(row[EDITABLE_COL])
if not row[EDITABLE_COL]:
@@ -209,7 +211,6 @@ class ResizeDialog(GUIObject):
# If the selected filesystem does not support shrinking, make that
# button insensitive.
- device = self.storage.devicetree.getDeviceByID(row[DEVICE_ID_COL])
self._shrinkButton.set_sensitive(device.resizable)
# Then, disable the button for whatever action is currently selected.
@@ -271,11 +272,28 @@ class ResizeDialog(GUIObject):
if not itr:
return
+ # Handle the row selected when a button was pressed.
selectedRow = self._diskStore[itr]
-
- # Put the selected action into the store as well.
selectedRow[ACTION_COL] = _(newAction)
+ # If that row is a disk header, we need to process all the partitions
+ # it contains.
+ device = self.storage.devicetree.getDeviceByID(selectedRow[DEVICE_ID_COL])
+ if device.isDisk and device.partitioned:
+ partItr = model.iter_children(itr)
+ while partItr:
+ self._diskStore[partItr][ACTION_COL] = _(newAction)
+
+ # If the user marked a whole disk for deletion, they can't go in and
+ # un-delete partitions under it.
+ if newAction == _(DELETE):
+ self._diskStore[partItr][EDITABLE_COL] = False
+ elif newAction == _(PRESERVE):
+ part = self.storage.devicetree.getDeviceByID(self._diskStore[partItr][DEVICE_ID_COL])
+ self._diskStore[partItr][EDITABLE_COL] = not part.protected
+
+ partItr = model.iter_next(partItr)
+
# And then we're keeping a running tally of how much space the user
# has selected to reclaim, so reflect that in the UI.
self._selectedReclaimableSpace = 0
--
1.7.11.2
More information about the anaconda-patches
mailing list