diff --git a/pype/tools/settings/settings/widgets/base.py b/pype/tools/settings/settings/widgets/base.py index 181a4a50b1..5ed806c61c 100644 --- a/pype/tools/settings/settings/widgets/base.py +++ b/pype/tools/settings/settings/widgets/base.py @@ -41,6 +41,13 @@ class BaseWidget(QtWidgets.QWidget): ) ) + def get_invalid(self): + raise NotImplementedError( + "{} not implemented `get_invalid`".format( + self.__class__.__name__ + ) + ) + def show_actions_menu(self, event): print("Show actions for {}".format(self.entity.path)) @@ -71,6 +78,12 @@ class InputWidget(BaseWidget): def hierarchical_style_update(self): self.update_style() + def get_invalid(self): + invalid = [] + if self.is_invalid: + invalid.append(self) + return invalid + class GUIWidget(BaseWidget): separator_height = 2 @@ -115,3 +128,6 @@ class GUIWidget(BaseWidget): def hierarchical_style_update(self): pass + + def get_invalid(self): + return [] diff --git a/pype/tools/settings/settings/widgets/categories.py b/pype/tools/settings/settings/widgets/categories.py index d34bd022af..76c2254321 100644 --- a/pype/tools/settings/settings/widgets/categories.py +++ b/pype/tools/settings/settings/widgets/categories.py @@ -460,7 +460,16 @@ class SystemWidget(SettingsCategoryWidget): print("*** validate_defaults_to_save") def save(self): - self.entity.save() + invalid = self.get_invalid() + if not invalid: + self.entity.save() + return + + def get_invalid(self): + invalid = [] + for input_field in self.input_fields: + invalid.extend(input_field.get_invalid()) + return invalid def update_values(self): self.entity.reset() diff --git a/pype/tools/settings/settings/widgets/dict_mutable_widget.py b/pype/tools/settings/settings/widgets/dict_mutable_widget.py index 5c519f2f37..4ece3c32f9 100644 --- a/pype/tools/settings/settings/widgets/dict_mutable_widget.py +++ b/pype/tools/settings/settings/widgets/dict_mutable_widget.py @@ -434,6 +434,13 @@ class ModifiableDictItem(QtWidgets.QWidget): def is_invalid(self): return self.is_key_duplicated or self.input_field.is_invalid + def get_invalid(self): + invalid = [] + if self.is_key_duplicated: + invalid.append(self.key_input) + invalid.extend(self.input_field.get_invalid()) + return invalid + def update_style(self): key_input_state = "" if self.is_key_duplicated or self.key_value() == "": @@ -550,6 +557,12 @@ class DictMutableKeysWidget(BaseWidget): return True return False + def get_invalid(self): + invalid = [] + for input_field in self.input_fields: + invalid.extend(input_field.get_invalid()) + return invalid + def add_required_keys(self): # TODO implement pass diff --git a/pype/tools/settings/settings/widgets/item_widgets.py b/pype/tools/settings/settings/widgets/item_widgets.py index 6f9f324166..facc677619 100644 --- a/pype/tools/settings/settings/widgets/item_widgets.py +++ b/pype/tools/settings/settings/widgets/item_widgets.py @@ -181,6 +181,12 @@ class DictImmutableKeysWidget(BaseWidget): return True return False + def get_invalid(self): + invalid = [] + for input_field in self.input_fields: + invalid.extend(input_field.get_invalid()) + return invalid + def _on_entity_change(self): print("_on_entity_change", self.__class__.__name__, self.entity.path) @@ -465,6 +471,9 @@ class PathWidget(BaseWidget): def _on_entity_change(self): print("_on_entity_change", self.__class__.__name__, self.entity.path) + def get_invalid(self): + return self.input_field.get_invalid() + class PathInputWidget(InputWidget): def create_ui(self, label_widget=None): diff --git a/pype/tools/settings/settings/widgets/list_item_widget.py b/pype/tools/settings/settings/widgets/list_item_widget.py index de385afb0e..d5674f6885 100644 --- a/pype/tools/settings/settings/widgets/list_item_widget.py +++ b/pype/tools/settings/settings/widgets/list_item_widget.py @@ -116,6 +116,9 @@ class ListItem(QtWidgets.QWidget): self.spacer_widget = spacer_widget + def get_invalid(self): + return self.input_field.get_invalid() + def add_widget_to_layout(self, widget, label=None): self.content_layout.addWidget(widget, 1) @@ -230,6 +233,15 @@ class ListWidget(InputWidget): self.empty_row.setVisible(self.count() == 0) + def get_invalid(self): + invalid = [] + if self.is_invalid: + invalid.append(self) + + for input_field in self.input_fields: + invalid.extend(input_field.get_invalid()) + return invalid + def _on_value_change(self): print("_on_value_change", self.__class__.__name__, self.entity.path)