[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