- def setup_widgets(self):
- """Return container widget with all widgets we want on our screen.
-
- Sets up an urwid.Pile inside a returned urwid.Filler; top to bottom:
- - an EditToSocketWidget, prefixing self.socket input with 'SEND: '
- - a 50-col wide urwid.Padding container for self.map_widget, which is
- to print clipped map representations
- - self.reply_widget, a urwid.Text widget printing self.socket replies
- """
- edit_widget = self.EditToSocketWidget(self.socket, 'SEND: ')
- self.map_widget = self.MapWidget('', wrap='clip')
- self.turn_widget = self.TurnWidget('')
- self.reply_widget = self.LogWidget('')
- map_box = urwid.Padding(self.map_widget, width=50)
- widget_pile = urwid.Pile([edit_widget, map_box, self.turn_widget,
- self.reply_widget])
- return urwid.Filler(widget_pile, valign='top')
-
- class EditToSocketWidget(urwid.Edit):
- """Extends urwid.Edit with socket to send input on 'enter' to."""
-
- def __init__(self, socket, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.socket = socket
-
- def keypress(self, size, key):
- """Extend super(): on Enter, send .edit_text, and empty it."""
- if key != 'enter':
- return super().keypress(size, key)
- plom_socket_io.send(self.socket, self.edit_text)
- self.edit_text = ''
-
- class TurnWidget(urwid.Text):
- """Displays turn number."""
-
- def set_turn(self, turn_string):
- turn_string = turn_string.strip()
- if not turn_string.isdigit():
- raise ArgumentError('Argument must be non-negative integer.')
- self.set_text('TURN: ' + turn_string)
-
- class LogWidget(urwid.Text):
- """Displays client log, newest message on top."""
-
- def add(self, text):
- """Add text plus newline to (top of) log."""
- self.set_text(text + '\n' + self.text)
-
- class MapWidget(urwid.Text):
- """Stores/updates/draws game map."""
- map_size = (5, 5)
- terrain_map = ' ' * 25
- position = (0, 0)
- things = []
-
- class Thing:
- def __init__(self, position, symbol):
- self.position = position
- self.symbol = symbol
-
- def draw_map(self):
- """Draw map view from .map_size, .terrain_map, .position."""
- whole_map = []
- for c in self.terrain_map:
- whole_map += [c]
- for t in self.things:
- pos_i = t.position[0] * (self.map_size[1] + 1) + t.position[1]
- whole_map[pos_i] = t.symbol
- self.set_text(''.join(whole_map))
-
- def get_yx(self, yx_string):