diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index b6719d24..eb635a53 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -1451,6 +1451,64 @@ } } }, + "emulatedControllerTypeStackDoc" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/uscwmv3vz8g30rmk?singleDoc#" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/bz6ggagp0ly4loq3?singleDoc#" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/bz6ggagp0ly4loq3?singleDoc#" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/bz6ggagp0ly4loq3?singleDoc#" + } + } + } + }, + "emulatedControllerTypeStackTip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunshine emulates game controller via VigemBus, which support DS4 & Xbox360. \n\n- Xbox360 does not support gyro.\n\n- When “both” is selected, the app will map built-in gyro as player0 & external game controller as player1" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunshine 通过 VigemBus 模拟游戏手柄,支持 DS4 和 Xbox 360。\n\n- Xbox 360 不支持陀螺仪。\n\n- 当选择“同时映射”时,app会将内置陀螺仪映射为玩家0,外接手柄映射为玩家1。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunshine 透過 VigemBus 模擬遊戲控制器,支援 DS4 和 Xbox 360。\n\n- Xbox 360 不支援陀螺儀。\n\n- 當選擇「同時映射」時,app 會將內建陀螺儀對應為玩家0,外接控制器對應為玩家1。" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunshine 透過 VigemBus 模擬遊戲控制器,支援 DS4 和 Xbox 360。\n\n- Xbox 360 不支援陀螺儀。\n\n- 當選擇「同時映射」時,app 會將內建陀螺儀對應為玩家0,外接控制器對應為玩家1。" + } + } + } + }, "Enter a new command and alias" : { "extractionState" : "manual", "localizations" : { @@ -2972,25 +3030,25 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "VoidLink supports rich, powerful custom on screen widgets including keyboard buttons, gamepad button & joysticks, mouse touchpad & button. Check online document for detail." + "value" : "- VoidLink supports rich, powerful custom on screen widgets including keyboard buttons, gamepad button & joysticks, mouse touchpad & button. Check online document for detail.\n\n- Multi-finger tap gesture is available for launching widget layout tool during streaming." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "VoidLink具备丰富而强大的自定义屏显控件,类型包括:键盘按键、手柄按键和摇杆、鼠标触摸板和按键等。详见在线文档。 " + "value" : "- VoidLink具备丰富而强大的自定义屏显控件,类型包括:键盘按键、手柄按键和摇杆、鼠标触摸板和按键等。详见在线文档。 \n\n- 可通过多指轻按手势在串流时打开控件布局工具。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "VoidLink 提供豐富且強大的自訂螢幕顯示元件,類型包含:鍵盤按鍵、手把按鍵與搖桿、滑鼠觸控板及按鍵等。詳細資訊請參考線上說明文件。" + "value" : "- VoidLink 提供豐富且強大的自訂螢幕顯示元件,類型包含:鍵盤按鍵、手把按鍵與搖桿、滑鼠觸控板及按鍵等。詳細資訊請參考線上說明文件。\n\n- 可透過多指輕點手勢,在串流時開啟控制元件佈局工具。" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "VoidLink 提供豐富且強大的自訂螢幕顯示元件,類型包含:鍵盤按鍵、手把按鍵與搖桿、滑鼠觸控板及按鍵等。詳細資訊請參考線上說明文件。" + "value" : "- VoidLink 提供豐富且強大的自訂螢幕顯示元件,類型包含:鍵盤按鍵、手把按鍵與搖桿、滑鼠觸控板及按鍵等。詳細資訊請參考線上說明文件。\n\n- 可透過多指輕點手勢,在串流時開啟控制元件佈局工具。" } } } diff --git a/VoidLink/ViewControllers/SettingsViewController.h b/VoidLink/ViewControllers/SettingsViewController.h index ebc85e00..6e39d57a 100644 --- a/VoidLink/ViewControllers/SettingsViewController.h +++ b/VoidLink/ViewControllers/SettingsViewController.h @@ -125,7 +125,7 @@ - (void)saveSettings; + (bool)isLandscapeNow; - (void)updateResolutionTable; -- (void)widget:(UISlider*)widget setEnabled:(bool)enabled; +- (void)widget:(UIView*)widget setEnabled:(bool)enabled; - (void)updateTheme; - (void)hideDynamicLabelsWhenOverlapped:(UIView* )view; - (void)setHidden:(BOOL)hidden forStack:(UIStackView* )stack; diff --git a/VoidLink/ViewControllers/SettingsViewController.m b/VoidLink/ViewControllers/SettingsViewController.m index c60fd7e2..e975a8cb 100644 --- a/VoidLink/ViewControllers/SettingsViewController.m +++ b/VoidLink/ViewControllers/SettingsViewController.m @@ -514,7 +514,7 @@ BOOL isCustomResolution(CGSize res) { if (@available(iOS 13.0, *)) { [videoSection setSectionWithIcon:[UIImage systemImageNamed:@"waveform"] andSize:20]; } - [self addSetting:self.resolutionStack ofId:@"resolutionStack" withInfoTag:YES withDynamicLabel:YES to:videoSection]; + [self addSetting:self.resolutionStack ofId:@"resolutionStack" withInfoTag:NO withDynamicLabel:YES to:videoSection]; [self addSetting:self.fpsStack ofId:@"fpsStack" withInfoTag:NO withDynamicLabel:NO to:videoSection]; [self addSetting:self.bitrateStack ofId:@"bitrateStack" withInfoTag:YES withDynamicLabel:YES to:videoSection]; [self addSetting:self.framepacingStack ofId:@"framepacingStack" withInfoTag:NO withDynamicLabel:NO to:videoSection]; @@ -522,6 +522,7 @@ BOOL isCustomResolution(CGSize res) { [self addSetting:self.hdrStack ofId:@"hdrStack" withInfoTag:![self hdrSupported] withDynamicLabel:NO to:videoSection]; [self addSetting:self.yuv444Stack ofId:@"yuv444Stack" withInfoTag:YES withDynamicLabel:NO to:videoSection]; [self addSetting:self.pipStack ofId:@"pipStack" withInfoTag:YES withDynamicLabel:NO to:videoSection]; + [self addSetting:self.pipStack ofId:@"pipStack" withInfoTag:YES withDynamicLabel:NO to:videoSection]; [videoSection addToParentStack:_parentStack]; [videoSection setExpanded:YES]; @@ -1014,6 +1015,11 @@ BOOL isCustomResolution(CGSize res) { showOnlineDocAction = true; onlineDocLink = [LocalizationHelper localizedStringForKey:@"externalDisplayModeStackDoc"]; } + if([sender.superview.accessibilityIdentifier isEqualToString: @"emulatedControllerTypeStack"]){ + tipText = [LocalizationHelper localizedStringForKey:@"emulatedControllerTypeStackTip"]; + showOnlineDocAction = true; + onlineDocLink = [LocalizationHelper localizedStringForKey:@"emulatedControllerTypeStackDoc"]; + } UIAlertController *tipsAlertController = [UIAlertController alertControllerWithTitle: [LocalizationHelper localizedStringForKey:@"Tips"] message: [LocalizationHelper localizedStringForKey:@"%@", tipText] preferredStyle:UIAlertControllerStyleAlert]; @@ -1311,9 +1317,9 @@ BOOL isCustomResolution(CGSize res) { break; } - if ([self hdrSupported]) { + if (![self hdrSupported]) { [self.hdrSwitch setOn:NO]; - [self.hdrSwitch setEnabled:NO]; + [self widget:self.hdrSwitch setEnabled:NO]; } else { [self.hdrSwitch setOn:currentSettings.enableHdr]; @@ -1654,13 +1660,21 @@ BOOL isCustomResolution(CGSize res) { return 0; } -- (void) widget:(UISlider*)widget setEnabled:(bool)enabled{ - [widget setEnabled:enabled]; - if(enabled){ - widget.alpha = 1.0; - [widget setValue:widget.value + 0.0001]; // this is for low iOS version (like iOS14), only setting this minor value change is able to make widget visibility clear +- (void) widget:(UIView*)widget setEnabled:(bool)enabled{ + if([widget isKindOfClass:[UISlider class]]){ + UISlider* widgetPtr = (UISlider* )widget; + [widgetPtr setEnabled:enabled]; + if(enabled){ + widgetPtr.alpha = 1.0; + [widgetPtr setValue:widgetPtr.value + 0.0001]; // this is for low iOS version (like iOS14), only setting this minor value change is able to make widget visibility clear + } + else widgetPtr.alpha = 0.5; // this is for updating widget visibility on low iOS version like mini5 ios14 + } + + if([widget isKindOfClass:[UISwitch class]]){ + widget.userInteractionEnabled = enabled; + widget.alpha = enabled ? 1 : 0.5; } - else widget.alpha = 0.5; // this is for updating widget visibility on low iOS version like mini5 ios14 } /* @@ -1903,7 +1917,7 @@ BOOL isCustomResolution(CGSize res) { } - (bool)hdrSupported{ - return !VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) || !(AVPlayer.availableHDRModes & AVPlayerHDRModeHDR10); + return VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC) && (AVPlayer.availableHDRModes & AVPlayerHDRModeHDR10); } - (void) updateBitrateText {