from pydantic import AfterValidator from typing_extensions import Annotated from settings.modules.BaseModule import BaseSettingsModule, BaseValidationModel from settings.constants import BACKGROUND_COLOR import PySimpleGUI as sg from settings.modules.CommonFieldValidators import try_convert_to_float from settings.modules.CommonFieldValidators import try_convert_to_int class MirrorTrackValidationModule(BaseValidationModel): gui_mirrortrack_enabled: bool gui_mirrortrack_select_right: bool gui_mirrortrack_cycle_count_inv: Annotated[int, AfterValidator(try_convert_to_int)] gui_mirrortrack_cycle_count_stare: Annotated[int, AfterValidator(try_convert_to_int)] gui_mirrortrack_minthresh: Annotated[float, AfterValidator(try_convert_to_float)] gui_mirrortrack_rotation_clamp: Annotated[float, AfterValidator(try_convert_to_float)] gui_mirrortrack_enable_inv: bool #gui_mirrortrack_smoothing_rate: Annotated[float, AfterValidator(try_convert_to_float)] class MirrorTrackSettingsModule(BaseSettingsModule): def __init__(self, config, widget_id, **kwargs): super().__init__(config=config, widget_id=widget_id, **kwargs) self.validation_model = MirrorTrackValidationModule self.gui_mirrortrack_enabled = f"-gui_mirrortrack_enabled{widget_id}-" self.gui_mirrortrack_select_right = f"-gui_mirrortrack_select_right{widget_id}-" self.gui_mirrortrack_cycle_count_inv =f"-gui_mirrortrack_cycle_count_inv{widget_id}-" self.gui_mirrortrack_cycle_count_stare =f"-gui_mirrortrack_cycle_count_stare{widget_id}-" self.gui_mirrortrack_minthresh =f"-gui_mirrortrack_minthresh{widget_id}-" self.gui_mirrortrack_rotation_clamp =f"-gui_mirrortrack_rotation_clamp{widget_id}-" self.gui_mirrortrack_enable_inv =f"-gui_mirrortrack_enable_inv{widget_id}-" #self.gui_mirrortrack_smoothing_rate =f"-gui_mirrortrack_smoothing_rate{widget_id}-" def get_layout(self): return [ [ sg.Text("MirrorTrack System:", background_color='#242224'), ], [ sg.Checkbox( "Enable:", default=self.config.gui_mirrortrack_enabled, key=self.gui_mirrortrack_enabled, background_color="#424042", tooltip="Enables MirrorTrack System", ), ], [ sg.Radio( "Use Left Eye", "mirrortrack_selectedeye", background_color="#424042", tooltip="Uses the left eye as the tracked eye.", ), sg.Radio( "Use Right Eye", "mirrortrack_selectedeye", default=self.config.gui_mirrortrack_select_right, key=self.gui_mirrortrack_select_right, background_color="#424042", tooltip="Uses the right eye as the tracked eye.", ) ], [ sg.Text("Inwards Look Threshold", background_color=BACKGROUND_COLOR,tooltip= "Sets the minimum distance of looking in that's required before state can chaned to cross-eyed." "\n Lower value will make cross-eye detection more sensitive." ), sg.InputText( self.config.gui_mirrortrack_minthresh, key=self.gui_mirrortrack_minthresh, size=(0, 10), ), ], [ sg.Text("Transition Cycle Count (Cross Eye)", background_color=BACKGROUND_COLOR,tooltip= "How long it takes to detect you are cross-eyed, or no longer cross-eyed." "\n Higher number means longer duration before changing in or out of being cross-eyed state." ), sg.InputText( self.config.gui_mirrortrack_cycle_count_inv, key=self.gui_mirrortrack_cycle_count_inv, size=(0, 10), ), ], [ sg.Text("Transition Cycle Count (Stare Forward)", background_color=BACKGROUND_COLOR,tooltip= "How long it takes to detect you are staring ahead, or no longer staring ahead." "\n Higher number means longer duration before changing in or out of being in stare ahead state." ), sg.InputText( self.config.gui_mirrortrack_cycle_count_stare, key=self.gui_mirrortrack_cycle_count_stare, size=(0, 10), ), ], #[ # sg.Text("Smoothing Decay Rate", background_color=BACKGROUND_COLOR,tooltip= # "How quickly eye smoothing decays when you enter or leave a cross-eyed state." # "\nHigher number = shorter smoothing duration." # ), # sg.InputText( # self.config.gui_mirrortrack_smoothing_rate, # key=self.gui_mirrortrack_smoothing_rate, # size=(0, 10), # ), #], [ sg.Checkbox( "Allow cross-eye:", default=self.config.gui_mirrortrack_enable_inv, key=self.gui_mirrortrack_enable_inv, background_color="#424042", tooltip="Enables cross-eye functionality", ), ], [ sg.Text("Maximum allowed cross-eye", background_color=BACKGROUND_COLOR,tooltip= "Defines the maximum inwards rotation that is output when cross-eyed." "\n0 = will only look straight ahead \n0.5 = will go a little bit cross-eyed \n1 = maximum hurr durr " ), sg.InputText( self.config.gui_mirrortrack_rotation_clamp, key=self.gui_mirrortrack_rotation_clamp, size=(0, 10), ), ], ]