- minimum offset slider for stick touchpads (rspad rsvpad lspad lsvpad)

- prevents edit button to update onscreen widgets to a different widget type (e.g. touchpad -> button)
This commit is contained in:
TrueZhuanjia
2025-11-27 15:06:41 +08:00
parent 7d5b984157
commit 72867d855d
10 changed files with 213 additions and 77 deletions
@@ -583,13 +583,6 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
textField.spellCheckingType = UITextSpellCheckingTypeNo;
}];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = [LocalizationHelper localizedStringForKey:@"Minimum stick offset (0~32766)"];
textField.keyboardType = UIKeyboardTypeASCIICapable;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.spellCheckingType = UITextSpellCheckingTypeNo;
}];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = [LocalizationHelper localizedStringForKey:@"Shape (r - round, s - square)"];
textField.keyboardType = UIKeyboardTypeASCIICapable;
@@ -618,8 +611,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
handler:^(UIAlertAction *action) {
[widgetInitParams setObject: alertController.textFields[0].text forKey:@"cmdString"]; // convert to uppercase
[widgetInitParams setObject: alertController.textFields[1].text forKey:@"buttonLabel"]; // convert to uppercase
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"minStickOffsetString"]; // convert to uppercase
[widgetInitParams setObject: alertController.textFields[3].text forKey:@"shape"]; // convert to uppercase
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"shape"]; // convert to uppercase
[self createWidgetFromParams:widgetInitParams];
}];
[alertController addAction:readInstruction];
@@ -654,15 +646,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
textField.spellCheckingType = UITextSpellCheckingTypeNo;
textField.text = self->selectedWidgetView.widgetLabel;
}];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = [LocalizationHelper localizedStringForKey:@"Minimum stick offset (0~32766)"];
textField.keyboardType = UIKeyboardTypeASCIICapable;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.spellCheckingType = UITextSpellCheckingTypeNo;
if(self->selectedWidgetView.minStickOffset > 0) textField.text = [NSString stringWithFormat:@"%d", (int)self->selectedWidgetView.minStickOffset];
}];
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = [LocalizationHelper localizedStringForKey:@"Shape (r - round, s - square)"];
textField.keyboardType = UIKeyboardTypeASCIICapable;
@@ -678,8 +662,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
handler:^(UIAlertAction *action) {
[widgetInitParams setObject: alertController.textFields[0].text forKey:@"cmdString"];
[widgetInitParams setObject: alertController.textFields[1].text forKey:@"buttonLabel"];
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"minStickOffsetString"];
[widgetInitParams setObject: alertController.textFields[3].text forKey:@"shape"];
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"shape"];
[self updateWidget:self->selectedWidgetView byParams:widgetInitParams createNew:true];
}];
@@ -688,20 +671,23 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
handler:^(UIAlertAction *action) {
[widgetInitParams setObject: alertController.textFields[0].text forKey:@"cmdString"];
[widgetInitParams setObject: alertController.textFields[1].text forKey:@"buttonLabel"];
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"minStickOffsetString"];
[widgetInitParams setObject: alertController.textFields[3].text forKey:@"shape"];
[widgetInitParams setObject: alertController.textFields[2].text forKey:@"shape"];
[self updateWidget:self->selectedWidgetView byParams:widgetInitParams createNew:false];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey:@"Cancel"]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {}];
[alertController addAction:createNewAction];
[alertController addAction:modifyAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
- (bool) isWidgetParamsValid:(NSMutableDictionary* )widgetInitParams{
NSString *cmdString = [widgetInitParams[@"cmdString"] uppercaseString]; // convert to uppercase
NSString *buttonLabel = widgetInitParams[@"buttonLabel"];
NSString *minStickOffsetString = widgetInitParams[@"minStickOffsetString"];
NSString *widgetShape = [widgetInitParams[@"shape"] lowercaseString];
widgetInitParams[@"cmdString"] = cmdString;
@@ -715,11 +701,6 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
bool paramInvalid = noValidKeyboardString && noValidMouseButtonString && noValidTouchPadString && noValidOscButtonString && noValidFunctionalButtonString && noValidSuperComboButtonString && noValidMotionControlButtonString;
if([buttonLabel isEqualToString:@""]) widgetInitParams[@"buttonLabel"] = [[cmdString lowercaseString] capitalizedString];
NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
NSString *trimmedString = [minStickOffsetString stringByTrimmingCharactersInSet:nonDigitCharacterSet];
if(trimmedString.length != minStickOffsetString.length) paramInvalid = true;
widgetInitParams[@"minStickOffsetString"] = trimmedString;
NSSet* validShapes = [NSSet setWithObjects:@"round", @"square", @"largesquare", nil];
if([widgetShape isEqualToString:@"r"]) widgetShape = @"round";
@@ -752,10 +733,16 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
newWidget.rollFactor = widget.rollFactor;
newWidget.trackballDecelerationRate = widget.trackballDecelerationRate;
newWidget.stickIndicatorOffset = widget.stickIndicatorOffset;
newWidget.minStickOffset = [widgetInitParams[@"minStickOffsetString"] floatValue];
newWidget.minStickOffset = widget.minStickOffset;
[newWidget setVibrationWithStyle:widget.vibrationStyle];
newWidget.mouseButtonAction = widget.mouseButtonAction;
newWidget.buttonMode = widget.buttonMode;
if (newWidget.widgetType != widget.widgetType){
newWidget = nil;
return;
}
[self.view insertSubview:newWidget belowSubview:self.widgetPanelStack];
[newWidget accessWidgetAttributes];
@@ -783,7 +770,6 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
widgetView.identifier = [UUIDHelper newUUID];
widgetView.guidelineDelegate = (id<OnScreenWidgetGuidelineUpdateDelegate>)self;
widgetView.translatesAutoresizingMaskIntoConstraints = NO; // weird but this is mandatory, or you will find no key views added to the right place
widgetView.minStickOffset = [widgetInitParams[@"minStickOffsetString"] floatValue];
[self.onScreenWidgetViews addObject:widgetView];
// Add the widgetView to the view controller's view
[self.view insertSubview:widgetView belowSubview:self.widgetPanelStack];
@@ -905,6 +891,13 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
[self autoFitLabel:self.sensitivityYLabel];
}
self.minStickOffsetStack.hidden = !selectedWidgetView.hasMinStickOffset;
if(selectedWidgetView.hasMinStickOffset){
[self.minStickOffsetSlider setValue:selectedWidgetView.minStickOffset];
[self.minStickOffsetLabel setText:[LocalizationHelper localizedStringForKey:@"Minimum offset: %.0f", self->selectedWidgetView.minStickOffset]];
[self autoFitLabel:self.minStickOffsetLabel];
}
self.slideThresholdStack.hidden = !selectedWidgetView.hasSlideThreshold;
if(selectedWidgetView.hasSlideThreshold){
[self.slideThresholdSlider setMinimumValue:selectedWidgetView.slideThresholdMin];
@@ -989,7 +982,7 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
[self autoFitLabel:self.decelerationRateLabel];
[self decelerationRateSliderMoved:self.decelerationRateSlider];
self.mouseDownButtonStack.hidden = !selectedWidgetView.isMousePad;
self.mouseDownButtonStack.hidden = !selectedWidgetView.isMousePadWithButtonActions;
self.mouseButtonDownSelector.selectedSegmentIndex = selectedWidgetView.mouseButtonAction;
self.buttonModeStack.hidden = selectedWidgetView.widgetType != WidgetTypeEnumButton;
@@ -1179,6 +1172,12 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
return;
}
- (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;
return;
}
- (void)slideThresholdSliderMoved:(UISlider* )sender{
[self.slideThresholdLabel setText:[LocalizationHelper localizedStringForKey:@"Slide threshold: %.1f", sender.value]];
if(self->selectedWidgetView != nil && self->widgetViewSelected) self->selectedWidgetView.slideThreshold = sender.value;
@@ -1342,6 +1341,10 @@ typedef NS_ENUM(NSUInteger, BorderWidthSliderMode) {
self.sensitivityYLabel.text = [LocalizationHelper localizedStringForKey:@"SensitivityY"];
self.sensitivityYStack.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;