Path: blob/master/merger/MergerScreen/MergerScreen.py
628 views
import math1from pathlib import Path23import numpy as np45from core import imagelib6from core.interact import interact as io7from core.cv2ex import *8from core import osex91011class ScreenAssets(object):12waiting_icon_image = cv2_imread ( str(Path(__file__).parent / 'gfx' / 'sand_clock_64.png') )1314@staticmethod15def build_checkerboard_a( sh, size=5):16h,w = sh[0], sh[1]17tile = np.array([[0,1],[1,0]]).repeat(size, axis=0).repeat(size, axis=1)18grid = np.tile(tile,(int(math.ceil((h+0.0)/(2*size))),int(math.ceil((w+0.0)/(2*size)))))19return grid[:h,:w,None]2021class Screen(object):22def __init__(self, initial_scale_to_width=0, initial_scale_to_height=0, image=None, waiting_icon=False, **kwargs):23self.initial_scale_to_width = initial_scale_to_width24self.initial_scale_to_height = initial_scale_to_height25self.image = image26self.waiting_icon = waiting_icon2728self.state = -129self.scale = 130self.force_update = True31self.is_first_appear = True32self.show_checker_board = False3334self.last_screen_shape = (480,640,3)35self.checkerboard_image = None36self.set_image (image)37self.scrn_manager = None3839def set_waiting_icon(self, b):40self.waiting_icon = b4142def toggle_show_checker_board(self):43self.show_checker_board = not self.show_checker_board44self.force_update = True4546def get_image(self):47return self.image4849def set_image(self, img):50if not img is self.image:51self.force_update = True5253self.image = img5455if self.image is not None:56self.last_screen_shape = self.image.shape5758if self.initial_scale_to_width != 0:59if self.last_screen_shape[1] > self.initial_scale_to_width:60self.scale = self.initial_scale_to_width / self.last_screen_shape[1]61self.force_update = True62self.initial_scale_to_width = 06364elif self.initial_scale_to_height != 0:65if self.last_screen_shape[0] > self.initial_scale_to_height:66self.scale = self.initial_scale_to_height / self.last_screen_shape[0]67self.force_update = True68self.initial_scale_to_height = 0697071def diff_scale(self, diff):72self.scale = np.clip (self.scale + diff, 0.1, 4.0)73self.force_update = True7475def show(self, force=False):76new_state = 0 | self.waiting_icon7778if self.state != new_state or self.force_update or force:79self.state = new_state80self.force_update = False8182if self.image is None:83screen = np.zeros ( self.last_screen_shape, dtype=np.uint8 )84else:85screen = self.image.copy()8687if self.waiting_icon:88imagelib.overlay_alpha_image (screen, ScreenAssets.waiting_icon_image, (0,0) )8990h,w,c = screen.shape91if self.scale != 1.0:92screen = cv2.resize ( screen, ( int(w*self.scale), int(h*self.scale) ) )9394if c == 4:95if not self.show_checker_board:96screen = screen[...,0:3]97else:98if self.checkerboard_image is None or self.checkerboard_image.shape[0:2] != screen.shape[0:2]:99self.checkerboard_image = ScreenAssets.build_checkerboard_a(screen.shape)100101screen = screen[...,0:3]*0.75 + 64*self.checkerboard_image*(1- (screen[...,3:4].astype(np.float32)/255.0) )102screen = screen.astype(np.uint8)103104io.show_image(self.scrn_manager.wnd_name, screen)105106if self.is_first_appear:107self.is_first_appear = False108#center window109desktop_w, desktop_h = osex.get_screen_size()110h,w,c = screen.shape111cv2.moveWindow(self.scrn_manager.wnd_name, max(0,(desktop_w-w) // 2), max(0, (desktop_h-h) // 2) )112113io.process_messages(0.0001)114115class ScreenManager(object):116def __init__(self, window_name="ScreenManager", screens=None, capture_keys=False ):117self.screens = screens or []118self.current_screen_id = 0119120if self.screens is not None:121for screen in self.screens:122screen.scrn_manager = self123124self.wnd_name = window_name125io.named_window(self.wnd_name)126127128if capture_keys:129io.capture_keys(self.wnd_name)130131def finalize(self):132io.destroy_all_windows()133134def get_key_events(self):135return io.get_key_events(self.wnd_name)136137def switch_screens(self):138self.current_screen_id = (self.current_screen_id + 1) % len(self.screens)139self.screens[self.current_screen_id].show(force=True)140141def show_current(self):142self.screens[self.current_screen_id].show()143144def get_current(self):145return self.screens[self.current_screen_id]146147def set_current(self, screen):148self.current_screen_id = self.screens.index(screen)149150151