mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 08:46:37 -04:00
Merge pull request #1238 from hgiesel/icongalore
Update icons of the browser sidebar
This commit is contained in:
commit
3581ee8f95
5 changed files with 88 additions and 24 deletions
|
@ -25,6 +25,7 @@ class SidebarItemType(Enum):
|
||||||
NOTETYPE_ROOT = auto()
|
NOTETYPE_ROOT = auto()
|
||||||
NOTETYPE = auto()
|
NOTETYPE = auto()
|
||||||
NOTETYPE_TEMPLATE = auto()
|
NOTETYPE_TEMPLATE = auto()
|
||||||
|
NOTETYPE_FIELD = auto()
|
||||||
TAG_ROOT = auto()
|
TAG_ROOT = auto()
|
||||||
TAG_NONE = auto()
|
TAG_NONE = auto()
|
||||||
TAG = auto()
|
TAG = auto()
|
||||||
|
@ -144,7 +145,10 @@ class SidebarItem:
|
||||||
SidebarItemType.CARD_STATE,
|
SidebarItemType.CARD_STATE,
|
||||||
):
|
):
|
||||||
return self.name == other.name
|
return self.name == other.name
|
||||||
elif self.item_type == SidebarItemType.NOTETYPE_TEMPLATE:
|
elif self.item_type in [
|
||||||
|
SidebarItemType.NOTETYPE_TEMPLATE,
|
||||||
|
SidebarItemType.NOTETYPE_FIELD,
|
||||||
|
]:
|
||||||
return (
|
return (
|
||||||
other.id == self.id
|
other.id == self.id
|
||||||
and other._parent_item.id == self._parent_item.id
|
and other._parent_item.id == self._parent_item.id
|
||||||
|
|
|
@ -25,6 +25,7 @@ from aqt.browser.sidebar.model import SidebarModel
|
||||||
from aqt.browser.sidebar.searchbar import SidebarSearchBar
|
from aqt.browser.sidebar.searchbar import SidebarSearchBar
|
||||||
from aqt.browser.sidebar.toolbar import SidebarTool, SidebarToolbar
|
from aqt.browser.sidebar.toolbar import SidebarTool, SidebarToolbar
|
||||||
from aqt.clayout import CardLayout
|
from aqt.clayout import CardLayout
|
||||||
|
from aqt.fields import FieldDialog
|
||||||
from aqt.flags import load_flags
|
from aqt.flags import load_flags
|
||||||
from aqt.models import Models
|
from aqt.models import Models
|
||||||
from aqt.operations import CollectionOp, QueryOp
|
from aqt.operations import CollectionOp, QueryOp
|
||||||
|
@ -521,7 +522,7 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _saved_searches_tree(self, root: SidebarItem) -> None:
|
def _saved_searches_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ":/icons/heart.svg"
|
icon = ":/icons/heart-outline.svg"
|
||||||
saved = self._get_saved_searches()
|
saved = self._get_saved_searches()
|
||||||
|
|
||||||
root = self._section_root(
|
root = self._section_root(
|
||||||
|
@ -545,7 +546,7 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _today_tree(self, root: SidebarItem) -> None:
|
def _today_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ":/icons/clock.svg"
|
icon = ":/icons/clock-outline.svg"
|
||||||
root = self._section_root(
|
root = self._section_root(
|
||||||
root=root,
|
root=root,
|
||||||
name=tr.browsing_today(),
|
name=tr.browsing_today(),
|
||||||
|
@ -615,44 +616,47 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _card_state_tree(self, root: SidebarItem) -> None:
|
def _card_state_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ColoredIcon(path=":/icons/card-state.svg", color=colors.DISABLED)
|
icon = ":/icons/circle.svg"
|
||||||
|
icon_outline = ":/icons/circle-outline.svg"
|
||||||
|
|
||||||
root = self._section_root(
|
root = self._section_root(
|
||||||
root=root,
|
root=root,
|
||||||
name=tr.browsing_sidebar_card_state(),
|
name=tr.browsing_sidebar_card_state(),
|
||||||
icon=icon,
|
icon=icon_outline,
|
||||||
collapse_key=Config.Bool.COLLAPSE_CARD_STATE,
|
collapse_key=Config.Bool.COLLAPSE_CARD_STATE,
|
||||||
type=SidebarItemType.CARD_STATE_ROOT,
|
type=SidebarItemType.CARD_STATE_ROOT,
|
||||||
)
|
)
|
||||||
type = SidebarItemType.CARD_STATE
|
type = SidebarItemType.CARD_STATE
|
||||||
|
colored_icon = ColoredIcon(path=icon, color=colors.DISABLED)
|
||||||
|
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
tr.actions_new(),
|
tr.actions_new(),
|
||||||
icon=icon.with_color(colors.NEW_COUNT),
|
icon=colored_icon.with_color(colors.NEW_COUNT),
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(card_state=SearchNode.CARD_STATE_NEW),
|
search_node=SearchNode(card_state=SearchNode.CARD_STATE_NEW),
|
||||||
)
|
)
|
||||||
|
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
name=tr.scheduling_learning(),
|
name=tr.scheduling_learning(),
|
||||||
icon=icon.with_color(colors.LEARN_COUNT),
|
icon=colored_icon.with_color(colors.LEARN_COUNT),
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(card_state=SearchNode.CARD_STATE_LEARN),
|
search_node=SearchNode(card_state=SearchNode.CARD_STATE_LEARN),
|
||||||
)
|
)
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
name=tr.scheduling_review(),
|
name=tr.scheduling_review(),
|
||||||
icon=icon.with_color(colors.REVIEW_COUNT),
|
icon=colored_icon.with_color(colors.REVIEW_COUNT),
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(card_state=SearchNode.CARD_STATE_REVIEW),
|
search_node=SearchNode(card_state=SearchNode.CARD_STATE_REVIEW),
|
||||||
)
|
)
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
name=tr.browsing_suspended(),
|
name=tr.browsing_suspended(),
|
||||||
icon=icon.with_color(colors.SUSPENDED_FG),
|
icon=colored_icon.with_color(colors.SUSPENDED_FG),
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(card_state=SearchNode.CARD_STATE_SUSPENDED),
|
search_node=SearchNode(card_state=SearchNode.CARD_STATE_SUSPENDED),
|
||||||
)
|
)
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
name=tr.browsing_buried(),
|
name=tr.browsing_buried(),
|
||||||
icon=icon.with_color(colors.BURIED_FG),
|
icon=colored_icon.with_color(colors.BURIED_FG),
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(card_state=SearchNode.CARD_STATE_BURIED),
|
search_node=SearchNode(card_state=SearchNode.CARD_STATE_BURIED),
|
||||||
)
|
)
|
||||||
|
@ -661,11 +665,13 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _flags_tree(self, root: SidebarItem) -> None:
|
def _flags_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ColoredIcon(path=":/icons/flag.svg", color=colors.DISABLED)
|
icon = ":/icons/flag.svg"
|
||||||
|
icon_outline = ":/icons/flag-outline.svg"
|
||||||
|
|
||||||
root = self._section_root(
|
root = self._section_root(
|
||||||
root=root,
|
root=root,
|
||||||
name=tr.browsing_sidebar_flags(),
|
name=tr.browsing_sidebar_flags(),
|
||||||
icon=icon,
|
icon=icon_outline,
|
||||||
collapse_key=Config.Bool.COLLAPSE_FLAGS,
|
collapse_key=Config.Bool.COLLAPSE_FLAGS,
|
||||||
type=SidebarItemType.FLAG_ROOT,
|
type=SidebarItemType.FLAG_ROOT,
|
||||||
)
|
)
|
||||||
|
@ -684,7 +690,7 @@ class SidebarTreeView(QTreeView):
|
||||||
|
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
tr.browsing_no_flag(),
|
tr.browsing_no_flag(),
|
||||||
icon=icon,
|
icon=icon_outline,
|
||||||
type=SidebarItemType.FLAG,
|
type=SidebarItemType.FLAG,
|
||||||
search_node=SearchNode(flag=SearchNode.FLAG_NONE),
|
search_node=SearchNode(flag=SearchNode.FLAG_NONE),
|
||||||
)
|
)
|
||||||
|
@ -741,7 +747,9 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _deck_tree(self, root: SidebarItem) -> None:
|
def _deck_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ":/icons/deck.svg"
|
icon = ":/icons/book-outline.svg"
|
||||||
|
icon_current = ":/icons/book-clock-outline.svg"
|
||||||
|
icon_filtered = ":/icons/book-cog-outline.svg"
|
||||||
|
|
||||||
def render(
|
def render(
|
||||||
root: SidebarItem, nodes: Iterable[DeckTreeNode], head: str = ""
|
root: SidebarItem, nodes: Iterable[DeckTreeNode], head: str = ""
|
||||||
|
@ -759,7 +767,7 @@ class SidebarTreeView(QTreeView):
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
item = SidebarItem(
|
item = SidebarItem(
|
||||||
name=node.name,
|
name=node.name,
|
||||||
icon=icon,
|
icon=icon_filtered if node.filtered else icon,
|
||||||
search_node=SearchNode(deck=head + node.name),
|
search_node=SearchNode(deck=head + node.name),
|
||||||
on_expanded=toggle_expand(node),
|
on_expanded=toggle_expand(node),
|
||||||
expanded=not node.collapsed,
|
expanded=not node.collapsed,
|
||||||
|
@ -782,7 +790,7 @@ class SidebarTreeView(QTreeView):
|
||||||
root.search_node = SearchNode(deck="_*")
|
root.search_node = SearchNode(deck="_*")
|
||||||
current = root.add_simple(
|
current = root.add_simple(
|
||||||
name=tr.browsing_current_deck(),
|
name=tr.browsing_current_deck(),
|
||||||
icon=icon,
|
icon=icon_current,
|
||||||
type=SidebarItemType.DECK_CURRENT,
|
type=SidebarItemType.DECK_CURRENT,
|
||||||
search_node=SearchNode(deck="current"),
|
search_node=SearchNode(deck="current"),
|
||||||
)
|
)
|
||||||
|
@ -794,11 +802,14 @@ class SidebarTreeView(QTreeView):
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
def _notetype_tree(self, root: SidebarItem) -> None:
|
def _notetype_tree(self, root: SidebarItem) -> None:
|
||||||
icon = ":/icons/notetype.svg"
|
notetype_icon = ":/icons/newspaper.svg"
|
||||||
|
template_icon = ":/icons/iframe-braces-outline.svg"
|
||||||
|
field_icon = ":/icons/form-textbox.svg"
|
||||||
|
|
||||||
root = self._section_root(
|
root = self._section_root(
|
||||||
root=root,
|
root=root,
|
||||||
name=tr.browsing_sidebar_notetypes(),
|
name=tr.browsing_sidebar_notetypes(),
|
||||||
icon=icon,
|
icon=notetype_icon,
|
||||||
collapse_key=Config.Bool.COLLAPSE_NOTETYPES,
|
collapse_key=Config.Bool.COLLAPSE_NOTETYPES,
|
||||||
type=SidebarItemType.NOTETYPE_ROOT,
|
type=SidebarItemType.NOTETYPE_ROOT,
|
||||||
)
|
)
|
||||||
|
@ -807,7 +818,7 @@ class SidebarTreeView(QTreeView):
|
||||||
for nt in sorted(self.col.models.all(), key=lambda nt: nt["name"].lower()):
|
for nt in sorted(self.col.models.all(), key=lambda nt: nt["name"].lower()):
|
||||||
item = SidebarItem(
|
item = SidebarItem(
|
||||||
nt["name"],
|
nt["name"],
|
||||||
icon,
|
notetype_icon,
|
||||||
search_node=SearchNode(note=nt["name"]),
|
search_node=SearchNode(note=nt["name"]),
|
||||||
item_type=SidebarItemType.NOTETYPE,
|
item_type=SidebarItemType.NOTETYPE,
|
||||||
id=nt["id"],
|
id=nt["id"],
|
||||||
|
@ -816,7 +827,7 @@ class SidebarTreeView(QTreeView):
|
||||||
for c, tmpl in enumerate(nt["tmpls"]):
|
for c, tmpl in enumerate(nt["tmpls"]):
|
||||||
child = SidebarItem(
|
child = SidebarItem(
|
||||||
tmpl["name"],
|
tmpl["name"],
|
||||||
icon,
|
template_icon,
|
||||||
search_node=self.col.group_searches(
|
search_node=self.col.group_searches(
|
||||||
SearchNode(note=nt["name"]), SearchNode(template=c)
|
SearchNode(note=nt["name"]), SearchNode(template=c)
|
||||||
),
|
),
|
||||||
|
@ -826,6 +837,18 @@ class SidebarTreeView(QTreeView):
|
||||||
)
|
)
|
||||||
item.add_child(child)
|
item.add_child(child)
|
||||||
|
|
||||||
|
for c, fld in enumerate(nt["flds"]):
|
||||||
|
child = SidebarItem(
|
||||||
|
fld["name"],
|
||||||
|
field_icon,
|
||||||
|
search_node=self.col.group_searches(
|
||||||
|
SearchNode(note=nt["name"]), SearchNode(field_name=fld["name"])
|
||||||
|
),
|
||||||
|
item_type=SidebarItemType.NOTETYPE_FIELD,
|
||||||
|
id=fld["ord"],
|
||||||
|
)
|
||||||
|
item.add_child(child)
|
||||||
|
|
||||||
root.add_child(item)
|
root.add_child(item)
|
||||||
|
|
||||||
# Context menu
|
# Context menu
|
||||||
|
@ -855,6 +878,8 @@ class SidebarTreeView(QTreeView):
|
||||||
)
|
)
|
||||||
elif item.item_type == SidebarItemType.NOTETYPE_TEMPLATE:
|
elif item.item_type == SidebarItemType.NOTETYPE_TEMPLATE:
|
||||||
menu.addAction(tr.notetypes_cards(), lambda: self.manage_template(item))
|
menu.addAction(tr.notetypes_cards(), lambda: self.manage_template(item))
|
||||||
|
elif item.item_type == SidebarItemType.NOTETYPE_FIELD:
|
||||||
|
menu.addAction(tr.notetypes_fields(), lambda: self.manage_fields(item))
|
||||||
elif item.item_type == SidebarItemType.SAVED_SEARCH_ROOT:
|
elif item.item_type == SidebarItemType.SAVED_SEARCH_ROOT:
|
||||||
menu.addAction(
|
menu.addAction(
|
||||||
tr.browsing_sidebar_save_current_search(), self.save_current_search
|
tr.browsing_sidebar_save_current_search(), self.save_current_search
|
||||||
|
@ -1096,6 +1121,10 @@ class SidebarTreeView(QTreeView):
|
||||||
note = Note(self.col, self.col.models.get(NotetypeId(item._parent_item.id)))
|
note = Note(self.col, self.col.models.get(NotetypeId(item._parent_item.id)))
|
||||||
CardLayout(self.mw, note, ord=item.id, parent=self, fill_empty=True)
|
CardLayout(self.mw, note, ord=item.id, parent=self, fill_empty=True)
|
||||||
|
|
||||||
|
def manage_fields(self, item: SidebarItem) -> None:
|
||||||
|
notetype = self.mw.col.models.get(NotetypeId(item._parent_item.id))
|
||||||
|
FieldDialog(self.mw, notetype, parent=self, open_at=item.id)
|
||||||
|
|
||||||
# Helpers
|
# Helpers
|
||||||
####################################
|
####################################
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,11 @@ from aqt.utils import (
|
||||||
|
|
||||||
class FieldDialog(QDialog):
|
class FieldDialog(QDialog):
|
||||||
def __init__(
|
def __init__(
|
||||||
self, mw: AnkiQt, nt: NotetypeDict, parent: Optional[QWidget] = None
|
self,
|
||||||
|
mw: AnkiQt,
|
||||||
|
nt: NotetypeDict,
|
||||||
|
parent: Optional[QWidget] = None,
|
||||||
|
open_at: int = 0,
|
||||||
) -> None:
|
) -> None:
|
||||||
QDialog.__init__(self, parent or mw)
|
QDialog.__init__(self, parent or mw)
|
||||||
self.mw = mw
|
self.mw = mw
|
||||||
|
@ -47,7 +51,7 @@ class FieldDialog(QDialog):
|
||||||
self.setupSignals()
|
self.setupSignals()
|
||||||
self.form.fieldList.setDragDropMode(QAbstractItemView.InternalMove)
|
self.form.fieldList.setDragDropMode(QAbstractItemView.InternalMove)
|
||||||
self.form.fieldList.dropEvent = self.onDrop # type: ignore[assignment]
|
self.form.fieldList.dropEvent = self.onDrop # type: ignore[assignment]
|
||||||
self.form.fieldList.setCurrentRow(0)
|
self.form.fieldList.setCurrentRow(open_at)
|
||||||
self.exec_()
|
self.exec_()
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -1,8 +1,35 @@
|
||||||
load("//ts:vendor.bzl", "copy_mdi_icons")
|
load("//ts:vendor.bzl", "copy_mdi_icons", "copy_bootstrap_icons")
|
||||||
|
|
||||||
copy_mdi_icons(
|
copy_mdi_icons(
|
||||||
name = "mdi-icons",
|
name = "mdi-icons",
|
||||||
icons = [
|
icons = [
|
||||||
|
# saved searches
|
||||||
|
"heart-outline.svg",
|
||||||
|
|
||||||
|
# today
|
||||||
|
"clock-outline.svg",
|
||||||
|
|
||||||
|
# state
|
||||||
|
"circle.svg",
|
||||||
|
"circle-outline.svg",
|
||||||
|
|
||||||
|
# flags
|
||||||
|
"flag.svg",
|
||||||
|
"flag-outline.svg",
|
||||||
|
|
||||||
|
# decks
|
||||||
|
"book-outline.svg",
|
||||||
|
"book-clock-outline.svg",
|
||||||
|
"book-cog-outline.svg",
|
||||||
|
|
||||||
|
# notetypes
|
||||||
|
"newspaper.svg",
|
||||||
|
# cardtype
|
||||||
|
"iframe-braces-outline.svg",
|
||||||
|
# fields
|
||||||
|
"form-textbox.svg",
|
||||||
|
|
||||||
|
# tags
|
||||||
"tag-outline.svg",
|
"tag-outline.svg",
|
||||||
"tag-off-outline.svg",
|
"tag-off-outline.svg",
|
||||||
],
|
],
|
||||||
|
|
|
@ -42,7 +42,7 @@ impl TryFrom<pb::SearchNode> for Node {
|
||||||
}),
|
}),
|
||||||
Filter::FieldName(s) => Node::Search(SearchNode::SingleField {
|
Filter::FieldName(s) => Node::Search(SearchNode::SingleField {
|
||||||
field: escape_anki_wildcards_for_search_node(&s),
|
field: escape_anki_wildcards_for_search_node(&s),
|
||||||
text: "*".to_string(),
|
text: "_*".to_string(),
|
||||||
is_re: false,
|
is_re: false,
|
||||||
}),
|
}),
|
||||||
Filter::Rated(rated) => Node::Search(SearchNode::Rated {
|
Filter::Rated(rated) => Node::Search(SearchNode::Rated {
|
||||||
|
|
Loading…
Reference in a new issue