- feat: new on-screen widget lsWheel/rsWheel, direction wheel for RPG games.

- feat: direct walkmode test for lsWheel/rsWheel
- feat: direction minimum offset test for all on-screen widgets, gyro->stick mapping & physical controller.
This commit is contained in:
TrueZhuanjia
2025-12-26 16:17:55 +08:00
parent 2912a3a5cb
commit d8528fdc81
28 changed files with 977 additions and 102 deletions
@@ -12,7 +12,7 @@
#import "LayoutOnScreenControlsViewController.h"
#import "OSCProfilesTableViewController.h"
#import "OnScreenButtonState.h"
//#import "OnScreenControls.h"
#import "OnScreenControls.h"
#import "OSCProfilesManager.h"
#import "LocalizationHelper.h"
#import "VoidLink-Swift.h"
@@ -153,6 +153,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
widgetView.translatesAutoresizingMaskIntoConstraints = NO; // weird but this is mandatory, or you will find no key views added to the right place
widgetView.widthFactor = buttonState.widthFactor;
widgetView.heightFactor = buttonState.heightFactor;
widgetView.componentSizeFactor = buttonState.componentSizeFactor;
widgetView.borderWidth = buttonState.borderWidth;
widgetView.highlightSizeFactor = buttonState.highlightSizeFactor;
widgetView.autoTapInterval = buttonState.autoTapInterval;
@@ -167,6 +168,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
widgetView.decelerationRateX = buttonState.decelerationRateX;
widgetView.decelerationRateY = buttonState.decelerationRateY;
widgetView.stickIndicatorOffset = buttonState.stickIndicatorOffset;
widgetView.dWheelWalkModeThreshold = buttonState.walkModeThreshold;
widgetView.minStickOffset = buttonState.minStickOffset;
widgetView.buttonMode = buttonState.buttonMode;
// Add the widgetView to the view controller's view
@@ -493,6 +495,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
#pragma mark - UIButton Actions
- (IBAction) closeTapped:(id)sender {
[self clearSickInput];
[self dismissViewControllerAnimated:YES completion:nil];
}
@@ -736,6 +739,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
newWidget.translatesAutoresizingMaskIntoConstraints = NO; // weird but this is mandatory, or you will find no key views added to the right place
newWidget.widthFactor = widget.widthFactor;
newWidget.heightFactor = widget.heightFactor;
newWidget.componentSizeFactor = widget.componentSizeFactor;
newWidget.borderWidth = widget.borderWidth;
newWidget.highlightSizeFactor = widget.highlightSizeFactor;
newWidget.autoTapInterval = widget.autoTapInterval;
@@ -748,6 +752,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
newWidget.decelerationRateX = widget.decelerationRateX;
newWidget.decelerationRateY = widget.decelerationRateY;
newWidget.stickIndicatorOffset = widget.stickIndicatorOffset;
newWidget.dWheelWalkModeThreshold = widget.dWheelWalkModeThreshold;
newWidget.minStickOffset = widget.minStickOffset;
[newWidget setVibrationWithStyle:widget.vibrationStyle];
newWidget.mouseButtonAction = widget.mouseButtonAction;
@@ -796,6 +801,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
/* show pop up notification that lets users choose to save the current OSC layout configuration as a profile they can load when they want. User can also choose to cancel out of this pop up */
- (IBAction) saveTapped:(id)sender {
[self clearSickInput];
[OSCProfilesManager setLayoutViewBounds:self.view.bounds];
if([self->profilesManager updateSelectedProfile:self.layoutOSC.OSCButtonLayers]){
@@ -859,6 +865,7 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
[self hideStickIndicators];
[self clearSickInput];
// receive the selected widgetView obj passed from the notification
[self enableCommonWidgetTools];
@@ -893,7 +900,9 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
[self.sensitivityXSlider setMinimumValue:selectedWidgetView.sensitivityXMin];
[self.sensitivityXSlider setMaximumValue:selectedWidgetView.sensitivityXMax];
[self.sensitivityXSlider setValue:self->selectedWidgetView.sensitivityFactorX];
[self.sensitivityXLabel setText:[LocalizationHelper localizedStringForKey:@"SensitivityX: %.2f", self->selectedWidgetView.sensitivityFactorX]];
[self.sensitivityXLabel setText:[LocalizationHelper localizedStringForKey:
selectedWidgetView.hasSensitivityY ? @"SensitivityX: %.2f" : @"Sensitivity: %.2f",
self->selectedWidgetView.sensitivityFactorX]];
[self autoFitLabel:self.sensitivityXLabel];
}
@@ -913,6 +922,13 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
[self autoFitLabel:self.minStickOffsetLabel];
}
self.walkModeThresholdStack.hidden = !selectedWidgetView.isStickWheel;
if(selectedWidgetView.isStickWheel){
[self.walkModeThresholdSlider setValue:self->selectedWidgetView.dWheelWalkModeThreshold];
[self.walkModeThresholdLabel setText:[LocalizationHelper localizedStringForKey:@"Walkmode threshold: %.0f ", self->selectedWidgetView.dWheelWalkModeThreshold]];
[self autoFitLabel:self.walkModeThresholdLabel];
}
self.slideThresholdStack.hidden = !selectedWidgetView.hasSlideThreshold;
if(selectedWidgetView.hasSlideThreshold){
[self.slideThresholdSlider setMinimumValue:selectedWidgetView.slideThresholdMin];
@@ -964,13 +980,18 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
[self->selectedWidgetView updateStickIndicator];*/
}
[self.widgetSizeSlider setValue: self->selectedWidgetView.deNormalizedWidthFactor];
[self.widgetSizeSlider setValue: self->selectedWidgetView.denormalizedWidthFactor];
[self autoFitLabel:self.widgetSizeLabel];
[self.widgetSizeLabel setText:[LocalizationHelper localizedStringForKey:@"Size: %.2f", self->selectedWidgetView.deNormalizedWidthFactor]];
[self.widgetSizeLabel setText:[LocalizationHelper localizedStringForKey:@"Size: %.2f", self->selectedWidgetView.denormalizedWidthFactor]];
[self.widgetHeightSlider setValue: self->selectedWidgetView.deNormalizedHeightFactor];
[self.widgetHeightSlider setValue: self->selectedWidgetView.denormalizedHeightFactor];
[self autoFitLabel:self.widgetHeightLabel];
[self.widgetHeightLabel setText:[LocalizationHelper localizedStringForKey:@"Height: %.2f", self->selectedWidgetView.deNormalizedHeightFactor]];
[self.widgetHeightLabel setText:[LocalizationHelper localizedStringForKey:@"Height: %.2f", self->selectedWidgetView.denormalizedHeightFactor]];
self.componentSizeStack.hidden = !self->selectedWidgetView.hasComponent;
[self.componentSizeSlider setValue: self->selectedWidgetView.denormalizedComponentSizeFactor];
[self autoFitLabel:self.componentSizeLabel];
[self.componentSizeLabel setText:[LocalizationHelper localizedStringForKey:@"Component size: %.2f ", self->selectedWidgetView.denormalizedComponentSizeFactor]];
[self loadWidgetAlphas];
[self autoFitLabel:self.widgetAlphaLabel];
@@ -1085,6 +1106,16 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
}
}
- (void)componentSizeSliderMoved:(UISlider* )sender{
[self.componentSizeLabel setText:[LocalizationHelper localizedStringForKey:@"Component size: %.2f ", sender.value]];
if(self->selectedWidgetView != nil && self->widgetViewSelected){
self->selectedWidgetView.translatesAutoresizingMaskIntoConstraints = true; // this is mandatory to prevent unexpected key view location change
self->selectedWidgetView.componentSizeFactor = sender.value;
[self->selectedWidgetView resizeWidgetView];
}
}
- (void)widgetAlphaSliderMoved:(UISlider* )sender{
if(self->selectedWidgetView != nil && self->widgetViewSelected){
switch(alphaSliderMode){
@@ -1171,7 +1202,9 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
}
- (void)sensitivityXSliderMoved:(UISlider* )sender{
[self.sensitivityXLabel setText:[LocalizationHelper localizedStringForKey:@"SensitivityX: %.2f", sender.value]];
[self.sensitivityXLabel setText:[LocalizationHelper localizedStringForKey:
selectedWidgetView.hasSensitivityY ? @"SensitivityX: %.2f" : @"Sensitivity: %.2f",
sender.value]];
[self.sensitivityYLabel setText:[LocalizationHelper localizedStringForKey:@"SensitivityY: %.2f", sender.value]];
[self.sensitivityYSlider setValue:sender.value];
if(self->selectedWidgetView != nil && self->widgetViewSelected){
@@ -1187,9 +1220,41 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
return;
}
- (void)walkModeThresholdSliderMoved:(UISlider* )sender{
[self.walkModeThresholdLabel setText:[LocalizationHelper localizedStringForKey:@"Walkmode threshold: %.0f ", sender.value]];
if(self->selectedWidgetView != nil && self->widgetViewSelected){ self->selectedWidgetView.dWheelWalkModeThreshold = sender.value;
if(!OnScreenControls.shared) return;
if([selectedWidgetView.touchPadString isEqualToString:@"LSWHEEL"]) [OnScreenControls.shared sendLeftStickTouchPadEvent:0 :sender.value];
if([selectedWidgetView.touchPadString isEqualToString:@"RSWHEEL"]) [OnScreenControls.shared sendRightStickTouchPadEvent:0 :sender.value];
}
return;
}
- (void)clearSickInput{
if(self->selectedWidgetView != nil && self->widgetViewSelected){
[OnScreenControls.shared clearLeftStickTouchPadFlag];
[OnScreenControls.shared clearRightStickTouchPadFlag];
}
}
- (void)minStickOffsetSliderMoved:(UISlider* )sender{
[self.minStickOffsetLabel setText:[LocalizationHelper localizedStringForKey:@"Minimum offset: %.0f", sender.value]];
if(self->selectedWidgetView != nil && self->widgetViewSelected) self->selectedWidgetView.minStickOffset = sender.value;
if(self->selectedWidgetView != nil && self->widgetViewSelected){
self->selectedWidgetView.minStickOffset = sender.value;
if(!OnScreenControls.shared) return;
if([selectedWidgetView.touchPadString isEqualToString:@"LSPAD"]
|| [selectedWidgetView.touchPadString isEqualToString:@"LSVPAD"]
|| [selectedWidgetView.touchPadString isEqualToString:@"LSWHEEL"]
){
[OnScreenControls.shared sendLeftStickTouchPadEvent:sender.value :0];
}
if([selectedWidgetView.touchPadString isEqualToString:@"RSPAD"]
|| [selectedWidgetView.touchPadString isEqualToString:@"RSVPAD"]
|| [selectedWidgetView.touchPadString isEqualToString:@"RSWHEEL"]
){
[OnScreenControls.shared sendRightStickTouchPadEvent:sender.value :0];
}
}
return;
}
@@ -1335,6 +1400,10 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
[self.widgetHeightSlider addTarget:self action:@selector(widgetHeightSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.widgetHeightLabel.text = [LocalizationHelper localizedStringForKey:@"Height"];
self.widgetHeightStack.hidden = YES;
[self.componentSizeSlider addTarget:self action:@selector(componentSizeSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.componentSizeLabel.text = [LocalizationHelper localizedStringForKey:@"Component size"];
self.componentSizeStack.hidden = YES;
alphaSliderMode = widgetAlpha;
[self.widgetAlphaSlider addTarget:self action:@selector(widgetAlphaSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
@@ -1370,10 +1439,14 @@ typedef NS_ENUM(NSUInteger, DecelerationRateSliderMode) {
self.sensitivityYLabel.text = [LocalizationHelper localizedStringForKey:@"SensitivityY"];
self.sensitivityYStack.hidden = YES;
[self.walkModeThresholdSlider addTarget:self action:@selector(walkModeThresholdSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.walkModeThresholdLabel.text = [LocalizationHelper localizedStringForKey:@"Walkmode threshold"];
self.walkModeThresholdStack.hidden = YES;
[self.minStickOffsetSlider addTarget:self action:@selector(minStickOffsetSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.minStickOffsetLabel.text = [LocalizationHelper localizedStringForKey:@"Minimum offset"];
self.minStickOffsetStack.hidden = YES;
[self.slideThresholdSlider addTarget:self action:@selector(slideThresholdSliderMoved:) forControlEvents:(UIControlEventValueChanged)];
self.slideThresholdLabel.text = [LocalizationHelper localizedStringForKey:@"Slide threshold"];
self.slideThresholdStack.hidden = YES;