diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard index 912240b5..f9d08de7 100644 --- a/VoidLink/Base.lproj/iPad.storyboard +++ b/VoidLink/Base.lproj/iPad.storyboard @@ -1380,16 +1380,16 @@ - + - + @@ -1534,6 +1534,26 @@ + + + + + + + + + + + + + + @@ -1624,6 +1644,8 @@ + + @@ -1966,7 +1988,7 @@ - + - + + + + + + + + + + + + - + - + - + - + - + @@ -2432,6 +2477,8 @@ + + @@ -2502,19 +2549,19 @@ - + - + - + - + diff --git a/VoidLink/Database/DataManager.h b/VoidLink/Database/DataManager.h index 4f56d12b..8fd92a8e 100644 --- a/VoidLink/Database/DataManager.h +++ b/VoidLink/Database/DataManager.h @@ -129,6 +129,7 @@ typedef NS_ENUM(NSInteger, WidgetSizeTransition) { delayLeftClick:(BOOL)delayLeftClick duckOtherApps:(BOOL)duckOtherApps muteInBackground:(BOOL)muteInBackground + relativeTouchSlideThreshold:(CGFloat)relativeTouchSlideThreshold backgroundSessionTimer:(NSInteger)backgroundSessionTimer; - (NSArray*) getHosts; diff --git a/VoidLink/Database/DataManager.m b/VoidLink/Database/DataManager.m index 2a948f78..54c858cf 100644 --- a/VoidLink/Database/DataManager.m +++ b/VoidLink/Database/DataManager.m @@ -112,6 +112,7 @@ delayLeftClick:(BOOL)delayLeftClick duckOtherApps:(BOOL)duckOtherApps muteInBackground:(BOOL)muteInBackground + relativeTouchSlideThreshold:(CGFloat)relativeTouchSlideThreshold backgroundSessionTimer:(NSInteger)backgroundSessionTimer{ [_managedObjectContext performBlockAndWait:^{ @@ -174,6 +175,7 @@ settingsToSave.delayLeftClick = delayLeftClick; settingsToSave.duckOtherApps = duckOtherApps; settingsToSave.muteInBackground = muteInBackground; + settingsToSave.relativeTouchSlideThreshold = [NSNumber numberWithFloat:relativeTouchSlideThreshold];; settingsToSave.rememberFoldState = rememberFoldState; [self saveData]; }]; diff --git a/VoidLink/Database/TemporarySettings.h b/VoidLink/Database/TemporarySettings.h index 48441729..bd5a800b 100644 --- a/VoidLink/Database/TemporarySettings.h +++ b/VoidLink/Database/TemporarySettings.h @@ -87,6 +87,7 @@ @property (nonatomic) BOOL duckOtherApps; @property (nonatomic) BOOL muteInBackground; @property (nonatomic, retain) NSNumber * framePacingMode; +@property (nonatomic, retain) NSNumber * relativeTouchSlideThreshold; - (id) initFromSettings:(Settings*)settings; diff --git a/VoidLink/Database/TemporarySettings.m b/VoidLink/Database/TemporarySettings.m index 6de6f4d0..1a0abb55 100644 --- a/VoidLink/Database/TemporarySettings.m +++ b/VoidLink/Database/TemporarySettings.m @@ -143,6 +143,7 @@ self.delayLeftClick = settings.delayLeftClick; self.duckOtherApps = settings.duckOtherApps; self.muteInBackground = settings.muteInBackground; + self.relativeTouchSlideThreshold = settings.relativeTouchSlideThreshold; #endif return self; diff --git a/VoidLink/Input/CommandManager.swift b/VoidLink/Input/CommandManager.swift index 1ba846cc..d45d0100 100644 --- a/VoidLink/Input/CommandManager.swift +++ b/VoidLink/Input/CommandManager.swift @@ -122,6 +122,7 @@ import UIKit @objc public static let directionPads: [String] = ["DPAD", "WASDPAD", "ARROWPAD"] @objc public static let stickTouchPads: [String] = ["LSVPAD", "RSVPAD", "LSPAD", "RSPAD"] @objc public static let nonVectorStickPads: [String] = ["LSPAD", "RSPAD"] + @objc public static let vectorTouchPads: [String] = ["LSVPAD", "RSVPAD", "MOUSEPAD", "TRACKBALL"] @objc public static let verticalTouchPads: [String] = ["LTPAD", "RTPAD", "MOUSEWHEEL", "WHEEL", "DISCRETEWHEEL", "DSWHEEL"] @objc public static let bidirectionalVerticalTouchPads: [String] = ["LTPAD", "RTPAD", "MOUSEWHEEL", "WHEEL", "DISCRETEWHEEL", "DSWHEEL"] @objc public static let functionalButtonCmds: [String] = ["SETTINGS", "TOOLBOX", "WIDGETTOOL", "WIDGETPROFILES", "PROFILES", "SOFTKEYBOARD", "ABSTCHDRAG"] diff --git a/VoidLink/Input/CustomOSC/OSCProfilesManager.m b/VoidLink/Input/CustomOSC/OSCProfilesManager.m index 19d0161c..34364e25 100644 --- a/VoidLink/Input/CustomOSC/OSCProfilesManager.m +++ b/VoidLink/Input/CustomOSC/OSCProfilesManager.m @@ -402,6 +402,7 @@ static CGRect layoutViewBounds; buttonState.mouseButtonAction = widgetView.mouseButtonAction; buttonState.sensitivityFactorX = widgetView.sensitivityFactorX; buttonState.sensitivityFactorY = widgetView.sensitivityFactorY; + buttonState.slideThreshold = widgetView.slideThreshold; buttonState.yawFactor = widgetView.yawFactor; buttonState.pitchFactor = widgetView.pitchFactor; buttonState.rollFactor = widgetView.rollFactor; diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.h b/VoidLink/Input/CustomOSC/OnScreenButtonState.h index 16f95599..59589c94 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.h +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.h @@ -36,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat highlightSizeFactor; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat sensitivityFactorX; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat sensitivityFactorY; // for OnScreenWidgetView +@property (nonatomic, assign) CGFloat slideThreshold; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat yawFactor; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat pitchFactor; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat rollFactor; // for OnScreenWidgetView diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.m b/VoidLink/Input/CustomOSC/OnScreenButtonState.m index fb319adb..65e0e0d0 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.m +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.m @@ -46,6 +46,7 @@ [encoder encodeFloat:self.heightFactor forKey:@"heightFactor"]; [encoder encodeFloat:self.sensitivityFactorX forKey:@"sensitivityFactorX"]; [encoder encodeFloat:self.sensitivityFactorY forKey:@"sensitivityFactorY"]; + [encoder encodeFloat:self.slideThreshold forKey:@"slideThreshold"]; [encoder encodeFloat:self.yawFactor forKey:@"yawFactor"]; [encoder encodeFloat:self.pitchFactor forKey:@"pitchFactor"]; [encoder encodeFloat:self.rollFactor forKey:@"rollFactor"]; @@ -78,6 +79,7 @@ self.heightFactor = [decoder decodeFloatForKey:@"heightFactor"]; self.sensitivityFactorX = [decoder containsValueForKey:@"sensitivityFactorX"] ? [decoder decodeFloatForKey:@"sensitivityFactorX"] : 1.0; self.sensitivityFactorY = [decoder containsValueForKey:@"sensitivityFactorY"] ? [decoder decodeFloatForKey:@"sensitivityFactorY"] : 1.0; + self.slideThreshold = [decoder containsValueForKey:@"slideThreshold"] ? [decoder decodeFloatForKey:@"slideThreshold"] : 6.0; self.yawFactor = [decoder containsValueForKey:@"yawFactor"] ? [decoder decodeFloatForKey:@"yawFactor"] : 1.0; self.pitchFactor = [decoder containsValueForKey:@"pitchFactor"] ? [decoder decodeFloatForKey:@"pitchFactor"] : 1.0; self.rollFactor = [decoder containsValueForKey:@"rollFactor"] ? [decoder decodeFloatForKey:@"rollFactor"] : 1.0; diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 19ff9521..a3ed4522 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -104,6 +104,9 @@ import UIKit @objc public var hasSensitivityY: Bool = false @objc public var sensitivityYMin: CGFloat = 0 @objc public var sensitivityYMax: CGFloat = 8 + @objc public var hasSlideThreshold: Bool = false + @objc public var slideThresholdMin: CGFloat = 0 + @objc public var slideThresholdMax: CGFloat = 20 @objc public var hasYawFactor: Bool = false @objc public var yawFactorMin: CGFloat = 0 @objc public var yawFactorMax: CGFloat = 1 @@ -202,6 +205,7 @@ import UIKit @objc public var trackballDecelerationRate: CGFloat = 0.93 private let trackballVelocityThreshold: CGFloat = 0.1 + @objc public var slideThreshold: CGFloat = 6.0 // border & visual effect private var minimumBorderAlpha: CGFloat = 0.19 @@ -348,6 +352,7 @@ import UIKit self.hasStickIndicator = CommandManager.nonVectorStickPads.contains(self.touchPadString) && widgetType == WidgetTypeEnum.touchPad self.hasSensitivityX = CommandManager.touchPadCmds.contains(self.touchPadString) && !CommandManager.verticalTouchPads.contains(self.touchPadString) self.hasSensitivityY = CommandManager.touchPadCmds.contains(self.touchPadString) + self.hasSlideThreshold = CommandManager.vectorTouchPads.contains(self.touchPadString) if CommandManager.bidirectionalVerticalTouchPads.contains(self.touchPadString){ self.sensitivityYMin = -4.0 @@ -1687,7 +1692,7 @@ import UIKit private func updateTouchLocation(_ touches: Set){ let currentTouchLocation = touches.first!.location(in: self) //if !firstTouchMoved, !self.isAdjacentPoints(currentTouchLocation, from: touchBeganLocation, tolerance: 0.5) { - if !firstTouchMoved, !self.isAdjacentPoints(currentTouchLocation, from: touchBeganLocation, tolerance: 5) { + if !firstTouchMoved, !self.isAdjacentPoints(currentTouchLocation, from: touchBeganLocation, tolerance: slideThreshold) { // First move event self.latestTouchLocation = currentTouchLocation self.firstTouchMoved = true diff --git a/VoidLink/Input/RelativeTouchHandler.m b/VoidLink/Input/RelativeTouchHandler.m index 68098dac..7b913d8e 100644 --- a/VoidLink/Input/RelativeTouchHandler.m +++ b/VoidLink/Input/RelativeTouchHandler.m @@ -234,7 +234,7 @@ static const float QUICK_TAP_TIME_INTERVAL = 0.2; if(self->touchPointSpawnedAtUpperScreenEdge) return; // we're done here. this touch event will not be sent to the remote PC. if(self->firstTouchMoved) LiSendMouseMoveEvent(deltaX, deltaY); - bool isAdjacentPoints = [self isAdjacentPoints:self->initialMousePointerLocation from:currentLocation tolerance:5]; + bool isAdjacentPoints = [self isAdjacentPoints:self->initialMousePointerLocation from:currentLocation tolerance:self->currentSettings.relativeTouchSlideThreshold.floatValue]; if (!self->firstTouchMoved && !isAdjacentPoints) { self->latestMousePointerLocation = currentLocation; diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index a72365d6..67420196 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -564,6 +564,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; widgetView.mouseButtonAction = buttonState.mouseButtonAction; widgetView.sensitivityFactorX = buttonState.sensitivityFactorX; widgetView.sensitivityFactorY = buttonState.sensitivityFactorY; + widgetView.slideThreshold = buttonState.slideThreshold; widgetView.yawFactor = buttonState.yawFactor; widgetView.pitchFactor = buttonState.pitchFactor; widgetView.rollFactor = buttonState.rollFactor; diff --git a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents index 44ca6b23..684ac915 100644 --- a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents +++ b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents @@ -65,6 +65,7 @@ + diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index 939c042e..e1f0a37e 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -4638,6 +4638,64 @@ } } }, + "relativeTouchSlideThresholdStackLink" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/egk4t4550owmomda" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/fqd6l1kgt482on8a" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/fqd6l1kgt482on8a" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/fqd6l1kgt482on8a" + } + } + } + }, + "relativeTouchSlideThresholdStackTip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fixes mouse cursor jump on initial move of touchPad mode." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用于修复触控板模式下鼠标指针刚开始移动时会突然跳一下的问题。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "用於修復觸控板模式下滑鼠指標剛開始移動時會突然跳一下的問題。" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "用於修復觸控板模式下滑鼠指標剛開始移動時會突然跳一下的問題。" + } + } + } + }, "Remove" : { "extractionState" : "manual", "localizations" : { @@ -5312,6 +5370,29 @@ } } }, + "Slide threshold: %.1f" : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动阈值: %.2f" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動閾值: %.2f" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動閾值: %.2f" + } + } + } + }, "slideToSettingsDistanceStackTip" : { "extractionState" : "manual", "localizations" : { diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h index c991a2bb..c2251103 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h @@ -113,6 +113,10 @@ NS_ASSUME_NONNULL_BEGIN // @property (strong, nonatomic) IBOutlet UISlider *autoTapSlider; @property (strong, nonatomic) IBOutlet UITextField *autoTapField; +@property (strong, nonatomic) IBOutlet UIStackView *slideThresholdStack; +@property (strong, nonatomic) IBOutlet UILabel *slideThresholdLabel; +@property (strong, nonatomic) IBOutlet UISlider *slideThresholdSlider; + @property (weak, nonatomic) IBOutlet UIStackView *widgetPanelStack; diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index 375fcb9e..04577a30 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -153,6 +153,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) { widgetView.mouseButtonAction = buttonState.mouseButtonAction; widgetView.sensitivityFactorX = buttonState.sensitivityFactorX; widgetView.sensitivityFactorY = buttonState.sensitivityFactorY; + widgetView.slideThreshold = buttonState.slideThreshold; widgetView.yawFactor = buttonState.yawFactor; widgetView.pitchFactor = buttonState.pitchFactor; widgetView.rollFactor = buttonState.rollFactor; @@ -745,6 +746,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) { newWidget.autoTapInterval = widget.autoTapInterval; newWidget.sensitivityFactorX = widget.sensitivityFactorX; newWidget.sensitivityFactorY = widget.sensitivityFactorY; + newWidget.slideThreshold = widget.slideThreshold; newWidget.yawFactor = widget.yawFactor; newWidget.pitchFactor = widget.pitchFactor; newWidget.rollFactor = widget.rollFactor; @@ -903,6 +905,16 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) { [self autoFitLabel:self.sensitivityYLabel]; } + self.slideThresholdStack.hidden = !selectedWidgetView.hasSlideThreshold; + if(selectedWidgetView.hasSlideThreshold){ + [self.slideThresholdSlider setMinimumValue:selectedWidgetView.slideThresholdMin]; + [self.slideThresholdSlider setMaximumValue:selectedWidgetView.slideThresholdMax]; + [self.slideThresholdSlider setValue:self->selectedWidgetView.slideThreshold]; + [self.slideThresholdLabel setText:[LocalizationHelper localizedStringForKey:@"Slide threshold: %.1f", self->selectedWidgetView.slideThreshold]]; + [self autoFitLabel:self.slideThresholdLabel]; + } + + self.yawFactorStack.hidden = !selectedWidgetView.hasYawFactor; if(selectedWidgetView.hasYawFactor){ [self.yawFactorSlider setMinimumValue:selectedWidgetView.yawFactorMin]; @@ -1167,6 +1179,12 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) { return; } +- (void)slideThresholdSliderMoved:(UISlider* )sender{ + [self.slideThresholdLabel setText:[LocalizationHelper localizedStringForKey:@"Slide threshold: %.1f", sender.value]]; + if(self->selectedWidgetView != nil && self->widgetViewSelected) self->selectedWidgetView.slideThreshold = sender.value; + return; +} + - (void)yawFactorSliderMoved:(UISlider* )sender{; [self.yawFactorLabel setText:[LocalizationHelper localizedStringForKey:@"Yaw factor: %.2f", sender.value]]; [self.pitchFactorLabel setText:[LocalizationHelper localizedStringForKey:@"Pitch factor: %.2f", sender.value]]; @@ -1324,6 +1342,10 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) { self.sensitivityYLabel.text = [LocalizationHelper localizedStringForKey:@"SensitivityY"]; self.sensitivityYStack.hidden = YES; + [self.slideThresholdSlider addTarget:self action:@selector(slideThresholdSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; + self.slideThresholdLabel.text = [LocalizationHelper localizedStringForKey:@"Slide threshold"]; + self.slideThresholdStack.hidden = YES; + [self.yawFactorSlider addTarget:self action:@selector(yawFactorSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; self.yawFactorLabel.text = [LocalizationHelper localizedStringForKey:@"Yaw Factor"]; self.yawFactorStack.hidden = YES; diff --git a/VoidLink/ViewControllers/SettingsViewController.h b/VoidLink/ViewControllers/SettingsViewController.h index 72acc48c..b2636b77 100644 --- a/VoidLink/ViewControllers/SettingsViewController.h +++ b/VoidLink/ViewControllers/SettingsViewController.h @@ -190,6 +190,9 @@ @property (strong, nonatomic) IBOutlet UIStackView *muteInBackgroundStack; @property (strong, nonatomic) IBOutlet UISwitch *muteInBackgroundSwitch; +@property (strong, nonatomic) IBOutlet UIStackView *relativeTouchSlideThresholdStack; +@property (strong, nonatomic) IBOutlet UISlider *relativeTouchSlideThresholdSlider; + @property (strong, nonatomic) IBOutlet UIStackView *testStack; @property (nonatomic, strong) MicHandler *micHandler; diff --git a/VoidLink/ViewControllers/SettingsViewController.m b/VoidLink/ViewControllers/SettingsViewController.m index 3936fa23..2230f5b5 100644 --- a/VoidLink/ViewControllers/SettingsViewController.m +++ b/VoidLink/ViewControllers/SettingsViewController.m @@ -715,7 +715,6 @@ BOOL isCustomResolution(int resolutionSelected) { [self addSetting:self.pointerVelocityDividerStack ofId:@"pointerVelocityDividerStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection]; [self addSetting:self.pointerVelocityFactorStack ofId:@"pointerVelocityFactorStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection]; [self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection]; - [self addSetting:self.singleTapSensitivityStack ofId:@"singleTapSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection]; // [self addSetting:self.delayLeftClickStack ofId:@"delayLeftClickStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection]; [self addSetting:self.onScreenWidgetStack ofId:@"onScreenWidgetStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection]; [self addSetting:self.buttonVisualFeedbackStack ofId:@"buttonVisualFeedbackStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection]; @@ -827,8 +826,10 @@ BOOL isCustomResolution(int resolutionSelected) { if (@available(iOS 13.0, *)) { [experimentalSection setSectionWithIcon:[UIImage imageNamed:@"flask"] andSize:20]; } + // [self addSetting:self.touchModeStack ofId:@"touchModeStack" withInfoTag:NO withDynamicLabel:NO to:experimentalSection]; [self addSetting:self.touchMoveEventIntervalStack ofId:@"touchMoveEventIntervalStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection]; - + [self addSetting:self.relativeTouchSlideThresholdStack ofId:@"relativeTouchSlideThresholdStack" withInfoTag:YES withDynamicLabel:YES to:experimentalSection]; + [self addSetting:self.singleTapSensitivityStack ofId:@"singleTapSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection]; [self addSetting:self.renderingBackendStack ofId:@"renderingBackendStack" withInfoTag:YES withDynamicLabel:NO to:experimentalSection]; [self addSetting:self.performanceGraphStack ofId:@"performanceGraphStack" withInfoTag:YES withDynamicLabel:NO to:experimentalSection]; [self addDynamicLabelForStack:self.graphOpacityStack]; @@ -1194,7 +1195,7 @@ BOOL isCustomResolution(int resolutionSelected) { if([sender.superview.accessibilityIdentifier isEqualToString: @"yuv444Stack"]){ tipText = [LocalizationHelper localizedStringForKey:@"yuv444StackTip"]; showOnlineDocAction = true; - onlineDocLink = @"https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/koeimmrvt4o17auc?singleDoc#"; + onlineDocLink = @"https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/koeimmrvt4o17auc"; } if([sender.superview.accessibilityIdentifier isEqualToString: @"touchModeStack"]){ tipText = [LocalizationHelper localizedStringForKey:@"touchModeStackTip"]; @@ -1288,6 +1289,11 @@ BOOL isCustomResolution(int resolutionSelected) { tipText = [LocalizationHelper localizedStringForKey:@"delayLeftClickStackTip"]; showOnlineDocAction = false; } + if([sender.superview.accessibilityIdentifier isEqualToString: @"relativeTouchSlideThresholdStack"]){ + tipText = [LocalizationHelper localizedStringForKey:@"relativeTouchSlideThresholdStackTip"]; + showOnlineDocAction = true; + onlineDocLink = [LocalizationHelper localizedStringForKey:@"relativeTouchSlideThresholdStackLink"]; + } UIAlertController *tipsAlertController = [UIAlertController alertControllerWithTitle: [LocalizationHelper localizedStringForKey:@"Tips"] message:tipText preferredStyle:UIAlertControllerStyleAlert]; @@ -1847,6 +1853,10 @@ BOOL isCustomResolution(int resolutionSelected) { [self.singleTapSensitivitySlider setValue:self->tempSettings.singleTapSensitivity.doubleValue animated:NO]; [self.singleTapSensitivitySlider addTarget:self action:@selector(singleTapSensitivitySliderMoved:) forControlEvents:(UIControlEventValueChanged)]; [self singleTapSensitivitySliderMoved:self.singleTapSensitivitySlider]; + + [self.relativeTouchSlideThresholdSlider setValue:self->tempSettings.relativeTouchSlideThreshold.floatValue animated:NO]; + [self.relativeTouchSlideThresholdSlider addTarget:self action:@selector(relativeTouchSlideThresholdSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; + [self relativeTouchSlideThresholdSliderMoved:self.relativeTouchSlideThresholdSlider]; // these settings will be affected by onscreenControl & touchMode, must be loaded before them. // NSLog(@"osc tool fingers setting test: %d", currentSettings.oscLayoutToolFingers.intValue); @@ -2274,6 +2284,9 @@ BOOL isCustomResolution(int resolutionSelected) { [self findDynamicLabelFromStack:_singleTapSensitivityStack].text = [NSString stringWithFormat:@" %.1f ",sender.value]; } +- (void) relativeTouchSlideThresholdSliderMoved:(UISlider* )sender { + [self findDynamicLabelFromStack:_relativeTouchSlideThresholdStack].text = [NSString stringWithFormat:@" %.1f ",sender.value]; +} - (uint32_t) getScreenEdgeFromSelector { switch (self.slideToSettingsScreenEdgeSelector.selectedSegmentIndex) { @@ -2332,9 +2345,11 @@ BOOL isCustomResolution(int resolutionSelected) { [self touchMoveEventIntervalSliderMoved:self.touchMoveEventIntervalSlider]; [self setHidden:!isNativeTouch forStack:self.pointerVelocityDividerStack]; [self setHidden:!isNativeTouch forStack:self.pointerVelocityFactorStack]; + [self setHidden:!isNativeTouch forStack:self.touchMoveEventIntervalStack]; [self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.mousePointerVelocityStack]; [self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.singleTapSensitivityStack]; + [self setHidden:sender.selectedSegmentIndex!=RelativeTouch forStack:self.relativeTouchSlideThresholdStack]; [self setHidden:![self isNotNativeTouchOnly] forStack:self.onScreenWidgetStack]; [self setHidden:![self isNotNativeTouchOnly] forStack:self.buttonVisualFeedbackStack]; [self setHidden:sender.selectedSegmentIndex!=AbsoluteTouch forStack:self.delayLeftClickStack]; @@ -2883,6 +2898,7 @@ BOOL isCustomResolution(int resolutionSelected) { BOOL delayLeftClick = true; BOOL duckOtherApps = self.duckOtherAppSwitch.isOn; BOOL muteInBackground = self.muteInBackgroundSwitch.isOn; + CGFloat relativeTouchSlideThreshold = self.relativeTouchSlideThresholdSlider.value; NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value; [dataMan saveSettingsWithBitrate:_bitrate @@ -2941,6 +2957,7 @@ BOOL isCustomResolution(int resolutionSelected) { delayLeftClick:delayLeftClick duckOtherApps:duckOtherApps muteInBackground:muteInBackground + relativeTouchSlideThreshold:relativeTouchSlideThreshold backgroundSessionTimer:backgroundSessionTimer]; } diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings index 005fd9f0..d8dbad3a 100644 --- a/VoidLink/mul.lproj/iPad.xcstrings +++ b/VoidLink/mul.lproj/iPad.xcstrings @@ -1537,19 +1537,19 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑出时松开" } }, "zh-Hant" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑出時鬆開" } }, "zh-HK" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑出時鬆開" } } @@ -1567,19 +1567,19 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑动时按下" } }, "zh-Hant" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑動時按下" } }, "zh-HK" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "滑動時按下" } } @@ -2815,6 +2815,36 @@ } } }, + "jYn-fE-27r.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide Distance Threshold\"; ObjectID = \"jYn-fE-27r\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide Distance Threshold" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动距离阈值" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動距離閾值" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動距離閾值" + } + } + } + }, "kho-5R-daP.segmentTitles[0]" : { "comment" : "Class = \"UISegmentedControl\"; kho-5R-daP.segmentTitles[0] = \"3 Finger Tap\"; ObjectID = \"kho-5R-daP\";", "extractionState" : "extracted_with_value", @@ -4093,6 +4123,18 @@ } } }, + "qx4-KQ-j2T.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"qx4-KQ-j2T\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide threshold" + } + } + } + }, "QYJ-84-bvc.text" : { "comment" : "Class = \"UILabel\"; text = \"Lift Stream View for Local Keyboard \"; ObjectID = \"QYJ-84-bvc\";", "extractionState" : "extracted_with_value", diff --git a/VoidLink/mul.lproj/iPhone.xcstrings b/VoidLink/mul.lproj/iPhone.xcstrings index 92382702..3dd97eae 100644 --- a/VoidLink/mul.lproj/iPhone.xcstrings +++ b/VoidLink/mul.lproj/iPhone.xcstrings @@ -577,6 +577,18 @@ } } }, + "6mJ-6V-XcK.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"6mJ-6V-XcK\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide threshold" + } + } + } + }, "6PG-vr-boy.text" : { "comment" : "Class = \"UILabel\"; text = \"Edge Trigger Sensitivity\"; ObjectID = \"6PG-vr-boy\";", "extractionState" : "extracted_with_value", @@ -1309,6 +1321,36 @@ } } }, + "bsU-vw-dTl.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide Distance Threshold\"; ObjectID = \"bsU-vw-dTl\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide Distance Threshold" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动距离阈值" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動距離閾值" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動距離閾值" + } + } + } + }, "bue-hp-CWD.title" : { "comment" : "Class = \"UIBarButtonItem\"; title = \"Duplicate\"; ObjectID = \"bue-hp-CWD\";", "extractionState" : "extracted_with_value",