anki/qt/aqt/toolbar.py

143 lines
3.9 KiB
Python
Raw Normal View History

2019-02-05 04:59:03 +01:00
# Copyright: Ankitects Pty Ltd and contributors
# -*- coding: utf-8 -*-
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from __future__ import annotations
from typing import Dict
import aqt
2019-03-04 02:58:34 +01:00
from anki.lang import _
from aqt import gui_hooks
2019-12-20 10:19:03 +01:00
from aqt.qt import *
from aqt.webview import AnkiWebView
2019-12-20 10:19:03 +01:00
# wrapper class for set_bridge_command()
class TopToolbar:
def __init__(self, toolbar: Toolbar):
self.toolbar = toolbar
# wrapper class for set_bridge_command()
class BottomToolbar:
def __init__(self, toolbar: Toolbar):
self.toolbar = toolbar
class Toolbar:
def __init__(self, mw: aqt.AnkiQt, web: AnkiWebView) -> None:
self.mw = mw
self.web = web
self.link_handlers: Dict[str, Callable] = {
"decks": self._deckLinkHandler,
"study": self._studyLinkHandler,
"add": self._addLinkHandler,
"browse": self._browseLinkHandler,
2012-12-23 04:28:06 +01:00
"stats": self._statsLinkHandler,
"sync": self._syncLinkHandler,
}
self.web.setFixedHeight(30)
self.web.requiresCol = False
def draw(self):
self.web.set_bridge_command(self._linkHandler, TopToolbar(self))
2019-12-23 01:34:10 +01:00
self.web.stdHtml(self._body % self._centerLinks(), css=["toolbar.css"])
self.web.adjustHeightToFit()
# Available links
######################################################################
def addLink(
self, name: str, cmd: str, func: Callable, tip: str = "",
):
self.link_handlers[cmd] = func
return (cmd, name, tip)
def _centerLinks(self):
links = [
("decks", _("Decks"), _("Shortcut key: %s") % "D"),
("add", _("Add"), _("Shortcut key: %s") % "A"),
("browse", _("Browse"), _("Shortcut key: %s") % "B"),
("stats", _("Stats"), _("Shortcut key: %s") % "T"),
("sync", _("Sync"), _("Shortcut key: %s") % "Y"),
]
gui_hooks.top_toolbar_did_init_links(links, self)
return self._linkHTML(links)
def _linkHTML(self, links):
buf = ""
for ln, name, title in links:
2019-12-23 01:34:10 +01:00
buf += """
<a class=hitem tabindex="-1" aria-label="%s" title="%s" href=# onclick="return pycmd('%s')">%s</a>""" % (
name,
title,
ln,
name,
)
return buf
# Link handling
######################################################################
def _linkHandler(self, link):
if link in self.link_handlers:
self.link_handlers[link]()
return False
def _deckLinkHandler(self):
2012-12-23 04:28:06 +01:00
self.mw.moveToState("deckBrowser")
def _studyLinkHandler(self):
2012-12-23 04:28:06 +01:00
# if overview already shown, switch to review
if self.mw.state == "overview":
self.mw.col.startTimebox()
self.mw.moveToState("review")
else:
2019-03-04 07:54:22 +01:00
self.mw.onOverview()
def _addLinkHandler(self):
2012-12-23 04:28:06 +01:00
self.mw.onAddCard()
def _browseLinkHandler(self):
2012-12-23 04:28:06 +01:00
self.mw.onBrowse()
def _statsLinkHandler(self):
2012-12-23 04:28:06 +01:00
self.mw.onStats()
def _syncLinkHandler(self):
2012-12-23 04:28:06 +01:00
self.mw.onSync()
# HTML & CSS
######################################################################
_body = """
2016-06-07 06:27:33 +02:00
<center id=outer>
<table id=header width=100%%>
<tr>
<td class=tdcenter align=center>%s</td>
</tr></table>
2016-06-07 06:27:33 +02:00
</center>
"""
2019-12-23 01:34:10 +01:00
# Bottom bar
######################################################################
2019-12-23 01:34:10 +01:00
class BottomBar(Toolbar):
_centerBody = """
2016-06-07 06:27:33 +02:00
<center id=outer><table width=100%% id=header><tr><td align=center>
%s</td></tr></table></center>
"""
def draw(self, buf):
# note: some screens may override this
self.web.set_bridge_command(self._linkHandler, BottomToolbar(self))
self.web.stdHtml(
2019-12-23 01:34:10 +01:00
self._centerBody % buf, css=["toolbar.css", "toolbar-bottom.css"]
)
self.web.adjustHeightToFit()