From b63f38d654814d6be7a56ee7c8c6c6567755e0b4 Mon Sep 17 00:00:00 2001 From: troido Date: Sat, 30 Dec 2017 01:35:41 +0100 Subject: tried a new approach to remove code duplication in display --- asciifarm/client/display/display.py | 37 +++++++++++++------------------- asciifarm/client/display/fieldpad.py | 24 ++++++++++----------- asciifarm/client/display/healthpad.py | 16 ++++++-------- asciifarm/client/display/infopad.py | 15 ++++++------- asciifarm/client/display/inventorypad.py | 20 +++++++---------- asciifarm/client/display/messagepad.py | 15 ++++++------- asciifarm/client/display/textinput.py | 19 ++++++++-------- asciifarm/client/display/widget.py | 30 ++++++++++++++++++++++++++ 8 files changed, 93 insertions(+), 83 deletions(-) create mode 100644 asciifarm/client/display/widget.py (limited to 'asciifarm') diff --git a/asciifarm/client/display/display.py b/asciifarm/client/display/display.py index a3ee602..79991af 100644 --- a/asciifarm/client/display/display.py +++ b/asciifarm/client/display/display.py @@ -9,6 +9,7 @@ from .screen import Screen from .colours import Colours from .messagepad import MessagePad from .textinput import TextInput +from .widget import Widget SIDEWIDTH = 20 @@ -26,8 +27,14 @@ class Display: self.defaultChar = charMap.get("default", "?") self.screen = Screen(self, stdscr) - def setwin(pad, winname): - pad.setWin(self.screen.getWin(winname)) + self.widgets = {} + + def setwin(pad, widgetName, winname=None): + if not winname: + winname = widgetName + widget = Widget(pad) + self.widgets[widgetName] = widget + widget.setWin(self.screen.getWin(winname)) self.fieldPad = FieldPad((1, 1), charMap.get("charwidth", 1), self.colours) setwin(self.fieldPad, "field") @@ -49,22 +56,15 @@ class Display: self.lastinfostring = None - - self.widgets = { - "field": self.fieldPad, - "info": self.infoPad, - "health": self.healthPad, - "inventory": self.inventoryPad, - "ground": self.groundPad, - "msg": self.messagePad, - "textinput": self.textInput - } #self.changed = False self.update() def getWidget(self, name): - return self.widgets.get(name, None) + if name in self.widgets: + return self.widgets[name].getImpl() + else: + return None def resizeField(self, size): self.fieldPad.resize(*size) @@ -125,15 +125,8 @@ class Display: def update(self, force=False): #if not self.changed and not force: #return - - self.fieldPad.update(force) - self.messagePad.update(force) - self.healthPad.update(force) - self.groundPad.update(force) - self.inventoryPad.update(force) - self.infoPad.update(force) - - self.textInput.update(force) + for widget in self.widgets.values(): + widget.update(force) self.screen.update() diff --git a/asciifarm/client/display/fieldpad.py b/asciifarm/client/display/fieldpad.py index a7c5c45..bb15a0e 100644 --- a/asciifarm/client/display/fieldpad.py +++ b/asciifarm/client/display/fieldpad.py @@ -12,27 +12,30 @@ class FieldPad: self.center = (0, 0) self.colours = colours self.changed = False - self.win = None + self.widget = None - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def resize(self, width, height): self.size = (width, height) self.pad.resize(height+1, width*self.charSize) - if self.win: - self.win.erase() - self.win.noutrefresh() + self.widget.change() + win = self.widget.getWin() + if win: + win.erase() + win.noutrefresh() def changeCell(self, x, y, char, colour=None, bgcolour=0): if colour != None and self.colours: self.pad.addstr(y, x*self.charSize, char, self.colours.get(colour, bgcolour)) else: self.pad.addstr(y, x*self.charSize, char) - self.changed = True + self.widget.change() def setCenter(self, pos): self.center = pos + self.widget.change() def getWidth(self): return self.size[0]*self.charSize @@ -43,10 +46,8 @@ class FieldPad: def _roundWidth(self, x): return x // self.charSize * self.charSize - def update(self, force): - if not self.changed and not force or not self.win: - return - win = self.win + def update(self): + win = self.widget.getWin() height, width = win.getmaxyx() y, x = win.getparyx() xmax = x + width @@ -60,4 +61,3 @@ class FieldPad: x + max(0, (width - self.getWidth()) // 2), ymax, xmax) - self.changed = False diff --git a/asciifarm/client/display/healthpad.py b/asciifarm/client/display/healthpad.py index 968ed1c..559906d 100644 --- a/asciifarm/client/display/healthpad.py +++ b/asciifarm/client/display/healthpad.py @@ -10,22 +10,18 @@ class HealthPad: self.colours = colours self.health = 0 self.maxHealth = 0 - self.win = None + self.widget = None - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def setHealth(self, health, maxHealth): self.health = health self.maxHealth = maxHealth - - self.changed = True + self.widget.change() - def update(self, force): - if not self.changed and not force or not self.win: - return - win = self.win - self.changed = False + def update(self): + win = self.widget.getWin() height, width = win.getmaxyx() width -= 1 barEnd = round(self.health/self.maxHealth * width) if self.maxHealth > 0 else 0 diff --git a/asciifarm/client/display/infopad.py b/asciifarm/client/display/infopad.py index b630013..dc543bf 100644 --- a/asciifarm/client/display/infopad.py +++ b/asciifarm/client/display/infopad.py @@ -10,23 +10,20 @@ class InfoPad: def __init__(self): self.changed = False self.lines = [] - self.win = None + self.widget = None - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def showString(self, string): self.lines = string.split('\n') - self.changed = True + self.widget.change() - def update(self, force): - if not self.changed and not force or not self.win: - return - win = self.win + def update(self): + win = self.widget.getWin() height, width = win.getmaxyx() lines = [line[:width-1] for line in self.lines][:height] text = '\n'.join(lines) win.erase() win.addstr(0, 0, text) - self.changed = False win.noutrefresh() diff --git a/asciifarm/client/display/inventorypad.py b/asciifarm/client/display/inventorypad.py index c8bb497..0ee9ca0 100644 --- a/asciifarm/client/display/inventorypad.py +++ b/asciifarm/client/display/inventorypad.py @@ -7,31 +7,27 @@ class InventoryPad: def __init__(self, title): self.title = title self.selector = Selector(self) - self.setInventory([]) - self.changed = False - self.win = None + self.widget = None + self.items = [] - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def getSelector(self): return self.selector def change(self): - self.changed = True + self.widget.change() def setInventory(self, items): self.items = items - self.changed = True + self.widget.change() def getNumItems(self): return len(self.items) - def update(self, force): - if not self.changed and not force or not self.win: - return - win = self.win - self.changed = False + def update(self): + win = self.widget.getWin() height, width = win.getmaxyx() win.erase() win.addstr(0,0, (self.title + ":")[:width]) diff --git a/asciifarm/client/display/messagepad.py b/asciifarm/client/display/messagepad.py index d5de5a9..c9eaf85 100644 --- a/asciifarm/client/display/messagepad.py +++ b/asciifarm/client/display/messagepad.py @@ -7,19 +7,17 @@ class MessagePad(): def __init__(self): self.changed = False self.messages = [] - self.win = None + self.widget = None - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def addMessage(self, message): self.messages.append(message) - self.changed = True + self.widget.change() - def update(self, force): - if not self.changed and not force or not self.win: - return - win = self.win + def update(self): + win = self.widget.getWin() height, width = win.getmaxyx() if height < 1: return @@ -30,5 +28,4 @@ class MessagePad(): lines = lines[len(lines)-height:] win.erase() win.addstr(0,0,'\n'.join(lines)) - self.changed = False win.noutrefresh() diff --git a/asciifarm/client/display/textinput.py b/asciifarm/client/display/textinput.py index ca5f4af..6af5a78 100644 --- a/asciifarm/client/display/textinput.py +++ b/asciifarm/client/display/textinput.py @@ -5,25 +5,26 @@ class TextInput: def __init__(self): self.reading = False - self.win = None + self.widget = None - def setWin(self, win): - self.win = win + def setWidget(self, widget): + self.widget = widget def getString(self): - if not self.win: + win = self.widget.getWin() + if not win: return None self.reading = True curses.echo() curses.nocbreak() - self.win.addstr(0, 0, ">") - string = self.win.getstr(0,2) + win.addstr(0, 0, ">") + string = win.getstr(0,2) curses.noecho() curses.cbreak() self.reading = False - self.win.erase() - self.win.noutrefresh() + win.erase() + win.noutrefresh() return string - def update(self, force=False): + def update(self): pass diff --git a/asciifarm/client/display/widget.py b/asciifarm/client/display/widget.py new file mode 100644 index 0000000..ef28d50 --- /dev/null +++ b/asciifarm/client/display/widget.py @@ -0,0 +1,30 @@ + + + +class Widget: + + + def __init__(self, impl): + self.impl = impl + self.impl.setWidget(self) + + self.win = None + self.changed = False + + def setWin(self, win): + self.win = win + + def getWin(self): + return self.win + + def getImpl(self): + return self.impl + + def change(self): + self.changed = True + + def update(self, force=False): + if not (force or self.changed) or not self.win: + return + self.impl.update() + self.changed = False -- cgit