[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.
|