#!/usr/bin/env python3
|
|
# encoding: utf-8
|
|
|
|
import math
|
|
import os
|
|
import pygame
|
|
import random
|
|
import re
|
|
import sys
|
|
|
|
class RasPipe:
|
|
size = width, height = 320, 240
|
|
# size = width, height = 480, 320
|
|
|
|
font_size = 48
|
|
delay = 70
|
|
input_buffer_size = 100
|
|
input_lines = []
|
|
display_lines = 7
|
|
|
|
def __init__(self, infile):
|
|
self.infile = infile
|
|
pygame.init()
|
|
exit
|
|
self.screen = pygame.display.set_mode(self.size)
|
|
self.font = pygame.font.Font(None, self.font_size)
|
|
|
|
self.bgcolor = pygame.Color(0, 0, 0)
|
|
self.fgcolor = pygame.Color(255, 255, 255)
|
|
|
|
# A little bit of sound.
|
|
pygame.mixer.init()
|
|
self.click = pygame.mixer.Sound('./tick.wav')
|
|
|
|
def run(self):
|
|
tick = 0
|
|
|
|
self.click.play()
|
|
|
|
line = self.infile.readline()
|
|
while line:
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
sys.exit()
|
|
|
|
tick = tick + 1
|
|
|
|
self.scale_display()
|
|
|
|
self.screen.fill(self.bgcolor)
|
|
|
|
# Get last display_lines of input...
|
|
to_render = self.input_lines[-self.display_lines:]
|
|
|
|
# ...and scroll them up the display:
|
|
y = 0
|
|
for render_line in to_render:
|
|
y += self.font_size
|
|
text_surface = self.font.render(render_line.rstrip(), True, self.fgcolor)
|
|
# TODO: allow centering text
|
|
# rect = text_surface.get_rect(center=((self.width / 2), y))
|
|
rect = text_surface.get_rect(left=2, top=y)
|
|
self.screen.blit(text_surface, rect)
|
|
|
|
# A progress bar of sorts
|
|
progress = (self.width / 100) * (len(self.input_lines) / 10)
|
|
self.screen.fill(self.fgcolor, [0, 0, progress, self.font_size])
|
|
|
|
if tick % self.display_lines == 0:
|
|
self.click.play()
|
|
# self.bgcolor.r = random.randrange(0, 255)
|
|
# self.bgcolor.g = random.randrange(0, 255)
|
|
# self.bgcolor.b = random.randrange(0, 255)
|
|
# self.bgcolor.a = random.randrange(0, 255)
|
|
|
|
pygame.display.flip()
|
|
|
|
pygame.time.wait(self.delay);
|
|
|
|
self.input_lines.append(line)
|
|
line = self.infile.readline()
|
|
|
|
def scale_display(self):
|
|
"""Set the current font size and delay based on amount of input"""
|
|
original_font_size = self.font_size
|
|
|
|
# How big should our font be, and how fast should text scroll?
|
|
if len(self.input_lines) > 150:
|
|
self.font_size = 18
|
|
self.delay = 5
|
|
elif len(self.input_lines) > 60:
|
|
self.font_size = 20
|
|
self.delay = 10
|
|
elif len(self.input_lines) > 30:
|
|
self.font_size = 24
|
|
self.delay = 20
|
|
|
|
if self.font_size != original_font_size:
|
|
self.font = pygame.font.Font(None, self.font_size)
|
|
|
|
# How many lines of text to display?
|
|
self.display_lines = int(self.size[1] / self.font_size) - 1
|
|
|
|
if __name__ == '__main__':
|
|
rp = RasPipe(sys.stdin)
|
|
rp.run()
|