diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard index bb8d1122..76466d2e 100644 --- a/VoidLink/Base.lproj/iPad.storyboard +++ b/VoidLink/Base.lproj/iPad.storyboard @@ -1309,7 +1309,7 @@ - + - + @@ -1501,10 +1501,43 @@ - + + + + + + + + + + + + + + + + + + @@ -1544,6 +1577,8 @@ + + diff --git a/VoidLink/Base.lproj/iPhone.storyboard b/VoidLink/Base.lproj/iPhone.storyboard index 9fb1c0e7..57d5b069 100644 --- a/VoidLink/Base.lproj/iPhone.storyboard +++ b/VoidLink/Base.lproj/iPhone.storyboard @@ -13,7 +13,7 @@ - + @@ -314,7 +314,7 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -597,6 +633,8 @@ + + @@ -1684,16 +1722,16 @@ - + - + - + - + diff --git a/VoidLink/Input/CustomOSC/OSCProfilesManager.m b/VoidLink/Input/CustomOSC/OSCProfilesManager.m index 7aea9c96..969920a6 100644 --- a/VoidLink/Input/CustomOSC/OSCProfilesManager.m +++ b/VoidLink/Input/CustomOSC/OSCProfilesManager.m @@ -387,6 +387,7 @@ static CGRect layoutViewBounds; buttonState.stickIndicatorOffset = widgetView.stickIndicatorOffset; buttonState.widgetShape = widgetView.shape; buttonState.minStickOffset = widgetView.minStickOffset; + buttonState.isSlidable = widgetView.isSlidable; 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 427c4dfe..a8f41b90 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.h +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.h @@ -26,6 +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 buttonType; @property (nonatomic, assign) CGFloat widthFactor; // for OnScreenWidgetView @property (nonatomic, assign) CGFloat heightFactor; // for OnScreenWidgetView diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.m b/VoidLink/Input/CustomOSC/OnScreenButtonState.m index a91041f8..9cec0dc9 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.m +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.m @@ -37,6 +37,7 @@ [encoder encodeInt:self.mouseButtonAction forKey:@"mouseButtonAction"]; [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"]; @@ -59,6 +60,7 @@ self.mouseButtonAction = [decoder decodeIntForKey:@"mouseButtonAction"]; self.position = [decoder decodeCGPointForKey:@"position"]; self.isHidden = [decoder decodeBoolForKey:@"isHidden"]; + self.isSlidable = [decoder decodeBoolForKey:@"isSlidable"]; 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 83820b4b..fd1694ad 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -45,7 +45,8 @@ 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 deNormalizedWidthFactor: CGFloat = 1.0 @objc public var deNormalizedHeightFactor: CGFloat = 1.0 @@ -135,7 +136,11 @@ import UIKit // border & visual effect private var minimumBorderAlpha: CGFloat = 0.19 private var defaultBorderColor: CGColor = UIColor(white: 0.2, alpha: 0.3).cgColor - private let moonlightPurple: CGColor = UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 0.86).cgColor + private let voidlinkPurple: CGColor = UIColor(red: 0.5, green: 0.5, blue: 1.0, alpha: 0.86).cgColor + + //slide buttons + private var capturedTouches: NSMutableSet + private let noTouch: UITouch = UITouch() // whole button press down visual effect @@ -227,6 +232,7 @@ import UIKit self.stickIndicatorOffset = 95 self.sensitivityFactorX = 1.0 self.sensitivityFactorY = 1.0 + self.capturedTouches = NSMutableSet() super.init(frame: .zero) upIndicator = createLrudDirectionLayer() @@ -497,7 +503,7 @@ import UIKit indicatorBorder.fillColor = UIColor.clear.cgColor let path = UIBezierPath(roundedRect: indicatorBorder.bounds, cornerRadius: indicatorBorder.cornerRadius) indicatorBorder.path = path.cgPath - indicatorBorder.borderColor = moonlightPurple + indicatorBorder.borderColor = voidlinkPurple self.layer.superlayer?.addSublayer(indicatorBorder) indicatorBorder.position = CGPointMake(CGRectGetMinX(self.frame)+touchBeganLocation.x, CGRectGetMinY(self.frame)+touchBeganLocation.y) @@ -691,7 +697,7 @@ import UIKit indicatorBorder.fillColor = UIColor.clear.cgColor let path = UIBezierPath(roundedRect: indicatorBorder.bounds, cornerRadius: indicatorBorder.cornerRadius) indicatorBorder.path = path.cgPath - indicatorBorder.borderColor = moonlightPurple + indicatorBorder.borderColor = voidlinkPurple return indicatorBorder } @@ -886,14 +892,14 @@ import UIKit //==== wholeButtonPress visual effect============================================= - private func buttonDownEffect() { - // setupBorderLayer() + private func handleButtonDown() { + if !OnScreenWidgetView.editMode {self.sendComboButtonsDownEvent(comboStrings: self.comboButtonStrings)} CATransaction.begin() CATransaction.setDisableActions(true) // self.layer.borderWidth = 0 buttonDownVisualEffectLayer.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) // update position every time we press down the button buttonDownVisualEffectLayer.borderWidth = self.buttonDownVisualEffectWidth // this will show the visual effect - buttonDownVisualEffectLayer.borderColor = moonlightPurple + buttonDownVisualEffectLayer.borderColor = voidlinkPurple if vibrationOn { vibrationGenerator.prepare() vibrationGenerator.impactOccurred() @@ -902,7 +908,8 @@ import UIKit CATransaction.commit() } - private func buttonUpVisualEffect() { + private func handlebuttonUp() { + if !OnScreenWidgetView.editMode {self.sendComboButtonsUpEvent(comboStrings: self.comboButtonStrings)} CATransaction.begin() CATransaction.setDisableActions(true) // self.layer.borderWidth = 1 @@ -1041,11 +1048,11 @@ import UIKit //============================================================================== // Touch event handling override func touchesBegan(_ touches: Set, with event: UIEvent?) { - self.touchBegan = true self.firstTouchMoved = false super.touchesBegan(touches, with: event) - self.isMultipleTouchEnabled = self.touchPadString == "MOUSEPAD" // only enable multi-touch in mousePad mode + // self.isMultipleTouchEnabled = self.touchPadString == "MOUSEPAD" // only enable multi-touch in mousePad mode + self.isMultipleTouchEnabled = true if !OnScreenWidgetView.editMode && self.touchPadString == "TRACKBALL" { stopTrackballMomentum() @@ -1143,8 +1150,9 @@ import UIKit // this will also deal with button events if self.widgetType == WidgetTypeEnum.button && !self.comboButtonStrings.isEmpty { - self.buttonDownEffect() - self.sendComboButtonsDownEvent(comboStrings: self.comboButtonStrings) + self.handleButtonDown() + self.capturedTouches.union(touches) + //self.handleButtonSliding(touches: touches) } // legacy keyboard button combo connected by "+" @@ -1152,13 +1160,13 @@ import UIKit let keyboardCmdStrings = CommandManager.shared.extractKeyStringsFromComboCommand(from: self.cmdString)! CommandManager.shared.sendKeyComboCommand(keyboardCmdStrings: keyboardCmdStrings) // send multi-key command DispatchQueue.main.asyncAfter(deadline: .now() + 0.03) { // reset shadow color immediately 50ms later - self.buttonUpVisualEffect() + self.handlebuttonUp() } } } // here is in edit mode: else{ - self.buttonDownEffect() + self.handleButtonDown() NotificationCenter.default.post(name: Notification.Name("OnScreenWidgetViewSelected"),object: self) // inform layout tool controller to fetch button size factors. self will be passed as the object of the notification } } @@ -1184,16 +1192,59 @@ import UIKit } } + private func handleButtonSlidingUp(touches: Set) { + for touch in touches { + for subview in self.superview?.subviews ?? [] { + if let widget = subview as? OnScreenWidgetView{ + if !widget.capturedTouches.contains(touch) || !widget.isSlidable {continue} + widget.handlebuttonUp() + } + } + } + } + + private func handleButtonSliding(touches: Set) { + for touch in touches { + let locationInSuperView = touch.location(in: self.superview) + for subview in self.superview?.subviews ?? [] { + if let widget = subview as? OnScreenWidgetView{ + 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} + widget.capturedTouches.add(touch) + widget.handleButtonDown() + print("UIButton: \(widget.buttonLabel) in, \(widget.touchPadString), \(CACurrentMediaTime())") + } + else{ + if !widget.capturedTouches.contains(touch) || !widget.isSlidable {continue} + print("UIButton: \(widget.buttonLabel) out test, \(widget.touchPadString), \(CACurrentMediaTime())") + widget.capturedTouches.remove(touch) + widget.handlebuttonUp() + } + } + } + } + } + override func touchesMoved(_ touches: Set, with event: UIEvent?) { super.touchesMoved(touches, with: event) if !OnScreenWidgetView.editMode { - handleTouchPadMoveEvent(touches, with: event) + + if !self.touchPadString.isEmpty{ + handleTouchPadMoveEvent(touches, with: event) + } + + if !self.buttonString.isEmpty{ + if self.isSlidable {self.handleButtonSliding(touches: touches)} + } + if CommandManager.specialOverlayButtonCmds.contains(self.cmdString){ if let touch = touches.first { NSLog("touchTapTimeStamp %f", self.touchTapTimeStamp) if CACurrentMediaTime() - self.touchTapTimeStamp > 0.3 { // temporarily relocate special buttons self.moveByTouch(touch: touch) - self.buttonUpVisualEffect() + self.handlebuttonUp() } } } @@ -1365,7 +1416,8 @@ import UIKit self.lrudIndicatorBall.removeFromSuperlayer() if !OnScreenWidgetView.editMode && !self.cmdString.contains("+") && !self.comboButtonStrings.isEmpty { // if the command(keystring contains "+", it's a legacy multi-key command - self.sendComboButtonsUpEvent(comboStrings: self.comboButtonStrings) + self.handleButtonSlidingUp(touches: touches) + self.capturedTouches.minus(touches) } if !OnScreenWidgetView.editMode && CommandManager.specialOverlayButtonCmds.contains(self.cmdString){ @@ -1417,7 +1469,7 @@ import UIKit } } - self.buttonUpVisualEffect() + self.handlebuttonUp() } } diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index 92ae7144..dfe1541b 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -232,12 +232,12 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; } - (void)keyboardWillShow:(NSNotification *)notification{ - NSLog(@"keyboard will show markmark %f", CACurrentMediaTime()); + // NSLog(@"keyboard will show markmark %f", CACurrentMediaTime()); if(settings.liftStreamViewForKeyboard && !isInputingText){ NSDictionary *userInfo = notification.userInfo; // Get the keyboard size from the notification CGRect keyboardFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - NSLog(@"keyboard will show markmark, lowest height %f", keyboardToggleRecognizer.lowestTouchPointHeight); + // NSLog(@"keyboard will show markmark, lowest height %f", keyboardToggleRecognizer.lowestTouchPointHeight); if(keyboardFrame.size.height < CGRectGetHeight([[UIScreen mainScreen] bounds]) * 0.25) return; // return in case of abnormal keyboard height HeightViewLiftedTo = keyboardFrame.size.height - keyboardToggleRecognizer.lowestTouchPointHeight + CGRectGetHeight([[UIScreen mainScreen] bounds]) * 0.1; // lift the StreamView to the height of lowest touch point of multi-finger tap gesture, while reserving the view of 1/10 screen height for remote typing. if(HeightViewLiftedTo < 0) HeightViewLiftedTo = 0; // set HeightViewLiftedTo to 0 if it is high enough and not going to be covered by keyboard. @@ -454,6 +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; // 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.h b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h index c2272de5..bbf0d565 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.h @@ -93,6 +93,9 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) IBOutlet UIStackView *mouseDownButtonStack; @property (strong, nonatomic) IBOutlet UISegmentedControl *mouseButtonDownSelector; +@property (strong, nonatomic) IBOutlet UIStackView *slidableStack; +@property (strong, nonatomic) IBOutlet UISegmentedControl *slidableSelector; + @property (weak, nonatomic) IBOutlet UIStackView *widgetPanelStack; diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index daf986fd..6aeacd25 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -123,6 +123,7 @@ widgetView.trackballDecelerationRate = buttonState.decelerationRate; widgetView.stickIndicatorOffset = buttonState.stickIndicatorOffset; widgetView.minStickOffset = buttonState.minStickOffset; + widgetView.isSlidable = buttonState.isSlidable; // Add the widgetView to the view controller's view [self.view insertSubview:widgetView belowSubview:self.widgetPanelStack]; buttonState.position = [self denormalizeWidgetPosition:buttonState.position]; @@ -634,6 +635,7 @@ newWidget.minStickOffset = [widgetInitParams[@"minStickOffsetString"] floatValue]; [newWidget setVibrationWithStyle:widget.vibrationStyle]; newWidget.mouseButtonAction = widget.mouseButtonAction; + newWidget.isSlidable = widget.isSlidable; [self.view insertSubview:newWidget belowSubview:self.widgetPanelStack]; if(createNew) [newWidget setLocationWithPosition:CGPointMake(90, 130)]; @@ -750,6 +752,9 @@ [self.widgetAlphaSlider setValue: self->selectedWidgetView.backgroundAlpha]; [self.widgetBorderWidthSlider setValue:self->selectedWidgetView.borderWidth]; + self.slidableStack.hidden = selectedWidgetView.widgetType != WidgetTypeEnumButton; + [self.slidableSelector setSelectedSegmentIndex:selectedWidgetView.isSlidable ? 0 : 1]; + bool showSensitivityFactorStack = selectedWidgetView.hasSensitivityTweak; bool showStickIndicatorOffsetStack = selectedWidgetView.hasStickIndicator; @@ -901,6 +906,12 @@ } } +- (void)slidableChanged:(UISegmentedControl* )sender{ + if(self->selectedWidgetView != nil && self->widgetViewSelected){ + selectedWidgetView.isSlidable = _slidableSelector.selectedSegmentIndex == 0; + } +} + - (void)vibrationStyleChanged:(UISegmentedControl* )sender{ bool vibraiontOn; if (@available(iOS 13.0, *)) { @@ -1046,13 +1057,18 @@ self.stickIndicatorOffsetLabel.text = [LocalizationHelper localizedStringForKey:@"Indicator Offset"]; self.stickIndicatorOffsetStack.hidden = YES; - [self.mouseButtonDownSelector addTarget:self action:@selector(mouseDownButtonChanged:) forControlEvents:(UIControlEventValueChanged)]; NSDictionary *whiteFontAttributes = @{ NSForegroundColorAttributeName: [UIColor whiteColor] }; + + [self.mouseButtonDownSelector addTarget:self action:@selector(mouseDownButtonChanged:) forControlEvents:(UIControlEventValueChanged)]; [self.mouseButtonDownSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal]; self.mouseDownButtonStack.hidden = YES; + [self.slidableSelector addTarget:self action:@selector(slidableChanged:) forControlEvents:(UIControlEventValueChanged)]; + [self.slidableSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal]; + self.slidableStack.hidden = YES; + if([self isIPhone]){ [self.vibrationStyleSelector addTarget:self action:@selector(vibrationStyleChanged:) forControlEvents:(UIControlEventValueChanged)]; diff --git a/VoidLink/ViewControllers/MainFrameViewController.m b/VoidLink/ViewControllers/MainFrameViewController.m index e779f008..e22244bd 100644 --- a/VoidLink/ViewControllers/MainFrameViewController.m +++ b/VoidLink/ViewControllers/MainFrameViewController.m @@ -1918,7 +1918,7 @@ static NSMutableSet* hostList; } - (void)updateHosts { - Log(LOG_I, @"Updating hosts %f", CACurrentMediaTime()); + // Log(LOG_I, @"Updating hosts %f", CACurrentMediaTime()); @synchronized (hostList) { // Sort the host list in alphabetical order NSArray* sortedHostList = [[hostList allObjects] sortedArrayUsingSelector:@selector(compareName:)]; diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings index 44f9e595..e34f2f13 100644 --- a/VoidLink/mul.lproj/iPad.xcstrings +++ b/VoidLink/mul.lproj/iPad.xcstrings @@ -1051,6 +1051,66 @@ } } }, + "cKS-fy-Zpg.segmentTitles[0]" : { + "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[0] = \"yes\"; ObjectID = \"cKS-fy-Zpg\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "yes" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开启" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "開啟" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "開啟" + } + } + } + }, + "cKS-fy-Zpg.segmentTitles[1]" : { + "comment" : "Class = \"UISegmentedControl\"; cKS-fy-Zpg.segmentTitles[1] = \"no\"; ObjectID = \"cKS-fy-Zpg\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "no" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "關閉" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "關閉" + } + } + } + }, "CpY-Sb-BDc.title" : { "comment" : "Class = \"UIBarButtonItem\"; title = \"Import\"; ObjectID = \"CpY-Sb-BDc\";", "extractionState" : "extracted_with_value", @@ -1141,6 +1201,18 @@ } } }, + "dOF-FW-cBU.text" : { + "comment" : "Class = \"UILabel\"; text = \" \"; ObjectID = \"dOF-FW-cBU\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : " " + } + } + } + }, "dpd-Bw-aHE.segmentTitles[0]" : { "comment" : "Class = \"UISegmentedControl\"; dpd-Bw-aHE.segmentTitles[0] = \"No\"; ObjectID = \"dpd-Bw-aHE\";", "extractionState" : "stale", @@ -2737,6 +2809,36 @@ } } }, + "qNQ-fB-jhY.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide Activated\"; ObjectID = \"qNQ-fB-jhY\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide Activated" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动触发" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動觸發" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動觸發" + } + } + } + }, "Qs9-iS-YoW.text" : { "comment" : "Class = \"UILabel\"; text = \"Divider Position\"; ObjectID = \"Qs9-iS-YoW\";", "extractionState" : "extracted_with_value", diff --git a/VoidLink/mul.lproj/iPhone.xcstrings b/VoidLink/mul.lproj/iPhone.xcstrings index 32b2c72c..ab75408c 100644 --- a/VoidLink/mul.lproj/iPhone.xcstrings +++ b/VoidLink/mul.lproj/iPhone.xcstrings @@ -1783,6 +1783,18 @@ } } }, + "KZ3-vJ-E8J.text" : { + "comment" : "Class = \"UILabel\"; text = \" \"; ObjectID = \"KZ3-vJ-E8J\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : " " + } + } + } + }, "lwy-Nu-hQj.text" : { "comment" : "Class = \"UILabel\"; text = \"External Display Mode\"; ObjectID = \"lwy-Nu-hQj\";", "extractionState" : "extracted_with_value", @@ -1975,6 +1987,36 @@ } } }, + "o9I-Gt-YRd.text" : { + "comment" : "Class = \"UILabel\"; text = \"Slide Activated\"; ObjectID = \"o9I-Gt-YRd\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Slide Activated" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑动触发" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動觸發" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑動觸發" + } + } + } + }, "oBs-zz-ZQv.segmentTitles[0]" : { "comment" : "Class = \"UISegmentedControl\"; oBs-zz-ZQv.segmentTitles[0] = \"Slide From Left Edge\"; ObjectID = \"oBs-zz-ZQv\";", "extractionState" : "extracted_with_value", @@ -2035,6 +2077,66 @@ } } }, + "ojp-aS-m8w.segmentTitles[0]" : { + "comment" : "Class = \"UISegmentedControl\"; ojp-aS-m8w.segmentTitles[0] = \"yes\"; ObjectID = \"ojp-aS-m8w\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "yes" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开启" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "開啟" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "開啟" + } + } + } + }, + "ojp-aS-m8w.segmentTitles[1]" : { + "comment" : "Class = \"UISegmentedControl\"; ojp-aS-m8w.segmentTitles[1] = \"no\"; ObjectID = \"ojp-aS-m8w\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "no" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "關閉" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "關閉" + } + } + } + }, "ozU-7C-qKE.text" : { "comment" : "Class = \"UILabel\"; text = \"Button Down\"; ObjectID = \"ozU-7C-qKE\";", "extractionState" : "extracted_with_value",