diff --git a/src/tagstudio/qt/views/clickable_label.py b/src/tagstudio/qt/controllers/clickable_label.py similarity index 100% rename from src/tagstudio/qt/views/clickable_label.py rename to src/tagstudio/qt/controllers/clickable_label.py diff --git a/src/tagstudio/qt/controllers/edit_field_template_modal.py b/src/tagstudio/qt/controllers/edit_field_template_modal.py index 0194b960..662649b7 100644 --- a/src/tagstudio/qt/controllers/edit_field_template_modal.py +++ b/src/tagstudio/qt/controllers/edit_field_template_modal.py @@ -21,13 +21,13 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): "TextFieldTemplate": Translations["field_type.text"], "DatetimeFieldTemplate": Translations["field_type.datetime"], } + DEFAULT_TYPE_INDEX = 0 def __init__(self, field_template: BaseFieldTemplate | None = None) -> None: super().__init__() self.__field_id: int | None = field_template.id if field_template else None self.__field_name: str = "" self.__field_type: str | None = field_template.class_name if field_template else None - self.__text_field_is_multiline: bool = False self.old_field_type: str = "" for k, v in EditFieldTemplateModal.field_type_map.items(): @@ -35,6 +35,7 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): self.__connect_callbacks() self.set_field_template(field_template) + self.__on_type_changed(EditFieldTemplateModal.DEFAULT_TYPE_INDEX) def __connect_callbacks(self) -> None: self.name_field.textChanged.connect(self.__on_name_changed) @@ -47,7 +48,9 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): # Indicates a new template, set default values if field_template is None: self.__field_name = Translations["field_template.new"] - self.__field_type = list(EditFieldTemplateModal.field_type_map.keys())[0] # First index + self.__field_type = list(EditFieldTemplateModal.field_type_map.keys())[ + EditFieldTemplateModal.DEFAULT_TYPE_INDEX + ] return # Populate common values for any field type else: @@ -63,7 +66,7 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): # Populate values for specific field types if isinstance(field_template, TextFieldTemplate): - self.__text_field_is_multiline = field_template.is_multiline + self._multiline_checkbox.setChecked(field_template.is_multiline) def __on_name_changed(self): is_empty = not self.name_field.text().strip() @@ -78,14 +81,26 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): self.panel_save_button.setDisabled(is_empty) def __on_type_changed(self, index: int): + old_type = self.__field_type self.__field_type = list(EditFieldTemplateModal.field_type_map.keys())[index] + if old_type == self.__field_type: + logger.info(f"old type {old_type}, new type {self.__field_type}") + return + + if old_type == "TextFieldTemplate": + self._text_field_attributes_widget.hide() + # NOTE: Future options specific to other type will go here. + + if self.__field_type == "TextFieldTemplate": + self._text_field_attributes_widget.show() + def build_field_template(self) -> BaseFieldTemplate: if self.__field_type == "TextFieldTemplate": return TextFieldTemplate( id=self.__field_id, name=self.name_field.text(), - is_multiline=self.__text_field_is_multiline, + is_multiline=self._multiline_checkbox.isChecked(), ) elif self.__field_type == "DatetimeFieldTemplate": return DatetimeFieldTemplate( @@ -100,17 +115,5 @@ class EditFieldTemplateModal(EditFieldTemplateModalView): ) return TextFieldTemplate( name=self.name_field.text(), - is_multiline=self.__text_field_is_multiline, + is_multiline=self._multiline_checkbox.isChecked(), ) - - # def parent_post_init(self): - # self.setTabOrder(self.name_field, self.shorthand_field) - # self.setTabOrder(self.shorthand_field, self.aliases_add_button) - # self.setTabOrder(self.aliases_add_button, self.parent_tags_add_button) - # self.setTabOrder(self.parent_tags_add_button, self.color_button) - # self.setTabOrder(self.color_button, unwrap(self.panel_cancel_button)) - # self.setTabOrder(unwrap(self.panel_cancel_button), unwrap(self.panel_save_button)) - # self.setTabOrder(unwrap(self.panel_save_button), self.aliases_table.cellWidget(0, 1)) - # self.name_field.selectAll() - # self.name_field.setFocus() - # self._set_aliases() diff --git a/src/tagstudio/qt/mixed/landing.py b/src/tagstudio/qt/mixed/landing.py index 7f5f6ba7..c6e8ff53 100644 --- a/src/tagstudio/qt/mixed/landing.py +++ b/src/tagstudio/qt/mixed/landing.py @@ -12,9 +12,9 @@ from PySide6.QtCore import QEasingCurve, QPoint, QPropertyAnimation, Qt from PySide6.QtGui import QPixmap from PySide6.QtWidgets import QLabel, QPushButton, QVBoxLayout, QWidget +from tagstudio.qt.controllers.clickable_label import ClickableLabel from tagstudio.qt.helpers.color_overlay import gradient_overlay, theme_fg_overlay from tagstudio.qt.translations import Translations -from tagstudio.qt.views.clickable_label import ClickableLabel # Only import for type checking/autocompletion, will not be imported at runtime. if typing.TYPE_CHECKING: diff --git a/src/tagstudio/qt/views/edit_field_template_modal_view.py b/src/tagstudio/qt/views/edit_field_template_modal_view.py index 36f7c90d..e4dafd67 100644 --- a/src/tagstudio/qt/views/edit_field_template_modal_view.py +++ b/src/tagstudio/qt/views/edit_field_template_modal_view.py @@ -5,15 +5,19 @@ import structlog from PySide6.QtCore import Qt from PySide6.QtWidgets import ( + QCheckBox, QComboBox, + QHBoxLayout, QLabel, QLineEdit, QVBoxLayout, QWidget, ) +from tagstudio.qt.controllers.clickable_label import ClickableLabel from tagstudio.qt.translations import Translations from tagstudio.qt.views.panel_modal import PanelWidget +from tagstudio.qt.views.stylesheets.stylesheets import checkbox_style logger = structlog.get_logger(__name__) @@ -28,7 +32,7 @@ class EditFieldTemplateModalView(PanelWidget): self.root_layout.setContentsMargins(6, 0, 6, 0) self.root_layout.setAlignment(Qt.AlignmentFlag.AlignTop) - # Field Name ------------------------------------------------------------------------------- + # Field Name self._name_widget = QWidget() self._name_layout = QVBoxLayout(self._name_widget) self._name_layout.setStretch(1, 1) @@ -42,7 +46,7 @@ class EditFieldTemplateModalView(PanelWidget): self.name_field.setPlaceholderText(Translations["field.field_name_required"]) self._name_layout.addWidget(self.name_field) - # Field Type ------------------------------------------------------------------------------- + # Field Type self._type_widget = QWidget() self._type_layout = QVBoxLayout(self._type_widget) self._type_layout.setStretch(1, 1) @@ -52,8 +56,36 @@ class EditFieldTemplateModalView(PanelWidget): self._type_title = QLabel(Translations["field.type"]) self._type_layout.addWidget(self._type_title) self._type_combobox = QComboBox() + self._type_combobox.setMinimumWidth(120) self._type_layout.addWidget(self._type_combobox) + # Text Field Attributes -------------------------------------------------------------------- + self._text_field_attributes_widget = QWidget() + self._text_field_attributes_layout = QHBoxLayout(self._text_field_attributes_widget) + self._text_field_attributes_layout.setStretch(1, 1) + self._text_field_attributes_layout.setContentsMargins(0, 0, 0, 0) + self._text_field_attributes_layout.setSpacing(6) + + # Is Multiline + self._multiline_widget = QWidget() + self._multiline_layout = QHBoxLayout(self._multiline_widget) + self._multiline_layout.setStretch(1, 1) + self._multiline_layout.setContentsMargins(0, 0, 0, 0) + self._multiline_layout.setSpacing(6) + self._multiline_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self._multiline_title = ClickableLabel(Translations["field.text.is_multiline"]) + self._multiline_checkbox = QCheckBox() + self._multiline_checkbox.setFixedSize(22, 22) + self._multiline_checkbox.setStyleSheet(checkbox_style()) + self._multiline_title.clicked.connect(self._multiline_checkbox.click) + self._multiline_layout.addWidget(self._multiline_checkbox) + self._multiline_layout.addWidget(self._multiline_title) + self._text_field_attributes_layout.addWidget(self._multiline_widget) + + # NOTE: Future options specific to other type will go in their own sections, + # following the pattern with text fields above. + # Add Widgets to Layout ==================================================================== self.root_layout.addWidget(self._name_widget) self.root_layout.addWidget(self._type_widget) + self.root_layout.addWidget(self._text_field_attributes_widget) diff --git a/src/tagstudio/qt/views/edit_text_view.py b/src/tagstudio/qt/views/edit_text_view.py index 2fc9eeb7..42727240 100644 --- a/src/tagstudio/qt/views/edit_text_view.py +++ b/src/tagstudio/qt/views/edit_text_view.py @@ -13,8 +13,8 @@ from PySide6.QtWidgets import ( QWidget, ) +from tagstudio.qt.controllers.clickable_label import ClickableLabel from tagstudio.qt.translations import Translations -from tagstudio.qt.views.clickable_label import ClickableLabel from tagstudio.qt.views.panel_modal import PanelWidget from tagstudio.qt.views.stylesheets.stylesheets import checkbox_style