[splash] Add the obligatory splash screen on startup
Also fix a bunch of asyncio nonsense going on.master
parent
a4dea8dcdd
commit
0709fb00e2
@ -0,0 +1,86 @@
|
||||
# Copyright (c) 2014-2017 esotericnonsense (Daniel Edgecumbe)
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or https://opensource.org/licenses/mit-license.php
|
||||
|
||||
import curses
|
||||
import asyncio
|
||||
|
||||
from macros import MIN_WINDOW_SIZE
|
||||
|
||||
import time
|
||||
|
||||
splash_array = [
|
||||
" BB BB BB ",
|
||||
" BB BB BB BBBB BBBB BB BB BB BB ",
|
||||
" BBBBB BBBB BB BB BB BBB BB BBBBB ",
|
||||
" BB BB BB BB BB BB BB BB BB BB BB BB ",
|
||||
" BBB BB BB BB BB BB BB BB BB BB BB BB ",
|
||||
" BB BBB BB BB BBBB BBBB BB BB BB BBBB ",
|
||||
" ",
|
||||
" ---------------------------",
|
||||
" n c u r s e s ",
|
||||
" ---------------------------",
|
||||
]
|
||||
width = len(splash_array[0])
|
||||
height = len(splash_array)
|
||||
|
||||
class SplashView(object):
|
||||
def __init__(self, set_mode_callback):
|
||||
self._set_mode_callback = set_mode_callback # ModeHandler
|
||||
|
||||
self._pad = None
|
||||
|
||||
self._window_size = MIN_WINDOW_SIZE
|
||||
|
||||
async def draw(self, nosplash):
|
||||
if nosplash:
|
||||
await self._end_splash(nosplash)
|
||||
return
|
||||
|
||||
if self._pad is not None:
|
||||
self._pad.clear()
|
||||
else:
|
||||
self._pad = curses.newpad(20, 100)
|
||||
|
||||
CGREEN = curses.color_pair(1)
|
||||
CRED = curses.color_pair(3)
|
||||
CBOLD = curses.A_BOLD
|
||||
CREVERSE = curses.A_REVERSE
|
||||
|
||||
for x in range(len(splash_array[0])):
|
||||
for y in range(len(splash_array)):
|
||||
if splash_array[y][x] == "B":
|
||||
if y < 7:
|
||||
self._pad.addstr(y+1, x, " ", CGREEN + CREVERSE)
|
||||
else:
|
||||
self._pad.addstr(y+1, x, " ", CRED + CREVERSE)
|
||||
elif splash_array[y][x] != " ":
|
||||
self._pad.addstr(y+1, x, splash_array[y][x], CRED + CBOLD)
|
||||
y += 1
|
||||
await self._draw_pad_to_screen()
|
||||
time.sleep(0.01)
|
||||
|
||||
await asyncio.sleep(0.5)
|
||||
time.sleep(0.5)
|
||||
await self._end_splash(nosplash)
|
||||
|
||||
async def _end_splash(self, nosplash):
|
||||
if not nosplash:
|
||||
self._pad.clear()
|
||||
await self._draw_pad_to_screen()
|
||||
|
||||
await self._set_mode_callback("monitor")
|
||||
|
||||
async def _draw_pad_to_screen(self):
|
||||
maxy, maxx = self._window_size
|
||||
if maxy < height+1 or maxx < width+1:
|
||||
return # Can't do it
|
||||
|
||||
t = (maxy-height)//2
|
||||
l = (maxx-width)//2
|
||||
self._pad.refresh(0, 0, t, l, t+height, l+width)
|
||||
|
||||
async def on_window_resize(self, y, x):
|
||||
# This should prevent the splash from crashing
|
||||
# if there's a resize during the draw operations.
|
||||
self._window_size = (y, x)
|
Loading…
Reference in New Issue