From 2397f225381bafeb87262fef4979ee9eae516717 Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 22 Sep 2020 13:13:29 +0200 Subject: refactored CharMap out of Display --- asciifarmclient/charmap.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++ asciifarmclient/display.py | 32 +++++------------------------ asciifarmclient/loaders.py | 35 +++++++++++--------------------- 3 files changed, 67 insertions(+), 50 deletions(-) create mode 100644 asciifarmclient/charmap.py diff --git a/asciifarmclient/charmap.py b/asciifarmclient/charmap.py new file mode 100644 index 0000000..43ae006 --- /dev/null +++ b/asciifarmclient/charmap.py @@ -0,0 +1,50 @@ + + +from .utils import get +from ratuil.textstyle import TextStyle + +ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + +def parseSprite(sprite): + if isinstance(sprite, str): + return (sprite, None, None) + char = get(sprite, 0, " ") + fg = get(sprite, 1) + bg = get(sprite, 2) + return (char, fg, bg) + +class CharMap: + + def __init__(self): + self.mapping = {} + self.default = ("?", None, None) + self.message_styles = {} + self.default_message_style = TextStyle() + self.character_width = 1 + self.alphabet = ALPHABET + + def get(self, spritename): + return self.mapping.get(spritename, self.default) + + def get_message_style(self, msgtype): + return self.message_styles.get(msgtype, self.default_message_style) + + def apply_json(self, jsonmap): + for name, sprite in jsonmap.get("mapping", {}).items(): + vals = parseSprite(sprite) + self.mapping[name] = vals + + self.alphabet = jsonmap.get("alphabet", self.alphabet) + + for name, colours in jsonmap.get("writable", {}).items(): + fg = get(colours, 0) + bg = get(colours, 1) + for (letter, character) in zip(ALPHABET, self.alphabet): + self.mapping[name + '-' + letter] = (character, fg, bg) + + if "default" in jsonmap: + self.default = parseSprite(jsonmap["default"]) + for name, colour in jsonmap.get("msgcolours", {}).items(): + self.message_styles[name] = TextStyle(*colour) + self.character_width = jsonmap.get("charwidth", self.character_width) + diff --git a/asciifarmclient/display.py b/asciifarmclient/display.py index 53e9cf3..3928f99 100644 --- a/asciifarmclient/display.py +++ b/asciifarmclient/display.py @@ -6,7 +6,6 @@ from ratuil.layout import Layout from ratuil.bufferedscreen import BufferedScreen as Screen #from ratuil.screen import Screen from ratuil.textstyle import TextStyle -from .utils import get from .listselector import ListSelector @@ -16,35 +15,14 @@ ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ab class Display: - def __init__(self, charMap, ratuil_args={}): + def __init__(self, charmap, ratuil_args={}): - self.characters = {} - def parseSprite(sprite): - if isinstance(sprite, str): - return (sprite, None, None) - char = get(sprite, 0, " ") - fg = get(sprite, 1) - bg = get(sprite, 2) - return (char, fg, bg) - for name, sprite in charMap["mapping"].items(): - vals = parseSprite(sprite) - if vals: - self.characters[name] = vals - - for name, colours in charMap.get("writable", {}).items(): - fg = get(colours, 0) - bg = get(colours, 1) - for i in range(min(len(ALPHABET), len(charMap.get("alphabet", [])))): - self.characters[name + '-' + ALPHABET[i]] = (charMap["alphabet"][i], fg, bg) - - self.defaultChar = parseSprite(charMap.get("default", "?")) - - self.messageColours = charMap.get("msgcolours", {}) + self.charmap = charmap fname = os.path.join(os.path.dirname(__file__), "layout.xml") self.layout = Layout.from_xml_file(fname) - self.layout.get("field").set_char_size(charMap.get("charwidth", 1)) + self.layout.get("field").set_char_size(self.charmap.character_width) self.screen = Screen(**ratuil_args) self.screen.clear() @@ -140,7 +118,7 @@ class Display: def addMessage(self, message, msgtype=None): if msgtype is not None: - style = TextStyle(*self.messageColours.get(msgtype, (7,0))) + style = self.charmap.get_message_style(msgtype) else: style = None self.getWidget("msg").add_message(message, style) @@ -160,7 +138,7 @@ class Display: def getChar(self, sprite): """This returns the character belonging to some spritename. This does not read a character""" - return self.characters.get(sprite, self.defaultChar) + return self.charmap.get(sprite) def update_size(self): self.screen.reset() diff --git a/asciifarmclient/loaders.py b/asciifarmclient/loaders.py index efdd1c0..790f71a 100644 --- a/asciifarmclient/loaders.py +++ b/asciifarmclient/loaders.py @@ -2,6 +2,7 @@ import os from .paths import keybindingsPath, charmapPath +from .charmap import CharMap import json @@ -40,7 +41,8 @@ standardCharFiles = {name: os.path.join(charmapPath, file) for name, file in { "emoji": "emoji.json" }.items()} -def loadCharmap(name): +def loadCharmapJson(name): + fname = None if name in standardCharFiles: fname = standardCharFiles[name] @@ -53,29 +55,16 @@ def loadCharmap(name): for ftemplate in data.get("templates", []): if ftemplate.partition(os.sep)[0] in {".", ".."}: ftemplate = os.path.relpath(ftemplate, fname) - templates.append(loadCharmap(ftemplate)) + templates.extend(loadCharmapJson(ftemplate)) templates.append(data) + return templates + +def loadCharmap(name): - mapping = {} - writable = {} - default = None - charwidth = 1 - alphabet = "" - msgcolours = {} - + templates = loadCharmapJson(name) + charmap = CharMap() for template in templates: - mapping.update(template.get("mapping", {})) - writable.update(template.get("writable", {})) - default = template.get("default", default) - charwidth = template.get("charwidth", charwidth) - alphabet = template.get("alphabet", alphabet) - msgcolours.update(template.get("msgcolours", {})) - return { - "mapping": mapping, - "writable": writable, - "default": default, - "charwidth": charwidth, - "alphabet": alphabet, - "msgcolours": msgcolours - } + charmap.apply_json(template) + + return charmap -- cgit