EyeTrackVR/EyeTrackApp/settings/modules/MirrorTrackSettingsModule.py
Blabzillaweasel 705fe0243c Rename from SmartInversion to MirrorTrack, and inversion bug fixes!
Renamed all mentions of Smart Inversion to Mirror Track.
Also fixed the stare / inversion rapid cycling, yippee!
2025-02-15 15:48:26 +13:00

131 lines
6.2 KiB
Python

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),
),
],
]