diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index da62dc96..3f280679 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -626,7 +626,7 @@ import ObjectiveC.runtime self.isFolder = self.cmdString.contains("FOLDER") self.containsShortcutAction = self.cmdString.contains("+") - self.hasComponent = self.isStickWheel || (self.hasDisplacementBasedStickPad && self.widgetType == .touchPad && !self.touchPointAnchored) + self.hasComponent = self.isStickWheel || (self.isDisplacementBasedStickPad && !self.touchPointAnchored) self.hasL3R3Indicator = !self.isStickWheel && !self.isDirectionPad && self.widgetType == WidgetTypeEnum.touchPad /* diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index 51c8d070..b96f58db 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -4195,6 +4195,29 @@ } } }, + "Displacement-based left stick pad" : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "位移型左摇杆触控板" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "位移型左搖桿觸控板" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "位移型左搖桿觸控板" + } + } + } + }, "Displacement-based right stick pad" : { "extractionState" : "manual", "localizations" : { @@ -13254,6 +13277,29 @@ } } }, + "Velocity-based left stick pad" : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "矢量型左摇杆触控板" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "矢量型左搖桿觸控板" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "矢量型左搖桿觸控板" + } + } + } + }, "Velocity-based right stick pad" : { "extractionState" : "manual", "localizations" : { diff --git a/VoidLinkPreview/AbstractGamepadView.swift b/VoidLinkPreview/AbstractGamepadView.swift index 8b38fb44..e9a4e7c0 100644 --- a/VoidLinkPreview/AbstractGamepadView.swift +++ b/VoidLinkPreview/AbstractGamepadView.swift @@ -68,8 +68,8 @@ enum GamepadToggleTarget: Hashable { case .select: return [.select] case .start: return [.start] case .home: return [.home] - case .leftStick: return [.ls, .lswheel, .lsPad] - case .rightStick: return [.rs, .rsPad, .rsvPad] + case .leftStick: return [.ls, .lswheel, .lsPad, .lsvPad] + case .rightStick: return [.rs, .rsvPad, .rsPad, .rsWheel] case .leftShoulder: return [.leftShoulder] case .rightShoulder: return [.rightShoulder] case .leftTrigger: return [.leftTrigger, .ltPad] @@ -84,7 +84,7 @@ enum GamepadWidget: Hashable { case a, b, x, y case select, start, home case dPad, up, down, left, right - case ls, lsPad, lswheel, rs, rsPad, rsvPad, rsWheel + case ls, lsPad, lswheel, lsvPad, rs, rsvPad, rsPad, rsWheel case leftShoulder, rightShoulder case leftTrigger, ltPad, rightTrigger, rtPad case ds4Touchpad @@ -107,6 +107,7 @@ enum GamepadWidget: Hashable { case .ls: return "LS" case .lswheel: return "LSWHEEL" case .lsPad: return "LSPAD" + case .lsvPad: return "LSVPAD" case .rs: return "RS" case .rsPad: return "RSPAD" case .rsvPad: return "RSVPAD" @@ -138,7 +139,8 @@ enum GamepadWidget: Hashable { case .right: return SwiftLocalizationHelper.localizedString(forKey: "Gamepad Right") case .ls: return SwiftLocalizationHelper.localizedString(forKey: "LS/L3 button") case .lswheel: return SwiftLocalizationHelper.localizedString(forKey: "Left stick wheel") - case .lsPad: return SwiftLocalizationHelper.localizedString(forKey: "Left stick pad") + case .lsPad: return SwiftLocalizationHelper.localizedString(forKey: "Displacement-based left stick pad") + case .lsvPad: return SwiftLocalizationHelper.localizedString(forKey: "Velocity-based left stick pad") case .rs: return SwiftLocalizationHelper.localizedString(forKey: "RS/R3 button") case .rsPad: return SwiftLocalizationHelper.localizedString(forKey: "Displacement-based right stick pad") case .rsvPad: return SwiftLocalizationHelper.localizedString(forKey: "Velocity-based right stick pad") @@ -460,23 +462,30 @@ struct AbstractGamepadView: View { private func applyStickSelection(_ widget: GamepadWidget) { switch widget { - case .ls, .lsPad, .lswheel: + case .ls, .lsPad, .lswheel, .lsvPad: leftStickHighlight = nextStickHighlightMode( current: leftStickHighlight, selected: widget, outerWidget: .ls, - thumbWidgets: [.lsPad, .lswheel] + thumbWidgets: [.lsPad, .lswheel, .lsvPad] ) - + if widget == .ls, + isCommandSelected?(GamepadWidget.lsPad.cmd) == true + || isCommandSelected?(GamepadWidget.lsvPad.cmd) == true + { + leftStickHighlight = .both + } case .rs, .rsPad, .rsvPad, .rsWheel: rightStickHighlight = nextStickHighlightMode( current: rightStickHighlight, selected: widget, outerWidget: .rs, - thumbWidgets: [.rsPad, .rsvPad, .rsWheel] + thumbWidgets: [.rsvPad, .rsPad, .rsWheel] ) if widget == .rs, - isCommandSelected?(GamepadWidget.rsPad.cmd) == true || isCommandSelected?(GamepadWidget.rsvPad.cmd) == true { + isCommandSelected?(GamepadWidget.rsPad.cmd) == true + || isCommandSelected?(GamepadWidget.rsvPad.cmd) == true + { rightStickHighlight = .both } @@ -555,11 +564,11 @@ struct AbstractGamepadView: View { dpadHighlight = .none } - if widgets.contains(.ls) || widgets.contains(.lsPad) || widgets.contains(.lswheel) { + if widgets.contains(.ls) || widgets.contains(.lsPad) || widgets.contains(.lswheel) || widgets.contains(.lsvPad) { leftStickHighlight = .none } - if widgets.contains(.rs) || widgets.contains(.rsPad) || widgets.contains(.rsvPad) { + if widgets.contains(.rs) || widgets.contains(.rsPad) || widgets.contains(.rsvPad) || widgets.contains(.rsWheel) { rightStickHighlight = .none } @@ -1019,7 +1028,7 @@ struct AbstractGamepadView: View { .frame(width: leftStickSize, height: leftStickSize) .offset(x: leftStickCenterX, y: leftStickCenterY) .onTapGesture { - handleTappedWidgets([.ls, .lswheel, .lsPad], sourceIsDPad: false) + handleTappedWidgets([.ls, .lswheel, .lsPad, .lsvPad], sourceIsDPad: false) } DPadXboxStyleView( @@ -1052,7 +1061,7 @@ struct AbstractGamepadView: View { .frame(width: rightStickSize, height: rightStickSize) .offset(x: rightStickCenterX, y: sharedLowerControlCenterY) .onTapGesture { - handleTappedWidgets([.rs, .rsPad, .rsvPad, .rsWheel], sourceIsDPad: false) + handleTappedWidgets([.rs, .rsvPad, .rsPad, .rsWheel], sourceIsDPad: false) } HomeButtonView( @@ -1155,7 +1164,7 @@ struct AbstractGamepadView: View { if isCommandSelected(GamepadWidget.ls.cmd) { leftStickHighlight = .outerOnly } - if isCommandSelected(GamepadWidget.lsPad.cmd) || isCommandSelected(GamepadWidget.lswheel.cmd) { + if isCommandSelected(GamepadWidget.lsPad.cmd) || isCommandSelected(GamepadWidget.lswheel.cmd) || isCommandSelected(GamepadWidget.lsvPad.cmd) { leftStickHighlight = leftStickHighlight == .outerOnly ? .both : .thumbOnly } @@ -1214,7 +1223,7 @@ struct AbstractGamepadView: View { } else if leftStickHighlight == .outerOnly { leftStickHighlight = .none } - case GamepadWidget.lsPad.cmd, GamepadWidget.lswheel.cmd: + case GamepadWidget.lsPad.cmd, GamepadWidget.lswheel.cmd, GamepadWidget.lsvPad.cmd: if leftStickHighlight == .both { leftStickHighlight = .outerOnly } else if leftStickHighlight == .thumbOnly { diff --git a/VoidLinkPreview/WidgetPickerView.swift b/VoidLinkPreview/WidgetPickerView.swift index 51985bca..20558b0d 100644 --- a/VoidLinkPreview/WidgetPickerView.swift +++ b/VoidLinkPreview/WidgetPickerView.swift @@ -1277,6 +1277,7 @@ struct WidgetPickerView: View { "DPAD", "LSWHEEL", "LSPAD", + "LSVPAD", "RSPAD", "RSVPAD", "RSWHEEL", @@ -1314,6 +1315,10 @@ struct WidgetPickerView: View { return true } + if cmd == "LS", poolItems.contains(where: { $0.cmd == "LSPAD" || $0.cmd == "LSVPAD" }) { + return true + } + return false } @@ -2293,7 +2298,7 @@ struct WidgetPickerView: View { "HOME", "DPAD", "OSCUP", "OSCDOWN", "OSCLEFT", "OSCRIGHT", - "LS", "LSWHEEL", "LSPAD", + "LS", "LSWHEEL", "LSPAD", "LSVPAD", "RS", "RSPAD", "RSVPAD", "RSWHEEL", "LB", "RB", "LT", "LTPAD",