mirror of
https://github.com/ankitects/anki.git
synced 2025-11-17 01:57:12 -05:00
move the toolbar into a separate file and make it global
This commit is contained in:
parent
f75ef69fba
commit
f2a39aad2a
11 changed files with 134 additions and 63 deletions
|
|
@ -32,6 +32,9 @@ Suba, and Xtru.
|
||||||
|
|
||||||
Anki icon by Alex Fraser (CC GNU GPL)
|
Anki icon by Alex Fraser (CC GNU GPL)
|
||||||
Deck icon by Laurent Baumann (CC BY-NC-SA 3.0)
|
Deck icon by Laurent Baumann (CC BY-NC-SA 3.0)
|
||||||
|
Deck browser icons from:
|
||||||
|
http://led24.de/iconset
|
||||||
|
http://p.yusukekamiyamane.com/
|
||||||
Other icons under LGPL or public domain.
|
Other icons under LGPL or public domain.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,6 @@ body { margin: 1em; }
|
||||||
|
|
||||||
_body = """
|
_body = """
|
||||||
<center>
|
<center>
|
||||||
<h1>%(title)s</h1>
|
|
||||||
<table cellspacing=0 cellpading=3 width=100%%>
|
<table cellspacing=0 cellpading=3 width=100%%>
|
||||||
%(tree)s
|
%(tree)s
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -98,12 +97,10 @@ body { margin: 1em; }
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
def _dueImg(self, due, new):
|
def _dueImg(self, due, new):
|
||||||
if due and new:
|
if due:
|
||||||
i = "both"
|
i = "clock-icon"
|
||||||
elif due:
|
|
||||||
i = "green"
|
|
||||||
elif new:
|
elif new:
|
||||||
i = "blue"
|
i = "plus-circle"
|
||||||
else:
|
else:
|
||||||
i = "none"
|
i = "none"
|
||||||
return '<img valign=bottom src="qrc:/icons/%s.png">' % i
|
return '<img valign=bottom src="qrc:/icons/%s.png">' % i
|
||||||
|
|
|
||||||
22
aqt/main.py
22
aqt/main.py
|
|
@ -15,7 +15,7 @@ from anki.utils import stripHTML, checksum, isWin, isMac
|
||||||
from anki.hooks import runHook, addHook, removeHook
|
from anki.hooks import runHook, addHook, removeHook
|
||||||
import anki.consts
|
import anki.consts
|
||||||
|
|
||||||
import aqt, aqt.progress, aqt.webview
|
import aqt, aqt.progress, aqt.webview, aqt.toolbar
|
||||||
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
|
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
|
||||||
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
|
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
|
||||||
askUserDialog, applyStyles, getText, showText, showCritical, getFile
|
askUserDialog, applyStyles, getText, showText, showCritical, getFile
|
||||||
|
|
@ -182,8 +182,10 @@ Are you sure?"""):
|
||||||
restoreState(self, "mainWindow")
|
restoreState(self, "mainWindow")
|
||||||
else:
|
else:
|
||||||
self.resize(500, 400)
|
self.resize(500, 400)
|
||||||
|
# toolbar needs to be retranslated
|
||||||
|
self.toolbar.draw()
|
||||||
|
# show and raise window for osx
|
||||||
self.show()
|
self.show()
|
||||||
# raise window for osx
|
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
self.raise_()
|
self.raise_()
|
||||||
# maybe sync
|
# maybe sync
|
||||||
|
|
@ -312,14 +314,23 @@ title="%s">%s</button>''' % (
|
||||||
# main window
|
# main window
|
||||||
self.form = aqt.forms.main.Ui_MainWindow()
|
self.form = aqt.forms.main.Ui_MainWindow()
|
||||||
self.form.setupUi(self)
|
self.form.setupUi(self)
|
||||||
self.web = aqt.webview.AnkiWebView(self.form.centralwidget)
|
# toolbar
|
||||||
|
tweb = aqt.webview.AnkiWebView()
|
||||||
|
tweb.setObjectName("toolbarWeb")
|
||||||
|
tweb.setFocusPolicy(Qt.WheelFocus)
|
||||||
|
tweb.setFixedHeight(32)
|
||||||
|
self.toolbar = aqt.toolbar.Toolbar(self, tweb)
|
||||||
|
# main area
|
||||||
|
self.web = aqt.webview.AnkiWebView()
|
||||||
self.web.setObjectName("mainText")
|
self.web.setObjectName("mainText")
|
||||||
self.web.setFocusPolicy(Qt.WheelFocus)
|
self.web.setFocusPolicy(Qt.WheelFocus)
|
||||||
|
# add in a layout
|
||||||
self.mainLayout = QVBoxLayout()
|
self.mainLayout = QVBoxLayout()
|
||||||
self.mainLayout.addWidget(self.web)
|
|
||||||
self.mainLayout.setContentsMargins(0,0,0,0)
|
self.mainLayout.setContentsMargins(0,0,0,0)
|
||||||
|
self.mainLayout.setSpacing(0)
|
||||||
|
self.mainLayout.addWidget(tweb)
|
||||||
|
self.mainLayout.addWidget(self.web)
|
||||||
self.form.centralwidget.setLayout(self.mainLayout)
|
self.form.centralwidget.setLayout(self.mainLayout)
|
||||||
addHook("undoEnd", self.maybeEnableUndo)
|
|
||||||
|
|
||||||
def closeAllWindows(self):
|
def closeAllWindows(self):
|
||||||
aqt.dialogs.closeAll()
|
aqt.dialogs.closeAll()
|
||||||
|
|
@ -607,6 +618,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
|
||||||
aqt.studyopts.StudyOptions(self)
|
aqt.studyopts.StudyOptions(self)
|
||||||
|
|
||||||
def onOverview(self):
|
def onOverview(self):
|
||||||
|
self.col.reset()
|
||||||
self.moveToState("overview")
|
self.moveToState("overview")
|
||||||
|
|
||||||
def onGroups(self, parent=None):
|
def onGroups(self, parent=None):
|
||||||
|
|
|
||||||
|
|
@ -67,25 +67,7 @@ class Overview(object):
|
||||||
shareLink = '<a class=smallLink href="review">Reviews and Updates</a>'
|
shareLink = '<a class=smallLink href="review">Reviews and Updates</a>'
|
||||||
else:
|
else:
|
||||||
shareLink = ""
|
shareLink = ""
|
||||||
header = """
|
header = ""
|
||||||
<table id=header width=100%%>
|
|
||||||
<tr>
|
|
||||||
<td width=20%>
|
|
||||||
<a class="hitem" href="anki">Anki ▾</a>
|
|
||||||
</td>
|
|
||||||
<td align=center>
|
|
||||||
<a class=hitem href="decks">Decks</a>
|
|
||||||
<a class=hitem href="study">Study</a>
|
|
||||||
<a class=hitem href="add">Add</a>
|
|
||||||
<a class=hitem href="browse">Browse</a>
|
|
||||||
</td>
|
|
||||||
<td width=20% align=right>
|
|
||||||
<a class=hitem href="stats"><img src="qrc:/icons/view-statistics.png"></a>
|
|
||||||
<a class=hitem href="sync"><img src="qrc:/icons/view-refresh.png"></a>
|
|
||||||
</td></tr></table>
|
|
||||||
<div id=headerSpace></div>
|
|
||||||
""" #% deck['name']
|
|
||||||
|
|
||||||
self.web.stdHtml(self._overviewBody % dict(
|
self.web.stdHtml(self._overviewBody % dict(
|
||||||
title=_("Overview"),
|
title=_("Overview"),
|
||||||
table=tbl,
|
table=tbl,
|
||||||
|
|
@ -134,29 +116,6 @@ $(function () {
|
||||||
.sub { font-size: 80%; color: #555; }
|
.sub { font-size: 80%; color: #555; }
|
||||||
.smallLink { font-size: 12px; }
|
.smallLink { font-size: 12px; }
|
||||||
h3 { margin-bottom: 0; }
|
h3 { margin-bottom: 0; }
|
||||||
#headerSpace { height: 22px; }
|
|
||||||
#header {
|
|
||||||
z-index: 100;
|
|
||||||
position: fixed;
|
|
||||||
height: 22px;
|
|
||||||
font-size: 12px;
|
|
||||||
margin:0;
|
|
||||||
background: -webkit-gradient(linear, left top, left bottom,
|
|
||||||
from(#ddd), to(#fff));
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
body { margin: 0; }
|
|
||||||
.deck { }
|
|
||||||
.hitem { display: inline-block; padding: 4px; padding-right: 6px;
|
|
||||||
text-decoration: none; color: #000;
|
|
||||||
}
|
|
||||||
.hborder { border: 1px solid #ddd; }
|
|
||||||
.hitem:hover {
|
|
||||||
background: #333;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
.icon { padding-top: 2px; }
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _overviewTable(self):
|
def _overviewTable(self):
|
||||||
|
|
|
||||||
|
|
@ -526,6 +526,7 @@ div#filler {
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def _setupStatus(self):
|
def _setupStatus(self):
|
||||||
|
return
|
||||||
self._statusWidgets = []
|
self._statusWidgets = []
|
||||||
sb = self.mw.form.statusbar
|
sb = self.mw.form.statusbar
|
||||||
def addWgt(w, stretch=0):
|
def addWgt(w, stretch=0):
|
||||||
|
|
|
||||||
102
aqt/toolbar.py
Normal file
102
aqt/toolbar.py
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
# Copyright: Damien Elmes <anki@ichi2.net>
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.webview import AnkiWebView
|
||||||
|
|
||||||
|
class Toolbar(object):
|
||||||
|
|
||||||
|
def __init__(self, mw, web):
|
||||||
|
self.mw = mw
|
||||||
|
self.web = web
|
||||||
|
self.web.page().mainFrame().setScrollBarPolicy(
|
||||||
|
Qt.Vertical, Qt.ScrollBarAlwaysOff)
|
||||||
|
self.web.setLinkHandler(self._linkHandler)
|
||||||
|
self.draw()
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
body = self._body % (self._centerLinks(), self._rightIcons())
|
||||||
|
self.web.stdHtml(body, self._css)
|
||||||
|
|
||||||
|
# Available links
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
centerLinks = [
|
||||||
|
["decks", "Decks"],
|
||||||
|
["study", "Study"],
|
||||||
|
["add", "Add"],
|
||||||
|
["browse", "Browse"],
|
||||||
|
]
|
||||||
|
|
||||||
|
rightIcons = [
|
||||||
|
["stats", "qrc:/icons/view-statistics.png"],
|
||||||
|
["sync", "qrc:/icons/view-refresh.png"],
|
||||||
|
]
|
||||||
|
|
||||||
|
def _centerLinks(self):
|
||||||
|
buf = ""
|
||||||
|
for ln, name in self.centerLinks:
|
||||||
|
buf += '<a class=hitem href="%s">%s</a>' % (ln, _(name))
|
||||||
|
return buf
|
||||||
|
|
||||||
|
def _rightIcons(self):
|
||||||
|
buf = ""
|
||||||
|
for ln, icon in self.rightIcons:
|
||||||
|
buf += '<a class=hitem href="%s"><img src="%s"></a>' % (
|
||||||
|
ln, icon)
|
||||||
|
return buf
|
||||||
|
|
||||||
|
# Link handling
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
def _linkHandler(self, l):
|
||||||
|
if l == "anki":
|
||||||
|
self.showMenu()
|
||||||
|
elif l == "decks":
|
||||||
|
self.mw.moveToState("deckBrowser")
|
||||||
|
elif l == "study":
|
||||||
|
self.mw.onOverview()
|
||||||
|
elif l == "add":
|
||||||
|
self.mw.onAddCard()
|
||||||
|
elif l == "browse":
|
||||||
|
self.mw.onBrowse()
|
||||||
|
elif l == "stats":
|
||||||
|
self.mw.onStats()
|
||||||
|
elif l == "sync":
|
||||||
|
self.mw.onSync()
|
||||||
|
|
||||||
|
# HTML & CSS
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
_body = """
|
||||||
|
<table id=header width=100%%>
|
||||||
|
<tr>
|
||||||
|
<td width=20%%><a class="hitem" href="anki">Anki ▾</a></td>
|
||||||
|
<td align=center>%s</td>
|
||||||
|
<td width=20%% align=right>%s</td>
|
||||||
|
</tr></table>
|
||||||
|
"""
|
||||||
|
|
||||||
|
_css = """
|
||||||
|
#header {
|
||||||
|
font-size: 12px;
|
||||||
|
margin:0;
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom,
|
||||||
|
from(#ddd), to(#fff));
|
||||||
|
font-weight: bold;
|
||||||
|
height: 10px;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
body { margin: 0; padding: 0; }
|
||||||
|
|
||||||
|
.hitem { display: inline-block; padding: 4px; padding-right: 6px;
|
||||||
|
text-decoration: none; color: #000;
|
||||||
|
}
|
||||||
|
.hitem:hover {
|
||||||
|
background: #333;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
@ -28,8 +28,8 @@ class Bridge(QObject):
|
||||||
|
|
||||||
class AnkiWebPage(QWebPage):
|
class AnkiWebPage(QWebPage):
|
||||||
|
|
||||||
def __init__(self, parent, jsErr):
|
def __init__(self, jsErr):
|
||||||
QWebPage.__init__(self, parent)
|
QWebPage.__init__(self)
|
||||||
self._jsErr = jsErr
|
self._jsErr = jsErr
|
||||||
def javaScriptConsoleMessage(self, msg, line, srcID):
|
def javaScriptConsoleMessage(self, msg, line, srcID):
|
||||||
self._jsErr(msg, line, srcID)
|
self._jsErr(msg, line, srcID)
|
||||||
|
|
@ -38,11 +38,11 @@ class AnkiWebPage(QWebPage):
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
class AnkiWebView(QWebView):
|
class AnkiWebView(QWebView):
|
||||||
def __init__(self, parent):
|
def __init__(self):
|
||||||
QWebView.__init__(self, parent)
|
QWebView.__init__(self)
|
||||||
self.setObjectName("mainText")
|
self.setObjectName("mainText")
|
||||||
self._bridge = Bridge()
|
self._bridge = Bridge()
|
||||||
self._page = AnkiWebPage(parent, self._jsErr)
|
self._page = AnkiWebPage(self._jsErr)
|
||||||
self._loadFinishedCB = None
|
self._loadFinishedCB = None
|
||||||
self.setPage(self._page)
|
self.setPage(self._page)
|
||||||
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
|
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@
|
||||||
<file>icons/blue.png</file>
|
<file>icons/blue.png</file>
|
||||||
<file>icons/both.png</file>
|
<file>icons/both.png</file>
|
||||||
<file>icons/green.png</file>
|
<file>icons/green.png</file>
|
||||||
|
<file>icons/clock-icon.png</file>
|
||||||
|
<file>icons/plus-circle.png</file>
|
||||||
<file>icons/none.png</file>
|
<file>icons/none.png</file>
|
||||||
<file>icons/edit-find 2.png</file>
|
<file>icons/edit-find 2.png</file>
|
||||||
<file>icons/edit-find-replace.png</file>
|
<file>icons/edit-find-replace.png</file>
|
||||||
|
|
|
||||||
BIN
designer/icons/clock-icon.png
Normal file
BIN
designer/icons/clock-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 831 B |
BIN
designer/icons/plus-circle.png
Normal file
BIN
designer/icons/plus-circle.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
|
|
@ -137,11 +137,6 @@
|
||||||
<addaction name="menu_Settings"/>
|
<addaction name="menu_Settings"/>
|
||||||
<addaction name="menuHelp"/>
|
<addaction name="menuHelp"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusbar">
|
|
||||||
<property name="sizeGripEnabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<action name="actionExit">
|
<action name="actionExit">
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue