ProjectWidget is also using setting category as base

This commit is contained in:
iLLiCiTiT 2020-12-02 17:06:01 +01:00
parent 58349615c7
commit 9f992d4f89

View file

@ -517,145 +517,30 @@ class ProjectListWidget(QtWidgets.QWidget):
)
class ProjectWidget(QtWidgets.QWidget):
has_studio_override = _has_studio_override = False
is_overriden = _is_overriden = False
as_widget = _as_widget = False
any_parent_as_widget = _any_parent_as_widget = False
is_group = _is_group = False
any_parent_is_group = _any_parent_is_group = False
class ProjectWidget(SettingsCategoryWidget):
schema_category = "projects_schema"
initial_schema_name = "schema_main"
def __init__(self, user_role, parent=None):
super(ProjectWidget, self).__init__(parent)
self.user_role = user_role
self._hide_studio_overrides = False
self.is_overidable = False
self._ignore_value_changes = False
def initialize_attributes(self):
self.project_name = None
self.input_fields = []
scroll_widget = QtWidgets.QScrollArea(self)
scroll_widget.setObjectName("GroupWidget")
content_widget = QtWidgets.QWidget(scroll_widget)
content_layout = QtWidgets.QVBoxLayout(content_widget)
content_layout.setContentsMargins(3, 3, 3, 3)
content_layout.setSpacing(0)
content_layout.setAlignment(QtCore.Qt.AlignTop)
content_widget.setLayout(content_layout)
scroll_widget.setWidgetResizable(True)
scroll_widget.setWidget(content_widget)
super(ProjectWidget, self).initialize_attributes()
def ui_tweaks(self):
project_list_widget = ProjectListWidget(self)
content_layout.addWidget(project_list_widget)
footer_widget = QtWidgets.QWidget()
footer_layout = QtWidgets.QHBoxLayout(footer_widget)
self.main_layout.insertWidget(0, project_list_widget, 0)
if self.user_role == "developer":
save_as_default_btn = QtWidgets.QPushButton("Save as Default")
save_as_default_btn.clicked.connect(self._save_as_defaults)
refresh_icon = qtawesome.icon("fa.refresh", color="white")
refresh_button = QtWidgets.QPushButton()
refresh_button.setIcon(refresh_icon)
refresh_button.clicked.connect(self._on_refresh)
hide_studio_overrides = QtWidgets.QCheckBox()
hide_studio_overrides.setChecked(self._hide_studio_overrides)
hide_studio_overrides.stateChanged.connect(
self._on_hide_studio_overrides
)
hide_studio_overrides_widget = QtWidgets.QWidget()
hide_studio_overrides_layout = QtWidgets.QHBoxLayout(
hide_studio_overrides_widget
)
_label_widget = QtWidgets.QLabel(
"Hide studio overrides", hide_studio_overrides_widget
)
hide_studio_overrides_layout.addWidget(_label_widget)
hide_studio_overrides_layout.addWidget(hide_studio_overrides)
footer_layout.addWidget(save_as_default_btn, 0)
footer_layout.addWidget(refresh_button, 0)
footer_layout.addWidget(hide_studio_overrides_widget, 0)
save_btn = QtWidgets.QPushButton("Save")
spacer_widget = QtWidgets.QWidget()
footer_layout.addWidget(spacer_widget, 1)
footer_layout.addWidget(save_btn, 0)
configurations_widget = QtWidgets.QWidget()
configurations_layout = QtWidgets.QVBoxLayout(configurations_widget)
configurations_layout.setContentsMargins(0, 0, 0, 0)
configurations_layout.setSpacing(0)
configurations_layout.addWidget(scroll_widget, 1)
configurations_layout.addWidget(footer_widget, 0)
layout = QtWidgets.QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
self.setLayout(layout)
layout.addWidget(project_list_widget, 0)
layout.addWidget(configurations_widget, 1)
save_btn.clicked.connect(self._save_overrides)
project_list_widget.project_changed.connect(self._on_project_change)
self.project_list_widget = project_list_widget
self.scroll_widget = scroll_widget
self.content_layout = content_layout
self.content_widget = content_widget
self.reset()
def defaults_dir(self):
return DEFAULTS_DIR
def any_parent_overriden(self):
return False
@property
def ignore_value_changes(self):
return self._ignore_value_changes
@ignore_value_changes.setter
def ignore_value_changes(self, value):
self._ignore_value_changes = value
if value is False:
self.hierarchical_style_update()
def hierarchical_style_update(self):
for input_field in self.input_fields:
input_field.hierarchical_style_update()
def reset(self):
self.input_fields.clear()
while self.content_layout.count() != 0:
widget = self.content_layout.itemAt(0).widget()
self.content_layout.removeWidget(widget)
widget.deleteLater()
self.schema = lib.gui_schema("projects_schema", "0_project_gui_schema")
self.keys = self.schema.get("keys", [])
self.add_children_gui(self.schema)
self._update_values()
self.hierarchical_style_update()
def add_children_gui(self, child_configuration):
item_type = child_configuration["type"]
klass = lib.TypeToKlass.types.get(item_type)
item = klass(child_configuration, self)
item.create_ui()
self.input_fields.append(item)
self.content_layout.addWidget(item, 0)
# Add spacer to stretch children guis
spacer = QtWidgets.QWidget(self.content_widget)
self.content_layout.addWidget(spacer, 1)
def validate_defaults_to_save(self, _):
# Projects does not have any specific validations
return True
def _on_project_change(self):
project_name = self.project_list_widget.project_name()
@ -668,7 +553,7 @@ class ProjectWidget(QtWidgets.QWidget):
_project_anatomy = project_anatomy_overrides(project_name)
self.is_overidable = True
overrides = {"project": {
overrides = {self.main_schema_key: {
PROJECT_SETTINGS_KEY: lib.convert_overrides_to_gui_data(
_project_overrides
),
@ -682,103 +567,19 @@ class ProjectWidget(QtWidgets.QWidget):
item.apply_overrides(overrides)
self.ignore_value_changes = False
def _save_as_defaults(self):
output = {}
for item in self.input_fields:
output.update(item.config_value())
for key in reversed(self.keys):
_output = {key: output}
output = _output
all_values = {}
for item in self.input_fields:
all_values.update(item.config_value())
all_values = lib.convert_gui_data_with_metadata(all_values)
for key in reversed(self.keys):
_all_values = {key: all_values}
all_values = _all_values
# Skip first key
all_values = all_values["project"]
keys_to_file = lib.file_keys_from_schema(self.schema)
for key_sequence in keys_to_file:
# Skip first key
key_sequence = key_sequence[1:]
subpath = "/".join(key_sequence) + ".json"
new_values = all_values
for key in key_sequence:
new_values = new_values[key]
output_path = os.path.join(DEFAULTS_DIR, subpath)
dirpath = os.path.dirname(output_path)
if not os.path.exists(dirpath):
os.makedirs(dirpath)
print("Saving data to: ", subpath)
with open(output_path, "w") as file_stream:
json.dump(new_values, file_stream, indent=4)
reset_default_settings()
self._update_values()
self.hierarchical_style_update()
def items_are_valid(self):
has_invalid = False
for item in self.input_fields:
if item.child_invalid:
has_invalid = True
if not has_invalid:
return True
invalid_items = []
for item in self.input_fields:
invalid_items.extend(item.get_invalid())
msg_box = QtWidgets.QMessageBox(
QtWidgets.QMessageBox.Warning,
"Invalid input",
"There is invalid value in one of inputs."
" Please lead red color and fix them."
)
msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
msg_box.exec_()
first_invalid_item = invalid_items[0]
self.scroll_widget.ensureWidgetVisible(first_invalid_item)
if first_invalid_item.isVisible():
first_invalid_item.setFocus(True)
return False
def _on_refresh(self):
self.reset()
def _on_hide_studio_overrides(self, state):
self._hide_studio_overrides = (state == QtCore.Qt.Checked)
self._update_values()
self.hierarchical_style_update()
def _save_overrides(self):
if not self.items_are_valid():
return
def save(self):
data = {}
studio_overrides = bool(self.project_name is None)
for item in self.input_fields:
if studio_overrides:
value, is_group = item.studio_overrides()
value, _is_group = item.studio_overrides()
else:
value, is_group = item.overrides()
value, _is_group = item.overrides()
if value is not lib.NOT_SET:
data.update(value)
output_data = lib.convert_gui_data_to_overrides(
data.get("project") or {}
data.get(self.main_schema_key) or {}
)
# Saving overrides data
@ -796,11 +597,9 @@ class ProjectWidget(QtWidgets.QWidget):
# Update saved values
self._update_values()
def _update_values(self):
self.ignore_value_changes = True
def update_values(self):
default_values = lib.convert_data_to_gui_data(
{"project": default_settings()}
{self.main_schema_key: default_settings()}
)
for input_field in self.input_fields:
input_field.update_default_values(default_values)
@ -808,12 +607,12 @@ class ProjectWidget(QtWidgets.QWidget):
if self._hide_studio_overrides:
studio_values = lib.NOT_SET
else:
studio_values = lib.convert_overrides_to_gui_data({"project": {
PROJECT_SETTINGS_KEY: studio_project_settings(),
PROJECT_ANATOMY_KEY: studio_project_anatomy()
}})
studio_values = lib.convert_overrides_to_gui_data({
self.main_schema_key: {
PROJECT_SETTINGS_KEY: studio_project_settings(),
PROJECT_ANATOMY_KEY: studio_project_anatomy()
}
})
for input_field in self.input_fields:
input_field.update_studio_values(studio_values)
self.ignore_value_changes = False