diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard index 76466d2e..ddf01639 100644 --- a/VoidLink/Base.lproj/iPad.storyboard +++ b/VoidLink/Base.lproj/iPad.storyboard @@ -1518,19 +1518,20 @@ - + - - + + + - + - + diff --git a/VoidLink/Input/CustomOSC/OSCProfilesManager.m b/VoidLink/Input/CustomOSC/OSCProfilesManager.m index 969920a6..6f232993 100644 --- a/VoidLink/Input/CustomOSC/OSCProfilesManager.m +++ b/VoidLink/Input/CustomOSC/OSCProfilesManager.m @@ -387,7 +387,7 @@ static CGRect layoutViewBounds; buttonState.stickIndicatorOffset = widgetView.stickIndicatorOffset; buttonState.widgetShape = widgetView.shape; buttonState.minStickOffset = widgetView.minStickOffset; - buttonState.isSlidable = widgetView.isSlidable; + buttonState.slideMode = widgetView.slideMode; NSData *buttonStateEncoded = [NSKeyedArchiver archivedDataWithRootObject:buttonState requiringSecureCoding:YES error:nil]; [buttonStatesEncoded addObject: buttonStateEncoded]; diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.h b/VoidLink/Input/CustomOSC/OnScreenButtonState.h index a8f41b90..12a37e6a 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.h +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.h @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN @property NSString *alias; @property CGPoint position; @property (nonatomic, assign) BOOL isHidden; -@property (nonatomic, assign) BOOL isSlidable; +@property (nonatomic, assign) uint8_t slideMode; @property (nonatomic, assign) uint8_t buttonType; @property (nonatomic, assign) CGFloat widthFactor; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat heightFactor; // for OnScreenWidgetView @@ -57,6 +57,13 @@ typedef NS_ENUM(NSInteger, MouseButtonAction) { rightButtonDown, }; +typedef NS_ENUM(NSInteger, ButtonSlideMode) { + toggle, + slideAndHold, + disabled +}; + + - (id) initWithButtonName:(NSString*)name buttonType:(uint8_t)buttonType andPosition:(CGPoint)position; diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.m b/VoidLink/Input/CustomOSC/OnScreenButtonState.m index 0073c2af..95df86d2 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.m +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.m @@ -35,9 +35,9 @@ [encoder encodeInt:self.buttonType forKey:@"buttonType"]; [encoder encodeInt:self.vibrationStyle forKey:@"vibrationStyle"]; [encoder encodeInt:self.mouseButtonAction forKey:@"mouseButtonAction"]; + [encoder encodeInt:self.slideMode forKey:@"slideMode"]; [encoder encodeCGPoint:self.position forKey:@"position"]; [encoder encodeBool:self.isHidden forKey:@"isHidden"]; - [encoder encodeBool:self.isSlidable forKey:@"isSlidable"]; [encoder encodeFloat:self.widthFactor forKey:@"widthFactor"]; [encoder encodeFloat:self.heightFactor forKey:@"heightFactor"]; [encoder encodeFloat:self.sensitivityFactorX forKey:@"sensitivityFactorX"]; @@ -58,9 +58,9 @@ self.buttonType = [decoder decodeIntForKey:@"buttonType"]; self.vibrationStyle = [decoder decodeIntForKey:@"vibrationStyle"]; self.mouseButtonAction = [decoder decodeIntForKey:@"mouseButtonAction"]; + self.slideMode = [decoder containsValueForKey:@"slideMode"] ? [decoder decodeIntForKey:@"slideMode"] : 0; self.position = [decoder decodeCGPointForKey:@"position"]; self.isHidden = [decoder decodeBoolForKey:@"isHidden"]; - self.isSlidable = [decoder containsValueForKey:@"isSlidable"] ? [decoder decodeBoolForKey:@"isSlidable"] : YES; self.widthFactor = [decoder decodeFloatForKey:@"widthFactor"]; self.heightFactor = [decoder decodeFloatForKey:@"heightFactor"]; self.sensitivityFactorX = [decoder decodeFloatForKey:@"sensitivityFactorX"]; diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 5e5633f8..2b10547c 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -45,7 +45,7 @@ import UIKit @objc public var pressed: Bool @objc public var widthFactor: CGFloat = 1.0 @objc public var heightFactor: CGFloat = 1.0 - @objc public var isSlidable: Bool = true + @objc public var slideMode: Int = 0 @objc public var deNormalizedWidthFactor: CGFloat = 1.0 @objc public var deNormalizedHeightFactor: CGFloat = 1.0 @@ -1208,7 +1208,7 @@ import UIKit for touch in touches { for subview in self.superview?.subviews ?? [] { if let widget = subview as? OnScreenWidgetView{ - if !widget.capturedTouches.contains(touch) || !widget.isSlidable {continue} + if !widget.capturedTouches.contains(touch) || widget.slideMode == ButtonSlideMode.disabled.rawValue {continue} widget.handlebuttonUp() } } @@ -1223,16 +1223,21 @@ import UIKit if widget.widgetType != WidgetTypeEnum.button {continue} let pointInSubview = widget.convert(locationInSuperView, from: self.superview) if widget.bounds.contains(pointInSubview){ - if widget.capturedTouches.contains(touch) || !widget.isSlidable {continue} + if widget.capturedTouches.contains(touch) || widget.slideMode == ButtonSlideMode.disabled.rawValue {continue} widget.capturedTouches.add(touch) widget.handleButtonDown() // print("UIButton: \(widget.buttonLabel) in, \(widget.touchPadString), \(CACurrentMediaTime())") } else{ - if !widget.capturedTouches.contains(touch) || !widget.isSlidable {continue} + if !widget.capturedTouches.contains(touch) || widget.slideMode == ButtonSlideMode.disabled.rawValue {continue} // print("UIButton: \(widget.buttonLabel) out test, \(widget.touchPadString), \(CACurrentMediaTime())") - widget.capturedTouches.remove(touch) - widget.handlebuttonUp() + if(widget.slideMode == ButtonSlideMode.toggle.rawValue){ + widget.capturedTouches.remove(touch) + widget.handlebuttonUp() + } + if(widget.slideMode == ButtonSlideMode.slideAndHold.rawValue){ + // do nothing here + } } } } @@ -1248,7 +1253,7 @@ import UIKit } if !self.buttonString.isEmpty{ - if self.isSlidable {self.handleButtonSliding(touches: touches)} + if self.slideMode != ButtonSlideMode.disabled.rawValue {self.handleButtonSliding(touches: touches)} } if CommandManager.specialOverlayButtonCmds.contains(self.cmdString){ diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index c1efbc92..ef711d85 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -454,7 +454,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; widgetView.trackballDecelerationRate = buttonState.decelerationRate; widgetView.stickIndicatorOffset = buttonState.stickIndicatorOffset; widgetView.minStickOffset = buttonState.minStickOffset; - widgetView.isSlidable = buttonState.isSlidable; + widgetView.slideMode = buttonState.slideMode; // Add the widgetView to the view controller's view [self->streamFrameTopLayerView addSubview:widgetView]; // add keyboard button to the stream frame view. must add it to the target view before setting location. buttonState.position = [self denormalizeWidgetPosition:buttonState.position]; diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index 6aeacd25..c5761881 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -123,7 +123,7 @@ widgetView.trackballDecelerationRate = buttonState.decelerationRate; widgetView.stickIndicatorOffset = buttonState.stickIndicatorOffset; widgetView.minStickOffset = buttonState.minStickOffset; - widgetView.isSlidable = buttonState.isSlidable; + widgetView.slideMode = buttonState.slideMode; // Add the widgetView to the view controller's view [self.view insertSubview:widgetView belowSubview:self.widgetPanelStack]; buttonState.position = [self denormalizeWidgetPosition:buttonState.position]; @@ -635,7 +635,7 @@ newWidget.minStickOffset = [widgetInitParams[@"minStickOffsetString"] floatValue]; [newWidget setVibrationWithStyle:widget.vibrationStyle]; newWidget.mouseButtonAction = widget.mouseButtonAction; - newWidget.isSlidable = widget.isSlidable; + newWidget.slideMode = widget.slideMode; [self.view insertSubview:newWidget belowSubview:self.widgetPanelStack]; if(createNew) [newWidget setLocationWithPosition:CGPointMake(90, 130)]; @@ -753,7 +753,7 @@ [self.widgetBorderWidthSlider setValue:self->selectedWidgetView.borderWidth]; self.slidableStack.hidden = selectedWidgetView.widgetType != WidgetTypeEnumButton; - [self.slidableSelector setSelectedSegmentIndex:selectedWidgetView.isSlidable ? 0 : 1]; + [self.slidableSelector setSelectedSegmentIndex:selectedWidgetView.slideMode]; bool showSensitivityFactorStack = selectedWidgetView.hasSensitivityTweak; bool showStickIndicatorOffsetStack = selectedWidgetView.hasStickIndicator; @@ -906,9 +906,9 @@ } } -- (void)slidableChanged:(UISegmentedControl* )sender{ +- (void)slideModeChanged:(UISegmentedControl* )sender{ if(self->selectedWidgetView != nil && self->widgetViewSelected){ - selectedWidgetView.isSlidable = _slidableSelector.selectedSegmentIndex == 0; + selectedWidgetView.slideMode = _slidableSelector.selectedSegmentIndex; } } @@ -1065,7 +1065,7 @@ [self.mouseButtonDownSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal]; self.mouseDownButtonStack.hidden = YES; - [self.slidableSelector addTarget:self action:@selector(slidableChanged:) forControlEvents:(UIControlEventValueChanged)]; + [self.slidableSelector addTarget:self action:@selector(slideModeChanged:) forControlEvents:(UIControlEventValueChanged)]; [self.slidableSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal]; self.slidableStack.hidden = YES; diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings index e34f2f13..bda12988 100644 --- a/VoidLink/mul.lproj/iPad.xcstrings +++ b/VoidLink/mul.lproj/iPad.xcstrings @@ -1052,43 +1052,73 @@ } }, "cKS-fy-Zpg.segmentTitles[0]" : { - "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[0] = \"yes\"; ObjectID = \"cKS-fy-Zpg\";", + "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[0] = \"toggle\"; ObjectID = \"cKS-fy-Zpg\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "yes" + "value" : "toggle" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "开启" + "value" : "滑出时松开" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "開啟" + "value" : "滑出時鬆開" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "開啟" + "value" : "滑出時鬆開" } } } }, "cKS-fy-Zpg.segmentTitles[1]" : { - "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[1] = \"no\"; ObjectID = \"cKS-fy-Zpg\";", + "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[1] = \"slide & hold\"; ObjectID = \"cKS-fy-Zpg\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "no" + "value" : "slide & hold" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动时按下" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動時按下" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動時按下" + } + } + } + }, + "cKS-fy-Zpg.segmentTitles[2]" : { + "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[2] = \"disabled\"; ObjectID = \"cKS-fy-Zpg\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "disabled" } }, "zh-Hans" : { @@ -1106,7 +1136,7 @@ "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "關閉" + "value" : "關閉\n" } } }