feat: hover mode selector

This commit is contained in:
True Zhuanjia
2026-02-26 17:18:21 +08:00
parent 2bc18e2f02
commit 49b03e65b2
10 changed files with 257 additions and 67 deletions
+20 -14
View File
@@ -2088,24 +2088,30 @@
<constraint firstAttribute="height" constant="31" id="Olu-X2-Rc1"/>
</constraints>
</stackView>
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="OBt-d7-mew">
<rect key="frame" x="3145" y="426" width="279.5" height="31"/>
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="WtH-Ii-ZUv">
<rect key="frame" x="3145" y="426" width="380" height="56.5"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Disable Hovering" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.64999997615814209" adjustsLetterSpacingToFitWidth="YES" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q78-aY-mIe" userLabel="uiLabel">
<rect key="frame" x="0.0" y="0.0" width="129.5" height="31"/>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hover Mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DhB-EF-mDt">
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<color key="textColor" red="0.93902439019999995" green="0.9625305918" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hOj-4u-Swl">
<rect key="frame" x="149.5" y="0.0" width="132" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="130" id="Akr-jH-mSd"/>
</constraints>
</switch>
<segmentedControl verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="t12-bo-icS">
<rect key="frame" x="0.0" y="25.5" width="380" height="32"/>
<segments>
<segment title="Disabled"/>
<segment title="Pencil"/>
<segment title="Mouse"/>
<segment title="Both"/>
</segments>
<color key="tintColor" red="0.6716768742" green="0.61711704730000005" blue="0.99902987480000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="selectedSegmentTintColor" systemColor="linkColor"/>
</segmentedControl>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="31" id="pOK-3B-UtZ"/>
<constraint firstAttribute="height" constant="56.5" id="YUg-QH-BXv"/>
<constraint firstAttribute="width" constant="380" id="n3K-F6-rQ2"/>
</constraints>
</stackView>
</subviews>
@@ -2123,8 +2129,6 @@
<outlet property="audioEngineStack" destination="scn-bo-PfV" id="tP0-YG-e8V"/>
<outlet property="audioOnPcStack" destination="Bbr-Wj-Z75" id="c2K-3R-whg"/>
<outlet property="audioOnPcSwitch" destination="81a-Jw-eV9" id="Oig-tg-V1I"/>
<outlet property="autoHoverTerminationStack" destination="OBt-d7-mew" id="wI7-Y6-XY9"/>
<outlet property="autoHoverTerminationSwitch" destination="hOj-4u-Swl" id="OTR-I9-gSB"/>
<outlet property="backgroundSessionTimerSlider" destination="lRU-fd-AsU" id="oRL-1o-xNh"/>
<outlet property="backgroundSessionTimerStack" destination="z5W-q6-Y1z" id="2MJ-Y7-uui"/>
<outlet property="bitrateLabel" destination="lMt-4H-fkV" id="mpE-bW-R48"/>
@@ -2188,6 +2192,8 @@
<outlet property="hapticEngineStack" destination="MUp-Hc-VgH" id="XuW-ww-cmv"/>
<outlet property="hdrStack" destination="dH7-Sy-EdJ" id="cJm-bj-Aqo"/>
<outlet property="hdrSwitch" destination="wIq-fF-X8l" id="Ozz-h0-nJL"/>
<outlet property="hoverModeSelector" destination="t12-bo-icS" id="0d6-QD-Mtg"/>
<outlet property="hoverModeStack" destination="WtH-Ii-ZUv" id="BvA-MP-rmE"/>
<outlet property="leftClickDelaySlider" destination="Mh4-1P-bSv" id="Tbj-Y0-t1x"/>
<outlet property="leftClickDelayStack" destination="q0S-CP-V6v" id="0lz-MN-OEb"/>
<outlet property="leftStickMinOffsetSlider" destination="KtJ-qH-KJX" id="vIV-4l-gbA"/>
+10 -1
View File
@@ -22,6 +22,14 @@ typedef NS_ENUM(NSInteger, MapGyroTo) {
driftCorrection
};
typedef NS_ENUM(NSInteger, PencilHoverMode) {
HoverDisabled,
HoverPencil,
HoverMouse,
HoverBoth
};
/**
This object contains information pertaining to any of the user created, custom on screen controller layout configurations, or 'profiles.' The object contains a 'name' property for easy reference, as well as an 'isSelected' property which is used to determine whether this particular custom OSC layout should show on screen during game stream view. Only one 'OSCProfile' is set to 'isSelected' at any given time. The object also contains an array of 'OnScreenButtonStates' which provides information that allows us to move and hide/unhide each of the 19 on screen buttons. Note that the 'buttonStates' property should contain an NSMutableArray of ENCODED 'OnScreenButtonState' objects. This allows us to save the 'OSCProfile' object to NSUserDefaults.
Additionally the 'OSCProfile' object adopts encoding and decoding protocols so that we can encode the object before saving it to NSUserDefaults. By saving this object to NSUserDefaults we allow the user to save and load their custom on screen controller button layouts between app launches
@@ -58,9 +66,10 @@ typedef NS_ENUM(NSInteger, MapGyroTo) {
@property (nonatomic, assign) bool squeezeShorcutEnabled;
@property NSString *squeezeStartShortcut;
@property NSString *squeezeEndShortcut;
@property (nonatomic, assign) bool autoPencilHoverTermination;
@property (nonatomic, assign) bool pencilPausesNativeTouch;
@property (nonatomic, assign) bool disablePencilSlideGestures;
@property (nonatomic, assign) PencilHoverMode pencilHoverMode;
- (id) initWithName:(NSString*)name buttonStates:(NSMutableArray*)buttonStates isSelected:(BOOL)isSelected;
+3 -3
View File
@@ -59,9 +59,9 @@
[encoder encodeBool:self.squeezeShorcutEnabled forKey:@"squeezeShorcutEnabled"];
[encoder encodeObject:self.squeezeStartShortcut forKey:@"squeezeStartShortcut"];
[encoder encodeObject:self.squeezeEndShortcut forKey:@"squeezeEndShortcut"];
[encoder encodeBool:self.autoPencilHoverTermination forKey:@"autoPencilHoverTermination"];
[encoder encodeBool:self.pencilPausesNativeTouch forKey:@"pencilPausesNativeTouch"];
[encoder encodeBool:self.disablePencilSlideGestures forKey:@"disablePencilSlideGestures"];
[encoder encodeInt64:self.pencilHoverMode forKey:@"pencilHoverMode"];
}
- (id) initWithCoder:(NSCoder*)decoder {
@@ -159,7 +159,7 @@
self.pencilPausesNativeTouch = [decoder containsValueForKey:@"pencilPausesNativeTouch"] ? [decoder decodeBoolForKey:@"pencilPausesNativeTouch"] : false;
self.disablePencilSlideGestures = [decoder containsValueForKey:@"disablePencilSlideGestures"] ? [decoder decodeBoolForKey:@"disablePencilSlideGestures"] : false;
self.autoPencilHoverTermination = [decoder containsValueForKey:@"autoPencilHoverTermination"] ? [decoder decodeBoolForKey:@"autoPencilHoverTermination"] : false;
self.pencilHoverMode = [decoder containsValueForKey:@"pencilHoverMode"] ? [decoder decodeInt64ForKey:@"pencilHoverMode"] : HoverPencil;
}
return self;
@@ -199,7 +199,7 @@
copy.squeezeEndShortcut = [self.squeezeEndShortcut mutableCopy]; // NSString → NSMutableString
copy.pencilPausesNativeTouch = self.pencilPausesNativeTouch;
copy.disablePencilSlideGestures = self.disablePencilSlideGestures;
copy.autoPencilHoverTermination = self.autoPencilHoverTermination;
copy.pencilHoverMode = self.pencilHoverMode;
return copy;
}
+6 -4
View File
@@ -23,7 +23,8 @@ import UIKit
private var pressureCurveEnabled: Bool = false
private var manualHoverFlag: Bool = false
@objc static var hoverSupported: Bool = false
@objc static private(set) var autoHoverTermination: Bool = false
// @objc static private(set) var autoHoverTermination: Bool = false
@objc static private(set) var hoverMode: PencilHoverMode = .HoverPencil
private(set) var pencilProEnabled: Bool = false
private var isFirstMove: Bool = false
private var moveEventIndex: Int64 = 0
@@ -78,7 +79,8 @@ import UIKit
print("squeezeShorcutEnabled \(CACurrentMediaTime())")
}
PencilHandler.autoHoverTermination = selectedProfile.autoPencilHoverTermination
// PencilHandler.autoHoverTermination = selectedProfile.autoPencilHoverTermination
PencilHandler.hoverMode = selectedProfile.pencilHoverMode
pressureCurveEnabled = selectedProfile.pressureCurveEnabled
@@ -227,7 +229,7 @@ import UIKit
eventType = UInt8(LI_TOUCH_EVENT_MOVE)
}
delay = manualTick ? 0.0086 : 0
delay = manualTick ? 0.0086 : 0.0086
delay = eventType == UInt8(LI_TOUCH_EVENT_UP) ? delay : 0
if previousTimeStamp == 0 {
@@ -252,7 +254,7 @@ import UIKit
if eventType == UInt8(LI_TOUCH_EVENT_UP) {
PencilHandler.isDrawing = false
if PencilHandler.autoHoverTermination || !PencilHandler.hoverSupported {
if PencilHandler.hoverMode == .HoverDisabled || !PencilHandler.hoverSupported {
LiSendPenEvent(UInt8(LI_TOUCH_EVENT_HOVER), UInt8(LI_TOOL_TYPE_PEN), 0, Float(normalizedLocation.x), Float(normalizedLocation.y), 0, 0, 0, self.getRotation(fromAzimuthAngle: Float(azimuth)), self.getTilt(fromAltitudeAngle: Float(altitude)))
DispatchQueue.global().asyncAfter(deadline: .now() + 0.0086){
if !PencilHandler.isDrawing {
+28 -4
View File
@@ -213,6 +213,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
isPencilHovering = false;
}
#if defined(__IPHONE_16_1) || defined(__TVOS_16_1)
if (@available(iOS 16.1, *)) {
UIHoverGestureRecognizer *stylusHoverRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(sendStylusHoverEvent:)];
@@ -796,17 +797,20 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
- (void)sendStylusHoverEvent:(UIHoverGestureRecognizer*)gesture API_AVAILABLE(ios(13.0)) {
uint8_t type;
switch (gesture.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
type = LI_TOUCH_EVENT_HOVER;
isPencilHovering = true;
if(!PencilHandler.hoverSupported) PencilHandler.hoverSupported = true;
// if(gesture.state == UIGestureRecognizerStateChanged) NSLog(@"UIGestureRecognizerStateChanged %f", CACurrentMediaTime());
break;
case UIGestureRecognizerStateEnded:
type = LI_TOUCH_EVENT_HOVER_LEAVE;
// NSLog(@"UIGestureRecognizerStateEnded %f", CACurrentMediaTime());
break;
default:
return;
@@ -838,8 +842,25 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
}
#endif
if(!PencilHandler.autoHoverTermination) LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height,
distance, 0.0f, 0.0f, rotationAngle, tiltAngle);
dispatch_after(0, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE,0), ^{// Code to execute after the delay
if(PencilHandler.isDrawing) return;
switch (PencilHandler.hoverMode) {
case HoverPencil:
LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, distance, 0.0f, 0.0f, rotationAngle, tiltAngle);
break;
case HoverMouse:
[self updateCursorLocation:location isMouse:YES];
break;
case HoverDisabled:
break;
case HoverBoth:
LiSendPenEvent(type, LI_TOOL_TYPE_PEN, 0, location.x / videoSize.width, location.y / videoSize.height, distance, 0.0f, 0.0f, rotationAngle, tiltAngle);
[self updateCursorLocation:location isMouse:YES];
default:
break;
}
});
}
#endif
@@ -1225,7 +1246,10 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
// Move the cursor on the host if no buttons are pressed.
// Motion with buttons pressed in handled in touchesMoved:
if (lastMouseButtonMask == 0) {
if(!isPencilHovering) [self updateCursorLocation:request.location isMouse:YES];
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.001 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE,0), ^{
if(!self->isPencilHovering) [self updateCursorLocation:request.location isMouse:YES];
});
}
// The pointer interaction should cover the video region only
@@ -102,7 +102,7 @@
<attribute name="statsOverlayLevel" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
<attribute name="swapABXYButtons" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
<attribute name="touchMode" optional="YES" attributeType="Integer 16" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
<attribute name="touchMoveEventInterval" optional="YES" attributeType="Integer 16" defaultValueString="320" usesScalarValueType="NO" syncable="YES"/>
<attribute name="touchMoveEventInterval" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
<attribute name="touchPointerVelocityFactor" optional="YES" attributeType="Float" defaultValueString="1" usesScalarValueType="NO" syncable="YES"/>
<attribute name="touchPointTracking" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
<attribute name="uniqueId" attributeType="String" syncable="YES"/>
+29 -29
View File
@@ -1594,35 +1594,6 @@
}
}
},
"autoHoverTerminationStackTip" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Resolves compatibility issues with certain PC software (such as SAI2) that cannot function properly without hover state."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "用于解决部分PC软件(如SAI2)没有悬浮状态则无法正常使用的问题。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "此功能用於解決部分 PC 軟體(例如 SAI2)在沒有懸浮狀態時無法正常使用的問題。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "此功能用於解決部分 PC 軟體(例如 SAI2)在沒有懸浮狀態時無法正常使用的問題。"
}
}
}
},
"Autotap timer " : {
"extractionState" : "manual",
"localizations" : {
@@ -4084,6 +4055,35 @@
}
}
},
"hoverModeStackTip" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "When “both” is selected, you’ll get flickering cursor on host.\nThis is not a Pencil Pro Pack function."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "当选择“同时悬停”时,PC端的光标将会闪烁。\n此功能是Pencil基础功能的一部分,不属于Pencil Pro Pack。 "
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "當選擇「同時懸停」時,PC 端的游標將會閃爍。\n此功能為 Pencil 基礎功能的一部分,不屬於 Pencil Pro Pack。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "當選擇「同時懸停」時,PC 端的游標將會閃爍。\n此功能為 Pencil 基礎功能的一部分,不屬於 Pencil Pro Pack。"
}
}
}
},
"Important Tips" : {
"extractionState" : "manual",
"localizations" : {
@@ -281,8 +281,9 @@
@property (weak, nonatomic) IBOutlet UIStackView *disablePencilSlideGestureStack;
@property (weak, nonatomic) IBOutlet UISwitch *disablePencilSlideGestureSwitch;
@property (weak, nonatomic) IBOutlet UIStackView *autoHoverTerminationStack;
@property (weak, nonatomic) IBOutlet UISwitch *autoHoverTerminationSwitch;
@property (weak, nonatomic) IBOutlet UIStackView *hoverModeStack;
@property (weak, nonatomic) IBOutlet UISegmentedControl *hoverModeSelector;
#pragma clang diagnostic push
@@ -395,7 +395,7 @@ BOOL isCustomResolution(int resolutionSelected) {
[self.squeezeShortcutSwitch setOn:oscProfile.squeezeShorcutEnabled];
[self.pencilPausesNativeTouchSwitch setOn:oscProfile.pencilPausesNativeTouch];
[self.disablePencilSlideGestureSwitch setOn:oscProfile.disablePencilSlideGestures];
[self.autoHoverTerminationSwitch setOn:oscProfile.autoPencilHoverTermination];
self.hoverModeSelector.selectedSegmentIndex = oscProfile.pencilHoverMode;
}
- (void)saveGameProfileConfigs{
@@ -421,7 +421,7 @@ BOOL isCustomResolution(int resolutionSelected) {
&& oscProfile.squeezeShorcutEnabled == self.squeezeShortcutSwitch.isOn
&& oscProfile.pencilPausesNativeTouch == self.pencilPausesNativeTouchSwitch.isOn
&& oscProfile.disablePencilSlideGestures == self.disablePencilSlideGestureSwitch.isOn
&& oscProfile.autoPencilHoverTermination == self.autoHoverTerminationSwitch.isOn
&& oscProfile.pencilHoverMode == self.hoverModeSelector.selectedSegmentIndex
);
if(!configNotChanged){
@@ -443,7 +443,7 @@ BOOL isCustomResolution(int resolutionSelected) {
oscProfile.squeezeShorcutEnabled = self.squeezeShortcutSwitch.isOn;
oscProfile.pencilPausesNativeTouch = self.pencilPausesNativeTouchSwitch.isOn;
oscProfile.disablePencilSlideGestures = self.disablePencilSlideGestureSwitch.isOn;
oscProfile.autoPencilHoverTermination = self.autoHoverTerminationSwitch.isOn;
oscProfile.pencilHoverMode = self.hoverModeSelector.selectedSegmentIndex;
[oscProfileMan replaceSelectedProfileWith:oscProfile overwriteDefault:YES];
if(PencilHandler.shared) [PencilHandler.shared setupPressureLUTWithProfile:oscProfile];
}
@@ -889,7 +889,7 @@ BOOL isCustomResolution(int resolutionSelected) {
[self addSetting:self.pressureCurveStack ofId:@"pressureCurveStack" withInfoTag:NO withDynamicLabel:NO to:pencilSection];
[self addSetting:self.doubleTapShortcutStack ofId:@"doubleTapShortcutStack" withInfoTag:YES withDynamicLabel:NO to:pencilSection];
[self addSetting:self.squeezeShortcutStack ofId:@"squeezeShortcutStack" withInfoTag:YES withDynamicLabel:NO to:pencilSection];
[self addSetting:self.autoHoverTerminationStack ofId:@"autoHoverTerminationStack" withInfoTag:NO withDynamicLabel:NO to:pencilSection];
[self addSetting:self.hoverModeStack ofId:@"hoverModeStack" withInfoTag:YES withDynamicLabel:NO to:pencilSection];
[self addSetting:self.pencilPausesNativeTouchStack ofId:@"pencilPausesNativeTouchStack" withInfoTag:NO withDynamicLabel:NO to:pencilSection];
[self addSetting:self.disablePencilSlideGestureStack ofId:@"disablePencilSlideGestureStack" withInfoTag:NO withDynamicLabel:NO to:pencilSection];
[pencilSection addToParentStack:_parentStack];
@@ -1525,8 +1525,8 @@ BOOL isCustomResolution(int resolutionSelected) {
tipText = [LocalizationHelper localizedStringForKey:@"asyncFrameDequeueStackTip"];
showOnlineDocAction = false;
}
if([sender.superview.accessibilityIdentifier isEqualToString: @"autoHoverTerminationStack"]){
tipText = [LocalizationHelper localizedStringForKey:@"autoHoverTerminationStackTip"];
if([sender.superview.accessibilityIdentifier isEqualToString: @"hoverModeStack"]){
tipText = [LocalizationHelper localizedStringForKey:@"hoverModeStackTip"];
showOnlineDocAction = false;
}
@@ -3034,7 +3034,6 @@ BOOL isCustomResolution(int resolutionSelected) {
[[NSUserDefaults standardUserDefaults] synchronize];
NSInteger fps = [self getChosenFrameRate];
[self.touchMoveEventIntervalSlider setValue: fps>60 ? 1/((CGFloat)fps)*0.5*1000000-1500 : 3530];
[self touchMoveEventIntervalSliderMoved:self.touchMoveEventIntervalSlider];
[self updateBitrate];
}
@@ -3447,7 +3446,6 @@ BOOL isCustomResolution(int resolutionSelected) {
[self.squeezeShortcutSwitch setOn:false];
[self.pencilPausesNativeTouchSwitch setOn:false];
[self.disablePencilSlideGestureSwitch setOn:false];
[self.autoHoverTerminationSwitch setOn:false];
NSNumber *value = notification.userInfo[@"interruption"];
+151 -1
View File
@@ -2257,6 +2257,36 @@
}
}
},
"DhB-EF-mDt.text" : {
"comment" : "Class = \"UILabel\"; text = \"Hover Mode\"; ObjectID = \"DhB-EF-mDt\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Hover Mode"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "悬停模式"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "懸停模式"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "懸停模式"
}
}
}
},
"dOF-FW-cBU.text" : {
"comment" : "Class = \"UILabel\"; text = \" \"; ObjectID = \"dOF-FW-cBU\";",
"extractionState" : "extracted_with_value",
@@ -4749,7 +4779,7 @@
},
"q78-aY-mIe.text" : {
"comment" : "Class = \"UILabel\"; text = \"Disable Hovering\"; ObjectID = \"q78-aY-mIe\";",
"extractionState" : "extracted_with_value",
"extractionState" : "stale",
"localizations" : {
"en" : {
"stringUnit" : {
@@ -5293,6 +5323,126 @@
}
}
},
"t12-bo-icS.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; t12-bo-icS.segmentTitles[0] = \"Disabled\"; ObjectID = \"t12-bo-icS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Disabled"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "关闭"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "關閉"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "關閉"
}
}
}
},
"t12-bo-icS.segmentTitles[1]" : {
"comment" : "Class = \"UISegmentedControl\"; t12-bo-icS.segmentTitles[1] = \"Pencil\"; ObjectID = \"t12-bo-icS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Pencil"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencil"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencil"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "Pencil"
}
}
}
},
"t12-bo-icS.segmentTitles[2]" : {
"comment" : "Class = \"UISegmentedControl\"; t12-bo-icS.segmentTitles[2] = \"Mouse\"; ObjectID = \"t12-bo-icS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Mouse"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "鼠标"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "滑鼠"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "滑鼠"
}
}
}
},
"t12-bo-icS.segmentTitles[3]" : {
"comment" : "Class = \"UISegmentedControl\"; t12-bo-icS.segmentTitles[3] = \"Both\"; ObjectID = \"t12-bo-icS\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Both"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "同时悬停"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "同時懸停"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "同時懸停"
}
}
}
},
"tAd-bm-2IO.text" : {
"comment" : "Class = \"UILabel\"; text = \"Local Mouse Pointer\"; ObjectID = \"tAd-bm-2IO\";",
"extractionState" : "extracted_with_value",