File indexing completed on 2024-03-24 04:04:37
0001 # -*- coding: utf-8 -*- 0002 0003 """ 0004 Authors of original libkmahjongg in C++: 0005 Copyright (C) 1997 Mathias Mueller <in5y158@public.uni-hamburg.de> 0006 Copyright (C) 2006 Mauricio Piacentini <mauricio@tabuleiro.com> 0007 0008 this adapted python code: 0009 Copyright (C) 2008-2016 Wolfgang Rohdewald <wolfgang@rohdewald.de> 0010 0011 SPDX-License-Identifier: GPL-2.0 0012 0013 """ 0014 0015 from qt import QSizeF, QSvgRenderer 0016 from log import logException, i18n 0017 from mjresource import Resource 0018 0019 from common import LIGHTSOURCES, Internal 0020 from wind import East, South, West, North 0021 0022 0023 class Tileset(Resource): 0024 0025 """represents a complete tileset""" 0026 # pylint: disable=too-many-instance-attributes 0027 0028 resourceName = 'tileset' 0029 configGroupName = 'KMahjonggTileset' 0030 cache = {} 0031 0032 def __init__(self, name): 0033 """continue __build""" 0034 super().__init__(name) 0035 self.tileSize = None 0036 self.faceSize = None 0037 self.__renderer = None 0038 self.__shadowOffsets = None 0039 self.darkenerAlpha = 120 if self.desktopFileName == 'jade' else 50 0040 0041 graphName = self.group.readEntry("FileName") 0042 self.graphicsPath = Tileset.locate(graphName) 0043 if not self.graphicsPath: 0044 logException( 0045 'cannot find kmahjongglib/tilesets/%s for %s' % 0046 (graphName, self.desktopFileName)) 0047 self.renderer() 0048 # now that we get the sizes from the svg, we need the 0049 # renderer right away 0050 0051 self.svgName = { 0052 'wn': North.svgName, 'ws': South.svgName, 'we': East.svgName, 'ww': West.svgName, 0053 'db': 'DRAGON_1', 'dg': 'DRAGON_2', 'dr': 'DRAGON_3'} 0054 for value in '123456789': 0055 self.svgName['s%s' % value] = 'ROD_%s' % value 0056 self.svgName['b%s' % value] = 'BAMBOO_%s' % value 0057 self.svgName['c%s' % value] = 'CHARACTER_%s' % value 0058 for idx, wind in enumerate('eswn'): 0059 self.svgName['f%s' % wind] = 'FLOWER_%d' % (idx + 1) 0060 self.svgName['y%s' % wind] = 'SEASON_%d' % (idx + 1) 0061 0062 def __str__(self): 0063 return "tileset id=%d name=%s, name id=%d" % \ 0064 (id(self), self.desktopFileName, id(self.desktopFileName)) 0065 0066 @staticmethod 0067 def current(): 0068 """the currently wanted tileset. If not yet defined, do so""" 0069 return Tileset(Internal.Preferences.tilesetName) 0070 0071 def shadowWidth(self): 0072 """the size of border plus shadow""" 0073 return self.tileSize.width() - self.faceSize.width() 0074 0075 def __initRenderer(self): 0076 """initialize and cache values""" 0077 self.__renderer = QSvgRenderer(self.graphicsPath) 0078 if not self.__renderer.isValid(): 0079 logException( 0080 i18n( 0081 'file <filename>%1</filename> contains no valid SVG'), 0082 self.graphicsPath) 0083 distance = 0 0084 if self.desktopFileName == 'classic': 0085 distance = 2 0086 distanceSize = QSizeF(distance, distance) 0087 self.faceSize = self.__renderer.boundsOnElement( 0088 'BAMBOO_1').size() + distanceSize 0089 self.tileSize = self.__renderer.boundsOnElement( 0090 'TILE_2').size() + distanceSize 0091 if not Internal.scaleScene: 0092 self.faceSize /= 2 0093 self.tileSize /= 2 0094 shW = self.shadowWidth() 0095 shH = self.shadowHeight() 0096 self.__shadowOffsets = [ 0097 [(-shW, 0), (0, 0), (0, shH), (-shH, shW)], 0098 [(0, 0), (shH, 0), (shW, shH), (0, shW)], 0099 [(0, -shH), (shH, -shW), (shW, 0), (0, 0)], 0100 [(-shW, -shH), (0, -shW), (0, 0), (-shH, 0)]] 0101 0102 def shadowHeight(self): 0103 """the size of border plus shadow""" 0104 if self.__renderer is None: 0105 self.__initRenderer() 0106 return self.tileSize.height() - self.faceSize.height() 0107 0108 def renderer(self): 0109 """initialise the svg renderer with the selected svg file""" 0110 if self.__renderer is None: 0111 self.__initRenderer() 0112 return self.__renderer 0113 0114 def shadowOffsets(self, lightSource, rotation): 0115 """real offset of the shadow on the screen""" 0116 if not Internal.Preferences.showShadows: 0117 return (0, 0) 0118 if self.__renderer is None: 0119 self.__initRenderer() 0120 lightSourceIndex = LIGHTSOURCES.index(lightSource) 0121 return self.__shadowOffsets[lightSourceIndex][rotation // 90] 0122 0123 def tileFaceRelation(self): 0124 """return how much bigger the tile is than the face""" 0125 if self.__renderer is None: 0126 self.__initRenderer() 0127 return (self.tileSize.width() / self.faceSize.width(), 0128 self.tileSize.height() / self.faceSize.height())