From 2f201af0b08a1ba24ffae9b7df4c44d4e986db6f Mon Sep 17 00:00:00 2001 From: Jann Stute Date: Mon, 23 Dec 2024 16:56:38 +0100 Subject: [PATCH] feat: implement proper tab order --- tagstudio/src/qt/modals/build_tag.py | 27 +++++++++++++++++++++++---- tagstudio/src/qt/widgets/panel.py | 8 +++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/tagstudio/src/qt/modals/build_tag.py b/tagstudio/src/qt/modals/build_tag.py index 25bec810..da92adcf 100644 --- a/tagstudio/src/qt/modals/build_tag.py +++ b/tagstudio/src/qt/modals/build_tag.py @@ -106,6 +106,8 @@ class BuildTagPanel(PanelWidget): self.aliases_table.verticalHeader().setVisible(False) self.aliases_table.horizontalHeader().setStretchLastSection(True) self.aliases_table.setColumnWidth(0, 35) + self.aliases_table.setTabKeyNavigation(False) + self.aliases_table.setFocusPolicy(Qt.FocusPolicy.NoFocus) self.alias_add_button = QPushButton() self.alias_add_button.setText("+") @@ -131,6 +133,7 @@ class BuildTagPanel(PanelWidget): self.subtags_scroll_layout.setAlignment(Qt.AlignmentFlag.AlignTop) self.scroll_area = QScrollArea() + self.scroll_area.setFocusPolicy(Qt.FocusPolicy.NoFocus) # self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn) self.scroll_area.setWidgetResizable(True) self.scroll_area.setFrameShadow(QFrame.Shadow.Plain) @@ -268,7 +271,7 @@ class BuildTagPanel(PanelWidget): while self.subtags_scroll_layout.itemAt(0): self.subtags_scroll_layout.takeAt(0).widget().deleteLater() - last: QWidget = self.alias_add_button + last: QWidget = self.aliases_table.cellWidget(self.aliases_table.rowCount() - 1, 1) c = QWidget() layout = QVBoxLayout(c) layout.setContentsMargins(0, 0, 0, 0) @@ -281,7 +284,7 @@ class BuildTagPanel(PanelWidget): self.setTabOrder(last, tw.bg_button) last = tw.bg_button self.subtags_scroll_layout.addWidget(c) - self.setTabOrder(last, self.subtags_add_button) + self.setTabOrder(last, self.name_field) def add_aliases(self): names: set[str] = set() @@ -316,6 +319,7 @@ class BuildTagPanel(PanelWidget): self.alias_names.clear() + last: QWidget = self.panel_save_button or self.color_field for alias_id in self.alias_ids: alias = self.lib.get_alias(self.tag.id, alias_id) @@ -342,6 +346,12 @@ class BuildTagPanel(PanelWidget): self.aliases_table.setCellWidget(row, 1, new_item) self.aliases_table.setCellWidget(row, 0, remove_btn) + self.setTabOrder(last, self.aliases_table.cellWidget(row, 1)) + self.setTabOrder( + self.aliases_table.cellWidget(row, 1), self.aliases_table.cellWidget(row, 0) + ) + last = self.aliases_table.cellWidget(row, 0) + def _alias_name_change(self, item: CustomTableItem): self.new_alias_names[item.id] = item.text() @@ -369,8 +379,6 @@ class BuildTagPanel(PanelWidget): self.color_field.setCurrentIndex(i) break - self.name_field.selectAll() - def on_name_changed(self): is_empty = not self.name_field.text().strip() @@ -396,3 +404,14 @@ class BuildTagPanel(PanelWidget): logger.info("built tag", tag=tag) return tag + + def parent_post_init(self): + self.setTabOrder(self.name_field, self.shorthand_field) + self.setTabOrder(self.shorthand_field, self.alias_add_button) + self.setTabOrder(self.alias_add_button, self.subtags_add_button) + self.setTabOrder(self.subtags_add_button, self.color_field) + self.setTabOrder(self.color_field, self.panel_cancel_button) + self.setTabOrder(self.panel_cancel_button, self.panel_save_button) + self.setTabOrder(self.panel_save_button, self.aliases_table.cellWidget(0, 1)) + self.name_field.selectAll() + self.name_field.setFocus() diff --git a/tagstudio/src/qt/widgets/panel.py b/tagstudio/src/qt/widgets/panel.py index b164acc9..344fc8fb 100755 --- a/tagstudio/src/qt/widgets/panel.py +++ b/tagstudio/src/qt/widgets/panel.py @@ -15,7 +15,7 @@ class PanelModal(QWidget): # figure out what you want from this. def __init__( self, - widget, + widget: "PanelWidget", title: str, window_title: str, done_callback: Callable | None = None, @@ -88,8 +88,10 @@ class PanelModal(QWidget): self.root_layout.addWidget(self.title_widget) self.root_layout.addWidget(widget) + widget.parent_modal = self self.root_layout.setStretch(1, 2) self.root_layout.addWidget(self.button_container) + widget.parent_post_init() def closeEvent(self, event): # noqa: N802 self.done_button.click() @@ -100,6 +102,7 @@ class PanelWidget(QWidget): """Used for widgets that go in a modal panel, ex. for editing or searching.""" done = Signal() + parent_modal: PanelModal = None panel_save_button: QPushButton | None = None panel_cancel_button: QPushButton | None = None panel_done_button: QPushButton | None = None @@ -113,5 +116,8 @@ class PanelWidget(QWidget): def reset(self): pass + def parent_post_init(self): + pass + def add_callback(self, callback: Callable, event: str = "returnPressed"): logging.warning(f"add_callback not implemented for {self.__class__.__name__}")