summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asciifarmclient/charmap.py50
-rw-r--r--asciifarmclient/display.py32
-rw-r--r--asciifarmclient/loaders.py35
3 files changed, 67 insertions, 50 deletions
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