From 0af4c70e168ca0cbacaaaab3b6a44edd5d25ba62 Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Wed, 20 May 2026 00:59:34 +0800 Subject: [PATCH] - walk-sprint sign for direction pad - session launch UI & animation fixes --- VoidLink/Input/OnScreenWidgetView.swift | 35 ++++++++++++++++--- VoidLink/SVGs/sprintSign.svg | 11 ++++++ VoidLink/SVGs/walkSign.svg | 11 ++++++ ...LayoutOnScreenControlsViewController.swift | 30 ++++++++++------ .../StreamFrameViewController.m | 13 +++++-- 5 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 VoidLink/SVGs/sprintSign.svg create mode 100644 VoidLink/SVGs/walkSign.svg diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index db00c42a..1d6d84d5 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -361,6 +361,8 @@ import ObjectiveC.runtime @objc public var downIndicator = CAShapeLayer() @objc public var leftIndicator = CAShapeLayer() @objc public var rightIndicator = CAShapeLayer() + @objc public var sprintSign = CALayer() + @objc public var walkSign = CALayer() @objc public var walkKeyThresholdPreviewLayer = CAShapeLayer() @objc public var sprintKeyThresholdPreviewLayer = CAShapeLayer() @@ -842,6 +844,8 @@ import ObjectiveC.runtime self.rightIndicator.borderColor = self.buttonDownVisualEffectLayer.borderColor self.walkKeyThresholdPreviewLayer.strokeColor = self.buttonDownVisualEffectLayer.borderColor self.sprintKeyThresholdPreviewLayer.strokeColor = self.buttonDownVisualEffectLayer.borderColor + GraphicUtils.changeColor(layer: self.sprintSign, color: standardHighlightColor.withAlphaComponent(highlightAlpha)) + GraphicUtils.changeColor(layer: self.walkSign, color: standardHighlightColor.withAlphaComponent(highlightAlpha)) } private func tweakAlpha(tweakBorderAlpha:Bool, tweakLabelAlpha:Bool = true){ @@ -1317,8 +1321,8 @@ import ObjectiveC.runtime private func setupLrudDirectionLayer(directionLayer:CAShapeLayer) { let indicatorFrame = CAShapeLayer(); indicatorFrame.frame = CGRectMake(0, 0, 75*highlightSizeFactor, 75*highlightSizeFactor) - indicatorFrame.cornerRadius = 9 * highlightSizeFactor - directionLayer.borderWidth = 6 * min(1.0, highlightSizeFactor) + indicatorFrame.cornerRadius = 23 * highlightSizeFactor + directionLayer.borderWidth = 5.3 * min(1.0, highlightSizeFactor) directionLayer.frame = indicatorFrame.bounds.insetBy(dx: -directionLayer.borderWidth, dy: -directionLayer.borderWidth) // Adjust the inset as needed directionLayer.cornerRadius = indicatorFrame.cornerRadius + directionLayer.borderWidth directionLayer.backgroundColor = UIColor.clear.cgColor @@ -1373,7 +1377,7 @@ import ObjectiveC.runtime self.sendComboButtonsUpEvent(comboStrings: [self.comboButtonStrings[0]]) } } - + self.sprintSign.isHidden = !isInSprintMode if !directionPadTouchBegan, isInSprintMode, vibrationOn { vibrationGenerator.prepare() vibrationGenerator.impactOccurred() @@ -1393,7 +1397,7 @@ import ObjectiveC.runtime self.sendComboButtonsUpEvent(comboStrings: [self.comboButtonStrings[1]]) } } - + self.walkSign.isHidden = !isInWalkMode if !directionPadTouchBegan, isInWalkMode, vibrationOn { vibrationGenerator.prepare() vibrationGenerator.impactOccurred() @@ -1670,6 +1674,7 @@ import ObjectiveC.runtime } } + @objc public func setupLrudDirectionIndicatorlayers() { CATransaction.begin() CATransaction.setDisableActions(true) @@ -1702,6 +1707,26 @@ import ObjectiveC.runtime self.layer.addSublayer(self.stickWheelAxis) self.stickWheelAxis.isHidden = false } + + self.sprintSign.removeFromSuperlayer() + self.sprintSign = GraphicUtils.makeSVGLayer(from: "sprintSign", in: self.upIndicator, at:CGPoint(x: 0.5+0.028, y: 0.5-0.22), targetSize: CGSize(width: 26*highlightSizeFactor, height: 26*highlightSizeFactor)) + GraphicUtils.changeColor(layer: self.sprintSign, color: standardHighlightColor) + self.upIndicator.addSublayer(self.sprintSign) + var frameInSelfLayer = self.upIndicator.convert(self.sprintSign.frame, to: self.layer) + self.sprintSign.removeFromSuperlayer() + self.layer.addSublayer(self.sprintSign) + self.sprintSign.frame = frameInSelfLayer + self.sprintSign.isHidden = !OnScreenWidgetView.editMode + + self.walkSign.removeFromSuperlayer() + self.walkSign = GraphicUtils.makeSVGLayer(from: "walkSign", in: self.upIndicator, at:CGPoint(x: 0.5+0.032, y: 0.5-0.22), targetSize: CGSize(width: 32*highlightSizeFactor, height: 32*highlightSizeFactor)) + GraphicUtils.changeColor(layer: self.walkSign, color: standardHighlightColor) + self.upIndicator.addSublayer(self.walkSign) + frameInSelfLayer = self.upIndicator.convert(self.walkSign.frame, to: self.layer) + self.walkSign.removeFromSuperlayer() + self.layer.addSublayer(self.walkSign) + self.walkSign.frame = frameInSelfLayer + self.walkSign.isHidden = true setupMovementThresholdPreviewLayersIfNeeded() updateMovementThresholdPreview() @@ -3027,6 +3052,8 @@ import ObjectiveC.runtime self.leftIndicator.isHidden = true self.rightIndicator.isHidden = true self.anchorBall.isHidden = true + self.sprintSign.isHidden = true + self.walkSign.isHidden = true } if CommandManager.verticalTouchPads.contains(touchPadString){ diff --git a/VoidLink/SVGs/sprintSign.svg b/VoidLink/SVGs/sprintSign.svg new file mode 100644 index 00000000..1002da3a --- /dev/null +++ b/VoidLink/SVGs/sprintSign.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/VoidLink/SVGs/walkSign.svg b/VoidLink/SVGs/walkSign.svg new file mode 100644 index 00000000..4a4a4f87 --- /dev/null +++ b/VoidLink/SVGs/walkSign.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift index 60c74832..bd0ba689 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.swift @@ -1761,14 +1761,18 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg walkModeThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Walkmode threshold") walkModeThresholdStack.isHidden = true + let whiteAttrs: [NSAttributedString.Key: Any] = [.foregroundColor: UIColor.white] + sprintKeyThresholdSlider.addTarget(self, action: #selector(sprintKeyThresholdSliderMoved(_:)), for: .valueChanged) sprintKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold") sprintKeySelector.addTarget(self, action: #selector(sprintKeyActionChanged(_:)), for: .valueChanged) + sprintKeySelector.setTitleTextAttributes(whiteAttrs, for: .normal) sprintKeyStack.isHidden = true walkKeyThresholdSlider.addTarget(self, action: #selector(walkKeyThresholdSliderMoved(_:)), for: .valueChanged) walkKeyThresholdLabel.text = LocalizationHelper.localizedString(forKey: "Slide threshold") walkKeySelector.addTarget(self, action: #selector(walkKeyActionChanged(_:)), for: .valueChanged) + walkKeySelector.setTitleTextAttributes(whiteAttrs, for: .normal) walkKeyStack.isHidden = true minStickOffsetSlider.addTarget(self, action: #selector(minStickOffsetSliderMoved(_:)), for: .valueChanged) @@ -1796,9 +1800,6 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg stickIndicatorOffsetLabel.text = LocalizationHelper.localizedString(forKey: "Indicator offset") stickIndicatorOffsetStack.isHidden = true - anchorModeSelector.addTarget(self, action: #selector(anchorModeChanged(_:)), for: .valueChanged) - anchorModeStack.isHidden = true - autoDockTimerSlider.addTarget(self, action: #selector(autoDockTimerSliderMoved(_:)), for: .valueChanged) autoDockTimerLabel.text = LocalizationHelper.localizedString(forKey: "Auto dock") autoDockTimerStack.isHidden = true; @@ -1806,8 +1807,11 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg dockedAlphaSlider.addTarget(self, action: #selector(dockedAlphaSliderMoved(_:)), for: .valueChanged) dockedAlphaLabel.text = LocalizationHelper.localizedString(forKey: "Docked opacity") dockedAlphaStack.isHidden = true; - - let whiteAttrs: [NSAttributedString.Key: Any] = [.foregroundColor: UIColor.white] + + anchorModeSelector.addTarget(self, action: #selector(anchorModeChanged(_:)), for: .valueChanged) + anchorModeSelector.setTitleTextAttributes(whiteAttrs, for: .normal) + anchorModeStack.isHidden = true + mouseButtonDownSelector.addTarget(self, action: #selector(mouseDownButtonChanged(_:)), for: .valueChanged) mouseButtonDownSelector.setTitleTextAttributes(whiteAttrs, for: .normal) mouseDownButtonStack.isHidden = true @@ -1819,11 +1823,13 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg buttonModeSelector.addTarget(self, action: #selector(buttonModeChanged(_:)), for: .valueChanged) buttonModeSelector.setTitleTextAttributes(whiteAttrs, for: .normal) buttonModeStack.isHidden = true + collectedWidgetsSelector.addTarget(self, action: #selector(collectionHiddenChanged(_:)), for: .valueChanged) collectedWidgetsSelector.setTitleTextAttributes(whiteAttrs, for: .normal) revealModeSelector.addTarget(self, action: #selector(revealModeChanged(_:)), for: .valueChanged) revealModeSelector.setTitleTextAttributes(whiteAttrs, for: .normal) collectedWidgetsStack.isHidden = true + bulkMoveSelector.addTarget(self, action: #selector(bulkMoveChanged(_:)), for: .valueChanged) bulkMoveSelector.setTitleTextAttributes(whiteAttrs, for: .normal) bulkMoveStack.isHidden = true @@ -2405,16 +2411,20 @@ final class LayoutOnScreenControlsViewController: UIViewController, OnScreenWidg @objc private func anchorModeChanged(_ sender: UISegmentedControl) { if let selectedWidget { selectedWidget.touchPointAnchored = sender.selectedSegmentIndex == 1 - componentSizeStack.isHidden = sender.selectedSegmentIndex != 0 - stickIndicatorOffsetStack.isHidden = sender.selectedSegmentIndex != 1 - stickIndicatorOffsetSlider.value = Float(selectedWidget.stickIndicatorOffset) - self.stickIndicatorOffsetSliderMoved(stickIndicatorOffsetSlider) - autoFitStack(self.widgetPanelStack) + + if selectedWidget.isDisplacementBasedStickPad { + componentSizeStack.isHidden = sender.selectedSegmentIndex != 0 + stickIndicatorOffsetStack.isHidden = sender.selectedSegmentIndex != 1 + stickIndicatorOffsetSlider.value = Float(selectedWidget.stickIndicatorOffset) + self.stickIndicatorOffsetSliderMoved(stickIndicatorOffsetSlider) + } if selectedWidget.isDirectionPad { sensitivityXSlider.value = sender.selectedSegmentIndex == 0 ? 0.0 : 6.5 sensitivityXSliderMoved(sensitivityXSlider) } + + autoFitStack(self.widgetPanelStack) } } diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index 593b4356..c05d7c6d 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -788,9 +788,9 @@ } - (void)updateTheme { - self.view.backgroundColor = ThemeManager.menuBackgroundColor; - _stageLabel.textColor = [ThemeManager.textColor colorWithAlphaComponent:0.9]; - _spinner.color = ThemeManager.textColor; + self.view.backgroundColor = UIColor.blackColor; + _stageLabel.textColor = [UIColor.whiteColor colorWithAlphaComponent:0.9]; + _spinner.color = UIColor.whiteColor; } - (void)viewDidLoad @@ -817,6 +817,7 @@ _stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2); _spinner = [[UIActivityIndicatorView alloc] init]; + _spinner.color = UIColor.whiteColor; [_spinner setUserInteractionEnabled:NO]; #if TARGET_OS_TV [_spinner setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge]; @@ -967,6 +968,12 @@ _mainFrameViewcontroller.sessionLaunchedWithAbsoluteTouch = _settings.touchMode.intValue == AbsoluteTouch; OnScreenWidgetView.gamepadArrivalReported = false; + + OnScreenWidgetView.enableFolderAnimation = false; + dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)); + dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + OnScreenWidgetView.enableFolderAnimation = true; + }); } - (void)keyboardWillShow:(NSNotification *)notification{