Exemplo n.º 1
0
def nm_onload():
    """
    Add hooks and initialize menu.
    Call to this function is placed on the end of this file.
    """

    nm_refresh_css_custom_colors_string()

    addHook("unloadProfile", nm_save)
    addHook("profileLoaded", nm_load)
    addHook("showQuestion", take_care_of_night_class)
    addHook("showAnswer", take_care_of_night_class)
    nm_setup_menu()

    Browser.__init__ = wrap(Browser.__init__, nm_browser_init_after)
    if appVersion.startswith('2.1'):
        Editor._addButton = wrap(Editor._addButton, nm_add_class_to_editor_button, "around")
    else:
        Editor._addButton = wrap(Editor._addButton, nm_add_button_name, "around")
    Editor.checkValid = wrap(Editor.checkValid, nm_style_fields)
    Editor.__init__ = wrap(Editor.__init__, nm_editor_init_after)

    # Anki 2.1 Deck Browser background colour
    if appVersion.startswith('2.1'):
        # Editor._loadFinished = wrap(Editor._loadFinished, nm_editor_loadFinished)
        EditorWebView.stdHtml = wrap(EditorWebView.stdHtml, nm_editor_web_view_stdHTML_around, "around")
    else:
        EditorWebView.setHtml = wrap(EditorWebView.setHtml, nm_editor_web_view_set_html_after)

    Browser._renderPreview = wrap(Browser._renderPreview, nm_edit_render_preview_after)
    Browser._cardInfoData = wrap(Browser._cardInfoData, nm_browser_card_info_after, "around")
    EditCurrent.__init__ = wrap(EditCurrent.__init__, nm_edit_current_init_after)
    AddCards.__init__ = wrap(AddCards.__init__, nm_add_init_after)
    CardLayout.renderPreview = wrap(CardLayout.renderPreview, nm_render_preview_after)
Exemplo n.º 2
0
def nm_make_latex_transparent():
    """Overwrite latex generation commands to use transparent images.

    Already generated latex images won't be affected;
    delete those manually from your media folder in order
    to regenerate images in transparent version.
    """
    commands = []

    if appVersion.startswith('2.1'):
        from anki.latex import pngCommands
        from anki.latex import svgCommands
        commands.extend([pngCommands, svgCommands])
    else:
        from anki.latex import latexCmds
        commands.append(latexCmds)

    for command in commands:
        command[1] = [
            "dvipng",
            "-D", "200",
            "-T", "tight",
            "-bg", "Transparent",
            "-z", "9",  # use maximal PNG compression
            "tmp.dvi",
            "-o", "tmp.png"
        ]
Exemplo n.º 3
0
def nm_onload():
	"""
	Add hooks and initialize menu.
	Call to this function is placed on the end of this file.
	"""

	nm_refresh_css_custom_colors_string()

	addHook("unloadProfile", nm_save)
	addHook("profileLoaded", nm_load)
	addHook("showQuestion", take_care_of_night_class)
	addHook("showAnswer", take_care_of_night_class)
	nm_setup_menu()

	Browser.__init__ = wrap(Browser.__init__, nm_browser_init_after)
	Editor._addButton = wrap(Editor._addButton, nm_add_button_name, "around")
	Editor.checkValid = wrap(Editor.checkValid, nm_style_fields)
	Editor.__init__ = wrap(Editor.__init__, nm_editor_init_after)

	# Anki 2.1 Deck Browser background colour
	if appVersion.startswith('2.1'):
		Editor._loadFinished = wrap(Editor._loadFinished, nm_editor_loadFinished)
	EditorWebView.setHtml = wrap(EditorWebView.setHtml, nm_editor_web_view_set_html_after)
	Browser._renderPreview = wrap(Browser._renderPreview, nm_edit_render_preview_after)
	Browser._cardInfoData = wrap(Browser._cardInfoData, nm_browser_card_info_after, "around")
	EditCurrent.__init__ = wrap(EditCurrent.__init__, nm_edit_current_init_after)
	AddCards.__init__ = wrap(AddCards.__init__, nm_add_init_after)
	CardLayout.renderPreview = wrap(CardLayout.renderPreview, nm_render_preview_after)
Exemplo n.º 4
0
def ht_switch():
    is_active_dialog = filter(bool, [x[1] for x in dialogs._dialogs.values()])

    if appVersion.startswith('2.0') and is_active_dialog:
        info = _("Send Help; Dialogs has too many bugs")
        showWarning(info)
        print(info)
    else:
        if ht_state_on:
            ht_off()
        else:
            ht_on()
Exemplo n.º 5
0
def customStudyLifeDrainUi(self, Dialog):
    '''
    Adds LifeDrain configurations to custom study dialog.
    '''
    self.lifeDrainWidget = qt.QGroupBox('Life Drain')
    self.lifeDrainLayout = guiSettingsSetupLayout(self.lifeDrainWidget)
    row = 0
    createSpinBox(self, row, 'maxLifeInput', 'Maximum life', [1, 10000])
    row += 1
    createSpinBox(self, row, 'recoverInput', 'Recover', [0, 1000])
    row += 1
    createSpinBox(self, row, 'currentValueInput', 'Current life', [0, 10000])
    row += 1
    index = 2 if appVersion.startswith('2.0') else 3
    self.verticalLayout.insertWidget(index, self.lifeDrainWidget)
Exemplo n.º 6
0
def nm_switch():
    """
    Switch night mode.
    """

    # Implementation of "setStyleSheet" method in QT is bugged.
    # At some circumstances it causes a seg fault, without throwing any exceptions.
    # So the switch of mode is not allowed when the problematic dialogs are visible.
    is_active_dialog = filter(bool, [x[1] for x in dialogs._dialogs.values()])

    if appVersion.startswith('2.0') and is_active_dialog:
        info = _("Night mode can not be switched when the dialogs are open")
        showWarning(info)
    else:
        if nm_state_on:
            nm_off()
        else:
            nm_on()
Exemplo n.º 7
0
def nm_switch():
	"""
	Switch night mode.
	"""

	# Implementation of "setStyleSheet" method in QT is bugged.
	# At some circumstances it causes a seg fault, without throwing any exceptions.
	# So the switch of mode is not allowed when the problematic dialogs are visible.
	is_active_dialog = filter(bool, [x[1] for x in dialogs._dialogs.values()])

	if appVersion.startswith('2.0') and is_active_dialog:
		info = _("Night mode can not be switched when the dialogs are open")
		showWarning(info)
		print(info)
	else:
		if nm_state_on:
			nm_off()
		else:
			nm_on()
Exemplo n.º 8
0
def nm_append_to_styles(bottom='', body='', top='', decks='',
                        other_bottoms='', overview='', menu='',
                        waiting_screen=''):
    """
    This function changes CSS style of most objects. In basic use,
    it only reloads original styles and refreshes interface.

    All arguments are expected to be strings with CSS styles.
    """
    # Invert images and latex if needed
    if nm_invert_image:
        body += nm_css_iimage
    if nm_invert_latex:
        body += nm_css_ilatex

    # Apply styles to Python objects or by Qt functions.

    mw.setStyleSheet(nm_default_css_menu + menu)
    mw.toolbar._css = nm_default_css_top + top
    mw.reviewer._bottomCSS = nm_default_css_bottom + bottom

    if not appVersion.startswith('2.1'):
        mw.reviewer._css = nm_default_css_body + body
    else:
        mw.reviewer._revHtml = nm_default_reviewer_html + '<style>' + body + '</style>'

    mw.deckBrowser._css = nm_default_css_decks + decks
    mw.deckBrowser.bottom._css = nm_default_css_decks_bottom + other_bottoms
    mw.overview._css = nm_default_css_overview + overview
    mw.overview.bottom._css = nm_default_css_overview_bottom + other_bottoms
    mw.sharedCSS = nm_default_css_waiting_screen + waiting_screen

    # Reload current screen.
    if mw.state == "review":
        mw.reviewer._initWeb()
    if mw.state == "deckBrowser":
        mw.deckBrowser.refresh()
    if mw.state == "overview":
        mw.overview.refresh()

    # Redraw toolbar (should be always visible).
    mw.toolbar.draw()
Exemplo n.º 9
0
from PyQt5.QtWidgets import QMessageBox

from .actions_and_settings import *
from .internals import alert
from .config import Config, ConfigValueGetter
from .css_class import inject_css_class
from .icons import Icons
from .menu import get_or_create_menu, Menu
from .stylers import Styler
from .styles import Style, MessageBoxStyle

__addon_name__ = 'Redesign'
__version__ = '1.2'
__anki_version__ = '2.1'

if not appVersion.startswith(__anki_version__):
    print(('Unsupported version of Anki. '
           'Redesign requires %s to work properly. '
           'Update to Anki 2.1 or higher to use this add-on.') %
          __anki_version__)

# Add your color replacement mappings here - old: new, comma separated


class StylingManager:
    def __init__(self, app):
        self.styles = Style.members
        self.stylers = [styler(app) for styler in Styler.members]
        self.config = ConfigValueGetter(app.config)

    @property
Exemplo n.º 10
0
            lifeDrain.timer.stop()
        else:
            lifeDrain.timer.start()


def recover(increment=True, value=None):
    '''
    Method ran when invoking 'LifeDrain.recover' hook.
    '''
    lifeDrain = getLifeDrain()
    lifeDrain.deckBarManager.recover(increment, value)


# Dealing with key presses is different in Anki 2.0 and 2.1
# This if/elif block deals with the differences
if appVersion.startswith('2.0'):

    def keyHandler(self, evt, _old):
        '''
        Appends 'p' shortcut to pause the drain.
        '''
        key = evt.text()
        if key == 'p':
            toggleTimer()
        else:
            _old(self, evt)

    Reviewer._keyHandler = wrap(Reviewer._keyHandler, keyHandler, 'around')

elif appVersion.startswith('2.1'):
Exemplo n.º 11
0
def nm_setup_menu():
    """
    Initialize menu. If there is an entity "View" in top level menu
    (shared with other plugins, like "Zoom" of R. Sieker) options of
    Night Mode will be putted there. In other case it creates that menu.
    """
    global nm_menu_switch, nm_menu_iimage, nm_menu_ilatex, nm_menu_endial, nm_menu_tlatex

    try:
        mw.addon_view_menu
    except AttributeError:
        mw.addon_view_menu = QMenu(_(u"&View"), mw)

        mw.form.menubar.insertMenu(
            mw.form.menuTools.menuAction(),
            mw.addon_view_menu
        )

    mw.nm_menu = QMenu(_('&Night Mode'), mw)

    mw.addon_view_menu.addMenu(mw.nm_menu)

    nm_menu_switch = QAction(_('&Enable night mode'), mw, checkable=True)
    nm_menu_iimage = QAction(_('&Invert images'), mw, checkable=True)
    nm_menu_ilatex = QAction(_('Invert &latex'), mw, checkable=True)
    nm_menu_endial = QAction(_('Enable in &dialogs'), mw, checkable=True)
    nm_menu_tlatex = QAction(_('Force transparent latex'), mw, checkable=True)
    nm_menu_color_b = QAction(_('Set &background color'), mw)
    nm_menu_color_t = QAction(_('Set &text color'), mw)
    nm_menu_color_r = QAction(_('&Reset colors'), mw)
    nm_menu_about = QAction(_('&About...'), mw)

    mw_toggle_seq = QKeySequence("Ctrl+n")
    nm_menu_switch.setShortcut(mw_toggle_seq)

    mw.nm_menu.addAction(nm_menu_switch)
    mw.nm_menu.addAction(nm_menu_endial)
    mw.nm_menu.addSeparator()
    mw.nm_menu.addAction(nm_menu_iimage)
    mw.nm_menu.addAction(nm_menu_ilatex)
    mw.nm_menu.addAction(nm_menu_tlatex)
    mw.nm_menu.addSeparator()
    mw.nm_menu.addAction(nm_menu_color_b)
    mw.nm_menu.addAction(nm_menu_color_t)
    mw.nm_menu.addAction(nm_menu_color_r)
    mw.nm_menu.addSeparator()
    mw.nm_menu.addAction(nm_menu_about)

    connections = {
        nm_menu_endial: nm_endial,
        nm_menu_switch: nm_switch,
        nm_menu_iimage: nm_iimage,
        nm_menu_ilatex: nm_ilatex,
        nm_menu_tlatex: nm_tlatex,
        nm_menu_color_b: nm_change_color_b,
        nm_menu_color_t: nm_change_color_t,
        nm_menu_color_r: nm_color_reset,
        nm_menu_about: nm_about,
    }

    # Anki 2.1
    if appVersion.startswith('2.1'):
        def connect(menu_entry, function):
            menu_entry.triggered.connect(function)
    # Anki 2.0
    else:
        s = SIGNAL("triggered()")

        def connect(menu_entry, function):
            mw.connect(menu_entry, s, function)

    for menu_entry, function in connections.items():
        connect(menu_entry, function)
Exemplo n.º 12
0
from aqt.addcards import AddCards
from aqt.editor import Editor, EditorWebView
from aqt.clayout import CardLayout
from aqt.browser import Browser, COLOUR_MARKED, COLOUR_SUSPENDED
from aqt.utils import showWarning
from aqt import appVersion


from anki.lang import _
from anki.hooks import addHook
from anki.hooks import wrap
from anki.utils import json


# Anki 2.1
if appVersion.startswith('2.1'):
    from PyQt5.QtCore import pyqtSignal
    from PyQt5.QtWidgets import (QAction, QMenu, QColorDialog, QMessageBox)
    from PyQt5.QtGui import(QKeySequence, QColor)
    from PyQt5 import QtCore
# Anki 2.0
else:
    from PyQt4.QtCore import SIGNAL
    from PyQt4.QtGui import (QAction, QKeySequence, QMenu, QColorDialog,
                             QMessageBox, QColor)
    from PyQt4 import QtCore

from os.path import isfile

try:
    nm_from_utf8 = QtCore.QString.fromUtf8
Exemplo n.º 13
0
from .actions_and_settings import *
from .internals import alert
from .config import Config, ConfigValueGetter
from .css_class import inject_css_class
from .icons import Icons
from .menu import get_or_create_menu, Menu
from .stylers import Styler
from .styles import Style, MessageBoxStyle

__addon_name__ = 'Night Mode'
__version__ = '2.2.4'
__anki_version__ = '2.1'


if not appVersion.startswith(__anki_version__):
    print(
        (
            'Unsupported version of Anki. '
            'Anki-Night-Mode 2.0 requires %s to work properly. '
            'For older versions of Anki use Night-Mode 1.x'
        ) % __anki_version__
    )


# Add here you color replacements mapping - old: new, comma separated


class StylingManager:
    def __init__(self, app):
        self.styles = Style.members
Exemplo n.º 14
0
def nm_setup_menu():
	"""
	Initialize menu. If there is an entity "View" in top level menu
	(shared with other plugins, like "Zoom" of R. Sieker) options of
	Night Mode will be putted there. In other case it creates that menu.
	"""
	global nm_menu_switch, nm_menu_iimage, nm_menu_ilatex, nm_menu_endial

	try:
		mw.addon_view_menu
	except AttributeError:
		mw.addon_view_menu = QMenu(_(u"&View"), mw)
		mw.form.menubar.insertMenu(mw.form.menuTools.menuAction(),
									mw.addon_view_menu)

	mw.nm_menu = QMenu(_('&Night Mode'), mw)

	mw.addon_view_menu.addMenu(mw.nm_menu)

	nm_menu_switch = QAction(_('&Enable night mode'), mw, checkable=True)
	nm_menu_iimage = QAction(_('&Invert images'), mw, checkable=True)
	nm_menu_ilatex = QAction(_('Invert &latex'), mw, checkable=True)
	nm_menu_endial = QAction(_('Enable in &dialogs'), mw, checkable=True)
	nm_menu_color_b = QAction(_('Set &background color'), mw)
	nm_menu_color_t = QAction(_('Set &text color'), mw)
	nm_menu_color_r = QAction(_('&Reset colors'), mw)
	nm_menu_about = QAction(_('&About...'), mw)

	mw_toggle_seq = QKeySequence("Ctrl+n")
	nm_menu_switch.setShortcut(mw_toggle_seq)

	mw.nm_menu.addAction(nm_menu_switch)
	mw.nm_menu.addAction(nm_menu_endial)
	mw.nm_menu.addSeparator()
	mw.nm_menu.addAction(nm_menu_iimage)
	mw.nm_menu.addAction(nm_menu_ilatex)
	mw.nm_menu.addSeparator()
	mw.nm_menu.addAction(nm_menu_color_b)
	mw.nm_menu.addAction(nm_menu_color_t)
	mw.nm_menu.addAction(nm_menu_color_r)
	mw.nm_menu.addSeparator()
	mw.nm_menu.addAction(nm_menu_about)

	# Anki 2.1
	if appVersion.startswith('2.1'):
		nm_menu_endial.triggered.connect(nm_endial)
		nm_menu_switch.triggered.connect(nm_switch)
		nm_menu_iimage.triggered.connect(nm_iimage)
		nm_menu_ilatex.triggered.connect(nm_ilatex)
		nm_menu_color_b.triggered.connect(nm_change_color_b)
		nm_menu_color_t.triggered.connect(nm_change_color_t)
		nm_menu_color_r.triggered.connect(nm_color_reset)
		nm_menu_about.triggered.connect(nm_about)
	# Anki 2.0
	else:
		s = SIGNAL("triggered()")
		mw.connect(nm_menu_endial, s, nm_endial)
		mw.connect(nm_menu_switch, s, nm_switch)
		mw.connect(nm_menu_iimage, s, nm_iimage)
		mw.connect(nm_menu_ilatex, s, nm_ilatex)
		mw.connect(nm_menu_color_b, s, nm_change_color_b)
		mw.connect(nm_menu_color_t, s, nm_change_color_t)
		mw.connect(nm_menu_color_r, s, nm_color_reset)
		mw.connect(nm_menu_about, s, nm_about)
Exemplo n.º 15
0
from aqt.editcurrent import EditCurrent
from aqt.addcards import AddCards
from aqt.editor import Editor, EditorWebView
from aqt.clayout import CardLayout
from aqt.browser import Browser, COLOUR_MARKED, COLOUR_SUSPENDED
from aqt.utils import showWarning
from aqt import appVersion


from anki.lang import _
from anki.hooks import addHook
from anki.hooks import wrap
from anki.utils import json

# Anki 2.1
if appVersion.startswith('2.1'):
	from PyQt5.QtCore import pyqtSignal
	from PyQt5.QtWidgets import (QAction, QMenu, QColorDialog, QMessageBox)
	from PyQt5.QtGui import(QKeySequence, QColor)
	from PyQt5 import QtCore
# Anki 2.0
else:
	from PyQt4.QtCore import SIGNAL
	from PyQt4.QtGui import (QAction, QKeySequence, QMenu, QColorDialog,
							 QMessageBox, QColor)
	from PyQt4 import QtCore

from os.path import isfile

try:
	nm_from_utf8 = QtCore.QString.fromUtf8