[Pymoul-svn] SF.net SVN: pymoul: [173] pymoul/trunk/src/moul/qt
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-02-15 18:18:46
|
Revision: 173
http://pymoul.svn.sourceforge.net/pymoul/?rev=173&view=rev
Author: tiran
Date: 2007-02-15 10:18:46 -0800 (Thu, 15 Feb 2007)
Log Message:
-----------
Added Dni number stuff for Qt
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
Added Paths:
-----------
pymoul/trunk/src/moul/qt/dninumbers.py
Added: pymoul/trunk/src/moul/qt/dninumbers.py
===================================================================
--- pymoul/trunk/src/moul/qt/dninumbers.py (rev 0)
+++ pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-15 18:18:46 UTC (rev 173)
@@ -0,0 +1,180 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+"""Moul QT D'ni Number renderer
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id: wdysini.py 144 2007-02-06 03:51:21Z tiran $"
+__revision__ = "$Revision: 144 $"
+
+import sys
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+from PyQt4.QtCore import Qt
+from PyQt4.QtCore import SIGNAL
+from PyQt4.QtCore import pyqtSignature
+
+from moul.qt.utils import QNamespaceContainer
+from moul.qt.utils import QSignalLoggerMetaclass
+from moul.qt.utils import questionMB
+from moul.qt.utils import criticalMB
+
+
+class QDniNumbers(object):
+ """Qt D'ni Number helper class
+
+ Lookup and scale pixmaps for D'ni numbers
+ """
+ def __init__(self):
+ self.pixmaps = {}
+ for i in range(0, 26):
+ self.pixmaps[i] = QtGui.QPixmap(
+ ":/dninumbers/resources/dninumbers/%02i.png" % i)
+ self.pixmaps['cyclic'] = QtGui.QPixmap(
+ ":/dninumbers/resources/dninumbers/00c.png")
+ # w, h = 67, 55
+ self._rectleft = QtCore.QRect(0, 0, 60, 55) # with right border
+ self._rectright = QtCore.QRect(12, 0, 55, 55) # w/o left border
+ self._rectmiddle = QtCore.QRect(12, 0, 49, 55) # right line
+
+ @staticmethod
+ def _scale(pixmap, height=None):
+ """Scale a pixmap to height
+ """
+ if height is not None:
+ return pixmap.scaledToHeight(height, QtCore.Qt.SmoothTransformation)
+ else:
+ return pixmap
+
+ def get(self, nr, height=None):
+ """Get pixmap by number and scale it
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ try:
+ nr = int(nr)
+ except ValueError:
+ pass
+ pixmap = self.pixmaps[nr]
+ return self._scale(pixmap, height)
+
+ def getLeft(self, nr, height=None):
+ """Get pixmap for left digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectleft)
+ return self._scale(pixmap, height)
+
+ def getRight(self, nr, height=None):
+ """Get pixmap for right digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectright)
+ return self._scale(pixmap, height)
+
+ def getMiddle(self, nr, heigh=None):
+ """Get pixmap for middle digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectmiddle)
+ return self._scale(pixmap, height)
+
+class QDniNumberWidget(QtGui.QWidget):
+ """Q D'ni number widget
+
+ Displays combined number
+ """
+ def __init__(self, parent):
+ QtGui.QWidget.__init__(self, parent)
+ self.dni = None
+ self.height = None
+ self.numbers = ()
+
+ def setDniNumbers(self, dninumbers):
+ """Set D'ni number instance
+ """
+ if not isinstance(dninumbers, QDniNumbers):
+ raise TypeError(type(dninumbers))
+ self.dni = dninumbers
+
+ def setHeight(self, height=None):
+ """Set height to scale
+ """
+ self.height=height
+
+ def setNumbers(self, *args):
+ """Set numbers to display
+ """
+ valid = tuple(range(0, 26)) + ('cyclic',)
+ for number in args:
+ if not isinstance(number, int):
+ raise TypeError(number)
+ if number not in valid:
+ raise ValueError(number)
+ self.numbers = args
+ self._pmleft = self.dni.getLeft(self.numbers[0], height=self.height)
+ self._pmright = self.dni.getRight(self.numbers[-1], height=self.height)
+ self._pmmiddle = [self.dni.getMiddle(nr, height=self.height)
+ for nr in self.numbers[1:-1]]
+ if self._pmmiddle:
+ raise NotImplementedError
+ else:
+ middlewidth = 0
+ self.width = self._pmleft.width() + self._pmright.width() + middlewidth
+ self.setMinimumSize(self.width, self.height)
+ self.setMaximumSize(self.width, self.height)
+ self.resize(self.width, self.height)
+
+ def paintEvent(self, event):
+ """Render and paint numbers
+ """
+ painter = QtGui.QPainter()
+ painter.begin(self)
+ #rect = painter.viewport()
+ #size = QtCore.QSize(width, height)
+ #size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
+ #painter.setViewport(0, 0, size.width(), size.height())
+ #painter.setWindow(self.parent().rect())
+
+ # left
+ painter.drawPixmap(0, 0, self._pmleft)
+ painter.drawPixmap(self.width-self._pmright.width(), 0, self._pmright)
+ painter.end()
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 18:18:46 UTC (rev 173)
@@ -52,6 +52,8 @@
from moul.qt.threadlet import Threadlet
from moul.qt.ui.mainwindow import Ui_MainWindow
from moul.qt import utils as qtutils
+from moul.qt.dninumbers import QDniNumbers
+from moul.qt.dninumbers import QDniNumberWidget
LOG = getLogger('moul.qt')
@@ -505,6 +507,8 @@
LOG.error("Ping thread is already running")
def _dninumbers_init(self):
+ self._dninumbers = QDniNumbers()
+ height = 25
widget = self.gridLayout_3
grid = self.gridlayout3
alignl = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter
@@ -516,9 +520,7 @@
nr.setAlignment(alignc)
nr.setText(str(i + j*5))
grid.addWidget(nr, j, i*2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5))
- #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get(i + j*5, height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j))
dni.setPixmap(dni_pic)
@@ -530,8 +532,7 @@
nr.setAlignment(alignc)
nr.setText("25")
grid.addWidget(nr, 5, 2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get(25, height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_25")
dni.setAlignment(alignl)
@@ -541,16 +542,22 @@
nr = QtGui.QLabel(widget)
nr.setObjectName("lb_dninumber_nr_00c")
nr.setAlignment(alignc)
- nr.setText("cyclic 0")
+ nr.setText(self.trUtf8("cyclic 0"))
grid.addWidget(nr, 5, 5, 1, 2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get("cyclic", height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_00c")
dni.setAlignment(alignl)
dni.setPixmap(dni_pic)
grid.addWidget(dni, 5, 7)
+ dnipix = QDniNumberWidget(widget)
+ dnipix.setDniNumbers(self._dninumbers)
+ dnipix.setHeight(25)
+ dnipix.setNumbers(5, 24)
+ dnipix.setObjectName("dnw_dninumber_test")
+ grid.addWidget(dnipix, 5, 8, 1, 2)
+
class PingServerThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|