def __init__(self, mw, first=False, search="", deck=None): QDialog.__init__(self, mw) self.mw = mw self.deck = deck or self.mw.col.decks.current() self.search = search self.form = aqt.forms.dyndconf.Ui_Dialog() self.form.setupUi(self) if first: label = _("Build") else: label = _("Rebuild") self.ok = self.form.buttonBox.addButton( label, QDialogButtonBox.AcceptRole) self.mw.checkpoint(_("Options")) self.setWindowModality(Qt.WindowModal) self.form.buttonBox.helpRequested.connect(lambda: openHelp("filtered")) self.setWindowTitle(_("Options for %s") % self.deck['name']) restoreGeom(self, "dyndeckconf") self.setupOrder() self.loadConf() if search: self.form.search.setText(search) self.form.search.selectAll() self.show() self.exec_() saveGeom(self, "dyndeckconf")
def reject(self): self.model.flush() saveGeom(self, "CardLayout") saveSplitter(self.form.splitter, "clayout") self.mw.reset() return QDialog.reject(self) self.fact.model.setModified() modified = False self.mw.startProgress() self.deck.updateProgress(_("Applying changes...")) reset=True if len(self.fieldOrdinalUpdatedIds) > 0: self.deck.rebuildFieldOrdinals(self.model.id, self.fieldOrdinalUpdatedIds) modified = True if self.needFieldRebuild: modified = True if modified: self.fact.model.setModified() self.deck.flushMod() if self.factedit and self.factedit.onChange: self.factedit.onChange("all") reset=False if reset: self.mw.reset() self.deck.finishProgress() QDialog.reject(self)
def getAudio(parent, string="", encode=True): "Record and return filename" # record first r = Recorder() mb = QMessageBox(parent) restoreGeom(mb, "audioRecorder") mb.setWindowTitle("Anki") mb.setIconPixmap(QPixmap(":/icons/media-record.png")) but = QPushButton(_(" Stop")) but.setIcon(QIcon(":/icons/media-playback-stop.png")) #but.setIconSize(QSize(32, 32)) mb.addButton(but, QMessageBox.RejectRole) t = time.time() r.start() QApplication.instance().processEvents() while not mb.clickedButton(): txt =_("Recording...<br>Time: %0.1f") mb.setText(txt % (time.time() - t)) mb.show() QApplication.instance().processEvents() # ensure at least a second captured saveGeom(mb, "audioRecorder") while time.time() - t < 1: time.sleep(0.1) r.stop() # process r.postprocess(encode) return r.file()
def getField(browser, fields): """Invoke field selection dialog and return field""" d = QDialog(browser) l = QVBoxLayout(d) d.label = QLabel( "Please select the field you would like to convert to tags", d) d.fieldSel = QComboBox(d) d.fieldSel.addItems(fields) d.buttonBox = QDialogButtonBox(d) d.buttonBox.setOrientation(Qt.Horizontal) d.buttonBox.setStandardButtons( QDialogButtonBox.Cancel|QDialogButtonBox.Ok) d.buttonBox.accepted.connect(d.accept) d.buttonBox.rejected.connect(d.reject) l.addWidget(d.label) l.addWidget(d.fieldSel) l.addWidget(d.buttonBox) d.setWindowModality(Qt.WindowModal) d.setWindowTitle("Field to Tags") restoreGeom(d, "fieldtotags") r = d.exec_() saveGeom(d, "fieldtotags") if not r: return None idx = d.fieldSel.currentIndex() field = fields[idx] return field
def onDelete(): saveGeom(diag, "emptyCards") QDialog.accept(diag) self.checkpoint(_("Delete Empty")) self.col.remCards(cids) tooltip(ngettext("%d card deleted.", "%d cards deleted.", len(cids)) % len(cids)) self.reset()
def __init__(self, mw, deck): QDialog.__init__(self, mw) self.mw = mw self.deck = deck self.childDids = [ d[1] for d in self.mw.col.decks.children(self.deck['id'])] self._origNewOrder = None self.form = aqt.forms.dconf.Ui_Dialog() self.form.setupUi(self) self.mw.checkpoint(_("Options")) self.setupCombos() self.setupConfs() self.setWindowModality(Qt.WindowModal) self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), lambda: openHelp("deckoptions")) self.connect(self.form.confOpts, SIGNAL("clicked()"), self.confOpts) self.form.confOpts.setText(downArrow()) self.connect(self.form.buttonBox.button(QDialogButtonBox.RestoreDefaults), SIGNAL("clicked()"), self.onRestore) self.setWindowTitle(_("Options for %s") % self.deck['name']) # qt doesn't size properly with altered fonts otherwise restoreGeom(self, "deckconf", adjustSize=True) self.show() self.exec_() saveGeom(self, "deckconf")
def showLastSentence(html): m = QMainWindow(mw) d = QDialog(m) m = QHBoxLayout() l = QVBoxLayout() r = QVBoxLayout() w = QLabel() w.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) l.addWidget(w) ss = QPushButton(u'Say') bb = QDialogButtonBox(QDialogButtonBox.Close) bb.addButton(ss, QDialogButtonBox.ActionRole) bb.setOrientation(Qt.Vertical) # r.addWidget(ss) r.addWidget(bb) ss.connect(ss, SIGNAL("clicked()"), actionReadSentence) bb.connect(bb, SIGNAL("rejected()"), d, SLOT("reject()")) m.addLayout(l) m.addLayout(r) d.setLayout(m) d.setWindowModality(Qt.WindowModal) d.resize(649, 145) restoreGeom(d, "LastSentence") html = "<html><body><h3>" + html + "</h3></body></html>" w.setText(html) d.exec_() saveGeom(d, "LastSentence")
def reject(self): if self.addMode: self.mw.col.db.execute("delete from notes where id = ?", self.note.id) self.mm.save(self.model, templates=True) self.mw.reset() saveGeom(self, "CardLayout") return QDialog.reject(self)
def getAudio(parent, encode=True): "Record and return filename" # record first r = Recorder() mb = QMessageBox(parent) restoreGeom(mb, "audioRecorder") mb.setWindowTitle("Anki") mb.setIconPixmap(QPixmap(":/icons/media-record.png")) but = QPushButton(_("Save")) mb.addButton(but, QMessageBox.AcceptRole) but = QPushButton(_("Cancel")) mb.addButton(but, QMessageBox.RejectRole) mb.setEscapeButton(but) t = time.time() r.start() time.sleep(r.startupDelay) QApplication.instance().processEvents() while not mb.clickedButton(): txt =_("Recording...<br>Time: %0.1f") mb.setText(txt % (time.time() - t)) mb.show() QApplication.instance().processEvents() if mb.clickedButton() == mb.escapeButton(): r.stop() return saveGeom(mb, "audioRecorder") # ensure at least a second captured while time.time() - t < 1: time.sleep(0.1) r.stop() # process r.postprocess(encode) return r.file()
def onSave(self): remHook("reset", self.onReset) self.editor.saveNow() self.browser.externalNid = None self.browser.form.splitter.widget(1).setVisible(True) self.browser.editor.setNote(self.browser.card.note(reload=True)) saveGeom(self, "browsereditcurrent") aqt.dialogs.close("BrowserEditCurrent")
def onSave(self): remHook("reset", self.onReset) self.editor.saveNow() self.editor.setNote(None) r = self.mw.reviewer r.card.load() self.mw.moveToState("review") saveGeom(self, "editcurrent") self.close()
def accept(self): saveGeom(self, self.geomKey) remHook('reset', self.onReset) row = self.form.list.currentRow() if row < 0: showInfo(_("Please select something.")) return self.name = self.names[self.form.list.currentRow()] QDialog.accept(self)
def reject(self): clearAudioQueue() if self.addMode: # remove the filler fields we added for name in self.emptyFields: self.note[name] = "" self.mw.col.db.execute("delete from notes where id = ?", self.note.id) self.mm.save(self.model, templates=True) self.mw.reset() saveGeom(self, "CardLayout") return QDialog.reject(self)
def __init__(self, mw): QDialog.__init__(self, mw) self.mw = mw self.form = aqt.forms.getaddons.Ui_Dialog() self.form.setupUi(self) b = self.form.buttonBox.addButton( _("Browse"), QDialogButtonBox.ActionRole) self.connect(b, SIGNAL("clicked()"), self.onBrowse) restoreGeom(self, "getaddons", adjustSize=True) self.exec_() saveGeom(self, "getaddons")
def _reject(self): remHook('reset', self.onReset) remHook('currentModelChanged', self.onModelChange) clearAudioQueue() self.removeTempNote(self.editor.note) self.editor.cleanup() self.modelChooser.cleanup() self.deckChooser.cleanup() self.mw.maybeReset() saveGeom(self, "add") aqt.dialogs.markClosed("AddCards") QDialog.reject(self)
def onSave(self): removeHook("closeEditCurrent", self.onSave) self.editor.saveNow() self.editor.setFact(None) r = self.mw.reviewer r.card.load() r.keep = True # we don't need to reset the deck, but there may be new groups self.mw.deck.sched._resetConf() self.mw.moveToState("review") saveGeom(self, "editcurrent") self.close()
def onAdvanced(self): d = QDialog(self) frm = aqt.forms.modelopts.Ui_Dialog() frm.setupUi(d) frm.latexHeader.setText(self.model['latexPre']) frm.latexFooter.setText(self.model['latexPost']) d.setWindowTitle(_("Options for %s") % self.model['name']) frm.buttonBox.helpRequested.connect(lambda: openHelp("latex")) restoreGeom(d, "modelopts") d.exec_() saveGeom(d, "modelopts") self.model['latexPre'] = unicode(frm.latexHeader.toPlainText()) self.model['latexPost'] = unicode(frm.latexFooter.toPlainText())
def _onSave(self): remHook("reset", self.onReset) r = self.mw.reviewer try: r.card.load() except: # card was removed by clayout pass else: self.mw.reviewer.cardQueue.append(self.mw.reviewer.card) self.mw.moveToState("review") saveGeom(self, "editcurrent") aqt.dialogs.close("EditCurrent")
def reject(self): if not self.canClose(): return remHook('reset', self.onReset) remHook('currentModelChanged', self.onReset) clearAudioQueue() self.removeTempNote(self.editor.note) self.editor.setNote(None) self.modelChooser.cleanup() self.mw.maybeReset() saveGeom(self, "add") aqt.dialogs.close("AddCards") QDialog.reject(self)
def __init__(self, dlg): QDialog.__init__(self, dlg) self.addonsDlg = dlg self.mgr = dlg.mgr self.mw = self.mgr.mw self.form = aqt.forms.getaddons.Ui_Dialog() self.form.setupUi(self) b = self.form.buttonBox.addButton( _("Browse Add-ons"), QDialogButtonBox.ActionRole) b.clicked.connect(self.onBrowse) restoreGeom(self, "getaddons", adjustSize=True) self.exec_() saveGeom(self, "getaddons")
def onSave(self): remHook("reset", self.onReset) self.editor.saveNow() self.editor.setNote(None) r = self.mw.reviewer try: r.card.load() except TypeError: # card was removed by clayout pass else: self.mw.reviewer.cardQueue.append(self.mw.reviewer.card) self.mw.moveToState("review") saveGeom(self, "editcurrent")
def closeEvent(self, evt): saveSplitter(self.form.splitter_2, "editor2") saveSplitter(self.form.splitter, "editor3") self.editor.saveNow() self.editor.setNote(None) saveGeom(self, "editor") saveState(self, "editor") saveHeader(self.form.tableView.horizontalHeader(), "editor") self.col.conf['activeCols'] = self.model.activeCols self.hide() aqt.dialogs.close("Browser") self.teardownHooks() self.mw.maybeReset() evt.accept()
def onhanziStats(): mw.progress.start(immediate=True) rep = genhanziStats() d = QDialog(mw) l = QVBoxLayout() w = AnkiWebView() l.addWidget(w) css = "font{word-wrap:break-word;} div{display:none;}" w.stdHtml(rep, css) d.setLayout(l) d.resize(500, 400) restoreGeom(d, "hanzistats") mw.progress.finish() d.exec_() saveGeom(d, "hanzistats")
def _saveAndClose(self): remHook("reset", self.onReset) r = self.mw.reviewer try: r.card.load() except: # card was removed by clayout pass else: self.mw.reviewer.cardQueue.append(self.mw.reviewer.card) self.editor.cleanup() self.mw.moveToState("review") saveGeom(self, "editcurrent") aqt.dialogs.markClosed("EditCurrent") QDialog.reject(self)
def onCheckMediaDB(self): self.progress.start(immediate=True) (nohave, unused, warnings) = self.col.media.check() self.progress.finish() # generate report report = "" if warnings: report += "\n".join(warnings) + "\n" if unused: if report: report += "\n\n\n" report += _( "In media folder but not used by any cards:") report += "\n" + "\n".join(unused) if nohave: if report: report += "\n\n\n" report += _( "Used on cards but missing from media folder:") report += "\n" + "\n".join(nohave) if not report: tooltip(_("No unused or missing files found.")) return # show report and offer to delete diag = QDialog(self) diag.setWindowTitle("Anki") layout = QVBoxLayout(diag) diag.setLayout(layout) text = QTextEdit() text.setReadOnly(True) text.setPlainText(report) layout.addWidget(text) box = QDialogButtonBox(QDialogButtonBox.Close) layout.addWidget(box) if unused: b = QPushButton(_("Delete Unused Files")) b.setAutoDefault(False) box.addButton(b, QDialogButtonBox.ActionRole) b.clicked.connect( lambda c, u=unused, d=diag: self.deleteUnused(u, d)) box.rejected.connect(diag.reject) diag.setMinimumHeight(400) diag.setMinimumWidth(500) restoreGeom(diag, "checkmediadb") diag.exec_() saveGeom(diag, "checkmediadb")
def onRevlog(self): data = self._revlogData() d = QDialog(self) l = QVBoxLayout() l.setMargin(0) w = AnkiWebView() l.addWidget(w) w.stdHtml(data) bb = QDialogButtonBox(QDialogButtonBox.Close) l.addWidget(bb) bb.connect(bb, SIGNAL("rejected()"), d, SLOT("reject()")) d.setLayout(l) d.setWindowModality(Qt.WindowModal) d.resize(500, 400) restoreGeom(d, "revlog") d.exec_() saveGeom(d, "revlog")
def onAdvanced(self): d = QDialog(self) frm = aqt.forms.modelopts.Ui_Dialog() frm.setupUi(d) frm.latexsvg.setChecked(self.model.get("latexsvg", False)) frm.latexHeader.setText(self.model['latexPre']) frm.latexFooter.setText(self.model['latexPost']) frm.newStyleWhitespace.setChecked(self.model.get("prewrap", False)) d.setWindowTitle(_("Options for %s") % self.model['name']) frm.buttonBox.helpRequested.connect(lambda: openHelp("latex")) restoreGeom(d, "modelopts") d.exec_() saveGeom(d, "modelopts") self.model['latexsvg'] = frm.latexsvg.isChecked() self.model['latexPre'] = str(frm.latexHeader.toPlainText()) self.model['latexPost'] = str(frm.latexFooter.toPlainText()) self.model['prewrap'] = frm.newStyleWhitespace.isChecked()
def onKanjiStats(): mw.progress.start(immediate=True) rep = genKanjiStats() d = QDialog(mw) l = QVBoxLayout() l.setMargin(0) w = AnkiWebView() l.addWidget(w) w.stdHtml(rep) bb = QDialogButtonBox(QDialogButtonBox.Close) l.addWidget(bb) bb.connect(bb, SIGNAL("rejected()"), d, SLOT("reject()")) d.setLayout(l) d.resize(500, 400) restoreGeom(d, "kanjistats") mw.progress.finish() d.exec_() saveGeom(d, "kanjistats")
def myReject(self): if not self.canClose(): return remHook('reset', self.onReset) clearAudioQueue() self.removeTempNote(self.editor.note) self.editor.setNote(None) self.modelChooser.cleanup() self.deckChooser.cleanup() self.mw.maybeReset() # save geometry of current dialog if self.dialogName == "AddCards": saveGeom(self, "add") else: saveGeom(self, "add2") # close dialog dialogs.close(self.dialogName) QDialog.reject(self)
def onhanziStats(): mw.progress.start(immediate=True) rep = genhanziStats() d = QDialog(mw) l = QVBoxLayout() l.setMargin(0) w = AnkiWebView() l.addWidget(w) css = "font{word-wrap:break-word;} div{display:none;}" w.stdHtml(rep, css) bb = QDialogButtonBox(QDialogButtonBox.Close) l.addWidget(bb) bb.connect(bb, SIGNAL("rejected()"), d, SLOT("reject()")) d.setLayout(l) d.resize(500, 400) restoreGeom(d, "hanzistats") mw.progress.finish() d.exec_() saveGeom(d, "hanzistats")
def accept(self): self.hide() n = 0 # gather yes/no tags yes = [] no = [] for c in range(self.dialog.activeList.count()): # active if self.dialog.activeCheck.isChecked(): item = self.dialog.activeList.item(c) idx = self.dialog.activeList.indexFromItem(item) if self.dialog.activeList.selectionModel().isSelected(idx): yes.append(self.tags[c]) # inactive item = self.dialog.inactiveList.item(c) idx = self.dialog.inactiveList.indexFromItem(item) if self.dialog.inactiveList.selectionModel().isSelected(idx): no.append(self.tags[c]) # save in the deck for future invocations self.deck["activeTags"] = yes self.deck["inactiveTags"] = no self.mw.col.decks.save(self.deck) # build query string self.tags = "" if yes: arr = [] for req in yes: arr.append('tag:"%s"' % req) self.tags += "(" + " or ".join(arr) + ")" if no: arr = [] for req in no: arr.append('-tag:"%s"' % req) self.tags += " " + " ".join(arr) saveGeom(self, "tagLimit") QDialog.accept(self)
def _onHtmlEdit(self, field): d = QDialog(self.widget, Qt.Window) form = aqt.forms.edithtml.Ui_Dialog() form.setupUi(d) restoreGeom(d, "htmlEditor") qconnect(form.buttonBox.helpRequested, lambda: openHelp("editor")) form.textEdit.setPlainText(self.note.fields[field]) d.show() form.textEdit.moveCursor(QTextCursor.End) d.exec_() html = form.textEdit.toPlainText() if html.find(">") > -1: # filter html through beautifulsoup so we can strip out things like a # leading </div> html_escaped = self.mw.col.media.escapeImages(html) with warnings.catch_warnings(): warnings.simplefilter("ignore", UserWarning) html_escaped = str(BeautifulSoup(html_escaped, "html.parser")) html = self.mw.col.media.escapeImages(html_escaped, unescape=True) self.note.fields[field] = html if not self.addMode: self.note.flush() self.loadNote(focusTo=field) saveGeom(d, "htmlEditor")
def __init__(self, mw, deck, parent=None): QDialog.__init__(self, parent or mw) self.mw = mw self.deck = deck self.childDids = [ d[1] for d in self.mw.col.decks.children(self.deck['id']) ] self._origNewOrder = None self.form = aqt.forms.dconf.Ui_Dialog() self.form.setupUi(self) self.mw.checkpoint(_("Options")) self.setupCombos() self.setupConfs() self.setWindowModality(Qt.WindowModal) self.form.confOpts.clicked.connect(self.confOpts) self.form.confOpts.setText(downArrow()) self.form.buttonBox.button( QDialogButtonBox.RestoreDefaults).clicked.connect(self.onRestore) self.setWindowTitle(_("Options for %s") % self.deck['name']) # qt doesn't size properly with altered fonts otherwise restoreGeom(self, "deckconf", adjustSize=True) self.show() self.exec_() saveGeom(self, "deckconf")
def onReject(self): saveGeom(self, geom_name)
def reject(self): saveGeom(self, self.name) QDialog.reject(self)
def success(out: OpChangesWithId) -> None: gui_hooks.filtered_deck_dialog_did_add_or_update_deck( self, self.deck, out.id) saveGeom(self, self.GEOMETRY_KEY) aqt.dialogs.markClosed(self.DIALOG_KEY) QDialog.accept(self)
def _save_diag(self) -> None: saveGeom(self, "audioRecorder2")
def onAccept(self): saveGeom(self, geom_name) self.callback(self.exportData())
def cleanup(self): remHook("reset", self.onReset) remHook("currentModelChanged", self.onReset) self.modelChooser.cleanup() saveGeom(self, "changeModel")
def closeEvent(self, event): if mw.pm.profile is not None: self.deckChooser.cleanup() saveGeom(self, "imgoccedit") self.visible = False event.accept()
def onClose(self): saveGeom(self, "addonconf") saveSplitter(self.form.splitter, "addonconf")
def reject(self): saveGeom(self, self.geomKey) remHook('reset', self.onReset) QDialog.reject(self)
def cleanup_and_close(self) -> None: gui_hooks.operation_did_execute.remove(self.on_operation_did_execute) self.editor.cleanup() saveGeom(self, "editcurrent") aqt.dialogs.markClosed("EditCurrent") QDialog.reject(self)
def _showinfo_of_card(self, card): #self is reviewer if card: dialog = CardStatShowDialog(self, card) dialog.exec_() saveGeom(dialog, "CardStatShowDialog")
def reject(self) -> None: saveGeom(self, "models") QDialog.reject(self)
def reject(self) -> None: self.web = None saveGeom(self, self.TITLE) QDialog.reject(self)
def reject(self): self.saveModel() self.mw.reset() saveGeom(self, "models") QDialog.reject(self)
def cleanup(self): remHook("reset", self.onReset) self.browser.organizer = None saveGeom(self, "organizer") saveHeader(self.hh, "organizer")
def reject(self): saveGeom(self, "SHFork_fuzzy") QDialog.reject(self)
def onReject(self): ok = askUser("Close and lose current input?") if ok: saveGeom(self, "805891399_winsize") self.web = None self.reject()
def reject(self): saveGeom(self, "addons21") return QDialog.reject(self)
def reject(self): saveGeom(self, self.name) aqt.dialogs.markClosed("DeckStats") QDialog.reject(self)
def onDelete(mw, diag, cids): p(f"Calling new onDelete with cids {cids}") cids = set(mw.col.emptyCids()) #change here to make a set saveGeom(diag, "emptyCards") QDialog.accept(diag) mw.checkpoint(_("Delete Empty")) # Beginning of changes nidToCidsToDelete = dict() for cid in cids: card = mw.col.getCard(cid) note = card.note() nid = note.id if nid not in nidToCidsToDelete: p(f"note {nid} not yet in nidToCidsToDelete. Thus adding it") nidToCidsToDelete[nid] = set() else: p(f"note {nid} already in nidToCidsToDelete.") nidToCidsToDelete[nid].add(cid) p(f"Adding card {cid} to note {nid}.") emptyNids = set() cardsOfEmptyNotes = set() for nid, cidsToDeleteOfNote in nidToCidsToDelete.items(): note = mw.col.getNote(nid) cidsOfNids = set([card.id for card in note.cards()]) p(f"In note {nid}, the cards are {cidsOfNids}, and the cards to delete are {cidsToDeleteOfNote}" ) if cidsOfNids == cidsToDeleteOfNote: p(f"Both sets are equal") emptyNids.add(note.id) cids -= cidsOfNids else: p(f"Both sets are different") mw.col.remCards(cids, notes=False) nidsWithTag = set(mw.col.findNotes("tag:NoteWithNoCard")) p(f"emptyNids is {emptyNids}, nidsWithTag is {nidsWithTag}") for nid in emptyNids - nidsWithTag: note = mw.col.getNote(nid) note.addTag("NoteWithNoCard") p(f"Adding tag to note {note.id}") note.flush() for nid in nidsWithTag - emptyNids: note = mw.col.getNote(nid) # TODO: If there's only 1 note, this method is never triggered. # So the tag stays. note.delTag("NoteWithNoCard") p(f"Removing tag from note {note.id}") note.flush() if emptyNids: showWarning( f"""{len(emptyNids)} note(s) should have been deleted because they had no more cards. They now have the tag "NoteWithNoCard". Please go check them. Then either edit them to save their content, or delete them from the browser.""" ) browser = dialogs.open("Browser", mw, False) browser.form.searchEdit.lineEdit().setText("tag:NoteWithNoCard") browser.onSearchActivated() # end of changes tooltip( ngettext("%d card deleted.", "%d cards deleted.", len(cids)) % len(cids)) mw.reset()
def reject(self) -> None: saveGeom(self, self.geomKey) gui_hooks.state_did_reset.remove(self.onReset) QDialog.reject(self)
def reject(self): self.form.web = None saveGeom(self, self.name) aqt.dialogs.markClosed("NewDeckStats") QDialog.reject(self)
def _onClose(self): saveGeom(self, "simulatorDialog") self._tearDownHooks()
def onFin(code): saveGeom(win, "findDupes")
def on_finished(code: Any) -> None: saveGeom(self, "emptycards")
def _on_finished(self, ok): saveGeom(self, "preview") self.mw.progress.timer(100, self._on_close, False)
def reject(self) -> None: if self._on_close: self._on_close() self.web = None saveGeom(self, self.GEOMETRY_KEY) return QDialog.reject(self)