feat: on-screen button auto tap repeats

This commit is contained in:
True Zhuanjia
2026-05-21 17:54:29 +08:00
parent bb44b2067e
commit 843570dbca
11 changed files with 417 additions and 249 deletions
+25 -6
View File
@@ -2748,8 +2748,26 @@
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" alpha="0.77000000000000002" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="yLM-jp-jMl">
<rect key="frame" x="105" y="0.0" width="545" height="34"/>
<rect key="frame" x="105" y="0.0" width="350" height="34"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="350" id="ipN-en-gmD"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Repeats" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iiK-9g-N5s">
<rect key="frame" x="455" y="0.0" width="86" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="86" id="QAo-Xh-fHl"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="nm3-To-lZo">
<rect key="frame" x="541" y="0.0" width="109" height="34"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
@@ -3718,6 +3736,7 @@
<outlet property="autoDockTimerStack" destination="ASP-yY-swx" id="rpi-Kn-8xH"/>
<outlet property="autoTapField" destination="yLM-jp-jMl" id="t0v-tj-IZ3"/>
<outlet property="autoTapLabel" destination="And-W9-9NR" id="r5A-4a-XZP"/>
<outlet property="autoTapRepeatsField" destination="nm3-To-lZo" id="R4r-5w-aZH"/>
<outlet property="autoTapStack" destination="e4b-0v-36Z" id="PZd-KE-lPb"/>
<outlet property="borderWidthAlphaStack" destination="9ZS-28-txW" id="qxV-2E-g8m"/>
<outlet property="bulkAlphaLabel" destination="yF0-Tu-L8X" id="Z1J-vy-z4i"/>
@@ -3939,22 +3958,22 @@
<image name="tray.full.fill" catalog="system" width="128" height="88"/>
<image name="video.and.waveform" catalog="system" width="128" height="94"/>
<systemColor name="linkColor">
<color red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemBrownColor">
<color red="0.63529411759999999" green="0.51764705879999995" blue="0.36862745099999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.67450980392156867" green="0.49803921568627452" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemGray3Color">
<color red="0.78039215689999997" green="0.78039215689999997" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.7803921568627451" green="0.7803921568627451" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemGray5Color">
<color red="0.8980392157" green="0.8980392157" blue="0.91764705879999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.89803921568627454" green="0.89803921568627454" blue="0.91764705882352937" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemTealColor">
<color red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.0" green="0.76470588235294112" blue="0.81568627450980391" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
+29 -10
View File
@@ -155,10 +155,10 @@
<rect key="frame" x="515" y="190" width="410" height="45"/>
<subviews>
<stackView opaque="NO" contentMode="scaleAspectFill" distribution="fillEqually" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="4he-pe-kYB">
<rect key="frame" x="0.0" y="-2.5" width="1300" height="50"/>
<rect key="frame" x="0.0" y="-2.5" width="410" height="50"/>
<subviews>
<button opaque="NO" tag="40" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="fill" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="nHH-6h-4D1" userLabel="Exit">
<rect key="frame" x="0.0" y="9.5" width="177" height="31"/>
<rect key="frame" x="0.0" y="9.5" width="50" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="sBF-hd-nF8"/>
</constraints>
@@ -174,7 +174,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pdg-l4-BvF" userLabel="Undo">
<rect key="frame" x="187" y="0.0" width="177.5" height="50"/>
<rect key="frame" x="60" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="7KW-Xe-OEK"/>
<constraint firstAttribute="width" constant="50" id="gHD-A0-AVS"/>
@@ -191,7 +191,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rXW-Ms-2cJ" userLabel="Load">
<rect key="frame" x="374.5" y="0.0" width="177" height="50"/>
<rect key="frame" x="120" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="91g-27-mVH"/>
<constraint firstAttribute="height" constant="50" id="kRj-b6-Bx1"/>
@@ -207,7 +207,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LPA-ea-YHC" userLabel="Save">
<rect key="frame" x="561.5" y="0.0" width="177" height="50"/>
<rect key="frame" x="180" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="Lot-pn-o60"/>
<constraint firstAttribute="height" constant="50" id="uWO-So-qxr"/>
@@ -223,7 +223,7 @@
</connections>
</button>
<button opaque="NO" tag="20" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dhG-Fo-0GK" userLabel="Trash">
<rect key="frame" x="748.5" y="0.0" width="177" height="50"/>
<rect key="frame" x="240" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="0vV-wV-Efz"/>
<constraint firstAttribute="width" constant="50" id="j9W-Ja-bVn"/>
@@ -239,7 +239,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Up4-28-sgF" userLabel="Add">
<rect key="frame" x="935.5" y="0.0" width="177.5" height="50"/>
<rect key="frame" x="300" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="rWU-US-9dl"/>
<constraint firstAttribute="width" constant="50" id="wWj-wB-MRd"/>
@@ -254,7 +254,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4pE-po-Zn1" userLabel="Edit">
<rect key="frame" x="1123" y="0.0" width="177" height="50"/>
<rect key="frame" x="360" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="oFn-jm-orG"/>
<constraint firstAttribute="height" constant="50" id="sls-Vh-uxz"/>
@@ -273,7 +273,7 @@
</subviews>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Zll-IP-PFt" userLabel="Chevron View">
<rect key="frame" x="624" y="45" width="52" height="25"/>
<rect key="frame" x="179" y="45" width="52" height="25"/>
<subviews>
<imageView clipsSubviews="YES" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ChevronCompactUp" translatesAutoresizingMaskIntoConstraints="NO" id="76O-3K-aa8">
<rect key="frame" x="0.0" y="0.0" width="52" height="25"/>
@@ -351,7 +351,25 @@
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="DOu-sG-eRq">
<rect key="frame" x="90" y="0.0" width="460" height="20"/>
<rect key="frame" x="90" y="0.0" width="300" height="20"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="300" id="DAa-oe-M5S"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Repeats" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gSL-YJ-0ME" userLabel="autoTapLabel">
<rect key="frame" x="390" y="0.0" width="90" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="90" id="EUV-YB-ax6"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ROc-Na-NLt">
<rect key="frame" x="480" y="0.0" width="70" height="20"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
@@ -1377,6 +1395,7 @@
<outlet property="autoDockTimerStack" destination="BBR-0E-XE9" id="L9l-bR-MO4"/>
<outlet property="autoTapField" destination="DOu-sG-eRq" id="Ubj-og-ThW"/>
<outlet property="autoTapLabel" destination="IuG-44-1Je" id="YWb-0d-zbB"/>
<outlet property="autoTapRepeatsField" destination="ROc-Na-NLt" id="cPr-UQ-bK3"/>
<outlet property="autoTapStack" destination="tDJ-cy-BYU" id="moT-DJ-jwF"/>
<outlet property="borderWidthAlphaStack" destination="50p-sC-ObU" id="2Xq-p7-31z"/>
<outlet property="bulkAlphaLabel" destination="MgK-KI-3y7" id="CV9-VA-K3K"/>
@@ -470,6 +470,7 @@ static CGRect layoutViewBounds;
buttonState.borderWidth = widgetView.borderWidth;
buttonState.highlightSizeFactor = widgetView.highlightSizeFactor;
buttonState.autoTapInterval = widgetView.autoTapInterval;
buttonState.autoTapRepeats = widgetView.autoTapRepeats;
buttonState.vibrationStyle = widgetView.vibrationStyle;
buttonState.mouseButtonAction = widgetView.mouseButtonAction;
buttonState.animatesTransition = widgetView.animatesTransition;
@@ -66,6 +66,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, assign) uint8_t mouseButtonAction;
@property (nonatomic, assign) bool animatesTransition;
@property (nonatomic, assign) uint16_t autoTapInterval;
@property (nonatomic, assign) uint32_t autoTapRepeats;
@property (nonatomic, assign) uint8_t walkKeyActionType;
@property (nonatomic, assign) CGFloat walkKeyThreshold;
@@ -49,6 +49,7 @@
[encoder encodeBool:self.animatesTransition forKey:@"animatesTransition"];
[encoder encodeInt:self.buttonMode forKey:@"slideMode"]; // buttonMode: previously slideMode, keep it for consistency
[encoder encodeInt:self.autoTapInterval forKey:@"autoTapInterval"];
[encoder encodeInt:self.autoTapRepeats forKey:@"autoTapRepeats"];
[encoder encodeCGPoint:self.position forKey:@"position"];
[encoder encodeBool:self.isHidden forKey:@"isHidden"];
[encoder encodeFloat:self.widthFactor forKey:@"widthFactor"];
@@ -100,6 +101,7 @@
self.animatesTransition = [decoder containsValueForKey:@"animatesTransition"] ? [decoder decodeBoolForKey:@"animatesTransition"] : true;
self.buttonMode = [decoder containsValueForKey:@"slideMode"] ? [decoder decodeIntForKey:@"slideMode"] : 0;
self.autoTapInterval = [decoder containsValueForKey:@"autoTapInterval"] ? [decoder decodeIntForKey:@"autoTapInterval"] : 45;
self.autoTapRepeats = [decoder containsValueForKey:@"autoTapRepeats"] ? [decoder decodeIntForKey:@"autoTapRepeats"] : 0;
self.position = [decoder decodeCGPointForKey:@"position"];
self.isHidden = [decoder decodeBoolForKey:@"isHidden"];
self.widthFactor = [decoder decodeFloatForKey:@"widthFactor"];
+12
View File
@@ -194,6 +194,8 @@ import ObjectiveC.runtime
//autoTapTimer
@objc public var autoTapInterval: Int = 49;
@objc public var autoTapRepeats: UInt32 = 0;
private var autoTapCount: UInt32 = 0;
private var autoTapTimer: SafeTimer?
private let appWindow: UIView
@@ -676,6 +678,15 @@ import ObjectiveC.runtime
if self.widgetType == WidgetTypeEnum.button, autoTapInterval >= OnScreenWidgetView.MinAutotapInterval {
self.autoTapTimer = SafeTimer(interval:0.001 * Double(autoTapInterval)) {
// print("timer instance \(Unmanaged.passUnretained(self.autoTapTimer!).toOpaque()), \(CACurrentMediaTime())")
if self.autoTapRepeats > 0 {
self.autoTapCount += 1
if self.autoTapCount >= self.autoTapRepeats {
self.autoTapTimer?.pause()
if self.buttonMode == .tapToToggle {
self.tapToToggleFlag = !self.tapToToggleFlag
}
}
}
self.handleButtonDown()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.025) {
self.handleButtonUp()
@@ -1580,6 +1591,7 @@ import ObjectiveC.runtime
handleButtonDown()
}
else{
self.autoTapCount = 0
self.autoTapTimer?.restart()
}
}
+1
View File
@@ -744,6 +744,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
widgetView.borderWidth = buttonState.borderWidth;
widgetView.highlightSizeFactor = buttonState.highlightSizeFactor;
widgetView.autoTapInterval = buttonState.autoTapInterval;
widgetView.autoTapRepeats = buttonState.autoTapRepeats;
[widgetView setVibrationWithStyle:buttonState.vibrationStyle];
widgetView.mouseButtonAction = buttonState.mouseButtonAction;
widgetView.animatesTransition = buttonState.animatesTransition;
+260 -231
View File
@@ -1985,6 +1985,29 @@
}
}
},
"0 - infinite" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 - 无限"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 - 無限"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "0 - 無限"
}
}
}
},
"A button with touchpad functionality will be created" : {
"extractionState" : "manual",
"localizations" : {
@@ -2549,6 +2572,35 @@
}
}
},
"autoTapTimerTip" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Min: 50ms. 0 - disable. ms(milliSec),s(sec),m(min). ⏎ save"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50ms, 输入0关闭. 单位: ms毫秒, s秒, m分钟. ⏎ 保存."
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50 ms, 輸入 0 關閉. 單位:ms 秒, s秒, m分鐘. ⏎ 儲存."
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50 ms, 輸入 0 關閉. 單位:ms 秒, s秒, m分鐘. ⏎ 儲存."
}
}
}
},
"Back" : {
"extractionState" : "manual",
"localizations" : {
@@ -7136,6 +7188,29 @@
}
}
},
"Insert trigger interval" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入觸發間隔"
}
}
}
},
"Interval of Multi-Touch Move Events: %d μs" : {
"extractionState" : "manual",
"localizations" : {
@@ -8087,6 +8162,52 @@
}
}
},
"Manually enter press duration in milliseconds" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动输入按压时长, 单位毫秒"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入按壓時長, 單位毫秒"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入按壓時長, 單位毫秒"
}
}
}
},
"Manually enter trigger interval in milliseconds" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动输入间隔,单位毫秒"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入間隔,單位毫秒"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入間隔,單位毫秒"
}
}
}
},
"Map controller to mouse" : {
"extractionState" : "manual",
"localizations" : {
@@ -8289,29 +8410,6 @@
}
}
},
"Minimum: 50ms. 0 to disable. ms(milliSec),s(sec),m(min). ⏎ to save" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50ms, 输入0关闭. 单位: ms毫秒, s秒, m分钟. 按 ⏎ 保存设定值."
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50 ms, 輸入 0 關閉. 單位:ms 秒, s秒, m分鐘. 按 ⏎ 儲存設定值."
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "最低: 50 ms, 輸入 0 關閉. 單位:ms 秒, s秒, m分鐘. 按 ⏎ 儲存設定值."
}
}
}
},
"ML_TEST_RESULT_INCONCLUSIVE" : {
"extractionState" : "manual",
"localizations" : {
@@ -8825,6 +8923,29 @@
}
}
},
"Not enough room to insert trigger interval slots" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "没有足够空间插入触发间隔格"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "沒有足夠空間插入觸發間隔格"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "沒有足夠空間插入觸發間隔格"
}
}
}
},
"Nothing to Undo" : {
"extractionState" : "manual",
"localizations" : {
@@ -10321,52 +10442,6 @@
}
}
},
"Manually enter press duration in milliseconds" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动输入按压时长, 单位毫秒"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入按壓時長, 單位毫秒"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入按壓時長, 單位毫秒"
}
}
}
},
"Manually enter trigger interval in milliseconds" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动输入间隔,单位毫秒"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入間隔,單位毫秒"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "手動輸入間隔,單位毫秒"
}
}
}
},
"Press the button for mouse left button" : {
"extractionState" : "manual",
"localizations" : {
@@ -11879,6 +11954,29 @@
}
}
},
"Select at least two button controls before inserting trigger intervals" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请至少先选择两个按钮型控件,再插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "請至少先選擇兩個按鈕型控制項,再插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "請至少先選擇兩個按鈕型控制項,再插入觸發間隔"
}
}
}
},
"Select brush shortcut keys" : {
"extractionState" : "manual",
"localizations" : {
@@ -12138,6 +12236,29 @@
}
}
},
"Set all" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "统一设置间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "統一設定間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "統一設定間隔"
}
}
}
},
"Set PC/Game resolution:" : {
"extractionState" : "manual",
"localizations" : {
@@ -12161,6 +12282,29 @@
}
}
},
"Set this" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "单独设置间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "單獨設定間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "單獨設定間隔"
}
}
}
},
"Settings" : {
"extractionState" : "manual",
"localizations" : {
@@ -13867,6 +14011,52 @@
}
}
},
"Trigger interval cannot be inserted when WASDPAD or ARROWPAD is in the pool" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 时,不能插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 時,不能插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 時,不能插入觸發間隔"
}
}
}
},
"Trigger interval slots are already inserted" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "触发间隔格已经插入"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "觸發間隔格已經插入"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "觸發間隔格已經插入"
}
}
}
},
"Tutorial" : {
"extractionState" : "manual",
"localizations" : {
@@ -14763,167 +14953,6 @@
}
}
},
"Insert trigger interval" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "插入觸發間隔"
}
}
}
},
"Not enough room to insert trigger interval slots" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "没有足够空间插入触发间隔格"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "沒有足夠空間插入觸發間隔格"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "沒有足夠空間插入觸發間隔格"
}
}
}
},
"Select at least two button controls before inserting trigger intervals" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请至少先选择两个按钮型控件,再插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "請至少先選擇兩個按鈕型控制項,再插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "請至少先選擇兩個按鈕型控制項,再插入觸發間隔"
}
}
}
},
"Set all" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "统一设置间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "統一設定間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "統一設定間隔"
}
}
}
},
"Set this" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "单独设置间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "單獨設定間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "單獨設定間隔"
}
}
}
},
"Trigger interval cannot be inserted when WASDPAD or ARROWPAD is in the pool" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 时,不能插入触发间隔"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 時,不能插入觸發間隔"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "池中存在 WASDPAD 或 ARROWPAD 時,不能插入觸發間隔"
}
}
}
},
"Trigger interval slots are already inserted" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "触发间隔格已经插入"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "觸發間隔格已經插入"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "觸發間隔格已經插入"
}
}
}
},
"Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection." : {
"extractionState" : "manual",
"localizations" : {
@@ -15010,4 +15039,4 @@
}
},
"version" : "1.1"
}
}
@@ -97,9 +97,12 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
@IBOutlet weak var mouseButtonDownSelector: UISegmentedControl!
@IBOutlet weak var buttonModeStack: UIStackView!
@IBOutlet weak var buttonModeSelector: UISegmentedControl!
@IBOutlet weak var autoTapStack: UIStackView!
@IBOutlet weak var autoTapLabel: UILabel!
@IBOutlet weak var autoTapField: UITextField!
@IBOutlet weak var autoTapRepeatsField: UITextField!
@IBOutlet weak var slideThresholdStack: UIStackView!
@IBOutlet weak var slideThresholdLabel: UILabel!
@IBOutlet weak var slideThresholdSlider: UISlider!
@@ -407,6 +410,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
widgetView.borderWidth = buttonState.borderWidth
widgetView.highlightSizeFactor = buttonState.highlightSizeFactor
widgetView.autoTapInterval = Int(buttonState.autoTapInterval)
widgetView.autoTapRepeats = UInt32(buttonState.autoTapRepeats)
widgetView.setVibration(style: Int(buttonState.vibrationStyle))
widgetView.mouseButtonAction = MouseButtonAction(rawValue: Int(buttonState.mouseButtonAction)) ?? .hovering
widgetView.animatesTransition = buttonState.animatesTransition
@@ -966,9 +970,18 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
autoTapField.textColor = .white
autoTapField.keyboardType = .numbersAndPunctuation
autoTapField.attributedPlaceholder = NSAttributedString(
string: LocalizationHelper.localizedString(forKey: "Minimum: 50ms. 0 to disable. ms(milliSec),s(sec),m(min). ⏎ to save"),
attributes: [.foregroundColor: UIColor.white.withAlphaComponent(0.77)]
string: LocalizationHelper.localizedString(forKey: "autoTapTimerTip"),
attributes: [.foregroundColor: UIColor.white.withAlphaComponent(0.77), .font: UIFont.systemFont(ofSize: 10)]
)
autoTapRepeatsField.text = widgetView.autoTapRepeats == 0 ? "∞" : "\(widgetView.autoTapRepeats)"
autoTapRepeatsField.textColor = .white
autoTapRepeatsField.keyboardType = .numbersAndPunctuation
autoTapRepeatsField.attributedPlaceholder = NSAttributedString(
string: LocalizationHelper.localizedString(forKey: "0 - infinite"),
attributes: [.foregroundColor: UIColor.white.withAlphaComponent(0.77), .font: UIFont.systemFont(ofSize: 10)]
)
autoFitLabel(autoTapLabel)
decelerationRateStack.isHidden = !widgetView.hasInertia
@@ -1220,6 +1233,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
newWidget.borderWidth = widget.borderWidth
newWidget.highlightSizeFactor = widget.highlightSizeFactor
newWidget.autoTapInterval = widget.autoTapInterval
newWidget.autoTapRepeats = widget.autoTapRepeats
newWidget.sensitivityFactorY = widget.sensitivityFactorY
newWidget.slideThreshold = widget.slideThreshold
newWidget.yawFactor = widget.yawFactor
@@ -1743,9 +1757,12 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
widgetBorderWidthLabel.isUserInteractionEnabled = true
widgetBorderWidthLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(switchBorderWidthSlider(_:))))
borderWidthAlphaStack.isHidden = true
autoTapLabel.text = LocalizationHelper.localizedString(forKey: "Autotap timer ")
autoTapField.delegate = self
autoTapRepeatsField.delegate = self
autoTapStack.isHidden = true
sensitivityXSlider.addTarget(self, action: #selector(sensitivityXSliderMoved(_:)), for: .valueChanged)
sensitivityXLabel.text = LocalizationHelper.localizedString(forKey: "SensitivityX")
sensitivityXStack.isHidden = true
@@ -1915,6 +1932,13 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
textField.resignFirstResponder()
selectedWidget?.setAutoTapIntervalByText(str: textField.text ?? "")
}
if textField == autoTapRepeatsField {
textField.resignFirstResponder()
if let repeats = UInt32(textField.text ?? "") {
selectedWidget?.autoTapRepeats = repeats
}
else {selectedWidget?.autoTapRepeats = 0}
}
return true
}
+30
View File
@@ -3620,6 +3620,36 @@
}
}
},
"iiK-9g-N5s.text" : {
"comment" : "Class = \"UILabel\"; text = \"Repeats\"; ObjectID = \"iiK-9g-N5s\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Repeats"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "循环次数"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環次數"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環次數"
}
}
}
},
"iPd-Ra-Lbl.text" : {
"comment" : "Class = \"UILabel\"; text = \"Full Color Range\"; ObjectID = \"iPd-Ra-Lbl\";",
"extractionState" : "extracted_with_value",
+30
View File
@@ -2677,6 +2677,36 @@
}
}
},
"gSL-YJ-0ME.text" : {
"comment" : "Class = \"UILabel\"; text = \"Repeats\"; ObjectID = \"gSL-YJ-0ME\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Repeats"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "循环次数"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環次數"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "循環次數"
}
}
}
},
"GX4-zV-pQ8.text" : {
"comment" : "Class = \"UILabel\"; text = \"Map Gyro to\"; ObjectID = \"GX4-zV-pQ8\";",
"extractionState" : "extracted_with_value",