[Pymoul-svn] SF.net SVN: pymoul: [127] pymoul/trunk/src/moul
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-02-02 21:05:51
|
Revision: 127
http://pymoul.svn.sourceforge.net/pymoul/?rev=127&view=rev
Author: tiran
Date: 2007-02-02 13:05:40 -0800 (Fri, 02 Feb 2007)
Log Message:
-----------
Progress bar for LOC loader
Modified Paths:
--------------
pymoul/trunk/src/moul/file/directory.py
pymoul/trunk/src/moul/file/localization.py
pymoul/trunk/src/moul/file/tests/test_localization.py
pymoul/trunk/src/moul/log.py
pymoul/trunk/src/moul/qt/localization.py
pymoul/trunk/src/moul/qt/mainwindow.py
Modified: pymoul/trunk/src/moul/file/directory.py
===================================================================
--- pymoul/trunk/src/moul/file/directory.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/file/directory.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -26,7 +26,7 @@
from moul.file.chatlog import ChatlogDirectoryView
from moul.file.chatlog import ChatlogMover
from moul.file.kiimage import KIImageFixer
-from moul.file.localization import parseLocDirectory
+from moul.file.localization import LocDirParser
from moul.file.plasmalog import PlasmalogZipper
from moul.file.wdysini import AudioIni
from moul.file.wdysini import GraphicsIni
@@ -147,7 +147,7 @@
'video' : 'avi',
}
_factories = {
- 'loc' : (parseLocDirectory, ('loc',)),
+ 'loc' : (LocDirParser, ('loc',)),
}
class UruPersonalDataDirectory(AbstractUruDirectory):
Modified: pymoul/trunk/src/moul/file/localization.py
===================================================================
--- pymoul/trunk/src/moul/file/localization.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/file/localization.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -121,7 +121,6 @@
dset = dage.setdefault(setname, {})
dset[element] = key
-
class Translation(unicode):
"""Translation object
@@ -168,6 +167,7 @@
def __init__(self, fname=''):
self._fname = fname
+ self.translations = []
def startDocument(self):
self._age = None
@@ -202,70 +202,101 @@
elif name == u"element":
self._element = None
elif name == u"translation":
- content = self._content
- content = u''.join(content)
- tl = Translation(age = self._age,
- set = self._set,
- element = self._element,
- language = self._language,
- content = content,
- fname = self._fname)
- registerTranslation(tl)
+ self.translationFound()
self._language = None
self._content = []
+ def translationFound(self):
+ """</translation> handler
+ """
+ content = u''.join(self._content)
+ tl = Translation(age = self._age,
+ set = self._set,
+ element = self._element,
+ language = self._language,
+ content = content,
+ fname = self._fname)
+ self.translations.append(tl)
-def parseLoc(fd, fname=''):
- """Parse a loc file
+class LocDirParser(object):
+ """Parse translation LOC files
"""
- parser = make_parser()
- parser.setFeature(feature_namespaces, False)
- dh = MoulLocHandler(fname=fname)
- parser.setContentHandler(dh)
- parser.parse(fd)
+ contentHandler = MoulLocHandler
+
+ def __init__(self, srcdir, registry=translationRegistry, clear=False):
+ """Constructor
+
+ @param srcdir: directory containing loc files to parse
+ @type srcdir: string
+ @param registry: a translation registry instance
+ @type registry: TranslationRegistry
+ @param clear: clear the registry before parsing files?
+ @type clear: bool
+ """
+ self._srcdir = srcdir
+ self._tr = registry
+ self._locs = None
+ if clear:
+ self._tr.clear()
-def parseLocDirectory(path, clear=False):
- """Parse all loc files in a directory
- """
- files = []
- errors = []
+ def exists(self):
+ """Test if directory exists
+ """
+ return os.path.isdir(self._srcdir)
- if clear:
- translationRegistry.clear()
+ def parseLoc(self, fd, fname=''):
+ """Parse a loc file
+
+ @param fd: file to handler
+ @type fd: file descriptor
+ @param fname: file name
+ @type fname: str
+ @return: a list of translations
+ @rtype: list
+ """
+ parser = make_parser()
+ parser.setFeature(feature_namespaces, False)
+ ch = self.contentHandler(fname=fname)
+ parser.setContentHandler(ch)
+ parser.parse(fd)
+ return ch.translations
- if not os.path.isdir(path):
- raise IOError("invalid path %s" % path)
+ def findLocs(self):
+ """Find loc files in the directory
+ """
+ if self._locs is not None:
+ LOG.info("findLocs() called twice")
+ return
- globpat = os.path.join(path, '*.loc')
- locs = glob.glob(globpat)
+ if not os.path.isdir(self._srcdir):
+ LOG.warning("%s is not a directory" % self._srcdir)
+ return False
- if not locs:
- raise ValueError("no localizations found in %s" % path)
+ globpat = os.path.join(self._srcdir, '*.loc')
+ locs = glob.glob(globpat)
+ self._locs = locs
+ return locs
+
+ def parseLocDir(self):
+ """Parse all loc files at once
+ """
+ if self._loc is None:
+ self.findLocs()
+ for loc in iter(self):
+ pass
- for loc in locs:
- fname = os.path.basename(loc)
- if not os.access(loc, os.R_OK):
- errors.append(fname)
- LOG.debug("parseLogDirectory: unable to read file %s" % loc)
- continue
- with open(loc, 'r') as fd:
- parseLoc(fd, fname=fname)
- files.append(fname)
-
- return {'files' : files, 'errors' : errors }
-
-def _test(path="D:/games/MystOnline/dat", out=False):
- from pprint import pprint
- files, errors = parseLocDirectory(path, clear=True)
- if out:
- print errors
- tr = translationRegistry
- print tr.languages()
- print tr.ages()
- print tr.sets()
- print tr.elements()
- pprint(tr.tree())
-
-if __name__ == '__main__':
- _test(out=True)
+ def __len__(self):
+ """len() support
+ """
+ return len(self._locs)
+
+ def __iter__(self):
+ """Iterator support for GUI progress bar
+ """
+ for loc in self._locs:
+ with open(loc, 'r') as fd:
+ yield loc
+ translations = self.parseLoc(fd, loc)
+ for tl in translations:
+ self._tr.register(tl)
Modified: pymoul/trunk/src/moul/file/tests/test_localization.py
===================================================================
--- pymoul/trunk/src/moul/file/tests/test_localization.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/file/tests/test_localization.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -25,8 +25,7 @@
import unittest
from doctest import DocTestSuite
-from moul.file.localization import parseLoc
-from moul.file.localization import parseLocDirectory
+from moul.file.localization import LocDirParser
from moul.file.localization import translationRegistry
@@ -41,17 +40,12 @@
pass
def test_parseLocDir(self):
- parseLocDirectory(base)
+ ldp = LocDirParser(base)
+ ldp.parseLocDir()
key = (u'english', u'testage', u'testset', u'testelement')
self.failUnless(key in translationRegistry, translationRegistry.keys())
self.failUnlessEqual(len(translationRegistry), 1)
- def test_parseLoc(self):
- parseLoc(os.path.join(base, 'test.loc'))
- key = (u'english', u'testage', u'testset', u'testelement')
- self.failUnless(key in translationRegistry, translationRegistry.keys())
- self.failUnlessEqual(len(translationRegistry), 1)
-
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(LocalizationTest),
Modified: pymoul/trunk/src/moul/log.py
===================================================================
--- pymoul/trunk/src/moul/log.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/log.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -17,6 +17,8 @@
#
"""pyMoul logger
"""
+from __future__ import absolute_import
+
__author__ = "Christian Heimes"
__version__ = "$Id$"
__revision__ = "$Revision$"
@@ -27,6 +29,7 @@
import os
import platform
import sys
+import time # absolute import!
from logging import Formatter
from logging import handlers
@@ -39,7 +42,7 @@
format = Formatter('%(asctime)s %(name)-8s %(levelname)-7s %(message)s',
#'%a, %d %b %Y %H:%M:%S'
- '%m-%d %H:%M:%S')
+ '%H:%M:%S')
root = getLogger()
root.setLevel(logging.DEBUG)
LOG = getLogger('pyMoul')
@@ -94,6 +97,7 @@
def _systemInfo():
from moul.osdependent import __INFO__
+ LOG.info("time: " + time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()))
LOG.info("pyMoul version: %s" % moul_version)
LOG.info("Python: %s" % repr(sys.version_info))
LOG.info("Python: %s" % sys.version.replace('\n', ' '))
@@ -113,7 +117,7 @@
shdlr = logging.StreamHandler(sys.stderr)
shdlr.setFormatter(format)
root.addHandler(shdlr)
- #_systemInfo()
+ _systemInfo()
else:
_installMemoryHdlr()
_systemInfo()
Modified: pymoul/trunk/src/moul/qt/localization.py
===================================================================
--- pymoul/trunk/src/moul/qt/localization.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/qt/localization.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -30,14 +30,12 @@
from PyQt4.QtCore import SIGNAL
from PyQt4.QtCore import pyqtSignature
-from moul.config import lookupDir
-from moul.file.directory import UruGameDataDirectory
from moul.file.localization import translationRegistry as tr
from moul.log import getLogger
from moul.log import signalLogDecorator
from moul.qt.simpleprogressbar import SimpleProgressbar
-from moul.qt.threadlet import Threadlet
+from moul.qt.threadlet import YieldingThreadlet
LOG = getLogger('moul.loc')
@@ -76,22 +74,28 @@
if self._journals_loaded:
return
- # TODO: other message box
+ ldh = self.urugamedir.factory('loc')
+ if not ldh.exists():
+ self.tab_sub_journals.setEnabled(False)
+ # TODO: message
+ return
+
+ ldh.findLocs()
+ if not len(ldh):
+ # TODO: message
+ return
+
self._journal_progressbar = SimpleProgressbar(self)
self._journal_progressbar.setWindowTitle(self.trUtf8("Loading journals"))
- self._journal_progressbar.setProgressbar(0, 1, 0)
+ self._journal_progressbar.setProgressbar(0, len(ldh), 0)
self._journal_progressbar.show()
- installDir = lookupDir('install')
- self._gamedir = UruGameDataDirectory(installDir)
- if not self._gamedir.exists('loc'):
- self.tab_sub_journals.setEnabled(False)
- return
-
- self._journal_threadlet = Threadlet()
+ self._journal_threadlet = YieldingThreadlet(self)
self.connect(self._journal_threadlet, SIGNAL('finished()'),
self.on_localization_loaded)
- self._journal_threadlet.detach(self._gamedir.factory, 'loc')
+ self.connect(self._journal_threadlet, SIGNAL("yield(const QString&)"),
+ self._journal_progressbar.increase)
+ self._journal_threadlet.detach(ldh)
@signalLogDecorator(LOG)
def on_localization_loaded(self):
@@ -100,11 +104,12 @@
"""
# remove thread
self.disconnect(self._journal_threadlet, SIGNAL('finished()'),
- self.on_localization_loaded)
+ self.on_localization_loaded)
+ self.disconnect(self._journal_threadlet, SIGNAL("yield(const QString&)"),
+ self._journal_progressbar.increase)
del self._journal_threadlet
# close and remove info message box
- self._journal_progressbar.setValue(1)
self._journal_progressbar.close()
del self._journal_progressbar
self._journals_loaded = True
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-02 18:11:58 UTC (rev 126)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-02 21:05:40 UTC (rev 127)
@@ -20,6 +20,10 @@
"""
from __future__ import with_statement
+__author__ = "Christian Heimes"
+__version__ = "$Id$"
+__revision__ = "$Revision$"
+
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
@@ -31,8 +35,6 @@
from moul.config import lookupDir
from moul.file.directory import UruGameDataDirectory
from moul.file.directory import UruPersonalDataDirectory
-from moul.file.wdysini import AudioIni
-from moul.file.wdysini import GraphicsIni
from moul.file.wdysini import videoModes
from moul.log import getLogger
from moul.log import signalLogDecorator
@@ -46,16 +48,7 @@
from moul.qt.threadlet import YieldingThreadlet
from moul.qt.ui.mainwindow import Ui_MainWindow
-__author__ = "Christian Heimes"
-__version__ = "$Id$"
-__revision__ = "$Revision$"
-
-
-
-# TBR
-
-
LOG = getLogger('moul.qt')
class MainWindow(QtGui.QMainWindow, Ui_MainWindow, LocalizationMixin):
@@ -76,9 +69,9 @@
# set directory handlers
self.urugamedir = UruGameDataDirectory(lookupDir('install'))
- self.urudatadir = UruPersonalDataDirectory(lookupDir('userdata'))
+ self.urupersonaldir = UruPersonalDataDirectory(lookupDir('userdata'))
# TODO: checks
- self.urudatadir.initializeFactories()
+ self.urupersonaldir.initializeFactories()
# init handlers
self._timezone_init()
@@ -188,7 +181,7 @@
"""
Clicked repair button
"""
- kimover = self.urudatadir.kiimages
+ kimover = self.urupersonaldir.kiimages
if not kimover.findFiles():
# TODO: msg
return
@@ -217,7 +210,7 @@
self._kiimage_progressbar.increase)
self.disconnect(self._kiimage_threadlet, SIGNAL("finished()"),
self.on_pb_kiimage_repair_done)
- del self._kiimage_threadlet
+ del self._kiimage_threadlet# TODO: other message box
del self._kiimage_progressbar
self.pb_kiimage_repair.setEnabled(True)
# TODO: msg
@@ -245,8 +238,7 @@
"""
@qtslot graphicsini_loaded(): notify when a graphics.ini is loaded
"""
- inipath = lookupDir('ini')
- self._graphics_ini = gini = GraphicsIni(inipath)
+ gini = self.urupersonaldir.graphicsini
try:
gini.read()
except Exception, msg:
@@ -262,7 +254,7 @@
"""
SIGNAL graphicsini_reset()
"""
- self._graphics_ini.reset()
+ self.urupersonaldir.graphicsini.reset()
self._graphicsini_setstate()
@signalLogDecorator(LOG)
@@ -271,14 +263,14 @@
SIGNAL graphicsini_save()
"""
#self._notimplemented()
- self._graphics_ini.write()
+ self.urupersonaldir.graphicsini.write()
self.setDirty(False)
def _graphicsini_setstate(self):
"""
Set sliders according to graphics ini settings
"""
- gini = self._graphics_ini
+ gini = self.urupersonaldir.graphicsini
length = len(videoModes) - 1
self.sl_gra_screenres.setMaximum(length)
@@ -301,7 +293,7 @@
# XXX: fixme
txt = videoModes.getVidModeHuman(idx)
self.lb_screenres.setText(QtCore.QString(txt))
- self._graphics_ini.screenres = idx
+ self.urupersonaldir.graphicsini.screenres = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -318,7 +310,7 @@
"""
SIGNAL: valueChanged (int)
"""
- self._graphics_ini.quality = idx
+ self.urupersonaldir.graphicsini.quality = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -326,7 +318,7 @@
"""
SIGNAL: valueChanged (int)
"""
- self._graphics_ini.texture = idx
+ self.urupersonaldir.graphicsini.texture = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -334,7 +326,7 @@
"""
SIGNAL: valueChanged (int)
"""
- self._graphics_ini.antialias = idx
+ self.urupersonaldir.graphicsini.antialias = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -342,7 +334,7 @@
"""
SIGNAL: valueChanged (int)
"""
- self._graphics_ini.anisotropic = idx
+ self.urupersonaldir.graphicsini.anisotropic = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -350,7 +342,7 @@
"""
SIGNAL: valueChanged (int)
"""
- self._graphics_ini.shadow = idx
+ self.urupersonaldir.graphicsini.shadow = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -358,7 +350,7 @@
"""
SIGNAL: stateChanged(int)
"""
- self._graphics_ini.windowed = state
+ self.urupersonaldir.graphicsini.windowed = state
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -366,7 +358,7 @@
"""
SIGNAL: stateChanged(int)
"""
- self._graphics_ini.vsync = state
+ self.urupersonaldir.graphicsini.vsync = state
@signalLogDecorator(LOG)
@pyqtSignature("int")
@@ -374,7 +366,7 @@
"""
SIGNAL: stateChanged(int)
"""
- self._graphics_ini.shadow_enabled = state
+ self.urupersonaldir.graphicsini.shadow_enabled = state
# ************************************************************************
# audio settings
@@ -395,8 +387,7 @@
"""
SIGNAL: audioini_loaded()
"""
- inipath = lookupDir('ini')
- self._audio_ini = aini = AudioIni(inipath)
+ aini = self.urupersonaldir.audioini
try:
aini.read()
except Exception, msg:
@@ -412,7 +403,7 @@
"""
SIGNAL audioini_reset()
"""
- self._audio_ini.reset()
+ self.urupersonaldir.audioini.reset()
self._audioini_setstate()
@signalLogDecorator(LOG)
@@ -421,14 +412,14 @@
SIGNAL audioini_save()
"""
#self._notimplemented()
- self._audio_ini.write()
+ self.urupersonaldir.audioini.write()
self.setDirty(False) # urks
def _audioini_setstate(self):
"""
Set sliders according to audio ini settings
"""
- aini = self._audio_ini
+ aini = self.urupersonaldir.audioini
self.sl_aud_device.setMaximum(aini.numberOfDevices()-1)
self.sl_aud_npc.setValue(aini.npc)
@@ -444,55 +435,55 @@
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_device_valueChanged(self, idx):
- self._audio_ini.device = idx
- txt = self._audio_ini.getDeviceName(idx)
+ self.urupersonaldir.audioini.device = idx
+ txt = self.urupersonaldir.audioini.getDeviceName(idx)
self.lb_aud_device.setText(QtCore.QString(txt[1:-1]))
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_device_sliderMoved(self, idx):
- txt = self._audio_ini.getDeviceName(idx)
+ txt = self.urupersonaldir.audioini.getDeviceName(idx)
self.lb_aud_device.setText(QtCore.QString(txt[1:-1]))
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_npc_valueChanged(self, idx):
- self._audio_ini.npc = idx
+ self.urupersonaldir.audioini.npc = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_music_valueChanged(self, idx):
- self._audio_ini.music = idx
+ self.urupersonaldir.audioini.music = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_fx_valueChanged(self, idx):
- self._audio_ini.fx = idx
+ self.urupersonaldir.audioini.fx = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_ambience_valueChanged(self, idx):
- self._audio_ini.ambience = idx
+ self.urupersonaldir.audioini.ambience = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_sl_aud_priority_valueChanged(self, idx):
- self._audio_ini.priority = idx
+ self.urupersonaldir.audioini.priority = idx
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_cb_aud_eax_stateChanged (self, state):
- self._audio_ini.eax = state
+ self.urupersonaldir.audioini.eax = state
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_cb_aud_mute_stateChanged (self, state):
- self._audio_ini.mute = state
+ self.urupersonaldir.audioini.mute = state
@signalLogDecorator(LOG)
@pyqtSignature("int")
def on_cb_aud_voicechat_stateChanged (self, state):
- self._audio_ini.voicechat = state
+ self.urupersonaldir.audioini.voicechat = state
# ************************************************************************
# time zones
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|