From b745567bb3c27e281b4d10bc95ee5d71266eebb8 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Wed, 30 Nov 2011 17:54:55 +0900 Subject: [PATCH] add another toolbar at the bottom --- aqt/__init__.py | 2 +- aqt/browser.py | 15 +++++----- aqt/deckbrowser.py | 36 ++++++++++++++++------- aqt/main.py | 10 ++++++- aqt/overview.py | 9 +++++- aqt/reviewer.py | 1 + aqt/toolbar.py | 52 ++++++++++++++++++++++++++------- designer/icons/clock-icon.png | Bin 831 -> 3496 bytes designer/icons/plus-circle.png | Bin 3541 -> 3566 bytes 9 files changed, 93 insertions(+), 32 deletions(-) diff --git a/aqt/__init__.py b/aqt/__init__.py index 30e0dd967..d8851bb60 100644 --- a/aqt/__init__.py +++ b/aqt/__init__.py @@ -4,11 +4,11 @@ import os, sys from aqt.qt import * -appName="Anki" appVersion="2.0-alpha2" appWebsite="http://ankisrs.net/" appHelpSite="http://ankisrs.net/docs/dev/" appDonate="http://ankisrs.net/support/" +appShared="http://test.ankiweb.net/shared/decks/" mw = None # set on init moduleDir = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0] diff --git a/aqt/browser.py b/aqt/browser.py index 281668a9b..c12d166c7 100644 --- a/aqt/browser.py +++ b/aqt/browser.py @@ -1415,21 +1415,22 @@ Are you sure you want to continue?""")): ###################################################################### class BrowserToolbar(Toolbar): - always = [ - ["setDeck", "Move to Deck"], - ["addTags", "Add Tags"], - ["remTags", "Remove Tags"], - ] def __init__(self, mw, web, browser): self.browser = browser Toolbar.__init__(self, mw, web) + def _centerLinks(self): + links = [ + ["setDeck", _("Move to Deck")], + ["addTags", _("Add Tags")], + ["remTags", _("Remove Tags")], + ] + return self._linkHTML(links) + def draw(self): mark = self.browser.isMarked() pause = self.browser.isSuspended() - links = self.always[:] - self.centerLinks = links def borderImg(link, icon, on): if on: fmt = '''\ diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py index 0fa206db1..4623711c5 100644 --- a/aqt/deckbrowser.py +++ b/aqt/deckbrowser.py @@ -3,13 +3,15 @@ # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html from aqt.qt import * -from aqt.utils import askUser, getOnlyText +from aqt.utils import askUser, getOnlyText, openLink +import aqt class DeckBrowser(object): def __init__(self, mw): self.mw = mw self.web = mw.web + self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) def show(self, _init=True): if _init: @@ -28,18 +30,10 @@ class DeckBrowser(object): self._selDeck(arg) elif cmd == "opts": self._showOptions(arg) - elif cmd == "download": - self.mw.onGetSharedDeck() - elif cmd == "new": - self.mw.onNew() + elif cmd == "shared": + self._onShared() elif cmd == "import": self.mw.onImport() - elif cmd == "opensel": - self.mw.onOpen() - elif cmd == "synced": - self.mw.onOpenOnline() - elif cmd == "refresh": - self.refresh() def _selDeck(self, did): self.mw.col.decks.select(did) @@ -74,6 +68,7 @@ body { margin: 1em; } self.web.stdHtml(self._body%dict( title=_("Decks"), tree=tree), css=css) + self._drawButtons() def _renderDeckTree(self, nodes, depth=0): if not nodes: @@ -136,3 +131,22 @@ body { margin: 1em; } Are you sure you wish to delete all of the cards in %s?""")%deck['name']): self.mw.col.decks.rem(did, True) self.show() + + # Top buttons + ###################################################################### + + def _drawButtons(self): + links = [ + ["shared", _("Get Shared")], + ["import", _("Import File")], + ] + buf = "" + for b in links: + buf += "" % tuple(b) + self.bottom.draw(buf) + self.bottom.web.setFixedHeight(32) + self.bottom.web.setLinkHandler(self._linkHandler) + + def _onShared(self): + print "fixme: check & warn if schema modified first" + openLink(aqt.appShared) diff --git a/aqt/main.py b/aqt/main.py index 1a98059a8..e0a92800e 100755 --- a/aqt/main.py +++ b/aqt/main.py @@ -326,12 +326,20 @@ title="%s">%s''' % ( self.web.setObjectName("mainText") self.web.setFocusPolicy(Qt.WheelFocus) self.web.setMinimumWidth(400) + # bottom area + sweb = self.bottomWeb = aqt.webview.AnkiWebView() + #sweb.hide() + sweb.setFixedHeight(100) + sweb.setObjectName("bottomWeb") + sweb.setFocusPolicy(Qt.WheelFocus) + sweb.stdHtml("foo") # add in a layout self.mainLayout = QVBoxLayout() self.mainLayout.setContentsMargins(0,0,0,0) self.mainLayout.setSpacing(0) self.mainLayout.addWidget(tweb) self.mainLayout.addWidget(self.web) + self.mainLayout.addWidget(sweb) self.form.centralwidget.setLayout(self.mainLayout) def closeAllWindows(self): @@ -738,7 +746,7 @@ Please choose a new deck name:""")) self.enableDeckMenuItems(enabled=False) def updateTitleBar(self): - self.setWindowTitle(aqt.appName) + self.setWindowTitle("Anki") # Auto update ########################################################################## diff --git a/aqt/overview.py b/aqt/overview.py index 753470bc0..f2440de84 100644 --- a/aqt/overview.py +++ b/aqt/overview.py @@ -7,6 +7,7 @@ from aqt.qt import * from anki.consts import NEW_CARDS_RANDOM from anki.hooks import addHook from aqt.utils import showInfo +import aqt class Overview(object): "Deck overview." @@ -14,6 +15,7 @@ class Overview(object): def __init__(self, mw): self.mw = mw self.web = mw.web + self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) addHook("reset", self.refresh) def show(self): @@ -23,8 +25,9 @@ class Overview(object): def refresh(self): self._renderPage() + self._renderBottom() - # Handlers + # Handlers ############################################################ def _keyHandler(self, evt): @@ -127,4 +130,8 @@ h3 { margin-bottom: 0; } td { font-size: 14px; } """ + # Bottom area + ###################################################################### + def _renderBottom(self): + self.bottom.draw("hello") diff --git a/aqt/reviewer.py b/aqt/reviewer.py index 4ba30398f..6e7481a5d 100644 --- a/aqt/reviewer.py +++ b/aqt/reviewer.py @@ -23,6 +23,7 @@ class Reviewer(object): self.state = None self.keep = False self._setupStatus() + self.bottom = aqt.toolbar.BottomBar(mw, mw.bottomWeb) addHook("leech", self.onLeech) def show(self): diff --git a/aqt/toolbar.py b/aqt/toolbar.py index 523b12960..0f1bc21be 100644 --- a/aqt/toolbar.py +++ b/aqt/toolbar.py @@ -25,22 +25,24 @@ class Toolbar(object): # 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): + links = [ + ["decks", _("Decks")], + ["study", _("Study")], + ["add", _("Add")], + ["browse", _("Browse")], + ] + return self._linkHTML(links) + + def _linkHTML(self, links): buf = "" - for ln, name in self.centerLinks: - buf += '%s' % (ln, _(name)) + for ln, name in links: + buf += '%s' % (ln, name) buf += " "*3 return buf @@ -89,12 +91,16 @@ 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; } +body { +margin: 0; padding: 0; +-webkit-user-select: none; +} + +* { -webkit-user-drag: none; } .hitem { display: inline-block; padding: 4px; padding-right: 6px; text-decoration: none; color: #000; @@ -104,3 +110,27 @@ background: #333; color: #fff; } """ + +class BottomBar(Toolbar): + + _css = Toolbar._css + """ +#header { +background: -webkit-gradient(linear, left top, left bottom, +from(#fff), to(#ddd)); +border-bottom: 0; +border-top: 1px solid #aaa; +font-weight: normal; +margin-bottom: 6px; +} +""" + + _centerBody = """ +
+""" + + def draw(self, buf): + self.web.show() + self.web.stdHtml( + self._centerBody % buf, + self._css) diff --git a/designer/icons/clock-icon.png b/designer/icons/clock-icon.png index 0d2cab13829ea7cfbdf7e76174eb015c27d24c5e..24bd3b5c16ab82c0ff1aa4862b5e3462715993f9 100644 GIT binary patch delta 3495 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 diff --git a/designer/icons/plus-circle.png b/designer/icons/plus-circle.png index 2d0bc6365852a17e429c52e9d96a22c892343bbe..4fc5b8c81fec7628530ed728af50e6630a66902c 100644 GIT binary patch delta 858 zcmV-g1Eu`c8}1vhq6&W=2oyWwjW{>}00S&ZL_t(I%T1HtPupb_#y{`-{q{@giWDZ4 z5u-xKtZSxpn`D9TYqF7%7_QvdCVJr?&F=%=Z!J<Fx$+ zyIUtcb;16@;cG#uw2Abb4^J#Dr%|ewIh!k^RORqIC{=$UpDzPYsVJVTWQcZmO(<<5 zHb%DxTaQJS5^3ta7TIjJCejshc^B7J>=&Pd(E!xdA7^XZ=6tj*g3;}^);dt!uTUuD zXlQ8U(@)-GH&f!Eq{!u5Y+G{u>L5}|EK4x;MVvwb+;R(A>wv9|mP#3nQItw$Hj{g3 z4IW!y+ckgDq1dtnh8ovsgEm^)m}EQJSYK^HD zq}Dq5_hvrP+Tuf1U2NNjlnzqbN6xj{K}rXJ))pUI+r@;|Iw_4&3-f>cHXT0IjP3Da zv_eW7c)2!61Om`Fb$+@+O(d2dP8*{Ztjun5FBE?Yc{2H?`b!tPPOm)Op;|5=q~y`k zGZq&A!Jtsp5+0|4vC%X965seb^ zPKQ!o4e>wxnb=vqe}Cq7Zg=fLwOX1}s*(muA{L8TKma%n_$|u{2w{bU5G@Ar@|}%N kX{}eau4aKEumfcO1qD)sg}Wl7wg3PC07*qoM6N<$f|rSAgCG;di4W2-A3DW{4p+NY z=}NQF*)7I7)>_l7Y0_nB^8J0U522fZIa}Jj)0|Nty2*!UHM1)=4$?cVD-ELKh zq4F>Qq6HCM7TkPh{!~^~an7Nt_-tbLzIP*m^AB#=J%3+RpdkkF=)F zkFB2V==xxyE?kc#t?I~*GN{A;By0!>l4y$B;Ggpm`%oh4|F zg73i>-zd)?k)evl`x8AUVXQtmbtv6`1a&UzgEck)u#`%c`5Pfr zA>`M@zQ=!-*be~&fF-DDj1RUL@B&){I_H(vGwYo@9}8VeCmwq1c*CCAt7U)CyMV{9Q$;RK<^c=b1JlItYb|_t zuJXNB#z%j?aC+8LRrYo7zvC)%W^SR|yfYl_S}nA&x)y<80ki=ACX)uJ6A3qA8V{TB-h)r}zWhRepNaDTe!1+@voq(%TqQM)D~_vH zazHs*lF6h8M1f|YLBx-W_;JK+cdqu%A{0=URcsoq=4*Xe0rLL=_lIPSME9K)00000 LNkvXXu0mjfj9{IA