summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asciifarm/client/display/display.py37
-rw-r--r--asciifarm/client/display/fieldpad.py24
-rw-r--r--asciifarm/client/display/healthpad.py16
-rw-r--r--asciifarm/client/display/infopad.py15
-rw-r--r--asciifarm/client/display/inventorypad.py20
-rw-r--r--asciifarm/client/display/messagepad.py15
-rw-r--r--asciifarm/client/display/textinput.py19
-rw-r--r--asciifarm/client/display/widget.py30
8 files changed, 93 insertions, 83 deletions
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