[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kajongg/sid] src: new: Context class Painter
From: Wolfgang Rohdewald <wolfgang () rohdewald ! de>
Date: 2013-10-31 21:21:06
Message-ID: E1Vbzfu-0002lj-3w () scm ! kde ! org
[Download RAW message or body]
Git commit 5cb251907a9cfbba541869e9b5e32a5dfd61ebe5 by Wolfgang Rohdewald.
Committed on 29/10/2013 at 21:48.
Pushed by wrohdewald into branch 'sid'.
new: Context class Painter
M +4 -4 src/board.py
M +5 -4 src/genericdelegates.py
M +14 -0 src/guiutil.py
M +9 -10 src/scoring.py
M +24 -26 src/uitile.py
http://commits.kde.org/kajongg/5cb251907a9cfbba541869e9b5e32a5dfd61ebe5
diff --git a/src/board.py b/src/board.py
index 8a43101..bf0349b 100644
--- a/src/board.py
+++ b/src/board.py
@@ -28,6 +28,7 @@ from PyQt4.QtSvg import QGraphicsSvgItem
from tileset import Tileset, TileException
from tile import chiNext, Tile, elements
from uitile import UITile, UIMeld
+from guiutil import Painter
from meld import Meld
from animation import Animation, Animated, animate
from message import Message
@@ -80,10 +81,9 @@ class PlayerWind(QGraphicsEllipseItem):
pwind.paint(painter, QStyleOptionGraphicsItem())
for child in pwind.childItems():
if isinstance(child, QGraphicsSvgItem):
- painter.save()
- painter.translate(child.mapToParent(0.0, 0.0))
- child.paint(painter, QStyleOptionGraphicsItem())
- painter.restore()
+ with Painter(painter):
+ painter.translate(child.mapToParent(0.0, 0.0))
+ child.paint(painter, QStyleOptionGraphicsItem())
WINDPIXMAPS[(wind, prevailing)] = pMap
def __sizeFace(self):
diff --git a/src/genericdelegates.py b/src/genericdelegates.py
index 686e527..7017203 100644
--- a/src/genericdelegates.py
+++ b/src/genericdelegates.py
@@ -15,6 +15,8 @@ from PyQt4.QtCore import Qt, QSize, QRect, QEvent
from PyQt4.QtGui import QStyledItemDelegate, QLabel, QTextDocument, QStyle, QPalette, \
QStyleOptionViewItemV4, QApplication
+from guiutil import Painter
+
class RichTextColumnDelegate(QStyledItemDelegate):
"""enables rich text in a view"""
label = QLabel()
@@ -35,10 +37,9 @@ class RichTextColumnDelegate(QStyledItemDelegate):
text = index.model().data(index, Qt.DisplayRole).toString()
self.label.setText(text)
self.label.setFixedSize(option.rect.size())
- painter.save()
- painter.translate(option.rect.topLeft())
- self.label.render(painter)
- painter.restore()
+ with Painter(painter):
+ painter.translate(option.rect.topLeft())
+ self.label.render(painter)
def sizeHint(self, option, index):
"""compute size for the final formatted richtext"""
diff --git a/src/guiutil.py b/src/guiutil.py
index 7f4e3a9..23d6828 100644
--- a/src/guiutil.py
+++ b/src/guiutil.py
@@ -105,3 +105,17 @@ def konfigGroup(path, groupName):
"""returns access to a group of config options"""
config = KConfig(path, KConfig.SimpleConfig)
return config, KConfigGroup(config.group(groupName))
+
+class Painter(object):
+ """a helper class for painting: saves/restores painter"""
+ def __init__(self, painter):
+ """painter is the painter to be saved/restored"""
+ self.painter = painter
+
+ def __enter__(self):
+ self.painter.save()
+ return self
+
+ def __exit__(self, exc_type, exc_value, trback):
+ """now check time passed"""
+ self.painter.restore()
diff --git a/src/scoring.py b/src/scoring.py
index aab0e00..46d9ca9 100644
--- a/src/scoring.py
+++ b/src/scoring.py
@@ -41,7 +41,7 @@ from util import m18n, m18nc
from common import WINDS, Internal, Debug
from statesaver import StateSaver
from query import Query
-from guiutil import ListComboBox
+from guiutil import ListComboBox, Painter
from tree import TreeItem, RootItem, TreeModel
from tile import Tile
@@ -142,15 +142,14 @@ class ScoreItemDelegate(QStyledItemDelegate):
for idx, playerItem in enumerate(index.parent().internalPointer().children):
chart = index.model().chart(option.rect, index, playerItem)
if chart:
- painter.save()
- painter.translate(option.rect.topLeft())
- painter.setPen(self.colors[idx])
- painter.setRenderHint(QPainter.Antialiasing)
- # if we want to use a pen width > 1, we can no longer directly drawPolyline
- # separately per cell beause the lines spread vertically over two rows: We would
- # have to draw the lines into one big pixmap and copy from the into the cells
- painter.drawPolyline(*chart) # pylint: disable=star-args
- painter.restore()
+ with Painter(painter):
+ painter.translate(option.rect.topLeft())
+ painter.setPen(self.colors[idx])
+ painter.setRenderHint(QPainter.Antialiasing)
+ # if we want to use a pen width > 1, we can no longer directly drawPolyline
+ # separately per cell beause the lines spread vertically over two rows: We would
+ # have to draw the lines into one big pixmap and copy from the into the cells
+ painter.drawPolyline(*chart) # pylint: disable=star-args
return
return QStyledItemDelegate.paint(self, painter, option, index)
diff --git a/src/uitile.py b/src/uitile.py
index 370341a..0212c9b 100644
--- a/src/uitile.py
+++ b/src/uitile.py
@@ -22,6 +22,7 @@ from PyQt4.QtCore import Qt, QString, QRectF, QPointF, QSizeF, QSize, pyqtProper
from PyQt4.QtGui import QGraphicsObject, QGraphicsItem, QPixmap, QPainter
from PyQt4.QtGui import QColor
from util import logException, stack, logDebug
+from guiutil import Painter
from common import LIGHTSOURCES, ZValues, Internal, Preferences, Debug, isAlive
from tile import Tile
@@ -153,37 +154,34 @@ class UITile(QGraphicsObject):
"""paint the entire tile.
I tried to cache a pixmap for the tile and darkener but without face,
but that actually made it slower."""
- painter.save()
- renderer = self.tileset.renderer()
- withBorders = self.showShadows
- if not withBorders:
- painter.scale(*self.tileset.tileFaceRelation())
- renderer.render(painter, self.__elementId(), self.boundingRect())
- self._drawDarkness(painter)
- painter.restore()
- painter.save()
- if self.showFace():
- if withBorders:
- faceSize = self.tileset.faceSize.toSize()
- renderer.render(painter, self.tileset.svgName[self.tile.lower()],
- QRectF(self.facePos(), QSizeF(faceSize)))
- else:
- renderer.render(painter, self.tileset.svgName[self.tile.lower()],
- self.boundingRect())
- painter.restore()
+ with Painter(painter):
+ renderer = self.tileset.renderer()
+ withBorders = self.showShadows
+ if not withBorders:
+ painter.scale(*self.tileset.tileFaceRelation())
+ renderer.render(painter, self.__elementId(), self.boundingRect())
+ self._drawDarkness(painter)
+ with Painter(painter):
+ if self.showFace():
+ if withBorders:
+ faceSize = self.tileset.faceSize.toSize()
+ renderer.render(painter, self.tileset.svgName[self.tile.lower()],
+ QRectF(self.facePos(), QSizeF(faceSize)))
+ else:
+ renderer.render(painter, self.tileset.svgName[self.tile.lower()],
+ self.boundingRect())
if self.cross:
self.__paintCross(painter)
def __paintCross(self, painter):
"""paint a cross on the tile"""
- painter.save()
- faceSize = self.tileset.faceSize
- width = faceSize.width()
- height = faceSize.height()
- painter.translate(self.facePos())
- painter.drawLine(QPointF(0.0, 0.0), QPointF(width, height))
- painter.drawLine(QPointF(width, 0.0), QPointF(0.0, height))
- painter.restore()
+ with Painter(painter):
+ faceSize = self.tileset.faceSize
+ width = faceSize.width()
+ height = faceSize.height()
+ painter.translate(self.facePos())
+ painter.drawLine(QPointF(0.0, 0.0), QPointF(width, height))
+ painter.drawLine(QPointF(width, 0.0), QPointF(0.0, height))
def pixmapFromSvg(self, pmapSize=None, withBorders=None):
"""returns a pixmap with default size as given in SVG and optional borders/shadows"""
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic