Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Screen.COLOUR_WHITE: (win32console.FOREGROUND_RED |
win32console.FOREGROUND_GREEN |
win32console.FOREGROUND_BLUE)
}
# Background colour lookup table.
_BG_COLOURS = {
Screen.COLOUR_BLACK: 0,
Screen.COLOUR_RED: win32console.BACKGROUND_RED,
Screen.COLOUR_GREEN: win32console.BACKGROUND_GREEN,
Screen.COLOUR_YELLOW: (win32console.BACKGROUND_RED |
win32console.BACKGROUND_GREEN),
Screen.COLOUR_BLUE: win32console.BACKGROUND_BLUE,
Screen.COLOUR_MAGENTA: (win32console.BACKGROUND_RED |
win32console.BACKGROUND_BLUE),
Screen.COLOUR_CYAN: (win32console.BACKGROUND_BLUE |
win32console.BACKGROUND_GREEN),
Screen.COLOUR_WHITE: (win32console.BACKGROUND_RED |
win32console.BACKGROUND_GREEN |
win32console.BACKGROUND_BLUE)
}
# Attribute lookup table
_ATTRIBUTES = {
0: lambda x: x,
Screen.A_BOLD: lambda x: x | win32console.FOREGROUND_INTENSITY,
Screen.A_NORMAL: lambda x: x,
# Windows console uses a bitmap where background is the top nibble,
# so we can reverse by swapping nibbles.
Screen.A_REVERSE: lambda x: ((x & 15) * 16) + ((x & 240) // 16),
Screen.A_UNDERLINE: lambda x: x
}
def test_print(self):
"""
Check that the Print Effect works.
"""
# Check that print only redraws on specified rate.
screen = MagicMock(spec=Screen, colours=8, unicode_aware=False)
effect = Print(screen, StaticRenderer(images=["hello"]), 2, 1)
effect.reset()
effect.update(0)
screen.paint.assert_called_with(
"hello", 1, 2, 7,
attr=0,
bg=0,
colour_map=[(None, None, None) for _ in range(5)],
transparent=True)
screen.paint.reset_mock()
effect.update(1)
effect.update(2)
effect.update(3)
screen.paint.assert_not_called()
# Check there is no stop frame by default.
_256_PALETTE = {
"landuse": 193,
"water": 153,
"waterway": 153,
"marine_label": 12,
"admin": 7,
"country_label": 9,
"state_label": 1,
"place_label": 0,
"building": 252,
"road": 15,
"poi_label": 8
}
_16_PALETTE = {
"landuse": Screen.COLOUR_GREEN,
"water": Screen.COLOUR_BLUE,
"waterway": Screen.COLOUR_BLUE,
"marine_label": Screen.COLOUR_BLUE,
"admin": Screen.COLOUR_WHITE,
"country_label": Screen.COLOUR_RED,
"state_label": Screen.COLOUR_RED,
"place_label": Screen.COLOUR_YELLOW,
"building": Screen.COLOUR_WHITE,
"road": Screen.COLOUR_WHITE,
"poi_label": Screen.COLOUR_RED
}
def __init__(self, screen):
super(Map, self).__init__(screen)
# Current state of the map
self._screen = screen
self._zoom = 0
def _next_particle(self):
direction = uniform(0, 2 * pi)
d = self._life_time - 10
r = uniform(0, sin(pi * (d - self.time_left) / (d * 2))) * 3.0
return Particle("#",
self._x + sin(direction) * r * 2.0,
self._y + cos(direction) * r,
sin(direction) / 2.0,
cos(direction) / 4.0,
[
(Screen.COLOUR_BLACK, 0, 0),
(Screen.COLOUR_RED, 0, 0),
(Screen.COLOUR_RED, Screen.A_BOLD, 0),
(Screen.COLOUR_YELLOW, Screen.A_BOLD, 0),
(Screen.COLOUR_WHITE, Screen.A_BOLD, 0),
],
10,
self._burn,
next_colour=self._colour)
return
# hack to add themes until https://github.com/peterbrittain/asciimatics/issues/207 is implemented
THEMES["mpf_theme"] = defaultdict(
lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
{
"active_switch": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_GREEN),
"pf_active": (Screen.COLOUR_GREEN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"pf_inactive": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"label": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"title": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_RED),
"title_exit": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_RED),
"footer_cpu": (Screen.COLOUR_CYAN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_path": (Screen.COLOUR_YELLOW, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_memory": (Screen.COLOUR_GREEN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_mc_cpu": (Screen.COLOUR_MAGENTA, Screen.A_NORMAL, Screen.COLOUR_BLACK),
})
self.start_time = datetime.now()
self.machine = machine
self.mpf_process = Process()
self.ball_devices = list() # type: List[BallDevice]
self.switches = {}
self.machine.events.add_handler('init_phase_2', self._init)
# self.machine.events.add_handler('init_phase_3', self._init2)
self.machine.events.add_handler('loading_assets',
self._asset_load_change)
self.machine.events.add_handler('bcp_connection_attempt',
self._bcp_connection_attempt)
curses.KEY_F18: Screen.KEY_F18,
curses.KEY_F19: Screen.KEY_F19,
curses.KEY_F20: Screen.KEY_F20,
curses.KEY_F21: Screen.KEY_F21,
curses.KEY_F22: Screen.KEY_F22,
curses.KEY_F23: Screen.KEY_F23,
curses.KEY_F24: Screen.KEY_F24,
curses.KEY_PRINT: Screen.KEY_PRINT_SCREEN,
curses.KEY_IC: Screen.KEY_INSERT,
curses.KEY_DC: Screen.KEY_DELETE,
curses.KEY_HOME: Screen.KEY_HOME,
curses.KEY_END: Screen.KEY_END,
curses.KEY_LEFT: Screen.KEY_LEFT,
curses.KEY_UP: Screen.KEY_UP,
curses.KEY_RIGHT: Screen.KEY_RIGHT,
curses.KEY_DOWN: Screen.KEY_DOWN,
curses.KEY_PPAGE: Screen.KEY_PAGE_UP,
curses.KEY_NPAGE: Screen.KEY_PAGE_DOWN,
curses.KEY_BACKSPACE: Screen.KEY_BACK,
9: Screen.KEY_TAB,
curses.KEY_BTAB: Screen.KEY_BACK_TAB
# Terminals translate keypad keys, so no need for a special
# mapping here.
# Terminals don't transmit meta keys (like control, shift, etc), so
# there's no translation for them either.
}
def __init__(self, win, height=None, catch_interrupt=False,
unicode_aware=False):
"""
:param win: The window object as returned by the curses wrapper method.
elif event.key_code == Screen.KEY_UP:
# Move on to previous widget, unless it is the first in the
# Layout.
wid = self._live_widget
self._columns[self._live_col][self._live_widget].blur()
self._find_next_widget(-1, stay_in_col=True)
self._columns[self._live_col][self._live_widget].focus()
# Don't swallow the event if it had no effect.
event = event if wid == self._live_widget else None
elif event.key_code == Screen.KEY_LEFT:
# Move on to last widget in the previous column
self._columns[self._live_col][self._live_widget].blur()
self._find_next_widget(-1, start_at=0, wrap=True)
self._columns[self._live_col][self._live_widget].focus()
event = None
elif event.key_code == Screen.KEY_RIGHT:
# Move on to first widget in the next column.
self._columns[self._live_col][self._live_widget].blur()
self._find_next_widget(
1,
start_at=len(self._columns[self._live_col]),
wrap=True)
self._columns[self._live_col][self._live_widget].focus()
event = None
elif isinstance(event, MouseEvent):
logger.debug("Check layout: %d, %d", event.x, event.y)
if ((hover_focus and event.buttons >= 0) or
event.buttons > 0):
# Mouse click - look to move focus.
for i, column in enumerate(self._columns):
for j, widget in enumerate(column):
if widget.is_mouse_over(event):
self._column = 0
elif event.key_code == Screen.KEY_BACK:
if self._column > 0:
# Delete character in front of cursor.
self._value[self._line] = "".join([
self._value[self._line][:self._column - 1],
self._value[self._line][self._column:]])
self._column -= 1
else:
if self._line > 0:
# Join this line with previous
self._line -= 1
self._column = len(self._value[self._line])
self._value[self._line] += \
self._value.pop(self._line + 1)
elif event.key_code == Screen.KEY_DELETE:
if self._column < len(self._value[self._line]):
self._value[self._line] = "".join([
self._value[self._line][:self._column],
self._value[self._line][self._column + 1:]])
else:
if self._line < len(self._value) - 1:
# Join this line with next
self._value[self._line] += \
self._value.pop(self._line + 1)
elif event.key_code == Screen.KEY_UP:
# Move up one line in text
self._line = max(0, self._line - 1)
if self._column >= len(self._value[self._line]):
self._column = len(self._value[self._line])
elif event.key_code == Screen.KEY_DOWN:
# Move down one line in text
def __init__(self, machine: "MachineController") -> None:
"""Initialize TextUi."""
super().__init__(machine)
self.delay = DelayManager(machine)
self.config = machine.config.get('text_ui', {})
self.screen = None
if not machine.options['text_ui']:
return
# hack to add themes until https://github.com/peterbrittain/asciimatics/issues/207 is implemented
THEMES["mpf_theme"] = defaultdict(
lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
{
"active_switch": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_GREEN),
"pf_active": (Screen.COLOUR_GREEN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"pf_inactive": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"label": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"title": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_RED),
"title_exit": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_RED),
"footer_cpu": (Screen.COLOUR_CYAN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_path": (Screen.COLOUR_YELLOW, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_memory": (Screen.COLOUR_GREEN, Screen.A_NORMAL, Screen.COLOUR_BLACK),
"footer_mc_cpu": (Screen.COLOUR_MAGENTA, Screen.A_NORMAL, Screen.COLOUR_BLACK),
})
self.start_time = datetime.now()
self.machine = machine
self.mpf_process = Process()
self.ball_devices = list() # type: List[BallDevice]