tidy up __init__.py

This commit is contained in:
Damien Elmes 2011-03-13 22:06:17 +09:00
parent 103871a5b1
commit fbb7fe8a3e
4 changed files with 60 additions and 134 deletions

View file

@ -1,61 +1,57 @@
# Copyright: Damien Elmes <anki@ichi2.net> # Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
import os, sys, shutil import os, sys
from PyQt4.QtCore import * from PyQt4.QtCore import *
from PyQt4.QtGui import * from PyQt4.QtGui import *
appName="Anki" appName="Anki"
appVersion="1.99" appVersion="1.99"
appWebsite="http://ankisrs.net/" appWebsite="http://ankisrs.net/"
appWiki="http://ichi2.net/anki/wiki/" appWiki="http://ankisrs.net/wiki/"
appHelpSite="http://ankisrs.net/docs/" appHelpSite="http://ankisrs.net/docs/"
appIssueTracker="http://code.google.com/p/anki/issues/list"
appForum="http://groups.google.com/group/ankisrs/topics"
appReleaseNotes="http://ankisrs.net/changes.html"
appDonate="http://ankisrs.net/support/" appDonate="http://ankisrs.net/support/"
mw = None # will be set in init
modDir=os.path.dirname(os.path.abspath(__file__)) modDir=os.path.dirname(os.path.abspath(__file__))
runningDir=os.path.split(modDir)[0] runningDir=os.path.split(modDir)[0]
mw = None # set on init
# py2exe # py2exe
if hasattr(sys, "frozen"): if hasattr(sys, "frozen"):
sys.path.append(modDir) sys.path.append(modDir)
modDir = os.path.dirname(sys.argv[0]) modDir = os.path.dirname(sys.argv[0])
# Dialog manager # Dialog manager - manages modeless windows
########################################################################## ##########################################################################
class DialogManager(object): class DialogManager(object):
def __init__(self): def __init__(self):
self.modelessDialogs = {} from aqt import addcards, cardlist
self._dialogs = {
"AddCards": (addcards.AddCards, None),
"CardList": (cardlist.EditDeck, None),
"Graphs": (self.graphProxy, None)
}
def registerDialog(self, name, klass): def open(self, name, *args):
self.modelessDialogs[name] = (klass, None) (creator, instance) = self._dialogs[name]
if instance:
def open(self, name, obj): instance.activateWindow()
self.modelessDialogs[name] = ( instance.raise_()
self.modelessDialogs[name][0], obj) return instance
else:
instance = creator(*args)
self._dialogs[name][1] = instance
return instance
def close(self, name): def close(self, name):
self.modelessDialogs[name] = ( self._dialogs[name] = (
self.modelessDialogs[name][0], None) self._dialogs[name][0], None)
def get(self, name, *args):
(klass, obj) = self.modelessDialogs[name]
if obj:
obj.activateWindow()
obj.raise_()
return obj
else:
return klass(*args)
def closeAll(self): def closeAll(self):
for (n, (klass, obj)) in self.modelessDialogs.items(): for (n, (creator, instance)) in self._dialogs.items():
if obj: if instance:
obj.forceClose = True instance.forceClose = True
obj.close() instance.close()
self.close(n) self.close(n)
# since we load the graphs dynamically, we need a proxy for this # since we load the graphs dynamically, we need a proxy for this
@ -63,14 +59,9 @@ class DialogManager(object):
import graphs import graphs
return graphs.intervalGraph(*args) return graphs.intervalGraph(*args)
def registerDialogs(self):
self.registerDialog("AddCards", addcards.AddCards)
self.registerDialog("CardList", cardlist.EditDeck)
self.registerDialog("Graphs", self.graphProxy)
dialogs = DialogManager() dialogs = DialogManager()
# App initialisation # Splash screen
########################################################################## ##########################################################################
class SplashScreen(object): class SplashScreen(object):
@ -110,6 +101,9 @@ color: #13486c;
self.splash.finish(obj) self.splash.finish(obj)
self.finished = True self.finished = True
# App initialisation
##########################################################################
class AnkiApp(QApplication): class AnkiApp(QApplication):
def event(self, evt): def event(self, evt):
@ -120,31 +114,17 @@ class AnkiApp(QApplication):
return QApplication.event(self, evt) return QApplication.event(self, evt)
def run(): def run():
import config global mw
mustQuit = False
# home on win32 is broken # home on win32 is broken
mustQuit = False
if sys.platform == "win32": if sys.platform == "win32":
# use appdata if available # use appdata if available
if 'APPDATA' in os.environ: if 'APPDATA' in os.environ:
oldConf = os.path.expanduser("~/.anki/config.db")
oldPlugins = os.path.expanduser("~/.anki/plugins")
os.environ['HOME'] = os.environ['APPDATA'] os.environ['HOME'] = os.environ['APPDATA']
else: else:
oldConf = None
os.environ['HOME'] = "c:\\anki" os.environ['HOME'] = "c:\\anki"
# make and check accessible # make and check accessible
try:
os.makedirs(os.path.expanduser("~/.anki"))
except:
pass
try:
os.listdir(os.path.expanduser("~/.anki"))
except:
oldConf = None
os.environ['HOME'] = "c:\\anki"
# check accessible again
try: try:
os.makedirs(os.path.expanduser("~/.anki")) os.makedirs(os.path.expanduser("~/.anki"))
except: except:
@ -153,45 +133,23 @@ def run():
os.listdir(os.path.expanduser("~/.anki")) os.listdir(os.path.expanduser("~/.anki"))
except: except:
mustQuit = True mustQuit = True
if (oldConf and os.path.exists(oldConf) and not os.path.exists(
oldConf.replace("config.db", "config.db.old"))): # on osx we'll need to add the qt plugins to the search path
try:
shutil.copy2(oldConf,
os.path.expanduser("~/.anki/config.db"))
shutil.copytree(oldPlugins,
os.path.expanduser("~/.anki/plugins"))
except:
pass
os.rename(oldConf, oldConf.replace("config.db",
"config.db.old"))
# setup paths for forms, icons
sys.path.append(modDir)
# jpeg module
rd = runningDir rd = runningDir
if sys.platform.startswith("darwin") and getattr(sys, 'frozen', None): if sys.platform.startswith("darwin") and getattr(sys, 'frozen', None):
rd = os.path.abspath(runningDir + "/../../..") rd = os.path.abspath(runningDir + "/../../..")
QCoreApplication.setLibraryPaths(QStringList([rd])) QCoreApplication.setLibraryPaths(QStringList([rd]))
# create the app
app = AnkiApp(sys.argv) app = AnkiApp(sys.argv)
QCoreApplication.setApplicationName("Anki") QCoreApplication.setApplicationName("Anki")
if mustQuit: if mustQuit:
QMessageBox.warning( QMessageBox.warning(
None, "Anki", "Can't open APPDATA, nor c:\\anki.\n" None, "Anki", "Can't open APPDATA, nor c:\\anki.\n"
"Please try removing foreign characters from your username.") "Please try removing foreign characters from your username.")
sys.exit(1) sys.exit(1)
import forms
splash = SplashScreen(3) splash = SplashScreen(3)
import anki
if anki.version != appVersion:
print "You have libanki %s, but this is ankiqt %s" % (
anki.version, appVersion)
print "\nPlease ensure versions match."
return
# parse args # parse args
import optparse import optparse
parser = optparse.OptionParser() parser = optparse.OptionParser()
@ -200,7 +158,7 @@ def run():
default=os.path.expanduser("~/.anki")) default=os.path.expanduser("~/.anki"))
(opts, args) = parser.parse_args(sys.argv[1:]) (opts, args) = parser.parse_args(sys.argv[1:])
# configuration # setup config
import aqt.config import aqt.config
conf = aqt.config.Config( conf = aqt.config.Config(
unicode(os.path.abspath(opts.config), sys.getfilesystemencoding())) unicode(os.path.abspath(opts.config), sys.getfilesystemencoding()))
@ -211,26 +169,16 @@ def run():
translationPath = "/usr/share/qt4/translations/" translationPath = "/usr/share/qt4/translations/"
if translationPath: if translationPath:
long = conf['interfaceLang'] long = conf['interfaceLang']
if long == "ja_JP":
# qt is inconsistent
long = long.lower()
short = long.split('_')[0] short = long.split('_')[0]
qtTranslator = QTranslator() qtTranslator = QTranslator()
if qtTranslator.load("qt_" + long, translationPath) or \ if qtTranslator.load("qt_" + long, translationPath) or \
qtTranslator.load("qt_" + short, translationPath): qtTranslator.load("qt_" + short, translationPath):
app.installTranslator(qtTranslator) app.installTranslator(qtTranslator)
if conf['alternativeTheme']:
app.setStyle("plastique")
# load main window # load main window
import aqt.main
#ui.importAll()
#ui.dialogs.registerDialogs()
splash.update() splash.update()
import aqt.main
mw = aqt.main.AnkiQt(app, conf, args, splash) mw = aqt.main.AnkiQt(app, conf, args, splash)
app.exec_() app.exec_()
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -9,8 +9,7 @@ import anki
from anki.facts import Fact from anki.facts import Fact
from anki.errors import * from anki.errors import *
from anki.utils import stripHTML, parseTags from anki.utils import stripHTML, parseTags
from aqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter
from aqt import ui
from anki.sound import clearAudioQueue from anki.sound import clearAudioQueue
from anki.hooks import addHook, removeHook from anki.hooks import addHook, removeHook

View file

@ -9,12 +9,10 @@ from PyQt4.QtWebKit import QWebPage
import time, types, sys, re import time, types, sys, re
from operator import attrgetter, itemgetter from operator import attrgetter, itemgetter
import anki, anki.utils, aqt.forms import anki, anki.utils, aqt.forms
from aqt import ui
from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \ from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \
stripHTMLAlt, ids2str stripHTMLAlt, ids2str
from aqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \
from aqt.ui.utils import saveHeader, restoreHeader, saveState, \ saveHeader, restoreHeader, saveState, restoreState, applyStyles
restoreState, applyStyles
from anki.errors import * from anki.errors import *
from anki.db import * from anki.db import *
from anki.stats import CardStats from anki.stats import CardStats

View file

@ -2,8 +2,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
import os, sys, re, types, gettext, stat, traceback, inspect, signal import os, sys, re, stat, traceback, signal
import shutil, time, glob, tempfile, datetime, zipfile, locale import shutil, time, tempfile, zipfile
from operator import itemgetter from operator import itemgetter
from PyQt4.QtCore import * from PyQt4.QtCore import *
@ -13,16 +13,10 @@ from PyQt4 import pyqtconfig
QtConfig = pyqtconfig.Configuration() QtConfig = pyqtconfig.Configuration()
from anki import Deck from anki import Deck
from anki.errors import *
from anki.sound import hasSound, playFromText, clearAudioQueue, stripSounds from anki.sound import hasSound, playFromText, clearAudioQueue, stripSounds
from anki.utils import addTags, parseTags, canonifyTags, \ from anki.utils import addTags, parseTags, canonifyTags, stripHTML, checksum
stripHTML, checksum from anki.hooks import runHook, addHook, removeHook
from anki.stdmodels import BasicModel import anki.consts
from anki.hooks import runHook, addHook, removeHook, _hooks, wrap
from anki.deck import newCardOrderLabels, newCardSchedulingLabels
from anki.deck import revCardOrderLabels, failedCardOptionLabels
import anki.lang
import anki.deck
import aqt, aqt.utils, aqt.view, aqt.help, aqt.status, aqt.facteditor import aqt, aqt.utils, aqt.view, aqt.help, aqt.status, aqt.facteditor
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \ from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
@ -53,7 +47,6 @@ class AnkiQt(QMainWindow):
self.setLang() self.setLang()
self.setupStyle() self.setupStyle()
self.setupFonts() self.setupFonts()
self.setupBackupDir()
self.setupProxy() self.setupProxy()
self.setupMainWindow() self.setupMainWindow()
self.setupDeckBrowser() self.setupDeckBrowser()
@ -708,10 +701,6 @@ counts are %d %d %d
# Deck loading & saving: backend # Deck loading & saving: backend
########################################################################## ##########################################################################
def setupBackupDir(self):
anki.deck.backupDir = os.path.join(
self.config.configPath, "backups")
def loadDeck(self, deckPath, sync=True, interactive=True, uprecent=True): def loadDeck(self, deckPath, sync=True, interactive=True, uprecent=True):
"Load a deck and update the user interface. Maybe sync." "Load a deck and update the user interface. Maybe sync."
self.reviewingStarted = False self.reviewingStarted = False
@ -948,7 +937,6 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
return return
self.deck = DeckStorage.Deck(path) self.deck = DeckStorage.Deck(path)
self.deck.initUndo() self.deck.initUndo()
self.deck.addModel(BasicModel())
self.deck.save() self.deck.save()
if register: if register:
self.updateRecentFiles(self.deck.path) self.updateRecentFiles(self.deck.path)
@ -1534,11 +1522,11 @@ not be touched.""") %
def setupStudyScreen(self): def setupStudyScreen(self):
self.mainWin.buttonStack.hide() self.mainWin.buttonStack.hide()
self.mainWin.newCardOrder.insertItems( self.mainWin.newCardOrder.insertItems(
0, QStringList(newCardOrderLabels().values())) 0, QStringList(anki.consts.newCardOrderLabels().values()))
self.mainWin.newCardScheduling.insertItems( self.mainWin.newCardScheduling.insertItems(
0, QStringList(newCardSchedulingLabels().values())) 0, QStringList(anki.consts.newCardSchedulingLabels().values()))
self.mainWin.revCardOrder.insertItems( self.mainWin.revCardOrder.insertItems(
0, QStringList(revCardOrderLabels().values())) 0, QStringList(anki.consts.revCardOrderLabels().values()))
self.connect(self.mainWin.optionsHelpButton, self.connect(self.mainWin.optionsHelpButton,
SIGNAL("clicked()"), SIGNAL("clicked()"),
lambda: QDesktopServices.openUrl(QUrl( lambda: QDesktopServices.openUrl(QUrl(
@ -1956,15 +1944,6 @@ learnt today")
def onPrefs(self): def onPrefs(self):
aqt.preferences.Preferences(self, self.config) aqt.preferences.Preferences(self, self.config)
def onReportBug(self):
QDesktopServices.openUrl(QUrl(aqt.appIssueTracker))
def onForum(self):
QDesktopServices.openUrl(QUrl(aqt.appForum))
def onReleaseNotes(self):
QDesktopServices.openUrl(QUrl(aqt.appReleaseNotes))
def onAbout(self): def onAbout(self):
aqt.about.show(self) aqt.about.show(self)
@ -2143,6 +2122,8 @@ it to your friends.
def setLang(self): def setLang(self):
"Set the user interface language." "Set the user interface language."
import locale, gettext
import anki.lang
try: try:
locale.setlocale(locale.LC_ALL, '') locale.setlocale(locale.LC_ALL, '')
except: except:
@ -2177,8 +2158,9 @@ it to your friends.
########################################################################## ##########################################################################
def setupSync(self): def setupSync(self):
if not self.config['syncDisableWhenMoved']: print "setupSync()"
anki.deck.Deck.checkSyncHash = lambda self: True #if not self.config['syncDisableWhenMoved']:
# anki.deck.Deck.checkSyncHash = lambda self: True
def syncDeck(self, interactive=True, onlyMerge=False, reload=True): def syncDeck(self, interactive=True, onlyMerge=False, reload=True):
"Synchronise a deck with the server." "Synchronise a deck with the server."
@ -2492,8 +2474,6 @@ This deck already exists on your computer. Overwrite the local copy?"""),
self.connect(m.actionGraphs, s, self.onShowGraph) self.connect(m.actionGraphs, s, self.onShowGraph)
self.connect(m.actionEditLayout, s, self.onCardLayout) self.connect(m.actionEditLayout, s, self.onCardLayout)
self.connect(m.actionAbout, s, self.onAbout) self.connect(m.actionAbout, s, self.onAbout)
self.connect(m.actionReportbug, s, self.onReportBug)
self.connect(m.actionForum, s, self.onForum)
self.connect(m.actionStarthere, s, self.onStartHere) self.connect(m.actionStarthere, s, self.onStartHere)
self.connect(m.actionImport, s, self.onImport) self.connect(m.actionImport, s, self.onImport)
self.connect(m.actionExport, s, self.onExport) self.connect(m.actionExport, s, self.onExport)
@ -2511,7 +2491,6 @@ This deck already exists on your computer. Overwrite the local copy?"""),
self.connect(m.actionOpenPluginFolder, s, self.onOpenPluginFolder) self.connect(m.actionOpenPluginFolder, s, self.onOpenPluginFolder)
self.connect(m.actionEnableAllPlugins, s, self.onEnableAllPlugins) self.connect(m.actionEnableAllPlugins, s, self.onEnableAllPlugins)
self.connect(m.actionDisableAllPlugins, s, self.onDisableAllPlugins) self.connect(m.actionDisableAllPlugins, s, self.onDisableAllPlugins)
self.connect(m.actionReleaseNotes, s, self.onReleaseNotes)
self.connect(m.actionStudyOptions, s, self.onStudyOptions) self.connect(m.actionStudyOptions, s, self.onStudyOptions)
self.connect(m.actionDonate, s, self.onDonate) self.connect(m.actionDonate, s, self.onDonate)
self.connect(m.actionRecordNoiseProfile, s, self.onRecordNoiseProfile) self.connect(m.actionRecordNoiseProfile, s, self.onRecordNoiseProfile)
@ -2802,9 +2781,10 @@ to work with this version of Anki."""))
self.rebuildPluginsMenu() self.rebuildPluginsMenu()
def registerPlugin(self, name, updateId): def registerPlugin(self, name, updateId):
src = os.path.basename(inspect.getfile(inspect.currentframe(1))) return
self.registeredPlugins[src] = {'name': name, # src = os.path.basename(inspect.getfile(inspect.currentframe(1)))
'id': updateId} # self.registeredPlugins[src] = {'name': name,
# 'id': updateId}
def checkForUpdatedPlugins(self): def checkForUpdatedPlugins(self):
pass pass
@ -3255,4 +3235,5 @@ It can take a long time. Proceed?""")):
def setupBackups(self): def setupBackups(self):
# set backups # set backups
anki.deck.numBackups = self.config['numBackups'] print "setupBackups()"
#anki.deck.numBackups = self.config['numBackups']