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