Files
cardvault/cv_gtk3/gtk_util.py
2018-02-18 16:14:14 +01:00

95 lines
3.2 KiB
Python

import re
import os
from gi.repository import GdkPixbuf
try:
from PIL import Image as PImage
except ImportError as err:
print('PIL imaging library is not installed')
from cv_engine.util import EngineConfig
class GTKUtilities:
""" Access to image caches and utilities for use in the GTK application """
# Loaded mana symbols Format: {'B': GDKPixbuf, '3': GDKPixbuf}
mana_icons = {}
# Cache for combined mana cost icons
precon_icon_cache = {}
@staticmethod
def load_icon_cache(path):
icons = {}
if not os.path.isdir(path):
os.mkdir(path)
files = os.listdir(path)
for file in files:
try:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(path, file))
# Strip filename extension
icon_name = os.path.splitext(file)[0]
icons[icon_name] = pixbuf
except Exception as ex:
print('Error while loading icon file "{}"'.format(ex))
return icons
@staticmethod
def get_mana_icons(mana_string):
""" Return the combined mana symbols for a mana string
:param mana_string: String in the format '{3}{U}{B}'
:return: GdkPixbuf containing the combined symbols
"""
if not mana_string:
return
icon_list = re.findall("{(.*?)}", mana_string.replace("/", "-"))
icon_name = "_".join(icon_list)
try:
icon = GTKUtilities.precon_icon_cache[icon_name]
except KeyError:
icon = GTKUtilities.create_mana_icons(mana_string)
GTKUtilities.precon_icon_cache[icon_name] = icon
# Scale icon for display
if icon:
icon = icon.scale_simple(icon.get_width() / 5, icon.get_height() / 5, GdkPixbuf.InterpType.HYPER)
return icon
@staticmethod
def create_mana_icons(mana_string):
# Convert the string to a List
glyphs = re.findall("{(.*?)}", mana_string)
if len(glyphs) == 0:
return
# Compute horizontal size for the final image
size = len(glyphs) * 105
image = PImage.new("RGBA", (size, 105))
for index, icon in enumerate(glyphs):
x_pos = index * 105
try:
# Try loading mana icon and converting to PIL.Image for combining
loaded = GTKUtilities.pixbuf_to_image(GTKUtilities.mana_icons[icon])
except KeyError:
print('Mana icon "{}" is not loaded.'.format(icon))
return
image.paste(loaded, (x_pos, 0))
# Save pre build icon file
path = os.path.join(EngineConfig.icon_cache_path, "_".join(glyphs) + ".png")
image.save(path)
try:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(path)
except Exception as err:
print(err)
return
return pixbuf
@staticmethod
def pixbuf_to_image(pix):
"""Convert gdkpixbuf to PIL image"""
data = pix.get_pixels()
w = pix.props.width
h = pix.props.height
stride = pix.props.rowstride
mode = "RGB"
if pix.props.has_alpha:
mode = "RGBA"
im = PImage.frombytes(mode, (w, h), data, "raw", mode, stride)
return im