diff --git a/VoidLink/Input/CustomOSC/OSCProfilesManager.m b/VoidLink/Input/CustomOSC/OSCProfilesManager.m index b36bb033..cd37c925 100644 --- a/VoidLink/Input/CustomOSC/OSCProfilesManager.m +++ b/VoidLink/Input/CustomOSC/OSCProfilesManager.m @@ -393,6 +393,7 @@ static CGRect layoutViewBounds; buttonState.widthFactor = [self normalizeSizeWidthFactorWith:widgetView and:buttonState]; buttonState.heightFactor = [self normalizeSizeHeightFactor:widgetView and:buttonState]; buttonState.backgroundAlpha = widgetView.backgroundAlpha; + buttonState.labelAlpha = widgetView.labelAlpha; buttonState.borderWidth = widgetView.borderWidth; buttonState.autoTapInterval = widgetView.autoTapInterval; buttonState.vibrationStyle = widgetView.vibrationStyle; diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.h b/VoidLink/Input/CustomOSC/OnScreenButtonState.h index 665491f4..bd67f961 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.h +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.h @@ -44,6 +44,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat oscLayerSizeFactor; // for OnScreenController CALayer @property (nonatomic, assign) CGFloat backgroundAlpha; +@property (nonatomic, assign) CGFloat labelAlpha; @property (nonatomic, assign) uint8_t vibrationStyle; @property (nonatomic, assign) uint8_t mouseButtonAction; @property (nonatomic, assign) uint16_t autoTapInterval; diff --git a/VoidLink/Input/CustomOSC/OnScreenButtonState.m b/VoidLink/Input/CustomOSC/OnScreenButtonState.m index 8f13b35a..c72c5a99 100644 --- a/VoidLink/Input/CustomOSC/OnScreenButtonState.m +++ b/VoidLink/Input/CustomOSC/OnScreenButtonState.m @@ -52,6 +52,7 @@ [encoder encodeFloat:self.stickIndicatorOffset forKey:@"stickIndicatorOffset"]; [encoder encodeFloat:self.oscLayerSizeFactor forKey:@"oscLayerSizeFactor"]; [encoder encodeFloat:self.backgroundAlpha forKey:@"backgroundAlpha"]; + [encoder encodeFloat:self.labelAlpha forKey:@"labelAlpha"]; [encoder encodeFloat:self.borderWidth forKey:@"borderWidth"]; [encoder encodeObject:self.widgetShape forKey:@"widgetShape"]; [encoder encodeFloat:self.minStickOffset forKey:@"minStickOffset"]; @@ -79,7 +80,8 @@ self.decelerationRate = [decoder decodeFloatForKey:@"decelerationRate"]; self.stickIndicatorOffset = [decoder decodeFloatForKey:@"stickIndicatorOffset"]; self.oscLayerSizeFactor = [decoder decodeFloatForKey:@"oscLayerSizeFactor"]; - self.backgroundAlpha = [decoder decodeFloatForKey:@"backgroundAlpha"]; + self.backgroundAlpha = [decoder containsValueForKey:@"backgroundAlpha"] ? [decoder decodeFloatForKey:@"backgroundAlpha"] : 0.5; + self.labelAlpha = [decoder containsValueForKey:@"labelAlpha"] ? [decoder decodeFloatForKey:@"labelAlpha"] : 0.82; self.borderWidth = [decoder decodeFloatForKey:@"borderWidth"]; self.widgetShape = [decoder decodeObjectForKey:@"widgetShape"]; self.minStickOffset = [decoder decodeFloatForKey:@"minStickOffset"]; diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 697981d9..1d39f93f 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -73,6 +73,7 @@ import UIKit @objc public var borderWidth: CGFloat = 0.0 @objc public var backgroundAlpha: CGFloat = 0.5 + @objc public var labelAlpha: CGFloat = 0.82 @objc public var vibrationStyle: Int = 6 @objc public var latestTouchLocation: CGPoint @objc public var selfViewOnTheRight: Bool = false @@ -455,6 +456,11 @@ import UIKit setupView() } + @objc public func tweakLabelAlpha(alpha:CGFloat){ + labelAlpha = alpha + label.textColor = UIColor(white: 1.0, alpha: labelAlpha) + } + private func tweakAlpha(){ // setup default border from self.backgroundAlpha let realBackgroundAlpha = self.backgroundAlpha - 0.18 // offset to be consistent with legacy onScreen controller layer opacity @@ -563,7 +569,7 @@ import UIKit label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.1 // Adjust the scale factor as needed - label.textColor = UIColor(white: 1.0, alpha: 0.82) + label.textColor = UIColor(white: 1.0, alpha: labelAlpha) label.textAlignment = .center label.shadowColor = .black label.shadowOffset = CGSize(width: 1, height: 1) diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index 21195288..3a295fd2 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -577,6 +577,7 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; [widgetView resizeWidgetView]; // resize must be called after relocation [widgetView adjustTransparencyWithAlpha:buttonState.backgroundAlpha]; [widgetView adjustBorderWithWidth:buttonState.borderWidth]; + [widgetView tweakLabelAlphaWithAlpha:buttonState.labelAlpha]; [widgetView setupAutoTapTimer]; } } diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index c339816e..6d6b1e1f 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -2701,6 +2701,29 @@ } } }, + "Label alpha: %.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" + } + } + } + }, "Later" : { "extractionState" : "manual", "localizations" : { diff --git a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index 7d4f0b77..c7fb5a18 100644 --- a/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/VoidLink/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -28,6 +28,7 @@ BOOL isToolbarHidden; OSCProfilesManager* profilesManager; OnScreenWidgetView* selectedWidgetView; + bool labelAlphaLoaded; CALayer* selectedControllerLayer; CGRect controllerLoadedBounds; bool widgetViewSelected; @@ -152,6 +153,7 @@ widgetView.sizeReference = [self getCurrentWidgetSizeReference]; [widgetView resizeWidgetView]; // resize must be called after relocation [widgetView adjustTransparencyWithAlpha:buttonState.backgroundAlpha]; + [widgetView tweakLabelAlphaWithAlpha:buttonState.labelAlpha]; [widgetView adjustBorderWithWidth:buttonState.borderWidth]; [self.onScreenWidgetViews addObject:widgetView]; } @@ -335,6 +337,14 @@ } } +- (void)switchAlphaSlider:(UISwipeGestureRecognizer *)sender { + if(!widgetViewSelected) return; + labelAlphaLoaded = !labelAlphaLoaded; + if(labelAlphaLoaded) [self.widgetAlphaSlider setValue: self->selectedWidgetView.labelAlpha]; + else [self.widgetAlphaSlider setValue: self->selectedWidgetView.backgroundAlpha]; + [self widgetAlphaSliderMoved:self.widgetAlphaSlider]; +} + /* 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"]; @@ -663,6 +673,7 @@ newWidget.sizeReference = widget.sizeReference; [newWidget resizeWidgetView]; // resize must be called after relocation [newWidget adjustTransparencyWithAlpha:widget.backgroundAlpha]; + [newWidget tweakLabelAlphaWithAlpha:widget.labelAlpha]; [newWidget adjustBorderWithWidth:widget.borderWidth]; [self.onScreenWidgetViews addObject:newWidget]; self->selectedWidgetView = newWidget; @@ -753,6 +764,8 @@ - (void)widgetViewTapped: (NSNotification *)notification{ //self.undoButton.alpha = selectedWidgetView.layoutChanges.count>1 && !CGPointEqualToPoint(selectedWidgetView.layoutChanges.lastObject.CGPointValue, selectedWidgetView.initialCenter)? 1.0 : 0.3; + // labelAlphaLoaded = false; + [self hideStickIndicators]; // receive the selected widgetView obj passed from the notification @@ -834,8 +847,9 @@ [self.widgetHeightSlider setValue: self->selectedWidgetView.deNormalizedHeightFactor]; [self autoFitLabel:self.widgetHeightLabel]; [self.widgetHeightLabel setText:[LocalizationHelper localizedStringForKey:@"Height: %.2f", self->selectedWidgetView.deNormalizedHeightFactor]]; - - [self.widgetAlphaSlider setValue: self->selectedWidgetView.backgroundAlpha]; + + if(labelAlphaLoaded) [self.widgetAlphaSlider setValue: self->selectedWidgetView.labelAlpha]; + else [self.widgetAlphaSlider setValue: self->selectedWidgetView.backgroundAlpha]; [self autoFitLabel:self.widgetAlphaLabel]; [self widgetAlphaSliderMoved:self.widgetAlphaSlider]; @@ -942,13 +956,19 @@ } - (void)widgetAlphaSliderMoved:(UISlider* )sender{ - [self.widgetAlphaLabel setText:[LocalizationHelper localizedStringForKey:@"Alpha: %.2f", sender.value]]; - if(self->selectedWidgetView != nil && self->widgetViewSelected){ - [self->selectedWidgetView adjustTransparencyWithAlpha:sender.value]; + if(labelAlphaLoaded){ + [self.widgetAlphaLabel setText:[LocalizationHelper localizedStringForKey:@"Label alpha: %.2f", sender.value]]; + [selectedWidgetView tweakLabelAlphaWithAlpha:sender.value]; } - - if(self->selectedControllerLayer != nil && self->controllerLayerSelected){ - [self.layoutOSC adjustControllerLayerOpacityWith:self->selectedControllerLayer and:sender.value]; + else{ + [self.widgetAlphaLabel setText:[LocalizationHelper localizedStringForKey:@"Alpha: %.2f", sender.value]]; + if(self->selectedWidgetView != nil && self->widgetViewSelected){ + [self->selectedWidgetView adjustTransparencyWithAlpha:sender.value]; + } + + if(self->selectedControllerLayer != nil && self->controllerLayerSelected){ + [self.layoutOSC adjustControllerLayerOpacityWith:self->selectedControllerLayer and:sender.value]; + } } return; } @@ -1138,6 +1158,12 @@ [self.widgetAlphaSlider addTarget:self action:@selector(widgetAlphaSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; self.widgetAlphaLabel.text = [LocalizationHelper localizedStringForKey:@"Alpha"]; + self.widgetAlphaLabel.userInteractionEnabled = true; + UITapGestureRecognizer *alphaSwitchTapGesture = + [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(switchAlphaSlider:)]; + [self.widgetAlphaLabel addGestureRecognizer:alphaSwitchTapGesture]; + [self.widgetBorderWidthSlider addTarget:self action:@selector(widgetBorderWidthSliderMoved:) forControlEvents:(UIControlEventValueChanged)]; self.widgetBorderWidthLabel.text = [LocalizationHelper localizedStringForKey:@"Border width"];