We don't like GtkSpinButton, and this makes the widget the same as the one
on the Add Mount Point dialog. That means it accepts Sizes as well. Leaving
the size blank should result in the mount point expanding to take up all
available free space.
---
anaconda.spec.in | 2 +-
pyanaconda/ui/gui/spokes/custom.glade | 16 ++-----
pyanaconda/ui/gui/spokes/custom.py | 84 +++++++++++++++++++----------------
3 files changed, 50 insertions(+), 52 deletions(-)
diff --git a/anaconda.spec.in b/anaconda.spec.in
index 85585f0..4458537 100644
--- a/anaconda.spec.in
+++ b/anaconda.spec.in
@@ -69,7 +69,7 @@ BuildRequires: s390utils-devel
%endif
Requires: anaconda-widgets = %{version}-%{release}
-Requires: python-blivet >= 0.6
+Requires: python-blivet >= 0.8
Requires: gnome-icon-theme-symbolic
Requires: python-meh >= %{mehver}
Requires: libreport-anaconda >= 2.0.21-1
diff --git a/pyanaconda/ui/gui/spokes/custom.glade
b/pyanaconda/ui/gui/spokes/custom.glade
index 6319a50..d5d3d82 100644
--- a/pyanaconda/ui/gui/spokes/custom.glade
+++ b/pyanaconda/ui/gui/spokes/custom.glade
@@ -618,10 +618,10 @@ use. Try something else?</property>
<property
name="can_focus">False</property>
<property
name="halign">end</property>
<property
name="xalign">0</property>
- <property name="label"
translatable="yes"><b>_Desired Capacity
(MB):</b></property>
+ <property name="label"
translatable="yes"><b>_Desired
Capacity:</b></property>
<property
name="use_markup">True</property>
<property
name="use_underline">True</property>
- <property
name="mnemonic_widget">sizeSpinner</property>
+ <property
name="mnemonic_widget">sizeEntry</property>
</object>
<packing>
<property
name="left_attach">2</property>
@@ -645,15 +645,10 @@ use. Try something else?</property>
</packing>
</child>
<child>
- <object class="GtkSpinButton"
id="sizeSpinner">
+ <object class="GtkEntry"
id="sizeEntry">
<property
name="visible">True</property>
<property
name="can_focus">True</property>
<property
name="halign">end</property>
- <property
name="invisible_char">●</property>
- <property
name="width_chars">7</property>
- <property
name="invisible_char_set">True</property>
- <property
name="adjustment">sizeAdjustment</property>
- <property
name="numeric">True</property>
</object>
<packing>
<property
name="left_attach">3</property>
@@ -1995,11 +1990,6 @@ use. Try something else?</property>
<column type="gchararray"/>
</columns>
</object>
- <object class="GtkAdjustment" id="sizeAdjustment">
- <property name="upper">100</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
<object class="GtkListStore" id="raidLevelStore">
<columns>
<!-- column-name raidLevel -->
diff --git a/pyanaconda/ui/gui/spokes/custom.py b/pyanaconda/ui/gui/spokes/custom.py
index ba93b72..deec8ef 100644
--- a/pyanaconda/ui/gui/spokes/custom.py
+++ b/pyanaconda/ui/gui/spokes/custom.py
@@ -128,6 +128,24 @@ device_text_map = {DEVICE_TYPE_LVM: DEVICE_TEXT_LVM,
partition_only_format_types = ["efi", "hfs+", "prepboot",
"biosboot",
"appleboot"]
+def size_from_entry(entry):
+ size_text = entry.get_text().strip()
+
+ # if no unit was specified, default to MB
+ if not re.search(r'[A-Za-z]+$', size_text):
+ size_text += "MB"
+
+ try:
+ size = Size(spec=size_text)
+ except Exception:
+ return None
+ else:
+ # Minimium size for ui-created partitions is 1MB.
+ if size.convertTo(spec="mb") < 1:
+ size = Size(spec="1mb")
+
+ return size
+
# XXX: Hack, hack, hack. For some reason displaying lightboxed dialogs on the
# custom storage spoke means that redisplaying those dialogs later never works
# and the UI looks frozen. So I'm just going to override the real enlightbox
@@ -217,21 +235,7 @@ class AddDialog(GUIObject):
if self._error:
return
- size_text = self.builder.get_object("sizeEntry").get_text().strip()
-
- # if no unit was specified, default to MB
- if not re.search(r'[A-Za-z]+$', size_text):
- size_text += "MB"
-
- try:
- self.size = Size(spec=size_text)
- except Exception:
- pass
- else:
- # Minimum size for ui-created partitions is 1MB.
- if self.size.convertTo(spec="mb") < 1:
- self.size = Size(spec="1mb")
-
+ self.size = size_from_entry(self.builder.get_object("sizeEntry"))
self.window.destroy()
def refresh(self):
@@ -415,7 +419,7 @@ class HelpDialog(GUIObject):
self.window.destroy()
class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
- builderObjects = ["customStorageWindow", "sizeAdjustment",
+ builderObjects = ["customStorageWindow",
"partitionStore", "raidStoreFiltered",
"raidLevelStore",
"addImage", "removeImage",
"settingsImage",
"mountPointCompletion", "mountPointStore"]
@@ -881,7 +885,9 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
log.debug("old_name: %s" % old_name)
log.debug("new_name: %s" % name)
- size = self.builder.get_object("sizeSpinner").get_value()
+ size = size_from_entry(self.builder.get_object("sizeEntry"))
+ if size:
+ size = int(size.convertTo(spec="MB"))
log.debug("new size: %s" % size)
log.debug("old size: %s" % device.size)
@@ -1102,7 +1108,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
## SIZE
##
# new size means resize for existing devices and adjust for new ones
- changed_size = (int(size) != int(device.size))
+ changed_size = (size != int(device.size))
if changed_size or changed_disk_set or \
(changed_encryption and factory.encrypt_members and
not device.exists):
@@ -1111,6 +1117,15 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
if changed_size and device.exists and device.resizable:
with ui_storage_logger():
try:
+ # If no size was specified, we just want to grow to
+ # the maximum. But resizeDevice doesn't take None for
+ # a value.
+ if not size:
+ if hasattr(device, "vg"):
+ size = device.size + device.vg.freeSpace
+ else:
+ size = device.maxSize
+
self.__storage.resizeDevice(device, size)
except StorageError as e:
log.error("failed to schedule device resize: %s" % e)
@@ -1307,6 +1322,11 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
device_type = self._get_current_device_type()
log.debug("populate_raid: %s, %s" % (device_type, raid_level))
+ # If size comes in as a Size, convert it to a number. A None is
+ # fine, though.
+ if size and isinstance(size, Size):
+ size = int(size.convertTo(spec="MB"))
+
raid_label = self.builder.get_object("raidLevelLabel")
raid_combo = self.builder.get_object("raidLevelCombo")
@@ -1389,7 +1409,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
nameEntry = self.builder.get_object("nameEntry")
selectedDeviceLabel = self.builder.get_object("selectedDeviceLabel")
selectedDeviceDescLabel =
self.builder.get_object("selectedDeviceDescLabel")
- sizeSpinner = self.builder.get_object("sizeSpinner")
+ sizeEntry = self.builder.get_object("sizeEntry")
typeCombo = self.builder.get_object("deviceTypeCombo")
fsCombo = self.builder.get_object("fileSystemTypeCombo")
expander = self.builder.get_object("customizeExpander")
@@ -1439,23 +1459,13 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
else:
labelEntry.set_tooltip_text(_("This file system does not support
labels."))
- if device.exists:
- min_size = device.minSize
- max_size = device.maxSize
- else:
- min_size = max(device.format.minSize, 1.0)
- max_size = device.size +
float(self._free_space.convertTo(spec="mb")) # FIXME
-
- log.debug("min: %s max: %s current: %s" % (min_size, max_size,
device.size))
- sizeSpinner.set_range(min_size,
- max_size)
- sizeSpinner.set_value(device.size)
- sizeSpinner.set_sensitive(device.resizable or not device.exists)
+ sizeEntry.set_text(str(Size(spec="%d MB" % device.size)))
+ sizeEntry.set_sensitive(device.resizable or not device.exists)
- if sizeSpinner.get_sensitive():
- sizeSpinner.props.has_tooltip = False
+ if sizeEntry.get_sensitive():
+ sizeEntry.props.has_tooltip = False
else:
- sizeSpinner.set_tooltip_text(_("This file system may not be
resized."))
+ sizeEntry.set_tooltip_text(_("This file system may not be
resized."))
self._reformatCheckbox.set_active(not device.format.exists)
self._reformatCheckbox.set_sensitive(not device.protected and
@@ -1942,8 +1952,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
return
self._device_disks = disks
- self._populate_raid(self._get_raid_level(),
-
self.builder.get_object("sizeSpinner").get_value())
+ self._populate_raid(self._get_raid_level(),
size_from_entry(self.builder.get_object("sizeEntry")))
def run_vg_editor(self, vg=None, name=None):
if vg:
@@ -2317,8 +2326,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
exists = self._current_selector and self._current_selector._device.exists
self._configButton.set_sensitive(not exists and new_type != DEVICE_TYPE_LVM)
- size = self.builder.get_object("sizeSpinner").get_value()
- self._populate_raid(raid_level, size)
+ self._populate_raid(raid_level,
size_from_entry(self.builder.get_object("sizeEntry")))
self._populate_lvm()
nameEntry = self.builder.get_object("nameEntry")
--
1.8.1.2