diff --git a/EyeTrackApp/camera_widget.py b/EyeTrackApp/camera_widget.py index 6a46f76..4a75f90 100644 --- a/EyeTrackApp/camera_widget.py +++ b/EyeTrackApp/camera_widget.py @@ -117,18 +117,18 @@ class CameraWidget: self.roi_layout = [ [ - sg.Button( - "Mark Out", - key=self.gui_mask_markup, - button_color="#6f4ca1", - tooltip="Mark out stuff that is not your eye.", - ), - sg.Button( - "Lighten", - key=self.gui_mask_lighten, - button_color="#6f4ca1", - tooltip="Lighten shadowed areas.", - ), + # sg.Button( + # "Mark Out", + # key=self.gui_mask_markup, + # button_color="#6f4ca1", + # tooltip="Mark out stuff that is not your eye.", + # ), + # sg.Button( + # "Lighten", + # key=self.gui_mask_lighten, + # button_color="#6f4ca1", + # tooltip="Lighten shadowed areas.", + # ), sg.Checkbox( "Camera Widget Padding", default=self.config.gui_rotation_ui_padding, @@ -497,23 +497,23 @@ class CameraWidget: window[self.gui_tracking_fps].update(self._movavg_fps(self.camera.fps)) window[self.gui_tracking_bps].update(self._movavg_bps(self.camera.bps)) - if event == self.gui_mask_lighten: - while True: - try: - maybe_image = self.roi_queue.get(block=False) - imgbytes = cv2.imencode(".ppm", maybe_image[0])[1].tobytes() - image = cv2.imdecode( - np.frombuffer(imgbytes, np.uint8), cv2.IMREAD_COLOR - ) + # if event == self.gui_mask_lighten: + # while True: + # try: + # maybe_image = self.roi_queue.get(block=False) + # imgbytes = cv2.imencode(".ppm", maybe_image[0])[1].tobytes() + # image = cv2.imdecode( + # np.frombuffer(imgbytes, np.uint8), cv2.IMREAD_COLOR + # ) - cv2.imshow("Image", image) - cv2.waitKey(1) - cv2.destroyAllWindows() - print("lighen") - except Empty: - pass - if event == self.gui_mask_markup: - print("markup") + # cv2.imshow("Image", image) + # cv2.waitKey(1) + # cv2.destroyAllWindows() + # print("lighen") + #except Empty: + # pass + # if event == self.gui_mask_markup: + # print("markup") if self.in_roi_mode: try: @@ -686,6 +686,8 @@ class CameraWidget: pass else: + def back(*args): + pass try: window[self.gui_roi_message].update(visible=False) window[self.gui_output_graph].update(visible=False) diff --git a/EyeTrackApp/eyetrackapp.py b/EyeTrackApp/eyetrackapp.py index 0a17a59..50fb9f3 100644 --- a/EyeTrackApp/eyetrackapp.py +++ b/EyeTrackApp/eyetrackapp.py @@ -38,6 +38,9 @@ from settings.algo_settings_widget import AlgoSettingsWidget from osc.osc import OSCManager from osc.OSCMessage import OSCMessage from utils.misc_utils import is_nt, resource_path +import time +import cv2 +import numpy as np if is_nt: from winotify import Notification @@ -258,136 +261,165 @@ def main(): background_color="#292929", ) - # GUI Render loop while True: - # First off, check for any events from the GUI - event, values = window.read(timeout=1) # this higher timeout saves some cpu usage + print('main loop') + if config.settings.gui_disable_gui: + timeout = 10 #TODO: test this on windows, on mac im not seeing a negitive side effect + layout = [[sg.Button("Enable GUI")]] - # If we're in either mode and someone hits q, quit immediately - if event == "Exit" or event == sg.WIN_CLOSED: - for eye in eyes: - eye.stop() - cancellation_event.set() - osc_manager.shutdown() - print("\033[94m[INFO] Exiting EyeTrackApp\033[0m") - os._exit(0) # I do not like this, but for now this fixes app hang on close - return + # Create the window + window = sg.Window("Simple Button", layout) - if values[RIGHT_EYE_RADIO_NAME] and config.eye_display_id != EyeId.RIGHT: - config.settings.gui_disable_gui = False - eyes[0].start() - eyes[1].stop() - settings[0].stop() - settings[1].stop() - settings[2].stop() - window[RIGHT_EYE_NAME].update(visible=True) - window[LEFT_EYE_NAME].update(visible=False) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.RIGHT - config.settings.tracker_single_eye = 2 - config.save() + # Event loop to process events and get the values of the inputs + while True: + event, values = window.read() - elif values[LEFT_EYE_RADIO_NAME] and config.eye_display_id != EyeId.LEFT: - config.settings.gui_disable_gui = False - settings[0].stop() - settings[1].stop() - settings[2].stop() - eyes[0].stop() - eyes[1].start() - window[RIGHT_EYE_NAME].update(visible=False) - window[LEFT_EYE_NAME].update(visible=True) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.LEFT - config.settings.tracker_single_eye = 1 - config.save() + # If user closes window or clicks the button, break the loop + if event == sg.WINDOW_CLOSED: + break + elif event == "Enable GUI": + print("Button clicked!") + config.settings.gui_disable_gui = False + config.save() + break - elif values[BOTH_EYE_RADIO_NAME] and config.eye_display_id != EyeId.BOTH: - config.settings.gui_disable_gui = False - settings[0].stop() - settings[1].stop() - settings[2].stop() - eyes[1].start() - eyes[0].start() - window[LEFT_EYE_NAME].update(visible=True) - window[RIGHT_EYE_NAME].update(visible=True) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.BOTH - config.settings.tracker_single_eye = 0 - config.save() - - elif values[SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.SETTINGS: - config.settings.gui_disable_gui = False - eyes[0].stop() - eyes[1].stop() - settings[1].stop() - settings[0].start() - settings[2].stop() - window[RIGHT_EYE_NAME].update(visible=False) - window[LEFT_EYE_NAME].update(visible=False) - window[SETTINGS_NAME].update(visible=True) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.SETTINGS - config.save() - - elif values[ALGO_SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.ALGOSETTINGS: - config.settings.gui_disable_gui = False - eyes[0].stop() - eyes[1].stop() - settings[0].stop() - settings[1].start() - settings[2].stop() - window[RIGHT_EYE_NAME].update(visible=False) - window[LEFT_EYE_NAME].update(visible=False) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=True) - config.eye_display_id = EyeId.ALGOSETTINGS - config.save() - - elif values[VRCFT_MODULE_SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.VRCFTMODULESETTINGS: - config.settings.gui_disable_gui = False - eyes[0].stop() - eyes[1].stop() - settings[0].stop() - settings[1].stop() - settings[2].start() - window[RIGHT_EYE_NAME].update(visible=False) - window[LEFT_EYE_NAME].update(visible=False) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=True) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.VRCFTMODULESETTINGS - config.save() - elif values[GUIOFF_RADIO_NAME] and config.eye_display_id != EyeId.GUIOFF: - config.settings.gui_disable_gui = True - # eyes[0].stop() - # eyes[1].stop() - settings[0].stop() - settings[1].stop() - settings[2].stop() - window[RIGHT_EYE_NAME].update(visible=False) - window[LEFT_EYE_NAME].update(visible=False) - window[SETTINGS_NAME].update(visible=False) - window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) - window[ALGO_SETTINGS_NAME].update(visible=False) - config.eye_display_id = EyeId.GUIOFF - config.save() + # Close the window + window.close() else: - # Otherwise, render all - for eye in eyes: - if eye.started(): - eye.render(window, event, values) - for setting in settings: - if setting.started(): - setting.render(window, event, values) + timeout = 1 + # GUI Render loop + while True: + + # First off, check for any events from the GUI + event, values = window.read(timeout=timeout) # this higher timeout saves some cpu usage + + # If we're in either mode and someone hits q, quit immediately + if event == "Exit" or event == sg.WIN_CLOSED: + for eye in eyes: + eye.stop() + cancellation_event.set() + osc_manager.shutdown() + print("\033[94m[INFO] Exiting EyeTrackApp\033[0m") + os._exit(0) # I do not like this, but for now this fixes app hang on close + return + + if values[RIGHT_EYE_RADIO_NAME] and config.eye_display_id != EyeId.RIGHT: + config.settings.gui_disable_gui = False + eyes[0].start() + eyes[1].stop() + settings[0].stop() + settings[1].stop() + settings[2].stop() + window[RIGHT_EYE_NAME].update(visible=True) + window[LEFT_EYE_NAME].update(visible=False) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.RIGHT + config.settings.tracker_single_eye = 2 + config.save() + + elif values[LEFT_EYE_RADIO_NAME] and config.eye_display_id != EyeId.LEFT: + config.settings.gui_disable_gui = False + settings[0].stop() + settings[1].stop() + settings[2].stop() + eyes[0].stop() + eyes[1].start() + window[RIGHT_EYE_NAME].update(visible=False) + window[LEFT_EYE_NAME].update(visible=True) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.LEFT + config.settings.tracker_single_eye = 1 + config.save() + + elif values[BOTH_EYE_RADIO_NAME] and config.eye_display_id != EyeId.BOTH: + config.settings.gui_disable_gui = False + settings[0].stop() + settings[1].stop() + settings[2].stop() + eyes[1].start() + eyes[0].start() + window[LEFT_EYE_NAME].update(visible=True) + window[RIGHT_EYE_NAME].update(visible=True) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.BOTH + config.settings.tracker_single_eye = 0 + config.save() + + elif values[SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.SETTINGS: + config.settings.gui_disable_gui = False + eyes[0].stop() + eyes[1].stop() + settings[1].stop() + settings[0].start() + settings[2].stop() + window[RIGHT_EYE_NAME].update(visible=False) + window[LEFT_EYE_NAME].update(visible=False) + window[SETTINGS_NAME].update(visible=True) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.SETTINGS + config.save() + + elif values[ALGO_SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.ALGOSETTINGS: + config.settings.gui_disable_gui = False + eyes[0].stop() + eyes[1].stop() + settings[0].stop() + settings[1].start() + settings[2].stop() + window[RIGHT_EYE_NAME].update(visible=False) + window[LEFT_EYE_NAME].update(visible=False) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=True) + config.eye_display_id = EyeId.ALGOSETTINGS + config.save() + + elif values[VRCFT_MODULE_SETTINGS_RADIO_NAME] and config.eye_display_id != EyeId.VRCFTMODULESETTINGS: + config.settings.gui_disable_gui = False + eyes[0].stop() + eyes[1].stop() + settings[0].stop() + settings[1].stop() + settings[2].start() + window[RIGHT_EYE_NAME].update(visible=False) + window[LEFT_EYE_NAME].update(visible=False) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=True) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.VRCFTMODULESETTINGS + config.save() + elif values[GUIOFF_RADIO_NAME] and config.eye_display_id != EyeId.GUIOFF: + config.settings.gui_disable_gui = True + # eyes[0].stop() + # eyes[1].stop() + settings[0].stop() + settings[1].stop() + settings[2].stop() + window[RIGHT_EYE_NAME].update(visible=False) + window[LEFT_EYE_NAME].update(visible=False) + window[SETTINGS_NAME].update(visible=False) + window[VRCFT_MODULE_SETTINGS_NAME].update(visible=False) + window[ALGO_SETTINGS_NAME].update(visible=False) + config.eye_display_id = EyeId.GUIOFF + config.save() + break + + else: + # Otherwise, render all + for eye in eyes: + if eye.started(): + eye.render(window, event, values) + for setting in settings: + if setting.started(): + setting.render(window, event, values) if __name__ == "__main__":