[PATCH] Add a reformat checkbutton to indicate a desire to reformat the device.
David Lehman
dlehman at redhat.com
Mon Oct 22 15:02:58 UTC 2012
---
pyanaconda/ui/gui/spokes/custom.glade | 16 +++-
pyanaconda/ui/gui/spokes/custom.py | 197 ++++++++++++++++++++-------------
2 files changed, 136 insertions(+), 77 deletions(-)
diff --git a/pyanaconda/ui/gui/spokes/custom.glade b/pyanaconda/ui/gui/spokes/custom.glade
index b4ae700..d297e0b 100644
--- a/pyanaconda/ui/gui/spokes/custom.glade
+++ b/pyanaconda/ui/gui/spokes/custom.glade
@@ -1208,7 +1208,21 @@ you'll be able to view their details here.</property>
</packing>
</child>
<child>
- <placeholder/>
+ <object class="GtkCheckButton" id="reformatCheckbox">
+ <property name="label" translatable="yes">Reformat</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_reformat_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
</child>
</object>
</child>
diff --git a/pyanaconda/ui/gui/spokes/custom.py b/pyanaconda/ui/gui/spokes/custom.py
index f64d416..dac54bb 100644
--- a/pyanaconda/ui/gui/spokes/custom.py
+++ b/pyanaconda/ui/gui/spokes/custom.py
@@ -900,6 +900,9 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
device_type = device_type_map[device_type]
log.debug("new device type: %s" % device_type)
+ reformat = self.builder.get_object("reformatCheckbox").get_active()
+ log.debug("reformat: %s" % reformat)
+
fs_type_combo = self.builder.get_object("fileSystemTypeCombo")
fs_type_index = fs_type_combo.get_active()
fs_type = fs_type_combo.get_model()[fs_type_index][0]
@@ -907,10 +910,18 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
prev_encrypted = device.encrypted
log.debug("old encryption setting: %s" % prev_encrypted)
- encrypted = self.builder.get_object("encryptCheckbox").get_active()
+ encryption_checkbox = self.builder.get_object("encryptCheckbox")
+ encrypted = None
+ if encryption_checkbox.get_sensitive():
+ encrypted = encryption_checkbox.get_active()
+
log.debug("new encryption setting: %s" % encrypted)
- label = self.builder.get_object("labelEntry").get_text()
+ label_entry = self.builder.get_object("labelEntry")
+ label = ""
+ if label_entry.get_sensitive():
+ label = label_entry.get_text()
+
old_label = getattr(device.format, "label", "") or ""
mountpoint = None # None means format type is not mountable
@@ -1138,81 +1149,88 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
self._updateSpaceDisplay()
self._populate_right_side(selector)
- ##
- ## ENCRYPTION
- ##
- old_device = device
- if prev_encrypted and not encrypted:
- log.info("removing encryption from %s" % device.name)
- with ui_storage_logger():
- self.__storage.destroyDevice(device)
- self._devices.remove(device)
- old_device = device
- device = device.slave
- selector._device = device
- for s in self._accordion.allSelectors:
- if s._device == old_device:
- s._device = device
- elif encrypted and not prev_encrypted:
- log.info("applying encryption to %s" % device.name)
- with ui_storage_logger():
- old_device = device
- new_fmt = getFormat("luks", device=device.path)
- self.__storage.formatDevice(device, new_fmt)
- luks_dev = LUKSDevice("luks-" + device.name,
- parents=[device])
- self.__storage.createDevice(luks_dev)
- self._devices.append(luks_dev)
- device = luks_dev
- selector._device = device
- for s in self._accordion.allSelectors:
- if s._device == old_device:
- s._device = device
-
- ##
- ## FORMATTING
- ##
- if fs_type != device.format.name:
- self.clear_errors()
- with ui_storage_logger():
- old_format = device.format
- new_format = getFormat(fs_type,
- mountpoint=mountpoint, label=label,
- device=device.path)
- try:
- self.__storage.formatDevice(device, new_format)
- except StorageError as e:
- log.error("failed to register device format action: %s" % e)
- device.format = old_format
- self._error = e
- self.window.set_info(Gtk.MessageType.WARNING,
- _("Device reformat request failed. "
- "Click for details."))
- self.window.show_all()
- else:
- # first, remove this selector from any old install page(s)
- new_selector = None
- for page in self._accordion.allPages:
- for _selector in getattr(page, "_members", []):
- if _selector._device in (device, old_device):
- if page.pageTitle == new_install_name:
- new_selector = _selector
- continue
-
- page.removeSelector(_selector)
- if not page._members:
- log.debug("removing empty page %s" % page.pageTitle)
- self._accordion.removePage(page.pageTitle)
-
- # either update the existing selector or add a new one
- if new_selector:
- new_selector.props.mountpoint = mountpoint or ""
- new_selector.props.name = (self._mountpointName(mountpoint)
- or device.format.name)
+ if reformat:
+ ##
+ ## ENCRYPTION
+ ##
+ old_fs_type = device.format.type
+ old_device = device
+ if prev_encrypted and not encrypted:
+ log.info("removing encryption from %s" % device.name)
+ with ui_storage_logger():
+ self.__storage.destroyDevice(device)
+ self._devices.remove(device)
+ old_device = device
+ device = device.slave
+ selector._device = device
+ for s in self._accordion.allSelectors:
+ if s._device == old_device:
+ s._device = device
+ elif encrypted and not prev_encrypted:
+ log.info("applying encryption to %s" % device.name)
+ with ui_storage_logger():
+ old_device = device
+ new_fmt = getFormat("luks", device=device.path)
+ self.__storage.formatDevice(device, new_fmt)
+ luks_dev = LUKSDevice("luks-" + device.name,
+ parents=[device])
+ self.__storage.createDevice(luks_dev)
+ self._devices.append(luks_dev)
+ device = luks_dev
+ selector._device = device
+ for s in self._accordion.allSelectors:
+ if s._device == old_device:
+ s._device = device
+
+ ##
+ ## FORMATTING
+ ##
+ encryption_changed = (device != old_device)
+ fs_type_changed = (fs_type_short != old_fs_type)
+ fs_exists = old_device.format.exists
+ if encryption_changed or fs_type_changed or fs_exists:
+ log.info("scheduling reformat of %s as %s" % (device.name,
+ fs_type_short))
+ self.clear_errors()
+ with ui_storage_logger():
+ old_format = device.format
+ new_format = getFormat(fs_type,
+ mountpoint=mountpoint, label=label,
+ device=device.path)
+ try:
+ self.__storage.formatDevice(device, new_format)
+ except StorageError as e:
+ log.error("failed to register device format action: %s" % e)
+ device.format = old_format
+ self._error = e
+ self.window.set_info(Gtk.MessageType.WARNING,
+ _("Device reformat request failed. "
+ "Click for details."))
+ self.window.show_all()
else:
- self.add_new_selector(device)
+ # first, remove this selector from any old install page(s)
+ new_selector = None
+ for page in self._accordion.allPages:
+ for _selector in getattr(page, "_members", []):
+ if _selector._device in (device, old_device):
+ if page.pageTitle == new_install_name:
+ new_selector = _selector
+ continue
+
+ page.removeSelector(_selector)
+ if not page._members:
+ log.debug("removing empty page %s" % page.pageTitle)
+ self._accordion.removePage(page.pageTitle)
+
+ # either update the existing selector or add a new one
+ if new_selector:
+ new_selector.props.mountpoint = mountpoint or ""
+ new_selector.props.name = (self._mountpointName(mountpoint)
+ or device.format.name)
+ else:
+ self.add_new_selector(device)
- return
+ return
##
## FORMATTING ATTRIBUTES
@@ -1397,6 +1415,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
def _populate_right_side(self, selector):
log.debug("populate_right_side: %s" % selector._device)
encryptCheckbox = self.builder.get_object("encryptCheckbox")
+ reformatCheckbox = self.builder.get_object("reformatCheckbox")
labelEntry = self.builder.get_object("labelEntry")
mountPointEntry = self.builder.get_object("mountPointEntry")
selectedDeviceLabel = self.builder.get_object("selectedDeviceLabel")
@@ -1447,7 +1466,10 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
else:
sizeSpinner.set_tooltip_text(_("This file system may not be resized."))
+ reformatCheckbox.set_active(not device.format.exists)
+ reformatCheckbox.set_sensitive(use_dev.exists)
encryptCheckbox.set_active(device.encrypted)
+ encryptCheckbox.set_sensitive(reformatCheckbox.get_active())
##
## Set up the filesystem type combo.
@@ -1479,6 +1501,8 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
device.originalFormat.type not in self._fs_types:
fsCombo.append_text(device.originalFormat.name)
+ fsCombo.set_sensitive(reformatCheckbox.get_active())
+
##
## Set up the device type combo.
##
@@ -1894,6 +1918,25 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
self._updateSpaceDisplay()
log.debug("finished updating space display")
+ def on_reformat_toggled(self, widget):
+ active = widget.get_active()
+
+ encryption_checkbutton = self.builder.get_object("encryptCheckbox")
+ encryption_checkbutton.set_sensitive(active)
+
+ fs_combo = self.builder.get_object("fileSystemTypeCombo")
+ fs_combo.set_sensitive(active)
+
+ # The label entry can only be sensitive if reformat is active and the
+ # currently selected filesystem can be labeled.
+ label_active = active
+ if active:
+ fmt = getFormat(fs_combo.get_active_text())
+ label_active = active and hasattr(fmt, "label")
+
+ label_entry = self.builder.get_object("labelEntry")
+ label_entry.set_sensitive(label_active)
+
def on_fs_type_changed(self, combo):
if not self._initialized:
return
@@ -1905,8 +1948,10 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
fmt = getFormat(new_type)
mountPointEntry = self.builder.get_object("mountPointEntry")
labelEntry = self.builder.get_object("labelEntry")
+ reformat_checkbox = self.builder.get_object("reformatCheckbox")
# FIXME: can't set a label on an existing format as of now
- labelEntry.set_sensitive(hasattr(fmt, "label"))
+ labelEntry.set_sensitive(reformat_checkbox.get_active() and
+ hasattr(fmt, "label"))
mountPointEntry.set_sensitive(fmt.mountable)
def on_device_type_changed(self, combo):
--
1.7.7.6
More information about the anaconda-patches
mailing list