- feat: highlight size tweak

- fixed: legacy onscreen controls unavailable in touch disabled mode
This commit is contained in:
TrueZhuanjia
2025-10-28 16:41:39 +08:00
parent 7223ab3be5
commit e7132e3371
7 changed files with 292 additions and 149 deletions
@@ -396,6 +396,7 @@ static CGRect layoutViewBounds;
buttonState.labelAlpha = widgetView.labelAlpha;
buttonState.borderAlpha = widgetView.borderAlpha;
buttonState.borderWidth = widgetView.borderWidth;
buttonState.highlightSizeFactor = widgetView.highlightSizeFactor;
buttonState.autoTapInterval = widgetView.autoTapInterval;
buttonState.vibrationStyle = widgetView.vibrationStyle;
buttonState.mouseButtonAction = widgetView.mouseButtonAction;
@@ -33,6 +33,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, assign) CGFloat widthFactor; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat heightFactor; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat borderWidth; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat highlightSizeFactor; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat sensitivityFactorX; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat sensitivityFactorY; // for OnScreenWidgetView
@property (nonatomic, assign) CGFloat yawFactor; // for OnScreenWidgetView
@@ -55,6 +55,7 @@
[encoder encodeFloat:self.labelAlpha forKey:@"labelAlpha"];
[encoder encodeFloat:self.borderAlpha forKey:@"borderAlpha"];
[encoder encodeFloat:self.borderWidth forKey:@"borderWidth"];
[encoder encodeFloat:self.highlightSizeFactor forKey:@"highlightSizeFactor"];
[encoder encodeObject:self.widgetShape forKey:@"widgetShape"];
[encoder encodeFloat:self.minStickOffset forKey:@"minStickOffset"];
}
@@ -85,6 +86,7 @@
self.labelAlpha = [decoder containsValueForKey:@"labelAlpha"] ? [decoder decodeFloatForKey:@"labelAlpha"] : 0.82;
self.borderAlpha = [decoder containsValueForKey:@"borderAlpha"] ? [decoder decodeFloatForKey:@"borderAlpha"] : 0.19;
self.borderWidth = [decoder decodeFloatForKey:@"borderWidth"];
self.highlightSizeFactor = [decoder containsValueForKey:@"highlightSizeFactor"] ? [decoder decodeFloatForKey:@"highlightSizeFactor"] : 1.0;
self.widgetShape = [decoder decodeObjectForKey:@"widgetShape"];
self.minStickOffset = [decoder decodeFloatForKey:@"minStickOffset"];
}
+163 -128
View File
@@ -54,7 +54,7 @@ import UIKit
private var buttonString: String = ""
private var functionalButtonString: String = ""
public var motionControlButtonString: String = ""
private var touchPadString: String = ""
@objc public var touchPadString: String = ""
// super combo key string set
@objc public var comboButtonStrings: [String] = []
private var comboKeyTimeIntervalMs: UInt32 = 0
@@ -116,6 +116,8 @@ import UIKit
@objc public var hasTrackBall: Bool = false
@objc public var isFuncationalButton: Bool = false
@objc public var hasHapticFeedback: Bool = false
@objc public var isDirectionPad: Bool = false
@objc public var hasL3R3Indicator: Bool = false
// for all stick pads
@objc public var minStickOffset: CGFloat = 0
@@ -132,10 +134,9 @@ import UIKit
private let crossMarkColor: CGColor = UIColor(white: 1, alpha: 0.70).cgColor
private let stickBallColor: CGColor = UIColor(white: 1, alpha: 0.75).cgColor
private var stickInputScale: CGFloat = 35
private var l3r3Indicator = CAShapeLayer()
@objc public var l3r3Indicator = CAShapeLayer()
private let stickBallMaxOffset = 18.0
@objc public var crossMarkLayer = CAShapeLayer()
@objc public var stickBallLayer = CAShapeLayer()
// this is for all stick pads and mouse Pad
@objc public var sensitivityFactorX: CGFloat = 1.0
@@ -153,13 +154,13 @@ import UIKit
@objc public var stickIndicatorOffset: CGFloat = 120
// for all LRUD pads
private var upIndicator = CAShapeLayer()
private var downIndicator = CAShapeLayer()
private var leftIndicator = CAShapeLayer()
private var rightIndicator = CAShapeLayer()
@objc public var upIndicator = CAShapeLayer()
@objc public var downIndicator = CAShapeLayer()
@objc public var leftIndicator = CAShapeLayer()
@objc public var rightIndicator = CAShapeLayer()
// for DPAD LRUD pad
private var lrudIndicatorBall = CAShapeLayer()
@objc public var lrudIndicatorBall = CAShapeLayer()
private let triggeringAngle = 67.5
private enum Direction: Int {
case right = 1
@@ -212,8 +213,10 @@ import UIKit
// whole button press down visual effect
@objc public let buttonDownVisualEffectLayer = CAShapeLayer()
private var buttonDownVisualEffectWidth: CGFloat
@objc public var buttonDownVisualEffectStandardWidth: CGFloat
@objc public var highlightSizeFactor: CGFloat = 1.0
@objc static public var isTweakingHighlightSize: Bool = false
@objc init(cmdString: String, buttonLabel: String, shape:String) {
@@ -288,7 +291,7 @@ import UIKit
self.quickDoubleTapDetected = false
self.touchTapTimeInterval = 100
self.touchTapTimeStamp = 100
self.buttonDownVisualEffectWidth = 0
self.buttonDownVisualEffectStandardWidth = 0
self.mousePointerMoved = false
self.touchLockedForMoveEvent = UITouch()
self.twoTouchesDetected = false
@@ -351,6 +354,8 @@ import UIKit
self.hasTrackBall = self.touchPadString == "TRACKBALL"
self.isFuncationalButton = self.functionalButtonString != ""
self.hasHapticFeedback = !self.comboButtonStrings.isEmpty || CommandManager.directionPads.contains(self.touchPadString)
self.isDirectionPad = self.widgetType == WidgetTypeEnum.touchPad && CommandManager.directionPads.contains(self.touchPadString)
self.hasL3R3Indicator = !self.isDirectionPad && self.widgetType == WidgetTypeEnum.touchPad
}
// ======================================================================================================
@@ -626,39 +631,46 @@ import UIKit
center = storedCenter //anchor the center while resizing self
setupButtonDownVisualEffectLayer();
hideAllHighlightLayersOfAllWidgets(selfIncluded: false)
if widgetType == WidgetTypeEnum.button {setupButtonDownVisualEffectLayer()}
if CommandManager.directionPads.contains(touchPadString) {setupLrudDirectionIndicatorlayers()}
if CommandManager.stickTouchPads.contains(touchPadString) {self.l3r3Indicator = createl3r3Indicator()}
if CommandManager.verticalTouchPads.contains(touchPadString) {self.l3r3Indicator = createl3r3Indicator()}
if self.touchPadString == "MOUSEPAD" {self.l3r3Indicator = createl3r3Indicator()}
if CommandManager.stickTouchPads.contains(touchPadString) {setupL3R3Indicator()}
if CommandManager.verticalTouchPads.contains(touchPadString) {setupL3R3Indicator()}
if self.touchPadString == "MOUSEPAD" {setupL3R3Indicator()}
if self.hasStickIndicator {
if self.crossMarkLayer.superlayer == nil {self.crossMarkLayer = createCrossMark()}
if self.stickBallLayer.superlayer == nil {self.stickBallLayer = createStickBall()}
if self.lrudIndicatorBall.superlayer == nil {self.lrudIndicatorBall = createStickBall()}
}
}
private func createl3r3Indicator() -> CAShapeLayer{
@objc public func setupL3R3Indicator() {
CATransaction.begin()
CATransaction.setDisableActions(true)
let indicatorFrame = CAShapeLayer();
let indicatorBorder = CAShapeLayer();
// l3r3Indicator = CAShapeLayer();
indicatorFrame.frame = CGRectMake(0, 0, 75, 75)
indicatorFrame.cornerRadius = 9
indicatorBorder.borderWidth = 7
indicatorBorder.frame = indicatorFrame.bounds.insetBy(dx: -indicatorBorder.borderWidth, dy: -indicatorBorder.borderWidth) // Adjust the inset as needed
indicatorBorder.borderColor = UIColor.clear.cgColor
indicatorFrame.frame = CGRectMake(0, 0, 75*highlightSizeFactor, 75*highlightSizeFactor)
indicatorFrame.cornerRadius = 9 * highlightSizeFactor
l3r3Indicator.borderWidth = 7 * min(highlightSizeFactor,1.0)
l3r3Indicator.frame = indicatorFrame.bounds.insetBy(dx: -l3r3Indicator.borderWidth, dy: -l3r3Indicator.borderWidth) // Adjust the inset as needed
l3r3Indicator.borderColor = UIColor.clear.cgColor
indicatorBorder.cornerRadius = indicatorFrame.cornerRadius + indicatorBorder.borderWidth
indicatorBorder.backgroundColor = UIColor.clear.cgColor
indicatorBorder.fillColor = UIColor.clear.cgColor
let path = UIBezierPath(roundedRect: indicatorBorder.bounds, cornerRadius: indicatorBorder.cornerRadius)
l3r3Indicator.cornerRadius = indicatorFrame.cornerRadius + l3r3Indicator.borderWidth
l3r3Indicator.backgroundColor = UIColor.clear.cgColor
l3r3Indicator.fillColor = UIColor.clear.cgColor
let path = UIBezierPath(roundedRect: l3r3Indicator.bounds, cornerRadius: l3r3Indicator.cornerRadius)
indicatorBorder.path = path.cgPath
indicatorBorder.borderColor = voidlinkPurple
indicatorBorder.isHidden = true
l3r3Indicator.path = path.cgPath
l3r3Indicator.borderColor = voidlinkPurple
self.l3r3Indicator.position = CGPointMake(self.bounds.width/2, self.bounds.height/2)
if !OnScreenWidgetView.isTweakingHighlightSize {l3r3Indicator.isHidden = true}
self.layer.addSublayer(indicatorBorder)
if l3r3Indicator.superlayer == nil {
self.layer.addSublayer(l3r3Indicator)
}
return indicatorBorder
CATransaction.commit()
}
private func showl3r3Indicator(){
@@ -685,18 +697,18 @@ import UIKit
private func handleStickBallReachingBorder(){
CATransaction.begin()
CATransaction.setDisableActions(true)
stickBallLayer.lineWidth = 0.6
lrudIndicatorBall.lineWidth = 0.6
// stickBallLayer.shadowOffset = CGSize(width: 0.0, height: 0.0)
stickBallLayer.shadowOffset = CGSize(width: 0.0, height: 0.0)
lrudIndicatorBall.shadowOffset = CGSize(width: 0.0, height: 0.0)
// stickBallLayer.shadowColor = stickBallLayer.strokeColor
CATransaction.commit()
}
private func handleStickBallLeavingBorder(){
stickBallLayer.lineWidth = 0
stickBallLayer.shadowOffset = CGSize(width: 0.5, height: 0.5)
stickBallLayer.shadowOpacity = 0.8
stickBallLayer.shadowColor = UIColor.black.cgColor
lrudIndicatorBall.lineWidth = 0
lrudIndicatorBall.shadowOffset = CGSize(width: 0.5, height: 0.5)
lrudIndicatorBall.shadowOpacity = 0.8
lrudIndicatorBall.shadowColor = UIColor.black.cgColor
}
// create stick indicator: the crossMark & stickBall:
@@ -791,8 +803,8 @@ import UIKit
// Create a CAShapeLayer
// self.stickBallLayer.path = path.cgPath // Assign the circular path to the shape layer
// self.stickBallLayer.position = CGPointMake(CGRectGetMidX(self.crossMarkLayer.frame), CGRectGetMidY(self.crossMarkLayer.frame))
self.stickBallLayer.position = point
self.stickBallLayer.isHidden = false
self.lrudIndicatorBall.position = point
self.lrudIndicatorBall.isHidden = false
CATransaction.commit()
}
@@ -801,17 +813,17 @@ import UIKit
@objc public func updateStickIndicator(){
CATransaction.begin()
CATransaction.setDisableActions(true)
self.stickBallLayer.removeAllAnimations()
self.lrudIndicatorBall.removeAllAnimations()
if !OnScreenWidgetView.editMode {
let realOffsetX = touchInputToStickBallCoord(input: offSetX*sensitivityFactorX)
let realOffsetY = touchInputToStickBallCoord(input: offSetY*sensitivityFactorY)
self.stickBallLayer.position = CGPointMake(touchBeganLocation.x + realOffsetX, touchBeganLocation.y + realOffsetY - self.stickIndicatorOffset)
self.lrudIndicatorBall.position = CGPointMake(touchBeganLocation.x + realOffsetX, touchBeganLocation.y + realOffsetY - self.stickIndicatorOffset)
/*
if fabs(realOffsetX) == stickBallMaxOffset || fabs(realOffsetY) == stickBallMaxOffset {handleStickBallReachingBorder()}
else{handleStickBallLeavingBorder()}*/
}
else{
self.stickBallLayer.position = CGPointMake(CGRectGetMidX(self.crossMarkLayer.frame), CGRectGetMidY(self.crossMarkLayer.frame)-stickIndicatorOffset)
self.lrudIndicatorBall.position = CGPointMake(CGRectGetMidX(self.crossMarkLayer.frame), CGRectGetMidY(self.crossMarkLayer.frame)-stickIndicatorOffset)
}
CATransaction.commit()
}
@@ -825,7 +837,7 @@ import UIKit
CATransaction.begin()
CATransaction.setAnimationDuration(0.15)
self.stickBallLayer.position = CGPointMake(touchBeganLocation.x, touchBeganLocation.y - self.stickIndicatorOffset)
self.lrudIndicatorBall.position = CGPointMake(touchBeganLocation.x, touchBeganLocation.y - self.stickIndicatorOffset)
CATransaction.setCompletionBlock {
// 动画结束后执行的代码
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
@@ -833,7 +845,7 @@ import UIKit
CATransaction.begin()
CATransaction.setDisableActions(true)
self.crossMarkLayer.isHidden = true
self.stickBallLayer.isHidden = true
self.lrudIndicatorBall.isHidden = true
CATransaction.commit()
}
}
@@ -858,45 +870,47 @@ import UIKit
CATransaction.commit()
}
private func createLrudBall() -> CAShapeLayer {
private func setupLrudBall() {
// Create a circular path using UIBezierPath
let path = UIBezierPath(arcCenter: CGPoint.zero, radius: 10, startAngle: 0, endAngle: 2 * .pi, clockwise: true)
let path = UIBezierPath(arcCenter: CGPoint.zero, radius: 10*min(highlightSizeFactor,1.0), startAngle: 0, endAngle: 2 * .pi, clockwise: true)
// Create a CAShapeLayer
let ballLayer = CAShapeLayer()
ballLayer.path = path.cgPath // Assign the circular path to the shape layer
self.layer.addSublayer(ballLayer)
lrudIndicatorBall.path = path.cgPath // Assign the circular path to the shape layer
if lrudIndicatorBall.superlayer == nil {
self.layer.addSublayer(lrudIndicatorBall)
}
lrudIndicatorBall.position = CGPoint(x: self.bounds.width/2, y: self.bounds.height/2,)
// Set the stroke color and width (border of the circle)
ballLayer.strokeColor = stickBallColor
ballLayer.lineWidth = 0
ballLayer.shadowOffset = CGSize(width: 0.5, height: 0.5)
ballLayer.shadowRadius = 0;
ballLayer.shadowOpacity = 0.8
ballLayer.name = "lrudBall"
ballLayer.isHidden = true
lrudIndicatorBall.strokeColor = stickBallColor
lrudIndicatorBall.lineWidth = 0
lrudIndicatorBall.shadowOffset = CGSize(width: 0.5, height: 0.5)
lrudIndicatorBall.shadowRadius = 0;
lrudIndicatorBall.shadowOpacity = 0.8
lrudIndicatorBall.name = "lrudBall"
if !OnScreenWidgetView.isTweakingHighlightSize {lrudIndicatorBall.isHidden = true}
// Set the fill color (inside of the circle)
ballLayer.fillColor = stickBallColor // Light fill with some transparency
return ballLayer
lrudIndicatorBall.fillColor = stickBallColor // Light fill with some transparency
}
private func createLrudDirectionLayer() -> CAShapeLayer {
private func setupLrudDirectionLayer(directionLayer:CAShapeLayer) {
let indicatorFrame = CAShapeLayer();
let indicatorBorder = CAShapeLayer();
indicatorFrame.frame = CGRectMake(0, 0, 75, 75)
indicatorFrame.cornerRadius = 9
indicatorBorder.borderWidth = 6
indicatorBorder.frame = indicatorFrame.bounds.insetBy(dx: -indicatorBorder.borderWidth, dy: -indicatorBorder.borderWidth) // Adjust the inset as needed
indicatorBorder.cornerRadius = indicatorFrame.cornerRadius + indicatorBorder.borderWidth
indicatorBorder.backgroundColor = UIColor.clear.cgColor
indicatorBorder.fillColor = UIColor.clear.cgColor
let path = UIBezierPath(roundedRect: indicatorBorder.bounds, cornerRadius: indicatorBorder.cornerRadius)
indicatorBorder.path = path.cgPath
indicatorBorder.borderColor = voidlinkPurple
return indicatorBorder
indicatorFrame.frame = CGRectMake(0, 0, 75*highlightSizeFactor, 75*highlightSizeFactor)
indicatorFrame.cornerRadius = 9 * highlightSizeFactor
directionLayer.borderWidth = 6 * 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
directionLayer.fillColor = UIColor.clear.cgColor
let path = UIBezierPath(roundedRect: directionLayer.bounds, cornerRadius: directionLayer.cornerRadius)
directionLayer.path = path.cgPath
directionLayer.borderColor = voidlinkPurple
directionLayer.position = CGPoint(x: self.bounds.width/2, y: self.bounds.height/2)
if directionLayer.superlayer == nil {
self.layer.insertSublayer(directionLayer, below: lrudIndicatorBall)
}
}
private func showLrudDirectionIndicator(with indicatorLayer:CAShapeLayer){
@@ -1131,7 +1145,7 @@ import UIKit
if OnScreenWidgetView.buttonVisualFeedbackEnabled {
CATransaction.begin()
CATransaction.setDisableActions(true)
buttonDownVisualEffectLayer.isHidden = false
if widgetType == WidgetTypeEnum.button {buttonDownVisualEffectLayer.isHidden = false}
CATransaction.commit()
}
}
@@ -1141,7 +1155,7 @@ import UIKit
if OnScreenWidgetView.buttonVisualFeedbackEnabled {
CATransaction.begin()
CATransaction.setDisableActions(true)
buttonDownVisualEffectLayer.isHidden = true
if !OnScreenWidgetView.isTweakingHighlightSize {buttonDownVisualEffectLayer.isHidden = true}
CATransaction.commit()
}
}
@@ -1160,45 +1174,60 @@ import UIKit
}
}
private func setupLrudDirectionIndicatorlayers() {
upIndicator = createLrudDirectionLayer()
@objc public func setupLrudDirectionIndicatorlayers() {
CATransaction.begin()
CATransaction.setDisableActions(true)
self.setupLrudBall()
setupLrudDirectionLayer(directionLayer: upIndicator)
upIndicator.anchorPoint = CGPoint(x: 0.5, y: 1)
downIndicator = createLrudDirectionLayer()
setupLrudDirectionLayer(directionLayer: downIndicator)
downIndicator.anchorPoint = CGPoint(x: 0.5, y: 0)
leftIndicator = createLrudDirectionLayer()
setupLrudDirectionLayer(directionLayer: leftIndicator)
leftIndicator.anchorPoint = CGPoint(x: 1, y: 0.5)
rightIndicator = createLrudDirectionLayer()
setupLrudDirectionLayer(directionLayer: rightIndicator)
rightIndicator.anchorPoint = CGPoint(x: 0, y: 0.5)
self.layer.insertSublayer(leftIndicator, below: self.layer);
self.layer.insertSublayer(rightIndicator, below: self.layer);
self.layer.insertSublayer(upIndicator, below: self.layer);
self.layer.insertSublayer(downIndicator, below: self.layer);
leftIndicator.isHidden = true
rightIndicator.isHidden = true
upIndicator.isHidden = true
downIndicator.isHidden = true
/*
leftIndicator.borderColor = UIColor.clear.cgColor
rightIndicator.borderColor = UIColor.clear.cgColor
upIndicator.borderColor = UIColor.clear.cgColor
downIndicator.borderColor = UIColor.clear.cgColor */
self.lrudIndicatorBall = self.createLrudBall()
}
private func setupButtonDownVisualEffectLayer() {
self.buttonDownVisualEffectWidth = 8
if self.shape == "round" {
if deNormalizedWidthFactor < 1.3 {self.buttonDownVisualEffectWidth = 15.3} // wider visual effect for osc buttons
else {self.buttonDownVisualEffectWidth = 9}
if !OnScreenWidgetView.isTweakingHighlightSize {
leftIndicator.isHidden = true
rightIndicator.isHidden = true
upIndicator.isHidden = true
downIndicator.isHidden = true
}
if self.motionControlButtonString != "" {self.buttonDownVisualEffectWidth = 3}
CATransaction.commit()
}
@objc public func hideAllHighlightLayersOfAllWidgets(selfIncluded:Bool) {
self.forEachWidget(){ widget in
if !selfIncluded && widget == self {return}
widget.buttonDownVisualEffectLayer.isHidden = true;
widget.l3r3Indicator.isHidden = true
widget.lrudIndicatorBall.isHidden = true
widget.upIndicator.isHidden = true
widget.downIndicator.isHidden = true
widget.leftIndicator.isHidden = true
widget.rightIndicator.isHidden = true
}
}
@objc public func setupButtonDownVisualEffectLayer() {
CATransaction.begin()
CATransaction.setDisableActions(true)
self.buttonDownVisualEffectStandardWidth = 8
if self.shape == "round" {
if deNormalizedWidthFactor < 1.3 {self.buttonDownVisualEffectStandardWidth = 15.3} // wider visual effect for osc buttons
else {self.buttonDownVisualEffectStandardWidth = 9}
}
if self.motionControlButtonString != "" {self.buttonDownVisualEffectStandardWidth = 3}
// Set the frame to be larger than the view to expand outward
buttonDownVisualEffectLayer.borderWidth = self.buttonDownVisualEffectWidth // set this 0 to hide the visual effect first
buttonDownVisualEffectLayer.borderWidth = self.buttonDownVisualEffectStandardWidth * self.highlightSizeFactor // set this 0 to hide the visual effect first
buttonDownVisualEffectLayer.borderColor = voidlinkPurple
buttonDownVisualEffectLayer.frame = self.bounds.insetBy(dx: -self.buttonDownVisualEffectWidth, dy: -self.buttonDownVisualEffectWidth) // Adjust the inset as needed
buttonDownVisualEffectLayer.cornerRadius = self.layer.cornerRadius + self.buttonDownVisualEffectWidth
buttonDownVisualEffectLayer.frame = self.bounds.insetBy(dx: -buttonDownVisualEffectLayer.borderWidth, dy: -buttonDownVisualEffectLayer.borderWidth) // Adjust the inset as needed
buttonDownVisualEffectLayer.cornerRadius = self.layer.cornerRadius + buttonDownVisualEffectLayer.borderWidth
buttonDownVisualEffectLayer.backgroundColor = UIColor.clear.cgColor;
buttonDownVisualEffectLayer.fillColor = UIColor.clear.cgColor;
@@ -1206,10 +1235,14 @@ import UIKit
let path = UIBezierPath( roundedRect: buttonDownVisualEffectLayer.bounds, cornerRadius: buttonDownVisualEffectLayer.cornerRadius)
buttonDownVisualEffectLayer.path = path.cgPath
self.layer.insertSublayer(buttonDownVisualEffectLayer, below: self.layer)
if buttonDownVisualEffectLayer.superlayer == nil {
self.layer.insertSublayer(buttonDownVisualEffectLayer, below: self.layer)
}
buttonDownVisualEffectLayer.position = CGPointMake(self.bounds.midX, self.bounds.midY)
buttonDownVisualEffectLayer.isHidden = true
if !OnScreenWidgetView.isTweakingHighlightSize {buttonDownVisualEffectLayer.isHidden = true}
CATransaction.commit()
}
//==========================================================================================================
@@ -1620,7 +1653,7 @@ import UIKit
if let touch = touches.first {
self.moveByTouch(touch: touch)
}
self.stickBallLayer.removeFromSuperlayer()
self.lrudIndicatorBall.removeFromSuperlayer()
self.crossMarkLayer.removeFromSuperlayer()
}
}
@@ -1902,24 +1935,26 @@ import UIKit
}
}
if CommandManager.stickTouchPads.contains(touchPadString){
self.l3r3Indicator.isHidden = true
}
if CommandManager.directionPads.contains(touchPadString){
self.upIndicator.isHidden = true
self.downIndicator.isHidden = true
self.leftIndicator.isHidden = true
self.rightIndicator.isHidden = true
self.lrudIndicatorBall.isHidden = true
}
if CommandManager.verticalTouchPads.contains(touchPadString){
self.l3r3Indicator.isHidden = true
}
if self.touchPadString == "MOUSEPAD" && self.mouseButtonAction == .noClick {
self.l3r3Indicator.isHidden = true
if !OnScreenWidgetView.isTweakingHighlightSize {
if CommandManager.stickTouchPads.contains(touchPadString){
self.l3r3Indicator.isHidden = true
}
if CommandManager.directionPads.contains(touchPadString){
self.upIndicator.isHidden = true
self.downIndicator.isHidden = true
self.leftIndicator.isHidden = true
self.rightIndicator.isHidden = true
self.lrudIndicatorBall.isHidden = true
}
if CommandManager.verticalTouchPads.contains(touchPadString){
self.l3r3Indicator.isHidden = true
}
if self.touchPadString == "MOUSEPAD" && self.mouseButtonAction == .noClick {
self.l3r3Indicator.isHidden = true
}
}
if !OnScreenWidgetView.editMode && !self.cmdString.contains("+") && !self.comboButtonStrings.isEmpty { // if the command(keystring contains "+", it's a legacy multi-key command
@@ -2054,7 +2089,7 @@ import UIKit
if self.motionControlButtonString == "MOTION" {}
buttonDownVisualEffectLayer.removeFromSuperlayer()
crossMarkLayer.removeFromSuperlayer()
stickBallLayer.removeFromSuperlayer()
lrudIndicatorBall.removeFromSuperlayer()
l3r3Indicator.removeFromSuperlayer()
upIndicator.removeFromSuperlayer()
downIndicator.removeFromSuperlayer()
+4 -2
View File
@@ -429,12 +429,12 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
// we'll enable on screen buttons, and disable on screen controllers for absolute touch
- (bool) isOscEnabled{
return (settings.touchMode.intValue == RelativeTouch || settings.touchMode.intValue == NativeTouch) && settings.onscreenControls.intValue != OnScreenControlsLevelOff;
return (settings.touchMode.intValue == RelativeTouch || settings.touchMode.intValue == NativeTouch || settings.touchMode.intValue == AbsoluteTouch || settings.touchMode.intValue == TouchDisabled) && settings.onscreenControls.intValue != OnScreenControlsLevelOff;
}
// we'll enable on screen buttons, and disable on screen controllers for absolute touch
- (bool) isOnScreenWidgetEnabled{
return (settings.touchMode.intValue == RelativeTouch || settings.touchMode.intValue == NativeTouch || settings.touchMode.intValue == AbsoluteTouch || settings.touchMode.intValue == TouchDisabled) && settings.onscreenControls.intValue == OnScreenControlsLevelCustom;
return [self isOscEnabled] && settings.onscreenControls.intValue == OnScreenControlsLevelCustom;
}
- (void) reloadOnScreenControlsRealtimeWith:(ControllerSupport*)controllerSupport
@@ -462,6 +462,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
- (void) clearOnScreenWidgets{
OnScreenWidgetView.isTweakingHighlightSize = false;
for (UIView *subview in self->streamFrameTopLayerView.subviews) {
// 检查子视图是否是特定类型的实例
if ([subview isKindOfClass:[OnScreenWidgetView class]]) {
@@ -556,6 +557,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5;
widgetView.widthFactor = buttonState.widthFactor;
widgetView.heightFactor = buttonState.heightFactor;
widgetView.borderWidth = buttonState.borderWidth;
widgetView.highlightSizeFactor = buttonState.highlightSizeFactor;
widgetView.autoTapInterval = buttonState.autoTapInterval;
[widgetView setVibrationWithStyle:buttonState.vibrationStyle];
widgetView.mouseButtonAction = buttonState.mouseButtonAction;
@@ -2563,6 +2563,29 @@
}
}
},
"Highlight size: %.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"
}
}
}
},
"Host information updated" : {
"extractionState" : "manual",
"localizations" : {
@@ -28,6 +28,12 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
AlphaSliderModeCount
};
typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
widgetBorderWidth,
hightlightSize,
BorderWidthSliderModeCount
};
@end
@@ -36,6 +42,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
OSCProfilesManager* profilesManager;
OnScreenWidgetView* selectedWidgetView;
AlphaSliderMode alphaSliderMode;
BorderWidthSliderMode borderWidthSliderMode;
CALayer* selectedControllerLayer;
CGRect controllerLoadedBounds;
bool widgetViewSelected;
@@ -73,10 +80,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
- (void) viewWillDisappear:(BOOL)animated{
OnScreenWidgetView.editMode = false;
for (OnScreenWidgetView* widgetView in self.onScreenWidgetViews){
[widgetView.stickBallLayer removeFromSuperlayer];
[widgetView.crossMarkLayer removeFromSuperlayer];
}
OnScreenWidgetView.isTweakingHighlightSize = false;
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] postNotificationName:@"OscLayoutCloseNotification" object:self];
}
@@ -114,6 +118,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
- (void)reloadOnScreenWidgetViews{
NSLog(@"reloadOnScreenWidgets %f", CACurrentMediaTime());
OnScreenWidgetView.isTweakingHighlightSize = false;
OnScreenWidgetView.editMode = true;
[self hideStickIndicators];
@@ -142,6 +147,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
widgetView.widthFactor = buttonState.widthFactor;
widgetView.heightFactor = buttonState.heightFactor;
widgetView.borderWidth = buttonState.borderWidth;
widgetView.highlightSizeFactor = buttonState.highlightSizeFactor;
widgetView.autoTapInterval = buttonState.autoTapInterval;
[widgetView setVibrationWithStyle:buttonState.vibrationStyle];
widgetView.mouseButtonAction = buttonState.mouseButtonAction;
@@ -373,6 +379,57 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
}
}
- (void)switchBorderWidthSlider:(UISwipeGestureRecognizer *)sender {
if(!widgetViewSelected) return;
borderWidthSliderMode = (borderWidthSliderMode + 1) % BorderWidthSliderModeCount;
OnScreenWidgetView.isTweakingHighlightSize = borderWidthSliderMode == hightlightSize;
[self loadWidgetWidths];
}
- (void)loadWidgetWidths{
if(self->selectedWidgetView != nil && self->widgetViewSelected){
switch(borderWidthSliderMode){
case widgetBorderWidth:
[self.widgetBorderWidthSlider setMinimumValue:0];
[self.widgetBorderWidthSlider setMaximumValue:8];
[self.widgetBorderWidthSlider setValue:selectedWidgetView.borderWidth animated:NO];
selectedWidgetView.buttonDownVisualEffectLayer.hidden = true;
selectedWidgetView.l3r3Indicator.hidden = true;
(selectedWidgetView.lrudIndicatorBall.hidden
= selectedWidgetView.upIndicator.hidden
= selectedWidgetView.downIndicator.hidden
= selectedWidgetView.leftIndicator.hidden
= selectedWidgetView.rightIndicator.hidden
= true);
[self.widgetBorderWidthLabel setText:[LocalizationHelper localizedStringForKey:@"Border width: %.2f", _widgetBorderWidthSlider.value]];
break;
case hightlightSize:
[self.widgetBorderWidthSlider setMinimumValue:0];
[self.widgetBorderWidthSlider setMaximumValue:2];
[self.widgetBorderWidthSlider setValue:selectedWidgetView.highlightSizeFactor animated:NO];
selectedWidgetView.buttonDownVisualEffectLayer.hidden = selectedWidgetView.widgetType != WidgetTypeEnumButton;
selectedWidgetView.l3r3Indicator.hidden = !selectedWidgetView.hasL3R3Indicator;
(selectedWidgetView.lrudIndicatorBall.hidden
= selectedWidgetView.upIndicator.hidden
= selectedWidgetView.downIndicator.hidden
= selectedWidgetView.leftIndicator.hidden
= selectedWidgetView.rightIndicator.hidden
= !selectedWidgetView.isDirectionPad);
[self.widgetBorderWidthLabel setText:[LocalizationHelper localizedStringForKey:@"Highlight size: %.2f", _widgetBorderWidthSlider.value]];
break;
default:
break;
}
}
}
/* animates the toolbar up and off the screen or back down onto the screen */
- (void) moveToolbar:(UISwipeGestureRecognizer *)sender {
BOOL isPad = [[UIDevice currentDevice].model hasPrefix:@"iPad"];
@@ -683,6 +740,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
newWidget.widthFactor = widget.widthFactor;
newWidget.heightFactor = widget.heightFactor;
newWidget.borderWidth = widget.borderWidth;
newWidget.highlightSizeFactor = widget.highlightSizeFactor;
newWidget.autoTapInterval = widget.autoTapInterval;
newWidget.sensitivityFactorX = widget.sensitivityFactorX;
newWidget.sensitivityFactorY = widget.sensitivityFactorY;
@@ -695,6 +753,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
newWidget.mouseButtonAction = widget.mouseButtonAction;
newWidget.buttonMode = widget.buttonMode;
[self.view insertSubview:newWidget belowSubview:self.widgetPanelStack];
[newWidget accessWidgetAttributes];
if(createNew) [newWidget setLocationWithPosition:CGPointMake(90, 130)];
else [newWidget setLocationWithPosition:widget.center];
@@ -779,7 +838,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
if([view isKindOfClass:[OnScreenWidgetView class]]){
OnScreenWidgetView* widget = (OnScreenWidgetView* )view;
[widget.crossMarkLayer setHidden:true];
[widget.stickBallLayer setHidden:true];
[widget.lrudIndicatorBall setHidden:true];
}
}
}
@@ -802,10 +861,14 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
self->widgetViewSelected = true;
self->controllerLayerSelected = false;
if(widgetView != selectedWidgetView) [selectedWidgetView setAutoTapIntervalByTextWithStr:_autoTapField.text];
if(widgetView != selectedWidgetView){
[selectedWidgetView setAutoTapIntervalByTextWithStr:_autoTapField.text];
}
self->selectedWidgetView = widgetView;
[selectedWidgetView hideAllHighlightLayersOfAllWidgetsWithSelfIncluded:YES];
[self autoFitLabel:self.currentProfileLabel];
self.currentProfileLabel.textAlignment = NSTextAlignmentLeft;
[self.currentProfileLabel setText:
@@ -878,13 +941,13 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
[self autoFitLabel:self.widgetHeightLabel];
[self.widgetHeightLabel setText:[LocalizationHelper localizedStringForKey:@"Height: %.2f", self->selectedWidgetView.deNormalizedHeightFactor]];
[self loadWidgetAlphas];
[self autoFitLabel:self.widgetAlphaLabel];
[self.widgetBorderWidthSlider setValue:self->selectedWidgetView.borderWidth];
// [self.widgetBorderWidthSlider setValue:self->selectedWidgetView.borderWidth];
[self loadWidgetWidths];
[self autoFitLabel:self.widgetBorderWidthLabel];
[self widgetBorderWidthSliderMoved:self.widgetBorderWidthSlider];
// [self widgetBorderWidthSliderMoved:self.widgetBorderWidthSlider];
self.autoTapStack.hidden = !selectedWidgetView.hasAutoTap;
// [self.autoTapSlider setValue:self->selectedWidgetView.autoTapInterval];
@@ -1013,16 +1076,25 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
if(self->selectedControllerLayer != nil && self->controllerLayerSelected){
[self.layoutOSC adjustControllerLayerOpacityWith:self->selectedControllerLayer and:sender.value];
}
return;
}
- (void)widgetBorderWidthSliderMoved:(UISlider* )sender{
[self.widgetBorderWidthLabel setText:[LocalizationHelper localizedStringForKey:@"Border width: %.2f", sender.value]];
if(self->selectedWidgetView != nil && self->widgetViewSelected){
[self->selectedWidgetView adjustBorderWithWidth:sender.value];
switch(borderWidthSliderMode){
case widgetBorderWidth:
[self->selectedWidgetView adjustBorderWithWidth:sender.value];
break;
case hightlightSize:
self->selectedWidgetView.highlightSizeFactor = sender.value;
if(selectedWidgetView.widgetType == WidgetTypeEnumButton) [selectedWidgetView setupButtonDownVisualEffectLayer];
if(selectedWidgetView.hasL3R3Indicator) [selectedWidgetView setupL3R3Indicator];
if(selectedWidgetView.isDirectionPad) [selectedWidgetView setupLrudDirectionIndicatorlayers];
break;
default:
break;
}
}
return;
[self loadWidgetWidths];
}
/*
@@ -1040,7 +1112,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
}
}
- (void)slideModeChanged:(UISegmentedControl* )sender{
- (void)buttonModeChanged:(UISegmentedControl* )sender{
if(self->selectedWidgetView != nil && self->widgetViewSelected){
selectedWidgetView.buttonMode = _buttonModeSelector.selectedSegmentIndex;
}
@@ -1201,6 +1273,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
self.widgetHeightLabel.text = [LocalizationHelper localizedStringForKey:@"Height"];
self.widgetHeightStack.hidden = YES;
alphaSliderMode = widgetAlpha;
[self.widgetAlphaSlider addTarget:self action:@selector(widgetAlphaSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.widgetAlphaLabel.text = [LocalizationHelper localizedStringForKey:@"Alpha"];
self.widgetAlphaLabel.userInteractionEnabled = true;
@@ -1209,10 +1282,17 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
action:@selector(switchAlphaSlider:)];
[self.widgetAlphaLabel addGestureRecognizer:alphaSwitchTapGesture];
borderWidthSliderMode = widgetBorderWidth;
[self.widgetBorderWidthSlider addTarget:self action:@selector(widgetBorderWidthSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.widgetBorderWidthLabel.text = [LocalizationHelper localizedStringForKey:@"Border width"];
self.widgetBorderWidthLabel.userInteractionEnabled = true;
UITapGestureRecognizer *borderWidthSwitchTapGesture =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(switchBorderWidthSlider:)];
[self.widgetBorderWidthLabel addGestureRecognizer:borderWidthSwitchTapGesture];
self.borderWidthAlphaStack.hidden = YES;
// [self.autoTapSlider addTarget:self action:@selector(autoTapSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.autoTapLabel.text = [LocalizationHelper localizedStringForKey:@"Autotap timer "];
@@ -1254,7 +1334,7 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
[self.mouseButtonDownSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal];
self.mouseDownButtonStack.hidden = YES;
[self.buttonModeSelector addTarget:self action:@selector(slideModeChanged:) forControlEvents:(UIControlEventValueChanged)];
[self.buttonModeSelector addTarget:self action:@selector(buttonModeChanged:) forControlEvents:(UIControlEventValueChanged)];
[self.buttonModeSelector setTitleTextAttributes:whiteFontAttributes forState:UIControlStateNormal];
self.buttonModeStack.hidden = YES;
@@ -1524,7 +1604,6 @@ typedef NS_ENUM(NSUInteger, AlphaSliderMode) {
if(!isToolbarHidden && self->selectedWidgetView != nil && [self layerIsOverlappingWithTrashcanButton:selectedWidgetView.layer]){
[self->selectedWidgetView removeFromSuperview];
[self.onScreenWidgetViews removeObject:self->selectedWidgetView];
[selectedWidgetView.buttonDownVisualEffectLayer removeFromSuperlayer];
}