Skip to content

Commit

Permalink
extract class CroProSearchBar
Browse files Browse the repository at this point in the history
  • Loading branch information
tatsumoto-ren committed Mar 29, 2024
1 parent ff79533 commit 866a5ac
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 54 deletions.
12 changes: 6 additions & 6 deletions cropro.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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):
Expand All @@ -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()
Expand All @@ -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:
Expand Down
36 changes: 9 additions & 27 deletions widgets/remote_search_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"),
Expand All @@ -69,7 +71,7 @@ def __init__(self):
key="jlpt",
)

self._search_button = CroProPushButton("Search")
self.bar = CroProSearchBar()
self._setup_layout()
self._connect_elements()

Expand All @@ -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:
Expand All @@ -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("<text to search the Web>")
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()
Expand All @@ -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
Expand Down
71 changes: 50 additions & 21 deletions widgets/search_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -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("<text to filter by>")
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)

Expand All @@ -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.
Expand All @@ -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()

Expand All @@ -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:
"""
Expand Down Expand Up @@ -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("<text to filter by>")
layout.addWidget(self.bar)
self.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Maximum)
self.set_focus()

Expand All @@ -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))


Expand Down

0 comments on commit 866a5ac

Please sign in to comment.