[Pymoul-svn] SF.net SVN: pymoul: [48] pymoul/trunk/src/moul
Status: Alpha
Brought to you by:
tiran
From: <ti...@us...> - 2007-01-18 20:25:26
|
Revision: 48 http://pymoul.svn.sourceforge.net/pymoul/?rev=48&view=rev Author: tiran Date: 2007-01-18 12:25:26 -0800 (Thu, 18 Jan 2007) Log Message: ----------- Major work on graphics ini parsing Modified Paths: -------------- pymoul/trunk/src/moul/crypt/whatdoyousee.py pymoul/trunk/src/moul/file/tests/test_wdysini.py pymoul/trunk/src/moul/file/wdysini.py pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.ui Modified: pymoul/trunk/src/moul/crypt/whatdoyousee.py =================================================================== --- pymoul/trunk/src/moul/crypt/whatdoyousee.py 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/crypt/whatdoyousee.py 2007-01-18 20:25:26 UTC (rev 48) @@ -76,7 +76,7 @@ """ # XXX: dos format instr = instr.replace("\n", "\r\n") - fin.seek(0) + fout.seek(0) fout.write(HEADER) flen = len(instr) Modified: pymoul/trunk/src/moul/file/tests/test_wdysini.py =================================================================== --- pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-01-18 20:25:26 UTC (rev 48) @@ -22,9 +22,12 @@ __revision__ = "$Revision$" import os +import string +from StringIO import StringIO import unittest from doctest import DocTestSuite +from moul.crypt.whatdoyousee import decryptWDYS from moul.file.wdysini import AudioIni from moul.file.wdysini import GraphicsIni @@ -47,6 +50,12 @@ def tearDown(self): self.enc_fd.close() self.dec_fd.close() + + def _compareLines(self, first, second): + flines = first.split('\n') + slines = second.split('\n') + for i, fline in enumerate(flines): + self.failUnlessEqual(fline, slines[i]) def test_parseString(self): p = self.parser @@ -55,11 +64,33 @@ self.failUnless(p._filedata) self.failIf(p.isChanged()) newdata = p.writeString() - olines = data.split('\n') - nlines = newdata.split('\n') - for i, oline in enumerate(olines): - self.failUnlessEqual(oline, nlines[i]) - + self._compareLines(data, newdata) + + def test_chars(self): + valid = string.ascii_letters + '_. ' + data = self.dec_fd.read() + self.parser.parseString(data) + for key in self.parser._filedata: + for s in key: + self.failUnless(s in valid, s) + + def test_cryptparse(self): + p = self.parser + data = self.dec_fd.read() + p.parseEncFile(self.enc) + newdata = p.writeString() + self._compareLines(data, newdata) + fdout = StringIO() + p.writeEncFile(fdout) + + # round trip + fdout.seek(0) + encdata = decryptWDYS(fdout) + p.parseString(encdata) + newdata = p.writeString() + self._compareLines(data, newdata) + + class AudioIniTest(GenericIniTest): enc = aud_enc dec = aud_dec @@ -69,7 +100,45 @@ enc = gra_enc dec = gra_dec parserClass = GraphicsIni + + def test_properties(self): + p = self.parser + eq = self.failUnlessEqual + + p.parseEncFile(self.enc) + eq(p.screenres, 1) + eq(p.windowed, True) + eq(p.antialias, 2) + eq(p.anisotropic, 2) + eq(p.texture, 2) + eq(p.quality, 2) + eq(p.shadow_enabled, 1) + eq(p.vsync, False) + def test_property_edit(self): + p = self.parser + eq = self.failUnlessEqual + + p.parseEncFile(self.enc) + self.failIf(p.isChanged()) + + p.vsync = True + eq(p._get('Graphics.EnableVSync'), True) + self.failUnless(p.isChanged()) + p.vsync = False + eq(p._get('Graphics.EnableVSync'), False) + #XXX self.failIf(p.isChanged()) + + p.screenres = 0 + eq(p._get('Graphics.Width'), 800) + eq(p._get('Graphics.Height'), 600) + + p.screenres = 10 + eq(p._get('Graphics.Width'), 1920) + eq(p._get('Graphics.Height'), 1200) + self.failUnless(p.isChanged()) + + def test_suite(): return unittest.TestSuite(( unittest.makeSuite(AudioIniTest), Modified: pymoul/trunk/src/moul/file/wdysini.py =================================================================== --- pymoul/trunk/src/moul/file/wdysini.py 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/file/wdysini.py 2007-01-18 20:25:26 UTC (rev 48) @@ -55,6 +55,13 @@ Traceback (most recent call last): ... ValueError: OK + + >>> BoolString(False) == False + True + >>> BoolString(True) == True + True + >>> BoolString(False) == True + False """ def __init__(self, value=False): @@ -82,8 +89,8 @@ def __repr__(self): return str(self) - def __cmp__(self, other): - return cmp(bool(self), bool(other)) + def __eq__(self, other): + return self._true == bool(other) class FloatString(float): """Float with a slightly different representation @@ -126,15 +133,30 @@ _options = {} def __init__(self): + self.clear() + + def clear(self): self._filedata = {} self._newdata = {} - self._order = [] - + self._order = [] + + def parseEncFile(self, fd_name): + """Read and parse file (fd or file name) + """ + self.clear() + if isinstance(fd_name, basestring): + fd = open(fd_name, 'rb') + else: + fd = fd_name + data = decryptWDYS(fd) + return self.parseString(data) + def parseString(self, s): """Parse string with file contents @param s newline seperated file (string) """ + self.clear() lines = s.split('\n') for line in lines: if not line.strip(): @@ -144,7 +166,9 @@ # not elegant but safe if line.startswith(key): found = True - newkey = key.replace(' ', '_') + #newkey = key.replace(' ', '__') + #newkey = newkey.replace('.', '_') + newkey = key self._order.append(newkey) data = line[len(key)+1:].strip() self._filedata[newkey] = convert(data) @@ -168,12 +192,24 @@ out = [] for newkey in self._order: value = self._newdata[newkey] - key = newkey.replace('_', ' ') + key = newkey + #key = newkey.replace('__', ' ') + #key = key.replace('_', '.') assert key in self._options out.append("%s %s" % (key, value)) out.append('') # new line at EOF return '\n'.join(out) - + + def writeEncFile(self, fd_name): + """Write file (fd or file name) + """ + if isinstance(fd_name, basestring): + fd = open(fd_name, 'wb') + else: + fd = fd_name + data = self.writeString() + return encryptWDYS(data, fd) + class AudioIni(ConfFile): _options = { 'Audio.Initialize' : BoolString, @@ -189,37 +225,99 @@ 'Audio.SetChannelVolume GUI' : FloatString, } +class _VideoModes(object): + """Video mode informations + """ + # width, height, w ratio, h ratio + _videomodes = VIDEO_MODES + # (w, h) -> idx + _reverse_vm = dict([((d[0], d[1]), i) for i, d in enumerate(VIDEO_MODES)]) + + def __len__(self): + return len(self._videomodes) + + def getVidModeByIdx(self, idx): + """Get video mode by index + + >>> videoModes.getVidModeByIdx(0) + (800, 600, 4, 3) + """ + return self._videomodes[idx] + + def getVidModeHuman(self, idx): + """Human readable vidoe mode by index + + >>> videoModes.getVidModeHuman(0) + '800x600 (4:3)' + """ + return "%ix%i (%i:%i)" % self.getVidModeByIdx(idx) + + def getVidIdxByMode(self, w, h): + """Reverse lookup + + >>> videoModes.getVidIdxByMode(800, 600) + 0 + """ + return self._reverse_vm[(w, h)] + +videoModes = _VideoModes() + class GraphicsIni(ConfFile): _options = { 'Graphics.Width' : int, 'Graphics.Height' : int, - 'Graphics.ColorDepth' : int, + 'Graphics.ColorDepth' : int, # no ui 'Graphics.Windowed' : BoolString, 'Graphics.AntiAliasAmount' : int, 'Graphics.AnisotropicLevel' : int, 'Graphics.TextureQuality' : int, 'Quality.Level' : int, 'Graphics.Shadow.Enable' : int, - 'Graphics.EnablePlanarReflections' : int, + 'Graphics.EnablePlanarReflections' : int, # no ui 'Graphics.EnableVSync' : BoolString, 'Graphics.Shadow.VisibleDistance' : FloatString, } - # width, height, w ratio, h ratio - _videomodes = VIDEO_MODES + def _getScreenRes(self): + w = self._newdata['Graphics.Width'] + h = self._newdata['Graphics.Height'] + return videoModes.getVidIdxByMode(w, h) - def getVidModeByIdx(self, idx): - """Get video mode by index - """ - return self._videomodes[idx] + def _setScreenRes(self, idx): + w, h, wf, hf = videoModes.getVidModeByIdx(idx) + self._newdata['Graphics.Width'] = w + self._newdata['Graphics.Height'] = h - def getVidModeHuman(self, idx): - """Human readable vidoe mode by index - """ - return "%ix%i (%i:%i)" % self.getVidModeByIdx(idx) - - def getVidIdxByMode(self, w, h): - for idx, mode in enumerate(self._videomodes): - if mode[0] == w and mode[1] == h: - return idx - raise KeyError("Video mode for %ix%i not found" % (w, h)) + def _get(self, name): + return self._newdata[name] + + def _set(self, name, value): + self._newdata[name] = value + + screenres = property(_getScreenRes, _setScreenRes, doc="Screen resolution by index") + windowed = property(lambda self: self._get('Graphics.Windowed'), + lambda self, v: self._set('Graphics.Windowed', v), + ) + antialias = property(lambda self: self._get('Graphics.AntiAliasAmount'), + lambda self, v: self._set('Graphics.AntiAliasAmount', v), + ) + anisotropic = property(lambda self: self._get('Graphics.AnisotropicLevel'), + lambda self, v: self._set('Graphics.AnisotropicLevel', v), + ) + texture = property(lambda self: self._get('Graphics.TextureQuality'), + lambda self, v: self._set('Graphics.TextureQuality', v), + ) + quality = property(lambda self: self._get('Quality.Level'), + lambda self, v: self._set('Quality.Level', v), + ) + shadow_enabled = property(lambda self: self._get('Graphics.Shadow.Enable'), + lambda self, v: self._set('Graphics.Shadow.Enable', v), + ) + # XXX: shadows + #shadow = property(lambda self: self._get('Graphics.Shadow.VisibleDistance'), + # lambda self, v: self._set('Graphics.Shadow.VisibleDistance', v), + # ) + vsync = property(lambda self: self._get('Graphics.EnableVSync'), + lambda self, v: self._set('Graphics.EnableVSync', v), + ) + Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-01-18 20:25:26 UTC (rev 48) @@ -33,7 +33,9 @@ from moul.qt.ui.mainwindow import Ui_MainWindow from moul.time.cavern import CavernTime +from moul.file.wdysini import AudioIni from moul.file.wdysini import GraphicsIni +from moul.file.wdysini import videoModes from moul.server.ping import ServerList from moul.server.ping import isSocketError from moul.log import getLogger @@ -96,22 +98,24 @@ def _graphics_init(self): """init graphics tab """ - self._graphicsini = GraphicsIni() - length = len(self._graphicsini._videomodes) - 1 + length = len(videoModes) - 1 self.slid_screenres.setMaximum(length) - #self.connect(self.slid_screenres, SIGNAL("valueChanged(int)"), - # self.on_slid_screenres_changed) - self.connect(self.slid_screenres, SIGNAL("sliderMoved(int)"), + self.connect(self.slid_screenres, SIGNAL("valueChanged(int)"), self.on_slid_screenres_changed) + def on_graphicsini_loaded(self, gini): + """SIGNAL: graphicsIniLoaded(file) + """ + self.slid_screenres.setValue(gini.screenres) + @signalLogDecorator(LOG) @pyqtSignature("int") def on_slid_screenres_changed(self, idx): """SIGNAL: valueChanged (int) """ - txt = self._graphicsini.getVidModeHuman(idx) + txt = videoModes.getVidModeHuman(idx) self.lb_screenres.setText(QtCore.QString(txt)) - + # ************************************************************************ # time zones Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-01-18 20:25:26 UTC (rev 48) @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'src\moul\qt\ui\mainwindow.ui' # -# Created: Thu Jan 18 16:28:04 2007 +# Created: Thu Jan 18 19:42:55 2007 # by: PyQt4 UI code generator 4.1.1 # # WARNING! All changes made in this file will be lost! @@ -65,12 +65,6 @@ self.pushButton.setObjectName("pushButton") self.hboxlayout.addWidget(self.pushButton) - self.buttonbox_rresavcl = QtGui.QDialogButtonBox(self.centralwidget) - self.buttonbox_rresavcl.setGeometry(QtCore.QRect(10,480,441,32)) - self.buttonbox_rresavcl.setOrientation(QtCore.Qt.Horizontal) - self.buttonbox_rresavcl.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Reset|QtGui.QDialogButtonBox.Save) - self.buttonbox_rresavcl.setObjectName("buttonbox_rresavcl") - self.tabWidget = QtGui.QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QtCore.QRect(5,100,450,375)) self.tabWidget.setTabPosition(QtGui.QTabWidget.North) @@ -667,6 +661,12 @@ self.label_6.setAlignment(QtCore.Qt.AlignCenter) self.label_6.setObjectName("label_6") self.tabWidget.addTab(self.tab_4,"") + + self.buttonbox_rresavcl = QtGui.QDialogButtonBox(self.centralwidget) + self.buttonbox_rresavcl.setGeometry(QtCore.QRect(10,480,441,32)) + self.buttonbox_rresavcl.setOrientation(QtCore.Qt.Horizontal) + self.buttonbox_rresavcl.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Reset|QtGui.QDialogButtonBox.Save) + self.buttonbox_rresavcl.setObjectName("buttonbox_rresavcl") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtGui.QStatusBar(MainWindow) Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-01-18 17:03:38 UTC (rev 47) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-01-18 20:25:26 UTC (rev 48) @@ -100,22 +100,6 @@ </item> </layout> </widget> - <widget class="QDialogButtonBox" name="buttonbox_rresavcl" > - <property name="geometry" > - <rect> - <x>10</x> - <y>480</y> - <width>441</width> - <height>32</height> - </rect> - </property> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons" > - <set>QDialogButtonBox::Close|QDialogButtonBox::NoButton|QDialogButtonBox::Reset|QDialogButtonBox::Save</set> - </property> - </widget> <widget class="QTabWidget" name="tabWidget" > <property name="geometry" > <rect> @@ -1408,6 +1392,22 @@ </widget> </widget> </widget> + <widget class="QDialogButtonBox" name="buttonbox_rresavcl" > + <property name="geometry" > + <rect> + <x>10</x> + <y>480</y> + <width>441</width> + <height>32</height> + </rect> + </property> + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons" > + <set>QDialogButtonBox::Close|QDialogButtonBox::NoButton|QDialogButtonBox::Reset|QDialogButtonBox::Save</set> + </property> + </widget> </widget> <widget class="QStatusBar" name="statusbar" /> </widget> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |