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",