dpad improvements

This commit is contained in:
True Zhuanjia
2026-04-12 19:23:47 +08:00
parent f702f726b7
commit 7e088acd49
13 changed files with 1081 additions and 87 deletions
+115 -23
View File
@@ -2626,7 +2626,7 @@
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="z5Q-bW-WQ8" userLabel="widgetPanelStack" customClass="WidgetPanelStackView">
<rect key="frame" x="325" y="156" width="650" height="1238"/>
<rect key="frame" x="325" y="156" width="650" height="1313"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Profile:" textAlignment="center" lineBreakMode="tailTruncation" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iel-xl-xd9">
<rect key="frame" x="0.0" y="0.0" width="650" height="37"/>
@@ -2775,8 +2775,92 @@
</slider>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="z8w-zX-Xmc">
<rect key="frame" x="0.0" y="397" width="650" height="31"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sprint key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.60000002384185791" translatesAutoresizingMaskIntoConstraints="NO" id="5Uu-1K-ov7">
<rect key="frame" x="0.0" y="0.0" width="101" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="101" id="jg9-JV-u9v"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="3fM-1s-S0k">
<rect key="frame" x="106" y="0.0" width="180" height="32"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="f1j-OZ-q3h"/>
<constraint firstAttribute="width" constant="180" id="vXH-oV-uBC"/>
</constraints>
<segments>
<segment title="hold"/>
<segment title="toggle"/>
</segments>
<color key="tintColor" systemColor="systemGray3Color"/>
<color key="selectedSegmentTintColor" red="0.23087820410000001" green="0.4576539993" blue="0.51765710119999997" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</segmentedControl>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="v4J-ot-qpz">
<rect key="frame" x="291" y="0.0" width="150" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="150" id="hgO-wk-t09"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<slider verifyAmbiguity="off" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="SHS-fY-ty9">
<rect key="frame" x="446" y="0.0" width="204" height="31"/>
<color key="tintColor" red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
<color key="maximumTrackTintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</slider>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="3af-0X-kPi">
<rect key="frame" x="0.0" y="433" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Walk key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.60000002384185791" translatesAutoresizingMaskIntoConstraints="NO" id="eRk-iM-nN4">
<rect key="frame" x="0.0" y="0.0" width="101" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="101" id="Enr-gK-PgO"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="csH-cx-ZWH">
<rect key="frame" x="106" y="0.0" width="180" height="35"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="180" id="vQL-LV-c8B"/>
<constraint firstAttribute="height" constant="31" id="vlF-XM-RGs"/>
</constraints>
<segments>
<segment title="hold"/>
<segment title="toggle"/>
</segments>
<color key="tintColor" systemColor="systemGray3Color"/>
<color key="selectedSegmentTintColor" red="0.23087820410000001" green="0.4576539993" blue="0.51765710119999997" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</segmentedControl>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kex-PV-gvq">
<rect key="frame" x="291" y="0.0" width="150" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="150" id="0Ak-7J-S0R"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<slider verifyAmbiguity="off" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="iG0-3T-HsH">
<rect key="frame" x="446" y="0.0" width="204" height="34"/>
<color key="tintColor" red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
<color key="maximumTrackTintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</slider>
</subviews>
</stackView>
<stackView contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="zfD-bd-GEN" userLabel="stickIndicatorOffsetStack">
<rect key="frame" x="0.0" y="397" width="650" height="34"/>
<rect key="frame" x="0.0" y="472" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Stick Indicator" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.29999999999999999" translatesAutoresizingMaskIntoConstraints="NO" id="tG7-oX-P9b" userLabel="stickIndicatorOffsetLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2795,7 +2879,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="80D-qe-E5D" userLabel="sensitivityFactorXStack">
<rect key="frame" x="0.0" y="436" width="650" height="34"/>
<rect key="frame" x="0.0" y="511" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SensitivityX" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vJs-pg-hHe" userLabel="sensitivityFactorLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2814,7 +2898,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CT5-Ap-Gh0" userLabel="sensitivityFactorYStack">
<rect key="frame" x="0.0" y="475" width="650" height="34"/>
<rect key="frame" x="0.0" y="550" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SensitivityY" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NZO-BM-nef" userLabel="sensitivityFactorYLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2833,7 +2917,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aPm-vW-MUe">
<rect key="frame" x="0.0" y="514" width="650" height="34"/>
<rect key="frame" x="0.0" y="589" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qx4-KQ-j2T">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2852,7 +2936,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6eR-pT-3nu">
<rect key="frame" x="0.0" y="553" width="650" height="34"/>
<rect key="frame" x="0.0" y="628" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Walkmode threshold" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wil-pj-Gru">
<rect key="frame" x="0.0" y="0.0" width="195" height="34"/>
@@ -2871,7 +2955,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rsp-8X-8le">
<rect key="frame" x="0.0" y="592" width="650" height="34"/>
<rect key="frame" x="0.0" y="667" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minimum offset" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F1n-T2-jX6">
<rect key="frame" x="0.0" y="0.0" width="195" height="34"/>
@@ -2890,7 +2974,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2KY-v5-YJv" userLabel="yawFactorStack">
<rect key="frame" x="0.0" y="631" width="650" height="34"/>
<rect key="frame" x="0.0" y="706" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Yaw factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iZc-Xt-NaK" userLabel="yawFactorLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2909,7 +2993,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JNt-eT-HCs" userLabel="pitchFactorStack">
<rect key="frame" x="0.0" y="670" width="650" height="34"/>
<rect key="frame" x="0.0" y="745" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Pitch factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fq3-ie-8by" userLabel="pitchFactorLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2928,7 +3012,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zqk-Xa-Dku">
<rect key="frame" x="0.0" y="709" width="650" height="34"/>
<rect key="frame" x="0.0" y="784" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Roll factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="x9i-JN-FSn">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2947,7 +3031,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KXB-uJ-onx" userLabel="decelerationRateStack">
<rect key="frame" x="0.0" y="748" width="650" height="34"/>
<rect key="frame" x="0.0" y="823" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DecelerationRate" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pbt-Tw-dnV" userLabel="decelerationRateLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -2966,7 +3050,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GMQ-EQ-Hum" userLabel="mouseDownButtonStack">
<rect key="frame" x="0.0" y="787" width="650" height="31"/>
<rect key="frame" x="0.0" y="862" width="650" height="31"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Down button" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c1r-Hf-b7t" userLabel="mouseDownButtonLabel">
<rect key="frame" x="0.0" y="0.0" width="130" height="31"/>
@@ -2993,7 +3077,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LGW-oJ-5Zf" userLabel="buttonModeStack">
<rect key="frame" x="0.0" y="823" width="650" height="31"/>
<rect key="frame" x="0.0" y="898" width="650" height="31"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Button mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qNQ-fB-jhY" userLabel="uiLabel">
<rect key="frame" x="0.0" y="0.0" width="130" height="31"/>
@@ -3029,7 +3113,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KSh-xS-xfD">
<rect key="frame" x="0.0" y="859" width="650" height="34"/>
<rect key="frame" x="0.0" y="934" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yF0-Tu-L8X">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3051,7 +3135,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Wxc-0O-tca">
<rect key="frame" x="0.0" y="898" width="650" height="34"/>
<rect key="frame" x="0.0" y="973" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wTH-1Z-Fgh">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3073,7 +3157,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O0O-pZ-URe" userLabel="Bulk Label Alpha Stack">
<rect key="frame" x="0.0" y="937" width="650" height="34"/>
<rect key="frame" x="0.0" y="1012" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kSX-ci-kx5">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3095,7 +3179,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rfr-nL-OCc">
<rect key="frame" x="0.0" y="976" width="650" height="34"/>
<rect key="frame" x="0.0" y="1051" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sAF-Vy-ZzK">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3117,7 +3201,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="X7d-dV-lHa">
<rect key="frame" x="0.0" y="1015" width="650" height="34"/>
<rect key="frame" x="0.0" y="1090" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1sF-08-aCr">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3139,7 +3223,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nBA-Ii-jNy">
<rect key="frame" x="0.0" y="1054" width="650" height="34"/>
<rect key="frame" x="0.0" y="1129" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hKK-ro-C5E">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3161,7 +3245,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ASP-yY-swx">
<rect key="frame" x="0.0" y="1093" width="650" height="34"/>
<rect key="frame" x="0.0" y="1168" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Auto dock timer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KKW-Q7-0tg">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3183,7 +3267,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3dC-9Z-wKV">
<rect key="frame" x="0.0" y="1132" width="650" height="34"/>
<rect key="frame" x="0.0" y="1207" width="650" height="34"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Docked alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qFn-D7-7aD">
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
@@ -3205,7 +3289,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FEI-wQ-Q3w">
<rect key="frame" x="0.0" y="1171" width="650" height="31"/>
<rect key="frame" x="0.0" y="1246" width="650" height="31"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Collected widgets " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="WLg-7a-5wu" userLabel="uiLabel">
<rect key="frame" x="0.0" y="0.0" width="130" height="31"/>
@@ -3254,7 +3338,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="K9t-Ky-bWg">
<rect key="frame" x="0.0" y="1207" width="650" height="31"/>
<rect key="frame" x="0.0" y="1282" width="650" height="31"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aBW-x7-cFd">
<rect key="frame" x="0.0" y="0.0" width="330" height="31"/>
@@ -3513,6 +3597,10 @@
<outlet property="slideThresholdLabel" destination="qx4-KQ-j2T" id="lV7-I8-HkJ"/>
<outlet property="slideThresholdSlider" destination="2L3-5s-EQK" id="S7q-DZ-OLs"/>
<outlet property="slideThresholdStack" destination="aPm-vW-MUe" id="ah5-4T-s06"/>
<outlet property="sprintKeySelector" destination="3fM-1s-S0k" id="ogp-48-4oa"/>
<outlet property="sprintKeyStack" destination="z8w-zX-Xmc" id="tZ1-Yu-rew"/>
<outlet property="sprintKeyThresholdLabel" destination="v4J-ot-qpz" id="eww-w7-Zv0"/>
<outlet property="sprintKeyThresholdSlider" destination="SHS-fY-ty9" id="IQa-Id-7cC"/>
<outlet property="stickIndicatorOffsetLabel" destination="tG7-oX-P9b" id="jBx-ii-091"/>
<outlet property="stickIndicatorOffsetSlider" destination="aPX-7o-N3l" id="gLv-c3-3JG"/>
<outlet property="stickIndicatorOffsetStack" destination="zfD-bd-GEN" id="oeb-Vk-2mw"/>
@@ -3523,6 +3611,10 @@
<outlet property="toolbarTopConstraintiPad" destination="Ppb-J1-lXg" id="laN-Zh-lHm"/>
<outlet property="trashCanButton" destination="qJs-n8-eV7" id="ubK-qm-Cox"/>
<outlet property="undoButton" destination="F7X-l4-cl3" id="vAI-XQ-hZw"/>
<outlet property="walkKeySelector" destination="csH-cx-ZWH" id="rSO-Db-nff"/>
<outlet property="walkKeyStack" destination="3af-0X-kPi" id="bfG-hv-fYT"/>
<outlet property="walkKeyThresholdLabel" destination="kex-PV-gvq" id="SNz-A0-vGT"/>
<outlet property="walkKeyThresholdSlider" destination="iG0-3T-HsH" id="SoV-G8-bKE"/>
<outlet property="walkModeThresholdLabel" destination="Wil-pj-Gru" id="Sc1-oq-R0y"/>
<outlet property="walkModeThresholdSlider" destination="inm-e3-tvz" id="Qlz-15-hnm"/>
<outlet property="walkModeThresholdStack" destination="6eR-pT-3nu" id="l0o-r6-5mG"/>
+129 -28
View File
@@ -315,7 +315,7 @@
</constraints>
</view>
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="7" translatesAutoresizingMaskIntoConstraints="NO" id="BVp-3O-vZ7" userLabel="widgetPanelStack" customClass="WidgetPanelStackView">
<rect key="frame" x="375" y="132" width="550" height="1056"/>
<rect key="frame" x="375" y="132" width="550" height="1110"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Profile:" textAlignment="center" lineBreakMode="tailTruncation" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="f46-Pt-0Pv">
<rect key="frame" x="0.0" y="0.0" width="550" height="28"/>
@@ -479,8 +479,98 @@
<constraint firstAttribute="height" constant="20" id="kge-ua-7K0"/>
</constraints>
</stackView>
<stackView contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="Ejp-Jq-phL" userLabel="stickIndicatorOffsetStack">
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="JyK-fC-beG">
<rect key="frame" x="0.0" y="442" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sprint key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.60000002384185791" translatesAutoresizingMaskIntoConstraints="NO" id="lJx-Tn-7we">
<rect key="frame" x="0.0" y="0.0" width="80" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="80" id="6u9-v5-fjd"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="TsJ-mx-pbL">
<rect key="frame" x="85" y="0.0" width="140" height="21"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="140" id="JIa-bt-lzi"/>
<constraint firstAttribute="height" constant="31" id="bGx-Lc-40g"/>
</constraints>
<segments>
<segment title="hold"/>
<segment title="toggle"/>
</segments>
<color key="tintColor" systemColor="systemGray3Color"/>
<color key="selectedSegmentTintColor" red="0.23087820410000001" green="0.4576539993" blue="0.51765710119999997" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</segmentedControl>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YQo-bc-mwR">
<rect key="frame" x="230" y="0.0" width="130" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="130" id="Tns-fT-bGx"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<slider verifyAmbiguity="off" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="r6M-Kf-BXk">
<rect key="frame" x="365" y="0.0" width="185" height="20"/>
<color key="tintColor" red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
<color key="maximumTrackTintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</slider>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="20" id="BtX-AL-mT3"/>
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="fWd-gR-fge">
<rect key="frame" x="0.0" y="469" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Walk key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.60000002384185791" translatesAutoresizingMaskIntoConstraints="NO" id="KpH-R8-kny">
<rect key="frame" x="0.0" y="0.0" width="80" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="80" id="lx7-Yg-yOD"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" alpha="0.76999998092651367" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="Jz7-vJ-mMl">
<rect key="frame" x="85" y="0.0" width="140" height="21"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="HBa-29-uPi"/>
<constraint firstAttribute="width" constant="140" id="xjz-R5-L1B"/>
</constraints>
<segments>
<segment title="hold"/>
<segment title="toggle"/>
</segments>
<color key="tintColor" systemColor="systemGray3Color"/>
<color key="selectedSegmentTintColor" red="0.23087820410000001" green="0.4576539993" blue="0.51765710119999997" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</segmentedControl>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sYb-ef-Vkq">
<rect key="frame" x="230" y="0.0" width="130" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="130" id="ly9-Cl-fXN"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<slider verifyAmbiguity="off" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="ZW0-YT-J0m">
<rect key="frame" x="365" y="0.0" width="185" height="20"/>
<color key="tintColor" red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
<color key="maximumTrackTintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</slider>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="20" id="Ygh-AN-0E1"/>
</constraints>
</stackView>
<stackView contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="Ejp-Jq-phL" userLabel="stickIndicatorOffsetStack">
<rect key="frame" x="0.0" y="496" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Stick indicator" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fcy-zp-LGa" userLabel="stickIndicatorOffsetLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -502,7 +592,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fem-TG-vr3" userLabel="sensitivityFactorXStack">
<rect key="frame" x="0.0" y="469" width="550" height="20"/>
<rect key="frame" x="0.0" y="523" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SensitivityX" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dJh-Ck-ugh" userLabel="sensitivityFactorLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -524,7 +614,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="50h-xK-Lq0" userLabel="sensitivityFactorYStack">
<rect key="frame" x="0.0" y="496" width="550" height="20"/>
<rect key="frame" x="0.0" y="550" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SensitivityY" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="R9C-JW-nkF" userLabel="sensitivityFactorYLabel">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -546,7 +636,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ioa-xW-Qno">
<rect key="frame" x="0.0" y="523" width="550" height="20"/>
<rect key="frame" x="0.0" y="577" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Slide threshold" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6mJ-6V-XcK">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -568,7 +658,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rk5-VT-6j1">
<rect key="frame" x="0.0" y="550" width="550" height="20"/>
<rect key="frame" x="0.0" y="604" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Walkmode threshold" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Afv-Tt-8Fo">
<rect key="frame" x="0.0" y="0.0" width="200" height="20"/>
@@ -590,7 +680,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mZ2-SU-Aj2">
<rect key="frame" x="0.0" y="577" width="550" height="20"/>
<rect key="frame" x="0.0" y="631" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minimum offset" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mxv-HT-xeB">
<rect key="frame" x="0.0" y="0.0" width="200" height="20"/>
@@ -612,7 +702,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XYC-Ug-Pns">
<rect key="frame" x="0.0" y="604" width="550" height="20"/>
<rect key="frame" x="0.0" y="658" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Yaw factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kzC-ut-7DI">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -634,7 +724,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gkc-td-lg4">
<rect key="frame" x="0.0" y="631" width="550" height="20"/>
<rect key="frame" x="0.0" y="685" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Pitch factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dEy-ER-Mb3">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -656,7 +746,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7G4-Ms-mkR">
<rect key="frame" x="0.0" y="658" width="550" height="20"/>
<rect key="frame" x="0.0" y="712" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Roll factor" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BNN-vq-Pve">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -678,7 +768,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3Bf-uN-nLa">
<rect key="frame" x="0.0" y="685" width="550" height="20"/>
<rect key="frame" x="0.0" y="739" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DecelerationRate" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="znE-Lv-uWV">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -700,7 +790,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jE7-IB-GTS" userLabel="slidableStack">
<rect key="frame" x="0.0" y="712" width="550" height="20"/>
<rect key="frame" x="0.0" y="766" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Button mode" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o9I-Gt-YRd" userLabel="uilabel">
<rect key="frame" x="0.0" y="0.0" width="120" height="20"/>
@@ -739,7 +829,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gsG-6n-BAb" userLabel="vibrationStyleStack">
<rect key="frame" x="0.0" y="739" width="550" height="20"/>
<rect key="frame" x="0.0" y="793" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Vibration style" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="u3w-Se-xzH" userLabel="sensitivityFactorLabel">
<rect key="frame" x="0.0" y="0.0" width="130" height="20"/>
@@ -770,7 +860,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lEZ-1a-89J" userLabel="mouseButtonDownStack">
<rect key="frame" x="0.0" y="766" width="550" height="20"/>
<rect key="frame" x="0.0" y="820" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Button down" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ozU-7C-qKE" userLabel="uilabel">
<rect key="frame" x="0.0" y="0.0" width="120" height="20"/>
@@ -800,7 +890,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="t6L-J9-AMW">
<rect key="frame" x="0.0" y="793" width="550" height="20"/>
<rect key="frame" x="0.0" y="847" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MgK-KI-3y7">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -822,7 +912,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eem-2H-ekN">
<rect key="frame" x="0.0" y="820" width="550" height="20"/>
<rect key="frame" x="0.0" y="874" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TFq-Un-O3H">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -844,7 +934,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YB4-fc-lM6">
<rect key="frame" x="0.0" y="847" width="550" height="20"/>
<rect key="frame" x="0.0" y="901" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Dr-3c-z61">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -866,7 +956,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8tb-mS-WEu">
<rect key="frame" x="0.0" y="874" width="550" height="20"/>
<rect key="frame" x="0.0" y="928" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eRy-My-vvU">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -888,7 +978,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cJk-PA-Lp0">
<rect key="frame" x="0.0" y="901" width="550" height="20"/>
<rect key="frame" x="0.0" y="955" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Kd-Cc-aYN">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -910,7 +1000,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sxm-3C-Jlo">
<rect key="frame" x="0.0" y="928" width="550" height="20"/>
<rect key="frame" x="0.0" y="982" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hme-2d-8d6">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -932,7 +1022,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BBR-0E-XE9">
<rect key="frame" x="0.0" y="955" width="550" height="20"/>
<rect key="frame" x="0.0" y="1009" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Auto dock timer" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F8T-uC-SAR">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -954,7 +1044,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="n71-jv-Ziw">
<rect key="frame" x="0.0" y="982" width="550" height="20"/>
<rect key="frame" x="0.0" y="1036" width="550" height="20"/>
<subviews>
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Docked alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kxI-bn-pRU">
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
@@ -977,7 +1067,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="weV-Li-Itz">
<rect key="frame" x="0.0" y="1009" width="550" height="20"/>
<rect key="frame" x="0.0" y="1063" width="550" height="20"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Collected Widgets " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.10000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="kek-77-Kmg" userLabel="uilabel">
<rect key="frame" x="0.0" y="0.0" width="120" height="20"/>
@@ -1026,7 +1116,7 @@
</constraints>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IWg-XO-cff">
<rect key="frame" x="0.0" y="1036" width="550" height="20"/>
<rect key="frame" x="0.0" y="1090" width="550" height="20"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MZj-th-E9Z">
<rect key="frame" x="0.0" y="0.0" width="284" height="20"/>
@@ -1239,6 +1329,10 @@
<outlet property="slideThresholdLabel" destination="6mJ-6V-XcK" id="lDL-Wv-cOS"/>
<outlet property="slideThresholdSlider" destination="EDj-PN-7Vp" id="YWR-Nd-zoX"/>
<outlet property="slideThresholdStack" destination="Ioa-xW-Qno" id="pNl-i7-KlA"/>
<outlet property="sprintKeySelector" destination="TsJ-mx-pbL" id="z5T-2v-jvI"/>
<outlet property="sprintKeyStack" destination="JyK-fC-beG" id="hai-ys-0aj"/>
<outlet property="sprintKeyThresholdLabel" destination="YQo-bc-mwR" id="ujP-W9-Mtj"/>
<outlet property="sprintKeyThresholdSlider" destination="r6M-Kf-BXk" id="qEK-7B-XRI"/>
<outlet property="stickIndicatorOffsetLabel" destination="fcy-zp-LGa" id="lZP-Uv-mMH"/>
<outlet property="stickIndicatorOffsetSlider" destination="DCr-vG-gM7" id="aYH-VM-p5l"/>
<outlet property="stickIndicatorOffsetStack" destination="Ejp-Jq-phL" id="HNM-4A-VmN"/>
@@ -1251,6 +1345,10 @@
<outlet property="undoButton" destination="Pdg-l4-BvF" id="emD-GI-v2v"/>
<outlet property="vibrationStyleSelector" destination="QRV-je-HEZ" id="cEF-HG-B4h"/>
<outlet property="vibrationStyleStack" destination="gsG-6n-BAb" id="etn-BF-xqj"/>
<outlet property="walkKeySelector" destination="Jz7-vJ-mMl" id="VdS-nY-J25"/>
<outlet property="walkKeyStack" destination="fWd-gR-fge" id="B8l-MK-MHZ"/>
<outlet property="walkKeyThresholdLabel" destination="sYb-ef-Vkq" id="TWO-YO-I6W"/>
<outlet property="walkKeyThresholdSlider" destination="ZW0-YT-J0m" id="KLE-KS-7h4"/>
<outlet property="walkModeThresholdLabel" destination="Afv-Tt-8Fo" id="Jbl-aw-U8o"/>
<outlet property="walkModeThresholdSlider" destination="TC3-lM-oGw" id="47m-Mz-1Jd"/>
<outlet property="walkModeThresholdStack" destination="rk5-VT-6j1" id="pUi-mk-N7I"/>
@@ -3471,16 +3569,19 @@
<image name="trash.fill" catalog="system" width="117" height="128"/>
<image name="tray.full.fill" catalog="system" width="128" height="88"/>
<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="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="systemGray2Color">
<color red="0.68235294120000001" green="0.68235294120000001" blue="0.69803921570000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.68235294117647061" green="0.68235294117647061" blue="0.69803921568627447" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemGray3Color">
<color red="0.7803921568627451" green="0.7803921568627451" blue="0.80000000000000004" 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>
-25
View File
@@ -78,31 +78,6 @@ import Foundation
// 单一 gamepad.valueChangedHandler
gamepad.valueChangedHandler = { gamepad, element in
/*
navigationActionTriggeredPrivate = (gamepad.dpad.up.isPressed
|| gamepad.dpad.down.isPressed
|| gamepad.dpad.left.isPressed
|| gamepad.dpad.right.isPressed
|| gamepad.buttonA.isPressed
|| gamepad.buttonB.isPressed
|| gamepad.buttonX.isPressed
|| gamepad.leftShoulder.isPressed
|| gamepad.rightShoulder.isPressed
|| gamepad.leftTrigger.value != 0
|| gamepad.rightTrigger.value != 0
|| gamepad.rightThumbstick.xAxis.value != 0
|| gamepad.rightThumbstick.yAxis.value != 0
|| gamepad.leftThumbstick.xAxis.value != 0
|| gamepad.leftThumbstick.yAxis.value != 0)
if navigationActionTriggeredPrivate { navigationActionTriggered = true}
else {
DispatchQueue.global().asyncAfter(deadline: .now() + 0.1) {
if !navigationActionTriggeredPrivate {
navigationActionTriggered = false
}
}
}
*/
handler(buttonDict, gamepad, element)
if #available(iOS 13.0, *) {
if controller.playerIndex == .index1 {
@@ -478,7 +478,11 @@ static CGRect layoutViewBounds;
buttonState.walkModeThreshold = widgetView.dWheelWalkModeThreshold;
buttonState.minStickOffset = widgetView.minStickOffset;
buttonState.buttonMode = widgetView.buttonMode;
buttonState.sprintKeyActionType = widgetView.sprintKeyActionType;
buttonState.sprintKeyThreshold = widgetView.sprintKeyThreshold;
buttonState.walkKeyActionType = widgetView.walkKeyActionType;
buttonState.walkKeyThreshold = widgetView.walkKeyThreshold;
NSData *buttonStateEncoded = [NSKeyedArchiver archivedDataWithRootObject:buttonState requiringSecureCoding:YES error:nil];
[buttonStatesEncoded addObject: buttonStateEncoded];
}
@@ -65,6 +65,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, assign) uint8_t mouseButtonAction;
@property (nonatomic, assign) uint16_t autoTapInterval;
@property (nonatomic, assign) uint8_t walkKeyActionType;
@property (nonatomic, assign) CGFloat walkKeyThreshold;
@property (nonatomic, assign) uint8_t sprintKeyActionType;
@property (nonatomic, assign) CGFloat sprintKeyThreshold;
// @property (nonatomic, assign) BOOL hasValidPosition;
typedef NS_ENUM(NSInteger, OnScreenWidgetType) {
@@ -72,6 +72,10 @@
[encoder encodeObject:self.widgetShape forKey:@"widgetShape"];
[encoder encodeFloat:self.walkModeThreshold forKey:@"walkModeThreshold"];
[encoder encodeFloat:self.minStickOffset forKey:@"minStickOffset"];
[encoder encodeInt:self.sprintKeyActionType forKey:@"sprintKeyActionType"];
[encoder encodeFloat:self.sprintKeyThreshold forKey:@"sprintKeyThreshold"];
[encoder encodeInt:self.walkKeyActionType forKey:@"walkKeyActionType"];
[encoder encodeFloat:self.walkKeyThreshold forKey:@"walkKeyThreshold"];
}
- (id) initWithCoder:(NSCoder*)decoder {
@@ -117,6 +121,12 @@
self.widgetShape = [decoder decodeObjectForKey:@"widgetShape"];
self.walkModeThreshold = [decoder containsValueForKey:@"walkModeThreshold"] ? [decoder decodeFloatForKey:@"walkModeThreshold"] : 16383;
self.minStickOffset = [decoder decodeFloatForKey:@"minStickOffset"];
self.sprintKeyActionType = [decoder containsValueForKey:@"sprintKeyActionType"] ? [decoder decodeIntForKey:@"sprintKeyActionType"] : WalkSprintKeyActionTypeHold;
self.sprintKeyThreshold = [decoder containsValueForKey:@"sprintKeyThreshold"] ? [decoder decodeFloatForKey:@"sprintKeyThreshold"] : 0.6;
self.walkKeyActionType = [decoder containsValueForKey:@"walkKeyActionType"] ? [decoder decodeIntForKey:@"walkKeyActionType"] : WalkSprintKeyActionTypeHold;
self.walkKeyThreshold = [decoder containsValueForKey:@"walkKeyThreshold"] ? [decoder decodeFloatForKey:@"walkKeyThreshold"] : 0.08;
}
return self;
}
+130 -2
View File
@@ -174,6 +174,7 @@ import ObjectiveC.runtime
@objc public var isTapToToggleException: Bool = false
@objc public var hasHapticFeedback: Bool = false
@objc public var isDirectionPad: Bool = false
@objc public var hasWalkSprintKeys: Bool = false
@objc public var hasL3R3Indicator: Bool = false
@objc public var isStickWheel: Bool = false
@@ -232,10 +233,24 @@ import ObjectiveC.runtime
@objc public var stickIndicatorOffset: CGFloat = 120
// for all LRUD pads
@objc public enum WalkSprintKeyActionType: UInt8 {
case hold
case toggle
}
@objc public var keyboardDpadThresholdRef: CGFloat = 300
@objc public var walkKeyThreshold: CGFloat = 0.08
@objc public var walkKeyActionType: WalkSprintKeyActionType = .hold
@objc public var sprintKeyThreshold: CGFloat = 0.6
@objc public var sprintKeyActionType: WalkSprintKeyActionType = .hold
@objc public var upIndicator = CAShapeLayer()
@objc public var downIndicator = CAShapeLayer()
@objc public var leftIndicator = CAShapeLayer()
@objc public var rightIndicator = CAShapeLayer()
@objc public var walkKeyThresholdPreviewLayer = CAShapeLayer()
@objc public var sprintKeyThresholdPreviewLayer = CAShapeLayer()
// for DPAD LRUD pad
@objc public var lrudIndicatorBall = CAShapeLayer()
@@ -497,6 +512,8 @@ import ObjectiveC.runtime
)
self.hasHapticFeedback = !self.comboButtonStrings.isEmpty || CommandManager.directionPads.contains(self.touchPadString)
self.isDirectionPad = self.widgetType == WidgetTypeEnum.touchPad && CommandManager.directionPads.contains(self.touchPadString)
self.hasWalkSprintKeys = self.isDirectionPad && (self.touchPadString == "WASDPAD"
|| self.touchPadString == "ARROWPAD")
self.isStickWheel = self.widgetType == WidgetTypeEnum.touchPad && CommandManager.stickWheels.contains(self.touchPadString)
self.isFolder = self.cmdString == "FOLDER"
@@ -635,6 +652,7 @@ import ObjectiveC.runtime
// Re-setup widgetView style
setupView()
updateMovementThresholdPreview()
CATransaction.commit()
}
@@ -669,6 +687,8 @@ import ObjectiveC.runtime
self.downIndicator.borderColor = self.buttonDownVisualEffectLayer.borderColor
self.leftIndicator.borderColor = self.buttonDownVisualEffectLayer.borderColor
self.rightIndicator.borderColor = self.buttonDownVisualEffectLayer.borderColor
self.walkKeyThresholdPreviewLayer.strokeColor = self.buttonDownVisualEffectLayer.borderColor
self.sprintKeyThresholdPreviewLayer.strokeColor = self.buttonDownVisualEffectLayer.borderColor
}
private func tweakAlpha(tweakBorderAlpha:Bool, tweakLabelAlpha:Bool = true){
@@ -1352,10 +1372,64 @@ import ObjectiveC.runtime
}
}
private var previousWalkMode:Bool = false
private var previousSprintMode:Bool = false
private func handleLrudTouchMove(){
CATransaction.begin()
CATransaction.setDisableActions(true)
if self.hasWalkSprintKeys {
let dist = hypot(self.offSetX, self.offSetY)
let isInWalkMode = dist < self.walkKeyThreshold * keyboardDpadThresholdRef * 0.5
let isInSprintMode = dist > self.sprintKeyThreshold * keyboardDpadThresholdRef * 0.5
if (isInSprintMode != previousSprintMode || directionPadTouchBegan)
, self.comboButtonStrings.count>0 {
switch sprintKeyActionType {
case .hold:
if isInSprintMode {sendComboButtonsDownEvent(comboStrings: [comboButtonStrings[0]])}
else {sendComboButtonsUpEvent(comboStrings: [comboButtonStrings[0]])}
case .toggle :
if directionPadTouchBegan {break}
sendComboButtonsDownEvent(comboStrings: [comboButtonStrings[0]])
DispatchQueue.global().asyncAfter(deadline: .now() + 0.025) {
self.sendComboButtonsUpEvent(comboStrings: [self.comboButtonStrings[0]])
}
}
if !directionPadTouchBegan, isInSprintMode, vibrationOn {
vibrationGenerator.prepare()
vibrationGenerator.impactOccurred()
}
}
if (isInWalkMode != previousWalkMode || directionPadTouchBegan)
, self.comboButtonStrings.count>1 {
switch walkKeyActionType {
case .hold:
if isInWalkMode {sendComboButtonsDownEvent(comboStrings: [comboButtonStrings[1]])}
else {sendComboButtonsUpEvent(comboStrings: [comboButtonStrings[1]])}
case .toggle :
if directionPadTouchBegan {break}
sendComboButtonsDownEvent(comboStrings: [comboButtonStrings[1]])
DispatchQueue.global().asyncAfter(deadline: .now() + 0.025) {
self.sendComboButtonsUpEvent(comboStrings: [self.comboButtonStrings[1]])
}
}
if !directionPadTouchBegan, isInWalkMode, vibrationOn {
vibrationGenerator.prepare()
vibrationGenerator.impactOccurred()
}
}
previousWalkMode = isInWalkMode
previousSprintMode = isInSprintMode
}
let radians = atan2(-offSetY,offSetX)
let degrees = radians * 180 / .pi
@@ -1649,9 +1723,55 @@ import ObjectiveC.runtime
self.layer.addSublayer(self.stickWheelAxis)
self.stickWheelAxis.isHidden = false
}
setupMovementThresholdPreviewLayersIfNeeded()
updateMovementThresholdPreview()
CATransaction.commit()
}
private func setupMovementThresholdPreviewLayersIfNeeded() {
for previewLayer in [sprintKeyThresholdPreviewLayer, walkKeyThresholdPreviewLayer] {
previewLayer.fillColor = UIColor.clear.cgColor
previewLayer.strokeColor = standardHighlightColor.cgColor
previewLayer.lineWidth = 3
previewLayer.lineDashPattern = [8, 6]
previewLayer.isHidden = true
if previewLayer.superlayer == nil {
layer.insertSublayer(previewLayer, below: lrudIndicatorBall)
}
}
}
private func updateMovementThresholdPreview(layer: CAShapeLayer, threshold: CGFloat) {
let clampedThreshold = max(0, min(1, threshold))
let diameter: CGFloat = keyboardDpadThresholdRef * clampedThreshold
let radius = max(diameter / 2, 1)
layer.position = CGPoint(x: bounds.midX, y: bounds.midY)
layer.path = UIBezierPath(
arcCenter: .zero,
radius: radius,
startAngle: 0,
endAngle: .pi * 2,
clockwise: true
).cgPath
}
@objc public func updateMovementThresholdPreview() {
guard isDirectionPad, touchPadString == "WASDPAD" || touchPadString == "ARROWPAD" else {
walkKeyThresholdPreviewLayer.isHidden = true
sprintKeyThresholdPreviewLayer.isHidden = true
return
}
setupMovementThresholdPreviewLayersIfNeeded()
updateMovementThresholdPreview(layer: sprintKeyThresholdPreviewLayer, threshold: sprintKeyThreshold)
if self.comboButtonStrings.count>1 {updateMovementThresholdPreview(layer: walkKeyThresholdPreviewLayer, threshold: walkKeyThreshold)}
let shouldShow = OnScreenWidgetView.editMode
sprintKeyThresholdPreviewLayer.isHidden = !shouldShow
walkKeyThresholdPreviewLayer.isHidden = !(shouldShow && self.comboButtonStrings.count>1)
}
@objc public func hideAllHighlightLayersOfAllWidgets(selfIncluded:Bool) {
self.forEachWidget(){ widget in
@@ -1663,6 +1783,8 @@ import ObjectiveC.runtime
widget.downIndicator.isHidden = true
widget.leftIndicator.isHidden = true
widget.rightIndicator.isHidden = true
widget.walkKeyThresholdPreviewLayer.isHidden = true
widget.sprintKeyThresholdPreviewLayer.isHidden = true
}
}
@@ -1921,7 +2043,7 @@ import ObjectiveC.runtime
self.getVector(touch: touch)
self.handleLrudTouchMove()
}
if quickDoubleTapDetected {
if quickDoubleTapDetected && self.touchPadString == "DPAD" {
self.sendComboButtonsDownEvent(comboStrings: self.comboButtonStrings)
DispatchQueue.global(qos: .userInteractive).async {
usleep(100000)
@@ -3445,7 +3567,13 @@ import ObjectiveC.runtime
parentFolder?.sequenceSet.remove(widget.sequence)
}
widget.parentSequence = -1
widget.sequenceSet.removeAll()
if widget.isFolder {
for sequence in widget.sequenceSet {
guard let subWidget = OnScreenWidgetView.mapping[sequence] else {continue}
subWidget.parentSequence = -1
}
widget.sequenceSet.removeAll()
}
}
@objc static func restoreFoldedStates(){
+5
View File
@@ -675,6 +675,11 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
widgetView.minStickOffset = buttonState.minStickOffset;
widgetView.dWheelWalkModeThreshold = buttonState.walkModeThreshold;
widgetView.buttonMode = buttonState.buttonMode;
widgetView.sprintKeyActionType = buttonState.sprintKeyActionType;
widgetView.sprintKeyThreshold = buttonState.sprintKeyThreshold;
widgetView.walkKeyActionType = buttonState.walkKeyActionType;
widgetView.walkKeyThreshold = buttonState.walkKeyThreshold;
// 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];
+116 -1
View File
@@ -47,6 +47,29 @@
}
}
},
" Cmd: %@ Sprint: %@ Walk: %@ Parent: %@" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : " 命令: %@ 疾走: %@ 静步: %@ 收纳于: %@"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : " 命令: %@ 疾走: %@ 靜步: %@ 收納於: %@"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : " 命令: %@ 疾走: %@ 靜步: %@ 收納於: %@"
}
}
}
},
" disconnect " : {
"extractionState" : "manual",
"localizations" : {
@@ -162,7 +185,7 @@
}
}
},
" Profile: %@ Alias: %@ Cmd: %@ Parent:%@" : {
" Profile: %@ Alias: %@ Cmd: %@ Parent: %@" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
@@ -300,6 +323,29 @@
}
}
},
" Slide threshold: %0.2f " : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : " 触发距离: %0.2f "
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : " 觸發距離: %0.2f "
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : " 觸發距離: %0.2f "
}
}
}
},
"!ML_TEST_RESULT_INCONCLUSIVE" : {
"extractionState" : "manual",
"localizations" : {
@@ -8533,6 +8579,29 @@
}
}
},
"Please select a sprint key" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "请选择疾走键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "請選擇疾走鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "請選擇疾走鍵"
}
}
}
},
"Pofiles imported" : {
"extractionState" : "manual",
"localizations" : {
@@ -10901,6 +10970,52 @@
}
}
},
"Sprint and walk keys are set" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "已设定疾走键和静步键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "已設定疾走鍵和靜步鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "已設定疾走鍵和靜步鍵"
}
}
}
},
"Sprint key set. Select a walk key (optional, you can skip and create)" : {
"extractionState" : "manual",
"localizations" : {
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "已设定疾走键,请选择静步键(可跳过并创建)"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "已設定疾走鍵,請選擇靜步鍵(可跳過並建立)"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "已設定疾走鍵,請選擇靜步鍵(可跳過並建立)"
}
}
}
},
"Square" : {
"extractionState" : "manual",
"localizations" : {
@@ -165,6 +165,16 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
@IBOutlet weak var dockedAlphaLabel: UILabel!
@IBOutlet weak var dockedAlphaSlider: UISlider!
@IBOutlet weak var sprintKeyStack: UIStackView!
@IBOutlet weak var sprintKeySelector: UISegmentedControl!
@IBOutlet weak var sprintKeyThresholdLabel: UILabel!
@IBOutlet weak var sprintKeyThresholdSlider: UISlider!
@IBOutlet weak var walkKeyStack: UIStackView!
@IBOutlet weak var walkKeySelector: UISegmentedControl!
@IBOutlet weak var walkKeyThresholdLabel: UILabel!
@IBOutlet weak var walkKeyThresholdSlider: UISlider!
@IBOutlet weak var widgetPanelStack: UIStackView!
@IBOutlet private weak var toolbarTopConstraintiPhone: NSLayoutConstraint!
@@ -293,6 +303,9 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
override func viewWillDisappear(_ animated: Bool) {
OnScreenWidgetView.editMode = false
OnScreenWidgetView.isTweakingHighlight = false
for case let widget as OnScreenWidgetView in onScreenWidgetViews {
widget.updateMovementThresholdPreview()
}
super.viewWillDisappear(animated)
NotificationCenter.default.post(name: Notification.Name("OscLayoutCloseNotification"), object: self)
}
@@ -388,6 +401,11 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
widgetView.dWheelWalkModeThreshold = buttonState.walkModeThreshold
widgetView.minStickOffset = buttonState.minStickOffset
widgetView.buttonMode = ButtonMode(rawValue: Int(buttonState.buttonMode)) ?? .slideToToggle
widgetView.sprintKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: buttonState.sprintKeyActionType) ?? .hold
widgetView.sprintKeyThreshold = buttonState.sprintKeyThreshold
widgetView.walkKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: buttonState.walkKeyActionType) ?? .hold
widgetView.walkKeyThreshold = buttonState.walkKeyThreshold
self.view.insertSubview(widgetView, belowSubview: self.widgetPanelStack)
buttonState.position = self.denormalizeWidgetPosition(buttonState.position)
widgetView.setLocation(position: buttonState.position)
@@ -717,7 +735,14 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
autoFitLabel(currentProfileLabel)
currentProfileLabel.textAlignment = .left
currentProfileLabel.text = LocalizationHelper.localizedString(forKey: " Profile: %@ Alias: %@ Cmd: %@ Parent:%@", profilesManager.getSelectedProfile().name, widgetView.widgetLabel, widgetView.cmdString, LocalizationHelper.localizedString(forKey:OnScreenWidgetView.mapping[widgetView.parentSequence]?.widgetLabel ?? "null"))
currentProfileLabel.text = LocalizationHelper.localizedString(forKey: " Profile: %@ Alias: %@ Cmd: %@ Parent: %@", profilesManager.getSelectedProfile().name, widgetView.widgetLabel, widgetView.cmdString, LocalizationHelper.localizedString(forKey:OnScreenWidgetView.mapping[widgetView.parentSequence]?.widgetLabel ?? "null"))
if selectedWidgetView?.hasWalkSprintKeys == true {
let cmdCounts = widgetView.comboButtonStrings.count
currentProfileLabel.text = LocalizationHelper.localizedString(forKey: " Cmd: %@ Sprint: %@ Walk: %@ Parent: %@",
widgetView.cmdString, cmdCounts>0 ? widgetView.comboButtonStrings[0] : LocalizationHelper.localizedString(forKey: "null"),
cmdCounts>1 ? widgetView.comboButtonStrings[1] : LocalizationHelper.localizedString(forKey: "null"), LocalizationHelper.localizedString(forKey:OnScreenWidgetView.mapping[widgetView.parentSequence]?.widgetLabel ?? "null"))
}
undoButton.alpha = widgetView.layoutChanges.count > 1 ? 1.0 : 0.3
widgetView.accessWidgetAttributes()
@@ -755,12 +780,37 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
autoFitLabel(walkModeThresholdLabel)
}
sprintKeyStack.isHidden = !(widgetView.hasWalkSprintKeys && !widgetView.comboButtonStrings.isEmpty)
walkKeyStack.isHidden = !(widgetView.hasWalkSprintKeys && widgetView.comboButtonStrings.count > 1)
if widgetView.hasWalkSprintKeys {
let clampedWalkThreshold = min(widgetView.walkKeyThreshold, widgetView.sprintKeyThreshold)
if clampedWalkThreshold != widgetView.walkKeyThreshold {
widgetView.walkKeyThreshold = clampedWalkThreshold
}
sprintKeyThresholdSlider.value = Float(widgetView.sprintKeyThreshold)
sprintKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", sprintKeyThresholdSlider.value)
autoFitLabel(sprintKeyThresholdLabel)
sprintKeySelector.selectedSegmentIndex = Int(widgetView.sprintKeyActionType.rawValue)
walkKeyThresholdSlider.value = Float(widgetView.walkKeyThreshold)
walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", walkKeyThresholdSlider.value)
walkKeySelector.selectedSegmentIndex = Int(widgetView.walkKeyActionType.rawValue)
autoFitLabel(walkKeyThresholdLabel)
widgetView.updateMovementThresholdPreview()
} else {
widgetView.updateMovementThresholdPreview()
}
slideThresholdStack.isHidden = !widgetView.hasSlideThreshold
if widgetView.hasSlideThreshold {
slideThresholdSlider.minimumValue = Float(widgetView.slideThresholdMin)
slideThresholdSlider.maximumValue = Float(widgetView.slideThresholdMax)
slideThresholdSlider.value = Float(widgetView.slideThreshold)
slideThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold: %.1f", widgetView.slideThreshold)
slideThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %.1f ", widgetView.slideThreshold)
autoFitLabel(slideThresholdLabel)
}
@@ -833,7 +883,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
mouseDownButtonStack.isHidden = !widgetView.isMousePadWithButtonActions
mouseButtonDownSelector.selectedSegmentIndex = Int(widgetView.mouseButtonAction.rawValue)
autoDockTimerStack.isHidden = !(widgetView.isFolder && widgetView.parentSequence == -1);
autoDockTimerSlider.value = Float(widgetView.autoDockIdleDuration)
@@ -900,6 +950,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
stickIndicatorOffsetStack.isHidden = true
sensitivityXStack.isHidden = true
sensitivityYStack.isHidden = true
sprintKeyStack.isHidden = true
walkKeyStack.isHidden = true
mouseDownButtonStack.isHidden = true
decelerationRateStack.isHidden = true
@@ -1068,6 +1120,10 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
newWidget.setVibration(style: Int(widget.vibrationStyle))
newWidget.mouseButtonAction = widget.mouseButtonAction
newWidget.buttonMode = widget.buttonMode
newWidget.sprintKeyActionType = widget.sprintKeyActionType
newWidget.sprintKeyThreshold = widget.sprintKeyThreshold
newWidget.walkKeyActionType = widget.walkKeyActionType
newWidget.walkKeyThreshold = widget.walkKeyThreshold
guard newWidget.widgetType == widget.widgetType else { return }
view.insertSubview(newWidget, belowSubview: widgetPanelStack)
@@ -1386,9 +1442,21 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
sensitivityYSlider.addTarget(self, action: #selector(sensitivityYSliderMoved(_:)), for: .valueChanged)
sensitivityYLabel.text = LocalizationHelper.localizedString(forKey: "SensitivityY")
sensitivityYStack.isHidden = true
walkModeThresholdSlider.addTarget(self, action: #selector(walkModeThresholdSliderMoved(_:)), for: .valueChanged)
walkModeThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Walkmode threshold")
walkModeThresholdStack.isHidden = true
sprintKeyThresholdSlider.addTarget(self, action: #selector(sprintKeyThresholdSliderMoved(_:)), for: .valueChanged)
sprintKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold")
sprintKeySelector.addTarget(self, action: #selector(sprintKeyActionChanged(_:)), for: .valueChanged)
sprintKeyStack.isHidden = true
walkKeyThresholdSlider.addTarget(self, action: #selector(walkKeyThresholdSliderMoved(_:)), for: .valueChanged)
walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold")
walkKeySelector.addTarget(self, action: #selector(walkKeyActionChanged(_:)), for: .valueChanged)
walkKeyStack.isHidden = true
minStickOffsetSlider.addTarget(self, action: #selector(minStickOffsetSliderMoved(_:)), for: .valueChanged)
minStickOffsetLabel.text = LocalizationHelper.localizedString(forKey: "Minimum offset")
minStickOffsetStack.isHidden = true
@@ -1851,6 +1919,45 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
slideThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold: %.1f", sender.value)
selectedWidgetView?.slideThreshold = CGFloat(sender.value)
}
@objc private func sprintKeyActionChanged(_ sender: UISegmentedControl) {
selectedWidgetView?.sprintKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: UInt8(sender.selectedSegmentIndex)) ?? .hold
}
@objc private func sprintKeyThresholdSliderMoved(_ sender: UISlider) {
sprintKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", sender.value)
autoFitLabel(sprintKeyThresholdLabel)
guard OnScreenWidgetView.editMode, let selectedWidgetView, widgetViewSelected else { return }
if sender.value < walkKeyThresholdSlider.value {
walkKeyThresholdSlider.value = sender.value
walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", walkKeyThresholdSlider.value)
autoFitLabel(walkKeyThresholdLabel)
}
selectedWidgetView.sprintKeyThreshold = CGFloat(sender.value)
selectedWidgetView.walkKeyThreshold = CGFloat(walkKeyThresholdSlider.value)
selectedWidgetView.updateMovementThresholdPreview()
}
@objc private func walkKeyActionChanged(_ sender: UISegmentedControl) {
selectedWidgetView?.walkKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: UInt8(sender.selectedSegmentIndex)) ?? .hold
}
@objc private func walkKeyThresholdSliderMoved(_ sender: UISlider) {
if sender.value > sprintKeyThresholdSlider.value {
sender.value = sprintKeyThresholdSlider.value
}
walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", sender.value)
autoFitLabel(walkKeyThresholdLabel)
guard OnScreenWidgetView.editMode, let selectedWidgetView, widgetViewSelected else { return }
selectedWidgetView.walkKeyThreshold = CGFloat(sender.value)
selectedWidgetView.updateMovementThresholdPreview()
}
@objc private func yawFactorSliderMoved(_ sender: UISlider) {
yawFactorLabel.text = LocalizationHelper.localizedString(forKey: "Yaw factor: %.2f", sender.value)
+204
View File
@@ -187,6 +187,66 @@
}
}
},
"3fM-1s-S0k.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; 3fM-1s-S0k.segmentTitles[0] = \"hold\"; ObjectID = \"3fM-1s-S0k\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "hold"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
}
}
},
"3fM-1s-S0k.segmentTitles[1]" : {
"comment" : "Class = \"UISegmentedControl\"; 3fM-1s-S0k.segmentTitles[1] = \"toggle\"; ObjectID = \"3fM-1s-S0k\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "toggle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "切換"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "切換"
}
}
}
},
"3rP-dh-TJi.text" : {
"comment" : "Class = \"UILabel\"; text = \"Enable PiP\"; ObjectID = \"3rP-dh-TJi\";",
"extractionState" : "extracted_with_value",
@@ -427,6 +487,36 @@
}
}
},
"5Uu-1K-ov7.text" : {
"comment" : "Class = \"UILabel\"; text = \"Sprint key\"; ObjectID = \"5Uu-1K-ov7\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Sprint key"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走鍵"
}
}
}
},
"6Cy-aH-DXp.text" : {
"comment" : "Class = \"UILabel\"; text = \"Curve Exponent\"; ObjectID = \"6Cy-aH-DXp\";",
"extractionState" : "extracted_with_value",
@@ -2305,6 +2395,66 @@
}
}
},
"csH-cx-ZWH.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; csH-cx-ZWH.segmentTitles[0] = \"hold\"; ObjectID = \"csH-cx-ZWH\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "hold"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
}
}
},
"csH-cx-ZWH.segmentTitles[1]" : {
"comment" : "Class = \"UISegmentedControl\"; csH-cx-ZWH.segmentTitles[1] = \"toggle\"; ObjectID = \"csH-cx-ZWH\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "toggle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "切換"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "切換"
}
}
}
},
"cyH-Fh-vW6.normalTitle" : {
"comment" : "Class = \"UIButton\"; normalTitle = \"Button\"; ObjectID = \"cyH-Fh-vW6\";",
"extractionState" : "extracted_with_value",
@@ -2672,6 +2822,36 @@
}
}
},
"eRk-iM-nN4.text" : {
"comment" : "Class = \"UILabel\"; text = \"Walk key\"; ObjectID = \"eRk-iM-nN4\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Walk key"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "静步键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "靜步鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "靜步鍵"
}
}
}
},
"eTT-y7-oTM.configuration.title" : {
"comment" : "Class = \"UIButton\"; configuration.title = \"9999999\"; ObjectID = \"eTT-y7-oTM\";",
"extractionState" : "stale",
@@ -3812,6 +3992,18 @@
}
}
},
"kex-PV-gvq.text" : {
"comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"kex-PV-gvq\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Slide threshold"
}
}
}
},
"kho-5R-daP.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; kho-5R-daP.segmentTitles[0] = \"3 Finger Tap\"; ObjectID = \"kho-5R-daP\";",
"extractionState" : "extracted_with_value",
@@ -5884,6 +6076,18 @@
}
}
},
"v4J-ot-qpz.text" : {
"comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"v4J-ot-qpz\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Slide threshold"
}
}
}
},
"v5f-j3-pEc.text" : {
"comment" : "Class = \"UILabel\"; text = \"Custom Double Tap Keyboard Shortcut\"; ObjectID = \"v5f-j3-pEc\";",
"extractionState" : "extracted_with_value",
+208 -4
View File
@@ -2521,7 +2521,7 @@
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"state" : "translated",
"value" : "内置陀螺仪映射为"
}
},
@@ -2551,7 +2551,7 @@
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"state" : "translated",
"value" : "指针速度"
}
},
@@ -2995,6 +2995,66 @@
}
}
},
"Jz7-vJ-mMl.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; Jz7-vJ-mMl.segmentTitles[0] = \"hold\"; ObjectID = \"Jz7-vJ-mMl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "hold"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
}
}
},
"Jz7-vJ-mMl.segmentTitles[1]" : {
"comment" : "Class = \"UISegmentedControl\"; Jz7-vJ-mMl.segmentTitles[1] = \"toggle\"; ObjectID = \"Jz7-vJ-mMl\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "toggle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
}
}
},
"KbX-bp-pYg.text" : {
"comment" : "Class = \"UILabel\"; text = \" \"; ObjectID = \"KbX-bp-pYg\";",
"extractionState" : "extracted_with_value",
@@ -3061,6 +3121,36 @@
}
}
},
"KpH-R8-kny.text" : {
"comment" : "Class = \"UILabel\"; text = \"Walk key\"; ObjectID = \"KpH-R8-kny\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Walk key"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "静步键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "靜步鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "靜步鍵"
}
}
}
},
"kva-gQ-CZh.text" : {
"comment" : "Class = \"UILabel\"; text = \"Size\"; ObjectID = \"kva-gQ-CZh\";",
"extractionState" : "extracted_with_value",
@@ -3139,6 +3229,36 @@
}
}
},
"lJx-Tn-7we.text" : {
"comment" : "Class = \"UILabel\"; text = \"Sprint key\"; ObjectID = \"lJx-Tn-7we\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Sprint key"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走键"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走鍵"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "疾走鍵"
}
}
}
},
"LVq-7c-3zg.text" : {
"comment" : "Class = \"UILabel\"; text = \"Performance Graph \"; ObjectID = \"LVq-7c-3zg\";",
"extractionState" : "extracted_with_value",
@@ -4009,7 +4129,7 @@
},
"zh-HK" : {
"stringUnit" : {
"state" : "needs_review",
"state" : "translated",
"value" : "滑出時鬆開"
}
}
@@ -4039,7 +4159,7 @@
},
"zh-HK" : {
"stringUnit" : {
"state" : "needs_review",
"state" : "translated",
"value" : "滑動時按下"
}
}
@@ -5119,6 +5239,18 @@
}
}
},
"sYb-ef-Vkq.text" : {
"comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"sYb-ef-Vkq\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Slide threshold"
}
}
}
},
"T0w-xM-ze7.text" : {
"comment" : "Class = \"UILabel\"; text = \"Resolution \"; ObjectID = \"T0w-xM-ze7\";",
"extractionState" : "extracted_with_value",
@@ -5389,6 +5521,66 @@
}
}
},
"TsJ-mx-pbL.segmentTitles[0]" : {
"comment" : "Class = \"UISegmentedControl\"; TsJ-mx-pbL.segmentTitles[0] = \"hold\"; ObjectID = \"TsJ-mx-pbL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "hold"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "保持"
}
}
}
},
"TsJ-mx-pbL.segmentTitles[1]" : {
"comment" : "Class = \"UISegmentedControl\"; TsJ-mx-pbL.segmentTitles[1] = \"toggle\"; ObjectID = \"TsJ-mx-pbL\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "toggle"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "切换"
}
}
}
},
"ttV-kY-jCi.text" : {
"comment" : "Class = \"UILabel\"; text = \"The recommended value is 2. 1 frame provides the lowest latency, but may require an Ethernet connection.\"; ObjectID = \"ttV-kY-jCi\";",
"extractionState" : "stale",
@@ -6007,6 +6199,18 @@
}
}
},
"YQo-bc-mwR.text" : {
"comment" : "Class = \"UILabel\"; text = \"Slide threshold\"; ObjectID = \"YQo-bc-mwR\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Slide threshold"
}
}
}
},
"Z9M-yq-an2.title" : {
"comment" : "Class = \"UIBarButtonItem\"; title = \"Import\"; ObjectID = \"Z9M-yq-an2\";",
"extractionState" : "extracted_with_value",
+43
View File
@@ -612,9 +612,36 @@ struct WidgetPickerView: View {
return isPad(firstItem) && !isPad(lastItem) && poolItems.contains(where: isPad) && poolItems.contains(where: { !isPad($0) })
}
private var selectedMovementPadCommand: String? {
poolItems.first(where: { $0.cmd == "WASDPAD" || $0.cmd == "ARROWPAD" })?.cmd
}
private var movementPadSingleButtonCount: Int {
guard selectedMovementPadCommand != nil else { return 0 }
return poolItems.filter { !isPad($0) }.count
}
private var movementPadNeedsWalkKeyTip: Bool {
selectedMovementPadCommand != nil && movementPadSingleButtonCount == 0
}
private var movementPadNeedsSprintKeyTip: Bool {
selectedMovementPadCommand != nil && movementPadSingleButtonCount == 1
}
private var movementPadHasReachedSingleKeyLimit: Bool {
selectedMovementPadCommand != nil && movementPadSingleButtonCount >= 2
}
private func updateTipMessageForCurrentPoolState() {
if poolItems.isEmpty {
resetTipMessage()
} else if movementPadNeedsWalkKeyTip {
setTipMessage(SwiftLocalizationHelper.localizedString(forKey: "Please select a sprint key"))
} else if movementPadNeedsSprintKeyTip {
setTipMessage(SwiftLocalizationHelper.localizedString(forKey: "Sprint key set. Select a walk key (optional, you can skip and create)"))
} else if movementPadHasReachedSingleKeyLimit {
setTipMessage(SwiftLocalizationHelper.localizedString(forKey: "Sprint and walk keys are set"))
} else if hasButtonThenPadCombination {
setTipMessage(SwiftLocalizationHelper.localizedString(forKey: "A button with touchpad functionality will be created"))
} else if hasPadThenButtonCombination {
@@ -1332,6 +1359,14 @@ struct WidgetPickerView: View {
return false
}
if movementPadHasReachedSingleKeyLimit {
setTipMessage(
SwiftLocalizationHelper.localizedString(forKey: "Walk and sprint keys are already set. No more keys can be added"),
type: .error
)
return false
}
let candidate = WidgetPoolItem(
cmd: cmd,
source: source,
@@ -1774,11 +1809,19 @@ struct WidgetPickerView: View {
keyboardPickerMode == .shortcutPicker
}
private var containsMovementDirectionPad: Bool {
poolItems.contains { $0.cmd == "WASDPAD" || $0.cmd == "ARROWPAD" }
}
private var shouldBypassCreateWidgetSheet: Bool {
if isShortcutPickerMode {
return true
}
if containsMovementDirectionPad {
return true
}
guard !poolItems.isEmpty else { return false }
let hasVisibleConfigurationSection =