diff --git a/cropro.py b/cropro.py index 9e710ad..5069fcc 100644 --- a/cropro.py +++ b/cropro.py @@ -175,7 +175,7 @@ def __init__(self, ankimw: AnkiQt): self._add_tooltips() def _add_global_shortcuts(self): - QShortcut(QKeySequence("Ctrl+k"), self, activated=lambda: self.visible_search_bar().set_focus()) # type: ignore + QShortcut(QKeySequence("Ctrl+k"), self, activated=lambda: self.visible_search_bar().bar.focus_search_edit()) # type: ignore QShortcut(QKeySequence("Ctrl+i"), self, activated=lambda: self.import_button.click()) # type: ignore QShortcut(QKeySequence("Ctrl+l"), self, activated=lambda: self.note_list.set_focus()) # type: ignore @@ -216,7 +216,7 @@ def setup_menubar(self): help_menu.addAction("Create sentence bank: subs2srs", lambda: openLink(SUBS2SRS_LINK)) def _send_query_to_browser(self): - search_text = self.visible_search_bar().search_text() + search_text = self.visible_search_bar().bar.search_text() if not search_text: return tooltip("Nothing to do.", parent=self) browser = aqt.dialogs.open("Browser", mw) @@ -485,11 +485,11 @@ def closeEvent(self, event: QCloseEvent) -> None: def _activate_enabled_search_bar(self): if config.search_the_web: self.remote_search_bar.show() - self.remote_search_bar.set_focus() + self.remote_search_bar.bar.focus_search_edit() self.search_bar.hide() else: self.search_bar.show() - self.search_bar.set_focus() + self.search_bar.bar.focus_search_edit() self.remote_search_bar.hide() def _open_cropro_settings(self): @@ -503,7 +503,7 @@ def on_profile_will_close(self): def on_profile_did_open(self): # clean state from the previous profile if it was set. self.search_bar.clear_all() - self.remote_search_bar.clear_search_text() + self.remote_search_bar.bar.clear_search_text() self.note_list.clear_notes() # setup search bar self.populate_other_profile_names() @@ -515,7 +515,7 @@ def on_profile_did_open(self): def search_for(self, search_text: str) -> None: self.show() self.setFocus() - self.visible_search_bar().set_search_text(search_text) + self.visible_search_bar().bar.set_search_text(search_text) self.visible_search_bar().search_requested.emit(search_text) def setup_browser_menu(self, browser: Browser) -> None: diff --git a/widgets/remote_search_bar.py b/widgets/remote_search_bar.py index b7d0e4d..66128b7 100644 --- a/widgets/remote_search_bar.py +++ b/widgets/remote_search_bar.py @@ -6,12 +6,15 @@ from aqt.qt import * + try: + from .search_bar import CroProSearchBar from ..remote_search import get_request_url from .utils import CroProComboBox, CroProLineEdit, CroProPushButton, CroProSpinBox except ImportError: from utils import CroProComboBox, CroProLineEdit, CroProPushButton, CroProSpinBox from remote_search import get_request_url + from search_bar import CroProSearchBar @dataclasses.dataclass @@ -42,7 +45,6 @@ class RemoteSearchBar(QWidget): def __init__(self): super().__init__() - self._keyword_edit = CroProLineEdit() # keyword self._category_combo = new_combo_box( [ RemoteComboBoxItem(None, "all"), @@ -69,7 +71,7 @@ def __init__(self): key="jlpt", ) - self._search_button = CroProPushButton("Search") + self.bar = CroProSearchBar() self._setup_layout() self._connect_elements() @@ -85,18 +87,9 @@ def sort_combo(self) -> QComboBox: def jlpt_level_combo(self) -> QComboBox: return self._jlpt_level_combo - def search_text(self) -> str: - return self._keyword_edit.text().strip() - - def set_search_text(self, search_text: str) -> None: - return self._keyword_edit.setText(search_text) - - def clear_search_text(self) -> None: - return self._keyword_edit.clear() - def get_request_args(self) -> dict[str, str]: args = {} - if keyword := self.search_text(): + if keyword := self.bar.search_text(): args["keyword"] = keyword for widget in (self._sort_combo, self._category_combo, self._jlpt_level_combo): if param := widget.currentData().http_arg: @@ -106,16 +99,12 @@ def get_request_args(self) -> dict[str, str]: def get_request_url(self) -> str: return get_request_url(self.get_request_args()) - def set_focus(self): - self._keyword_edit.setFocus() - def _setup_layout(self) -> None: self.setLayout(layout := QVBoxLayout()) layout.addLayout(self._make_search_settings_box()) - layout.addLayout(self._make_filter_row()) - self._keyword_edit.setPlaceholderText("") + layout.addWidget(self.bar) self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Maximum) - self.set_focus() + self.bar.focus_search_edit() def _make_search_settings_box(self) -> QLayout: layout = QHBoxLayout() @@ -127,20 +116,13 @@ def _make_search_settings_box(self) -> QLayout: layout.addWidget(self._jlpt_level_combo) return layout - def _make_filter_row(self) -> QLayout: - layout = QHBoxLayout() - layout.addWidget(self._keyword_edit) - layout.addWidget(self._search_button) - return layout - def _connect_elements(self): def handle_search_requested(): if self.get_request_url(): # noinspection PyUnresolvedReferences - self.search_requested.emit(self.search_text()) + self.search_requested.emit(self.bar.search_text()) - qconnect(self._search_button.clicked, handle_search_requested) - qconnect(self._keyword_edit.editingFinished, handle_search_requested) + qconnect(self.bar.search_requested, handle_search_requested) # Debug diff --git a/widgets/search_bar.py b/widgets/search_bar.py index 17d6242..cb75871 100644 --- a/widgets/search_bar.py +++ b/widgets/search_bar.py @@ -16,10 +16,54 @@ from collection_manager import NameId +class CroProSearchBar(QWidget): + """ + Shows a search bar and a submit button. + """ + # noinspection PyArgumentList + search_requested = pyqtSignal(str) + + def __init__(self): + super().__init__() + self._search_term_edit = CroProLineEdit() + self._search_button = CroProPushButton("Search") + self._setup_layout() + self._connect_elements() + + def focus_search_edit(self) -> None: + return self._search_term_edit.setFocus() + + def search_text(self) -> str: + return self._search_term_edit.text().strip() + + def set_search_text(self, search_text: str) -> None: + return self._search_term_edit.setText(search_text.strip()) + + def clear_search_text(self) -> None: + return self._search_term_edit.clear() + + def _setup_layout(self) -> None: + self._search_term_edit.setPlaceholderText("") + layout = QHBoxLayout() + layout.addWidget(self._search_term_edit) + layout.addWidget(self._search_button) + self.setLayout(layout) + + def _connect_elements(self): + def handle_search_requested(): + if text := self.search_text(): + # noinspection PyUnresolvedReferences + self.search_requested.emit(text) + + qconnect(self._search_button.clicked, handle_search_requested) + qconnect(self._search_term_edit.editingFinished, handle_search_requested) + + class ColSearchBar(QWidget): """ Search bar and search options (profile selector, deck selector, search bar, search button). """ + # noinspection PyArgumentList search_requested = pyqtSignal(str) @@ -28,8 +72,7 @@ def __init__(self, ankimw: AnkiQt): self.mw = ankimw self._other_profile_names_combo = CroProComboBox() self._other_profile_deck_combo = NameIdComboBox() - self._search_term_edit = CroProLineEdit() - self._filter_button = CroProPushButton("Filter") + self.bar = CroProSearchBar() self.selected_profile_changed = self._other_profile_names_combo.currentIndexChanged self._setup_layout() self.setEnabled(False) # disallow search until profiles and decks are set. @@ -43,12 +86,6 @@ def other_profile_names_combo(self) -> QComboBox: def other_profile_deck_combo(self) -> QComboBox: return self._other_profile_deck_combo - def search_text(self) -> str: - return self._search_term_edit.text().strip() - - def set_search_text(self, search_text: str) -> None: - return self._search_term_edit.setText(search_text) - def current_deck(self) -> NameId: return self._other_profile_deck_combo.current_item() @@ -62,7 +99,7 @@ def clear_all(self) -> None: """ self._other_profile_names_combo.clear() self._other_profile_deck_combo.clear() - self._search_term_edit.clear() + self.bar.clear_search_text() def needs_to_repopulate_profile_names(self) -> bool: """ @@ -96,13 +133,12 @@ def set_decks(self, decks: Iterable[NameId]): return self._other_profile_deck_combo.set_items(decks) def set_focus(self): - self._search_term_edit.setFocus() + self.bar.focus_search_edit() def _setup_layout(self) -> None: self.setLayout(layout := QVBoxLayout()) layout.addLayout(self._make_other_profile_settings_box()) - layout.addLayout(self._make_filter_row()) - self._search_term_edit.setPlaceholderText("") + layout.addWidget(self.bar) self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Maximum) self.set_focus() @@ -114,21 +150,14 @@ def _make_other_profile_settings_box(self) -> QLayout: layout.addWidget(self._other_profile_deck_combo) return layout - def _make_filter_row(self) -> QLayout: - layout = QHBoxLayout() - layout.addWidget(self._search_term_edit) - layout.addWidget(self._filter_button) - return layout - def _connect_elements(self): def handle_search_requested(): - if text := self.search_text(): + if text := self.bar.search_text(): # noinspection PyUnresolvedReferences self.search_requested.emit(text) qconnect(self._other_profile_deck_combo.currentIndexChanged, handle_search_requested) - qconnect(self._filter_button.clicked, handle_search_requested) - qconnect(self._search_term_edit.editingFinished, handle_search_requested) + qconnect(self.bar.search_requested, handle_search_requested) qconnect(self.selected_profile_changed, lambda row_idx: self.setEnabled(row_idx >= 0))