- valid & invalid button mode tips
- widget panel tips
This commit is contained in:
@@ -60,6 +60,7 @@ static NSString* DB_NAME = @"Limelight_iOS.sqlite";
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
// Override point for command tool customization after application launch (works only when user default is nil)
|
||||
[CommandManager presetDefaultCommands];
|
||||
[GenericUtils installSegmentedControlPreviousSelectionTracking];
|
||||
|
||||
// For iOS 12 and below, we need to manually create the window
|
||||
if (@available(iOS 13.0, *)) {
|
||||
|
||||
@@ -2815,17 +2815,17 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="9ZS-28-txW" userLabel="borderWidthAlphaStack">
|
||||
<rect key="frame" x="0.0" y="358" 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" minimumScaleFactor="0.59999999999999998" translatesAutoresizingMaskIntoConstraints="NO" id="Pwa-YK-6Q2" userLabel="widgetAlphaLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="101" height="34"/>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.29999999999999999" translatesAutoresizingMaskIntoConstraints="NO" id="Pwa-YK-6Q2" userLabel="widgetAlphaLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="110" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="101" id="1ru-Nd-cf4"/>
|
||||
<constraint firstAttribute="width" constant="110" id="1ru-Nd-cf4"/>
|
||||
</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="leading" contentVerticalAlignment="center" value="0.83300000429153442" minValue="0.0010000000474974513" maxValue="0.99900001287460327" translatesAutoresizingMaskIntoConstraints="NO" id="ii1-Iq-jI4" userLabel="Alpha Slider">
|
||||
<rect key="frame" x="106" y="0.0" width="165" height="34"/>
|
||||
<rect key="frame" x="115" y="0.0" width="165" height="34"/>
|
||||
<color key="tintColor" red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="165" id="tRM-SO-nlr"/>
|
||||
@@ -2833,7 +2833,7 @@
|
||||
<color key="maximumTrackTintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</slider>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="BorderWidth" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r8L-dl-yLZ" userLabel="widgetBorderLabel">
|
||||
<rect key="frame" x="276" y="0.0" width="150" height="34"/>
|
||||
<rect key="frame" x="285" y="0.0" width="150" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="150" id="ZWS-S0-FRB"/>
|
||||
</constraints>
|
||||
@@ -2842,7 +2842,7 @@
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider verifyAmbiguity="off" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="8" translatesAutoresizingMaskIntoConstraints="NO" id="aOV-38-CQt" userLabel="Widget Border Width Slider">
|
||||
<rect key="frame" x="431" y="0.0" width="219" height="34"/>
|
||||
<rect key="frame" x="440" y="0.0" width="210" 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>
|
||||
@@ -3254,7 +3254,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="faR-Se-Fc5">
|
||||
<rect key="frame" x="0.0" y="1003" width="650" height="34"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D7h-Kq-SRP">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="D7h-Kq-SRP">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="VeB-6b-wgo"/>
|
||||
@@ -3276,7 +3276,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ugt-Uc-gHA">
|
||||
<rect key="frame" x="0.0" y="1042" width="650" height="34"/>
|
||||
<subviews>
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Height" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V1y-Wk-uHM">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Height" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V1y-Wk-uHM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="VN7-XV-yPb"/>
|
||||
@@ -3298,7 +3298,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KSh-xS-xfD">
|
||||
<rect key="frame" x="0.0" y="1081" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yF0-Tu-L8X">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="ofw-9E-Plc"/>
|
||||
@@ -3320,7 +3320,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Wxc-0O-tca">
|
||||
<rect key="frame" x="0.0" y="1120" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border width" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wTH-1Z-Fgh">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="OyF-eF-9ag"/>
|
||||
@@ -3342,7 +3342,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O0O-pZ-URe" userLabel="Bulk Label Alpha Stack">
|
||||
<rect key="frame" x="0.0" y="1159" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="kSX-ci-kx5">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="L3D-Ej-6ZS"/>
|
||||
@@ -3364,7 +3364,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rfr-nL-OCc">
|
||||
<rect key="frame" x="0.0" y="1198" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sAF-Vy-ZzK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="cWO-t5-t5M"/>
|
||||
@@ -3386,7 +3386,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="X7d-dV-lHa">
|
||||
<rect key="frame" x="0.0" y="1237" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1sF-08-aCr">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="ZUf-9R-Smf"/>
|
||||
@@ -3408,7 +3408,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nBA-Ii-jNy">
|
||||
<rect key="frame" x="0.0" y="1276" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight size" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hKK-ro-C5E">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="C4Q-cb-ZXx"/>
|
||||
@@ -3452,7 +3452,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3dC-9Z-wKV">
|
||||
<rect key="frame" x="0.0" y="1354" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Docked opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qFn-D7-7aD">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="34"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="B6V-Z1-ZAh"/>
|
||||
|
||||
@@ -430,7 +430,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="50p-sC-ObU" userLabel="borderWidthAlphaStack">
|
||||
<rect key="frame" x="0.0" y="415" width="550" height="20"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.29999999999999999" translatesAutoresizingMaskIntoConstraints="NO" id="qPQ-U2-aSg" userLabel="widgetAlphaLabel">
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.29999999999999999" translatesAutoresizingMaskIntoConstraints="NO" id="qPQ-U2-aSg" userLabel="widgetAlphaLabel">
|
||||
<rect key="frame" x="0.0" y="0.0" width="101" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="101" id="F3F-cO-OPA"/>
|
||||
@@ -1039,7 +1039,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YB4-fc-lM6">
|
||||
<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="Label alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Dr-3c-z61">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="9Dr-3c-z61">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="sSo-xR-0nl"/>
|
||||
@@ -1061,7 +1061,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8tb-mS-WEu">
|
||||
<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="Border alpha" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eRy-My-vvU">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Border opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="eRy-My-vvU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="ZBl-sM-khB"/>
|
||||
@@ -1083,7 +1083,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cJk-PA-Lp0">
|
||||
<rect key="frame" x="0.0" y="1063" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Highlight opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="4Kd-Cc-aYN">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="160" id="kDG-5Z-TXN"/>
|
||||
@@ -1149,7 +1149,7 @@
|
||||
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="n71-jv-Ziw">
|
||||
<rect key="frame" x="0.0" y="1144" 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">
|
||||
<label verifyAmbiguity="off" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Docked opacity" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.20000000000000001" translatesAutoresizingMaskIntoConstraints="NO" id="kxI-bn-pRU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="160" id="JhH-nj-7cT"/>
|
||||
|
||||
@@ -919,7 +919,7 @@ static float L3_Y;
|
||||
[buttonLayer.name isEqualToString:@"rightButton"] ||
|
||||
[buttonLayer.name isEqualToString:@"downButton"] ||
|
||||
[buttonLayer.name isEqualToString:@"leftButton"]){
|
||||
// NSLog(@"layerName: %@, alpha: %f", buttonLayer.name, buttonStateDecoded.backgroundAlpha);
|
||||
// NSLog(@"layerName: %@, opacity: %f", buttonLayer.name, buttonStateDecoded.backgroundAlpha);
|
||||
[self adjustControllerLayerOpacityWith:buttonLayer and:buttonStateDecoded.backgroundAlpha];
|
||||
}
|
||||
if([buttonLayer.name isEqualToString:@"leftStickBackground"]){
|
||||
@@ -2056,7 +2056,7 @@ static float L3_Y;
|
||||
if (layer == self._rightStickBackground) {
|
||||
self._rightStick.opacity = targetAlpha;
|
||||
self._rightStickBackground.opacity = targetAlpha + 1.0f/6.0f;
|
||||
NSLog(@"right stick init alpha: %f", targetAlpha);
|
||||
NSLog(@"right stick init opacity: %f", targetAlpha);
|
||||
}
|
||||
|
||||
if (layer == self._leftStickBackground){
|
||||
|
||||
@@ -2243,29 +2243,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Alpha: %.2f" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Applications" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
@@ -2750,12 +2727,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Border alpha: %.2f" : {
|
||||
"Border opacity: %.2f" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"zh-Hans" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Border opacity: %.2f "
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"value" : "边界透明度: %.2f"
|
||||
}
|
||||
},
|
||||
@@ -2934,6 +2917,64 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"buttonModeLink" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/tvlizqfgoidrn20o"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/mbyiwshw8bxhktlh"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/mbyiwshw8bxhktlh"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/mbyiwshw8bxhktlh"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"buttonModeTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Tap “Tutorial” to learn about button modes."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "点击 “看教程” 了解按键模式。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "點擊「看教學」了解按鍵模式。"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "點擊「看教學」了解按鍵模式。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Calibrating..." : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
@@ -4241,18 +4282,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Docked alpha: %d%%" : {
|
||||
"Docked opacity: %d%%" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Docked alpha: %d%"
|
||||
"value" : "Docked opacity: %d%% "
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"state" : "needs_review",
|
||||
"value" : "吸附后透明度: %d%%"
|
||||
}
|
||||
},
|
||||
@@ -5434,25 +5475,25 @@
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "\n1. By default, The widget menu button will be automatically docked to bottom edge, then become almost transparent after staying idle for 10 seconds. \nThis timeout can be changed by entering “Edit” in the widget menu.\n\n2. From %@ edge, slide %d%% screen width to open settings menu\n\n3. From %@ edge, slide %d%% screen width to open toolbox menu\n\n4. Slide from top 40%% of screen edge to avoid sending touch events to PC side"
|
||||
"value" : "\n1. By default, The widget menu button will be automatically docked to bottom edge, then become almost transparent after staying idle for 10 seconds. \nThis timeout can be changed by entering “Edit” in the widget menu.\n\n2. From %@ edge, slide %d%% screen width to open settings menu\n\n3. From %@ edge, slide %d%% screen width to open toolbox menu\n\n4. Slide from top 40%% of screen edge to avoid sending touch events to PC side\n\nIf the screen shows large green or purple color artifacts, disable variable display refresh rate on the PC and set the display refresh rate to match the streaming frame rate."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "\n1. 默认状态下,控件菜单按键在闲置10秒后将自动吸附屏幕底部边缘,并进入高透明状态。\n可展开控件菜单,进入“修改布局”修改该延迟。\n\n2. 展开设置菜单: 从%@边缘滑动%d%%屏幕宽度\n\n3. 展开工具箱菜单: 从%@边缘滑动%d%%屏幕宽度\n\n4. 从40%%上半边缘滑动避免触控事件影响PC端\n"
|
||||
"value" : "\n1. 默认状态下,控件菜单按键在闲置10秒后将自动吸附屏幕底部边缘,并进入高透明状态。\n可展开控件菜单,进入“修改布局”修改该延迟。\n\n2. 展开设置菜单: 从%@边缘滑动%d%%屏幕宽度\n\n3. 展开工具箱菜单: 从%@边缘滑动%d%%屏幕宽度\n\n4. 从40%%上半边缘滑动避免触控事件影响PC端\n\n若画面出现大片发绿、发紫的颜色异常,请在主机端关闭可变显示刷新率,并将显示刷新率设定为与串流帧率一致。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕底部邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端"
|
||||
"state" : "needs_review",
|
||||
"value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕底部邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端\n\n若畫面出現大片發綠、發紫等色彩異常,請在主機端關閉可變顯示更新率,並將顯示更新率設定為與串流幀率一致。"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕底部邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端"
|
||||
"state" : "needs_review",
|
||||
"value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕底部邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端\n\n若畫面出現大片發綠、發紫等色彩異常,請在主機端關閉可變顯示更新率,並將顯示更新率設定為與串流幀率一致。"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5555,30 +5596,59 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"folderButtonModeTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Folder button supports the following modes:\n\n- Slide and hold: Expands while pressed and collapses when released. Double-tap and hold to drag during streaming.\n\n- Movable: Tap to toggle expand/collapse. Long press to enter draggable mode.\n\n- Normal: Tap to toggle expand/collapse state. Cannot be dragged and moved during streaming."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Folder 控件夹按键支持以下模式:\n\n- 滑动时按下: 按压时展开,松开折叠。双击并长按可在串流过程中拖动。\n\n- 可移动:点按切换展开 / 折叠。长按进入可拖动状态。\n\n- 常规:点按切换展开 / 折叠状态。无法在串流中被拖动。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Folder 控件夾按鍵支援以下模式:\n\n- 滑動時按下:按壓時展開,鬆開折疊。雙擊並長按可在串流過程中拖動。\n\n- 可移動:點按切換展開/折疊狀態。長按進入可拖動狀態。\n\n- 常規:點按切換展開/折疊狀態。無法在串流中被拖動。"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Folder 控件夾按鍵支援以下模式:\n\n- 滑動時按下:按壓時展開,鬆開折疊。雙擊並長按可在串流過程中拖動。\n\n- 可移動:點按切換展開/折疊狀態。長按進入可拖動狀態。\n\n- 常規:點按切換展開/折疊狀態。無法在串流中被拖動。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"folderTutorialTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "\nDrag other widgets (buttons or touchpads). Release when the touch point enters the folder’s bounding frame to complete collecting.\n\n- When the folder is unfolded, the collected widget will snap back to its original position.\n\n- When the folder is folded, the grouped widget will be hidden.\n\n- Drag a sub-widget or a folder over the trash icon (do not release) to detach it from the collection."
|
||||
"value" : "\nDrag other widgets (buttons or touchpads). Release when the touch point enters the folder’s bounding frame to complete collecting.\n\n- When the folder is unfolded, the collected widget will snap back to its original position.\n\n- When the folder is folded, the collected widget will be hidden.\n\n- Drag a sub-widget or a folder over the trash icon (do not release) to detach it from the collection."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"state" : "needs_review",
|
||||
"value" : "\n拖动其他控件(按键或触控板),当手指触点进入控件夹边框时松开,即可完成收纳。\n\n- 当控件夹处于展开状态时, 被收纳控件将弹回原先的位置。\n\n- 当控件夹处于折叠状态时,被收纳控件将隐藏。\n\n- 拖动子控件或控件夹划过垃圾桶图标(不要松开),即可解除收纳关系。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"state" : "needs_review",
|
||||
"value" : "\n拖動其他螢幕控制項(按鍵或觸控板),當手指觸點進入資料夾邊框時放開,即可完成收納。\n\n- 當控制項夾處於展開狀態時,被收納的控制項會彈回原本的位置。\n\n- 當控制項夾處於折疊狀態時,被收納的控制項會隱藏。\n\n- 拖動子控制項或控制項夾按键,劃過垃圾桶圖示(不要放開),即可解除收納關係。\n"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"state" : "needs_review",
|
||||
"value" : "\n拖動其他螢幕控制項(按鍵或觸控板),當手指觸點進入資料夾邊框時放開,即可完成收納。\n\n- 當控制項夾處於展開狀態時,被收納的控制項會彈回原本的位置。\n\n- 當控制項夾處於折疊狀態時,被收納的控制項會隱藏。\n\n- 拖動子控制項或控制項夾按键,劃過垃圾桶圖示(不要放開),即可解除收納關係。\n"
|
||||
}
|
||||
}
|
||||
@@ -6581,12 +6651,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Highlight alpha: %.2f" : {
|
||||
"Highlight opacity: %.2f" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"zh-Hans" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Highlight opacity: %.2f "
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"value" : "高亮透明度: %.2f"
|
||||
}
|
||||
},
|
||||
@@ -6898,6 +6974,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"invalidButtonModeTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "This button is not applicable in this mode."
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "此模式不适用该按键。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "此模式不適用該按鍵。"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "此模式不適用該按鍵。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Keyboard / Mouse" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
@@ -6996,12 +7101,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Label alpha: %.2f" : {
|
||||
"Label opacity: %.2f" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"zh-Hans" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Label opacity: %.2f "
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"value" : "标签透明度: %.2f"
|
||||
}
|
||||
},
|
||||
@@ -8886,6 +8997,35 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"Opacity: %.2f" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Opacity: %.2f "
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "needs_review",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "透明度: %.2f"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Open on-screen widget layout tool" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
@@ -13943,6 +14083,64 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"widgetPanelLink" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/dcke52amz8ay3g37"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/zrg0ga93avz4s747"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/zrg0ga93avz4s747"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/zrg0ga93avz4s747"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widgetPanelTip" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "- Tap the “Opacity” or “Border Width” label to reveal hidden features.\n\n- If batch edit is unavailable, tap & unfold the parent folder button"
|
||||
}
|
||||
},
|
||||
"zh-Hans" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "- 点击“透明度” 、“边界宽度” 标签,可切换出隐藏功能。\n\n- 若无批量编辑功能,请点击上一级 Folder 控件夹按键,并将其展开。"
|
||||
}
|
||||
},
|
||||
"zh-Hant" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "- 點擊「透明度」 「邊界寬度」標籤,可切換出隱藏功能。\n\n- 若無批次編輯功能,請點擊上一級 Folder 控制項夾按鍵,並將其展開。\n"
|
||||
}
|
||||
},
|
||||
"zh-HK" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "- 點擊「透明度」 「邊界寬度」標籤,可切換出隱藏功能。\n\n- 若無批次編輯功能,請點擊上一級 Folder 控制項夾按鍵,並將其展開。\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Width" : {
|
||||
"extractionState" : "manual",
|
||||
"localizations" : {
|
||||
|
||||
@@ -9,9 +9,13 @@
|
||||
|
||||
import Foundation
|
||||
import GameController
|
||||
import ObjectiveC
|
||||
import UIKit
|
||||
|
||||
@objc public class GenericUtils: NSObject {
|
||||
@objc static func installSegmentedControlPreviousSelectionTracking() {
|
||||
UISegmentedControl.installPreviousSelectionTracking()
|
||||
}
|
||||
|
||||
@objc static var hardwareKeyboardAlreadyDetected: Bool = false
|
||||
|
||||
@@ -115,7 +119,7 @@ import UIKit
|
||||
}
|
||||
|
||||
@objc static func isFirstTappingFolderInLayoutTool() -> Bool {
|
||||
let key = "hasTappedFolderInLayoutTool"
|
||||
let key = "hasTappedFolderInLayoutTool2"
|
||||
let defaults = UserDefaults.standard
|
||||
let launchedBefore = defaults.bool(forKey: key)
|
||||
if !launchedBefore {
|
||||
@@ -241,6 +245,36 @@ import UIKit
|
||||
}
|
||||
}
|
||||
|
||||
@objc static var hasTappedButtonModeSelector = false
|
||||
@objc static func isFirstTappingButtonModeSelector() -> Bool {
|
||||
guard !hasTappedButtonModeSelector else { return false }
|
||||
hasTappedButtonModeSelector = true
|
||||
let key = "hasTappedButtonModeSelector3"
|
||||
let defaults = UserDefaults.standard
|
||||
let launchedBefore = defaults.bool(forKey: key)
|
||||
if !launchedBefore {
|
||||
defaults.set(true, forKey: key)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
@objc static func handleButtonModeTip(in vc: UIViewController?) {
|
||||
if isFirstTappingButtonModeSelector() {
|
||||
AlertControllerUtil.showAlert(
|
||||
in: vc,
|
||||
title: LocalizationHelper.localizedString(forKey: "Tips"),
|
||||
message: "\n\(LocalizationHelper.localizedString(forKey: "buttonModeTip"))",
|
||||
withCancel: false,
|
||||
buttonTitle: LocalizationHelper.localizedString(forKey: "Tutorial"),
|
||||
countdown: 3,
|
||||
completion: {
|
||||
GenericUtils.openUrl(LocalizationHelper.localizedString(forKey: "buttonModeLink"))
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@objc static var hasTappedStickWheel = false
|
||||
@objc static func isFirstTappingStickWheel() -> Bool {
|
||||
guard !hasTappedStickWheel else { return false }
|
||||
@@ -272,6 +306,38 @@ import UIKit
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@objc static var hasTappedWidgetPanel = false
|
||||
@objc static func isFirstTappingWidgetPanel() -> Bool {
|
||||
guard !hasTappedWidgetPanel else { return false }
|
||||
hasTappedWidgetPanel = true
|
||||
let key = "hasTappedWidgetPanel7"
|
||||
let defaults = UserDefaults.standard
|
||||
let launchedBefore = defaults.bool(forKey: key)
|
||||
if !launchedBefore {
|
||||
defaults.set(true, forKey: key)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
@objc static func handleWidgetPanelTip(in vc: UIViewController?) {
|
||||
if isFirstTappingWidgetPanel() {
|
||||
// AlertControllerUtil.cancelButtonString = LocalizationHelper.localizedString(forKey: "Detailed Tutorial")
|
||||
AlertControllerUtil.showAlert(
|
||||
in: vc,
|
||||
title: LocalizationHelper.localizedString(forKey: "Tips"),
|
||||
message: "\n\(LocalizationHelper.localizedString(forKey: "widgetPanelTip"))",
|
||||
withCancel: false,
|
||||
buttonTitle: LocalizationHelper.localizedString(forKey: "Got it!"),
|
||||
countdown: 6,
|
||||
completion: {
|
||||
if AlertControllerUtil.actionCancelled {
|
||||
GenericUtils.openUrl(LocalizationHelper.localizedString(forKey: "widgetPanelLink"))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@objc static func isFirstTappingInputAccessoryBar() -> Bool {
|
||||
let key = "isFirstTappingInputAccessoryBar"
|
||||
@@ -539,3 +605,148 @@ extension CGPoint {
|
||||
x.isFinite && y.isFinite
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private var previousSelectedSegmentIndexKey: UInt8 = 0
|
||||
private var lastKnownSelectedSegmentIndexKey: UInt8 = 0
|
||||
extension UISegmentedControl {
|
||||
@objc static func installPreviousSelectionTracking() {
|
||||
_ = enablePreviousSelectionTracking
|
||||
}
|
||||
|
||||
private static let enablePreviousSelectionTracking: Void = {
|
||||
guard
|
||||
let originalSetter = class_getInstanceMethod(
|
||||
UISegmentedControl.self,
|
||||
#selector(setter: UISegmentedControl.selectedSegmentIndex)
|
||||
),
|
||||
let swizzledSetter = class_getInstanceMethod(
|
||||
UISegmentedControl.self,
|
||||
#selector(UISegmentedControl.vl_setSelectedSegmentIndex(_:))
|
||||
),
|
||||
let originalSendAction = class_getInstanceMethod(
|
||||
UISegmentedControl.self,
|
||||
#selector(UISegmentedControl.sendAction(_:to:for:))
|
||||
),
|
||||
let swizzledSendAction = class_getInstanceMethod(
|
||||
UISegmentedControl.self,
|
||||
#selector(UISegmentedControl.vl_sendAction(_:to:for:))
|
||||
)
|
||||
else {
|
||||
return
|
||||
}
|
||||
|
||||
swizzleMethod(
|
||||
on: UISegmentedControl.self,
|
||||
originalMethod: originalSetter,
|
||||
originalSelector: #selector(setter: UISegmentedControl.selectedSegmentIndex),
|
||||
swizzledMethod: swizzledSetter,
|
||||
swizzledSelector: #selector(UISegmentedControl.vl_setSelectedSegmentIndex(_:))
|
||||
)
|
||||
swizzleMethod(
|
||||
on: UISegmentedControl.self,
|
||||
originalMethod: originalSendAction,
|
||||
originalSelector: #selector(UISegmentedControl.sendAction(_:to:for:)),
|
||||
swizzledMethod: swizzledSendAction,
|
||||
swizzledSelector: #selector(UISegmentedControl.vl_sendAction(_:to:for:))
|
||||
)
|
||||
}()
|
||||
|
||||
@objc var previousSelectedSegmentIndex: Int {
|
||||
Self.installPreviousSelectionTracking()
|
||||
initializeLastKnownIndexIfNeeded()
|
||||
return (objc_getAssociatedObject(self, &previousSelectedSegmentIndexKey) as? NSNumber)?.intValue
|
||||
?? selectedSegmentIndex
|
||||
}
|
||||
|
||||
@objc func resetPreviousSelectedSegmentIndex() {
|
||||
Self.installPreviousSelectionTracking()
|
||||
storePreviousSelectedSegmentIndex(selectedSegmentIndex)
|
||||
storeLastKnownSelectedSegmentIndex(selectedSegmentIndex)
|
||||
}
|
||||
|
||||
@objc private func vl_setSelectedSegmentIndex(_ newValue: Int) {
|
||||
Self.installPreviousSelectionTracking()
|
||||
initializeLastKnownIndexIfNeeded()
|
||||
|
||||
let currentValue = selectedSegmentIndex
|
||||
if currentValue != newValue {
|
||||
storePreviousSelectedSegmentIndex(newValue)
|
||||
storeLastKnownSelectedSegmentIndex(newValue)
|
||||
}
|
||||
|
||||
vl_setSelectedSegmentIndex(newValue)
|
||||
}
|
||||
|
||||
@objc private func vl_sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
|
||||
Self.installPreviousSelectionTracking()
|
||||
updatePreviousSelectedSegmentIndexIfNeeded()
|
||||
vl_sendAction(action, to: target, for: event)
|
||||
}
|
||||
|
||||
private func initializeLastKnownIndexIfNeeded() {
|
||||
guard objc_getAssociatedObject(self, &lastKnownSelectedSegmentIndexKey) == nil else {
|
||||
return
|
||||
}
|
||||
storeLastKnownSelectedSegmentIndex(selectedSegmentIndex)
|
||||
}
|
||||
|
||||
private func updatePreviousSelectedSegmentIndexIfNeeded() {
|
||||
initializeLastKnownIndexIfNeeded()
|
||||
|
||||
let currentValue = selectedSegmentIndex
|
||||
let lastKnownValue = (objc_getAssociatedObject(self, &lastKnownSelectedSegmentIndexKey) as? NSNumber)?.intValue
|
||||
?? UISegmentedControl.noSegment
|
||||
|
||||
guard currentValue != lastKnownValue else {
|
||||
return
|
||||
}
|
||||
|
||||
storePreviousSelectedSegmentIndex(lastKnownValue)
|
||||
storeLastKnownSelectedSegmentIndex(currentValue)
|
||||
}
|
||||
|
||||
private func storePreviousSelectedSegmentIndex(_ value: Int) {
|
||||
objc_setAssociatedObject(
|
||||
self,
|
||||
&previousSelectedSegmentIndexKey,
|
||||
NSNumber(value: value),
|
||||
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
|
||||
)
|
||||
}
|
||||
|
||||
private func storeLastKnownSelectedSegmentIndex(_ value: Int) {
|
||||
objc_setAssociatedObject(
|
||||
self,
|
||||
&lastKnownSelectedSegmentIndexKey,
|
||||
NSNumber(value: value),
|
||||
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
|
||||
)
|
||||
}
|
||||
|
||||
private static func swizzleMethod(
|
||||
on cls: AnyClass,
|
||||
originalMethod: Method,
|
||||
originalSelector: Selector,
|
||||
swizzledMethod: Method,
|
||||
swizzledSelector: Selector
|
||||
) {
|
||||
let didAddMethod = class_addMethod(
|
||||
cls,
|
||||
originalSelector,
|
||||
method_getImplementation(swizzledMethod),
|
||||
method_getTypeEncoding(swizzledMethod)
|
||||
)
|
||||
|
||||
if didAddMethod {
|
||||
class_replaceMethod(
|
||||
cls,
|
||||
swizzledSelector,
|
||||
method_getImplementation(originalMethod),
|
||||
method_getTypeEncoding(originalMethod)
|
||||
)
|
||||
} else {
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+186
-163
@@ -188,7 +188,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
private var oscProfilesTableViewController: OSCProfilesTableViewController?
|
||||
private var profilesManager: OSCProfilesManager!
|
||||
private var bulkEditEnabled: Bool = false
|
||||
private var selectedWidgetView: OnScreenWidgetView?
|
||||
private var selectedWidget: OnScreenWidgetView?
|
||||
private var alphaSliderMode: AlphaSliderMode = .widgetAlpha
|
||||
private var borderWidthSliderMode: BorderWidthSliderMode = .widgetBorderWidth
|
||||
private var decelerationRateSliderMode: DecelerationRateSliderMode = .decelerationRateX
|
||||
@@ -300,7 +300,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
bulkEditStacks = [bulkWidthStack, bulkHeightStack, bulkAlphaStack, bulkBorderAlphaStack, bulkLabelAlphaStack, bulkBorderWidthStack, bulkHighlightAlphaStack, bulkHighlightSizeStack]
|
||||
bulkEditEnabled = false
|
||||
OnScreenWidgetView.editMode = true
|
||||
selectedWidgetView = nil
|
||||
selectedWidget = nil
|
||||
widgetPanelStoredCenter = widgetPanelStack.center
|
||||
profileRefresh()
|
||||
setupWidgetPanel()
|
||||
@@ -519,7 +519,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
pickedProfileDataHandler: ((OSCProfile) -> Void)? = nil
|
||||
) {
|
||||
hideStickIndicators()
|
||||
if loadingMode != .pickProfileData {selectedWidgetView = nil}
|
||||
if loadingMode != .pickProfileData {selectedWidget = nil}
|
||||
let storyboardName = UIDevice.current.userInterfaceIdiom == .phone ? "iPhone" : "iPad"
|
||||
let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
|
||||
let controller = storyboard.instantiateViewController(withIdentifier: "OSCProfilesTableViewController") as? OSCProfilesTableViewController
|
||||
@@ -552,19 +552,19 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
// importFromOtherButton.setTitle(LocalizationHelper.localizedString(forKey: "Import"), for: .normal)
|
||||
presentProfilesTableView(with: .pickProfileData) { [weak self] profile in
|
||||
if profile.name == self?.profilesManager.getSelectedProfile().name {return}
|
||||
self?.loadWidgets(from: profile, to: self?.selectedWidgetView)
|
||||
self?.loadWidgets(from: profile, to: self?.selectedWidget)
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func clearFolderButtonTapped(_ sender: Any?) {
|
||||
for widget in OnScreenWidgetView.mapping.values {
|
||||
if widget.parentSequence == selectedWidgetView?.sequence, widget.sequenceSet.isEmpty {
|
||||
if widget.parentSequence == selectedWidget?.sequence, widget.sequenceSet.isEmpty {
|
||||
OnScreenWidgetView.mapping.removeValue(forKey: widget.sequence)
|
||||
widget.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
|
||||
selectedWidgetView?.sequenceSet = Set()
|
||||
selectedWidget?.sequenceSet = Set()
|
||||
}
|
||||
|
||||
private func setBulkEditStackHidden(_ hidden:Bool) {
|
||||
@@ -591,8 +591,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
stack.isHidden = hidden
|
||||
}
|
||||
|
||||
buttonModeStack.isHidden = !hidden || (selectedWidgetView?.widgetType != .button)
|
||||
collectedWidgetsStack.isHidden = selectedWidgetView?.isFolder != true
|
||||
buttonModeStack.isHidden = !hidden || (selectedWidget?.widgetType != .button)
|
||||
collectedWidgetsStack.isHidden = selectedWidget?.isFolder != true
|
||||
|
||||
if GenericUtils.isIPhone() {
|
||||
vibrationStyleStack.isHidden = false
|
||||
@@ -602,7 +602,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@IBAction func bulkEditButtonTapped(_ sender: Any?) {
|
||||
guard let selectedWidgetView = selectedWidgetView else {return}
|
||||
guard let selectedWidgetView = selectedWidget else {return}
|
||||
if !bulkEditEnabled {applyTitle("Batch updated", for: sender as! UIButton)}
|
||||
else {applyTitle("Batch edit", for: sender as! UIButton)}
|
||||
bulkEditEnabled = !bulkEditEnabled
|
||||
@@ -679,7 +679,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
private func updateViewBounds() {
|
||||
viewWillBeResized = false
|
||||
selectedWidgetView = nil
|
||||
selectedWidget = nil
|
||||
selectedControllerLayer = nil
|
||||
oscProfilesTableViewController?.layoutViewBounds = view.bounds
|
||||
OSCProfilesManager.setLayoutViewBounds(view.bounds)
|
||||
@@ -757,52 +757,52 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
private func loadWidgetAlphas() {
|
||||
guard let selectedWidgetView, widgetViewSelected else { return }
|
||||
setHiddenForWidgetHighlights(selectedWidgetView)
|
||||
guard let selectedWidget, widgetViewSelected else { return }
|
||||
setHiddenForWidgetHighlights(selectedWidget)
|
||||
switch alphaSliderMode {
|
||||
case .widgetAlpha:
|
||||
widgetAlphaSlider.maximumValue = 1
|
||||
widgetAlphaSlider.minimumValue = -1
|
||||
widgetAlphaSlider.value = Float(selectedWidgetView.backgroundAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Alpha: %.2f", widgetAlphaSlider.value)
|
||||
widgetAlphaSlider.value = Float(selectedWidget.backgroundAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Opacity: %.2f", widgetAlphaSlider.value)
|
||||
case .labelAlpha:
|
||||
widgetAlphaSlider.maximumValue = 1
|
||||
widgetAlphaSlider.minimumValue = -1
|
||||
widgetAlphaSlider.value = Float(selectedWidgetView.labelAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label alpha: %.2f", widgetAlphaSlider.value)
|
||||
widgetAlphaSlider.value = Float(selectedWidget.labelAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label opacity: %.2f", widgetAlphaSlider.value)
|
||||
case .borderAlpha:
|
||||
widgetAlphaSlider.maximumValue = 1
|
||||
widgetAlphaSlider.minimumValue = -1
|
||||
widgetAlphaSlider.value = Float(selectedWidgetView.borderAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border alpha: %.2f", widgetAlphaSlider.value)
|
||||
widgetAlphaSlider.value = Float(selectedWidget.borderAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border opacity: %.2f", widgetAlphaSlider.value)
|
||||
case .highlightAlpha:
|
||||
widgetAlphaSlider.maximumValue = 1
|
||||
widgetAlphaSlider.minimumValue = 0
|
||||
widgetAlphaSlider.value = Float(selectedWidgetView.highlightAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight alpha: %.2f", widgetAlphaSlider.value)
|
||||
widgetAlphaSlider.value = Float(selectedWidget.highlightAlpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight opacity: %.2f", widgetAlphaSlider.value)
|
||||
}
|
||||
}
|
||||
|
||||
private func loadWidgetWidths() {
|
||||
guard let selectedWidgetView, widgetViewSelected else { return }
|
||||
setHiddenForWidgetHighlights(selectedWidgetView)
|
||||
guard let selectedWidget, widgetViewSelected else { return }
|
||||
setHiddenForWidgetHighlights(selectedWidget)
|
||||
switch borderWidthSliderMode {
|
||||
case .widgetBorderWidth:
|
||||
widgetBorderWidthSlider.minimumValue = 0
|
||||
widgetBorderWidthSlider.maximumValue = 8
|
||||
widgetBorderWidthSlider.setValue(Float(selectedWidgetView.borderWidth), animated: false)
|
||||
widgetBorderWidthSlider.setValue(Float(selectedWidget.borderWidth), animated: false)
|
||||
widgetBorderWidthLabel.text = LocalizationHelper.localizedString(forKey: "Border width: %.2f", widgetBorderWidthSlider.value)
|
||||
case .highlightSize:
|
||||
widgetBorderWidthSlider.minimumValue = 0.01
|
||||
widgetBorderWidthSlider.maximumValue = 2
|
||||
widgetBorderWidthSlider.setValue(Float(selectedWidgetView.highlightSizeFactor), animated: false)
|
||||
widgetBorderWidthSlider.setValue(Float(selectedWidget.highlightSizeFactor), animated: false)
|
||||
widgetBorderWidthLabel.text = LocalizationHelper.localizedString(forKey: "Highlight size: %.2f", widgetBorderWidthSlider.value)
|
||||
}
|
||||
}
|
||||
|
||||
private func loadDecelerationRates() {
|
||||
guard let selectedWidgetView else { return }
|
||||
let value = decelerationRateSliderMode == .decelerationRateX ? selectedWidgetView.decelerationRateX : selectedWidgetView.decelerationRateY
|
||||
guard let selectedWidget else { return }
|
||||
let value = decelerationRateSliderMode == .decelerationRateX ? selectedWidget.decelerationRateX : selectedWidget.decelerationRateY
|
||||
decelerationRateSlider.value = Float(value)
|
||||
let key = decelerationRateSliderMode == .decelerationRateX ? "DecelerationRateX: %.3f " : "DecelerationRateY: %.3f "
|
||||
decelerationRateLabel.text = LocalizationHelper.localizedString(forKey: key, decelerationRateSlider.value)
|
||||
@@ -815,8 +815,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
widgetViewSelected = true
|
||||
controllerLayerSelected = false
|
||||
|
||||
if widgetView !== selectedWidgetView {
|
||||
selectedWidgetView?.setAutoTapIntervalByText(str: autoTapField.text ?? "")
|
||||
if widgetView !== selectedWidget {
|
||||
selectedWidget?.setAutoTapIntervalByText(str: autoTapField.text ?? "")
|
||||
}
|
||||
|
||||
widgetView.hideAllHighlightLayersOfAllWidgets(selfIncluded: true)
|
||||
@@ -824,7 +824,7 @@ 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"))
|
||||
if selectedWidgetView?.hasWalkSprintKeys == true {
|
||||
if selectedWidget?.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"),
|
||||
@@ -990,12 +990,6 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
dockedAlphaSliderMoved(dockedAlphaSlider)
|
||||
|
||||
buttonModeStack.isHidden = widgetView.widgetType != .button
|
||||
buttonModeSelector.setEnabled(!widgetView.isFunctionalButton, forSegmentAt: Int(ButtonMode.slideToToggle.rawValue))
|
||||
buttonModeSelector.setEnabled((!widgetView.isFunctionalButton || widgetView.isFolder)
|
||||
&& !widgetView.containsShortcutAction
|
||||
, forSegmentAt: Int(ButtonMode.slideAndHold.rawValue))
|
||||
// buttonModeSelector.setEnabled(!widgetView.isFolder, forSegmentAt: Int(ButtonMode.regular.rawValue))
|
||||
buttonModeSelector.setEnabled(!widgetView.isFunctionalButton || widgetView.isTapToToggleException, forSegmentAt: Int(ButtonMode.tapToToggle.rawValue))
|
||||
buttonModeSelector.selectedSegmentIndex = Int(widgetView.buttonMode.rawValue)
|
||||
|
||||
collectedWidgetsStack.isHidden = !widgetView.isFolder
|
||||
@@ -1047,7 +1041,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
@objc private func widgetViewTapped(_ notification: Notification) {
|
||||
guard let widgetView = notification.object as? OnScreenWidgetView else { return }
|
||||
selectedWidgetView = widgetView
|
||||
selectedWidget = widgetView
|
||||
layoutOSC.updateGuidelinesFor(onScreenWidget: widgetView)
|
||||
if bulkEditEnabled {
|
||||
bulkEditButtonTapped(bulkEditButton) // this will call refreshPanelForSelectedWidget too
|
||||
@@ -1065,7 +1059,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
enableCommonWidgetTools()
|
||||
hideStickIndicators()
|
||||
widgetViewSelected = false
|
||||
selectedWidgetView = nil
|
||||
selectedWidget = nil
|
||||
autoTapStack.isHidden = true
|
||||
stickIndicatorOffsetStack.isHidden = true
|
||||
sensitivityXStack.isHidden = true
|
||||
@@ -1090,7 +1084,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
widgetAlphaSlider.value = Float(alpha)
|
||||
widgetSizeLabel.text = LocalizationHelper.localizedString(forKey: "Size: %.2f", sizeFactor)
|
||||
widgetHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height: %.2f", sizeFactor)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Alpha: %.2f", alpha)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Opacity: %.2f", alpha)
|
||||
if isIPhone() {
|
||||
vibrationStyleStack.isHidden = false
|
||||
if let style = OnScreenControls.layerVibrationStyleDic()?.object(forKey: controllerLayer.name ?? "") as? NSNumber {
|
||||
@@ -1148,13 +1142,13 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
} else {
|
||||
present(alert, animated: true)
|
||||
}
|
||||
} else if let selectedWidgetView {
|
||||
if selectedWidgetView.layoutChanges.count > 1 {
|
||||
selectedWidgetView.undoRelocation()
|
||||
} else if let selectedWidget {
|
||||
if selectedWidget.layoutChanges.count > 1 {
|
||||
selectedWidget.undoRelocation()
|
||||
} else {
|
||||
present(alert, animated: true)
|
||||
}
|
||||
undoButton.alpha = selectedWidgetView.layoutChanges.count > 1 ? 1.0 : 0.3
|
||||
undoButton.alpha = selectedWidget.layoutChanges.count > 1 ? 1.0 : 0.3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1269,7 +1263,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
newWidget.tweakHighlightAlpha(alpha: widget.highlightAlpha)
|
||||
newWidget.adjustBorder(width: widget.borderWidth)
|
||||
onScreenWidgetViews.add(newWidget)
|
||||
selectedWidgetView = newWidget
|
||||
selectedWidget = newWidget
|
||||
if !createNew {
|
||||
onScreenWidgetViews.remove(widget)
|
||||
widget.removeFromSuperview()
|
||||
@@ -1465,12 +1459,12 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
let params = payload.mutableCopy() as? NSMutableDictionary ?? NSMutableDictionary()
|
||||
let pickerAction = ((params["pickerAction"] as? String) ?? "").lowercased()
|
||||
params.removeObject(forKey: "pickerAction")
|
||||
if pickerAction == "modify", let selectedWidgetView {
|
||||
updateWidget(selectedWidgetView, params: params, createNew: false)
|
||||
if pickerAction == "modify", let selectedWidget {
|
||||
updateWidget(selectedWidget, params: params, createNew: false)
|
||||
return
|
||||
}
|
||||
if pickerAction == "create", controller.isEditMode, let selectedWidgetView {
|
||||
updateWidget(selectedWidgetView, params: params, createNew: true)
|
||||
if pickerAction == "create", controller.isEditMode, let selectedWidget {
|
||||
updateWidget(selectedWidget, params: params, createNew: true)
|
||||
return
|
||||
}
|
||||
createWidgetFromParams(params)
|
||||
@@ -1478,7 +1472,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
@IBAction func editTapped(_ sender: Any?) {
|
||||
GenericUtils.autoPopSoftKeyboard = false
|
||||
guard let selectedWidgetView else {
|
||||
guard let selectedWidget else {
|
||||
AlertControllerUtil.autoCompletion = true
|
||||
AlertControllerUtil.showAlert(in: self, title: "", message: LocalizationHelper.localizedString(forKey: "No widget selected"), withCancel: false, buttonTitle: "", countdown: 1, action: {}, completion: {})
|
||||
return
|
||||
@@ -1489,16 +1483,16 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
pickerViewController.tabIdentifiers = ["gamepad", "keyboard", "functional"]
|
||||
pickerViewController.initialTabIdentifier = "gamepad"
|
||||
pickerViewController.isEditMode = true
|
||||
pickerViewController.initialCmdString = selectedWidgetView.cmdString
|
||||
pickerViewController.initialButtonLabel = selectedWidgetView.widgetLabel
|
||||
pickerViewController.initialShape = selectedWidgetView.shape
|
||||
pickerViewController.initialCmdString = selectedWidget.cmdString
|
||||
pickerViewController.initialButtonLabel = selectedWidget.widgetLabel
|
||||
pickerViewController.initialShape = selectedWidget.shape
|
||||
let nav = UINavigationController(rootViewController: pickerViewController)
|
||||
nav.modalPresentationStyle = .overFullScreen
|
||||
present(nav, animated: true)
|
||||
return
|
||||
}
|
||||
|
||||
presentLegacyEditWidgetAlert(for: selectedWidgetView)
|
||||
presentLegacyEditWidgetAlert(for: selectedWidget)
|
||||
}
|
||||
|
||||
@IBAction func saveTapped(_ sender: Any?) {
|
||||
@@ -1536,8 +1530,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
let color = overlapping ? UIColor.red : trashCanStoryBoardColor ?? UIColor.systemTeal
|
||||
trashCanButton.tintColor = color
|
||||
trashCanButton.titleLabel?.textColor = color
|
||||
if overlapping, let selectedWidgetView {
|
||||
OnScreenWidgetView.setFree(widget: selectedWidgetView)
|
||||
if overlapping, let selectedWidget {
|
||||
OnScreenWidgetView.setFree(widget: selectedWidget)
|
||||
}
|
||||
undoButton.alpha = 1.0
|
||||
}
|
||||
@@ -1547,7 +1541,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
private func clearSickInput() {
|
||||
if selectedWidgetView != nil && widgetViewSelected {
|
||||
if selectedWidget != nil && widgetViewSelected {
|
||||
OnScreenControls.shared()?.clearLeftStickTouchPadFlag()
|
||||
OnScreenControls.shared()?.clearRightStickTouchPadFlag()
|
||||
}
|
||||
@@ -1743,7 +1737,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
componentSizeStack.isHidden = true
|
||||
alphaSliderMode = .widgetAlpha
|
||||
widgetAlphaSlider.addTarget(self, action: #selector(widgetAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Alpha")
|
||||
widgetAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Opacity")
|
||||
widgetAlphaLabel.isUserInteractionEnabled = true
|
||||
widgetAlphaLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(switchAlphaSlider(_:))))
|
||||
borderWidthSliderMode = .widgetBorderWidth
|
||||
@@ -1809,7 +1803,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
autoDockTimerStack.isHidden = true;
|
||||
|
||||
dockedAlphaSlider.addTarget(self, action: #selector(dockedAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
dockedAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Docked alpha")
|
||||
dockedAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Docked opacity")
|
||||
dockedAlphaStack.isHidden = true;
|
||||
|
||||
let whiteAttrs: [NSAttributedString.Key: Any] = [.foregroundColor: UIColor.white]
|
||||
@@ -1844,20 +1838,20 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
bulkHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height")
|
||||
|
||||
bulkAlphaSlider.addTarget(self, action: #selector(bulkAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
bulkAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Alpha")
|
||||
bulkAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Opacity")
|
||||
|
||||
bulkBorderWidthSlider.addTarget(self, action: #selector(bulkBorderWidthSliderMoved(_:)), for: .valueChanged)
|
||||
bulkBorderWidthLabel.text = LocalizationHelper.localizedString(forKey: "Border width")
|
||||
|
||||
bulkLabelAlphaSlider.addTarget(self, action: #selector(bulkLabelAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
bulkLabelAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label alpha")
|
||||
bulkLabelAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label opacity")
|
||||
|
||||
bulkBorderAlphaSlider.addTarget(self, action: #selector(bulkBorderAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
bulkBorderAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border alpha")
|
||||
bulkBorderAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border opacity")
|
||||
|
||||
bulkHighlightAlphaSlider.addTarget(self, action: #selector(bulkHighlightAlphaSliderMoved(_:)), for: .valueChanged)
|
||||
bulkHighlightAlphaSlider.addTarget(self, action: #selector(bulkHighlightAlphaSliderMoveStopped(_:)), for: [.touchUpInside, .touchUpOutside])
|
||||
bulkHighlightAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight alpha")
|
||||
bulkHighlightAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight opacity")
|
||||
|
||||
bulkHighlightSizeSlider.minimumValue = 0.01
|
||||
bulkHighlightSizeSlider.maximumValue = 2
|
||||
@@ -1916,7 +1910,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
if textField == autoTapField {
|
||||
textField.resignFirstResponder()
|
||||
selectedWidgetView?.setAutoTapIntervalByText(str: textField.text ?? "")
|
||||
selectedWidget?.setAutoTapIntervalByText(str: textField.text ?? "")
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -1930,14 +1924,14 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func widgetSizeSliderMoved(_ sender: UISlider) {
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
selectedWidgetView.translatesAutoresizingMaskIntoConstraints = true
|
||||
let aspectRatio = selectedWidgetView.heightFactor / selectedWidgetView.widthFactor
|
||||
selectedWidgetView.widthFactor = CGFloat(sender.value)
|
||||
selectedWidgetView.heightFactor = min(max(CGFloat(sender.minimumValue), selectedWidgetView.widthFactor * aspectRatio), CGFloat(sender.maximumValue))
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
selectedWidget.translatesAutoresizingMaskIntoConstraints = true
|
||||
let aspectRatio = selectedWidget.heightFactor / selectedWidget.widthFactor
|
||||
selectedWidget.widthFactor = CGFloat(sender.value)
|
||||
selectedWidget.heightFactor = min(max(CGFloat(sender.minimumValue), selectedWidget.widthFactor * aspectRatio), CGFloat(sender.maximumValue))
|
||||
widgetSizeLabel.text = LocalizationHelper.localizedString(forKey: "Size: %.2f", sender.value)
|
||||
widgetHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height: %.2f", selectedWidgetView.heightFactor)
|
||||
widgetHeightSlider.value = Float(selectedWidgetView.heightFactor)
|
||||
widgetHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height: %.2f", selectedWidget.heightFactor)
|
||||
widgetHeightSlider.value = Float(selectedWidget.heightFactor)
|
||||
}
|
||||
if let selectedControllerLayer, controllerLayerSelected {
|
||||
layoutOSC.resizeControllerLayer(with: selectedControllerLayer, and: CGFloat(sender.value))
|
||||
@@ -1945,39 +1939,39 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func widgetSizeSliderTouchUp(_ sender: UISlider) {
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
selectedWidgetView.isBeingResized = false
|
||||
selectedWidget.isBeingResized = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func widgetHeightSliderMoved(_ sender: UISlider) {
|
||||
widgetHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height: %.2f", sender.value)
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
selectedWidgetView.translatesAutoresizingMaskIntoConstraints = true
|
||||
if selectedWidgetView.shape == "round" { return }
|
||||
selectedWidgetView.heightFactor = CGFloat(sender.value)
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
selectedWidget.translatesAutoresizingMaskIntoConstraints = true
|
||||
if selectedWidget.shape == "round" { return }
|
||||
selectedWidget.heightFactor = CGFloat(sender.value)
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func componentSizeSliderMoved(_ sender: UISlider) {
|
||||
componentSizeLabel.text = LocalizationHelper.localizedString(forKey: "Component size: %.2f ", sender.value)
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
selectedWidgetView.translatesAutoresizingMaskIntoConstraints = true
|
||||
selectedWidgetView.componentSizeFactor = CGFloat(sender.value)
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
selectedWidget.translatesAutoresizingMaskIntoConstraints = true
|
||||
selectedWidget.componentSizeFactor = CGFloat(sender.value)
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func widgetAlphaSliderMoved(_ sender: UISlider) {
|
||||
CATransaction.begin()
|
||||
CATransaction.setDisableActions(true)
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
switch alphaSliderMode {
|
||||
case .widgetAlpha: selectedWidgetView.adjustTransparency(alpha: CGFloat(sender.value), tweakBorderAlpha: true)
|
||||
case .labelAlpha: selectedWidgetView.tweakLabelAlpha(alpha: CGFloat(sender.value))
|
||||
case .borderAlpha: selectedWidgetView.tweakBorderAlpha(alpha: CGFloat(sender.value))
|
||||
case .highlightAlpha: selectedWidgetView.tweakHighlightAlpha(alpha: CGFloat(sender.value))
|
||||
case .widgetAlpha: selectedWidget.adjustTransparency(alpha: CGFloat(sender.value), tweakBorderAlpha: true)
|
||||
case .labelAlpha: selectedWidget.tweakLabelAlpha(alpha: CGFloat(sender.value))
|
||||
case .borderAlpha: selectedWidget.tweakBorderAlpha(alpha: CGFloat(sender.value))
|
||||
case .highlightAlpha: selectedWidget.tweakHighlightAlpha(alpha: CGFloat(sender.value))
|
||||
}
|
||||
loadWidgetAlphas()
|
||||
}
|
||||
@@ -1988,15 +1982,15 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func widgetBorderWidthSliderMoved(_ sender: UISlider) {
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
switch borderWidthSliderMode {
|
||||
case .widgetBorderWidth:
|
||||
selectedWidgetView.adjustBorder(width: CGFloat(sender.value))
|
||||
selectedWidget.adjustBorder(width: CGFloat(sender.value))
|
||||
case .highlightSize:
|
||||
selectedWidgetView.highlightSizeFactor = CGFloat(sender.value)
|
||||
if selectedWidgetView.widgetType == .button { selectedWidgetView.setupButtonDownVisualEffectLayer() }
|
||||
if selectedWidgetView.hasL3R3Indicator { selectedWidgetView.setupL3R3Indicator() }
|
||||
if selectedWidgetView.isDirectionPad { selectedWidgetView.setupLrudDirectionIndicatorlayers() }
|
||||
selectedWidget.highlightSizeFactor = CGFloat(sender.value)
|
||||
if selectedWidget.widgetType == .button { selectedWidget.setupButtonDownVisualEffectLayer() }
|
||||
if selectedWidget.hasL3R3Indicator { selectedWidget.setupL3R3Indicator() }
|
||||
if selectedWidget.isDirectionPad { selectedWidget.setupLrudDirectionIndicatorlayers() }
|
||||
}
|
||||
}
|
||||
loadWidgetWidths()
|
||||
@@ -2004,7 +1998,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
|
||||
@objc private func bulkBorderWidthSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkBorderWidthLabel.text = LocalizationHelper.localizedString(forKey: "Border width: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
@@ -2019,7 +2013,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkWidthSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkWidthLabel.text = LocalizationHelper.localizedString(forKey: "Width: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
@@ -2037,7 +2031,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkHeightSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkHeightLabel.text = LocalizationHelper.localizedString(forKey: "Height: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
@@ -2055,8 +2049,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkAlphaSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
bulkAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Alpha: %.2f", sender.value)
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Opacity: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
let widget = OnScreenWidgetView.mapping[sequence];
|
||||
@@ -2073,8 +2067,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkLabelAlphaSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
bulkLabelAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label alpha: %.2f", sender.value)
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkLabelAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Label opacity: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
OnScreenWidgetView.mapping[sequence]?.tweakLabelAlpha(alpha: CGFloat(sender.value))
|
||||
@@ -2088,8 +2082,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkBorderAlphaSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
bulkBorderAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border alpha: %.2f", sender.value)
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkBorderAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Border opacity: %.2f", sender.value)
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
OnScreenWidgetView.mapping[sequence]?.tweakBorderAlpha(alpha: CGFloat(sender.value))
|
||||
@@ -2103,8 +2097,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkHighlightAlphaSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
bulkHighlightAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight alpha: %.2f", sender.value)
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkHighlightAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Highlight opacity: %.2f", sender.value)
|
||||
OnScreenWidgetView.isTweakingHighlight = true
|
||||
if selectedWidget.isFolder {
|
||||
for sequence in selectedWidget.sequenceSet {
|
||||
@@ -2123,7 +2117,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkHighlightAlphaSliderMoveStopped(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||
OnScreenWidgetView.isTweakingHighlight = false
|
||||
if selectedWidget.isFolder {
|
||||
@@ -2142,7 +2136,7 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkHighlightSizeSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
bulkHighlightSizeLabel.text = LocalizationHelper.localizedString(forKey: "Highlight size: %.2f", sender.value)
|
||||
OnScreenWidgetView.isTweakingHighlight = true
|
||||
CATransaction.begin()
|
||||
@@ -2177,34 +2171,60 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func autoDockTimerSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
selectedWidget.autoDockIdleDuration = TimeInterval(Int(sender.value))
|
||||
autoDockTimerLabel.text = Int(sender.value) == 0 ? LocalizationHelper.localizedString(forKey: "Auto dock disabled", Int(sender.value)) : LocalizationHelper.localizedString(forKey: "Auto dock: %d s", Int(sender.value))
|
||||
return
|
||||
}
|
||||
|
||||
@objc private func dockedAlphaSliderMoved(_ sender: UISlider) {
|
||||
guard let selectedWidget = selectedWidgetView else {return}
|
||||
guard let selectedWidget = selectedWidget else {return}
|
||||
selectedWidget.autoDockSettledAlpha = CGFloat(sender.value)
|
||||
dockedAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Docked alpha: %d%%", Int(sender.value*100))
|
||||
dockedAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Docked opacity: %d%%", Int(sender.value*100))
|
||||
return
|
||||
}
|
||||
|
||||
@objc private func animationChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.animatesTransition = sender.selectedSegmentIndex == 1
|
||||
selectedWidget?.animatesTransition = sender.selectedSegmentIndex == 1
|
||||
}
|
||||
|
||||
@objc private func mouseDownButtonChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.mouseButtonAction = MouseButtonAction(rawValue: sender.selectedSegmentIndex) ?? .hovering
|
||||
selectedWidget?.mouseButtonAction = MouseButtonAction(rawValue: sender.selectedSegmentIndex) ?? .hovering
|
||||
}
|
||||
|
||||
@objc private func buttonModeChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.buttonMode = ButtonMode(rawValue: sender.selectedSegmentIndex) ?? .slideToToggle
|
||||
if let selectedWidget {
|
||||
switch sender.selectedSegmentIndex {
|
||||
case ButtonMode.slideToToggle.rawValue where selectedWidget.isFunctionalButton:
|
||||
self.handleInvalidButtonModeTipsFor(widget: selectedWidget, sender: sender)
|
||||
case ButtonMode.slideAndHold.rawValue where (selectedWidget.isFunctionalButton && !selectedWidget.isFolder) || selectedWidget.containsShortcutAction:
|
||||
self.handleInvalidButtonModeTipsFor(widget: selectedWidget, sender: sender)
|
||||
case ButtonMode.tapToToggle.rawValue where selectedWidget.isFunctionalButton && !selectedWidget.isTapToToggleException:
|
||||
self.handleInvalidButtonModeTipsFor(widget: selectedWidget, sender: sender)
|
||||
default:
|
||||
GenericUtils.handleButtonModeTip(in: self)
|
||||
selectedWidget.buttonMode = ButtonMode(rawValue: sender.selectedSegmentIndex) ?? .slideToToggle
|
||||
}
|
||||
}
|
||||
}
|
||||
private func handleInvalidButtonModeTipsFor(widget: OnScreenWidgetView, sender: UISegmentedControl) {
|
||||
AlertControllerUtil.showAlert(
|
||||
in: self,
|
||||
title: LocalizationHelper.localizedString(forKey: "Tips"),
|
||||
message: "\n\(LocalizationHelper.localizedString(forKey: "invalidButtonModeTip"))\n\n\(LocalizationHelper.localizedString(forKey:widget.isFolder ? "folderButtonModeTip" : ""))",
|
||||
withCancel: false,
|
||||
buttonTitle: LocalizationHelper.localizedString(forKey: "Got it!"),
|
||||
countdown: 0,
|
||||
completion: {
|
||||
sender.selectedSegmentIndex = sender.previousSelectedSegmentIndex
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@objc private func collectionHiddenChanged(_ sender: UISegmentedControl) {
|
||||
if let selectedWidgetView {
|
||||
OnScreenWidgetView.set(folded: sender.selectedSegmentIndex == 1, for: selectedWidgetView)
|
||||
if let selectedWidget {
|
||||
OnScreenWidgetView.set(folded: sender.selectedSegmentIndex == 1, for: selectedWidget)
|
||||
}
|
||||
self.bulkEditButton.isEnabled = sender.selectedSegmentIndex == 0
|
||||
self.importFromOtherButton.isEnabled = sender.selectedSegmentIndex == 0
|
||||
@@ -2213,18 +2233,18 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func bulkMoveChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.bulkMoveEnabled = sender.selectedSegmentIndex == 1
|
||||
selectedWidget?.bulkMoveEnabled = sender.selectedSegmentIndex == 1
|
||||
}
|
||||
|
||||
@objc private func revealModeChanged(_ sender: UISegmentedControl) {
|
||||
if let selectedWidgetView {
|
||||
selectedWidgetView.revealMode = RevealMode(rawValue: sender.selectedSegmentIndex) ?? .coexist
|
||||
OnScreenWidgetView.set(folded: selectedWidgetView.folded, for: selectedWidgetView)
|
||||
if let selectedWidget {
|
||||
selectedWidget.revealMode = RevealMode(rawValue: sender.selectedSegmentIndex) ?? .coexist
|
||||
OnScreenWidgetView.set(folded: selectedWidget.folded, for: selectedWidget)
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func vibrationStyleChanged(_ sender: UISegmentedControl) {
|
||||
guard let selectedWidgetView = selectedWidgetView else {return}
|
||||
guard let selectedWidgetView = selectedWidget else {return}
|
||||
|
||||
if #available(iOS 13.0, *) {
|
||||
if sender.selectedSegmentIndex <= UIImpactFeedbackGenerator.FeedbackStyle.rigid.rawValue {
|
||||
@@ -2248,28 +2268,28 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
}
|
||||
|
||||
@objc private func sensitivityXSliderMoved(_ sender: UISlider) {
|
||||
let key = selectedWidgetView?.hasSensitivityY == true ? "SensitivityX: %.2f" : "Sensitivity: %.2f"
|
||||
let key = selectedWidget?.hasSensitivityY == true ? "SensitivityX: %.2f" : "Sensitivity: %.2f"
|
||||
sensitivityXLabel.text = LocalizationHelper.localizedString(forKey: key, sender.value)
|
||||
sensitivityYLabel.text = LocalizationHelper.localizedString(forKey: "SensitivityY: %.2f", sender.value)
|
||||
sensitivityYSlider.value = sender.value
|
||||
selectedWidgetView?.sensitivityFactorX = CGFloat(sender.value)
|
||||
selectedWidgetView?.sensitivityFactorY = CGFloat(sender.value)
|
||||
selectedWidget?.sensitivityFactorX = CGFloat(sender.value)
|
||||
selectedWidget?.sensitivityFactorY = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func sensitivityYSliderMoved(_ sender: UISlider) {
|
||||
sensitivityYLabel.text = LocalizationHelper.localizedString(forKey: "SensitivityY: %.2f", sender.value)
|
||||
selectedWidgetView?.sensitivityFactorY = CGFloat(sender.value)
|
||||
selectedWidget?.sensitivityFactorY = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func walkModeThresholdSliderMoved(_ sender: UISlider) {
|
||||
walkModeThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Walkmode threshold: %.0f ", sender.value)
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
selectedWidgetView.dWheelWalkModeThreshold = CGFloat(sender.value)
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
selectedWidget.dWheelWalkModeThreshold = CGFloat(sender.value)
|
||||
guard let onScreenControls = OnScreenControls.shared() else { return }
|
||||
if selectedWidgetView.touchPadString == "LSWHEEL" {
|
||||
if selectedWidget.touchPadString == "LSWHEEL" {
|
||||
onScreenControls.sendLeftStickTouchPadEvent(0, CGFloat(sender.value))
|
||||
}
|
||||
if selectedWidgetView.touchPadString == "RSWHEEL" {
|
||||
if selectedWidget.touchPadString == "RSWHEEL" {
|
||||
onScreenControls.sendRightStickTouchPadEvent(0, CGFloat(sender.value))
|
||||
}
|
||||
}
|
||||
@@ -2277,17 +2297,17 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
@objc private func minStickOffsetSliderMoved(_ sender: UISlider) {
|
||||
minStickOffsetLabel.text = LocalizationHelper.localizedString(forKey: "Minimum offset: %.0f", sender.value)
|
||||
if let selectedWidgetView, widgetViewSelected {
|
||||
selectedWidgetView.minStickOffset = CGFloat(sender.value)
|
||||
if let selectedWidget, widgetViewSelected {
|
||||
selectedWidget.minStickOffset = CGFloat(sender.value)
|
||||
guard let onScreenControls = OnScreenControls.shared() else { return }
|
||||
if selectedWidgetView.touchPadString == "LSPAD"
|
||||
|| selectedWidgetView.touchPadString == "LSVPAD"
|
||||
|| selectedWidgetView.touchPadString == "LSWHEEL" {
|
||||
if selectedWidget.touchPadString == "LSPAD"
|
||||
|| selectedWidget.touchPadString == "LSVPAD"
|
||||
|| selectedWidget.touchPadString == "LSWHEEL" {
|
||||
onScreenControls.sendLeftStickTouchPadEvent(CGFloat(sender.value), 0)
|
||||
}
|
||||
if selectedWidgetView.touchPadString == "RSPAD"
|
||||
|| selectedWidgetView.touchPadString == "RSVPAD"
|
||||
|| selectedWidgetView.touchPadString == "RSWHEEL" {
|
||||
if selectedWidget.touchPadString == "RSPAD"
|
||||
|| selectedWidget.touchPadString == "RSVPAD"
|
||||
|| selectedWidget.touchPadString == "RSWHEEL" {
|
||||
onScreenControls.sendRightStickTouchPadEvent(CGFloat(sender.value), 0)
|
||||
}
|
||||
}
|
||||
@@ -2295,18 +2315,18 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
@objc private func slideThresholdSliderMoved(_ sender: UISlider) {
|
||||
slideThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold: %.1f ", sender.value)
|
||||
selectedWidgetView?.slideThreshold = CGFloat(sender.value)
|
||||
selectedWidget?.slideThreshold = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func sprintKeyActionChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.sprintKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: UInt8(sender.selectedSegmentIndex)) ?? .hold
|
||||
selectedWidget?.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 }
|
||||
guard OnScreenWidgetView.editMode, let selectedWidget, widgetViewSelected else { return }
|
||||
|
||||
if sender.value < walkKeyThresholdSlider.value {
|
||||
walkKeyThresholdSlider.value = sender.value
|
||||
@@ -2314,13 +2334,13 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
autoFitLabel(walkKeyThresholdLabel)
|
||||
}
|
||||
|
||||
selectedWidgetView.sprintKeyThreshold = CGFloat(sender.value)
|
||||
selectedWidgetView.walkKeyThreshold = CGFloat(walkKeyThresholdSlider.value)
|
||||
selectedWidgetView.updateMovementThresholdPreview()
|
||||
selectedWidget.sprintKeyThreshold = CGFloat(sender.value)
|
||||
selectedWidget.walkKeyThreshold = CGFloat(walkKeyThresholdSlider.value)
|
||||
selectedWidget.updateMovementThresholdPreview()
|
||||
}
|
||||
|
||||
@objc private func walkKeyActionChanged(_ sender: UISegmentedControl) {
|
||||
selectedWidgetView?.walkKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: UInt8(sender.selectedSegmentIndex)) ?? .hold
|
||||
selectedWidget?.walkKeyActionType = OnScreenWidgetView.WalkSprintKeyActionType(rawValue: UInt8(sender.selectedSegmentIndex)) ?? .hold
|
||||
}
|
||||
|
||||
@objc private func walkKeyThresholdSliderMoved(_ sender: UISlider) {
|
||||
@@ -2331,50 +2351,50 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: " Slide threshold: %0.2f ", sender.value)
|
||||
autoFitLabel(walkKeyThresholdLabel)
|
||||
|
||||
guard OnScreenWidgetView.editMode, let selectedWidgetView, widgetViewSelected else { return }
|
||||
guard OnScreenWidgetView.editMode, let selectedWidget, widgetViewSelected else { return }
|
||||
|
||||
selectedWidgetView.walkKeyThreshold = CGFloat(sender.value)
|
||||
selectedWidgetView.updateMovementThresholdPreview()
|
||||
selectedWidget.walkKeyThreshold = CGFloat(sender.value)
|
||||
selectedWidget.updateMovementThresholdPreview()
|
||||
}
|
||||
|
||||
@objc private func yawFactorSliderMoved(_ sender: UISlider) {
|
||||
yawFactorLabel.text = LocalizationHelper.localizedString(forKey: "Yaw factor: %.2f", sender.value)
|
||||
pitchFactorLabel.text = LocalizationHelper.localizedString(forKey: "Pitch factor: %.2f", sender.value)
|
||||
pitchFactorSlider.value = sender.value
|
||||
selectedWidgetView?.yawFactor = CGFloat(sender.value)
|
||||
selectedWidgetView?.pitchFactor = CGFloat(sender.value)
|
||||
selectedWidget?.yawFactor = CGFloat(sender.value)
|
||||
selectedWidget?.pitchFactor = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func pitchFactorSliderMoved(_ sender: UISlider) {
|
||||
pitchFactorLabel.text = LocalizationHelper.localizedString(forKey: "Pitch factor: %.2f", sender.value)
|
||||
selectedWidgetView?.pitchFactor = CGFloat(sender.value)
|
||||
selectedWidget?.pitchFactor = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func rollFactorSliderMoved(_ sender: UISlider) {
|
||||
rollFactorLabel.text = LocalizationHelper.localizedString(forKey: "Roll factor: %.2f", sender.value)
|
||||
selectedWidgetView?.rollFactor = CGFloat(sender.value)
|
||||
selectedWidget?.rollFactor = CGFloat(sender.value)
|
||||
}
|
||||
|
||||
@objc private func decelerationRateSliderMoved(_ sender: UISlider) {
|
||||
if let selectedWidgetView {
|
||||
if let selectedWidget {
|
||||
switch decelerationRateSliderMode {
|
||||
case .decelerationRateX: selectedWidgetView.decelerationRateX = CGFloat(sender.value)
|
||||
case .decelerationRateY: selectedWidgetView.decelerationRateY = CGFloat(sender.value)
|
||||
case .decelerationRateX: selectedWidget.decelerationRateX = CGFloat(sender.value)
|
||||
case .decelerationRateY: selectedWidget.decelerationRateY = CGFloat(sender.value)
|
||||
}
|
||||
}
|
||||
loadDecelerationRates()
|
||||
}
|
||||
|
||||
@objc private func anchorModeChanged(_ sender: UISegmentedControl) {
|
||||
if let selectedWidgetView {
|
||||
selectedWidgetView.touchPointAnchored = sender.selectedSegmentIndex == 1
|
||||
if let selectedWidget {
|
||||
selectedWidget.touchPointAnchored = sender.selectedSegmentIndex == 1
|
||||
componentSizeStack.isHidden = sender.selectedSegmentIndex != 0
|
||||
stickIndicatorOffsetStack.isHidden = sender.selectedSegmentIndex != 1
|
||||
stickIndicatorOffsetSlider.value = Float(selectedWidgetView.stickIndicatorOffset)
|
||||
stickIndicatorOffsetSlider.value = Float(selectedWidget.stickIndicatorOffset)
|
||||
self.stickIndicatorOffsetSliderMoved(stickIndicatorOffsetSlider)
|
||||
autoFitStack(self.widgetPanelStack)
|
||||
|
||||
if selectedWidgetView.isDirectionPad {
|
||||
if selectedWidget.isDirectionPad {
|
||||
sensitivityXSlider.value = sender.selectedSegmentIndex == 0 ? 0.0 : 6.5
|
||||
sensitivityXSliderMoved(sensitivityXSlider)
|
||||
}
|
||||
@@ -2383,8 +2403,8 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
@objc private func stickIndicatorOffsetSliderMoved(_ sender: UISlider) {
|
||||
stickIndicatorOffsetLabel.text = LocalizationHelper.localizedString(forKey: "Indicator offset: %.0f", sender.value)
|
||||
if let selectedWidgetView {
|
||||
selectedWidgetView.stickIndicatorOffset = CGFloat(sender.value)
|
||||
if let selectedWidget {
|
||||
selectedWidget.stickIndicatorOffset = CGFloat(sender.value)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2416,6 +2436,9 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
if widgetPanelMovedByTouch {
|
||||
latestTouchLocation = touch.location(in: view)
|
||||
}
|
||||
if widgetPanelTouched(touch), selectedWidget != nil {
|
||||
GenericUtils.handleWidgetPanelTip(in: self)
|
||||
}
|
||||
}
|
||||
for touch in touches {
|
||||
var touchLocation = touch.location(in: view)
|
||||
@@ -2446,17 +2469,17 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg
|
||||
|
||||
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
widgetPanelStack.isUserInteractionEnabled = true
|
||||
if let selectedWidgetView {
|
||||
view.insertSubview(selectedWidgetView, belowSubview: widgetPanelStack)
|
||||
if selectedWidgetView.widgetType == .touchPad {
|
||||
view.sendSubviewToBack(selectedWidgetView)
|
||||
if let selectedWidget {
|
||||
view.insertSubview(selectedWidget, belowSubview: widgetPanelStack)
|
||||
if selectedWidget.widgetType == .touchPad {
|
||||
view.sendSubviewToBack(selectedWidget)
|
||||
}
|
||||
}
|
||||
if !isToolbarHidden, let selectedWidgetView, layerIsOverlappingWithTrashcanButton(selectedWidgetView.layer), selectedWidgetView.firstTouchMoved {
|
||||
OnScreenWidgetView.setFree(widget: selectedWidgetView)
|
||||
OnScreenWidgetView.removeWidgetFromMappings(key: selectedWidgetView.sequence)
|
||||
selectedWidgetView.removeFromSuperview()
|
||||
onScreenWidgetViews.remove(selectedWidgetView)
|
||||
if !isToolbarHidden, let selectedWidget, layerIsOverlappingWithTrashcanButton(selectedWidget.layer), selectedWidget.firstTouchMoved {
|
||||
OnScreenWidgetView.setFree(widget: selectedWidget)
|
||||
OnScreenWidgetView.removeWidgetFromMappings(key: selectedWidget.sequence)
|
||||
selectedWidget.removeFromSuperview()
|
||||
onScreenWidgetViews.remove(selectedWidget)
|
||||
}
|
||||
if !isToolbarHidden, let draggedLayer = layoutOSC.layerBeingDragged, layerIsOverlappingWithTrashcanButton(draggedLayer) {
|
||||
draggedLayer.isHidden = true
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"1sF-08-aCr.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Highlight alpha\"; ObjectID = \"1sF-08-aCr\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Highlight opacity\"; ObjectID = \"1sF-08-aCr\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Highlight alpha"
|
||||
"value" : "Highlight opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4383,13 +4383,13 @@
|
||||
}
|
||||
},
|
||||
"kSX-ci-kx5.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Label alpha\"; ObjectID = \"kSX-ci-kx5\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Label opacity\"; ObjectID = \"kSX-ci-kx5\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Label alpha"
|
||||
"value" : "Label opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5505,13 +5505,13 @@
|
||||
}
|
||||
},
|
||||
"Pwa-YK-6Q2.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Alpha\"; ObjectID = \"Pwa-YK-6Q2\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Opacity\"; ObjectID = \"Pwa-YK-6Q2\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Alpha"
|
||||
"value" : "Opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5669,13 +5669,13 @@
|
||||
}
|
||||
},
|
||||
"qFn-D7-7aD.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Docked alpha\"; ObjectID = \"qFn-D7-7aD\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Docked opacity\"; ObjectID = \"qFn-D7-7aD\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Docked alpha"
|
||||
"value" : "Docked opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5975,13 +5975,13 @@
|
||||
}
|
||||
},
|
||||
"sAF-Vy-ZzK.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Border alpha\"; ObjectID = \"sAF-Vy-ZzK\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Border opacity\"; ObjectID = \"sAF-Vy-ZzK\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Border alpha"
|
||||
"value" : "Border opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6989,13 +6989,13 @@
|
||||
}
|
||||
},
|
||||
"yF0-Tu-L8X.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Alpha\"; ObjectID = \"yF0-Tu-L8X\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Opacity\"; ObjectID = \"yF0-Tu-L8X\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Alpha"
|
||||
"value" : "Opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,13 +284,13 @@
|
||||
}
|
||||
},
|
||||
"4Kd-Cc-aYN.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Highlight alpha\"; ObjectID = \"4Kd-Cc-aYN\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Highlight opacity\"; ObjectID = \"4Kd-Cc-aYN\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Highlight alpha"
|
||||
"value" : "Highlight opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -914,13 +914,13 @@
|
||||
}
|
||||
},
|
||||
"9Dr-3c-z61.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Label alpha\"; ObjectID = \"9Dr-3c-z61\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Label opacity\"; ObjectID = \"9Dr-3c-z61\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Label alpha"
|
||||
"value" : "Label opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2390,13 +2390,13 @@
|
||||
}
|
||||
},
|
||||
"eRy-My-vvU.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Border alpha\"; ObjectID = \"eRy-My-vvU\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Border opacity\"; ObjectID = \"eRy-My-vvU\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Border alpha"
|
||||
"value" : "Border opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3332,13 +3332,13 @@
|
||||
}
|
||||
},
|
||||
"kxI-bn-pRU.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Docked alpha\"; ObjectID = \"kxI-bn-pRU\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Docked opacity\"; ObjectID = \"kxI-bn-pRU\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Docked alpha"
|
||||
"value" : "Docked opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5204,13 +5204,13 @@
|
||||
}
|
||||
},
|
||||
"qPQ-U2-aSg.text" : {
|
||||
"comment" : "Class = \"UILabel\"; text = \"Alpha\"; ObjectID = \"qPQ-U2-aSg\";",
|
||||
"comment" : "Class = \"UILabel\"; text = \"Opacity\"; ObjectID = \"qPQ-U2-aSg\";",
|
||||
"extractionState" : "extracted_with_value",
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Alpha"
|
||||
"value" : "Opacity"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user