--- pyanaconda/ui/common.py | 18 ++++++++++++++---- pyanaconda/ui/gui/hubs/__init__.py | 4 ++-- pyanaconda/ui/gui/spokes/__init__.py | 2 +- pyanaconda/ui/gui/spokes/datetime_spoke.py | 4 ++++ pyanaconda/ui/gui/spokes/network.py | 7 +++++-- pyanaconda/ui/gui/spokes/password.py | 4 ++++ pyanaconda/ui/gui/spokes/software.py | 4 ++++ pyanaconda/ui/gui/spokes/source.py | 4 ++++ pyanaconda/ui/tui/hubs/__init__.py | 2 +- pyanaconda/ui/tui/spokes/password.py | 4 ++++ pyanaconda/ui/tui/spokes/storage.py | 4 ++++ pyanaconda/ui/tui/spokes/time.py | 4 ++++ 12 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/pyanaconda/ui/common.py b/pyanaconda/ui/common.py index bcac8b4..3452a04 100644 --- a/pyanaconda/ui/common.py +++ b/pyanaconda/ui/common.py @@ -171,13 +171,23 @@ class Spoke(UIObject):
@property def completed(self): - """Has this spoke been visited and completed? If not, a special warning - icon will be shown on the Hub beside the spoke, and a highlighted - message will be shown at the bottom of the Hub. Installation will not - be allowed to proceed until all spokes are complete. + """Has this spoke been visited and completed? If not and the spoke is + mandatory, a special warning icon will be shown on the Hub beside the + spoke, and a highlighted message will be shown at the bottom of the + Hub. Installation will not be allowed to proceed until all mandatory + spokes are complete. """ return False
+ @property + def mandatory(self): + """Mark this spoke as mandatory. Installation will not be allowed + to proceed until all mandatory spokes are complete. + + Spokes are mandatory unless marked as not being so. + """ + return True + def execute(self): """Cause the data object to take effect on the target system. This will usually be as simple as calling one or more of the execute methods on diff --git a/pyanaconda/ui/gui/hubs/__init__.py b/pyanaconda/ui/gui/hubs/__init__.py index c0df863..642ebb3 100644 --- a/pyanaconda/ui/gui/hubs/__init__.py +++ b/pyanaconda/ui/gui/hubs/__init__.py @@ -200,14 +200,14 @@ class Hub(GUIObject, common.Hub): spoke.selector.set_sensitive(spoke.ready) spoke.selector.set_property("status", spoke.status) spoke.selector.set_tooltip_markup(spoke.status) - spoke.selector.set_incomplete(not spoke.completed) + spoke.selector.set_incomplete(not spoke.completed and spoke.mandatory) self._handleCompleteness(spoke)
def _handleCompleteness(self, spoke): # Add the spoke to the incomplete list if it's now incomplete, and make # sure it's not on the list if it's now complete. Then show the box if # it's needed and hide it if it's not. - if spoke.completed: + if not spoke.mandatory or spoke.completed: if spoke in self._incompleteSpokes: self._incompleteSpokes.remove(spoke) else: diff --git a/pyanaconda/ui/gui/spokes/__init__.py b/pyanaconda/ui/gui/spokes/__init__.py index 9633eb9..f25d30c 100644 --- a/pyanaconda/ui/gui/spokes/__init__.py +++ b/pyanaconda/ui/gui/spokes/__init__.py @@ -17,7 +17,7 @@ # Red Hat, Inc. # # Red Hat Author(s): Chris Lumens clumens@redhat.com -# +# Martin Sivak msivak@redhat.com
from pyanaconda.ui import common from pyanaconda.ui.common import collect diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py index 5bc07d0..91af50f 100644 --- a/pyanaconda/ui/gui/spokes/datetime_spoke.py +++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py @@ -426,6 +426,10 @@ class DatetimeSpoke(NormalSpoke): def completed(self): return timezone.is_valid_timezone(self.data.timezone.timezone)
+ @property + def mandatory(self): + return True + def refresh(self): #update the displayed time self._update_datetime_timer_id = GLib.timeout_add_seconds(1, diff --git a/pyanaconda/ui/gui/spokes/network.py b/pyanaconda/ui/gui/spokes/network.py index e5b91d5..b953f61 100644 --- a/pyanaconda/ui/gui/spokes/network.py +++ b/pyanaconda/ui/gui/spokes/network.py @@ -980,10 +980,13 @@ class NetworkSpoke(NormalSpoke): @property def completed(self): # TODO: check also if source requires updates when implemented - return (self.data.method.method not in ("url", "nfs") or - len(self.network_control_box.activated_connections()) > 0) + return len(self.network_control_box.activated_connections()) > 0
@property + def mandatory(self): + return self.data.method.method in ("url", "nfs") + + @property def status(self): """ A short string describing which devices are connected. """ msg = _("Unknown") diff --git a/pyanaconda/ui/gui/spokes/password.py b/pyanaconda/ui/gui/spokes/password.py index ac113af..c273846 100644 --- a/pyanaconda/ui/gui/spokes/password.py +++ b/pyanaconda/ui/gui/spokes/password.py @@ -82,6 +82,10 @@ class PasswordSpoke(NormalSpoke): else: return _("Root password is not set")
+ @property + def mandatory(self): + return False + def apply(self): self.data.rootpw.password = cryptPassword(self._password) self.data.rootpw.isCrypted = True diff --git a/pyanaconda/ui/gui/spokes/software.py b/pyanaconda/ui/gui/spokes/software.py index 8fd4c59..5ad9028 100644 --- a/pyanaconda/ui/gui/spokes/software.py +++ b/pyanaconda/ui/gui/spokes/software.py @@ -131,6 +131,10 @@ class SoftwareSelectionSpoke(NormalSpoke): return self._get_selected_environment() is not None and processingDone
@property + def mandatory(self): + return True + + @property def ready(self): # By default, the software selection spoke is not ready. We have to # wait until the installation source spoke is completed. This could be diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py index fc1aacc..ac39ce6 100644 --- a/pyanaconda/ui/gui/spokes/source.py +++ b/pyanaconda/ui/gui/spokes/source.py @@ -581,6 +581,10 @@ class SourceSpoke(NormalSpoke): return not self._error and self.status and self.status != _("Nothing selected")
@property + def mandatory(self): + return True + + @property def ready(self): from pyanaconda.threads import threadMgr # By default, the source spoke is not ready. We have to wait until diff --git a/pyanaconda/ui/tui/hubs/__init__.py b/pyanaconda/ui/tui/hubs/__init__.py index ae5b0b8..b7dade1 100644 --- a/pyanaconda/ui/tui/hubs/__init__.py +++ b/pyanaconda/ui/tui/hubs/__init__.py @@ -103,7 +103,7 @@ class TUIHub(TUIObject, common.Hub): # don't continue if key == _('c'): for spoke in self._spokes.values(): - if not spoke.completed: + if not spoke.completed and spoke.mandatory: print(_("Please complete all spokes before continuing")) return False return key diff --git a/pyanaconda/ui/tui/spokes/password.py b/pyanaconda/ui/tui/spokes/password.py index 8942e17..f812678 100644 --- a/pyanaconda/ui/tui/spokes/password.py +++ b/pyanaconda/ui/tui/spokes/password.py @@ -44,6 +44,10 @@ class PasswordSpoke(NormalTUISpoke): return bool(self.data.rootpw.password or self.data.rootpw.lock)
@property + def mandatory(self): + return True + + @property def status(self): if self.data.rootpw.password: return _("Password is set.") diff --git a/pyanaconda/ui/tui/spokes/storage.py b/pyanaconda/ui/tui/spokes/storage.py index 0032f2a..b5d483f 100644 --- a/pyanaconda/ui/tui/spokes/storage.py +++ b/pyanaconda/ui/tui/spokes/storage.py @@ -115,6 +115,10 @@ class StorageSpoke(NormalTUISpoke): return self._ready and not threadMgr.get("AnaStorageWatcher")
@property + def mandatory(self): + return True + + @property def status(self): """ A short string describing the current status of storage setup. """ msg = _("No disks selected") diff --git a/pyanaconda/ui/tui/spokes/time.py b/pyanaconda/ui/tui/spokes/time.py index cc26ec3..6a47401 100644 --- a/pyanaconda/ui/tui/spokes/time.py +++ b/pyanaconda/ui/tui/spokes/time.py @@ -48,6 +48,10 @@ class TimeZoneSpoke(NormalTUISpoke): return bool(self.data.timezone.timezone or self._selection)
@property + def mandatory(self): + return True + + @property def status(self): if self.data.timezone.timezone: return _("%s timezone") % self.data.timezone.timezone