Merge branch 'master' into install-local-addons

This commit is contained in:
Aristotelis 2019-02-23 09:27:17 +01:00 committed by GitHub
commit ff7b06fbda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 73 additions and 25 deletions

View File

@ -417,7 +417,7 @@ insert into cards values (?,?,?,?,?,?,0,0,?,0,0,0,0,0,0,0,0,"")""",
# type 0 - when previewing in add dialog, only non-empty
# type 1 - when previewing edit, only existing
# type 2 - when previewing in models dialog, all templates
def previewCards(self, note, type=0):
def previewCards(self, note, type=0, did=None):
if type == 0:
cms = self.findTemplates(note)
elif type == 1:
@ -428,19 +428,23 @@ insert into cards values (?,?,?,?,?,?,0,0,?,0,0,0,0,0,0,0,0,"")""",
return []
cards = []
for template in cms:
cards.append(self._newCard(note, template, 1, flush=False))
cards.append(self._newCard(note, template, 1, flush=False, did=did))
return cards
def _newCard(self, note, template, due, flush=True):
def _newCard(self, note, template, due, flush=True, did=None):
"Create a new card."
card = anki.cards.Card(self)
card.nid = note.id
card.ord = template['ord']
# Use template did (deck override) if valid, otherwise model did
if template['did'] and str(template['did']) in self.decks.decks:
card.did = template['did']
else:
card.did = note.model()['did']
card.did = self.db.scalar("select did from cards where nid = ? and ord = ?", card.nid, card.ord)
# Use template did (deck override) if valid, otherwise did in argument, otherwise model did
if not card.did:
if template['did'] and str(template['did']) in self.decks.decks:
card.did = template['did']
elif did:
card.did = did
else:
card.did = note.model()['did']
# if invalid did, use default instead
deck = self.decks.get(card.did)
if deck['dyn']:

View File

@ -10,6 +10,7 @@ import requests
from anki.db import DB, DBError
from anki.utils import ids2str, intTime, json, platDesc, checksum, devMode
from anki.consts import *
from aqt.utils import versionWithBuild
from .hooks import runHook
import anki
from .lang import ngettext
@ -585,7 +586,7 @@ class RemoteServer(HttpSyncer):
)
ret = self.req(
"meta", io.BytesIO(json.dumps(dict(
v=SYNC_VER, cv="ankidesktop,%s,%s"%(anki.version, platDesc()))).encode("utf8")),
v=SYNC_VER, cv="ankidesktop,%s,%s"%(versionWithBuild(), platDesc()))).encode("utf8")),
badAuthRaises=False)
if not ret:
# invalid auth

View File

@ -117,6 +117,7 @@ system. It's free and open source.")
"黃文龍",
"David Bailey",
"Arman High",
"Arthur Milchior",
))
abouttext += '<p>' + _("Written by Damien Elmes, with patches, translation,\

View File

@ -316,7 +316,7 @@ Are you sure you want to continue?"""
updated = []
for dir, ts in mods:
sid = str(dir)
if self.addonMeta(sid).get("mod") < ts:
if self.addonMeta(sid).get("mod",0) < ts:
updated.append(sid)
return updated
@ -426,6 +426,7 @@ class AddonsDialog(QDialog):
self.form.addonList.currentRowChanged.connect(self._onAddonItemSelected)
self.setAcceptDrops(True)
self.redrawAddons()
restoreGeom(self, "addons")
self.show()
def dragEnterEvent(self, event):
@ -446,6 +447,10 @@ class AddonsDialog(QDialog):
paths.append(path)
self.onInstallFiles(paths)
def reject(self):
saveGeom(self, "addons")
return QDialog.reject(self)
def redrawAddons(self):
self.addons = [(self.annotatedName(d), d) for d in self.mgr.allAddons()]
self.addons.sort()

View File

@ -61,7 +61,10 @@ class CardLayout(QDialog):
self.setFocus()
def redraw(self):
self.cards = self.col.previewCards(self.note, 2)
did = None
if hasattr(self.parent,"deckChooser"):
did = self.parent.deckChooser.selectedId()
self.cards = self.col.previewCards(self.note, 2, did=did)
idx = self.ord
if idx >= len(self.cards):
self.ord = len(self.cards) - 1

View File

@ -30,8 +30,8 @@ class EditCurrent(QDialog):
addHook("reset", self.onReset)
self.mw.requireReset()
self.show()
# reset focus after open
self.mw.progress.timer(100, self.editor.web.setFocus, False)
# reset focus after open, taking care not to retain webview
self.mw.progress.timer(100, lambda: self.editor.web.setFocus(), False)
def onReset(self):
# lazy approach for now: throw away edits

View File

@ -3,10 +3,12 @@
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import sys, traceback
import html
import re
from anki.lang import _
from aqt.qt import *
from aqt.utils import showText, showWarning
from aqt import mw
if not os.environ.get("DEBUG"):
def excepthook(etype,val,tb):
@ -121,16 +123,29 @@ report the issue on the <a href="https://help.ankiweb.net/discussions/add-ons/">
add-ons section</a> of our support site.
<p>Debug info:</p>
""")
""")
if self.mw.addonManager.dirty:
txt = pluginText
error = self._supportText() + self._addonText(error) + "\n" + error
else:
txt = stdText
error = self._supportText() + "\n" + error
# show dialog
error = self._supportText() + "\n" + error
txt = txt + "<div style='white-space: pre-wrap'>" + error + "</div>"
showText(txt, type="html")
showText(txt, type="html", copyBtn=True)
def _addonText(self, error):
matches = re.findall(r"addons21/(.*?)/", error)
if not matches:
return ""
# reverse to list most likely suspect first, dict to deduplicate:
addons = [mw.addonManager.addonName(i) for i in
dict.fromkeys(reversed(matches))]
txt = _("""Add-ons possibly involved: {}\n""")
# highlight importance of first add-on:
addons[0] = "<b>{}</b>".format(addons[0])
return txt.format(", ".join(addons))
def _supportText(self):
import platform

View File

@ -1171,11 +1171,19 @@ will be lost. Continue?"""))
d.silentlyClose = True
frm = aqt.forms.debug.Ui_Dialog()
frm.setupUi(d)
font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
font.setPointSize(frm.text.font().pointSize() + 1)
frm.text.setFont(font)
frm.log.setFont(font)
s = self.debugDiagShort = QShortcut(QKeySequence("ctrl+return"), d)
s.activated.connect(lambda: self.onDebugRet(frm))
s = self.debugDiagShort = QShortcut(
QKeySequence("ctrl+shift+return"), d)
s.activated.connect(lambda: self.onDebugPrint(frm))
s = self.debugDiagShort = QShortcut(QKeySequence("ctrl+l"), d)
s.activated.connect(frm.log.clear)
s = self.debugDiagShort = QShortcut(QKeySequence("ctrl+shift+l"), d)
s.activated.connect(frm.text.clear)
d.show()
def _captureOutput(self, on):
@ -1201,7 +1209,16 @@ will be lost. Continue?"""))
return aqt.dialogs._dialogs['Browser'][1].card.__dict__
def onDebugPrint(self, frm):
frm.text.setPlainText("pp(%s)" % frm.text.toPlainText())
cursor = frm.text.textCursor()
position = cursor.position()
cursor.select(QTextCursor.LineUnderCursor)
line = cursor.selectedText()
pfx, sfx = "pp(", ")"
if not line.startswith(pfx):
line = "{}{}{}".format(pfx, line, sfx)
cursor.insertText(line)
cursor.setPosition(position + len(pfx))
frm.text.setTextCursor(cursor)
self.onDebugRet(frm)
def onDebugRet(self, frm):

View File

@ -10,6 +10,7 @@ import aqt
from aqt.utils import openLink
from anki.utils import json, platDesc
from aqt.utils import showText
from aqt.utils import versionWithBuild
class LatestVersionFinder(QThread):
@ -23,7 +24,7 @@ class LatestVersionFinder(QThread):
self.config = main.pm.meta
def _data(self):
d = {"ver": aqt.appVersion,
d = {"ver": versionWithBuild(),
"os": platDesc(),
"id": self.config['id'],
"lm": self.config['lastMsg'],

View File

@ -50,7 +50,7 @@ def showInfo(text, parent=False, help="", type="info", title="Anki"):
return mb.exec_()
def showText(txt, parent=None, type="text", run=True, geomKey=None, \
minWidth=500, minHeight=400, title="Anki"):
minWidth=500, minHeight=400, title="Anki", copyBtn=False):
if not parent:
parent = aqt.mw.app.activeWindow() or aqt.mw
diag = QDialog(parent)
@ -66,6 +66,12 @@ def showText(txt, parent=None, type="text", run=True, geomKey=None, \
layout.addWidget(text)
box = QDialogButtonBox(QDialogButtonBox.Close)
layout.addWidget(box)
if copyBtn:
def onCopy():
QApplication.clipboard().setText(text.toPlainText())
btn = QPushButton(_("Copy to Clipboard"))
btn.clicked.connect(onCopy)
box.addButton(btn, QDialogButtonBox.ActionRole)
def onReject():
if geomKey:
saveGeom(diag, geomKey)

View File

@ -41,11 +41,6 @@
<verstretch>8</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Courier</family>
</font>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>