From 103871a5b10e0692e303d8a5db66883edf945457 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 13 Mar 2011 20:52:02 +0900 Subject: [PATCH] refactor file layout - ankiqt->aqt - move all the files in ui into the top level - move icons_rc.py into aqt/forms, and the qrc into designer/ - remove setuptools --- .gitignore | 6 +- CREDITS | 1 - README | 38 +--- README.development | 4 +- ankiqt/icons_rc.py | 1 - ankiqt/ui/__init__.py | 72 ------ ankiqtmac.py | 16 +- {ankiqt => aqt}/__init__.py | 65 +++++- {ankiqt/ui => aqt}/about.py | 6 +- {ankiqt/ui => aqt}/activetags.py | 8 +- {ankiqt/ui => aqt}/addcards.py | 10 +- {ankiqt/ui => aqt}/cardlist.py | 30 +-- {ankiqt/ui => aqt}/clayout.py | 12 +- {ankiqt => aqt}/config.py | 0 {ankiqt/ui => aqt}/deckproperties.py | 22 +- {ankiqt/ui => aqt}/dropbox.py | 0 {ankiqt/ui => aqt}/exporting.py | 6 +- {ankiqt/ui => aqt}/facteditor.py | 48 ++-- {ankiqt/ui => aqt}/getshared.py | 6 +- {ankiqt/ui => aqt}/graphs.py | 8 +- {ankiqt/ui => aqt}/help.py | 2 +- {ankiqt/ui => aqt}/importing.py | 16 +- {ankiqt/ui => aqt}/main.py | 209 +++++++++--------- {ankiqt/ui => aqt}/modelchooser.py | 10 +- {ankiqt/ui => aqt}/modelproperties.py | 10 +- {ankiqt/ui => aqt}/preferences.py | 8 +- {ankiqt/ui => aqt}/sound.py | 2 +- {ankiqt/ui => aqt}/status.py | 1 - {ankiqt/ui => aqt}/sync.py | 8 +- {ankiqt/ui => aqt}/tagedit.py | 0 {ankiqt/ui => aqt}/tray.py | 0 {ankiqt/ui => aqt}/unsaved.py | 2 +- {ankiqt/ui => aqt}/update.py | 10 +- {ankiqt/ui => aqt}/utils.py | 56 ++--- {ankiqt/ui => aqt}/view.py | 3 +- icons.qrc => designer/icons.qrc | 0 designer/icons/.gitignore | 1 + {icons => designer/icons}/Anki_Add_Tag.png | Bin {icons => designer/icons}/Anki_Card.png | Bin {icons => designer/icons}/Anki_Del_Tag.png | Bin {icons => designer/icons}/Anki_Fact.png | Bin {icons => designer/icons}/anki-logo-thin.png | Bin {icons => designer/icons}/anki-logo.png | Bin {icons => designer/icons}/anki-logo.svg | 0 {icons => designer/icons}/anki-tag.png | Bin {icons => designer/icons}/anki.png | Bin .../icons}/application-exit.png | Bin {icons => designer/icons}/appointment-new.png | Bin .../icons}/arrow-down-double.png | Bin {icons => designer/icons}/arrow-down.png | Bin {icons => designer/icons}/arrow-up-double.png | Bin {icons => designer/icons}/arrow-up.png | Bin {icons => designer/icons}/chronometer.png | Bin {icons => designer/icons}/colors.png | Bin {icons => designer/icons}/colorscm.png | Bin {icons => designer/icons}/configure.png | Bin {icons => designer/icons}/contents.png | Bin {icons => designer/icons}/contents2.png | Bin {icons => designer/icons}/document-export.png | Bin {icons => designer/icons}/document-import.png | Bin {icons => designer/icons}/document-new.png | Bin .../icons}/document-open-recent.png | Bin .../icons}/document-open-remote.png | Bin {icons => designer/icons}/document-open.png | Bin .../icons}/document-preview.png | Bin .../icons}/document-save-as.png | Bin {icons => designer/icons}/document-save.png | Bin {icons => designer/icons}/download.png | Bin {icons => designer/icons}/edit-find.png | Bin {icons => designer/icons}/edit-redo.png | Bin {icons => designer/icons}/edit-rename.png | Bin {icons => designer/icons}/edit-undo.png | Bin {icons => designer/icons}/edit.png | Bin {icons => designer/icons}/editclear.png | Bin {icons => designer/icons}/editdelete.png | Bin {icons => designer/icons}/emblem-favorite.png | Bin .../icons}/emblem-important.png | Bin {icons => designer/icons}/fileclose.png | Bin {icons => designer/icons}/find.png | Bin {icons => designer/icons}/folder_image.png | Bin {icons => designer/icons}/folder_sound.png | Bin .../icons}/format-stroke-color.png | Bin {icons => designer/icons}/games-solve.png | Bin {icons => designer/icons}/generate_07.png | Bin {icons => designer/icons}/go-first.png | Bin {icons => designer/icons}/go-home.png | Bin {icons => designer/icons}/go-jump-today.png | Bin {icons => designer/icons}/go-last.png | Bin {icons => designer/icons}/go-next.png | Bin {icons => designer/icons}/go-previous.png | Bin {icons => designer/icons}/help-contents.png | Bin {icons => designer/icons}/help-hint.png | Bin {icons => designer/icons}/help.png | Bin {icons => designer/icons}/image.png | Bin {icons => designer/icons}/kanji.png | Bin {icons => designer/icons}/kblogger.png | Bin {icons => designer/icons}/kbugbuster.png | Bin {icons => designer/icons}/kexi.png | Bin {icons => designer/icons}/khtml_kget.png | Bin {icons => designer/icons}/kpersonalizer.png | Bin {icons => designer/icons}/layout.png | Bin {icons => designer/icons}/list-add.png | Bin {icons => designer/icons}/math_matrix.png | Bin {icons => designer/icons}/math_sqrt.png | Bin .../icons}/media-playback-pause.png | Bin .../icons}/media-playback-start.png | Bin .../icons}/media-playback-start2.png | Bin .../icons}/media-playback-stop.png | Bin {icons => designer/icons}/media-record.png | Bin {icons => designer/icons}/multisynk.png | Bin .../icons}/package_games_card.png | Bin {icons => designer/icons}/player-time.png | Bin .../icons}/preferences-desktop-font.png | Bin .../icons}/preferences-plugin.png | Bin {icons => designer/icons}/rating.png | Bin {icons => designer/icons}/speaker.png | Bin {icons => designer/icons}/spreadsheet.png | Bin {icons => designer/icons}/sqlitebrowser.png | Bin {icons => designer/icons}/system-shutdown.png | Bin .../icons}/system-software-update.png | Bin {icons => designer/icons}/tex.png | Bin {icons => designer/icons}/text-speak.png | Bin {icons => designer/icons}/text-xml.png | Bin {icons => designer/icons}/text_bold.png | Bin {icons => designer/icons}/text_italic.png | Bin {icons => designer/icons}/text_under.png | Bin .../icons}/view-calendar-tasks.png | Bin .../icons}/view-pim-calendar.png | Bin {icons => designer/icons}/view-pim-news.png | Bin .../icons}/view-sort-ascending.png | Bin .../icons}/view-sort-descending.png | Bin {icons => designer/icons}/view-statistics.png | Bin {icons => designer/icons}/view_text.png | Bin setup.py | 30 --- anki-wait.bat => tools/anki-wait.bat | 1 + tools/build_ui.sh | 10 +- tools/translate.sh | 14 +- 137 files changed, 329 insertions(+), 423 deletions(-) delete mode 100644 CREDITS delete mode 120000 ankiqt/icons_rc.py delete mode 100644 ankiqt/ui/__init__.py rename {ankiqt => aqt}/__init__.py (77%) rename {ankiqt/ui => aqt}/about.py (95%) rename {ankiqt/ui => aqt}/activetags.py (96%) rename {ankiqt/ui => aqt}/addcards.py (97%) rename {ankiqt/ui => aqt}/cardlist.py (98%) rename {ankiqt/ui => aqt}/clayout.py (98%) rename {ankiqt => aqt}/config.py (100%) rename {ankiqt/ui => aqt}/deckproperties.py (95%) rename {ankiqt/ui => aqt}/dropbox.py (100%) rename {ankiqt/ui => aqt}/exporting.py (96%) rename {ankiqt/ui => aqt}/facteditor.py (97%) rename {ankiqt/ui => aqt}/getshared.py (97%) rename {ankiqt/ui => aqt}/graphs.py (98%) rename {ankiqt/ui => aqt}/help.py (99%) rename {ankiqt/ui => aqt}/importing.py (96%) rename {ankiqt/ui => aqt}/main.py (96%) rename {ankiqt/ui => aqt}/modelchooser.py (97%) rename {ankiqt/ui => aqt}/modelproperties.py (98%) rename {ankiqt/ui => aqt}/preferences.py (98%) rename {ankiqt/ui => aqt}/sound.py (97%) rename {ankiqt/ui => aqt}/status.py (99%) rename {ankiqt/ui => aqt}/sync.py (98%) rename {ankiqt/ui => aqt}/tagedit.py (100%) rename {ankiqt/ui => aqt}/tray.py (100%) rename {ankiqt/ui => aqt}/unsaved.py (96%) rename {ankiqt/ui => aqt}/update.py (90%) rename {ankiqt/ui => aqt}/utils.py (89%) rename {ankiqt/ui => aqt}/view.py (99%) rename icons.qrc => designer/icons.qrc (100%) create mode 100644 designer/icons/.gitignore rename {icons => designer/icons}/Anki_Add_Tag.png (100%) rename {icons => designer/icons}/Anki_Card.png (100%) rename {icons => designer/icons}/Anki_Del_Tag.png (100%) rename {icons => designer/icons}/Anki_Fact.png (100%) rename {icons => designer/icons}/anki-logo-thin.png (100%) rename {icons => designer/icons}/anki-logo.png (100%) rename {icons => designer/icons}/anki-logo.svg (100%) rename {icons => designer/icons}/anki-tag.png (100%) rename {icons => designer/icons}/anki.png (100%) rename {icons => designer/icons}/application-exit.png (100%) rename {icons => designer/icons}/appointment-new.png (100%) rename {icons => designer/icons}/arrow-down-double.png (100%) rename {icons => designer/icons}/arrow-down.png (100%) rename {icons => designer/icons}/arrow-up-double.png (100%) rename {icons => designer/icons}/arrow-up.png (100%) rename {icons => designer/icons}/chronometer.png (100%) rename {icons => designer/icons}/colors.png (100%) rename {icons => designer/icons}/colorscm.png (100%) rename {icons => designer/icons}/configure.png (100%) rename {icons => designer/icons}/contents.png (100%) rename {icons => designer/icons}/contents2.png (100%) rename {icons => designer/icons}/document-export.png (100%) rename {icons => designer/icons}/document-import.png (100%) rename {icons => designer/icons}/document-new.png (100%) rename {icons => designer/icons}/document-open-recent.png (100%) rename {icons => designer/icons}/document-open-remote.png (100%) rename {icons => designer/icons}/document-open.png (100%) rename {icons => designer/icons}/document-preview.png (100%) rename {icons => designer/icons}/document-save-as.png (100%) rename {icons => designer/icons}/document-save.png (100%) rename {icons => designer/icons}/download.png (100%) rename {icons => designer/icons}/edit-find.png (100%) rename {icons => designer/icons}/edit-redo.png (100%) rename {icons => designer/icons}/edit-rename.png (100%) rename {icons => designer/icons}/edit-undo.png (100%) rename {icons => designer/icons}/edit.png (100%) rename {icons => designer/icons}/editclear.png (100%) rename {icons => designer/icons}/editdelete.png (100%) rename {icons => designer/icons}/emblem-favorite.png (100%) rename {icons => designer/icons}/emblem-important.png (100%) rename {icons => designer/icons}/fileclose.png (100%) rename {icons => designer/icons}/find.png (100%) rename {icons => designer/icons}/folder_image.png (100%) rename {icons => designer/icons}/folder_sound.png (100%) rename {icons => designer/icons}/format-stroke-color.png (100%) rename {icons => designer/icons}/games-solve.png (100%) rename {icons => designer/icons}/generate_07.png (100%) rename {icons => designer/icons}/go-first.png (100%) rename {icons => designer/icons}/go-home.png (100%) rename {icons => designer/icons}/go-jump-today.png (100%) rename {icons => designer/icons}/go-last.png (100%) rename {icons => designer/icons}/go-next.png (100%) rename {icons => designer/icons}/go-previous.png (100%) rename {icons => designer/icons}/help-contents.png (100%) rename {icons => designer/icons}/help-hint.png (100%) rename {icons => designer/icons}/help.png (100%) rename {icons => designer/icons}/image.png (100%) rename {icons => designer/icons}/kanji.png (100%) rename {icons => designer/icons}/kblogger.png (100%) rename {icons => designer/icons}/kbugbuster.png (100%) rename {icons => designer/icons}/kexi.png (100%) rename {icons => designer/icons}/khtml_kget.png (100%) rename {icons => designer/icons}/kpersonalizer.png (100%) rename {icons => designer/icons}/layout.png (100%) rename {icons => designer/icons}/list-add.png (100%) rename {icons => designer/icons}/math_matrix.png (100%) rename {icons => designer/icons}/math_sqrt.png (100%) rename {icons => designer/icons}/media-playback-pause.png (100%) rename {icons => designer/icons}/media-playback-start.png (100%) rename {icons => designer/icons}/media-playback-start2.png (100%) rename {icons => designer/icons}/media-playback-stop.png (100%) rename {icons => designer/icons}/media-record.png (100%) rename {icons => designer/icons}/multisynk.png (100%) rename {icons => designer/icons}/package_games_card.png (100%) rename {icons => designer/icons}/player-time.png (100%) rename {icons => designer/icons}/preferences-desktop-font.png (100%) rename {icons => designer/icons}/preferences-plugin.png (100%) rename {icons => designer/icons}/rating.png (100%) rename {icons => designer/icons}/speaker.png (100%) rename {icons => designer/icons}/spreadsheet.png (100%) rename {icons => designer/icons}/sqlitebrowser.png (100%) rename {icons => designer/icons}/system-shutdown.png (100%) rename {icons => designer/icons}/system-software-update.png (100%) rename {icons => designer/icons}/tex.png (100%) rename {icons => designer/icons}/text-speak.png (100%) rename {icons => designer/icons}/text-xml.png (100%) rename {icons => designer/icons}/text_bold.png (100%) rename {icons => designer/icons}/text_italic.png (100%) rename {icons => designer/icons}/text_under.png (100%) rename {icons => designer/icons}/view-calendar-tasks.png (100%) rename {icons => designer/icons}/view-pim-calendar.png (100%) rename {icons => designer/icons}/view-pim-news.png (100%) rename {icons => designer/icons}/view-sort-ascending.png (100%) rename {icons => designer/icons}/view-sort-descending.png (100%) rename {icons => designer/icons}/view-statistics.png (100%) rename {icons => designer/icons}/view_text.png (100%) delete mode 100644 setup.py rename anki-wait.bat => tools/anki-wait.bat (80%) diff --git a/.gitignore b/.gitignore index d9a36eca2..69de3da0f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,4 @@ *.pyc *\# *~ -/icons_rc.py -ankiqt/forms -/docs/manual.html -/docs/docbook-xsl.css -/docs/manual.xml +/aqt/forms diff --git a/CREDITS b/CREDITS deleted file mode 100644 index f886034c5..000000000 --- a/CREDITS +++ /dev/null @@ -1 +0,0 @@ -Please see Help>About in Anki. diff --git a/README b/README index a796decc4..2f2b7a8c5 100644 --- a/README +++ b/README @@ -3,11 +3,11 @@ Anki Prerequisites for Linux/FreeBSD/etc: -- a recent Python (2.4 should be fine) -- python-qt/pyqt 4.4+ -- sqlalchemy 0.4.3+ -- simplejson 1.7.3+ -- pysqlite2 1.3+ or python2.5 +- Python 2.4+ +- Python-Qt/PyQt 4.4+ +- SimpleJSON 1.7.3+ +- PySQLite 1.3+ or Python2.5 +- Beautiful Soup For graph generation: @@ -24,35 +24,11 @@ For audio recording support: - pyaudio - lame -For importing SuperMemo XML and exporting text files: - -- python-beautifulsoup - Running / Installation ------------------------------------- -To run from the directory you've untarred it to, - -$ ./anki - -If you want to install it system wide, - -$ (cd libanki && sudo python setup.py install) -$ sudo python setup.py install -$ anki + For more information and the latest version, please see the website at: -http://ichi2.net/anki/ - -Notes -------------------------------------- - -There is a known issue with pysqlite 2.5.2-2.5.5 and older versions of -sqlalchemy. Either downgrade pysqlite to 2.5.1, or upgrade sqlalchemy to -0.5.3. - -If you are unable to find pyqt 4.4+ in your distro and you run Ubuntu, you can -get it by adding the following to your /etc/sources.list: - -deb http://ppa.launchpad.net/kubuntu-members-kde4/ubuntu hardy main +http://ankisrs.net/ diff --git a/README.development b/README.development index 81700237c..6d1df7d1b 100644 --- a/README.development +++ b/README.development @@ -8,8 +8,10 @@ $ git clone https://github.com/dae/ankiqt.git $ cd ankiqt $ ./tools/build_ui.sh +Make sure you rebuild the UI every time you update the sources. + The translations are stored in a bazaar repo for integration with launchpad's -translation services. If you want to use a language other than English, edit +translation services. If you want to use a language other than English: $ cd .. $ mv libanki lib diff --git a/ankiqt/icons_rc.py b/ankiqt/icons_rc.py deleted file mode 120000 index 7ba9e5907..000000000 --- a/ankiqt/icons_rc.py +++ /dev/null @@ -1 +0,0 @@ -../icons_rc.py \ No newline at end of file diff --git a/ankiqt/ui/__init__.py b/ankiqt/ui/__init__.py deleted file mode 100644 index 894cdb94d..000000000 --- a/ankiqt/ui/__init__.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright: Damien Elmes -# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html - -def importAll(): - # a hack - import main - import about - import activetags - import addcards - import cardlist - import deckproperties - import importing - import clayout - import exporting - import facteditor - import help - import modelchooser - import modelproperties - import preferences - import status - import sync - import tagedit - import tray - import unsaved - import update - import utils - import view - import getshared - -class DialogManager(object): - - def __init__(self): - self.modelessDialogs = {} - - def registerDialog(self, name, klass): - self.modelessDialogs[name] = (klass, None) - - def open(self, name, obj): - self.modelessDialogs[name] = ( - self.modelessDialogs[name][0], obj) - - def close(self, name): - self.modelessDialogs[name] = ( - self.modelessDialogs[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): - for (n, (klass, obj)) in self.modelessDialogs.items(): - if obj: - obj.forceClose = True - obj.close() - self.close(n) - - # since we load the graphs dynamically, we need a proxy for this - def graphProxy(self, *args): - import graphs - return graphs.intervalGraph(*args) - - def registerDialogs(self): - self.registerDialog("AddCards", addcards.AddCards) - self.registerDialog("CardList", cardlist.EditDeck) - self.registerDialog("Graphs", self.graphProxy) - -dialogs = DialogManager() diff --git a/ankiqtmac.py b/ankiqtmac.py index b7b0089ff..81fe4048e 100644 --- a/ankiqtmac.py +++ b/ankiqtmac.py @@ -1,17 +1,5 @@ #!/usr/bin/env python -# # hack because py2app barfs on a try block -# -import pkg_resources - -import os, sys - -modDir=os.path.dirname(os.path.abspath(__file__)) -runningDir=os.path.split(modDir)[0] -# set up paths for local development -sys.path.insert(0, os.path.join(runningDir, "libanki")) -sys.path.insert(0, os.path.join(os.path.join(runningDir, ".."), "libanki")) - -import ankiqt -ankiqt.run() +import aqt +aqt.run() diff --git a/ankiqt/__init__.py b/aqt/__init__.py similarity index 77% rename from ankiqt/__init__.py rename to aqt/__init__.py index fc2483161..08fd521b2 100644 --- a/ankiqt/__init__.py +++ b/aqt/__init__.py @@ -14,6 +14,7 @@ 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/" +mw = None # will be set in init modDir=os.path.dirname(os.path.abspath(__file__)) runningDir=os.path.split(modDir)[0] @@ -22,8 +23,52 @@ if hasattr(sys, "frozen"): sys.path.append(modDir) modDir = os.path.dirname(sys.argv[0]) -# we bundle icons_rc as part of the anki source -sys.path.append(os.path.dirname(__file__)) +# Dialog manager +########################################################################## + +class DialogManager(object): + + def __init__(self): + self.modelessDialogs = {} + + def registerDialog(self, name, klass): + self.modelessDialogs[name] = (klass, None) + + def open(self, name, obj): + self.modelessDialogs[name] = ( + self.modelessDialogs[name][0], obj) + + def close(self, name): + self.modelessDialogs[name] = ( + self.modelessDialogs[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): + for (n, (klass, obj)) in self.modelessDialogs.items(): + if obj: + obj.forceClose = True + obj.close() + self.close(n) + + # since we load the graphs dynamically, we need a proxy for this + def graphProxy(self, *args): + import graphs + return graphs.intervalGraph(*args) + + def registerDialogs(self): + self.registerDialog("AddCards", addcards.AddCards) + self.registerDialog("CardList", cardlist.EditDeck) + self.registerDialog("Graphs", self.graphProxy) + +dialogs = DialogManager() # App initialisation ########################################################################## @@ -137,9 +182,8 @@ def run(): sys.exit(1) import forms - import ui - ui.splash = SplashScreen(3) + splash = SplashScreen(3) import anki if anki.version != appVersion: @@ -157,8 +201,8 @@ def run(): (opts, args) = parser.parse_args(sys.argv[1:]) # configuration - import ankiqt.config - conf = ankiqt.config.Config( + import aqt.config + conf = aqt.config.Config( unicode(os.path.abspath(opts.config), sys.getfilesystemencoding())) # qt translations @@ -180,11 +224,12 @@ def run(): app.setStyle("plastique") # load main window - ui.importAll() - ui.dialogs.registerDialogs() - ui.splash.update() + import aqt.main + #ui.importAll() + #ui.dialogs.registerDialogs() + splash.update() - mw = ui.main.AnkiQt(app, conf, args) + mw = aqt.main.AnkiQt(app, conf, args, splash) app.exec_() diff --git a/ankiqt/ui/about.py b/aqt/about.py similarity index 95% rename from ankiqt/ui/about.py rename to aqt/about.py index c63a94b7b..d37f1ff70 100644 --- a/ankiqt/ui/about.py +++ b/aqt/about.py @@ -3,12 +3,12 @@ # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html from PyQt4.QtGui import * -import ankiqt.forms -from ankiqt import appVersion +import aqt.forms +from aqt import appVersion def show(parent): dialog = QDialog(parent) - abt = ankiqt.forms.about.Ui_About() + abt = aqt.forms.about.Ui_About() abt.setupUi(dialog) abouttext = "
" abouttext += '

' + _("Anki is a friendly, intelligent spaced learning \ diff --git a/ankiqt/ui/activetags.py b/aqt/activetags.py similarity index 96% rename from ankiqt/ui/activetags.py rename to aqt/activetags.py index a9b9cf8dd..c35f18a22 100644 --- a/ankiqt/ui/activetags.py +++ b/aqt/activetags.py @@ -3,9 +3,9 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * -import ankiqt +import aqt from anki.utils import parseTags, joinTags, canonifyTags -from ankiqt.ui.utils import saveGeom, restoreGeom +from aqt.ui.utils import saveGeom, restoreGeom class ActiveTagsChooser(QDialog): @@ -13,7 +13,7 @@ class ActiveTagsChooser(QDialog): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.deck = self.parent.deck - self.dialog = ankiqt.forms.activetags.Ui_Dialog() + self.dialog = aqt.forms.activetags.Ui_Dialog() self.dialog.setupUi(self) if type == "new": self.active = "newActive" @@ -129,7 +129,7 @@ class ActiveTagsChooser(QDialog): QDialog.accept(self) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "SelectiveStudy")) def show(parent, type): diff --git a/ankiqt/ui/addcards.py b/aqt/addcards.py similarity index 97% rename from ankiqt/ui/addcards.py rename to aqt/addcards.py index 463f0460b..53f1d6dc4 100644 --- a/ankiqt/ui/addcards.py +++ b/aqt/addcards.py @@ -4,13 +4,13 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import sys, re -import ankiqt.forms +import aqt.forms import anki from anki.facts import Fact from anki.errors import * from anki.utils import stripHTML, parseTags -from ankiqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter -from ankiqt import ui +from aqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter +from aqt import ui from anki.sound import clearAudioQueue from anki.hooks import addHook, removeHook @@ -31,7 +31,7 @@ class AddCards(QDialog): self.parent = parent ui.utils.applyStyles(self) self.config = parent.config - self.dialog = ankiqt.forms.addcards.Ui_AddCards() + self.dialog = aqt.forms.addcards.Ui_AddCards() self.dialog.setupUi(self) self.setWindowTitle(_("Add Items - %s") % parent.deck.name()) self.setupEditor() @@ -63,7 +63,7 @@ class AddCards(QDialog): self.dialog.modelArea.setLayout(self.modelChooser) def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "AddItems")) + QDesktopServices.openUrl(QUrl(aqt.appWiki + "AddItems")) def addButtons(self): self.addButton = QPushButton(_("Add")) diff --git a/ankiqt/ui/cardlist.py b/aqt/cardlist.py similarity index 98% rename from ankiqt/ui/cardlist.py rename to aqt/cardlist.py index 8d7fa7c0a..8bf0233bb 100644 --- a/ankiqt/ui/cardlist.py +++ b/aqt/cardlist.py @@ -8,12 +8,12 @@ from PyQt4.QtCore import * from PyQt4.QtWebKit import QWebPage import time, types, sys, re from operator import attrgetter, itemgetter -import anki, anki.utils, ankiqt.forms -from ankiqt import ui +import anki, anki.utils, aqt.forms +from aqt import ui from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \ stripHTMLAlt, ids2str -from ankiqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter -from ankiqt.ui.utils import saveHeader, restoreHeader, saveState, \ +from aqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter +from aqt.ui.utils import saveHeader, restoreHeader, saveState, \ restoreState, applyStyles from anki.errors import * from anki.db import * @@ -356,7 +356,7 @@ class EditDeck(QMainWindow): self.origModTime = parent.deck.modified self.currentRow = None self.lastFilter = "" - self.dialog = ankiqt.forms.cardlist.Ui_MainWindow() + self.dialog = aqt.forms.cardlist.Ui_MainWindow() self.dialog.setupUi(self) self.setUnifiedTitleAndToolBarOnMac(True) restoreGeom(self, "editor", 38) @@ -919,7 +919,7 @@ where id in (%s)""" % ",".join([ def reschedule(self): n = _("Reschedule") d = QDialog(self) - frm = ankiqt.forms.reschedule.Ui_Dialog() + frm = aqt.forms.reschedule.Ui_Dialog() frm.setupUi(d) if not d.exec_(): return @@ -1066,7 +1066,7 @@ where id in %s""" % ids2str(sf)) def onFont(self): d = QDialog(self) - frm = ankiqt.forms.editfont.Ui_Dialog() + frm = aqt.forms.editfont.Ui_Dialog() frm.setupUi(d) frm.fontCombo.setCurrentFont(QFont( self.parent.config['editFontFamily'])) @@ -1097,7 +1097,7 @@ where id in %s""" % ids2str(sf)) parent=self) return d = QDialog(self) - frm = ankiqt.forms.findreplace.Ui_Dialog() + frm = aqt.forms.findreplace.Ui_Dialog() frm.setupUi(d) fields = sorted(self.currentCard.fact.model.fieldModels, key=attrgetter("name")) frm.field.addItems(QStringList( @@ -1139,14 +1139,14 @@ where id in %s""" % ids2str(sf)) }, parent=self) def onFindReplaceHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Browser#FindReplace")) # Edit: finding dupes ###################################################################### def onFindDupes(self): win = QDialog(self) - dialog = ankiqt.forms.finddupes.Ui_Dialog() + aqt = ankiqt.forms.finddupes.Ui_Dialog() dialog.setupUi(win) restoreGeom(win, "findDupes") fields = sorted(self.currentCard.fact.model.fieldModels, key=attrgetter("name")) @@ -1272,7 +1272,7 @@ select fm.id, fm.name from fieldmodels fm""") ###################################################################### def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "Browser")) + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Browser")) # Generate card dialog ###################################################################### @@ -1283,7 +1283,7 @@ class AddCardChooser(QDialog): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.cms = cms - self.dialog = ankiqt.forms.addcardmodels.Ui_Dialog() + self.dialog = aqt.forms.addcardmodels.Ui_Dialog() self.dialog.setupUi(self) self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"), self.onHelp) @@ -1317,7 +1317,7 @@ order by ordinal""" % ids2str(self.cms)) QDialog.accept(self) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Browser#GenerateCards")) # Change model dialog @@ -1331,7 +1331,7 @@ class ChangeModelDialog(QDialog): self.origModel = self.parent.deck.currentModel self.oldModel = oldModel self.oldTemplate = oldTemplate - self.form = ankiqt.forms.changemodel.Ui_Dialog() + self.form = aqt.forms.changemodel.Ui_Dialog() self.form.setupUi(self) # maps self.fieldMapWidget = None @@ -1478,5 +1478,5 @@ Are you sure you want to continue?"""), parent=self): return QDialog.accept(self) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Browser#ChangeModel")) diff --git a/ankiqt/ui/clayout.py b/aqt/clayout.py similarity index 98% rename from ankiqt/ui/clayout.py rename to aqt/clayout.py index a40bc8481..6d8f67598 100644 --- a/ankiqt/ui/clayout.py +++ b/aqt/clayout.py @@ -5,16 +5,16 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * from PyQt4.QtWebKit import QWebPage, QWebView import sys, re -import ankiqt.forms +import aqt.forms import anki from anki.models import * from anki.facts import * from anki.cards import Card from anki.sound import playFromText, clearAudioQueue -from ankiqt.ui.utils import saveGeom, restoreGeom, getBase, mungeQA, \ +from aqt.ui.utils import saveGeom, restoreGeom, getBase, mungeQA, \ saveSplitter, restoreSplitter from anki.hooks import runFilter -from ankiqt import ui +from aqt import ui class ResizingTextEdit(QTextEdit): def sizeHint(self): @@ -25,7 +25,7 @@ class CardLayout(QDialog): def __init__(self, parent, factedit, factOrModel, card=None): self.parent = parent QDialog.__init__(self, parent, Qt.Window) - self.mw = ankiqt.mw + self.mw = aqt.mw self.deck = self.mw.deck self.factedit = factedit self.card = card @@ -69,7 +69,7 @@ class CardLayout(QDialog): "Please enter some text first."), parent=self.parent) return - self.form = ankiqt.forms.clayout.Ui_Dialog() + self.form = aqt.forms.clayout.Ui_Dialog() self.form.setupUi(self) restoreSplitter(self.form.splitter, "clayout") if type == 0: @@ -325,7 +325,7 @@ order by n""", id=card.id) QDialog.reject(self) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "CardLayout")) # Fields diff --git a/ankiqt/config.py b/aqt/config.py similarity index 100% rename from ankiqt/config.py rename to aqt/config.py diff --git a/ankiqt/ui/deckproperties.py b/aqt/deckproperties.py similarity index 95% rename from ankiqt/ui/deckproperties.py rename to aqt/deckproperties.py index 31580c740..397668af1 100644 --- a/ankiqt/ui/deckproperties.py +++ b/aqt/deckproperties.py @@ -4,14 +4,14 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import sys, re, time -import ankiqt.forms +import aqt.forms import anki -from ankiqt import ui +from aqt import ui from anki.utils import parseTags from anki.deck import newCardOrderLabels, newCardSchedulingLabels from anki.deck import revCardOrderLabels from anki.utils import hexifyID, dehexifyID -import ankiqt +import aqt class DeckProperties(QDialog): @@ -21,7 +21,7 @@ class DeckProperties(QDialog): self.d = deck self.onFinish = onFinish self.origMod = self.d.modified - self.dialog = ankiqt.forms.deckproperties.Ui_DeckProperties() + self.dialog = aqt.forms.deckproperties.Ui_DeckProperties() self.dialog.setupUi(self) self.dialog.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False) self.dialog.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False) @@ -84,8 +84,8 @@ class DeckProperties(QDialog): self.dialog.modelsList.addItem(item) cm = self.d.currentModel try: - if ankiqt.mw.currentCard: - cm = ankiqt.mw.currentCard.fact.model + if aqt.mw.currentCard: + cm = aqt.mw.currentCard.fact.model except: # model has been deleted pass @@ -133,7 +133,7 @@ class DeckProperties(QDialog): self.d.deleteModel(model) self.updateModelsList() self.dialog.modelsList.setCurrentRow(row) - ankiqt.mw.reset() + aqt.mw.reset() def selectedModel(self): row = self.dialog.modelsList.currentRow() @@ -147,7 +147,7 @@ class DeckProperties(QDialog): self.d.setModified() def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "DeckProperties")) def reject(self): @@ -230,12 +230,12 @@ class DeckProperties(QDialog): self.d.setVar('perDay', self.dialog.perDay.isChecked()) # mark deck dirty and close if self.origMod != self.d.modified: - ankiqt.mw.deck.updateCutoff() - ankiqt.mw.reset() + aqt.mw.deck.updateCutoff() + aqt.mw.reset() self.d.setUndoEnd(n) self.d.finishProgress() if self.onFinish: self.onFinish() QDialog.reject(self) if needSync: - ankiqt.mw.syncDeck(interactive=-1) + aqt.mw.syncDeck(interactive=-1) diff --git a/ankiqt/ui/dropbox.py b/aqt/dropbox.py similarity index 100% rename from ankiqt/ui/dropbox.py rename to aqt/dropbox.py diff --git a/ankiqt/ui/exporting.py b/aqt/exporting.py similarity index 96% rename from ankiqt/ui/exporting.py rename to aqt/exporting.py index 97d733c24..5dc113592 100644 --- a/ankiqt/ui/exporting.py +++ b/aqt/exporting.py @@ -3,10 +3,10 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * -import anki, ankiqt +import anki, aqt from anki.exporting import exporters as exporters_ from anki.utils import parseTags -from ankiqt import ui +from aqt import ui class PackagedAnkiExporter(object): def __init__(self, *args): @@ -24,7 +24,7 @@ class ExportDialog(QDialog): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.deck = parent.deck - self.dialog = ankiqt.forms.exporting.Ui_ExportDialog() + self.dialog = aqt.forms.exporting.Ui_ExportDialog() self.dialog.setupUi(self) self.exporter = None self.setup() diff --git a/ankiqt/ui/facteditor.py b/aqt/facteditor.py similarity index 97% rename from ankiqt/ui/facteditor.py rename to aqt/facteditor.py index 7ef910ead..8cf844c5a 100644 --- a/ankiqt/ui/facteditor.py +++ b/aqt/facteditor.py @@ -8,11 +8,10 @@ from PyQt4.QtSvg import * from PyQt4.QtWebKit import QWebPage import re, os, sys, tempfile, urllib2, ctypes from anki.utils import stripHTML, tidyHTML, canonifyTags, fieldChecksum -from ankiqt.ui.sound import getAudio +from aqt.sound import getAudio import anki.sound -from ankiqt import ui -import ankiqt -from ankiqt.ui.utils import mungeQA, saveGeom, restoreGeom +import aqt +from aqt.utils import mungeQA, saveGeom, restoreGeom from anki.hooks import addHook, removeHook, runHook, runFilter from sqlalchemy.exceptions import InvalidRequestError @@ -144,7 +143,8 @@ class FactEditor(object): self.tagsBox = QHBoxLayout() self.tagsLabel = QLabel(_("Tags")) self.tagsBox.addWidget(self.tagsLabel) - self.tags = ui.tagedit.TagEdit(self.parent) + import aqt.tagedit + self.tags = aqt.tagedit.TagEdit(self.parent) self.tags.connect(self.tags, SIGNAL("lostFocus"), self.onTagChange) self.tagsBox.addWidget(self.tags) @@ -337,7 +337,7 @@ class FactEditor(object): self.fieldsFrame = None self.widget.setLayout(self.fieldsBox) # show advanced buttons? - if not ankiqt.mw.config['factEditorAdvanced']: + if not aqt.mw.config['factEditorAdvanced']: self.onMore(False) def _makeGrid(self): @@ -476,7 +476,7 @@ class FactEditor(object): return modified def onFocusLost(self, widget): - from ankiqt import mw + from aqt import mw if not self.fact: # editor or deck closed return @@ -488,7 +488,7 @@ class FactEditor(object): self.fact.setModified(textChanged=True, deck=self.deck) self.loadFields(font=False) if modified and self.resetOnEdit: - ankiqt.mw.reset(runHooks=False) + aqt.mw.reset(runHooks=False) def onTextChanged(self): interval = 250 @@ -503,7 +503,7 @@ class FactEditor(object): self.onChangeTimer) def onChangeTimer(self): - from ankiqt import mw + from aqt import mw interval = 250 if not self.fact: return @@ -591,7 +591,7 @@ class FactEditor(object): self.fact.setModified(textChanged=True, deck=self.deck) self.deck.flushMod() if self.resetOnEdit: - ankiqt.mw.reset(runHooks=False) + aqt.mw.reset(runHooks=False) if self.onChange: self.onChange('tag') @@ -665,7 +665,7 @@ class FactEditor(object): txtcol) def colourChanged(self): - recent = ankiqt.mw.config['recentColours'] + recent = aqt.mw.config['recentColours'] self._updateForegroundButton(recent[-1]) def onForeground(self): @@ -683,7 +683,7 @@ class FactEditor(object): self.colourChoose = QShortcut(QKeySequence("F6"), p) p.connect(self.colourChoose, SIGNAL("activated()"), self.onChooseColourKey) - for n, c in enumerate(reversed(ankiqt.mw.config['recentColours'])): + for n, c in enumerate(reversed(aqt.mw.config['recentColours'])): col = QToolButton() col.setAutoRaise(True) col.setFixedWidth(64) @@ -717,7 +717,7 @@ class FactEditor(object): p.show() def onRemoveColour(self, colour): - recent = ankiqt.mw.config['recentColours'] + recent = aqt.mw.config['recentColours'] recent.remove(colour) if not recent: recent.append("#000000") @@ -739,7 +739,7 @@ class FactEditor(object): pass def onChooseColour(self, colour): - recent = ankiqt.mw.config['recentColours'] + recent = aqt.mw.config['recentColours'] recent.remove(colour) recent.append(colour) w = self.lastFocusedEdit @@ -751,7 +751,7 @@ class FactEditor(object): def onNewColour(self): new = QColorDialog.getColor(Qt.white, self.parent) self.parent.raise_() - recent = ankiqt.mw.config['recentColours'] + recent = aqt.mw.config['recentColours'] if new.isValid(): txtcol = unicode(new.name()) if txtcol not in recent: @@ -795,7 +795,7 @@ class FactEditor(object): def onMore(self, toggle=None): if toggle is None: toggle = not self.latex.isVisible() - ankiqt.mw.config['factEditorAdvanced'] = toggle + aqt.mw.config['factEditorAdvanced'] = toggle self.latex.setShown(toggle) self.latexEqn.setShown(toggle) self.latexMathEnv.setShown(toggle) @@ -884,13 +884,13 @@ class FactEditor(object): def onHtmlEdit(self): def helpRequested(): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "HtmlEditor")) w = self.focusedEdit() if w: self.saveFields() d = QDialog(self.parent) - form = ankiqt.forms.edithtml.Ui_Dialog() + form = aqt.forms.edithtml.Ui_Dialog() form.setupUi(d) d.connect(form.buttonBox, SIGNAL("helpRequested()"), helpRequested) @@ -972,7 +972,7 @@ class FactEditor(object): w.insertHtml('[sound:%s]' % path) def maybeDelete(self, new, old): - if not ankiqt.mw.config['deleteMedia']: + if not aqt.mw.config['deleteMedia']: return if new == os.path.basename(old): return @@ -1022,7 +1022,7 @@ class FactEdit(QTextEdit): if source.hasHtml() and "qrichtext" in unicode(source.html()): self.insertHtml(source.html()) return True - if source.hasText() and (ankiqt.mw.config['stripHTML'] or + if source.hasText() and (aqt.mw.config['stripHTML'] or not source.hasHtml()): txt = unicode(source.text()) l = txt.lower() @@ -1086,7 +1086,7 @@ class FactEdit(QTextEdit): def _retrieveURL(self, url): req = urllib2.Request(url, None, { 'User-Agent': 'Mozilla/5.0 (compatible; Anki/%s)' % - ankiqt.appVersion }) + aqt.appVersion }) filecontents = urllib2.urlopen(req).read() path = os.path.join(self.tmpDir(), os.path.basename(url)) file = open(path, "wb") @@ -1101,7 +1101,7 @@ class FactEdit(QTextEdit): def simplifyHTML(self, html): "Remove all style information and P tags." - if not ankiqt.mw.config['stripHTML']: + if not aqt.mw.config['stripHTML']: return html html = re.sub("\n", " ", html) html = re.sub("
", "\n", html) @@ -1117,7 +1117,7 @@ class FactEdit(QTextEdit): self.parent.lastFocusedEdit = self self.parent.resetFormatButtons() self.parent.disableButtons() - if ankiqt.mw.config['preserveKeyboard'] and sys.platform.startswith("win32"): + if aqt.mw.config['preserveKeyboard'] and sys.platform.startswith("win32"): self._ownLayout = GetKeyboardLayout(0) ActivateKeyboardLayout(self._programLayout, 0) self.emit(SIGNAL("lostFocus")) @@ -1137,7 +1137,7 @@ class FactEdit(QTextEdit): QTextEdit.focusInEvent(self, evt) self.parent.formatChanged(None) self.parent.enableButtons() - if ankiqt.mw.config['preserveKeyboard'] and sys.platform.startswith("win32"): + if aqt.mw.config['preserveKeyboard'] and sys.platform.startswith("win32"): self._programLayout = GetKeyboardLayout(0) if self._ownLayout == None: self._ownLayout = self._programLayout diff --git a/ankiqt/ui/getshared.py b/aqt/getshared.py similarity index 97% rename from ankiqt/ui/getshared.py rename to aqt/getshared.py index 139e39537..7629cf2db 100644 --- a/ankiqt/ui/getshared.py +++ b/aqt/getshared.py @@ -4,9 +4,9 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * -import ankiqt, simplejson, time, cStringIO, zipfile, tempfile, os, re, gzip +import aqt, simplejson, time, cStringIO, zipfile, tempfile, os, re, gzip import traceback, urllib2, socket, cgi -from ankiqt.ui.utils import saveGeom, restoreGeom, showInfo +from aqt.ui.utils import saveGeom, restoreGeom, showInfo from anki.utils import fmtTimeSpan URL = "http://ankiweb.net/file/" @@ -29,7 +29,7 @@ class GetShared(QDialog): def __init__(self, parent, type): QDialog.__init__(self, parent, Qt.Window) self.parent = parent - self.form = ankiqt.forms.getshared.Ui_Dialog() + aqt.form = ankiqt.forms.getshared.Ui_Dialog() self.form.setupUi(self) self.ok = True self.conErrMsg = _("""\ diff --git a/ankiqt/ui/graphs.py b/aqt/graphs.py similarity index 98% rename from ankiqt/ui/graphs.py rename to aqt/graphs.py index 06b78e978..01f04fafc 100644 --- a/ankiqt/ui/graphs.py +++ b/aqt/graphs.py @@ -5,9 +5,9 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import sys import anki, anki.graphs, anki.utils -from ankiqt import ui -from ankiqt.ui.utils import saveGeom, restoreGeom -import ankiqt +from aqt import ui +from aqt.ui.utils import saveGeom, restoreGeom +import aqt from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib import rc @@ -277,7 +277,7 @@ class GraphWindow(object): m.exec_(self.showhide.mapToGlobal(QPoint(0,0))) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "Graphs")) + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Graphs")) def onRefresh(self): self.deck.startProgress(len(self.widgets)) diff --git a/ankiqt/ui/help.py b/aqt/help.py similarity index 99% rename from ankiqt/ui/help.py rename to aqt/help.py index 8a8fc80fd..c1a102e5f 100644 --- a/ankiqt/ui/help.py +++ b/aqt/help.py @@ -4,7 +4,7 @@ import sys from PyQt4.QtGui import * from PyQt4.QtCore import * -import ankiqt.forms +import aqt.forms from anki.hooks import runHook # Hideable help area widget diff --git a/ankiqt/ui/importing.py b/aqt/importing.py similarity index 96% rename from ankiqt/ui/importing.py rename to aqt/importing.py index 06644d183..ec19edcb6 100644 --- a/ankiqt/ui/importing.py +++ b/aqt/importing.py @@ -6,17 +6,17 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import anki import anki.importing as importing -from ankiqt.ui.utils import getOnlyText +from aqt.ui.utils import getOnlyText from anki.errors import * -import ankiqt.forms -from ankiqt import ui +import aqt.forms +from aqt import ui class ChangeMap(QDialog): def __init__(self, parent, model, current): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.model = model - self.dialog = ankiqt.forms.changemap.Ui_ChangeMap() + self.dialog = aqt.forms.changemap.Ui_ChangeMap() self.dialog.setupUi(self) n = 0 setCurrent = False @@ -55,7 +55,7 @@ class UpdateMap(QDialog): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.fieldModels = fieldModels - self.dialog = ankiqt.forms.importup.Ui_Dialog() + self.dialog = aqt.forms.importup.Ui_Dialog() self.dialog.setupUi(self) self.connect(self.dialog.buttonBox.button(QDialogButtonBox.Help), SIGNAL("clicked()"), self.helpRequested) @@ -66,7 +66,7 @@ class UpdateMap(QDialog): self.exec_() def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "FileImport")) + QDesktopServices.openUrl(QUrl(aqt.appWiki + "FileImport")) def accept(self): self.updateKey = ( @@ -79,7 +79,7 @@ class ImportDialog(QDialog): def __init__(self, parent): QDialog.__init__(self, parent, Qt.Window) self.parent = parent - self.dialog = ankiqt.forms.importing.Ui_ImportDialog() + self.dialog = aqt.forms.importing.Ui_ImportDialog() self.dialog.setupUi(self) self.connect(self.dialog.buttonBox.button(QDialogButtonBox.Help), SIGNAL("clicked()"), self.helpRequested) @@ -312,4 +312,4 @@ you can enter it here. Use \\t to represent tab."""), QDialog.reject(self) def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "FileImport")) + QDesktopServices.openUrl(QUrl(aqt.appWiki + "FileImport")) diff --git a/ankiqt/ui/main.py b/aqt/main.py similarity index 96% rename from ankiqt/ui/main.py rename to aqt/main.py index 0c377e87e..39e1d7482 100755 --- a/ankiqt/ui/main.py +++ b/aqt/main.py @@ -11,6 +11,7 @@ from PyQt4.QtGui import * from PyQt4.QtWebKit import QWebPage from PyQt4 import pyqtconfig QtConfig = pyqtconfig.Configuration() + from anki import Deck from anki.errors import * from anki.sound import hasSound, playFromText, clearAudioQueue, stripSounds @@ -20,16 +21,18 @@ from anki.stdmodels import BasicModel from anki.hooks import runHook, addHook, removeHook, _hooks, wrap from anki.deck import newCardOrderLabels, newCardSchedulingLabels from anki.deck import revCardOrderLabels, failedCardOptionLabels -from ankiqt.ui.utils import saveGeom, restoreGeom, saveState, restoreState import anki.lang import anki.deck -import ankiqt -ui = ankiqt.ui -config = ankiqt.config + +import aqt, aqt.utils, aqt.view, aqt.help, aqt.status, aqt.facteditor +from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \ + saveState, restoreState +config = aqt.config class AnkiQt(QMainWindow): - def __init__(self, app, config, args): + def __init__(self, app, config, args, splash): QMainWindow.__init__(self) + self.splash = splash try: self.errorOccurred = False self.inDbHandler = False @@ -39,7 +42,7 @@ class AnkiQt(QMainWindow): elif sys.platform.startswith("win32"): # make sure they're picked up on bundle from ctypes import windll, wintypes - ankiqt.mw = self + aqt.mw = self self.app = app self.config = config self.deck = None @@ -59,7 +62,7 @@ class AnkiQt(QMainWindow): self.setupTray() self.setupSync() self.connectMenuActions() - ui.splash.update() + splash.update() self.setupViews() self.setupEditor() self.setupStudyScreen() @@ -74,7 +77,7 @@ class AnkiQt(QMainWindow): else: self.resize(500, 500) # load deck - ui.splash.update() + splash.update() self.setupErrorHandler() self.setupMisc() # check if we've been updated @@ -82,19 +85,19 @@ class AnkiQt(QMainWindow): # could be new user, or upgrade from older version # which didn't have version variable self.appUpdated = "first" - elif self.config['version'] != ankiqt.appVersion: + elif self.config['version'] != aqt.appVersion: self.appUpdated = self.config['version'] else: self.appUpdated = False if self.appUpdated: - self.config['version'] = ankiqt.appVersion + self.config['version'] = aqt.appVersion # plugins might be looking at this self.state = "noDeck" self.loadPlugins() self.setupAutoUpdate() self.rebuildPluginsMenu() # plugins loaded, now show interface - ui.splash.finish(self) + splash.finish(self) self.show() # program open sync if self.config['syncOnProgramOpen']: @@ -114,15 +117,14 @@ class AnkiQt(QMainWindow): try: runHook('init') except: - ui.utils.showWarning( + aqt.utils.showWarning( _("Broken plugin:\n\n%s") % unicode(traceback.format_exc(), "utf-8", "replace")) # activate & raise is useful when run from the command line on osx self.activateWindow() self.raise_() except: - ui.utils.showInfo("Error during startup:\n%s" % - traceback.format_exc()) + showInfo("Error during startup:\n%s" % traceback.format_exc()) sys.exit(1) def onSigInt(self, signum, frame): @@ -133,13 +135,13 @@ class AnkiQt(QMainWindow): def setupMainWindow(self): # main window - self.mainWin = ankiqt.forms.main.Ui_MainWindow() + self.mainWin = aqt.forms.main.Ui_MainWindow() self.mainWin.setupUi(self) - self.mainWin.mainText = ui.view.AnkiWebView(self.mainWin.mainTextFrame) + self.mainWin.mainText = aqt.view.AnkiWebView(self.mainWin.mainTextFrame) self.mainWin.mainText.setObjectName("mainText") self.mainWin.mainText.setFocusPolicy(Qt.ClickFocus) self.mainWin.mainStack.addWidget(self.mainWin.mainText) - self.help = ui.help.HelpArea(self.mainWin.helpFrame, self.config, self) + self.help = aqt.help.HelpArea(self.mainWin.helpFrame, self.config, self) self.connect(self.mainWin.mainText.pageAction(QWebPage.Reload), SIGNAL("triggered()"), self.onReload) @@ -171,7 +173,7 @@ class AnkiQt(QMainWindow): # decks may be opened in a sync thread sys.stderr.write(msg + "\n") else: - ui.utils.showInfo(msg) + showInfo(msg) def setNotice(self, str=""): if str: @@ -181,14 +183,15 @@ class AnkiQt(QMainWindow): self.mainWin.noticeFrame.setShown(False) def setupViews(self): - self.bodyView = ui.view.View(self, self.mainWin.mainText, + self.bodyView = aqt.view.View(self, self.mainWin.mainText, self.mainWin.mainTextFrame) self.addView(self.bodyView) - self.statusView = ui.status.StatusView(self) + self.statusView = aqt.status.StatusView(self) self.addView(self.statusView) def setupTray(self): - self.trayIcon = ui.tray.AnkiTrayIcon(self) + import aqt.tray + self.trayIcon = aqt.tray.AnkiTrayIcon(self) def setupErrorHandler(self): class ErrorPipe(object): @@ -235,14 +238,13 @@ class AnkiQt(QMainWindow): # hack for matplotlib errors on osx return if "Audio player not found" in error: - ui.utils.showInfo( - _("Couldn't play sound. Please install mplayer.")) + showInfo(_("Couldn't play sound. Please install mplayer.")) return if "ERR-0100" in error: - ui.utils.showInfo(error) + showInfo(error) return if "ERR-0101" in error: - ui.utils.showInfo(error) + showInfo(error) return stdText = _("""\ @@ -280,7 +282,7 @@ Please do not file a bug report with Anki.
""") self.clearProgress() def closeAllDeckWindows(self): - ui.dialogs.closeAll() + aqt.dialogs.closeAll() self.help.hide() # State machine @@ -728,11 +730,11 @@ counts are %d %d %d except Exception, e: if hasattr(e, 'data') and e.data.get('type') == 'inuse': if interactive: - ui.utils.showWarning(_("Deck is already open.")) + aqt.utils.showWarning(_("Deck is already open.")) else: return else: - ui.utils.showCritical(_("""\ + aqt.utils.showCritical(_("""\ File is corrupt or not an Anki database. Click help for more info.\n Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") self.moveToState("noDeck") @@ -749,7 +751,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") self.moveToState("initial") except: traceback.print_exc() - if ui.utils.askUser(_( + if aqt.utils.askUser(_( "An error occurred while trying to build the queue.\n" "Would you like to try check the deck for errors?\n" "This may take some time.")): @@ -758,7 +760,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") try: self.reset() except: - ui.utils.showWarning( + aqt.utils.showWarning( _("Unable to recover. Deck load failed.")) self.deck = None else: @@ -867,11 +869,11 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") not self.config['syncOnLoad'])): # backed in memory or autosave/sync off, must confirm while 1: - res = ui.unsaved.ask(parent) - if res == ui.unsaved.save: + res = aqt.unsaved.ask(parent) + if res == aqt.unsaved.save: if self.save(required=True): break - elif res == ui.unsaved.cancel: + elif res == aqt.unsaved.cancel: self.hideWelcome = False return False else: @@ -919,7 +921,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") if not prompt: prompt = _("Please give your deck a name:") while 1: - name = ui.utils.getOnlyText( + name = aqt.utils.getOnlyText( prompt, default=name, title=_("New Deck")) if not name: self.moveToState("noDeck") @@ -927,7 +929,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") found = False for c in bad: if c in name: - ui.utils.showInfo( + showInfo( _("Sorry, '%s' can't be used in deck names.") % c) found = True break @@ -938,7 +940,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") break path = os.path.join(self.documentDir, name) if os.path.exists(path): - if ui.utils.askUser(_("That deck already exists. Overwrite?"), + if aqt.utils.askUser(_("That deck already exists. Overwrite?"), defaultno=True): os.unlink(path) else: @@ -1007,12 +1009,12 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") def onGetSharedDeck(self): if not self.inMainWindow(): return - ui.getshared.GetShared(self, 0) + aqt.getshared.GetShared(self, 0) self.browserLastRefreshed = 0 def onGetSharedPlugin(self): if not self.inMainWindow(): return - ui.getshared.GetShared(self, 1) + aqt.getshared.GetShared(self, 1) def onOpen(self): if not self.inMainWindow(): return @@ -1026,7 +1028,7 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors") ret = self.loadDeck(file, interactive=True) if not ret: if ret is None: - ui.utils.showWarning(_("Unable to load file.")) + aqt.utils.showWarning(_("Unable to load file.")) self.deck = None return False else: @@ -1124,7 +1126,7 @@ your deck.""")) return self.onSave() if os.path.exists(file): # check for existence after extension - if not ui.utils.askUser( + if not aqt.utils.askUser( "This file exists. Are you sure you want to overwrite it?"): return self.closeAllDeckWindows() @@ -1173,7 +1175,7 @@ your deck.""")) self.startProgress(max=len(self.config['recentDeckPaths']), immediate=True) for c, d in enumerate(self.config['recentDeckPaths']): - if ui.splash.finished: + if self.splash.finished: self.updateProgress(_("Checking deck %(x)d of %(y)d...") % { 'x': c+1, 'y': len(self.config['recentDeckPaths'])}) if not os.path.exists(d): @@ -1206,7 +1208,7 @@ your deck.""")) for d in toRemove: self.config['recentDeckPaths'].remove(d) self.config.save() - if ui.splash.finished: + if self.splash.finished: self.finishProgress() self.browserLastRefreshed = time.time() self.reorderBrowserDecks() @@ -1398,7 +1400,7 @@ later by using File>Close. self.switchToDecksScreen() def onDeckBrowserForget(self, c): - if ui.utils.askUser(_("""\ + if aqt.utils.askUser(_("""\ Hide %s from the list? You can File>Open it again later.""") % self.browserDecks[c]['name']): self.config['recentDeckPaths'].remove(self.browserDecks[c]['path']) @@ -1407,7 +1409,7 @@ Hide %s from the list? You can File>Open it again later.""") % def onDeckBrowserDelete(self, c): deck = self.browserDecks[c]['path'] - if ui.utils.askUser(_("""\ + if aqt.utils.askUser(_("""\ Delete %s? If this deck is synchronized the online version will \ not be touched.""") % self.browserDecks[c]['name']): @@ -1442,7 +1444,7 @@ not be touched.""") % try: self.config.save() except (IOError, OSError), e: - ui.utils.showWarning(_("Anki was unable to save your " + aqt.utils.showWarning(_("Anki was unable to save your " "configuration file:\n%s" % e)) def closeEvent(self, event): @@ -1503,7 +1505,7 @@ not be touched.""") % ########################################################################## def setupEditor(self): - self.editor = ui.facteditor.FactEditor( + self.editor = aqt.facteditor.FactEditor( self, self.mainWin.fieldsArea, self.deck) self.editor.clayout.setShortcut("") self.editor.onFactValid = self.onFactValid @@ -1540,7 +1542,7 @@ not be touched.""") % self.connect(self.mainWin.optionsHelpButton, SIGNAL("clicked()"), lambda: QDesktopServices.openUrl(QUrl( - ankiqt.appWiki + "StudyOptions"))) + aqt.appWiki + "StudyOptions"))) self.connect(self.mainWin.minuteLimit, SIGNAL("textChanged(QString)"), self.onMinuteLimitChanged) self.connect(self.mainWin.questionLimit, @@ -1562,10 +1564,10 @@ not be touched.""") % self.mainWin.tabWidget.setCurrentIndex(self.config['studyOptionsScreen']) def onNewCategoriesClicked(self): - ui.activetags.show(self, "new") + aqt.activetags.show(self, "new") def onRevCategoriesClicked(self): - ui.activetags.show(self, "rev") + aqt.activetags.show(self, "rev") def onFailedMaxChanged(self): try: @@ -1868,20 +1870,20 @@ learnt today") import anki.graphs if anki.graphs.graphsAvailable(): try: - ui.dialogs.get("Graphs", self, self.deck) + aqt.dialogs.get("Graphs", self, self.deck) except (ImportError, ValueError): traceback.print_exc() if sys.platform.startswith("win32"): - ui.utils.showInfo( + showInfo( _("To display graphs, Anki needs a .dll file which\n" "you don't have. Please install:\n") + "http://www.dll-files.com/dllindex/dll-files.shtml?msvcp71") else: - ui.utils.showInfo(_( + showInfo(_( "Your version of Matplotlib is broken.\n" "Please see http://ichi2.net/anki/wiki/MatplotlibBroken")) else: - ui.utils.showInfo(_("Please install python-matplotlib to access graphs.")) + showInfo(_("Please install python-matplotlib to access graphs.")) # Marking, suspending and undoing ########################################################################## @@ -1936,38 +1938,38 @@ learnt today") ########################################################################## def onAddCard(self): - ui.dialogs.get("AddCards", self) + aqt.dialogs.get("AddCards", self) def onEditDeck(self): - ui.dialogs.get("CardList", self) + aqt.dialogs.get("CardList", self) def onEditCurrent(self): self.moveToState("editCurrentFact") def onCardLayout(self): - ui.clayout.CardLayout(self, 0, self.currentCard.fact, + aqt.clayout.CardLayout(self, 0, self.currentCard.fact, card=self.currentCard) def onDeckProperties(self): - self.deckProperties = ui.deckproperties.DeckProperties(self, self.deck) + self.deckProperties = aqt.deckproperties.DeckProperties(self, self.deck) def onPrefs(self): - ui.preferences.Preferences(self, self.config) + aqt.preferences.Preferences(self, self.config) def onReportBug(self): - QDesktopServices.openUrl(QUrl(ankiqt.appIssueTracker)) + QDesktopServices.openUrl(QUrl(aqt.appIssueTracker)) def onForum(self): - QDesktopServices.openUrl(QUrl(ankiqt.appForum)) + QDesktopServices.openUrl(QUrl(aqt.appForum)) def onReleaseNotes(self): - QDesktopServices.openUrl(QUrl(ankiqt.appReleaseNotes)) + QDesktopServices.openUrl(QUrl(aqt.appReleaseNotes)) def onAbout(self): - ui.about.show(self) + aqt.about.show(self) def onDonate(self): - QDesktopServices.openUrl(QUrl(ankiqt.appDonate)) + QDesktopServices.openUrl(QUrl(aqt.appDonate)) # Importing & exporting ########################################################################## @@ -1982,10 +1984,10 @@ Please give your deck a name:""")) if not self.deck: return if self.deck.path: - ui.importing.ImportDialog(self) + aqt.importing.ImportDialog(self) def onExport(self): - ui.exporting.ExportDialog(self) + aqt.exporting.ExportDialog(self) # Cramming & Sharing ########################################################################## @@ -2005,9 +2007,9 @@ Please give your deck a name:""")) return (e, path) def onCram(self, cardIds=[]): - te = ui.tagedit.TagEdit(self) + te = aqt.tagedit.TagEdit(self) te.setDeck(self.deck, "all") - diag = ui.utils.GetTextDialog( + diag = aqt.utils.GetTextDialog( self, _("Tags to cram:"), help="CramMode", edit=te) l = diag.layout() g = QGroupBox(_("Review Mode")) @@ -2045,14 +2047,14 @@ Please give your deck a name:""")) self.deck.getCard() # so scheduler will reset if empty self.moveToState("initial") if not self.deck.finishScheduler: - ui.utils.showInfo(_("No cards matched the provided tags.")) + showInfo(_("No cards matched the provided tags.")) def onShare(self, tags): pwd = os.getcwd() # open tmp deck (e, path) = self._copyToTmpDeck(name="shared.anki", tags=tags) if not e.exportedCards: - ui.utils.showInfo(_("No cards matched the provided tags.")) + showInfo(_("No cards matched the provided tags.")) return self.deck.startProgress() self.deck.updateProgress() @@ -2145,8 +2147,8 @@ it to your friends. locale.setlocale(locale.LC_ALL, '') except: pass - languageDir=os.path.join(ankiqt.modDir, "locale") - self.languageTrans = gettext.translation('ankiqt', languageDir, + languageDir=os.path.join(aqt.modDir, "locale") + self.languageTrans = gettext.translation('aqt', languageDir, languages=[self.config["interfaceLang"]], fallback=True) self.installTranslation() @@ -2197,7 +2199,7 @@ it to your friends. if interactive: if (not self.config['mediaLocation'] and self.deck.db.scalar("select 1 from media limit 1")): - ui.utils.showInfo(_("""\ + showInfo(_("""\ Syncing sounds and images requires a free file synchronization service like \ DropBox. Click help to learn more, and OK to continue syncing."""), help="SyncingMedia") @@ -2212,7 +2214,7 @@ DropBox. Click help to learn more, and OK to continue syncing."""), self.syncDecks = self.decksToSync() if not self.syncDecks: if interactive: - ui.utils.showInfo(_("""\ + showInfo(_("""\ Please open a deck and run File>Sync. After you do this once, the deck \ will sync automatically from then on.""")) return @@ -2235,7 +2237,7 @@ will sync automatically from then on.""")) self.state = "nostate" import gc; gc.collect() self.mainWin.welcomeText.setText(u"") - self.syncThread = ui.sync.Sync(self, u, p, interactive, onlyMerge) + self.syncThread = aqt.sync.Sync(self, u, p, interactive, onlyMerge) self.connect(self.syncThread, SIGNAL("setStatus"), self.setSyncStatus) self.connect(self.syncThread, SIGNAL("showWarning"), self.showSyncWarning) self.connect(self.syncThread, SIGNAL("moveToState"), self.moveToState) @@ -2271,7 +2273,7 @@ will sync automatically from then on.""")) return ok def onConflict(self, deckName): - diag = ui.utils.askUserDialog(_("""\ + diag = aqt.utils.askUserDialog(_("""\ %s has been changed on both the local and remote side. What do you want to do?""" % deckName), @@ -2288,7 +2290,7 @@ you want to do?""" % deckName), self.syncThread.conflictResolution = "cancel" def onClobber(self, deckName): - diag = ui.utils.askUserDialog(_("""\ + diag = aqt.utils.askUserDialog(_("""\ You are about to upload %s to AnkiOnline. This will overwrite the online copy of this deck. @@ -2351,13 +2353,13 @@ Are you sure?""" % deckName), self.syncFinished = True def selectSyncDeck(self, decks): - name = ui.sync.DeckChooser(self, decks).getName() + name = aqt.sync.DeckChooser(self, decks).getName() self.syncName = name if name: # name chosen p = os.path.join(self.documentDir, name + ".anki") if os.path.exists(p): - d = ui.utils.askUserDialog(_("""\ + d = aqt.utils.askUserDialog(_("""\ This deck already exists on your computer. Overwrite the local copy?"""), ["Overwrite", "Cancel"]) d.setDefault(1) @@ -2383,7 +2385,7 @@ This deck already exists on your computer. Overwrite the local copy?"""), self.mainWin.welcomeText.append("" + text + "") def syncClockOff(self, diff): - ui.utils.showWarning( + aqt.utils.showWarning( _("The time or date on your computer is not correct.\n") + ngettext("It is off by %d second.\n\n", "It is off by %d seconds.\n\n", diff) % diff + @@ -2393,11 +2395,11 @@ This deck already exists on your computer. Overwrite the local copy?"""), self.onSyncFinished() def showSyncWarning(self, text): - ui.utils.showWarning(text, self) + aqt.utils.showWarning(text, self) self.setStatus("") def badUserPass(self): - ui.preferences.Preferences(self, self.config).dialog.tabWidget.\ + aqt.preferences.Preferences(self, self.config).dialog.tabWidget.\ setCurrentIndex(1) def openSyncProgress(self): @@ -2422,7 +2424,7 @@ This deck already exists on your computer. Overwrite the local copy?"""), self.syncProgressDialog.setLabelText("Downloading %s..." % fname) def bulkSyncFailed(self): - ui.utils.showWarning(_( + aqt.utils.showWarning(_( "Failed to upload media. Please run 'check media db'."), self) def fullSyncStarted(self, max): @@ -2531,7 +2533,7 @@ This deck already exists on your computer. Overwrite the local copy?"""), def updateTitleBar(self): "Display the current deck and card count in the titlebar." - title=ankiqt.appName + title=aqt.appName if self.deck != None: deckpath = self.deck.name() if self.deck.modifiedSinceSave(): @@ -2552,7 +2554,7 @@ This deck already exists on your computer. Overwrite the local copy?"""), self.mainWin.statusbar.showMessage(text, timeout) def onStartHere(self): - QDesktopServices.openUrl(QUrl(ankiqt.appHelpSite)) + QDesktopServices.openUrl(QUrl(aqt.appHelpSite)) def updateMarkAction(self): self.mainWin.actionMarkCard.blockSignals(True) @@ -2608,7 +2610,8 @@ This deck already exists on your computer. Overwrite the local copy?"""), ########################################################################## def setupAutoUpdate(self): - self.autoUpdate = ui.update.LatestVersionFinder(self) + import aqt.update + self.autoUpdate = aqt.update.LatestVersionFinder(self) self.connect(self.autoUpdate, SIGNAL("newVerAvail"), self.newVerAvail) self.connect(self.autoUpdate, SIGNAL("newMsg"), self.newMsg) self.connect(self.autoUpdate, SIGNAL("clockIsOff"), self.clockIsOff) @@ -2616,17 +2619,17 @@ This deck already exists on your computer. Overwrite the local copy?"""), def newVerAvail(self, data): if self.config['suppressUpdate'] < data['latestVersion']: - ui.update.askAndUpdate(self, data) + aqt.update.askAndUpdate(self, data) def newMsg(self, data): - ui.update.showMessages(self, data) + aqt.update.showMessages(self, data) def clockIsOff(self, diff): if diff < 0: ret = _("late") else: ret = _("early") - ui.utils.showWarning( + aqt.utils.showWarning( _("The time or date on your computer is not correct.\n") + ngettext("It is %(sec)d second %(type)s.\n", "It is %(sec)d seconds %(type)s.\n", abs(diff)) @@ -2714,7 +2717,7 @@ to work with this version of Anki.""")) if os.path.exists(new): os.unlink(new) os.rename(path, new) - ui.utils.showInfo(p[1]) + showInfo(p[1]) def rebuildPluginsMenu(self): if getattr(self, "pluginActions", None) is None: @@ -2819,7 +2822,7 @@ to work with this version of Anki.""")) ########################################################################## def setupStyle(self): - ui.utils.applyStyles(self) + aqt.utils.applyStyles(self) # Sounds ########################################################################## @@ -2842,7 +2845,7 @@ to work with this version of Anki.""")) playFromText(self.currentCard.answer) def onRecordNoiseProfile(self): - from ankiqt.ui.sound import recordNoiseProfile + from aqt.sound import recordNoiseProfile recordNoiseProfile(self) # Progress info @@ -2869,7 +2872,7 @@ to work with this version of Anki.""")) self.setBusy() if not self.progressWins: parent = self.progressParent or self.app.activeWindow() or self - p = ui.utils.ProgressWin(parent, max, min, title, immediate) + p = aqt.utils.ProgressWin(parent, max, min, title, immediate) else: p = None self.progressWins.append(p) @@ -2995,7 +2998,7 @@ to work with this version of Anki.""")) def dropboxFolder(self): try: - import ankiqt.ui.dropbox as db + import aqt.dropbox as db p = db.getPath() except: if sys.platform.startswith("win32"): @@ -3013,14 +3016,14 @@ to work with this version of Anki.""")) open(os.path.join( deck.mediaPrefix, "right-click-me.txt"), "w").write("") # tell user what to do - ui.utils.showInfo(_("""\ + showInfo(_("""\ A file called right-click-me.txt has been placed in DropBox's public folder. \ After clicking OK, this folder will appear. Please right click on the file (\ command+click on a Mac), choose DropBox>Copy Public Link, and paste the \ link into Anki.""")) # open folder and text prompt self.onOpenPluginFolder(deck.mediaPrefix) - txt = ui.utils.getText(_("Paste path here:"), parent=self) + txt = aqt.utils.getText(_("Paste path here:"), parent=self) if txt[0]: fail = False if not txt[0].lower().startswith("http"): @@ -3028,7 +3031,7 @@ link into Anki.""")) if not txt[0].lower().endswith("right-click-me.txt"): fail = True if fail: - ui.utils.showInfo(_("""\ + showInfo(_("""\ That doesn't appear to be a public link. You'll be asked again when the deck \ is next loaded.""")) else: @@ -3045,10 +3048,10 @@ is next loaded.""")) def onCheckDB(self): "True if no problems" if self.errorOccurred: - ui.utils.showWarning(_( + aqt.utils.showWarning(_( "Please restart Anki before checking the DB.")) return - if not ui.utils.askUser(_("""\ + if not aqt.utils.askUser(_("""\ This operation will find and fix some common problems.

On the next sync, all cards will be sent to the server.
@@ -3119,12 +3122,12 @@ doubt.""")) report += "\n" + "\n".join(unused) if not report: report = _("No unused or missing files found.") - ui.utils.showText(report, parent=self, type="text") + aqt.utils.showText(report, parent=self, type="text") def onDownloadMissingMedia(self): res = downloadMissing(self.deck) if res is None: - ui.utils.showInfo(_("No media URL defined for this deck."), + showInfo(_("No media URL defined for this deck."), help="MediaSupport") return if res[0] == True: @@ -3135,10 +3138,10 @@ doubt.""")) msg += "\n" + ngettext("%d missing.", "%d missing.", missing) % missing else: msg = _("Unable to download %s\nDownload aborted.") % res[1] - ui.utils.showInfo(msg) + showInfo(msg) def onLocalizeMedia(self): - if not ui.utils.askUser(_("""\ + if not aqt.utils.askUser(_("""\ This will look for remote images and sounds on your cards, download them to \ your media folder, and convert the links to local ones. \ It can take a long time. Proceed?""")): @@ -3149,7 +3152,7 @@ It can take a long time. Proceed?""")): "%d successfully downloaded.", count) % count if len(res[1]): msg += "\n\n" + _("Couldn't find:") + "\n" + "\n".join(res[1]) - ui.utils.showText(msg, parent=self, type="text") + aqt.utils.showText(msg, parent=self, type="text") def addHook(self, *args): addHook(*args) diff --git a/ankiqt/ui/modelchooser.py b/aqt/modelchooser.py similarity index 97% rename from ankiqt/ui/modelchooser.py rename to aqt/modelchooser.py index cac4c00ee..b563111b4 100644 --- a/ankiqt/ui/modelchooser.py +++ b/aqt/modelchooser.py @@ -7,8 +7,8 @@ from operator import attrgetter import anki, sys from anki import stdmodels from anki.models import * -from ankiqt import ui -import ankiqt.forms +from aqt import ui +import aqt.forms from anki.hooks import addHook, removeHook class ModelChooser(QHBoxLayout): @@ -74,7 +74,7 @@ class ModelChooser(QHBoxLayout): def onModelEdited(self): # hack - from ankiqt import mw + from aqt import mw self.deck = mw.deck self.drawModels() self.changed(self.deck.currentModel) @@ -169,7 +169,7 @@ class AddModel(QDialog): self.main = main self.model = None self.deck = deck - self.dialog = ankiqt.forms.addmodel.Ui_AddModel() + self.dialog = aqt.forms.addmodel.Ui_AddModel() self.dialog.setupUi(self) self.models = [] names = stdmodels.models.keys() @@ -205,5 +205,5 @@ class AddModel(QDialog): QDialog.accept(self) def onHelp(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "AddModel")) diff --git a/ankiqt/ui/modelproperties.py b/aqt/modelproperties.py similarity index 98% rename from ankiqt/ui/modelproperties.py rename to aqt/modelproperties.py index 2a76d0138..8baba5876 100644 --- a/ankiqt/ui/modelproperties.py +++ b/aqt/modelproperties.py @@ -4,9 +4,9 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import sys, re -import ankiqt.forms +import aqt.forms import anki -from ankiqt import ui +from aqt import ui class ModelProperties(QDialog): @@ -20,7 +20,7 @@ class ModelProperties(QDialog): self.m = model self.needRebuild = False self.onFinish = onFinish - self.dialog = ankiqt.forms.modelproperties.Ui_ModelProperties() + self.dialog = aqt.forms.modelproperties.Ui_ModelProperties() self.dialog.setupUi(self) self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"), self.helpRequested) @@ -252,7 +252,7 @@ class ModelProperties(QDialog): self.ignoreCardUpdate = False def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "ModelProperties")) # Cleanup @@ -282,7 +282,7 @@ class ModelProperties(QDialog): self.deck.updateCardsFromModel(self.m) reset = True if reset: - ankiqt.mw.reset() + aqt.mw.reset() if self.onFinish: self.onFinish() self.deck.setUndoEnd(self.undoName) diff --git a/ankiqt/ui/preferences.py b/aqt/preferences.py similarity index 98% rename from ankiqt/ui/preferences.py rename to aqt/preferences.py index 18beade7c..76689f4c8 100644 --- a/ankiqt/ui/preferences.py +++ b/aqt/preferences.py @@ -7,8 +7,8 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import anki, anki.utils from anki.facts import Fact -from ankiqt import ui -import ankiqt.forms +from aqt import ui +import aqt.forms tabs = ("Display", "Network", @@ -23,7 +23,7 @@ class Preferences(QDialog): self.parent = parent self.config = copy.copy(self.origConfig) self.origInterfaceLang = self.config['interfaceLang'] - self.dialog = ankiqt.forms.preferences.Ui_Preferences() + self.dialog = aqt.forms.preferences.Ui_Preferences() self.dialog.setupUi(self) self.needDeckClose = False self.supportedLanguages = [ @@ -258,6 +258,6 @@ class Preferences(QDialog): def helpRequested(self): idx = self.dialog.tabWidget.currentIndex() - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + + QDesktopServices.openUrl(QUrl(aqt.appWiki + "Preferences#" + tabs[idx])) diff --git a/ankiqt/ui/sound.py b/aqt/sound.py similarity index 97% rename from ankiqt/ui/sound.py rename to aqt/sound.py index 9ba283f2b..cef0dd4a3 100644 --- a/ankiqt/ui/sound.py +++ b/aqt/sound.py @@ -6,7 +6,7 @@ from PyQt4.QtCore import * import time from anki.sound import Recorder, play, generateNoiseProfile -from ankiqt.ui.utils import saveGeom, restoreGeom +from aqt.utils import saveGeom, restoreGeom def getAudio(parent, string="", encode=True): "Record and return filename" diff --git a/ankiqt/ui/status.py b/aqt/status.py similarity index 99% rename from ankiqt/ui/status.py rename to aqt/status.py index 34d313405..d1f45e2f1 100644 --- a/ankiqt/ui/status.py +++ b/aqt/status.py @@ -5,7 +5,6 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import anki import sys, time -from ankiqt import ui from anki.hooks import addHook class QClickableLabel(QLabel): diff --git a/ankiqt/ui/sync.py b/aqt/sync.py similarity index 98% rename from ankiqt/ui/sync.py rename to aqt/sync.py index 5879695d9..8f7ac3a9b 100755 --- a/ankiqt/ui/sync.py +++ b/aqt/sync.py @@ -4,14 +4,14 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * import os, types, socket, time, traceback -import ankiqt +import aqt import anki from anki.sync import SyncClient, HttpSyncServerProxy, copyLocalMedia from anki.sync import SYNC_HOST, SYNC_PORT from anki.errors import * from anki import Deck from anki.db import sqlite -import ankiqt.forms +import aqt.forms from anki.hooks import addHook, removeHook # Synchronising a deck with a public server @@ -100,7 +100,7 @@ sync was aborted. Please report this error.""") if not self.proxy: self.setStatus(_("Connecting..."), 0) proxy = HttpSyncServerProxy(self.user, self.pwd) - proxy.connect("ankiqt-" + ankiqt.appVersion) + proxy.connect("aqt-" + ankiqt.appVersion) self.proxy = proxy # check clock if proxy.timediff > 300: @@ -297,7 +297,7 @@ class DeckChooser(QDialog): QDialog.__init__(self, parent, Qt.Window) self.parent = parent self.decks = decks - self.dialog = ankiqt.forms.syncdeck.Ui_DeckChooser() + self.dialog = aqt.forms.syncdeck.Ui_DeckChooser() self.dialog.setupUi(self) self.dialog.topLabel.setText(_("

Download Personal Deck

")) self.decks.sort() diff --git a/ankiqt/ui/tagedit.py b/aqt/tagedit.py similarity index 100% rename from ankiqt/ui/tagedit.py rename to aqt/tagedit.py diff --git a/ankiqt/ui/tray.py b/aqt/tray.py similarity index 100% rename from ankiqt/ui/tray.py rename to aqt/tray.py diff --git a/ankiqt/ui/unsaved.py b/aqt/unsaved.py similarity index 96% rename from ankiqt/ui/unsaved.py rename to aqt/unsaved.py index d7439e509..16a8e3d54 100644 --- a/ankiqt/ui/unsaved.py +++ b/aqt/unsaved.py @@ -2,7 +2,7 @@ # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html from PyQt4.QtGui import * -import ankiqt.forms +import aqt.forms save = QMessageBox.Save discard = QMessageBox.Discard diff --git a/ankiqt/ui/update.py b/aqt/update.py similarity index 90% rename from ankiqt/ui/update.py rename to aqt/update.py index 9e73d1b0a..7b811945b 100644 --- a/ankiqt/ui/update.py +++ b/aqt/update.py @@ -5,7 +5,7 @@ from PyQt4.QtCore import * from PyQt4.QtGui import * import urllib, urllib2, os, sys, time, httplib import anki, anki.utils, anki.lang, anki.stats -import ankiqt +import aqt import simplejson, platform baseUrl = "http://anki.ichi2.net/update/" @@ -19,7 +19,7 @@ class LatestVersionFinder(QThread): self.config = main.config plat=sys.platform pver=platform.platform() - d = {"ver": ankiqt.appVersion, + d = {"ver": aqt.appVersion, "pver": pver, "plat": plat, "id": self.config['id'], @@ -44,7 +44,7 @@ class LatestVersionFinder(QThread): return if resp['msg']: self.emit(SIGNAL("newMsg"), resp) - if resp['latestVersion'] > ankiqt.appVersion: + if resp['latestVersion'] > aqt.appVersion: self.emit(SIGNAL("newVerAvail"), resp) diff = resp['currentTime'] - time.time() # a fairly liberal time check - sync is more strict @@ -67,8 +67,8 @@ def askAndUpdate(parent, version=None): # ignore this update parent.config['suppressUpdate'] = version elif ret == QMessageBox.Yes: - QDesktopServices.openUrl(QUrl(ankiqt.appWebsite)) + QDesktopServices.openUrl(QUrl(aqt.appWebsite)) def showMessages(main, data): - ankiqt.ui.utils.showText(data['msg'], main, type="html") + aqt.ui.utils.showText(data['msg'], main, type="html") main.config['lastMsg'] = data['msgId'] diff --git a/ankiqt/ui/utils.py b/aqt/utils.py similarity index 89% rename from ankiqt/ui/utils.py rename to aqt/utils.py index 0add07004..31b06818d 100644 --- a/ankiqt/ui/utils.py +++ b/aqt/utils.py @@ -5,16 +5,15 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * from anki.sound import playFromText, stripSounds -from ankiqt import ui import re, os, sys, urllib, time -import ankiqt +import aqt def openLink(link): QDesktopServices.openUrl(QUrl(link)) def openWikiLink(page): - openLink(ankiqt.appWiki + page) + openLink(aqt.appWiki + page) def showWarning(text, parent=None, help=""): "Show a small warning with an OK button." @@ -27,7 +26,7 @@ def showCritical(text, parent=None, help=""): def showInfo(text, parent=None, help="", func=None): "Show a small info window with an OK button." if not parent: - parent = ankiqt.mw + parent = aqt.mw if not func: func = QMessageBox.information sb = QMessageBox.Ok @@ -42,7 +41,7 @@ def showInfo(text, parent=None, help="", func=None): def showText(txt, parent=None, type="text"): if not parent: - parent = ankiqt.mw + parent = aqt.mw diag = QDialog(parent) diag.setWindowTitle("Anki") layout = QVBoxLayout(diag) @@ -64,7 +63,7 @@ def showText(txt, parent=None, type="text"): def askUser(text, parent=None, help="", defaultno=False): "Show a yes/no question. Return true if yes." if not parent: - parent = ankiqt.mw + parent = aqt.mw sb = QMessageBox.Yes | QMessageBox.No if help: sb |= QMessageBox.Help @@ -115,7 +114,7 @@ class ButtonedDialog(QMessageBox): def askUserDialog(text, buttons, parent=None, help=""): if not parent: - parent = ankiqt.mw + parent = aqt.mw diag = ButtonedDialog(text, buttons, parent, help) return diag @@ -158,11 +157,11 @@ class GetTextDialog(QDialog): return QDialog.reject(self) def helpRequested(self): - QDesktopServices.openUrl(QUrl(ankiqt.appWiki + self.help)) + QDesktopServices.openUrl(QUrl(aqt.appWiki + self.help)) def getText(prompt, parent=None, help=None, edit=None, default=u"", title="Anki"): if not parent: - parent = ankiqt.mw + parent = aqt.mw d = GetTextDialog(parent, prompt, help=help, edit=edit, default=default, title=title) ret = d.exec_() @@ -176,7 +175,8 @@ def getOnlyText(*args, **kwargs): return u"" def getTag(parent, deck, question, tags="user", **kwargs): - te = ui.tagedit.TagEdit(parent) + from aqt.tagedit import TagEdit + te = TagEdit(parent) te.setDeck(deck, tags) return getText(question, parent, edit=te, **kwargs) @@ -184,17 +184,17 @@ def getFile(parent, title, dir, key): "Ask the user for a file. Use DIR as config variable." dirkey = dir+"Directory" file = unicode(QFileDialog.getOpenFileName( - parent, title, ankiqt.mw.config.get(dirkey, ""), key)) + parent, title, aqt.mw.config.get(dirkey, ""), key)) if file: dir = os.path.dirname(file) - ankiqt.mw.config[dirkey] = dir + aqt.mw.config[dirkey] = dir return file def getSaveFile(parent, title, dir, key, ext): "Ask the user for a file to save. Use DIR as config variable." dirkey = dir+"Directory" file = unicode(QFileDialog.getSaveFileName( - parent, title, ankiqt.mw.config.get(dirkey, ""), key, + parent, title, aqt.mw.config.get(dirkey, ""), key, None, QFileDialog.DontConfirmOverwrite)) if file: # add extension @@ -202,7 +202,7 @@ def getSaveFile(parent, title, dir, key, ext): file += ext # save new default dir = os.path.dirname(file) - ankiqt.mw.config[dirkey] = dir + aqt.mw.config[dirkey] = dir # check if it exists if os.path.exists(file): if not askUser( @@ -213,14 +213,14 @@ def getSaveFile(parent, title, dir, key, ext): def saveGeom(widget, key): key += "Geom" - ankiqt.mw.config[key] = widget.saveGeometry() + aqt.mw.config[key] = widget.saveGeometry() def restoreGeom(widget, key, offset=None): key += "Geom" - if ankiqt.mw.config.get(key): - widget.restoreGeometry(ankiqt.mw.config[key]) + if aqt.mw.config.get(key): + widget.restoreGeometry(aqt.mw.config[key]) if sys.platform.startswith("darwin") and offset: - from ankiqt.ui.main import QtConfig as q + from aqt.main import QtConfig as q minor = (q.qt_version & 0x00ff00) >> 8 if minor > 6: # bug in osx toolkit @@ -229,30 +229,30 @@ def restoreGeom(widget, key, offset=None): def saveState(widget, key): key += "State" - ankiqt.mw.config[key] = widget.saveState() + aqt.mw.config[key] = widget.saveState() def restoreState(widget, key): key += "State" - if ankiqt.mw.config.get(key): - widget.restoreState(ankiqt.mw.config[key]) + if aqt.mw.config.get(key): + widget.restoreState(aqt.mw.config[key]) def saveSplitter(widget, key): key += "Splitter" - ankiqt.mw.config[key] = widget.saveState() + aqt.mw.config[key] = widget.saveState() def restoreSplitter(widget, key): key += "Splitter" - if ankiqt.mw.config.get(key): - widget.restoreState(ankiqt.mw.config[key]) + if aqt.mw.config.get(key): + widget.restoreState(aqt.mw.config[key]) def saveHeader(widget, key): key += "Header" - ankiqt.mw.config[key] = widget.saveState() + aqt.mw.config[key] = widget.saveState() def restoreHeader(widget, key): key += "Header" - if ankiqt.mw.config.get(key): - widget.restoreState(ankiqt.mw.config[key]) + if aqt.mw.config.get(key): + widget.restoreState(aqt.mw.config[key]) def mungeQA(deck, txt): txt = stripSounds(txt) @@ -262,7 +262,7 @@ def mungeQA(deck, txt): def applyStyles(widget): try: - styleFile = open(os.path.join(ankiqt.mw.config.configPath, + styleFile = open(os.path.join(aqt.mw.config.configPath, "style.css")) widget.setStyleSheet(styleFile.read()) except (IOError, OSError): diff --git a/ankiqt/ui/view.py b/aqt/view.py similarity index 99% rename from ankiqt/ui/view.py rename to aqt/view.py index 998e5b671..3add4cdb0 100644 --- a/ankiqt/ui/view.py +++ b/aqt/view.py @@ -10,8 +10,7 @@ from anki.utils import stripHTML from anki.hooks import runHook, runFilter import types, time, re, os, urllib, sys, difflib import unicodedata as ucd -from ankiqt import ui -from ankiqt.ui.utils import mungeQA, getBase +from aqt.utils import mungeQA, getBase from anki.utils import fmtTimeSpan from PyQt4.QtWebKit import QWebPage, QWebView diff --git a/icons.qrc b/designer/icons.qrc similarity index 100% rename from icons.qrc rename to designer/icons.qrc diff --git a/designer/icons/.gitignore b/designer/icons/.gitignore new file mode 100644 index 000000000..5aed21265 --- /dev/null +++ b/designer/icons/.gitignore @@ -0,0 +1 @@ +/.directory diff --git a/icons/Anki_Add_Tag.png b/designer/icons/Anki_Add_Tag.png similarity index 100% rename from icons/Anki_Add_Tag.png rename to designer/icons/Anki_Add_Tag.png diff --git a/icons/Anki_Card.png b/designer/icons/Anki_Card.png similarity index 100% rename from icons/Anki_Card.png rename to designer/icons/Anki_Card.png diff --git a/icons/Anki_Del_Tag.png b/designer/icons/Anki_Del_Tag.png similarity index 100% rename from icons/Anki_Del_Tag.png rename to designer/icons/Anki_Del_Tag.png diff --git a/icons/Anki_Fact.png b/designer/icons/Anki_Fact.png similarity index 100% rename from icons/Anki_Fact.png rename to designer/icons/Anki_Fact.png diff --git a/icons/anki-logo-thin.png b/designer/icons/anki-logo-thin.png similarity index 100% rename from icons/anki-logo-thin.png rename to designer/icons/anki-logo-thin.png diff --git a/icons/anki-logo.png b/designer/icons/anki-logo.png similarity index 100% rename from icons/anki-logo.png rename to designer/icons/anki-logo.png diff --git a/icons/anki-logo.svg b/designer/icons/anki-logo.svg similarity index 100% rename from icons/anki-logo.svg rename to designer/icons/anki-logo.svg diff --git a/icons/anki-tag.png b/designer/icons/anki-tag.png similarity index 100% rename from icons/anki-tag.png rename to designer/icons/anki-tag.png diff --git a/icons/anki.png b/designer/icons/anki.png similarity index 100% rename from icons/anki.png rename to designer/icons/anki.png diff --git a/icons/application-exit.png b/designer/icons/application-exit.png similarity index 100% rename from icons/application-exit.png rename to designer/icons/application-exit.png diff --git a/icons/appointment-new.png b/designer/icons/appointment-new.png similarity index 100% rename from icons/appointment-new.png rename to designer/icons/appointment-new.png diff --git a/icons/arrow-down-double.png b/designer/icons/arrow-down-double.png similarity index 100% rename from icons/arrow-down-double.png rename to designer/icons/arrow-down-double.png diff --git a/icons/arrow-down.png b/designer/icons/arrow-down.png similarity index 100% rename from icons/arrow-down.png rename to designer/icons/arrow-down.png diff --git a/icons/arrow-up-double.png b/designer/icons/arrow-up-double.png similarity index 100% rename from icons/arrow-up-double.png rename to designer/icons/arrow-up-double.png diff --git a/icons/arrow-up.png b/designer/icons/arrow-up.png similarity index 100% rename from icons/arrow-up.png rename to designer/icons/arrow-up.png diff --git a/icons/chronometer.png b/designer/icons/chronometer.png similarity index 100% rename from icons/chronometer.png rename to designer/icons/chronometer.png diff --git a/icons/colors.png b/designer/icons/colors.png similarity index 100% rename from icons/colors.png rename to designer/icons/colors.png diff --git a/icons/colorscm.png b/designer/icons/colorscm.png similarity index 100% rename from icons/colorscm.png rename to designer/icons/colorscm.png diff --git a/icons/configure.png b/designer/icons/configure.png similarity index 100% rename from icons/configure.png rename to designer/icons/configure.png diff --git a/icons/contents.png b/designer/icons/contents.png similarity index 100% rename from icons/contents.png rename to designer/icons/contents.png diff --git a/icons/contents2.png b/designer/icons/contents2.png similarity index 100% rename from icons/contents2.png rename to designer/icons/contents2.png diff --git a/icons/document-export.png b/designer/icons/document-export.png similarity index 100% rename from icons/document-export.png rename to designer/icons/document-export.png diff --git a/icons/document-import.png b/designer/icons/document-import.png similarity index 100% rename from icons/document-import.png rename to designer/icons/document-import.png diff --git a/icons/document-new.png b/designer/icons/document-new.png similarity index 100% rename from icons/document-new.png rename to designer/icons/document-new.png diff --git a/icons/document-open-recent.png b/designer/icons/document-open-recent.png similarity index 100% rename from icons/document-open-recent.png rename to designer/icons/document-open-recent.png diff --git a/icons/document-open-remote.png b/designer/icons/document-open-remote.png similarity index 100% rename from icons/document-open-remote.png rename to designer/icons/document-open-remote.png diff --git a/icons/document-open.png b/designer/icons/document-open.png similarity index 100% rename from icons/document-open.png rename to designer/icons/document-open.png diff --git a/icons/document-preview.png b/designer/icons/document-preview.png similarity index 100% rename from icons/document-preview.png rename to designer/icons/document-preview.png diff --git a/icons/document-save-as.png b/designer/icons/document-save-as.png similarity index 100% rename from icons/document-save-as.png rename to designer/icons/document-save-as.png diff --git a/icons/document-save.png b/designer/icons/document-save.png similarity index 100% rename from icons/document-save.png rename to designer/icons/document-save.png diff --git a/icons/download.png b/designer/icons/download.png similarity index 100% rename from icons/download.png rename to designer/icons/download.png diff --git a/icons/edit-find.png b/designer/icons/edit-find.png similarity index 100% rename from icons/edit-find.png rename to designer/icons/edit-find.png diff --git a/icons/edit-redo.png b/designer/icons/edit-redo.png similarity index 100% rename from icons/edit-redo.png rename to designer/icons/edit-redo.png diff --git a/icons/edit-rename.png b/designer/icons/edit-rename.png similarity index 100% rename from icons/edit-rename.png rename to designer/icons/edit-rename.png diff --git a/icons/edit-undo.png b/designer/icons/edit-undo.png similarity index 100% rename from icons/edit-undo.png rename to designer/icons/edit-undo.png diff --git a/icons/edit.png b/designer/icons/edit.png similarity index 100% rename from icons/edit.png rename to designer/icons/edit.png diff --git a/icons/editclear.png b/designer/icons/editclear.png similarity index 100% rename from icons/editclear.png rename to designer/icons/editclear.png diff --git a/icons/editdelete.png b/designer/icons/editdelete.png similarity index 100% rename from icons/editdelete.png rename to designer/icons/editdelete.png diff --git a/icons/emblem-favorite.png b/designer/icons/emblem-favorite.png similarity index 100% rename from icons/emblem-favorite.png rename to designer/icons/emblem-favorite.png diff --git a/icons/emblem-important.png b/designer/icons/emblem-important.png similarity index 100% rename from icons/emblem-important.png rename to designer/icons/emblem-important.png diff --git a/icons/fileclose.png b/designer/icons/fileclose.png similarity index 100% rename from icons/fileclose.png rename to designer/icons/fileclose.png diff --git a/icons/find.png b/designer/icons/find.png similarity index 100% rename from icons/find.png rename to designer/icons/find.png diff --git a/icons/folder_image.png b/designer/icons/folder_image.png similarity index 100% rename from icons/folder_image.png rename to designer/icons/folder_image.png diff --git a/icons/folder_sound.png b/designer/icons/folder_sound.png similarity index 100% rename from icons/folder_sound.png rename to designer/icons/folder_sound.png diff --git a/icons/format-stroke-color.png b/designer/icons/format-stroke-color.png similarity index 100% rename from icons/format-stroke-color.png rename to designer/icons/format-stroke-color.png diff --git a/icons/games-solve.png b/designer/icons/games-solve.png similarity index 100% rename from icons/games-solve.png rename to designer/icons/games-solve.png diff --git a/icons/generate_07.png b/designer/icons/generate_07.png similarity index 100% rename from icons/generate_07.png rename to designer/icons/generate_07.png diff --git a/icons/go-first.png b/designer/icons/go-first.png similarity index 100% rename from icons/go-first.png rename to designer/icons/go-first.png diff --git a/icons/go-home.png b/designer/icons/go-home.png similarity index 100% rename from icons/go-home.png rename to designer/icons/go-home.png diff --git a/icons/go-jump-today.png b/designer/icons/go-jump-today.png similarity index 100% rename from icons/go-jump-today.png rename to designer/icons/go-jump-today.png diff --git a/icons/go-last.png b/designer/icons/go-last.png similarity index 100% rename from icons/go-last.png rename to designer/icons/go-last.png diff --git a/icons/go-next.png b/designer/icons/go-next.png similarity index 100% rename from icons/go-next.png rename to designer/icons/go-next.png diff --git a/icons/go-previous.png b/designer/icons/go-previous.png similarity index 100% rename from icons/go-previous.png rename to designer/icons/go-previous.png diff --git a/icons/help-contents.png b/designer/icons/help-contents.png similarity index 100% rename from icons/help-contents.png rename to designer/icons/help-contents.png diff --git a/icons/help-hint.png b/designer/icons/help-hint.png similarity index 100% rename from icons/help-hint.png rename to designer/icons/help-hint.png diff --git a/icons/help.png b/designer/icons/help.png similarity index 100% rename from icons/help.png rename to designer/icons/help.png diff --git a/icons/image.png b/designer/icons/image.png similarity index 100% rename from icons/image.png rename to designer/icons/image.png diff --git a/icons/kanji.png b/designer/icons/kanji.png similarity index 100% rename from icons/kanji.png rename to designer/icons/kanji.png diff --git a/icons/kblogger.png b/designer/icons/kblogger.png similarity index 100% rename from icons/kblogger.png rename to designer/icons/kblogger.png diff --git a/icons/kbugbuster.png b/designer/icons/kbugbuster.png similarity index 100% rename from icons/kbugbuster.png rename to designer/icons/kbugbuster.png diff --git a/icons/kexi.png b/designer/icons/kexi.png similarity index 100% rename from icons/kexi.png rename to designer/icons/kexi.png diff --git a/icons/khtml_kget.png b/designer/icons/khtml_kget.png similarity index 100% rename from icons/khtml_kget.png rename to designer/icons/khtml_kget.png diff --git a/icons/kpersonalizer.png b/designer/icons/kpersonalizer.png similarity index 100% rename from icons/kpersonalizer.png rename to designer/icons/kpersonalizer.png diff --git a/icons/layout.png b/designer/icons/layout.png similarity index 100% rename from icons/layout.png rename to designer/icons/layout.png diff --git a/icons/list-add.png b/designer/icons/list-add.png similarity index 100% rename from icons/list-add.png rename to designer/icons/list-add.png diff --git a/icons/math_matrix.png b/designer/icons/math_matrix.png similarity index 100% rename from icons/math_matrix.png rename to designer/icons/math_matrix.png diff --git a/icons/math_sqrt.png b/designer/icons/math_sqrt.png similarity index 100% rename from icons/math_sqrt.png rename to designer/icons/math_sqrt.png diff --git a/icons/media-playback-pause.png b/designer/icons/media-playback-pause.png similarity index 100% rename from icons/media-playback-pause.png rename to designer/icons/media-playback-pause.png diff --git a/icons/media-playback-start.png b/designer/icons/media-playback-start.png similarity index 100% rename from icons/media-playback-start.png rename to designer/icons/media-playback-start.png diff --git a/icons/media-playback-start2.png b/designer/icons/media-playback-start2.png similarity index 100% rename from icons/media-playback-start2.png rename to designer/icons/media-playback-start2.png diff --git a/icons/media-playback-stop.png b/designer/icons/media-playback-stop.png similarity index 100% rename from icons/media-playback-stop.png rename to designer/icons/media-playback-stop.png diff --git a/icons/media-record.png b/designer/icons/media-record.png similarity index 100% rename from icons/media-record.png rename to designer/icons/media-record.png diff --git a/icons/multisynk.png b/designer/icons/multisynk.png similarity index 100% rename from icons/multisynk.png rename to designer/icons/multisynk.png diff --git a/icons/package_games_card.png b/designer/icons/package_games_card.png similarity index 100% rename from icons/package_games_card.png rename to designer/icons/package_games_card.png diff --git a/icons/player-time.png b/designer/icons/player-time.png similarity index 100% rename from icons/player-time.png rename to designer/icons/player-time.png diff --git a/icons/preferences-desktop-font.png b/designer/icons/preferences-desktop-font.png similarity index 100% rename from icons/preferences-desktop-font.png rename to designer/icons/preferences-desktop-font.png diff --git a/icons/preferences-plugin.png b/designer/icons/preferences-plugin.png similarity index 100% rename from icons/preferences-plugin.png rename to designer/icons/preferences-plugin.png diff --git a/icons/rating.png b/designer/icons/rating.png similarity index 100% rename from icons/rating.png rename to designer/icons/rating.png diff --git a/icons/speaker.png b/designer/icons/speaker.png similarity index 100% rename from icons/speaker.png rename to designer/icons/speaker.png diff --git a/icons/spreadsheet.png b/designer/icons/spreadsheet.png similarity index 100% rename from icons/spreadsheet.png rename to designer/icons/spreadsheet.png diff --git a/icons/sqlitebrowser.png b/designer/icons/sqlitebrowser.png similarity index 100% rename from icons/sqlitebrowser.png rename to designer/icons/sqlitebrowser.png diff --git a/icons/system-shutdown.png b/designer/icons/system-shutdown.png similarity index 100% rename from icons/system-shutdown.png rename to designer/icons/system-shutdown.png diff --git a/icons/system-software-update.png b/designer/icons/system-software-update.png similarity index 100% rename from icons/system-software-update.png rename to designer/icons/system-software-update.png diff --git a/icons/tex.png b/designer/icons/tex.png similarity index 100% rename from icons/tex.png rename to designer/icons/tex.png diff --git a/icons/text-speak.png b/designer/icons/text-speak.png similarity index 100% rename from icons/text-speak.png rename to designer/icons/text-speak.png diff --git a/icons/text-xml.png b/designer/icons/text-xml.png similarity index 100% rename from icons/text-xml.png rename to designer/icons/text-xml.png diff --git a/icons/text_bold.png b/designer/icons/text_bold.png similarity index 100% rename from icons/text_bold.png rename to designer/icons/text_bold.png diff --git a/icons/text_italic.png b/designer/icons/text_italic.png similarity index 100% rename from icons/text_italic.png rename to designer/icons/text_italic.png diff --git a/icons/text_under.png b/designer/icons/text_under.png similarity index 100% rename from icons/text_under.png rename to designer/icons/text_under.png diff --git a/icons/view-calendar-tasks.png b/designer/icons/view-calendar-tasks.png similarity index 100% rename from icons/view-calendar-tasks.png rename to designer/icons/view-calendar-tasks.png diff --git a/icons/view-pim-calendar.png b/designer/icons/view-pim-calendar.png similarity index 100% rename from icons/view-pim-calendar.png rename to designer/icons/view-pim-calendar.png diff --git a/icons/view-pim-news.png b/designer/icons/view-pim-news.png similarity index 100% rename from icons/view-pim-news.png rename to designer/icons/view-pim-news.png diff --git a/icons/view-sort-ascending.png b/designer/icons/view-sort-ascending.png similarity index 100% rename from icons/view-sort-ascending.png rename to designer/icons/view-sort-ascending.png diff --git a/icons/view-sort-descending.png b/designer/icons/view-sort-descending.png similarity index 100% rename from icons/view-sort-descending.png rename to designer/icons/view-sort-descending.png diff --git a/icons/view-statistics.png b/designer/icons/view-statistics.png similarity index 100% rename from icons/view-statistics.png rename to designer/icons/view-statistics.png diff --git a/icons/view_text.png b/designer/icons/view_text.png similarity index 100% rename from icons/view_text.png rename to designer/icons/view_text.png diff --git a/setup.py b/setup.py deleted file mode 100644 index 2e8650a7a..000000000 --- a/setup.py +++ /dev/null @@ -1,30 +0,0 @@ -from setuptools import setup, find_packages -import sys, os - -import ankiqt - -setup(name='ankiqt', - version=ankiqt.appVersion, - description='An intelligent spaced-repetition memory training program', - long_description="", - # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - 'Intended Audience :: Education', - 'License :: OSI Approved :: GNU General Public License (GPL)', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Topic :: Education', - ], - keywords='', - author='Damien Elmes', - author_email='anki@ichi2.net', - url='http://ichi2.net/anki/index.html', - license='GPLv3', - packages=find_packages(), - include_package_data=True, - install_requires = 'anki >= ' + ankiqt.appVersion, - zip_safe=False, - package_data={'ankiqt': - ['locale/*/*/*']}, - scripts = ['anki'], - ) diff --git a/anki-wait.bat b/tools/anki-wait.bat similarity index 80% rename from anki-wait.bat rename to tools/anki-wait.bat index 1d30b4de0..52ac810b1 100644 --- a/anki-wait.bat +++ b/tools/anki-wait.bat @@ -1,3 +1,4 @@ +cd .. set PYTHONPATH=../lib python anki pause diff --git a/tools/build_ui.sh b/tools/build_ui.sh index bd695b5a7..98ba03cd8 100755 --- a/tools/build_ui.sh +++ b/tools/build_ui.sh @@ -9,7 +9,7 @@ then exit fi -mkdir -p ankiqt/forms +mkdir -p aqt/forms pyuic=`which pyuic4` pyrcc=`which pyrcc4` @@ -47,8 +47,8 @@ if [ $? != 0 ]; then fi fi -init=ankiqt/forms/__init__.py -temp=ankiqt/forms/scratch +init=aqt/forms/__init__.py +temp=aqt/forms/scratch rm -f $init $temp echo "# This file auto-generated by build_ui.sh. Don't edit." > $init echo "__all__ = [" >> $init @@ -57,7 +57,7 @@ echo "Generating forms.." for i in designer/*.ui do base=$(echo $i | perl -pe 's/\.ui//; s%designer/%%;') - py=$(echo $i | perl -pe 's/\.ui/.py/; s%designer%ankiqt/forms%;') + py=$(echo $i | perl -pe 's/\.ui/.py/; s%designer%aqt/forms%;') echo " * "$py $pyuic $i -o $py echo " \"$base\"," >> $init @@ -73,4 +73,4 @@ cat $temp >> $init rm $temp echo "Building resources.." -$pyrcc icons.qrc -o icons_rc.py +$pyrcc designer/icons.qrc -o aqt/forms/icons_rc.py diff --git a/tools/translate.sh b/tools/translate.sh index b616f861b..cc3e5a518 100755 --- a/tools/translate.sh +++ b/tools/translate.sh @@ -3,32 +3,32 @@ # build translations # -if [ ! -d "ankiqt" ] +if [ ! -d "aqt" ] then echo "Please run this from the anki project directory" exit fi oldpwd=$(pwd) -cd ankiqt +cd aqt version=$(grep -i appVersion= __init__.py) version2=$(expr substr $version 13 $((${#version}-13))) -allPyFiles=ankiqt.files +allPyFiles=aqt.files echo "Generating translations for version $version2" -for i in *.py ui/*.py forms/*.py +for i in *.py forms/*.py do echo $i >> $allPyFiles done -xgettext -s --no-wrap --package-name="ankiqt" --package-version=$version2 --files-from=$allPyFiles --output=locale/messages.pot +xgettext -s --no-wrap --package-name="aqt" --package-version=$version2 --files-from=$allPyFiles --output=locale/messages.pot for file in locale/*.po do echo -n $file msgmerge -s --no-wrap $file locale/messages.pot > $file.new && mv $file.new $file outdir=$(echo $file | \ - perl -pe 's%locale/ankiqt_(.*)\.po%locale/\1/LC_MESSAGES%') - outfile="$outdir/ankiqt.mo" + perl -pe 's%locale/aqt_(.*)\.po%locale/\1/LC_MESSAGES%') + outfile="$outdir/aqt.mo" mkdir -p $outdir msgfmt $file --output-file=$outfile done