From a1a70473705d2b324a75c32e8794bac0fb6712f6 Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Sat, 17 Aug 2024 21:29:44 +0800 Subject: [PATCH] make osdLayoutToolFingers configurable by settings menu --- Limelight/Database/DataManager.h | 5 +- Limelight/Database/DataManager.m | 4 +- Limelight/Database/TemporarySettings.h | 1 + Limelight/Database/TemporarySettings.m | 1 + .../Moonlight v1.10.xcdatamodel/contents | 1 + Limelight/Localization/Localizable.xcstrings | 8 +-- .../ViewControllers/SettingsViewController.m | 66 +++++++++++++++---- .../StreamFrameViewController.m | 2 +- 8 files changed, 66 insertions(+), 22 deletions(-) diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index 6278acaf..78bbbe66 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -20,8 +20,9 @@ audioConfig:(NSInteger)audioConfig onscreenControls:(NSInteger)onscreenControls keyboardToggleFingers:(NSInteger)keyboardToggleFingers - slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge - slideToSettingsDistance:(CGFloat)slideToSettingsDistance + oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers + slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge + slideToSettingsDistance:(CGFloat)slideToSettingsDistance pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor mousePointerVelocityFactor:(CGFloat)mousePointerVelocityFactor diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 8f5386ea..ae852178 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -59,7 +59,8 @@ audioConfig:(NSInteger)audioConfig onscreenControls:(NSInteger)onscreenControls keyboardToggleFingers:(NSInteger)keyboardToggleFingers - slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge + oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers + slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge slideToSettingsDistance:(CGFloat)slideToSettingsDistance pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor @@ -89,6 +90,7 @@ settingsToSave.audioConfig = [NSNumber numberWithInteger:audioConfig]; settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls]; settingsToSave.keyboardToggleFingers = [NSNumber numberWithInteger:(uint16_t)keyboardToggleFingers]; + settingsToSave.oscLayoutToolFingers = [NSNumber numberWithInteger:(uint16_t)oscLayoutToolFingers]; settingsToSave.slideToSettingsScreenEdge = [NSNumber numberWithInteger:(uint32_t)slideToSettingsScreenEdge]; settingsToSave.slideToSettingsDistance = [NSNumber numberWithFloat:slideToSettingsDistance]; settingsToSave.pointerVelocityModeDivider = [NSNumber numberWithFloat:pointerVelocityModeDivider]; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index 81642cf2..9d3f6d17 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -25,6 +25,7 @@ @property (nonatomic, retain) NSNumber * audioConfig; @property (nonatomic, retain) NSNumber * onscreenControls; @property (nonatomic, retain) NSNumber * keyboardToggleFingers; +@property (nonatomic, retain) NSNumber * oscLayoutToolFingers; @property (nonatomic, retain) NSNumber * slideToSettingsScreenEdge; @property (nonatomic, retain) NSNumber * slideToSettingsDistance; @property (nonatomic, retain) NSNumber * touchPointerVelocityFactor; diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index 56b32443..9588c34e 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -88,6 +88,7 @@ self.touchMode = settings.touchMode; self.statsOverlay = settings.statsOverlay; self.keyboardToggleFingers = settings.keyboardToggleFingers; + self.oscLayoutToolFingers = settings.oscLayoutToolFingers; self.slideToSettingsScreenEdge = settings.slideToSettingsScreenEdge; self.slideToSettingsDistance = settings.slideToSettingsDistance; self.liftStreamViewForKeyboard = settings.liftStreamViewForKeyboard; diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents index b7a4ba16..0ab0c38f 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents @@ -35,6 +35,7 @@ + diff --git a/Limelight/Localization/Localizable.xcstrings b/Limelight/Localization/Localizable.xcstrings index 754b6924..bc1828f2 100644 --- a/Limelight/Localization/Localizable.xcstrings +++ b/Limelight/Localization/Localizable.xcstrings @@ -2119,25 +2119,25 @@ } } }, - "Tap %d fingers to change on-screen controller layout in stream view" : { + "Tap %d fingers to change on-screen controller layout in stream view, or change the number of fingers required to:" : { "extractionState" : "manual", "localizations" : { "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局, 或将手势需要的手指数量改为:" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局, 或将手势需要的手指数量改为:" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局" + "value" : "在串流视图中轻按%d根手指修改虚拟手柄布局, 或将手势需要的手指数量改为:" } } } diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index e230a802..b3e6ddb4 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -20,6 +20,7 @@ NSInteger _bitrate; NSInteger _lastSelectedResolutionIndex; bool justEnteredSettingsViewDoNotOpenOscLayoutTool; + uint16_t oscLayoutFingers; } @dynamic overrideUserInterfaceStyle; @@ -180,6 +181,8 @@ BOOL isCustomResolution(CGSize res) { - (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; [self updateResolutionTable]; + //NSLog(@"osc tool fingers setting test: %d", currentSettings.oscLayoutToolFingers.intValue); + } - (void)deviceOrientationDidChange{ @@ -396,7 +399,8 @@ BOOL isCustomResolution(CGSize res) { [self.showKeyboardToolbarSelector setSelectedSegmentIndex:currentSettings.showKeyboardToolbar ? 1 : 0];// Load old setting // slide to menu settings - [self.slideToSettingsScreenEdgeSelector setSelectedSegmentIndex:[self getSelectorIndexFromScreenEdge:(uint32_t)currentSettings.slideToSettingsScreenEdge.integerValue]]; // Load old setting + [self.slideToSettingsScreenEdgeSelector setSelectedSegmentIndex:[self getSelectorIndexFromScreenEdge:(uint32_t)currentSettings.slideToSettingsScreenEdge.integerValue]]; + // Load old setting [self.cmdToolScreenEdgeSelector setEnabled:false]; [self.slideToSettingsScreenEdgeSelector addTarget:self action:@selector(slideToSettingsScreenEdgeChanged) forControlEvents:UIControlEventValueChanged]; [self slideToSettingsScreenEdgeChanged]; @@ -425,7 +429,9 @@ BOOL isCustomResolution(CGSize res) { [self mousePointerVelocityFactorSliderMoved]; - // this setting will be affected by onscreenControl & touchMode, must be loaded before them. + // these settings will be affected by onscreenControl & touchMode, must be loaded before them. + // NSLog(@"osc tool fingers setting test: %d", currentSettings.oscLayoutToolFingers.intValue); + self->oscLayoutFingers = (uint16_t)currentSettings.oscLayoutToolFingers.intValue; // load old setting of oscLayoutFingers [self.keyboardToggleFingerNumSlider setValue:(CGFloat)currentSettings.keyboardToggleFingers.intValue animated:YES]; // Load old setting. old setting was converted to uint16_t before saving. [self.keyboardToggleFingerNumSlider addTarget:self action:@selector(keyboardToggleFingerNumSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. [self keyboardToggleFingerNumSliderMoved]; @@ -480,24 +486,54 @@ BOOL isCustomResolution(CGSize res) { [self.touchModeLabel setText:labelText]; } - - (void)showCustomOSCTip { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[LocalizationHelper localizedStringForKey:@"Rebase in Stream View"] - message:[LocalizationHelper localizedStringForKey:@"Tap %d fingers to change on-screen controller layout in stream view", OSC_TOOL_FINGERS] + message:[LocalizationHelper localizedStringForKey:@"Tap %d fingers to change on-screen controller layout in stream view, or change the number of fingers required to:", self->oscLayoutFingers] preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction *okAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey: @"Got it!"] + + [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { + textField.placeholder = [LocalizationHelper localizedStringForKey:@"%d", self->oscLayoutFingers]; + textField.keyboardType = UIKeyboardTypeNumberPad; + }]; + + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey:@"Cancel"] + style:UIAlertActionStyleCancel + handler:nil]; + + UIAlertAction *okAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey:@"OK"] style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - // Continue execution after the alert is dismissed - if(!self->_mainFrameViewController.settingsExpandedInStreamView) [self invokeOscLayout]; //don't open osc layout tool immediately during streaming - NSLog(@"OK button tapped"); + UITextField *textField = alertController.textFields.firstObject; + NSString *inputText = textField.text; + NSInteger fingers = [inputText integerValue]; + if (inputText.length > 0 && fingers >= 4) { + self->oscLayoutFingers = (uint16_t) fingers; + NSLog(@"OK button tapped with %d fingers", (uint16_t)fingers); + } else { + NSLog(@"OK button tapped with no change"); + } + + // Continue execution after the alert is dismissed + if (!self->_mainFrameViewController.settingsExpandedInStreamView) { + [self invokeOscLayout]; // Don't open osc layout tool immediately during streaming + } + + [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap %d Fingers to Change OSC Layout in Stream View", self->oscLayoutFingers]]; //update the osc label + [self keyboardToggleFingerNumSliderMoved]; //update keyboard toggle number; }]; + + [alertController addAction:cancelAction]; [alertController addAction:okAction]; [self presentViewController:alertController animated:YES completion:nil]; } + + + + + - (void)onscreenControlChanged{ BOOL isIPhone = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone); @@ -518,7 +554,7 @@ BOOL isCustomResolution(CGSize res) { // [self.keyboardToggleFingerNumSlider setValue:3.0]; // [self keyboardToggleFingerNumSliderMoved]; [self keyboardToggleFingerNumSliderMoved]; // go to exclude 5 fingers - [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap %d Fingers to Change OSC Layout in Stream View", OSC_TOOL_FINGERS]]; + [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap %d Fingers to Change OSC Layout in Stream View", self->oscLayoutFingers]]; [self showCustomOSCTip]; justEnteredSettingsViewDoNotOpenOscLayoutTool = false; //if (self.layoutOnScreenControlsVC.isBeingPresented == NO) @@ -611,7 +647,7 @@ BOOL isCustomResolution(CGSize res) { if(customOscEnabled) { // [self.keyboardToggleFingerNumSlider setValue:3.0]; // [self.keyboardToggleFingerNumLabel setText:[LocalizationHelper localizedStringForKey:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)self.keyboardToggleFingerNumSlider.value]]; - [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap %d Fingers to Change OSC Layout in Stream View", OSC_TOOL_FINGERS]]; + [self.onscreenControllerLabel setText:[LocalizationHelper localizedStringForKey: @"Tap %d Fingers to Change OSC Layout in Stream View", self->oscLayoutFingers]]; [self keyboardToggleFingerNumSliderMoved]; // go exclude 5 fingers //if (self.layoutOnScreenControlsVC.isBeingPresented == NO) } @@ -814,9 +850,9 @@ BOOL isCustomResolution(CGSize res) { CGFloat sliderValue = self.keyboardToggleFingerNumSlider.value; if(customOscEnabled){ - // exclude OSC_TOOL_FINGERS when custom osc is enabled - if(sliderValue > OSC_TOOL_FINGERS - 1 && sliderValue < OSC_TOOL_FINGERS) [self.keyboardToggleFingerNumSlider setValue: OSC_TOOL_FINGERS - 1]; - if(sliderValue >= OSC_TOOL_FINGERS && sliderValue < OSC_TOOL_FINGERS + 1) [self.keyboardToggleFingerNumSlider setValue: OSC_TOOL_FINGERS + 1]; + // exclude self->oscLayoutFingers when custom osc is enabled + if(sliderValue > self->oscLayoutFingers - 1 && sliderValue < self->oscLayoutFingers) [self.keyboardToggleFingerNumSlider setValue: self->oscLayoutFingers - 1]; + if(sliderValue >= self->oscLayoutFingers && sliderValue < self->oscLayoutFingers + 1) [self.keyboardToggleFingerNumSlider setValue: self->oscLayoutFingers + 1]; } sliderValue = self.keyboardToggleFingerNumSlider.value; @@ -902,6 +938,7 @@ BOOL isCustomResolution(CGSize res) { NSInteger width = [self getChosenStreamWidth]; NSInteger onscreenControls = [self.onscreenControlSelector selectedSegmentIndex]; NSInteger keyboardToggleFingers = (uint16_t)self.keyboardToggleFingerNumSlider.value; + NSInteger oscLayoutToolFingers = (uint16_t)self->oscLayoutFingers; // NSLog(@"saveSettings keyboardToggleFingers %d", (uint16_t)keyboardToggleFingers); CGFloat slideToSettingsDistance = self.slideToMenuDistanceSlider.value; uint32_t slideToSettingsScreenEdge = [self getScreenEdgeFromSelector]; @@ -930,7 +967,8 @@ BOOL isCustomResolution(CGSize res) { audioConfig:2 // Stereo onscreenControls:onscreenControls keyboardToggleFingers:keyboardToggleFingers - slideToSettingsScreenEdge:slideToSettingsScreenEdge + oscLayoutToolFingers:oscLayoutToolFingers + slideToSettingsScreenEdge:slideToSettingsScreenEdge slideToSettingsDistance:slideToSettingsDistance pointerVelocityModeDivider:pointerVelocityModeDivider touchPointerVelocityFactor:touchPointerVelocityFactor diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 7891199f..e1c635c8 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -65,7 +65,7 @@ - (void)configOscLayoutTool{ if((_settings.touchMode.intValue == RELATIVE_TOUCH || _settings.touchMode.intValue == REGULAR_NATIVE_TOUCH) && _settings.onscreenControls.intValue == OnScreenControlsLevelCustom){ _oscLayoutTapRecoginizer = [[CustomTapGestureRecognizer alloc] initWithTarget:self action:@selector(layoutOSC)]; - _oscLayoutTapRecoginizer.numberOfTouchesRequired = OSC_TOOL_FINGERS; //tap a predefined number of fingers to open osc layout tool + _oscLayoutTapRecoginizer.numberOfTouchesRequired = _settings.oscLayoutToolFingers.intValue; //tap a predefined number of fingers to open osc layout tool _oscLayoutTapRecoginizer.tapDownTimeThreshold = 1; _oscLayoutTapRecoginizer.delaysTouchesBegan = NO; _oscLayoutTapRecoginizer.delaysTouchesEnded = NO;