File indexing completed on 2024-04-28 07:51:12

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())