class App: def __init__(self, name, menubar, idle_icon_path=ICON_UNKNOWN, open_icon_path=None, function=None, is_folder=False): self.name = name # Name of app self.menubar = menubar # The parent menubar self.function = function if is_folder: self.function = self.toggle_is_open idle_icon_path = ICON_FOLDER open_icon_path = ICON_FOLDER_OPEN self.idle_rect = pygame.Rect(0, 0, APP_DIMENSION, APP_DIMENSION) self.selected_rect = pygame.Rect(0, 0, APP_DIMENSION + UI_PADDING, APP_DIMENSION + UI_PADDING) self.rect = self.idle_rect self.idle_icon = pygame.transform.scale( pygame.image.load(idle_icon_path), self.idle_rect.size) self.selected_icon = pygame.transform.scale(self.idle_icon, self.selected_rect.size) self.open_icon = pygame.transform.scale( pygame.image.load(idle_icon_path if open_icon_path == None else open_icon_path), self.idle_rect.size) self.open_selected_icon = pygame.transform.scale( self.open_icon, self.selected_rect.size) self.icon = self.idle_icon self.sub_apps = [] self.sub_app_menubar = MenuBar( self.menubar.screen, self.menubar.font, self.menubar.rect[1] + APP_MENUBAR_OFFSET) self.is_selected = False self.is_open = False self.resize() def update(self, mouse_data, key_data): if mouse_data[0] and self.is_selected: self.run() self.is_selected = False else: self.is_selected = in_bounds(self.rect) self.icon = (self.open_selected_icon if self.is_open else self.selected_icon) if self.is_selected else ( self.open_icon if self.is_open else self.idle_icon) self.rect = self.selected_rect if self.is_selected else self.idle_rect if self.is_open: self.sub_app_menubar.update(mouse_data, key_data) for sub_app in self.sub_apps: sub_app.update(mouse_data, key_data) def draw(self, screen): screen.blit(self.icon, self.rect) if self.is_open: self.sub_app_menubar.draw() for sub_app in self.sub_apps: sub_app.draw(screen) def set_pos(self, pos): self.idle_rect = pygame.Rect(pos, (APP_DIMENSION, APP_DIMENSION)) self.selected_rect = pygame.Rect(pos[0] - (UI_PADDING / 2.0), pos[1] - (UI_PADDING / 2.0), APP_SELECTED_DIMENSION, APP_SELECTED_DIMENSION) self.rect = self.idle_rect self.resize() def run(self): if self.function != None: self.function() self.is_selected = False def resize(self): self.sub_app_menubar.resize() def toggle_is_open(self): self.is_open = not self.is_open def add_app(self, app): self.sub_app_menubar.add_app(app)
def main(): ''' The main method :o ''' global PI_CLIENT global PI_CLIENT_CONNECTED global IS_RUNNING joysticks = [ pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count()) ] PRINT('Found ' + ENC_VALUE(len(joysticks)) + ' joysticks.', INFO) # Initialize detected joysticks if len(joysticks) > 0: for joystick in joysticks: joystick.init() PRINT( '| ' + ENC_VALUE(joystick.get_id()) + ' ' + ENC_VALUE(joystick.get_name()), INFO) screen = pygame.display.set_mode(SCREEN_DIMENSION, pygame.RESIZABLE) screen.set_alpha(None) pygame.display.set_caption('LoggerheadROV Driver Station | ' + random.choice(QUOTES)) pygame.display.set_icon( pygame.image.load('gui/images/loggerhead_logo.png')) clock = pygame.time.Clock() horizon = Horizon( screen.get_size()[0] - GAUGE_DIMENSION - UI_SCREEN_PADDING - UI_BORDER, screen.get_size()[1] - GAUGE_DIMENSION - UI_SCREEN_PADDING - UI_BORDER) menubar = MenuBar(screen, FONT) menubar.add_app(App("Do Thing", menubar)) menubar.add_app(App("Do Other Thing", menubar)) folder = App("Image Recognition", menubar, is_folder=True) folder.add_app(App("More Things", folder.sub_app_menubar)) menubar.add_app(folder) # Create thread for the connection handler loop connection_handler = Thread(target=connection_listener, args=(joysticks, )) connection_handler.start() while IS_RUNNING: mouse_data = [False] * len(pygame.mouse.get_pressed()) key_data = [False] * len(pygame.key.get_pressed()) for event in pygame.event.get(): if event.type == pygame.QUIT: shutdown() if event.type == pygame.VIDEORESIZE: screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE) horizon = Horizon( screen.get_size()[0] - GAUGE_DIMENSION - UI_SCREEN_PADDING - UI_BORDER, screen.get_size()[1] - GAUGE_DIMENSION - UI_SCREEN_PADDING - UI_BORDER) menubar.resize() if event.type == pygame.KEYDOWN: key_data = pygame.key.get_pressed() if event.type == pygame.MOUSEBUTTONDOWN: mouse_data = pygame.mouse.get_pressed() mouse_pos = pygame.mouse.get_pos() screen.fill(UI_COLOR_4) if PI_CLIENT_CONNECTED: try: # Get the video frame from the client and decode it frame = cv2.imdecode(PI_CLIENT.recv_data[DATA_IDX_VIDEO], cv2.IMREAD_COLOR) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame = np.rot90(frame) frame = cv2.flip(frame, 1) frame = pygame.surfarray.make_surface(frame) frame = pygame.transform.scale(frame, screen.get_size()) screen.blit(frame, (0, 0)) # cv2.imshow('frame', frame) except: pass menubar.update(mouse_data, key_data) # horizon.update(screen, mouse_pos[0] - (screen.get_size()[0] / 2), mouse_pos[1] - (screen.get_size()[1] / 2)) # Draws gauge too menubar.draw() draw_text(screen, FONT, str(round(clock.get_fps(), 3)) + ' FPS', (screen.get_size()[0] - (UI_SCREEN_PADDING * 8), UI_SCREEN_PADDING), False) pygame.display.update() clock.tick(FPS) cv2.destroyAllWindows() connection_handler.join() PRINT('Quit.', SUCCESS)