def _create_gui(self): self.setWindowTitle(_("Preview")) qconnect(self.finished, self._on_finished) self.silentlyClose = True self.vbox = QVBoxLayout() self.vbox.setContentsMargins(0, 0, 0, 0) self._web = AnkiWebView(title="previewer") self.vbox.addWidget(self._web) self.bottombar = QHBoxLayout() self.bbox = QDialogButtonBox() self._replay = self.bbox.addButton( _("Replay Audio"), QDialogButtonBox.ActionRole ) self._replay.setAutoDefault(False) self._replay.setShortcut(QKeySequence("R")) self._replay.setToolTip(_("Shortcut key: %s" % "R")) qconnect(self._replay.clicked, self._on_replay_audio) self.both_sides_button = QCheckBox(_("Show Both Sides")) self.both_sides_button.setShortcut(QKeySequence("B")) self.both_sides_button.setToolTip(_("Shortcut key: %s" % "B")) self.bbox.addButton(self.both_sides_button, QDialogButtonBox.ActionRole) self._show_both_sides = self.check_preview_both_config() self.both_sides_button.setChecked(self._show_both_sides) qconnect(self.both_sides_button.toggled, self._on_show_both_sides) self.bottombar.addWidget(self.bbox) self.vbox.addLayout(self.bottombar) self.setLayout(self.vbox) restoreGeom(self, "preview")
def _ui_bottom_row(self): hbox = QHBoxLayout() buttons = QDialogButtonBox(Qt.Horizontal, self) # Button to check if content needs to be changed check_btn = buttons.addButton("&Dry-run", QDialogButtonBox.ActionRole) check_btn.setToolTip("Dry-run") check_btn.clicked.connect(lambda _: self.onCheck(mode="dryrun")) # Button to diff the proposed changes diff_btn = buttons.addButton("&Diff", QDialogButtonBox.ActionRole) diff_btn.setToolTip("Diff") diff_btn.clicked.connect(lambda _: self.onCheck(mode="diff")) # Button to make the proposed changes fix_btn = buttons.addButton("&Update", QDialogButtonBox.ActionRole) fix_btn.setToolTip("Update") fix_btn.clicked.connect(lambda _: self.onCheck(mode="update")) # Button to close this dialog close_btn = buttons.addButton("&Close", QDialogButtonBox.RejectRole) close_btn.clicked.connect(self.close) hbox.addWidget(buttons) return hbox
def _create_gui(self): super()._create_gui() self.vbox.removeWidget(self.bbox) self.bottombar = QHBoxLayout() self.browser_button = QPushButton("show in browser") #self.browser_button.setShortcut(QKeySequence("b")) #self.browser_button.setToolTip("Shortcut key: %s" % "b") self.browser_button.clicked.connect(self._on_browser_button) self.bottombar.addWidget(self.browser_button) self.edit_button = self.bbox.addButton("edit", QDialogButtonBox.ButtonRole.HelpRole) #self.edit_button.setShortcut(QKeySequence("e")) #self.edit_button.setToolTip("Shortcut key: %s" % "e") self.edit_button.clicked.connect(self._on_edit_button) self.bottombar.addWidget(self.edit_button) self.showRate = QPushButton("G") # grade - "R" is already used for replay audio self.showRate.setFixedWidth(25) # self.showRate.setShortcut(QKeySequence("g")) # self.showRate.setToolTip("Shortcut key: %s" % "G") self.showRate.clicked.connect(self.onShowRatingBar) # self.bottombar.addWidget(self.showRate) self.bottombar.addWidget(self.bbox) self.vbox.addLayout(self.bottombar)
def _ui_bottom_row(self): hbox = QHBoxLayout() buttons = QDialogButtonBox(Qt.Horizontal, self) # Button to check if content needs to be changed check_btn = buttons.addButton("&Check", QDialogButtonBox.ActionRole) check_btn.setToolTip("Check") check_btn.clicked.connect(lambda _: self.onCheck()) # Button to generate diff of proposed content changes diff_btn = buttons.addButton("&Diff", QDialogButtonBox.ActionRole) diff_btn.setToolTip("Show diff") diff_btn.clicked.connect(lambda _: self.onDiff()) # Button to make the proposed changes fix_btn = buttons.addButton("&Fix", QDialogButtonBox.ActionRole) fix_btn.setToolTip("Fix") fix_btn.clicked.connect(lambda _: self.onFix()) # Button to close this dialog close_btn = buttons.addButton("&Close", QDialogButtonBox.RejectRole) close_btn.clicked.connect(self.close) hbox.addWidget(buttons) return hbox
def __init__(self, editor, parent_window, selected_text, selected_is_url=False): QDialog.__init__(self, parent_window, Qt.Window) self.editor_instance = editor self.parent_window = parent_window self.selected_text = selected_text self.selected_is_url = selected_is_url self.setWindowTitle("Anki: Create a hyperlink") self.resize(DIALOG_SIZE_X, DIALOG_SIZE_Y) restoreGeom(self, "318752047__add_hyperlink") self.pb_ok = QPushButton("&OK", self) self.pb_ok.setEnabled(False) self.pb_ok.clicked.connect( lambda: self.insert_anchor(url_edit.text(), urltext_edit.text())) self.pb_cancel = QPushButton("&Cancel", self) self.pb_cancel.clicked.connect(self.reject) url_label = QLabel("Link to:") url_edit = QLineEdit() url_edit.setPlaceholderText("URL") url_edit.textChanged.connect(lambda: self.enable_ok_button( self.pb_ok, url_edit.text(), urltext_edit.text())) urltext_label = QLabel("Text to display:") urltext_edit = QLineEdit() urltext_edit.setPlaceholderText("Text") urltext_edit.textChanged.connect(lambda: self.enable_ok_button( self.pb_ok, url_edit.text(), urltext_edit.text())) self.button_bar = QHBoxLayout() self.button_bar.addStretch(1) self.button_bar.addWidget(self.pb_cancel) self.button_bar.addWidget(self.pb_ok) self.dialog_vbox = QVBoxLayout() self.dialog_vbox.addWidget(url_label) self.dialog_vbox.addWidget(url_edit) self.dialog_vbox.addWidget(urltext_label) self.dialog_vbox.addWidget(urltext_edit) self.dialog_vbox.addLayout(self.button_bar) self.setLayout(self.dialog_vbox) # if user already selected text, put it in urltext_edit if self.selected_text: if self.selected_is_url: url_edit.setText(self.selected_text) urltext_edit.setFocus() else: urltext_edit.setText(self.selected_text) url_edit.setFocus()
def __init__(self, mw, widget, label=True): QHBoxLayout.__init__(self) self.widget = widget self.mw = mw self.deck = mw.col self.label = label self.setContentsMargins(0, 0, 0, 0) self.setSpacing(8) self.setupModels() addHook('reset', self.onReset) self.widget.setLayout(self)
def __init__(self, mw, widget, label=True, start=None): QHBoxLayout.__init__(self) self.widget = widget self.mw = mw self.deck = mw.col self.label = label self.setContentsMargins(0,0,0,0) self.setSpacing(8) self.setupDecks() self.widget.setLayout(self) addHook('currentModelChanged', self.onModelChange)
def _ui_field_select_rows(self): # combo boxes to select mapping for remaining fields self.mapping_field_selections = [] for field_name in self.file_field_names: # nid can only be used as a join key if field_name == "nid": continue hbox = QHBoxLayout() hbox.setAlignment(Qt.AlignLeft) hbox.addWidget(QLabel("{} -> ".format(field_name))) field_selection = QComboBox() field_selection.addItems([NOTHING_VALUE] + self.note_field_names) width = field_selection.minimumSizeHint().width() field_selection.view().setMinimumWidth(width) if field_name in self.note_field_names and \ field_name != self.note_join_key_selection.currentText(): field_selection.setCurrentText(field_name) else: field_selection.setCurrentText(NOTHING_VALUE) field_selection.currentIndexChanged.connect( lambda _, fs=field_selection: self._combobox_changed(fs)) hbox.addWidget(field_selection) self.mapping_field_selections.append(field_selection) yield hbox
def addToolbar(self, editor): self.editor = editor # Do not show the toolbar in Browser window # FIXME check if possible to find out entity's type if not isinstance(self.editor.parentWindow, Browser): # Add toolbar to the editor self.editor.upperIconsBox = self.editor.iconsBox self.editor.iconsBox = QHBoxLayout() if not isMac: self.editor.iconsBox.setMargin(6) else: self.editor.iconsBox.setMargin(0) self.editor.iconsBox.setSpacing(0) self.editor.outerLayout.addLayout(self.editor.iconsBox) self.editor.searchLine = QLineEdit() self.editor.searchLine.setGeometry(QRect(10, 10, 300, 30)) self.editor.searchLine.setText(u"") self.editor.searchLine.setObjectName(u"searchLine") self.editor.iconsBox.addWidget(self.editor.searchLine) self.editor.search = self.editor._addButton( "search", lambda: self.openSelectDialog(self.editor.searchLine.text()), tip=_(u"Search for an example sentence for the expression"), text=_(u"Search"), size=False, native=True, canDisable=False)
def _ui_bottom_row(self): hbox = QHBoxLayout() buttons = QDialogButtonBox(Qt.Horizontal, self) # Button to export changelog to a CSV file export_btn = buttons.addButton("&Export full history", QDialogButtonBox.ActionRole) export_btn.setToolTip("Export full history to CSV") export_btn.clicked.connect(lambda _: self.onExport()) # Button to close this dialog close_btn = buttons.addButton("&Close", QDialogButtonBox.RejectRole) close_btn.clicked.connect(self.close) hbox.addWidget(buttons) return hbox
def senseiButtons(editor): editor.upperIcondsBox = editor.iconsBox editor.iconsBox = QHBoxLayout() if not isMac: editor.iconsBox.setMargin(6) else: editor.iconsBox.setMargin(0) editor.iconsBox.setSpacing(0) editor.outerLayout.addLayout(editor.iconsBox) editor._addButton("generateRuby", lambda: doIt(editor, generateRuby), key=_("Ctrl+F"), tip=_(u"Automatically generate furigana (Ctrl+F)"), text=_(u"Generate readings"), size=False) editor._addButton("deleteRuby", lambda: doIt(editor, deleteRuby), tip=_(u"Mass delete furigana"), text=_(u"Delete readings"), size=False) editor._addButton("preRender", lambda: doIt(editor, preRender), tip=_(u"Show furigana or markup"), text=_(u"Visual/Code"), size=False) editor._addButton("extractKanji", lambda: extract(editor), tip=_(u"Strip everything but base-clozed kanji"), text=_(u"Extract clozed kanji"), size=False) runHook("senseiButtons", editor) editor.iconsBox.addItem(QSpacerItem(20,1, QSizePolicy.Expanding)) editor.iconsBox.addWidget(QLabel('Furigana ')) editor._addButton("clozeRuby", lambda: doIt(editor, clozeRuby), key=_("Ctrl+H"), tip=_(u"Create a reading excercise (Ctrl+H)"), text=_(u"Cloze/Uncloze"), size=False) editor._addButton("hideRuby", lambda: doIt(editor, hideRuby), tip=_(u"Make ruby texts hidden so they show only up when being asked."), text=_(u"Hide/Show"), size=False) editor.iconsBox.addItem(QSpacerItem(20,1, QSizePolicy.Expanding)) editor.iconsBox.addWidget(QLabel('Kanji ')) editor._addButton("clozeKanji", lambda: doIt(editor, clozeKanji), key=_("Ctrl+J"), tip=_(u"Create a writing excercise (Ctrl+J)"), text=_(u"Cloze/Uncloze"), size=False) editor._addButton("hideBase", lambda: doIt(editor, hideBase), tip=_(u"Make base texts hidden so they are replaced with ◯ signs unless asked."), text=_(u"Hide/Show"), size=False)
def _ui_field_select_row(self): hbox = QHBoxLayout() hbox.setAlignment(Qt.AlignLeft) hbox.addWidget(QLabel("Field:")) model = self.browser.mw.col.getNote(self.nids[0]).model() field_names = self.browser.mw.col.models.fieldNames(model) self.field_selection = QComboBox() self.field_selection.addItems(field_names) hbox.addWidget(self.field_selection) return hbox
def setup(self): # maps self.flayout = QHBoxLayout() self.flayout.setContentsMargins(0, 0, 0, 0) self.fwidg = None self.form.fieldMap.setLayout(self.flayout) self.tlayout = QHBoxLayout() self.tlayout.setContentsMargins(0, 0, 0, 0) self.twidg = None self.form.templateMap.setLayout(self.tlayout) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout self.form.verticalLayout_2.setContentsMargins(0, 11, 0, 0) self.form.verticalLayout_3.setContentsMargins(0, 11, 0, 0) # model chooser import aqt.modelchooser self.form.oldModelLabel.setText(self.old_model['name']) self.modelChooser = aqt.modelchooser.ModelChooser( aqt.mw, self.form.modelChooserWidget, label=False) self.modelChooser.models.setFocus() self.form.buttonBox.helpRequested.connect(self.on_help)
def init_layout(self): self.setWindowTitle(" Prestudy") vbox = QVBoxLayout() vbox.addWidget(QLabel("Select deck to add notes to:")) self.combo_box = QComboBox(self) self.combo_box.addItems(self.deck_names) vbox.addWidget(self.combo_box) vbox.addWidget( QLabel( "(Optional) Enter tag(s) to add to notes, separated by spaces:" )) self.tags_box = QLineEdit() vbox.addWidget(self.tags_box) hbox = QHBoxLayout() self.finish_button = QPushButton("Add Notes") hbox.addStretch(1) hbox.addWidget(self.finish_button) vbox.addLayout(hbox) self.finish_button.clicked.connect(lambda: self.add_notes_action()) self.setLayout(vbox)
def hyperlink_dialog(self): dialog = QDialog(self.parent_window) dialog.setWindowTitle("Create a hyperlink") dialog.resize(DIALOG_SIZE_X, DIALOG_SIZE_Y) ok_button_anchor = QPushButton("&OK", dialog) ok_button_anchor.setEnabled(False) ok_button_anchor.clicked.connect( lambda: self.insert_anchor(url_edit.text(), urltext_edit.text())) ok_button_anchor.clicked.connect(dialog.hide) ok_button_anchor.setAutoDefault(True) cancel_button_anchor = QPushButton("&Cancel", dialog) cancel_button_anchor.clicked.connect(dialog.hide) cancel_button_anchor.setAutoDefault(True) url_label = QLabel("Link to:") url_edit = QLineEdit() url_edit.setPlaceholderText("URL") url_edit.textChanged.connect(lambda: self.enable_ok_button( ok_button_anchor, url_edit.text(), urltext_edit.text())) urltext_label = QLabel("Text to display:") urltext_edit = QLineEdit() urltext_edit.setPlaceholderText("Text") urltext_edit.textChanged.connect(lambda: self.enable_ok_button( ok_button_anchor, url_edit.text(), urltext_edit.text())) button_box = QHBoxLayout() button_box.addStretch(1) button_box.addWidget(cancel_button_anchor) button_box.addWidget(ok_button_anchor) dialog_vbox = QVBoxLayout() dialog_vbox.addWidget(url_label) dialog_vbox.addWidget(url_edit) dialog_vbox.addWidget(urltext_label) dialog_vbox.addWidget(urltext_edit) dialog_vbox.addLayout(button_box) dialog.setLayout(dialog_vbox) # if user already selected text, put it in urltext_edit if self.selected_text: if self.selected_is_url: url_edit.setText(self.selected_text) urltext_edit.setFocus() else: urltext_edit.setText(self.selected_text) url_edit.setFocus() dialog.exec()
def show_text_entry_window(self): """ Show the first window of the utility. This window prompts the user to paste in some text. """ self.text_entry_window = w = QWidget(mw, flags=QtCore.Qt.Window) w.setWindowTitle(" Prestudy") vbox = QVBoxLayout() vbox.addWidget(QLabel("Paste in the text you want to read:")) self.input_text_box = QTextEdit() vbox.addWidget(self.input_text_box) continue_button = QPushButton("Continue") # TODO not sure why a lambda is needed here continue_button.clicked.connect( lambda: self.text_entry_continue_action()) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(continue_button) vbox.addLayout(hbox) w.setLayout(vbox) w.show()
def displaygrid(self, config, units): self.generate(config, units) self.win = QDialog(mw) self.wv = KanjiGridWebView() vl = QVBoxLayout() vl.setContentsMargins(0, 0, 0, 0) vl.addWidget(self.wv) self.wv.stdHtml(self.html) hl = QHBoxLayout() vl.addLayout(hl) sh = QPushButton("Save HTML", clicked=lambda: self.savehtml(config)) hl.addWidget(sh) sp = QPushButton("Save Image", clicked=self.savepng) hl.addWidget(sp) sj = QPushButton("Save JSON", clicked=lambda: self.savejson(config, units)) hl.addWidget(sj) bb = QPushButton("Close", clicked=self.win.reject) hl.addWidget(bb) self.win.setLayout(vl) self.win.resize(500, 400) self.timepoint("Window complete") return 0
def setupMainArea(self): w = self.mainArea = QWidget() l = QHBoxLayout() l.setContentsMargins(0,0,0,0) l.setSpacing(3) left = QWidget() # template area tform = self.tform = aqt.forms.template.Ui_Form() tform.setupUi(left) tform.label1.setText(" →") tform.label2.setText(" →") tform.labelc1.setText(" ↗") tform.labelc2.setText(" ↘") if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout tform.tlayout1.setContentsMargins(0, 11, 0, 0) tform.tlayout2.setContentsMargins(0, 11, 0, 0) tform.tlayout3.setContentsMargins(0, 11, 0, 0) tform.groupBox_3.setTitle(_( "Styling (shared between cards)")) tform.front.textChanged.connect(self.saveCard) tform.css.textChanged.connect(self.saveCard) tform.back.textChanged.connect(self.saveCard) l.addWidget(left, 5) # preview area right = QWidget() pform = self.pform = aqt.forms.preview.Ui_Form() pform.setupUi(right) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout pform.frontPrevBox.setContentsMargins(0, 11, 0, 0) pform.backPrevBox.setContentsMargins(0, 11, 0, 0) self.setupWebviews() l.addWidget(right, 5) w.setLayout(l)
def add_query_row(setting, is_checked=False, **kw): try: default_value = setting.val except: default_value = '' row_label = ' '.join(x.capitalize() for x in setting.replace('_', ' ').split()) hbox = QHBoxLayout() hbox.addWidget(create_checkbox(getattr(QUERY, 'USE_' + setting), default_value=is_checked, **kw)) hbox.addWidget(create_textbox(getattr(QUERY, setting), default_value)) form.addRow(row_label, hbox)
def setupButtons(self): l = self.buttons = QHBoxLayout() help = QPushButton(_("Help")) help.setAutoDefault(False) l.addWidget(help) help.clicked.connect(self.onHelp) l.addStretch() addField = QPushButton(_("Add Field")) addField.setAutoDefault(False) l.addWidget(addField) addField.clicked.connect(self.onAddField) if not self._isCloze(): flip = QPushButton(_("Flip")) flip.setAutoDefault(False) l.addWidget(flip) flip.clicked.connect(self.onFlip) l.addStretch() close = QPushButton(_("Close")) close.setAutoDefault(False) l.addWidget(close) close.clicked.connect(self.accept)
def displaygrid(self, config, units): self.generate(config, units) self.win = QDialog(mw) self.wv = KanjiGridWebView() vl = QVBoxLayout() vl.setContentsMargins(0, 0, 0, 0) vl.addWidget(self.wv) self.wv.stdHtml(self.html) hl = QHBoxLayout() vl.addLayout(hl) sh = QPushButton("Save HTML", clicked=lambda: self.savehtml(config)) hl.addWidget(sh) sp = QPushButton("Save Image", clicked=self.savepng) hl.addWidget(sp) bb = QPushButton("Close", clicked=self.win.reject) hl.addWidget(bb) self.win.setLayout(vl) self.win.resize(500, 400) self.timepoint("Window complete") return 0
def setup_evernote(self): global icoEvernoteWeb global imgEvernoteWeb global elements global evernote_query_last_updated global evernote_pagination_current_page_spinner def update_checkbox(setting): if setting is DECKS.EVERNOTE_NOTEBOOK_INTEGRATION and not elements[DECKS.BASE].text(): return if setting.get.startswith(QUERY.get): update_evernote_query_visibilities() setting.save(elements[setting].isChecked()) # mw.col.conf[setting] = if setting is QUERY.USE_TAGS: update_evernote_query_visibilities() if setting is QUERY.LAST_UPDATED.USE: evernote_query_last_updated_value_set_visibilities() def create_checkbox(setting, label=" ", default_value=False, is_fixed_size=False, fixed_width=None): if isinstance(label, bool): default_value = label label = " " checkbox = QCheckBox(label, self) sval = setting.fetch() if not isinstance(sval, bool): sval = default_value checkbox.setChecked(sval) # noinspection PyUnresolvedReferences checkbox.stateChanged.connect(lambda: update_checkbox(setting)) if is_fixed_size or fixed_width: checkbox.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) if fixed_width: checkbox.setFixedWidth(fixed_width) elements[setting] = checkbox return checkbox def create_checked_checkbox(*a, **kw): kw['default_value'] = True return create_checkbox(*a, **kw) def update_text(setting, text): text = text.strip() setting.save(text) if setting is DECKS.BASE: update_anki_deck_visibilities() if setting.get.startswith(QUERY.get): if text: use_key = getattr(QUERY, 'USE_' + setting.label.name) elements[use_key].setChecked(True) evernote_query_text_changed() if setting is QUERY.SEARCH_TERMS: update_evernote_query_visibilities() def create_textbox(setting, default_value=""): textbox = QLineEdit() textbox.setText(setting.fetch(default_value)) textbox.connect(textbox, SIGNAL("textEdited(QString)"), lambda text: update_text(setting, text)) elements[setting] = textbox return textbox def add_query_row(setting, is_checked=False, **kw): try: default_value = setting.val except: default_value = '' row_label = ' '.join(x.capitalize() for x in setting.replace('_', ' ').split()) hbox = QHBoxLayout() hbox.addWidget(create_checkbox(getattr(QUERY, 'USE_' + setting), default_value=is_checked, **kw)) hbox.addWidget(create_textbox(getattr(QUERY, setting), default_value)) form.addRow(row_label, hbox) def gen_qt_hr(): vbox = QVBoxLayout() hr = QFrame() hr.setAutoFillBackground(True) hr.setFrameShape(QFrame.HLine) hr.setStyleSheet("QFrame { background-color: #0060bf; color: #0060bf; }") hr.setFixedHeight(2) vbox.addWidget(hr) vbox.addSpacing(4) return vbox # Begin setup_evernote() widget = QWidget() layout = QVBoxLayout() elements = {} rm_log_path('Dicts\\') evernote_query_last_updated = DictCaseInsensitive() ########################## QUERY ########################## ##################### QUERY: TEXTBOXES #################### group = QGroupBox("EVERNOTE SEARCH OPTIONS:") group.setStyleSheet('QGroupBox{ font-size: 10px; font-weight: bold; color: rgb(105, 170, 53);}') form = QFormLayout() form.addRow(gen_qt_hr()) # Show Generated Evernote Query Button button_show_generated_evernote_query = QPushButton(icoEvernoteWeb, "Show Full Query", self) button_show_generated_evernote_query.setAutoDefault(False) button_show_generated_evernote_query.connect(button_show_generated_evernote_query, SIGNAL("clicked()"), handle_show_generated_evernote_query) # Add Form Row for Match Any Terms hbox = QHBoxLayout() hbox.addWidget(create_checked_checkbox(QUERY.ANY, " Match Any Terms", is_fixed_size=True)) hbox.addWidget(button_show_generated_evernote_query) form.addRow("<b>Search Parameters:</b>", hbox) # Add Form Rows for Evernote Query Textboxes for el in QUERY_TEXTBOXES: add_query_row(el, 'TAGS' in el) ################### QUERY: LAST UPDATED ################### # Evernote Query: Last Updated Type evernote_query_last_updated.type = QComboBox() evernote_query_last_updated.type.setStyleSheet(' QComboBox { color: rgb(45, 79, 201); font-weight: bold; } ') evernote_query_last_updated.type.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) evernote_query_last_updated.type.addItems([u"Δ Day", u"Δ Week", u"Δ Month", u"Δ Year", "Date", "+ Time"]) evernote_query_last_updated.type.setCurrentIndex(QUERY.LAST_UPDATED.TYPE.fetch(EvernoteQueryLocationType.RelativeDay)) evernote_query_last_updated.type.activated.connect(update_evernote_query_last_updated_type) # Evernote Query: Last Updated Type: Relative Date evernote_query_last_updated.value.relative.spinner = EvernoteQueryLocationValueQSpinBox() evernote_query_last_updated.value.relative.spinner.setVisible(False) evernote_query_last_updated.value.relative.spinner.setStyleSheet( " QSpinBox, EvernoteQueryLocationValueQSpinBox { font-weight: bold; color: rgb(173, 0, 0); } ") evernote_query_last_updated.value.relative.spinner.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) evernote_query_last_updated.value.relative.spinner.connect(evernote_query_last_updated.value.relative.spinner, SIGNAL("valueChanged(int)"), update_evernote_query_last_updated_value_relative_spinner) # Evernote Query: Last Updated Type: Absolute Date evernote_query_last_updated.value.absolute.date = QDateEdit() evernote_query_last_updated.value.absolute.date.setDisplayFormat('M/d/yy') evernote_query_last_updated.value.absolute.date.setCalendarPopup(True) evernote_query_last_updated.value.absolute.date.setVisible(False) evernote_query_last_updated.value.absolute.date.setStyleSheet( "QDateEdit { font-weight: bold; color: rgb(173, 0, 0); } ") evernote_query_last_updated.value.absolute.date.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) evernote_query_last_updated.value.absolute.date.connect(evernote_query_last_updated.value.absolute.date, SIGNAL("dateChanged(QDate)"), update_evernote_query_last_updated_value_absolute_date) # Evernote Query: Last Updated Type: Absolute DateTime evernote_query_last_updated.value.absolute.datetime = QDateTimeEdit() evernote_query_last_updated.value.absolute.datetime.setDisplayFormat('M/d/yy h:mm AP') evernote_query_last_updated.value.absolute.datetime.setCalendarPopup(True) evernote_query_last_updated.value.absolute.datetime.setVisible(False) evernote_query_last_updated.value.absolute.datetime.setStyleSheet( "QDateTimeEdit { font-weight: bold; color: rgb(173, 0, 0); } ") evernote_query_last_updated.value.absolute.datetime.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) evernote_query_last_updated.value.absolute.datetime.connect(evernote_query_last_updated.value.absolute.datetime, SIGNAL("dateTimeChanged(QDateTime)"), update_evernote_query_last_updated_value_absolute_datetime) # Evernote Query: Last Updated Type: Absolute Time evernote_query_last_updated.value.absolute.time = QTimeEdit() evernote_query_last_updated.value.absolute.time.setDisplayFormat('h:mm AP') evernote_query_last_updated.value.absolute.time.setVisible(False) evernote_query_last_updated.value.absolute.time.setStyleSheet( "QTimeEdit { font-weight: bold; color: rgb(143, 0, 30); } ") evernote_query_last_updated.value.absolute.time.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) evernote_query_last_updated.value.absolute.time.connect(evernote_query_last_updated.value.absolute.time, SIGNAL("timeChanged(QTime)"), update_evernote_query_last_updated_value_absolute_time) # Create HBox for Separated Date & Time hbox_datetime = QHBoxLayout() hbox_datetime.addWidget(evernote_query_last_updated.value.absolute.date) hbox_datetime.addWidget(evernote_query_last_updated.value.absolute.time) # Evernote Query: Last Updated Type evernote_query_last_updated.value.stacked_layout = QStackedLayout() evernote_query_last_updated.value.stacked_layout.addWidget(evernote_query_last_updated.value.relative.spinner) evernote_query_last_updated.value.stacked_layout.addItem(hbox_datetime) # Add Form Row for Evernote Query: Last Updated hbox = QHBoxLayout() label = QLabel("Last Updated: ") label.setMinimumWidth(SETTINGS.FORM.LABEL_MINIMUM_WIDTH.val) hbox.addWidget(create_checkbox(QUERY.LAST_UPDATED.USE, is_fixed_size=True)) hbox.addWidget(evernote_query_last_updated.type) hbox.addWidget(evernote_query_last_updated.value.relative.spinner) hbox.addWidget(evernote_query_last_updated.value.absolute.date) hbox.addWidget(evernote_query_last_updated.value.absolute.time) form.addRow(label, hbox) # Add Horizontal Row Separator form.addRow(gen_qt_hr()) ############################ PAGINATION ########################## # Evernote Pagination: Current Page evernote_pagination_current_page_spinner = QSpinBox() evernote_pagination_current_page_spinner.setStyleSheet("QSpinBox { font-weight: bold; color: rgb(173, 0, 0); } ") evernote_pagination_current_page_spinner.setPrefix("PAGE: ") evernote_pagination_current_page_spinner.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) evernote_pagination_current_page_spinner.setValue(EVERNOTE.PAGINATION_CURRENT_PAGE.fetch(1)) evernote_pagination_current_page_spinner.connect(evernote_pagination_current_page_spinner, SIGNAL("valueChanged(int)"), update_evernote_pagination_current_page_spinner) # Evernote Pagination: Automation hbox = QHBoxLayout() hbox.addWidget(create_checked_checkbox(EVERNOTE.AUTO_PAGING, " Automate", fixed_width=105)) hbox.addWidget(evernote_pagination_current_page_spinner) # Add Form Row for Evernote Pagination form.addRow("<b>Pagination:</b>", hbox) # Add Query Form to Group Box group.setLayout(form) # Add Query Group Box to Main Layout layout.addWidget(group) ########################## DECK ########################## # Setup Group Box and Form group = QGroupBox("ANKI NOTE OPTIONS:") group.setStyleSheet('QGroupBox{ font-size: 10px; font-weight: bold; color: rgb(105, 170, 53);}') form = QFormLayout() # Add Horizontal Row Separator form.addRow(gen_qt_hr()) # Add Form Row for Default Anki Deck hbox = QHBoxLayout() hbox.insertSpacing(0, 33) hbox.addWidget(create_textbox(DECKS.BASE, DECKS.BASE_DEFAULT_VALUE)) label_deck = QLabel("<b>Anki Deck:</b>") label_deck.setMinimumWidth(SETTINGS.FORM.LABEL_MINIMUM_WIDTH.val) form.addRow(label_deck, hbox) # Add Form Row for Evernote Notebook Integration label_deck = QLabel("Evernote Notebook:") label_deck.setMinimumWidth(SETTINGS.FORM.LABEL_MINIMUM_WIDTH.val) form.addRow("", create_checked_checkbox(DECKS.EVERNOTE_NOTEBOOK_INTEGRATION, " Append Evernote Notebook")) # Add Horizontal Row Separator form.addRow(gen_qt_hr()) ############################ TAGS ########################## # Add Form Row for Evernote Tag Options label = QLabel("<b>Evernote Tags:</b>") label.setMinimumWidth(SETTINGS.FORM.LABEL_MINIMUM_WIDTH.val) # Tags: Save To Anki Note form.addRow(label, create_checkbox(TAGS.KEEP_TAGS, " Save To Anki Note", TAGS.KEEP_TAGS_DEFAULT_VALUE)) hbox = QHBoxLayout() hbox.insertSpacing(0, 33) hbox.addWidget(create_textbox(TAGS.TO_DELETE)) # Tags: Tags To Delete form.addRow("Tags to Delete:", hbox) form.addRow(" ", create_checkbox(TAGS.DELETE_EVERNOTE_QUERY_TAGS, " Also Delete Search Tags")) # Add Horizontal Row Separator form.addRow(gen_qt_hr()) ############################ NOTE UPDATING ########################## # Note Update Method update_existing_notes = QComboBox() update_existing_notes.setStyleSheet( ' QComboBox { color: #3b679e; font-weight: bold; } QComboBoxItem { color: #A40F2D; font-weight: bold; } ') update_existing_notes.addItems(["Ignore Existing Notes", "Update In-Place", "Delete and Re-Add"]) sval = ANKI.UPDATE_EXISTING_NOTES.fetch() if not isinstance(sval, int): sval = ANKI.UPDATE_EXISTING_NOTES.val update_existing_notes.setCurrentIndex(sval) update_existing_notes.activated.connect(update_update_existing_notes) # Add Form Row for Note Update Method hbox = QHBoxLayout() hbox.insertSpacing(0, 33) hbox.addWidget(update_existing_notes) form.addRow("<b>Note Updating:</b>", hbox) # Add Note Update Method Form to Group Box group.setLayout(form) # Add Note Update Method Group Box to Main Layout layout.addWidget(group) ######################### UPDATE VISIBILITIES ####################### # Update Visibilities of Anki Deck Options update_anki_deck_visibilities() # Update Visibilities of Query Options evernote_query_text_changed() update_evernote_query_visibilities() ######################## ADD TO SETTINGS PANEL ###################### # Vertical Spacer vertical_spacer = QSpacerItem(20, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) layout.addItem(vertical_spacer) # Parent Widget widget.setLayout(layout) # New Tab self.form.tabWidget.addTab(widget, "Anknotes")
def show_words_window(self): """ Show the second window of the utility. This window shows the new words that were extracted from the text. """ self.words_window = QWidget(mw, flags=QtCore.Qt.Window) vbox = QVBoxLayout() vbox.addWidget(QLabel("Enter your vocab size target:")) self.vocab_recommended_radio = QRadioButton( "{} (Recommended)".format(RECOMMENDED_TARGET_VOCAB_SIZE)) self.vocab_custom_radio = QRadioButton("Custom: ") self.vocab_custom_box = LineEditWithFocusedSignal() radio_hbox = QHBoxLayout() radio_hbox.addStretch(1) radio_hbox.addWidget(self.vocab_recommended_radio) radio_hbox.addStretch(2) radio_hbox.addWidget(self.vocab_custom_radio) radio_hbox.addWidget(self.vocab_custom_box) radio_hbox.addStretch(1) vbox.addLayout(radio_hbox) vbox.addWidget(QLabel("These are the new words you should learn:")) self.words_table = self.init_words_table() vbox.addWidget(self.words_table) continue_hbox = QHBoxLayout() continue_hbox.addStretch(1) continue_button = QPushButton("Continue") continue_hbox.addWidget(continue_button) vbox.addLayout(continue_hbox) self.words_window.setLayout(vbox) self.update_words_table() # TODO: for some reason, this disables the blinking cursor in `vocab_custom_box` self.vocab_custom_box.focused.connect( lambda: self.vocab_custom_radio.click()) self.vocab_recommended_radio.clicked.connect( lambda: self.update_words_table()) self.vocab_custom_radio.clicked.connect( lambda: self.update_words_table()) self.vocab_custom_box.textChanged.connect( lambda: self.update_words_table()) continue_button.clicked.connect( lambda: self.words_window_continue_action()) self.words_window.show()
class ChangeModelDialog(QDialog): """ Dialog that allows user to create field and template maps from one note model to another Extrated from main Anki codebase, largely untouched. """ def __init__(self, collection, note_id_list, old_model=None, parent=None): QDialog.__init__(self, parent) self.collection = collection self.note_id_list = note_id_list self.old_model = old_model if self.old_model is None: first_note = Note(collection, id=note_id_list[0]) self.old_model = first_note.model() # todo consider extracting UI file self.form = aqt.forms.changemodel.Ui_Dialog() self.form.setupUi(self) self.setWindowModality(Qt.WindowModal) self.setup() self.pauseUpdate = False self.model_changed(self.collection.models.current()) aqt.utils.restoreGeom(self, "changeModel") anki.hooks.addHook("reset", self.on_reset) anki.hooks.addHook("currentModelChanged", self.on_reset) def setup(self): # maps self.flayout = QHBoxLayout() self.flayout.setContentsMargins(0, 0, 0, 0) self.fwidg = None self.form.fieldMap.setLayout(self.flayout) self.tlayout = QHBoxLayout() self.tlayout.setContentsMargins(0, 0, 0, 0) self.twidg = None self.form.templateMap.setLayout(self.tlayout) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout self.form.verticalLayout_2.setContentsMargins(0, 11, 0, 0) self.form.verticalLayout_3.setContentsMargins(0, 11, 0, 0) # model chooser import aqt.modelchooser self.form.oldModelLabel.setText(self.old_model['name']) self.modelChooser = aqt.modelchooser.ModelChooser( aqt.mw, self.form.modelChooserWidget, label=False) self.modelChooser.models.setFocus() self.form.buttonBox.helpRequested.connect(self.on_help) def on_reset(self): self.model_changed(self.collection.models.current()) def model_changed(self, model): self.targetModel = model self.rebuild_template_map() self.rebuild_field_map() def rebuild_template_map(self, key=None, attr=None): if not key: key = "t" attr = "tmpls" map_widget = getattr(self, key + "widg") layout = getattr(self, key + "layout") src = self.old_model[attr] dst = self.targetModel[attr] if map_widget: layout.removeWidget(map_widget) map_widget.deleteLater() setattr(self, key + "MapWidget", None) map_widget = QWidget() map_widget_layout = QGridLayout() combos = [] targets = [entity['name'] for entity in dst] + [_("Nothing")] indices = {} for i, entity in enumerate(src): map_widget_layout.addWidget(QLabel(_("Change %s to:") % entity['name']), i, 0) combo_box = QComboBox() combo_box.addItems(targets) idx = min(i, len(targets) - 1) combo_box.setCurrentIndex(idx) indices[combo_box] = idx combo_box.currentIndexChanged.connect( lambda entry_id: self.on_combo_changed(entry_id, combo_box, key)) combos.append(combo_box) map_widget_layout.addWidget(combo_box, i, 1) map_widget.setLayout(map_widget_layout) layout.addWidget(map_widget) setattr(self, key + "widg", map_widget) setattr(self, key + "layout", layout) setattr(self, key + "combos", combos) setattr(self, key + "indices", indices) def rebuild_field_map(self): return self.rebuild_template_map(key="f", attr="flds") def on_combo_changed(self, combo_box_index, combo_box, key): indices = getattr(self, key + "indices") if self.pauseUpdate: indices[combo_box] = combo_box_index return combos = getattr(self, key + "combos") if combo_box_index == combo_box.count() - 1: # set to 'nothing' return # find another combo with same index for c in combos: if c == combo_box: continue if c.currentIndex() == combo_box_index: self.pauseUpdate = True c.setCurrentIndex(indices[combo_box]) self.pauseUpdate = False break indices[combo_box] = combo_box_index def get_template_map(self, old=None, combos=None, new=None): if not old: old = self.old_model['tmpls'] combos = self.tcombos new = self.targetModel['tmpls'] model_map = {} for i, f in enumerate(old): idx = combos[i].currentIndex() if idx == len(new): # ignore model_map[f['ord']] = None else: f2 = new[idx] model_map[f['ord']] = f2['ord'] return model_map def get_field_map(self): return self.get_template_map( old=self.old_model['flds'], combos=self.fcombos, new=self.targetModel['flds']) def cleanup(self): anki.hooks.remHook("reset", self.on_reset) anki.hooks.remHook("currentModelChanged", self.on_reset) self.modelChooser.cleanup() aqt.utils.saveGeom(self, "changeModel") def reject(self): # self.cleanup() # return QDialog.reject(self) # Todo: bad, consider disabling button/modifying the ui return self.accept() def accept(self): # check maps field_map = self.get_field_map() templates_map = self.get_template_map() if any(True for template in list(templates_map.values()) if template is None) and \ not aqt.utils.askUser(_( "Any cards mapped to nothing will be deleted. " "If a note has no remaining cards, it will be lost. " "Are you sure you want to continue?")): return self.collection.models.change(self.old_model, self.note_id_list, self.targetModel, field_map, templates_map) self.cleanup() QDialog.accept(self) def closeEvent(self, event): event.ignore() @staticmethod def on_help(): aqt.utils.openHelp("browsermisc")
def setup(self): addonconfig = mw.addonManager.getConfig(__name__) config = types.SimpleNamespace(**addonconfig['defaults']) if addonconfig.get("_debug_time", False): self.timepoint = lambda c: print("%s: %0.3f" % (c, time.time()-self.time)) else: self.timepoint = lambda _: None config.did = mw.col.conf['curDeck'] swin = QDialog(mw) vl = QVBoxLayout() fl = QHBoxLayout() deckcb = QComboBox() deckcb.addItems(sorted(mw.col.decks.allNames())) deckcb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) fl.addWidget(QLabel("Deck: ")) deckcb.setCurrentText(mw.col.decks.get(config.did)['name']) def change_did(deckname): config.did = mw.col.decks.byName(deckname)['id'] deckcb.currentTextChanged.connect(change_did) fl.addWidget(deckcb) vl.addLayout(fl) frm = QGroupBox("Settings") vl.addWidget(frm) il = QVBoxLayout() fl = QHBoxLayout() field = QLineEdit() field.setPlaceholderText("e.g. \"kanji\" or \"sentence-kanji\" (default: \"%s\")" % config.pattern) il.addWidget(QLabel("Pattern or Field names to search for (case insensitive):")) fl.addWidget(field) liter = QCheckBox("Match exactly") liter.setChecked(config.literal) fl.addWidget(liter) il.addLayout(fl) stint = QSpinBox() stint.setRange(1, 65536) stint.setValue(config.interval) il.addWidget(QLabel("Card interval considered strong:")) il.addWidget(stint) ttcol = QSpinBox() ttcol.setRange(1, 99) ttcol.setValue(config.thin) il.addWidget(QLabel("Number of Columns:")) coll = QHBoxLayout() coll.addWidget(QLabel("In-app:")) coll.addWidget(ttcol) wtcol = QSpinBox() wtcol.setRange(1, 99) wtcol.setValue(config.wide) coll.addWidget(QLabel("Exported:")) coll.addWidget(wtcol) itcol = QCheckBox("Don't care") itcol.setChecked(addonconfig['defaults'].get("autothinwide", False)) def disableEnableColumnSettings(state): ttcol.setEnabled(state != Qt.Checked) wtcol.setEnabled(state != Qt.Checked) itcol.stateChanged.connect(disableEnableColumnSettings) disableEnableColumnSettings(itcol.checkState()) coll.addWidget(itcol) il.addLayout(coll) groupby = QComboBox() groupby.addItems([ *("None, sorted by " + x.pretty_value() for x in SortOrder), *(x.name for x in data.groups), ]) groupby.setCurrentIndex(config.groupby) il.addWidget(QLabel("Group by:")) il.addWidget(groupby) shnew = QCheckBox("Show units not yet seen") shnew.setChecked(config.unseen) il.addWidget(shnew) toolt = QCheckBox("Show informational tooltips") toolt.setChecked(config.tooltips) il.addWidget(toolt) frm.setLayout(il) hl = QHBoxLayout() vl.addLayout(hl) gen = QPushButton("Generate", clicked=swin.accept) hl.addWidget(gen) cls = QPushButton("Close", clicked=swin.reject) hl.addWidget(cls) swin.setLayout(vl) swin.setTabOrder(gen, cls) swin.setTabOrder(cls, field) swin.setTabOrder(field, liter) swin.setTabOrder(liter, stint) swin.setTabOrder(stint, ttcol) swin.setTabOrder(ttcol, wtcol) swin.setTabOrder(wtcol, groupby) swin.setTabOrder(groupby, shnew) swin.setTabOrder(shnew, toolt) swin.resize(500, 400) if swin.exec_(): mw.progress.start(immediate=True) if len(field.text().strip()) != 0: config.pattern = field.text().lower() config.pattern = config.pattern.split() config.literal = liter.isChecked() config.interval = stint.value() config.thin = ttcol.value() config.wide = wtcol.value() config.groupby = groupby.currentIndex() config.unseen = shnew.isChecked() config.tooltips = toolt.isChecked() config.autothinwide = itcol.isChecked() self.makegrid(config) mw.progress.finish() self.win.show()
def _setupUi(self): flabel = QLabel("In this field:") self.fsel = QComboBox() fields = self._getFields() self.fsel.addItems(fields) self.cb = QCheckBox() self.cb.setText("transform to plain text") f_hbox = QHBoxLayout() f_hbox.addWidget(flabel) f_hbox.addWidget(self.fsel) f_hbox.addWidget(self.cb) f_hbox.setAlignment(Qt.AlignLeft) button_box = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, orientation=Qt.Horizontal, parent=self, ) bottom_hbox = QHBoxLayout() bottom_hbox.addWidget(button_box) vbox_main = QVBoxLayout() vbox_main.addLayout(f_hbox) vbox_main.addLayout(bottom_hbox) self.setLayout(vbox_main) self.setWindowTitle("Batch Clean Selected Notes") button_box.rejected.connect(self.reject) button_box.accepted.connect(self.accept) self.rejected.connect(self.reject) self.accepted.connect(self.accept) self.fsel.setFocus()
def setupUI(self): mainLayout = QVBoxLayout() self.setLayout(mainLayout) # add widgets to set height and width widthLabel = QLabel('width') heightLabel = QLabel('height') self.widthEdit = QLineEdit(self) self.widthValidate = self.validate_label() self.heightValidate = self.validate_label() self.widthEdit.textEdited.connect( lambda i, v=self.widthValidate: self.onchange(i, v)) self.heightEdit = QLineEdit(self) self.heightEdit.textEdited.connect( lambda i, v=self.heightValidate: self.onchange(i, v)) self.attr2qt["width"] = self.widthEdit self.attr2qt["height"] = self.heightEdit wLayout = QHBoxLayout() wLayout.addWidget(widthLabel) wLayout.addWidget(self.widthEdit) hLayout = QHBoxLayout() hLayout.addWidget(heightLabel) hLayout.addWidget(self.heightEdit) sizeInputLayout = QHBoxLayout() sizeInputLayout.addLayout(wLayout) sizeInputLayout.addLayout(hLayout) labelLayout = QHBoxLayout() labelLayout.addWidget(self.widthValidate) labelLayout.addWidget(self.heightValidate) sizeLayout = QVBoxLayout() sizeLayout.addLayout(sizeInputLayout) sizeLayout.addLayout(labelLayout) # add final layout to main layout mainLayout.addLayout(sizeLayout) mainLayout.addWidget(self.hLine()) # add min- sizes and max- sizes if self.config["min-size"]: minWidthLabel = QLabel("min-width") minHeightLabel = QLabel("min-height") self.minWidthEdit = QLineEdit(self) self.minHeightEdit = QLineEdit(self) minLayout = QHBoxLayout() minLayout.addWidget(minWidthLabel) minLayout.addWidget(self.minWidthEdit) minLayout.addWidget(minHeightLabel) minLayout.addWidget(self.minHeightEdit) self.minWidthEdit.textEdited.connect( lambda i, v=self.widthValidate: self.onchange(i, v)) self.minHeightEdit.textEdited.connect( lambda i, v=self.heightValidate: self.onchange(i, v)) self.attr2qt["min-width"] = self.minWidthEdit self.attr2qt["min-height"] = self.minHeightEdit mainLayout.addLayout(minLayout) mainLayout.addWidget(self.hLine()) if self.config["max-size"]: maxWidthLabel = QLabel("max-width") maxHeightLabel = QLabel("max-height") self.maxWidthEdit = QLineEdit(self) self.maxHeightEdit = QLineEdit(self) maxLayout = QHBoxLayout() maxLayout.addWidget(maxWidthLabel) maxLayout.addWidget(self.maxWidthEdit) maxLayout.addWidget(maxHeightLabel) maxLayout.addWidget(self.maxHeightEdit) self.maxWidthEdit.textEdited.connect( lambda i, v=self.widthValidate: self.onchange(i, v)) self.maxHeightEdit.textEdited.connect( lambda i, v=self.heightValidate: self.onchange(i, v)) self.attr2qt["max-width"] = self.maxWidthEdit self.attr2qt["max-height"] = self.maxHeightEdit mainLayout.addLayout(maxLayout) mainLayout.addWidget(self.hLine()) # add widgets to show original width, height owidthLabel = QLabel('original width') oheightLabel = QLabel('original height') self.originalWidth = QLineEdit(self) self.originalHeight = QLineEdit(self) self.disableLineEdit(self.originalWidth) self.disableLineEdit(self.originalHeight) sizeLayout2 = QHBoxLayout() sizeLayout2.addWidget(owidthLabel) sizeLayout2.addWidget(self.originalWidth) sizeLayout2.addWidget(oheightLabel) sizeLayout2.addWidget(self.originalHeight) mainLayout.addLayout(sizeLayout2) # add Image Occlusion related buttons if self.is_occl: mainLayout.addWidget(self.hLine()) occlLabel = QLabel("Image Occlusion") occlLabel.setStyleSheet("QLabel {font-weight : bold;}") mainLayout.addWidget(occlLabel) occlAllNote = QCheckBox("Apply to all notes") self.occlAllNote = occlAllNote occlLayout = QHBoxLayout() occlLayout.addWidget(occlAllNote) self.attr2qt["Apply to all notes"] = self.occlAllNote if self.curr_fld in self.main.all_occl_flds: occlAllFld = QCheckBox("Apply to all fields") self.occlAllFld = occlAllFld occlLayout.addWidget(occlAllFld) self.attr2qt["Apply to all fields"] = self.occlAllFld mainLayout.addLayout(occlLayout) # add buttons okButton = QPushButton("OK") okButton.clicked.connect(self.clicked_ok) okButton.setDefault(True) okButton.setShortcut("Ctrl+Return") cancelButton = QPushButton("Cancel") cancelButton.clicked.connect(self.clicked_cancel) resetButton = QPushButton("Default") resetButton.clicked.connect(self.clicked_defaults) btnLayout = QHBoxLayout() btnLayout.addStretch(1) btnLayout.addWidget(okButton) btnLayout.addWidget(cancelButton) btnLayout.addWidget(resetButton) mainLayout.addLayout(btnLayout) self.setWindowTitle('Style Editor') self.show()
class SingleCardPreviewerMod(SingleCardPreviewer): def _on_bridge_cmd(self, cmd): super()._on_bridge_cmd(cmd) def _create_gui(self): super()._create_gui() self.vbox.removeWidget(self.bbox) self.bottombar = QHBoxLayout() self.browser_button = QPushButton("show in browser") #self.browser_button.setShortcut(QKeySequence("b")) #self.browser_button.setToolTip("Shortcut key: %s" % "b") self.browser_button.clicked.connect(self._on_browser_button) self.bottombar.addWidget(self.browser_button) self.edit_button = self.bbox.addButton("edit", QDialogButtonBox.ButtonRole.HelpRole) #self.edit_button.setShortcut(QKeySequence("e")) #self.edit_button.setToolTip("Shortcut key: %s" % "e") self.edit_button.clicked.connect(self._on_edit_button) self.bottombar.addWidget(self.edit_button) self.showRate = QPushButton("G") # grade - "R" is already used for replay audio self.showRate.setFixedWidth(25) # self.showRate.setShortcut(QKeySequence("g")) # self.showRate.setToolTip("Shortcut key: %s" % "G") self.showRate.clicked.connect(self.onShowRatingBar) # self.bottombar.addWidget(self.showRate) self.bottombar.addWidget(self.bbox) self.vbox.addLayout(self.bottombar) def _setup_web_view(self): super()._setup_web_view() for child in self.bbox.children(): if isinstance(child, QCheckBox): self.both_sides_button = child self._show_both_sides = self.check_preview_both_config() self.both_sides_button.setChecked(self._show_both_sides) def check_preview_both_config(self): # if True both sides are shown showboth = False if gc("card_preview__default_is_answer"): showboth ^= True overrides = gc("card_preview__override_toggle_from_default_for_notetypes") if my_point_version() <= 49: name = self.card().model()['name'] else: name = self.card().note_type()['name'] if name in overrides: showboth ^= True return showboth def _on_browser_button(self): tooltip('browser clicked') browser = aqt.dialogs.open("Browser", self.mw) query = '"nid:' + str(self.card().nid) + '"' browser.form.searchEdit.lineEdit().setText(query) browser.onSearchActivated() def _on_edit_button(self): note = self.mw.col.getNote(self.card().nid) d = EditNoteWindowFromThisLinkAddon(self.mw, note) d.show() QDialog.reject(self) def onShowRatingBar(self): pass
class ChangeModelDialog(QDialog): """ Dialog that allows user to create field and template maps from one note model to another Extrated from main Anki codebase, largely untouched. """ def __init__(self, collection, note_id_list, old_model=None, parent=None): QDialog.__init__(self, parent) self.collection = collection self.note_id_list = note_id_list self.old_model = old_model if self.old_model is None: first_note = Note(collection, id=note_id_list[0]) self.old_model = first_note.model() # todo consider extracting UI file self.form = aqt.forms.changemodel.Ui_Dialog() self.form.setupUi(self) self.setWindowModality(Qt.WindowModal) self.setup() self.pauseUpdate = False self.model_changed(self.collection.models.current()) aqt.utils.restoreGeom(self, "changeModel") anki.hooks.addHook("reset", self.on_reset) anki.hooks.addHook("currentModelChanged", self.on_reset) def setup(self): # maps self.flayout = QHBoxLayout() self.flayout.setContentsMargins(0, 0, 0, 0) self.fwidg = None self.form.fieldMap.setLayout(self.flayout) self.tlayout = QHBoxLayout() self.tlayout.setContentsMargins(0, 0, 0, 0) self.twidg = None self.form.templateMap.setLayout(self.tlayout) if self.style().objectName() == "gtk+": # gtk+ requires margins in inner layout self.form.verticalLayout_2.setContentsMargins(0, 11, 0, 0) self.form.verticalLayout_3.setContentsMargins(0, 11, 0, 0) # model chooser import aqt.modelchooser self.form.oldModelLabel.setText(self.old_model['name']) self.modelChooser = aqt.modelchooser.ModelChooser( aqt.mw, self.form.modelChooserWidget, label=False) self.modelChooser.models.setFocus() self.form.buttonBox.helpRequested.connect(self.on_help) def on_reset(self): self.model_changed(self.collection.models.current()) def model_changed(self, model): self.targetModel = model self.rebuild_template_map() self.rebuild_field_map() def rebuild_template_map(self, key=None, attr=None): if not key: key = "t" attr = "tmpls" map_widget = getattr(self, key + "widg") layout = getattr(self, key + "layout") src = self.old_model[attr] dst = self.targetModel[attr] if map_widget: layout.removeWidget(map_widget) map_widget.deleteLater() setattr(self, key + "MapWidget", None) map_widget = QWidget() map_widget_layout = QGridLayout() combos = [] targets = [entity['name'] for entity in dst] + [_("Nothing")] indices = {} for i, entity in enumerate(src): map_widget_layout.addWidget( QLabel(_("Change %s to:") % entity['name']), i, 0) combo_box = QComboBox() combo_box.addItems(targets) idx = min(i, len(targets) - 1) combo_box.setCurrentIndex(idx) indices[combo_box] = idx combo_box.currentIndexChanged.connect( lambda entry_id: self.on_combo_changed(entry_id, combo_box, key )) combos.append(combo_box) map_widget_layout.addWidget(combo_box, i, 1) map_widget.setLayout(map_widget_layout) layout.addWidget(map_widget) setattr(self, key + "widg", map_widget) setattr(self, key + "layout", layout) setattr(self, key + "combos", combos) setattr(self, key + "indices", indices) def rebuild_field_map(self): return self.rebuild_template_map(key="f", attr="flds") def on_combo_changed(self, combo_box_index, combo_box, key): indices = getattr(self, key + "indices") if self.pauseUpdate: indices[combo_box] = combo_box_index return combos = getattr(self, key + "combos") if combo_box_index == combo_box.count() - 1: # set to 'nothing' return # find another combo with same index for c in combos: if c == combo_box: continue if c.currentIndex() == combo_box_index: self.pauseUpdate = True c.setCurrentIndex(indices[combo_box]) self.pauseUpdate = False break indices[combo_box] = combo_box_index def get_template_map(self, old=None, combos=None, new=None): if not old: old = self.old_model['tmpls'] combos = self.tcombos new = self.targetModel['tmpls'] model_map = {} for i, f in enumerate(old): idx = combos[i].currentIndex() if idx == len(new): # ignore model_map[f['ord']] = None else: f2 = new[idx] model_map[f['ord']] = f2['ord'] return model_map def get_field_map(self): return self.get_template_map(old=self.old_model['flds'], combos=self.fcombos, new=self.targetModel['flds']) def cleanup(self): anki.hooks.remHook("reset", self.on_reset) anki.hooks.remHook("currentModelChanged", self.on_reset) self.modelChooser.cleanup() aqt.utils.saveGeom(self, "changeModel") def reject(self): # self.cleanup() # return QDialog.reject(self) # Todo: bad, consider disabling button/modifying the ui return self.accept() def accept(self): # check maps field_map = self.get_field_map() templates_map = self.get_template_map() if any(True for template in list(templates_map.values()) if template is None) and \ not aqt.utils.askUser(_( "Any cards mapped to nothing will be deleted. " "If a note has no remaining cards, it will be lost. " "Are you sure you want to continue?")): return self.collection.models.change(self.old_model, self.note_id_list, self.targetModel, field_map, templates_map) self.cleanup() QDialog.accept(self) def closeEvent(self, event): event.ignore() @staticmethod def on_help(): aqt.utils.openHelp("browsermisc")
def _ui_join_keys_row(self): def _fix_width(cb): width = cb.minimumSizeHint().width() cb.view().setMinimumWidth(width) # first row consists of join keys for notes and file hbox = QHBoxLayout() hbox.setAlignment(Qt.AlignLeft) # file join key hbox.addWidget(QLabel("File Join Key:")) self.file_join_key_selection = QComboBox() self.file_join_key_selection.addItems(self.file_field_names) _fix_width(self.file_join_key_selection) if "nid" in self.file_field_names: self.file_join_key_selection.setCurrentText("nid") else: self.file_join_key_selection.setCurrentText( self.file_field_names[0]) self.file_join_key_selection.currentIndexChanged.connect( lambda _: self._combobox_changed(self.file_join_key_selection)) hbox.addWidget(self.file_join_key_selection) # note join key hbox.addWidget(QLabel("Note Join Key:")) self.note_join_key_selection = QComboBox() expanded_note_field_names = ["nid"] + self.note_field_names self.note_join_key_selection.addItems(expanded_note_field_names) _fix_width(self.note_join_key_selection) self.note_join_key_selection_default_value = "nid" if self.file_join_key_selection.currentText( ) in expanded_note_field_names: self.note_join_key_selection.setCurrentText( self.file_join_key_selection.currentText()) else: self.note_join_key_selection.setCurrentText( self.note_join_key_selection_default_value) self.note_join_key_selection.currentIndexChanged.connect( lambda _: self._combobox_changed(self.note_join_key_selection)) hbox.addWidget(self.note_join_key_selection) yield hbox hbox = QHBoxLayout() hbox.addWidget( QLabel("Define the mapping from file fields to note fields. " "Any file fields mapping to nothing will be ignored.")) yield hbox
class Hyperlink(QDialog): def __init__(self, editor, parent_window, selected_visible_text, selected_is_url=False): QDialog.__init__(self, parent_window, Qt.Window) self.editor_instance = editor self.parent_window = parent_window self.visible_text = selected_visible_text self.selected_is_url = selected_is_url self.setWindowTitle("Anki: Create a hyperlink") self.resize(500, 200) restoreGeom(self, "318752047__add_hyperlink") self.pb_ok = QPushButton("&OK", self) self.pb_ok.setEnabled(False) self.pb_ok.clicked.connect(self.store_hyperlink_and_close) self.pb_cancel = QPushButton("&Cancel", self) self.pb_cancel.clicked.connect(self.reject) self.url_label = QLabel("Link to:") self.url_edit = QLineEdit() self.url_edit.setPlaceholderText("URL") self.url_edit.textChanged.connect(self.maybe_enable_ok_button) self.text_label = QLabel("Text to display:") self.text_edit = QLineEdit() self.text_edit.setPlaceholderText("Text") self.text_edit.textChanged.connect(self.maybe_enable_ok_button) self.button_bar = QHBoxLayout() self.button_bar.addStretch(1) self.button_bar.addWidget(self.pb_cancel) self.button_bar.addWidget(self.pb_ok) self.dialog_vbox = QVBoxLayout() self.dialog_vbox.addWidget(self.url_label) self.dialog_vbox.addWidget(self.url_edit) self.dialog_vbox.addWidget(self.text_label) self.dialog_vbox.addWidget(self.text_edit) self.dialog_vbox.addLayout(self.button_bar) self.setLayout(self.dialog_vbox) # if user already selected text, put it in self.text_edit if self.visible_text: if self.selected_is_url: self.url_edit.setText(self.visible_text) self.text_edit.setFocus() else: self.text_edit.setText(self.visible_text) self.url_edit.setFocus() def maybe_enable_ok_button(self): if self.url_edit.text() and self.text_edit.text(): self.pb_ok.setEnabled(True) else: self.pb_ok.setEnabled(False) def reject(self): saveGeom(self, "318752047__add_hyperlink") QDialog.reject(self) def store_hyperlink_and_close(self): self.url = self.url_edit.text() self.text = self.text_edit.text() self.replacement = combine_to_hyperlink(self.url, self.text) saveGeom(self, "318752047__add_hyperlink") self.accept()
def _ui_top_row(self): hbox = QHBoxLayout() hbox.addWidget(QLabel(self.description)) return hbox
def setup(self): addonconfig = mw.addonManager.getConfig(__name__) config = types.SimpleNamespace(**addonconfig['defaults']) if addonconfig.get("_debug_time", False): self.timepoint = lambda c: print("%s: %0.3f" % (c, time.time() - self.time)) else: self.timepoint = lambda _: None config.did = mw.col.conf['curDeck'] swin = QDialog(mw) vl = QVBoxLayout() fl = QHBoxLayout() deckcb = QComboBox() deckcb.addItems(sorted(mw.col.decks.allNames())) deckcb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) fl.addWidget(QLabel("Deck: ")) deckcb.setCurrentText(mw.col.decks.get(config.did)['name']) def change_did(deckname): config.did = mw.col.decks.byName(deckname)['id'] deckcb.currentTextChanged.connect(change_did) fl.addWidget(deckcb) vl.addLayout(fl) frm = QGroupBox("Settings") vl.addWidget(frm) il = QVBoxLayout() fl = QHBoxLayout() field = QLineEdit() field.setPlaceholderText( "e.g. \"kanji\", \"hanzi\" or \"sentence-kanji\" (default: \"%s\")" % config.pattern) il.addWidget( QLabel("Pattern or Field names to search for (case insensitive):")) fl.addWidget(field) liter = QCheckBox("Match exactly") liter.setChecked(config.literal) fl.addWidget(liter) il.addLayout(fl) stint = QSpinBox() stint.setRange(1, 65536) stint.setValue(config.interval) il.addWidget(QLabel("Card interval considered strong:")) il.addWidget(stint) ttcol = QSpinBox() ttcol.setRange(1, 99) ttcol.setValue(config.thin) il.addWidget(QLabel("Number of Columns in the in-app table:")) il.addWidget(ttcol) wtcol = QSpinBox() wtcol.setRange(1, 99) wtcol.setValue(config.wide) il.addWidget(QLabel("Number of Columns in the exported table:")) il.addWidget(wtcol) groupby = QComboBox() groupby.addItems([ *("None, sorted by " + x.pretty_value() for x in SortOrder), *(x.name for x in data.groups), ]) groupby.setCurrentIndex(config.groupby) il.addWidget(QLabel("Group by:")) il.addWidget(groupby) shnew = QCheckBox("Show units not yet seen") shnew.setChecked(config.unseen) il.addWidget(shnew) toolt = QCheckBox("Show informational tooltips") toolt.setChecked(config.tooltips) il.addWidget(toolt) frm.setLayout(il) hl = QHBoxLayout() vl.addLayout(hl) gen = QPushButton("Generate", clicked=swin.accept) hl.addWidget(gen) cls = QPushButton("Close", clicked=swin.reject) hl.addWidget(cls) swin.setLayout(vl) swin.setTabOrder(gen, cls) swin.setTabOrder(cls, field) swin.setTabOrder(field, liter) swin.setTabOrder(liter, stint) swin.setTabOrder(stint, ttcol) swin.setTabOrder(ttcol, wtcol) swin.setTabOrder(wtcol, groupby) swin.setTabOrder(groupby, shnew) swin.setTabOrder(shnew, toolt) swin.resize(500, 400) if swin.exec_(): mw.progress.start(immediate=True) if len(field.text().strip()) != 0: config.pattern = field.text().lower() config.pattern = config.pattern.split() config.literal = liter.isChecked() config.interval = stint.value() config.thin = ttcol.value() config.wide = wtcol.value() config.groupby = groupby.currentIndex() config.unseen = shnew.isChecked() config.tooltips = toolt.isChecked() self.makegrid(config) mw.progress.finish() self.win.show()
class Hyperlink(QDialog): def __init__(self, editor, parent_window, selected_text, selected_is_url=False): QDialog.__init__(self, parent_window, Qt.Window) self.editor_instance = editor self.parent_window = parent_window self.selected_text = selected_text self.selected_is_url = selected_is_url self.setWindowTitle("Anki: Create a hyperlink") self.resize(DIALOG_SIZE_X, DIALOG_SIZE_Y) restoreGeom(self, "318752047__add_hyperlink") self.pb_ok = QPushButton("&OK", self) self.pb_ok.setEnabled(False) self.pb_ok.clicked.connect( lambda: self.insert_anchor(url_edit.text(), urltext_edit.text())) self.pb_cancel = QPushButton("&Cancel", self) self.pb_cancel.clicked.connect(self.reject) url_label = QLabel("Link to:") url_edit = QLineEdit() url_edit.setPlaceholderText("URL") url_edit.textChanged.connect(lambda: self.enable_ok_button( self.pb_ok, url_edit.text(), urltext_edit.text())) urltext_label = QLabel("Text to display:") urltext_edit = QLineEdit() urltext_edit.setPlaceholderText("Text") urltext_edit.textChanged.connect(lambda: self.enable_ok_button( self.pb_ok, url_edit.text(), urltext_edit.text())) self.button_bar = QHBoxLayout() self.button_bar.addStretch(1) self.button_bar.addWidget(self.pb_cancel) self.button_bar.addWidget(self.pb_ok) self.dialog_vbox = QVBoxLayout() self.dialog_vbox.addWidget(url_label) self.dialog_vbox.addWidget(url_edit) self.dialog_vbox.addWidget(urltext_label) self.dialog_vbox.addWidget(urltext_edit) self.dialog_vbox.addLayout(self.button_bar) self.setLayout(self.dialog_vbox) # if user already selected text, put it in urltext_edit if self.selected_text: if self.selected_is_url: url_edit.setText(self.selected_text) urltext_edit.setFocus() else: urltext_edit.setText(self.selected_text) url_edit.setFocus() @staticmethod def enable_ok_button(button, url, text): if url and text: button.setEnabled(True) else: button.setEnabled(False) @staticmethod def combine_to_hyperlink(url, text): # Create a hyperlink string, where `url` is the hyperlink reference # and `text` the content of the tag. text = escape_html_chars(text) if gc("remove whitespace from beginning and end of urls"): url = url.strip() if gc("encode_illegal_characters_in_links"): url = some_percent_encoding(url) out = "<a href=\"{0}\">{1}</a>".format(url, text) return out def reject(self): saveGeom(self, "318752047__add_hyperlink") QDialog.reject(self) def insert_anchor(self, url, text): # Inserts a HTML anchor `<a>` into the text field. self.replacement = self.combine_to_hyperlink(url, text) self.url = url self.text = text saveGeom(self, "318752047__add_hyperlink") self.accept()