diff --git a/ftl/core/browsing.ftl b/ftl/core/browsing.ftl
index d2af15637..4050fd634 100644
--- a/ftl/core/browsing.ftl
+++ b/ftl/core/browsing.ftl
@@ -4,6 +4,7 @@ browsing-add-tags2 = Add Tags...
browsing-added-today = Added Today
browsing-addon = Add-on
browsing-again-today = Again Today
+browsing-edited-today = Edited Today
browsing-all-card-types = All Card Types
browsing-all-fields = All Fields
browsing-answer = Answer
@@ -34,7 +35,6 @@ browsing-ease = Ease
browsing-end = End
browsing-enter-tags-to-add = Enter tags to add:
browsing-enter-tags-to-delete = Enter tags to delete:
-browsing-filter = Filter...
browsing-filtered = (filtered)
browsing-find = Find:
browsing-find-and-replace = Find and Replace
@@ -127,3 +127,8 @@ browsing-sidebar-tags = Tags
browsing-sidebar-notetypes = Note Types
browsing-sidebar-saved-searches = Saved Searches
browsing-sidebar-save-current-search = Save Current Search
+browsing-sidebar-card-state = Card State
+browsing-sidebar-flags = Flags
+browsing-sidebar-recent = Recent
+browsing-sidebar-due-today = Due Today
+browsing-sidebar-due-tomorrow = Due Tomorrow
diff --git a/ftl/core/filtering.ftl b/ftl/core/filtering.ftl
deleted file mode 100644
index 1564e1570..000000000
--- a/ftl/core/filtering.ftl
+++ /dev/null
@@ -1,2 +0,0 @@
-# True if a card is due/ready for review
-filtering-is-due = Due
diff --git a/pylib/anki/types.py b/pylib/anki/types.py
index 1783afc67..210a62c74 100644
--- a/pylib/anki/types.py
+++ b/pylib/anki/types.py
@@ -2,4 +2,5 @@ from typing import NoReturn
def assert_exhaustive(arg: NoReturn) -> NoReturn:
+ """The type definition will cause mypy to tell us if we've missed an enum case."""
raise Exception(f"unexpected arg received: {type(arg)} {arg}")
diff --git a/qt/aqt/__init__.py b/qt/aqt/__init__.py
index fdadd0ec9..040c643fd 100644
--- a/qt/aqt/__init__.py
+++ b/qt/aqt/__init__.py
@@ -488,6 +488,7 @@ def _run(argv: Optional[List[str]] = None, exec: bool = True) -> Optional[AnkiAp
# opt in to full hidpi support?
if not os.environ.get("ANKI_NOHIGHDPI"):
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
+ QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
os.environ["QT_SCALE_FACTOR_ROUNDING_POLICY"] = "PassThrough"
diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py
index 1b9460476..a55094e62 100644
--- a/qt/aqt/browser.py
+++ b/qt/aqt/browser.py
@@ -33,8 +33,6 @@ from aqt.theme import theme_manager
from aqt.utils import (
TR,
HelpPage,
- MenuList,
- SubMenu,
askUser,
disable_help_button,
getTag,
@@ -63,10 +61,6 @@ from aqt.utils import (
)
from aqt.webview import AnkiWebView
-# legacy add-on support
-# pylint: disable=unused-import
-from aqt.sidebar import SidebarItem, SidebarStage # isort: skip
-
@dataclass
class FindDupesDialog:
@@ -486,7 +480,6 @@ class Browser(QMainWindow):
# pylint: disable=unnecessary-lambda
# actions
f = self.form
- qconnect(f.filter.clicked, self.onFilterButton)
# edit
qconnect(f.actionUndo.triggered, self.mw.onUndo)
qconnect(f.actionInvertSelection.triggered, self.invertSelection)
@@ -978,34 +971,15 @@ QTableView {{ gridline-color: {grid} }}
self.showSidebar()
self.sidebar.searchBar.setFocus()
- # legacy
- def maybeRefreshSidebar(self) -> None:
- self.sidebar.refresh()
-
def toggle_sidebar(self) -> None:
want_visible = not self.sidebarDockWidget.isVisible()
self.sidebarDockWidget.setVisible(want_visible)
if want_visible:
self.sidebar.refresh()
- # Filter button and sidebar helpers
+ # Sidebar helpers
######################################################################
- def onFilterButton(self) -> None:
- ml = MenuList()
-
- ml.addChild(self._todayFilters())
- ml.addChild(self._cardStateFilters())
- ml.addSeparator()
-
- toggle_sidebar = QAction(tr(TR.BROWSING_SIDEBAR))
- qconnect(toggle_sidebar.triggered, self.toggle_sidebar)
- toggle_sidebar.setCheckable(True)
- toggle_sidebar.setChecked(self.sidebarDockWidget.isVisible())
- ml.addChild(toggle_sidebar)
-
- ml.popupOver(self.form.filter)
-
def update_search(self, *terms: Union[str, SearchTerm]) -> None:
"""Modify the current search string based on modified keys, then refresh."""
try:
@@ -1030,84 +1004,6 @@ QTableView {{ gridline-color: {grid} }}
def setFilter(self, *terms: str) -> None:
self.set_filter_then_search(*terms)
- def _simpleFilters(self, items: Sequence[Tuple[str, SearchTerm]]) -> MenuList:
- ml = MenuList()
- for row in items:
- if row is None:
- ml.addSeparator()
- else:
- label, filter_name = row
- ml.addItem(label, self.sidebar._filter_func(filter_name))
- return ml
-
- def _todayFilters(self) -> SubMenu:
- subm = SubMenu(tr(TR.BROWSING_TODAY))
- subm.addChild(
- self._simpleFilters(
- (
- (tr(TR.BROWSING_ADDED_TODAY), SearchTerm(added_in_days=1)),
- (
- tr(TR.BROWSING_STUDIED_TODAY),
- SearchTerm(rated=SearchTerm.Rated(days=1)),
- ),
- (
- tr(TR.BROWSING_AGAIN_TODAY),
- SearchTerm(
- rated=SearchTerm.Rated(
- days=1, rating=SearchTerm.RATING_AGAIN
- )
- ),
- ),
- )
- )
- )
- return subm
-
- def _cardStateFilters(self) -> SubMenu:
- subm = SubMenu(tr(TR.BROWSING_CARD_STATE))
- subm.addChild(
- self._simpleFilters(
- (
- (
- tr(TR.ACTIONS_NEW),
- SearchTerm(card_state=SearchTerm.CARD_STATE_NEW),
- ),
- (
- tr(TR.SCHEDULING_LEARNING),
- SearchTerm(card_state=SearchTerm.CARD_STATE_LEARN),
- ),
- (
- tr(TR.SCHEDULING_REVIEW),
- SearchTerm(card_state=SearchTerm.CARD_STATE_REVIEW),
- ),
- (
- tr(TR.FILTERING_IS_DUE),
- SearchTerm(card_state=SearchTerm.CARD_STATE_DUE),
- ),
- None,
- (
- tr(TR.BROWSING_SUSPENDED),
- SearchTerm(card_state=SearchTerm.CARD_STATE_SUSPENDED),
- ),
- (
- tr(TR.BROWSING_BURIED),
- SearchTerm(card_state=SearchTerm.CARD_STATE_BURIED),
- ),
- None,
- (tr(TR.ACTIONS_RED_FLAG), SearchTerm(flag=SearchTerm.FLAG_RED)),
- (
- tr(TR.ACTIONS_ORANGE_FLAG),
- SearchTerm(flag=SearchTerm.FLAG_ORANGE),
- ),
- (tr(TR.ACTIONS_GREEN_FLAG), SearchTerm(flag=SearchTerm.FLAG_GREEN)),
- (tr(TR.ACTIONS_BLUE_FLAG), SearchTerm(flag=SearchTerm.FLAG_BLUE)),
- (tr(TR.BROWSING_NO_FLAG), SearchTerm(flag=SearchTerm.FLAG_NONE)),
- (tr(TR.BROWSING_ANY_FLAG), SearchTerm(flag=SearchTerm.FLAG_ANY)),
- )
- )
- )
- return subm
-
# Info
######################################################################
diff --git a/qt/aqt/colors.py b/qt/aqt/colors.py
new file mode 120000
index 000000000..37fcf5a36
--- /dev/null
+++ b/qt/aqt/colors.py
@@ -0,0 +1 @@
+../../bazel-bin/qt/aqt/colors.py
\ No newline at end of file
diff --git a/qt/aqt/forms/browser.ui b/qt/aqt/forms/browser.ui
index d2cf92f50..ffed2649f 100644
--- a/qt/aqt/forms/browser.ui
+++ b/qt/aqt/forms/browser.ui
@@ -91,7 +91,7 @@
0
- -
+
-
@@ -107,13 +107,6 @@
- -
-
-
- BROWSING_FILTER
-
-
-
-
@@ -151,12 +144,12 @@
false
-
- false
-
20
+
+ false
+
true
@@ -216,7 +209,7 @@
0
0
750
- 21
+ 24