diff --git a/anki/collection.py b/anki/collection.py index f430eb98c..096507d37 100644 --- a/anki/collection.py +++ b/anki/collection.py @@ -695,6 +695,10 @@ select id from notes where mid not in """ + ids2str(self.models.ids())) self.remNotes(ids) # for each model for m in self.models.all(): + for t in m['tmpls']: + if t['did'] == "None": + t['did'] = None + problems.append(_("Fixed AnkiDroid deck override bug.")) if m['type'] == MODEL_STD: # model with missing req specification if 'req' not in m: diff --git a/aqt/addcards.py b/aqt/addcards.py index dd1de4d43..3dcf46184 100644 --- a/aqt/addcards.py +++ b/aqt/addcards.py @@ -190,7 +190,6 @@ question on all cards."""), help="AddItems") saveGeom(self, "add") aqt.dialogs.close("AddCards") QDialog.reject(self) - self.deleteLater() def canClose(self): if (self.forceClose or self.editor.fieldsAreBlank() or diff --git a/aqt/browser.py b/aqt/browser.py index dcd1603c3..f167a7b37 100644 --- a/aqt/browser.py +++ b/aqt/browser.py @@ -373,11 +373,6 @@ class Browser(QMainWindow): self.onSearch() self.show() - def _headerKey(self): - if qtmajor >= 5: - return "editor2" - return "editor" - def setupToolbar(self): self.toolbarWeb = AnkiWebView() self.toolbarWeb.setFixedHeight(32 + self.mw.fontHeightDelta) @@ -463,7 +458,7 @@ class Browser(QMainWindow): self.editor.setNote(None) saveGeom(self, "editor") saveState(self, "editor") - saveHeader(self.form.tableView.horizontalHeader(), self._headerKey()) + saveHeader(self.form.tableView.horizontalHeader(), "editor") self.col.conf['activeCols'] = self.model.activeCols self.col.setMod() self.hide() @@ -471,7 +466,6 @@ class Browser(QMainWindow): self.teardownHooks() self.mw.maybeReset() evt.accept() - self.deleteLater() def canClose(self): return True @@ -629,7 +623,7 @@ class Browser(QMainWindow): if not isWin: vh.hide() hh.show() - restoreHeader(hh, self._headerKey()) + restoreHeader(hh, "editor") hh.setHighlightSections(False) hh.setMinimumSectionSize(50) hh.setMovable(True) @@ -722,11 +716,9 @@ by clicking on one on the left.""")) def setColumnSizes(self): hh = self.form.tableView.horizontalHeader() - for i in range(len(self.model.activeCols)): - if hh.visualIndex(i) == len(self.model.activeCols) - 1: - hh.setResizeMode(i, QHeaderView.Stretch) - else: - hh.setResizeMode(i, QHeaderView.Interactive) + hh.setResizeMode(QHeaderView.Interactive) + hh.setResizeMode(hh.logicalIndex(len(self.model.activeCols)-1), + QHeaderView.Stretch) # this must be set post-resize or it doesn't work hh.setCascadingSectionResizes(False) @@ -869,7 +861,7 @@ by clicking on one on the left.""")) d = QDialog(self) l = QVBoxLayout() l.setMargin(0) - w = AnkiWebView() + w = AnkiWebView(canCopy=True) l.addWidget(w) w.stdHtml(info + "
" + reps)
bb = QDialogButtonBox(QDialogButtonBox.Close)
diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py
index 60cbf1d9e..74ad1b0a3 100644
--- a/aqt/deckbrowser.py
+++ b/aqt/deckbrowser.py
@@ -345,7 +345,7 @@ where id > ?""", (self.mw.col.sched.dayCutoff-86400)*1000)
if isMac:
size = 28
else:
- size = 38 + self.mw.fontHeightDelta*3
+ size = 36 + self.mw.fontHeightDelta*3
self.bottom.web.setFixedHeight(size)
self.bottom.web.setLinkHandler(self._linkHandler)
diff --git a/aqt/editcurrent.py b/aqt/editcurrent.py
index cb8d69067..c029fc36e 100644
--- a/aqt/editcurrent.py
+++ b/aqt/editcurrent.py
@@ -64,7 +64,6 @@ class EditCurrent(QDialog):
self.mw.moveToState("review")
saveGeom(self, "editcurrent")
aqt.dialogs.close("EditCurrent")
- self.deleteLater()
def canClose(self):
return True
diff --git a/aqt/errors.py b/aqt/errors.py
index 5c2a37330..533b37f46 100644
--- a/aqt/errors.py
+++ b/aqt/errors.py
@@ -75,7 +75,7 @@ into a bug report:""")
pluginText = _("""\
An error occurred in an add-on.
Please post on the add-on forum:
%s
""")
- pluginText %= "https://groups.google.com/forum/#!forum/anki-addons"
+ pluginText %= "https://anki.tenderapp.com/discussions/add-ons"
if "addon" in error:
txt = pluginText
else:
diff --git a/aqt/main.py b/aqt/main.py
index 0d90cf6af..292b2c079 100644
--- a/aqt/main.py
+++ b/aqt/main.py
@@ -63,6 +63,8 @@ class AnkiQt(QMainWindow):
self.onAppMsg(unicode(args[0], sys.getfilesystemencoding(), "ignore"))
# Load profile in a timer so we can let the window finish init and not
# close on profile load error.
+ if isMac and qtmajor >= 5:
+ self.show()
self.progress.timer(10, self.setupProfile, False)
def setupUI(self):
@@ -1084,7 +1086,7 @@ will be lost. Continue?"""))
def setupFonts(self):
f = QFontInfo(self.font())
ws = QWebSettings.globalSettings()
- self.fontHeight = max(14, f.pixelSize())
+ self.fontHeight = f.pixelSize()
self.fontFamily = f.family()
self.fontHeightDelta = max(0, self.fontHeight - 13)
ws.setFontFamily(QWebSettings.StandardFont, self.fontFamily)
diff --git a/aqt/reviewer.py b/aqt/reviewer.py
index 4c17c7596..c00bbf76c 100644
--- a/aqt/reviewer.py
+++ b/aqt/reviewer.py
@@ -47,7 +47,7 @@ class Reviewer(object):
if isMac:
self.bottom.web.setFixedHeight(46)
else:
- self.bottom.web.setFixedHeight(54+self.mw.fontHeightDelta*4)
+ self.bottom.web.setFixedHeight(52+self.mw.fontHeightDelta*4)
self.bottom.web.setLinkHandler(self._linkHandler)
self._reps = None
self.nextCard()
@@ -434,17 +434,11 @@ Please run Tools>Empty Cards""")
return txt.split("::")[0]
return txt
matches = [noHint(txt) for txt in matches]
- if len(matches) > 1:
- arr = []
- seen = {}
- for m in matches:
- if m in seen:
- continue
- seen[m] = 1
- arr.append(m)
- txt = ", ".join(arr)
- else:
+ uniqMatches = set(matches)
+ if len(uniqMatches) == 1:
txt = matches[0]
+ else:
+ txt = ", ".join(matches)
return txt
def tokenizeComparison(self, given, correct):
diff --git a/aqt/stats.py b/aqt/stats.py
index b7c6e0c54..93bf6601a 100644
--- a/aqt/stats.py
+++ b/aqt/stats.py
@@ -45,7 +45,6 @@ class DeckStats(QDialog):
def reject(self):
saveGeom(self, self.name)
QDialog.reject(self)
- self.deleteLater()
def browser(self):
name = time.strftime("-%Y-%m-%d@%H-%M-%S.png",
diff --git a/aqt/webview.py b/aqt/webview.py
index 5afd0f72e..54ac42bcd 100644
--- a/aqt/webview.py
+++ b/aqt/webview.py
@@ -40,7 +40,8 @@ class AnkiWebPage(QWebPage):
class AnkiWebView(QWebView):
- def __init__(self, canFocus=False):
+ # canFocus implies canCopy
+ def __init__(self, canFocus=False, canCopy=False):
QWebView.__init__(self)
self.setRenderHints(
QPainter.TextAntialiasing |
@@ -60,6 +61,7 @@ class AnkiWebView(QWebView):
# reset each time new html is set; used to detect if still in same state
self.key = None
self.setCanFocus(canFocus)
+ self._canCopy = canCopy or canFocus
def keyPressEvent(self, evt):
if evt.matches(QKeySequence.Copy):
@@ -79,7 +81,7 @@ class AnkiWebView(QWebView):
QWebView.keyReleaseEvent(self, evt)
def contextMenuEvent(self, evt):
- if not self.isCardViewer:
+ if not self._canCopy:
return
m = QMenu(self)
a = m.addAction(_("Copy"))
@@ -109,7 +111,7 @@ class AnkiWebView(QWebView):
def stdHtml(self, body, css="", bodyClass="", loadCB=None, js=None, head=""):
if isMac:
- button = "font-weight: normal; height: 24px;"
+ button = "font-weight: bold; height: 24px;"
else:
button = "font-weight: normal;"
self.setHtml("""
@@ -130,12 +132,9 @@ button {
def setBridge(self, bridge):
self._bridge.setBridge(bridge)
- def setCanFocus(self, isCardViewer=False):
- """Set flag to denote if this WebView should follow rules specific to
- card display (e.g., allow context menu, copy/paste)"""
-
- self.isCardViewer = isCardViewer
- if self.isCardViewer:
+ def setCanFocus(self, canFocus=False):
+ self._canFocus = canFocus
+ if self._canFocus:
self.setFocusPolicy(Qt.WheelFocus)
else:
self.setFocusPolicy(Qt.NoFocus)
diff --git a/designer/icons/add16.png b/designer/icons/add16.png
index 7a43792ab..27822a8dc 100644
Binary files a/designer/icons/add16.png and b/designer/icons/add16.png differ
diff --git a/designer/icons/addtag16.png b/designer/icons/addtag16.png
index eca2e651e..e2d5fb08b 100644
Binary files a/designer/icons/addtag16.png and b/designer/icons/addtag16.png differ
diff --git a/designer/icons/clock-icon.png b/designer/icons/clock-icon.png
index 24bd3b5c1..f502e454a 100644
Binary files a/designer/icons/clock-icon.png and b/designer/icons/clock-icon.png differ
diff --git a/designer/icons/clock16.png b/designer/icons/clock16.png
index 61b5fd551..787808d5c 100644
Binary files a/designer/icons/clock16.png and b/designer/icons/clock16.png differ
diff --git a/designer/icons/deck16.png b/designer/icons/deck16.png
index 91768bfc5..44345718e 100644
Binary files a/designer/icons/deck16.png and b/designer/icons/deck16.png differ
diff --git a/designer/icons/delete16.png b/designer/icons/delete16.png
index 95101a7ec..81961e04c 100644
Binary files a/designer/icons/delete16.png and b/designer/icons/delete16.png differ
diff --git a/designer/icons/deletetag16.png b/designer/icons/deletetag16.png
index 6d47f33c8..6275171ee 100644
Binary files a/designer/icons/deletetag16.png and b/designer/icons/deletetag16.png differ
diff --git a/designer/icons/format-stroke-color.png b/designer/icons/format-stroke-color.png
index f21f257bc..9ce772d11 100644
Binary files a/designer/icons/format-stroke-color.png and b/designer/icons/format-stroke-color.png differ
diff --git a/designer/icons/info.png b/designer/icons/info.png
index 882bdb2f9..ad64bc094 100644
Binary files a/designer/icons/info.png and b/designer/icons/info.png differ
diff --git a/designer/icons/plus-circle.png b/designer/icons/plus-circle.png
index 4fc5b8c81..e1b390f3e 100644
Binary files a/designer/icons/plus-circle.png and b/designer/icons/plus-circle.png differ
diff --git a/designer/icons/plus16.png b/designer/icons/plus16.png
index dfeb3199a..38a31137c 100644
Binary files a/designer/icons/plus16.png and b/designer/icons/plus16.png differ
diff --git a/designer/icons/star16.png b/designer/icons/star16.png
index 1b42d54e7..6402f6c06 100644
Binary files a/designer/icons/star16.png and b/designer/icons/star16.png differ
diff --git a/designer/icons/star_off16.png b/designer/icons/star_off16.png
index 0458a3b97..9146a976c 100644
Binary files a/designer/icons/star_off16.png and b/designer/icons/star_off16.png differ
diff --git a/designer/icons/stock_group.png b/designer/icons/stock_group.png
index c3d18c7a9..9244fbdb9 100644
Binary files a/designer/icons/stock_group.png and b/designer/icons/stock_group.png differ
diff --git a/designer/icons/text_clear.png b/designer/icons/text_clear.png
index 56479f981..e9d6ee1bb 100644
Binary files a/designer/icons/text_clear.png and b/designer/icons/text_clear.png differ
diff --git a/designer/icons/view-refresh.png b/designer/icons/view-refresh.png
index f1bce46bf..389c1c8ac 100644
Binary files a/designer/icons/view-refresh.png and b/designer/icons/view-refresh.png differ
diff --git a/designer/icons/view-statistics.png b/designer/icons/view-statistics.png
index 1242645d1..41e07e8b6 100644
Binary files a/designer/icons/view-statistics.png and b/designer/icons/view-statistics.png differ
diff --git a/tools/build_ui.sh b/tools/build_ui.sh
index a697fc77a..c26521cfd 100755
--- a/tools/build_ui.sh
+++ b/tools/build_ui.sh
@@ -29,7 +29,7 @@ do
echo " * "$py
pyuic4 $i -o $py
# munge the output to use gettext
- perl -pi.bak -e 's/QtGui.QApplication.translate\(".*?", /_(/; s/, None, QtGui.*/))/' $py
+ perl -pi.bak -e 's/(QtGui\.QApplication\.)?_?translate\(".*?", /_(/; s/, None.*/))/' $py
rm $py.bak
fi
done