hide some settings in streaming
This commit is contained in:
committed by
TrueZhuanjia
parent
561080568c
commit
2679ba75af
@@ -14,7 +14,7 @@
|
||||
<collectionView key="view" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" indicatorStyle="black" dataMode="prototypes" id="TZj-Lc-M9d" customClass="AppCollectionView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="834" height="1120"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="0.3333333432674408" green="0.3333333432674408" blue="0.3333333432674408" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="20" minimumInteritemSpacing="20" id="f7l-kG-hJc">
|
||||
<size key="itemSize" width="150" height="200"/>
|
||||
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
||||
@@ -1270,13 +1270,13 @@ ICAgICAgICAgICAgICA
|
||||
<image name="SquaresArrowUp" width="40" height="40"/>
|
||||
<image name="Trash" width="40" height="40"/>
|
||||
<systemColor name="secondaryLabelColor">
|
||||
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
<systemColor name="systemBrownColor">
|
||||
<color red="0.63529411764705879" green="0.51764705882352946" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<color red="0.63529411759999999" green="0.51764705879999995" blue="0.36862745099999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
<systemColor name="viewFlipsideBackgroundColor">
|
||||
<color red="0.12156862745098039" green="0.12941176470588237" blue="0.14117647058823529" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// HostCardView.h
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 5/18/25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "TemporaryHost.h"
|
||||
|
||||
@protocol HostCallback <NSObject>
|
||||
|
||||
- (void) hostClicked:(TemporaryHost*)host view:(UIView*)view;
|
||||
- (void) hostLongClicked:(TemporaryHost*)host view:(UIView*)view;
|
||||
- (void) addHostClicked;
|
||||
|
||||
@end
|
||||
|
||||
@interface HostCardView : UIView
|
||||
@property (nonatomic, assign) CGFloat sizeFactor;
|
||||
|
||||
- (void)resizeBySizeFactor:(CGFloat)factor;
|
||||
- (id) initWithHost:(TemporaryHost*)host;
|
||||
|
||||
@end
|
||||
|
||||
@@ -0,0 +1,610 @@
|
||||
//
|
||||
// HostCardView.m
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 5/18/25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
|
||||
#import "HostCardView.h"
|
||||
#import "LocalizationHelper.h"
|
||||
#import "UIColor+Theme.h"
|
||||
|
||||
@interface HostCardView ()
|
||||
|
||||
@property (nonatomic, strong) UIView *iconBackgroundView;
|
||||
@property (nonatomic, strong) UIImageView *hostIconView;
|
||||
@property (nonatomic, strong) UILabel *hostNameLabel;
|
||||
@property (nonatomic, strong) UIImageView *statusIcon;
|
||||
@property (nonatomic, strong) UILabel *statusLabel;
|
||||
@property (nonatomic, strong) UIButton *leftButton;
|
||||
@property (nonatomic, strong) UIButton *rightButton;
|
||||
@property (nonatomic, strong) UIButton *pairButton;
|
||||
@property (nonatomic, strong) UIButton *settingsButton;
|
||||
@property (nonatomic, strong) NSLayoutConstraint *widthConstraint;
|
||||
@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
|
||||
@property (nonatomic, strong) UIView *separatorLine;
|
||||
@property (nonatomic, assign) CGFloat cardContentpadding;
|
||||
@property (nonatomic, assign) UIUserInterfaceStyle userIterfaceStyle;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation HostCardView {
|
||||
TemporaryHost* _host;
|
||||
id<HostCallback> _callback;
|
||||
UIActivityIndicatorView* _hostSpinner;
|
||||
UIImageView* lockIconView;
|
||||
CGFloat computerIconMonitorCenterYOffset;
|
||||
CGFloat buttonHeight;
|
||||
CGFloat iconAndButtonSpacing;
|
||||
UIColor *defaultBlue;
|
||||
UIColor *defaultGreen;
|
||||
CAGradientLayer *backgroundLayer;
|
||||
|
||||
}
|
||||
|
||||
static const float REFRESH_CYCLE = 2.0f;
|
||||
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame {
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
self.sizeFactor = 1.0; // decisive factor assign
|
||||
computerIconMonitorCenterYOffset = -3.3*_sizeFactor;
|
||||
iconAndButtonSpacing = 37*_sizeFactor;
|
||||
buttonHeight = 40*_sizeFactor;
|
||||
defaultBlue = [UIColor appPrimaryColor];
|
||||
defaultGreen = [UIColor colorWithRed:52.0/255.0 green:199.0/255.0 blue:89.0/255.0 alpha:1.0];
|
||||
self.userIterfaceStyle = self.traitCollection.userInterfaceStyle;
|
||||
self.userIterfaceStyle = UIUserInterfaceStyleLight;
|
||||
[self createBackgroundLayer];
|
||||
[self setupUI];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithHost:(TemporaryHost*)host {
|
||||
self = [self init];
|
||||
_host = host;
|
||||
|
||||
// Use UIContextMenuInteraction on iOS 13.0+ and a standard UILongPressGestureRecognizer
|
||||
// for tvOS devices and iOS prior to 13.0.
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)coder {
|
||||
self = [super initWithCoder:coder];
|
||||
if (self) {
|
||||
[self setupUI];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)resizeBySizeFactor:(CGFloat)factor{
|
||||
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
|
||||
self.sizeFactor = factor;
|
||||
[self setupUI];
|
||||
}
|
||||
|
||||
- (void)setupUI {
|
||||
self.backgroundColor = [UIColor widgetBackgroundColorDark]; // theme
|
||||
self.layer.cornerRadius = 16;
|
||||
self.cardContentpadding = 13 * _sizeFactor;
|
||||
self.clipsToBounds = YES;
|
||||
self.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
CGFloat appButtonWidth = 100*_sizeFactor;
|
||||
CGFloat launchButtonWidth = 120*_sizeFactor;
|
||||
/*
|
||||
NSLayoutConstraint *topAnchorConstraint;
|
||||
topAnchorConstraint = [self.topAnchor constraintEqualToAnchor:self.superview.topAnchor constant:500];
|
||||
topAnchorConstraint.active = YES;
|
||||
*/
|
||||
_heightConstraint = [self.heightAnchor constraintEqualToConstant:300];
|
||||
_heightConstraint.active = YES;
|
||||
_widthConstraint = [self.widthAnchor constraintEqualToConstant:300];
|
||||
_widthConstraint.active = YES;
|
||||
|
||||
|
||||
// 图标背景
|
||||
self.iconBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(_cardContentpadding, _cardContentpadding, 80*_sizeFactor, 80*_sizeFactor)];
|
||||
self.iconBackgroundView.backgroundColor = defaultBlue;
|
||||
self.iconBackgroundView.layer.cornerRadius = 20*_sizeFactor;
|
||||
[self addSubview:self.iconBackgroundView];
|
||||
|
||||
// 图标图片
|
||||
self.hostIconView = [[UIImageView alloc] init];
|
||||
self.hostIconView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.hostIconView.contentMode = UIViewContentModeScaleAspectFit;
|
||||
if (@available(iOS 13.0, *)) {
|
||||
self.hostIconView.image = [UIImage systemImageNamed:@"display"];
|
||||
} else {
|
||||
self.hostIconView.image = [UIImage imageNamed:@"Computer"];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.hostIconView.heightAnchor constraintEqualToConstant:57*_sizeFactor],
|
||||
[self.hostIconView.widthAnchor constraintEqualToConstant:57*_sizeFactor],
|
||||
]];
|
||||
}
|
||||
self.hostIconView.tintColor = [UIColor whiteColor];
|
||||
[self.iconBackgroundView addSubview:self.hostIconView];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.hostIconView.centerXAnchor constraintEqualToAnchor:self.iconBackgroundView.centerXAnchor constant:0],
|
||||
[self.hostIconView.centerYAnchor constraintEqualToAnchor:self.iconBackgroundView.centerYAnchor constant:0],
|
||||
[self.hostIconView.heightAnchor constraintEqualToConstant:63*_sizeFactor],
|
||||
[self.hostIconView.widthAnchor constraintEqualToConstant:63*_sizeFactor],
|
||||
]];
|
||||
// [self.iconBackgroundView layoutIfNeeded];
|
||||
// [self.iconImageView layoutIfNeeded];
|
||||
|
||||
//spinner
|
||||
_hostSpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
|
||||
_hostSpinner.userInteractionEnabled = NO;
|
||||
_hostSpinner.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
_hostSpinner.hidesWhenStopped = YES;
|
||||
[self.iconBackgroundView addSubview:_hostSpinner];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_hostSpinner.centerXAnchor constraintEqualToAnchor:self.iconBackgroundView.centerXAnchor constant:0],
|
||||
[_hostSpinner.centerYAnchor constraintEqualToAnchor:self.iconBackgroundView.centerYAnchor constant:computerIconMonitorCenterYOffset],
|
||||
]];
|
||||
_hostSpinner.transform = CGAffineTransformMakeScale(_sizeFactor, _sizeFactor);
|
||||
[_hostSpinner stopAnimating];
|
||||
// [_hostSpinner startAnimating];
|
||||
|
||||
|
||||
// lockIcon
|
||||
lockIconView =[[UIImageView alloc] init];
|
||||
lockIconView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
if (@available(iOS 13.0, *)) {
|
||||
lockIconView.image = [UIImage systemImageNamed:@"lock.fill"];
|
||||
} else {
|
||||
// lockIconView.image = [UIImage imageNamed:@"Computer"];
|
||||
}
|
||||
lockIconView.tintColor = [UIColor whiteColor];
|
||||
[self.iconBackgroundView insertSubview:lockIconView aboveSubview:_iconBackgroundView];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[lockIconView.centerXAnchor constraintEqualToAnchor:_iconBackgroundView.centerXAnchor constant:0],
|
||||
[lockIconView.centerYAnchor constraintEqualToAnchor:_iconBackgroundView.centerYAnchor constant:computerIconMonitorCenterYOffset],
|
||||
[lockIconView.widthAnchor constraintEqualToConstant:22*_sizeFactor],
|
||||
[lockIconView.heightAnchor constraintEqualToConstant:22*_sizeFactor]
|
||||
]];
|
||||
lockIconView.hidden = true;
|
||||
|
||||
// 设备名
|
||||
self.hostNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(_cardContentpadding+_iconBackgroundView.frame.size.width+20*_sizeFactor, _cardContentpadding+_iconBackgroundView.frame.size.height/10, 300*_sizeFactor, 30*_sizeFactor)];
|
||||
self.hostNameLabel.numberOfLines = 1;
|
||||
self.hostNameLabel.lineBreakMode = NSLineBreakByTruncatingTail;
|
||||
|
||||
self.hostIconView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.hostNameLabel.text = @"RazerBlade 16";
|
||||
self.hostNameLabel.textColor = [UIColor whiteColor]; //theme
|
||||
self.hostNameLabel.font = [UIFont boldSystemFontOfSize:20*_sizeFactor];
|
||||
[self addSubview:self.hostNameLabel];
|
||||
|
||||
|
||||
|
||||
// 在线状态图标
|
||||
self.statusIcon = [[UIImageView alloc] initWithFrame:CGRectMake(180, 70, 20*_sizeFactor, 20*_sizeFactor)];
|
||||
self.statusIcon.contentMode = UIViewContentModeScaleAspectFit;
|
||||
self.statusIcon.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
if (@available(iOS 13.0, *)) {
|
||||
self.statusIcon.image = [UIImage systemImageNamed:@"wifi"];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
self.statusIcon.tintColor = defaultGreen;
|
||||
|
||||
[self addSubview:self.statusIcon];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.statusIcon.leadingAnchor constraintEqualToAnchor:self.hostNameLabel.leadingAnchor],
|
||||
[self.statusIcon.topAnchor constraintEqualToAnchor:self.hostNameLabel.bottomAnchor constant:4*_sizeFactor],
|
||||
[self.statusIcon.widthAnchor constraintEqualToConstant:19*_sizeFactor]
|
||||
]];
|
||||
|
||||
|
||||
// 在线文字
|
||||
self.statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(205, 68, 100, 24)];
|
||||
self.statusLabel.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.statusLabel.text = @"Online";
|
||||
self.statusLabel.font = [UIFont systemFontOfSize:16*_sizeFactor weight:UIFontWeightMedium];
|
||||
self.statusLabel.textColor = defaultGreen;
|
||||
// self.statusLabel.font = [UIFont systemFontOfSize:16*_sizeFactor];
|
||||
[self addSubview:self.statusLabel];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.statusLabel.leadingAnchor constraintEqualToAnchor:self.statusIcon.trailingAnchor constant:3*_sizeFactor],
|
||||
[self.statusLabel.centerYAnchor constraintEqualToAnchor:self.statusIcon.centerYAnchor constant:0],
|
||||
]];
|
||||
|
||||
|
||||
// 设置按钮
|
||||
/*
|
||||
self.settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
self.settingsButton.frame = CGRectMake(self.bounds.size.width - 40, 20, 24, 24);
|
||||
if (@available(iOS 13.0, *)) {
|
||||
[self.settingsButton setImage:[UIImage systemImageNamed:@"gearshape"] forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
self.settingsButton.tintColor = [UIColor lightGrayColor];
|
||||
[self addSubview:self.settingsButton];
|
||||
*/
|
||||
|
||||
// 启动应用按钮
|
||||
self.leftButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
self.leftButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.leftButton.frame = CGRectMake(20, 200, 150, buttonHeight);
|
||||
[self.leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Applications"] forState:UIControlStateNormal];
|
||||
[self.leftButton setTitleColor:[UIColor textColorGray] forState:UIControlStateNormal]; //theme
|
||||
self.leftButton.titleLabel.font = [UIFont systemFontOfSize:16*_sizeFactor];
|
||||
[self addSubview:self.leftButton];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.leftButton.leadingAnchor constraintEqualToAnchor:self.iconBackgroundView.leadingAnchor constant:0],
|
||||
[self.leftButton.topAnchor constraintEqualToAnchor:self.iconBackgroundView.bottomAnchor constant:iconAndButtonSpacing],
|
||||
[self.leftButton.widthAnchor constraintEqualToConstant:appButtonWidth],
|
||||
[self.leftButton.heightAnchor constraintEqualToConstant:buttonHeight],
|
||||
// [self.launchButton.titleLabel.leadingAnchor constraintEqualToAnchor:self.launchButton.imageView.trailingAnchor constant:3*_sizeFactor]
|
||||
]];
|
||||
|
||||
|
||||
// 开始串流按钮
|
||||
self.rightButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
self.rightButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.rightButton.frame = CGRectMake(0, 0, 150, 50);
|
||||
self.rightButton.backgroundColor = defaultBlue;
|
||||
self.rightButton.layer.cornerRadius = 10;
|
||||
[self.rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Launch"] forState:UIControlStateNormal];
|
||||
[self.rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // theme
|
||||
self.rightButton.titleLabel.font = [UIFont boldSystemFontOfSize:16*_sizeFactor];
|
||||
|
||||
// self.launchButton.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
|
||||
self.rightButton.tintColor = [UIColor whiteColor];
|
||||
[self addSubview:self.rightButton];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.rightButton.frame.size.height/4*_sizeFactor];
|
||||
[self.rightButton setImage:[UIImage systemImageNamed:@"play.fill" withConfiguration:config] forState:UIControlStateNormal];
|
||||
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.rightButton.leadingAnchor constraintEqualToAnchor:self.leftButton.trailingAnchor constant:15*_sizeFactor],
|
||||
[self.rightButton.centerYAnchor constraintEqualToAnchor:self.leftButton.centerYAnchor constant:0],
|
||||
[self.rightButton.widthAnchor constraintEqualToConstant:launchButtonWidth],
|
||||
[self.rightButton.heightAnchor constraintEqualToConstant:buttonHeight],
|
||||
// [self.launchButton.titleLabel.leadingAnchor constraintEqualToAnchor:self.launchButton.imageView.trailingAnchor constant:3*_sizeFactor]
|
||||
]];
|
||||
|
||||
// 配对按钮
|
||||
self.pairButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
self.pairButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.pairButton.frame = CGRectMake(0, 0, 150, 50);
|
||||
self.pairButton.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
self.pairButton.layer.cornerRadius = 10;
|
||||
[self.pairButton setTitle:[LocalizationHelper localizedStringForKey:@" Pair with PIN"] forState:UIControlStateNormal];
|
||||
[self.pairButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
self.pairButton.titleLabel.font = [UIFont boldSystemFontOfSize:16*_sizeFactor];
|
||||
[self addSubview:self.pairButton];
|
||||
|
||||
// self.launchButton.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.pairButton.frame.size.height/3.5*_sizeFactor weight:UIImageSymbolWeightBold];
|
||||
UIImage *templateImage = [UIImage systemImageNamed:@"lock.open.fill" withConfiguration:config];
|
||||
UIImage *coloredImage = [templateImage imageWithTintColor:defaultBlue renderingMode:UIImageRenderingModeAlwaysOriginal];
|
||||
[self.pairButton setImage:coloredImage forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_pairButton.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
[_pairButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.pairButton.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:_cardContentpadding],
|
||||
[self.pairButton.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:-_cardContentpadding],
|
||||
[self.pairButton.topAnchor constraintEqualToAnchor:self.iconBackgroundView.bottomAnchor constant:iconAndButtonSpacing],
|
||||
// [self.pairButton.widthAnchor constraintEqualToConstant:launchButtonWidth],
|
||||
[self.pairButton.heightAnchor constraintEqualToConstant:buttonHeight],
|
||||
]];
|
||||
|
||||
|
||||
//分隔线
|
||||
_separatorLine = [[UIView alloc] init];
|
||||
_separatorLine.backgroundColor = [UIColor colorWithWhite:0.3 alpha:5.0];
|
||||
_separatorLine.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[self addSubview:_separatorLine];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_separatorLine.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:_cardContentpadding],
|
||||
[_separatorLine.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:-_cardContentpadding],
|
||||
[_separatorLine.centerYAnchor constraintEqualToAnchor:_iconBackgroundView.bottomAnchor constant: iconAndButtonSpacing/2],
|
||||
[_separatorLine.heightAnchor constraintEqualToConstant:1.0/UIScreen.mainScreen.scale]
|
||||
// [self.launchButton.titleLabel.leadingAnchor constraintEqualToAnchor:self.launchButton.imageView.trailingAnchor constant:3*_sizeFactor]
|
||||
]];
|
||||
|
||||
|
||||
// [self layoutSubviews];
|
||||
// [self layoutIfNeeded];
|
||||
|
||||
_widthConstraint.constant = _cardContentpadding*2 + appButtonWidth + 15*_sizeFactor + launchButtonWidth;
|
||||
_heightConstraint.constant = _cardContentpadding*2 + _iconBackgroundView.frame.size.height + iconAndButtonSpacing + buttonHeight + 1;
|
||||
|
||||
|
||||
[self updateTheme:_userIterfaceStyle];
|
||||
// [self updateContentsForHost:_host];
|
||||
// [self updateTheme:UIUserInterfaceStyleLight];
|
||||
}
|
||||
|
||||
- (void)createBackgroundLayer{
|
||||
backgroundLayer = [CAGradientLayer layer];
|
||||
UIColor *gradientColor = [UIColor colorWithRed:0.0 green:0.319 blue:0.64 alpha:1.0];
|
||||
CGColorRef gradientColorRef = _userIterfaceStyle == UIUserInterfaceStyleDark ? gradientColor.CGColor : [gradientColor colorWithAlphaComponent:0.52].CGColor;
|
||||
backgroundLayer.colors = @[
|
||||
(__bridge id)[UIColor clearColor].CGColor,
|
||||
(__bridge id)[UIColor clearColor].CGColor,
|
||||
(__bridge id)[UIColor clearColor].CGColor,
|
||||
(__bridge id)gradientColorRef
|
||||
];
|
||||
|
||||
backgroundLayer.locations = @[@0, @0.18, @0.5, @1];
|
||||
backgroundLayer.startPoint = CGPointMake(0.25, 0.5);
|
||||
backgroundLayer.endPoint = CGPointMake(0.75, 0.5);
|
||||
|
||||
CGAffineTransform transform = CGAffineTransformMake(-1.01, -1, 1, -3.67, 0.5, 2.83);
|
||||
backgroundLayer.transform = CATransform3DMakeAffineTransform(transform);
|
||||
[self.layer insertSublayer:backgroundLayer atIndex:0];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews {
|
||||
[super layoutSubviews];
|
||||
backgroundLayer.bounds = CGRectInset(self.bounds, -0.5 * self.bounds.size.width, -0.5 * self.bounds.size.height);
|
||||
backgroundLayer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
|
||||
[self updateContentsForHost:_host]; // quick update before looping
|
||||
}
|
||||
|
||||
|
||||
- (void)updateTheme:(UIUserInterfaceStyle)userIterfaceStyle{
|
||||
switch (userIterfaceStyle) {
|
||||
case UIUserInterfaceStyleDark:
|
||||
_hostNameLabel.textColor = [UIColor textColorDark];
|
||||
[_leftButton setTitleColor:[UIColor appPrimaryColor] forState:UIControlStateNormal];
|
||||
_separatorLine.backgroundColor = [UIColor separatorColorDark];
|
||||
// [_rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
||||
self.backgroundColor = [UIColor widgetBackgroundColorDark];
|
||||
backgroundLayer.hidden = NO;
|
||||
break;
|
||||
case UIUserInterfaceStyleLight:
|
||||
_hostNameLabel.textColor = [UIColor textColorLight];
|
||||
[_leftButton setTitleColor:[UIColor appPrimaryColor] forState:UIControlStateNormal];
|
||||
_separatorLine.backgroundColor = [UIColor separatorColorLight];
|
||||
// [_rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
||||
self.backgroundColor = [UIColor widgetBackgroundColorLight];
|
||||
backgroundLayer.hidden = NO;
|
||||
break;
|
||||
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)didMoveToSuperview {
|
||||
// Start our update loop when we are added to our cell
|
||||
if (self.superview != nil && _host != nil) {
|
||||
[self updateLoop];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
|
||||
[super traitCollectionDidChange:previousTraitCollection];
|
||||
|
||||
if (@available(iOS 13.0, *)) {
|
||||
if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
|
||||
[self updateTheme:self.traitCollection.userInterfaceStyle];
|
||||
}
|
||||
} else {
|
||||
[self updateTheme:UIUserInterfaceStyleDark];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void) updateLoop {
|
||||
// Stop immediately if the view has been detached
|
||||
if (self.superview == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
[self updateContentsForHost:_host];
|
||||
|
||||
// Queue the next refresh cycle
|
||||
[self performSelector:@selector(updateLoop) withObject:self afterDelay:REFRESH_CYCLE];
|
||||
}
|
||||
|
||||
- (void) switchButtonsForHostState:(State)hostState{
|
||||
switch (hostState) {
|
||||
case StateOnline:
|
||||
[self.leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Applications"] forState:UIControlStateNormal];
|
||||
[self.rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Launch"] forState:UIControlStateNormal];
|
||||
|
||||
break;
|
||||
case StateOffline:
|
||||
break;
|
||||
case StateUnknown:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void) updateContentsForHost:(TemporaryHost*)host {
|
||||
_hostNameLabel.text = host.name;
|
||||
// self.hostNameLabel.text = @"RazerBlade 16 testttttettest";
|
||||
|
||||
|
||||
backgroundLayer.hidden = !(host.state == StateOnline && host.pairState == PairStatePaired);
|
||||
|
||||
|
||||
|
||||
switch (host.state) {
|
||||
case StateOnline:
|
||||
[_hostSpinner stopAnimating];
|
||||
_statusLabel.textColor = defaultGreen;
|
||||
_statusLabel.text = @"Online";
|
||||
_statusIcon.tintColor = defaultGreen;
|
||||
|
||||
if (@available(iOS 13.0, *)) {
|
||||
_statusIcon.image = [UIImage systemImageNamed:@"wifi"];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_hostIconView.tintColor = [UIColor whiteColor];
|
||||
|
||||
|
||||
|
||||
if(host.pairState == PairStatePaired){
|
||||
_iconBackgroundView.backgroundColor = defaultBlue;
|
||||
lockIconView.hidden = YES;
|
||||
[_leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Applications"] forState:UIControlStateNormal];
|
||||
[_rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Launch"] forState:UIControlStateNormal];
|
||||
[_leftButton setEnabled:YES];
|
||||
[_rightButton setEnabled:YES];
|
||||
_leftButton.hidden = NO;
|
||||
_rightButton.hidden = NO;
|
||||
_pairButton.hidden = YES;
|
||||
|
||||
[_leftButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.rightButton.frame.size.height/4*_sizeFactor];
|
||||
[self.rightButton setImage:[UIImage systemImageNamed:@"play.fill" withConfiguration:config] forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_rightButton.backgroundColor = defaultBlue;
|
||||
[_rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // theme
|
||||
}
|
||||
else {
|
||||
_iconBackgroundView.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
lockIconView.hidden = NO;
|
||||
[_leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Applications"] forState:UIControlStateNormal];
|
||||
[_rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Launch"] forState:UIControlStateNormal];
|
||||
[_leftButton setEnabled:YES];
|
||||
[_rightButton setEnabled:YES];
|
||||
_leftButton.hidden = YES;
|
||||
_rightButton.hidden = YES;
|
||||
_pairButton.hidden = NO;
|
||||
|
||||
|
||||
|
||||
[_leftButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.rightButton.frame.size.height/4*_sizeFactor];
|
||||
[self.rightButton setImage:[UIImage systemImageNamed:@"play.fill" withConfiguration:config] forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_rightButton.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
[_rightButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // theme
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case StateOffline:
|
||||
[_hostSpinner stopAnimating];
|
||||
// _iconBackgroundView.backgroundColor = _userIterfaceStyle == UIUserInterfaceStyleDark ? [UIColor appBackgroundColorDark] : [UIColor appBackgroundColorLight];
|
||||
_iconBackgroundView.backgroundColor = _userIterfaceStyle == UIUserInterfaceStyleDark ? [UIColor appBackgroundColorDark] : [UIColor appBackgroundColorLight];
|
||||
_statusLabel.textColor = [UIColor textColorGray];
|
||||
_statusLabel.text = @"Offline";
|
||||
_statusIcon.tintColor = [UIColor textColorGray];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
_statusIcon.image = [UIImage systemImageNamed:@"exclamationmark.triangle.fill"];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_hostIconView.tintColor = [UIColor lowProfileGray];
|
||||
lockIconView.hidden = YES;
|
||||
[_leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Test network"] forState:UIControlStateNormal];
|
||||
[_rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Wakeup"] forState:UIControlStateNormal];
|
||||
[_leftButton setEnabled:YES];
|
||||
[_rightButton setEnabled:YES];
|
||||
_leftButton.hidden = NO;
|
||||
_rightButton.hidden = NO;
|
||||
_pairButton.hidden = YES;
|
||||
|
||||
|
||||
[_leftButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.rightButton.frame.size.height/3.5*_sizeFactor weight:UIImageSymbolWeightBold];
|
||||
UIImage *templateImage = [UIImage systemImageNamed:@"power" withConfiguration:config];
|
||||
UIImage *coloredImage = [templateImage imageWithTintColor:defaultBlue renderingMode:UIImageRenderingModeAlwaysOriginal];
|
||||
[self.rightButton setImage:coloredImage forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_rightButton.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
[_rightButton setTitleColor:defaultBlue forState:UIControlStateNormal]; // theme
|
||||
|
||||
break;
|
||||
case StateUnknown:
|
||||
_hostSpinner.color = [UIColor whiteColor];
|
||||
[_hostSpinner startAnimating];
|
||||
// _iconBackgroundView.backgroundColor = _userIterfaceStyle == UIUserInterfaceStyleDark ? [UIColor appBackgroundColorDark] : [UIColor appBackgroundColorLight];
|
||||
_iconBackgroundView.backgroundColor = [UIColor appPrimaryColorWithAlpha];
|
||||
_statusLabel.textColor = [UIColor textColorGray];
|
||||
_statusLabel.text = @"Detecting...";
|
||||
_statusIcon.tintColor = [UIColor textColorGray];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
_statusIcon.image = [UIImage systemImageNamed:@"antenna.radiowaves.left.and.right"];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
// _hostIconView.tintColor = [UIColor lowProfileGray];
|
||||
_hostIconView.tintColor = defaultBlue;
|
||||
lockIconView.hidden = YES;
|
||||
[_leftButton setTitle:[LocalizationHelper localizedStringForKey:@"Test network"] forState:UIControlStateNormal];
|
||||
[_rightButton setTitle:[LocalizationHelper localizedStringForKey:@" Wakeup"] forState:UIControlStateNormal];
|
||||
[_leftButton setEnabled:NO];
|
||||
[_rightButton setEnabled:NO];
|
||||
_leftButton.hidden = NO;
|
||||
_rightButton.hidden = NO;
|
||||
_pairButton.hidden = YES;
|
||||
|
||||
|
||||
[_leftButton setTitleColor:[UIColor textColorGray] forState:UIControlStateNormal]; // theme
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:self.rightButton.frame.size.height/3.5*_sizeFactor weight:UIImageSymbolWeightBold];
|
||||
UIImage *templateImage = [UIImage systemImageNamed:@"power" withConfiguration:config];
|
||||
UIImage *coloredImage = [templateImage imageWithTintColor:[UIColor textColorGray] renderingMode:UIImageRenderingModeAlwaysOriginal];
|
||||
[self.rightButton setImage:coloredImage forState:UIControlStateNormal];
|
||||
} else {
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
_rightButton.backgroundColor = [[UIColor textColorGray] colorWithAlphaComponent:0.2];
|
||||
[_rightButton setTitleColor:[UIColor textColorGray] forState:UIControlStateNormal]; // theme
|
||||
|
||||
|
||||
break;
|
||||
default:break;
|
||||
}
|
||||
|
||||
/*
|
||||
if (host.state == StateOnline) {
|
||||
[_hostSpinner stopAnimating];
|
||||
|
||||
lockIconView.hidden = ! (host.pairState == PairStateUnpaired);
|
||||
|
||||
|
||||
if (host.pairState == PairStateUnpaired) {
|
||||
|
||||
}
|
||||
else {
|
||||
}
|
||||
|
||||
}
|
||||
else if (host.state == StateOffline) {
|
||||
[_hostSpinner stopAnimating];
|
||||
}
|
||||
else {
|
||||
[_hostSpinner startAnimating];
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// MenuSectionView.h
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 5/18/25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
|
||||
// MenuSectionView.h
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface MenuSectionView : UIView
|
||||
|
||||
// 外部可访问属性
|
||||
@property (nonatomic, assign) CGFloat leadingTrailingPadding;
|
||||
@property (nonatomic, assign) CGFloat separatorLinePadding;
|
||||
@property (nonatomic, copy) NSString *sectionTitle;
|
||||
@property (nonatomic, assign) BOOL expanded;
|
||||
@property (nonatomic, strong) UIColor *backgroundColor;
|
||||
@property (nonatomic, assign) CGFloat rootStackViewSpacing;
|
||||
@property (nonatomic, assign) CGFloat headerViewHeight;
|
||||
@property (nonatomic, assign) CGFloat headerViewVerticalSpacing;
|
||||
@property (nonatomic, strong) NSMutableArray<UIStackView *> *subStackViews;
|
||||
|
||||
// 方法
|
||||
- (void)setSectionIcon:(UIImage *)icon;
|
||||
- (void)addSubStackView:(UIStackView *)stackView;
|
||||
- (void)addToParentStack:(UIStackView *)parentStack;
|
||||
- (void)removeSubStackView:(UIStackView *)stackView;
|
||||
- (void)updateLayout;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,324 @@
|
||||
//
|
||||
// MenuSectionView.h
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 5/18/25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
// MenuSectionView.m
|
||||
|
||||
#import "MenuSectionView.h"
|
||||
|
||||
@interface MenuSectionView ()
|
||||
|
||||
@property (nonatomic, strong) UIStackView *rootStackView;
|
||||
@property (nonatomic, strong) UILabel *titleLabel;
|
||||
@property (nonatomic, strong) UIImageView *iconImageView;
|
||||
@property (nonatomic, strong) UIButton *toggleButton;
|
||||
@property (nonatomic, strong) UIButton *toggleArea;
|
||||
@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
|
||||
@property (nonatomic, strong) UIView *headerView;
|
||||
@property (nonatomic, strong) UIView *separatorLine;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@implementation MenuSectionView
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame {
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
[self commonInit];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)coder {
|
||||
self = [super initWithCoder:coder];
|
||||
if (self) {
|
||||
[self commonInit];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)commonInit {
|
||||
// 默认值
|
||||
_leadingTrailingPadding = 0;
|
||||
_separatorLinePadding = 26;
|
||||
_sectionTitle = @"Section";
|
||||
_expanded = YES;
|
||||
_backgroundColor = [UIColor clearColor];
|
||||
_rootStackViewSpacing = 8.0;
|
||||
_subStackViews = [NSMutableArray array];
|
||||
_headerViewHeight = 37;
|
||||
_headerViewVerticalSpacing = 26;
|
||||
|
||||
// 设置视图
|
||||
self.layer.cornerRadius = 10.0;
|
||||
self.layer.masksToBounds = YES;
|
||||
self.backgroundColor = _backgroundColor;
|
||||
|
||||
// 头部视图(包含图标和标题)
|
||||
_headerView = [[UIView alloc] init];
|
||||
_headerView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[self addSubview:_headerView];
|
||||
|
||||
// 图标视图
|
||||
_iconImageView = [[UIImageView alloc] init];
|
||||
_iconImageView.contentMode = UIViewContentModeScaleAspectFit;
|
||||
_iconImageView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
_iconImageView.tintColor = [UIColor whiteColor];
|
||||
[_headerView addSubview:_iconImageView];
|
||||
|
||||
// 标题标签
|
||||
_titleLabel = [[UILabel alloc] init];
|
||||
_titleLabel.text = _sectionTitle;
|
||||
_titleLabel.font = [UIFont systemFontOfSize:27 weight:UIFontWeightMedium];
|
||||
_titleLabel.textAlignment = NSTextAlignmentLeft;
|
||||
_titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[_headerView addSubview:_titleLabel];
|
||||
|
||||
// 切换按钮
|
||||
_toggleButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
_toggleArea = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
UIImageSymbolConfiguration *config = [UIImageSymbolConfiguration configurationWithPointSize:_headerViewHeight*0.31 weight:UIImageSymbolWeightMedium];
|
||||
[_toggleButton setImage:[UIImage systemImageNamed:@"chevron.left" withConfiguration:config] forState:UIControlStateNormal];
|
||||
} else {
|
||||
[_toggleButton setTitle:@"<" forState:UIControlStateNormal];
|
||||
}
|
||||
[_toggleButton addTarget:self action:@selector(toggleFold) forControlEvents:UIControlEventTouchUpInside];
|
||||
[_toggleArea addTarget:self action:@selector(toggleFold) forControlEvents:UIControlEventTouchUpInside];
|
||||
_toggleButton.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
_toggleArea.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
_toggleButton.contentEdgeInsets = UIEdgeInsetsMake(-10,-10,-10,-10); // 上下左右各扩展 20pt
|
||||
[_headerView addSubview:_toggleButton];
|
||||
[_headerView addSubview:_toggleArea];
|
||||
|
||||
// 根stackView
|
||||
_rootStackView = [[UIStackView alloc] init];
|
||||
_rootStackView.axis = UILayoutConstraintAxisVertical;
|
||||
_rootStackView.spacing = _rootStackViewSpacing;
|
||||
_rootStackView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
|
||||
[self addSubview:_rootStackView];
|
||||
|
||||
// 分隔线
|
||||
_separatorLine = [[UIView alloc] init];
|
||||
_separatorLine.backgroundColor = [UIColor colorWithWhite:0.2 alpha:5.0];
|
||||
_separatorLine.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
|
||||
[self addSubview:_separatorLine];
|
||||
|
||||
// 高度约束
|
||||
_heightConstraint = [self.heightAnchor constraintEqualToConstant:44];
|
||||
_heightConstraint.active = YES;
|
||||
|
||||
// 布局
|
||||
[self setupConstraints];
|
||||
[self updateViewForFoldState];
|
||||
}
|
||||
|
||||
- (void)setupConstraints {
|
||||
// 头部视图约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_headerView.topAnchor constraintEqualToAnchor:self.topAnchor],
|
||||
[_headerView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
|
||||
[_headerView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor],
|
||||
[_headerView.heightAnchor constraintEqualToConstant:_headerViewHeight]
|
||||
]];
|
||||
|
||||
// 图标约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_iconImageView.leadingAnchor constraintEqualToAnchor:_headerView.leadingAnchor constant:_leadingTrailingPadding],
|
||||
[_iconImageView.centerYAnchor constraintEqualToAnchor:_headerView.centerYAnchor],
|
||||
// [_iconImageView.topAnchor constraintEqualToAnchor:_headerView.topAnchor],
|
||||
[_iconImageView.widthAnchor constraintEqualToConstant:_headerViewHeight],
|
||||
[_iconImageView.heightAnchor constraintEqualToConstant:_headerViewHeight]
|
||||
]];
|
||||
|
||||
// 标题约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_titleLabel.leadingAnchor constraintEqualToAnchor:_iconImageView.trailingAnchor constant:8],
|
||||
[_titleLabel.centerYAnchor constraintEqualToAnchor:_headerView.centerYAnchor],
|
||||
[_titleLabel.trailingAnchor constraintEqualToAnchor:_toggleButton.leadingAnchor constant:-8]
|
||||
]];
|
||||
|
||||
// 切换按钮约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_toggleButton.trailingAnchor constraintEqualToAnchor:_headerView.trailingAnchor constant:-_leadingTrailingPadding],
|
||||
[_toggleButton.centerYAnchor constraintEqualToAnchor:_headerView.centerYAnchor],
|
||||
[_toggleButton.widthAnchor constraintEqualToConstant:_headerViewHeight*0.8],
|
||||
[_toggleButton.heightAnchor constraintEqualToConstant:_headerViewHeight*0.8]
|
||||
]];
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_toggleArea.leadingAnchor constraintEqualToAnchor:_headerView.leadingAnchor],
|
||||
[_toggleArea.centerYAnchor constraintEqualToAnchor:_headerView.centerYAnchor],
|
||||
[_toggleArea.trailingAnchor constraintEqualToAnchor:_toggleButton.leadingAnchor],
|
||||
//[_toggleArea.widthAnchor constraintEqualToConstant:_headerViewHeight],
|
||||
[_toggleArea.heightAnchor constraintEqualToConstant:_headerViewHeight]
|
||||
]];
|
||||
|
||||
[self layoutIfNeeded];
|
||||
|
||||
// 根stackView约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_rootStackView.topAnchor constraintEqualToAnchor:self.topAnchor constant:_headerViewHeight+_headerViewVerticalSpacing],
|
||||
[_rootStackView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:_leadingTrailingPadding],
|
||||
[_rootStackView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:-_leadingTrailingPadding],
|
||||
[_rootStackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:-1] // 为分隔线留出空间
|
||||
]];
|
||||
|
||||
// 分隔线约束
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[_separatorLine.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
|
||||
[_separatorLine.trailingAnchor constraintEqualToAnchor:self.trailingAnchor],
|
||||
[_separatorLine.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
|
||||
[_separatorLine.heightAnchor constraintEqualToConstant:1.0]
|
||||
]];
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.headerView.topAnchor constraintEqualToAnchor:self.topAnchor constant:0],
|
||||
[self.rootStackView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:0],
|
||||
]];
|
||||
}
|
||||
|
||||
#pragma mark - Public Methods
|
||||
|
||||
- (void)setSectionIcon:(UIImage *)icon {
|
||||
_iconImageView.image = icon;
|
||||
_iconImageView.hidden = (icon == nil);
|
||||
[self updateLayout];
|
||||
}
|
||||
|
||||
- (void)setLeadingTrailingPadding:(CGFloat)leadingTrailingPadding {
|
||||
_leadingTrailingPadding = leadingTrailingPadding;
|
||||
[self updateLayout];
|
||||
}
|
||||
|
||||
- (void)setSectionTitle:(NSString *)sectionTitle {
|
||||
_sectionTitle = sectionTitle;
|
||||
_titleLabel.text = sectionTitle;
|
||||
}
|
||||
|
||||
- (void)setExpanded:(BOOL)isExpanded {
|
||||
if (_expanded != isExpanded) {
|
||||
_expanded = isExpanded;}
|
||||
[self updateViewForFoldState];
|
||||
}
|
||||
|
||||
- (void)setBackgroundColor:(UIColor *)backgroundColor {
|
||||
[super setBackgroundColor:backgroundColor];
|
||||
_backgroundColor = backgroundColor;
|
||||
}
|
||||
|
||||
- (void)setRootStackViewSpacing:(CGFloat)rootStackViewSpacing {
|
||||
_rootStackViewSpacing = rootStackViewSpacing;
|
||||
_rootStackView.spacing = rootStackViewSpacing;
|
||||
[self updateLayout];
|
||||
}
|
||||
|
||||
- (void)addSubStackView:(UIStackView *)stackView {
|
||||
[CATransaction begin];
|
||||
[CATransaction setDisableActions:YES];
|
||||
if (![_subStackViews containsObject:stackView]) {
|
||||
[_subStackViews addObject:stackView];
|
||||
[_rootStackView addArrangedSubview:stackView];
|
||||
[_rootStackView layoutIfNeeded];
|
||||
[self updateLayout];
|
||||
}
|
||||
[CATransaction commit];
|
||||
// NSLog(@"rootStack height2: %f", _rootStackView.frame.size.height);
|
||||
}
|
||||
|
||||
- (void)addToParentStack:(UIStackView *)parentStack {
|
||||
[parentStack addArrangedSubview:self];
|
||||
self.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.leadingAnchor constraintEqualToAnchor:parentStack.leadingAnchor constant:0],
|
||||
[self.trailingAnchor constraintEqualToAnchor:parentStack.trailingAnchor constant:0],
|
||||
]];
|
||||
}
|
||||
|
||||
- (void)removeSubStackView:(UIStackView *)stackView {
|
||||
[CATransaction begin];
|
||||
[CATransaction setDisableActions:YES];
|
||||
if ([_subStackViews containsObject:stackView]) {
|
||||
[_subStackViews removeObject:stackView];
|
||||
[_rootStackView removeArrangedSubview:stackView];
|
||||
[stackView removeFromSuperview];
|
||||
[self updateLayout];
|
||||
}
|
||||
[CATransaction commit];
|
||||
}
|
||||
|
||||
|
||||
- (void)updateLayout {
|
||||
// 更新边距约束
|
||||
for (NSLayoutConstraint *constraint in self.constraints) {
|
||||
if (constraint.firstItem == _rootStackView && constraint.firstAttribute == NSLayoutAttributeLeading) {
|
||||
constraint.constant = _leadingTrailingPadding;
|
||||
} else if (constraint.firstItem == _rootStackView && constraint.firstAttribute == NSLayoutAttributeTrailing) {
|
||||
constraint.constant = -_leadingTrailingPadding;
|
||||
}
|
||||
}
|
||||
|
||||
for (NSLayoutConstraint *constraint in _headerView.constraints) {
|
||||
if (constraint.firstItem == _iconImageView && constraint.firstAttribute == NSLayoutAttributeLeading) {
|
||||
constraint.constant = _leadingTrailingPadding;
|
||||
} else if (constraint.firstItem == _toggleButton && constraint.firstAttribute == NSLayoutAttributeTrailing) {
|
||||
constraint.constant = -_leadingTrailingPadding;
|
||||
}
|
||||
}
|
||||
|
||||
[self setNeedsLayout];
|
||||
[self layoutIfNeeded];
|
||||
}
|
||||
|
||||
#pragma mark - Private Methods
|
||||
|
||||
- (void)toggleFold {
|
||||
self.expanded = !self.expanded;
|
||||
[self updateViewForFoldState];
|
||||
}
|
||||
|
||||
- (void)updateViewForFoldState {
|
||||
[self setupConstraints];
|
||||
if (_expanded) {
|
||||
_rootStackView.hidden = NO;
|
||||
_separatorLine.hidden = NO;
|
||||
CGSize fittingSize = [self.rootStackView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
|
||||
CGFloat rootStackViewHeight = fittingSize.height;
|
||||
fittingSize = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
|
||||
CGFloat headerHeight = fittingSize.height;
|
||||
|
||||
self.heightConstraint.constant = headerHeight + _headerViewVerticalSpacing + rootStackViewHeight + _separatorLinePadding + 1;
|
||||
|
||||
[UIView animateWithDuration:0 animations:^{
|
||||
self.toggleButton.transform = CGAffineTransformMakeRotation(M_PI+M_PI_2);
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.rootStackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor constant:-self.separatorLinePadding],
|
||||
// [self.rootStackView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:0],
|
||||
]];
|
||||
[self layoutIfNeeded];
|
||||
}];
|
||||
} else {
|
||||
// 折叠状态
|
||||
CGSize fittingSize = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
|
||||
_rootStackView.hidden = YES;
|
||||
_separatorLine.hidden = NO;
|
||||
_heightConstraint.constant = fittingSize.height + _headerViewVerticalSpacing;
|
||||
// [self updateLayout];
|
||||
[UIView animateWithDuration:0 animations:^{
|
||||
self.toggleButton.transform = CGAffineTransformIdentity;
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[self.headerView.topAnchor constraintEqualToAnchor:self.topAnchor constant:0],
|
||||
// [self.rootStackView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:0],
|
||||
]];
|
||||
[self layoutIfNeeded];
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// UIColor+Theme.h
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 2025.5.25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface UIColor (Theme)
|
||||
|
||||
+ (UIColor *)appPrimaryColor;
|
||||
+ (UIColor *)appSecondaryColor;
|
||||
+ (UIColor *)appPrimaryColorWithAlpha;
|
||||
+ (UIColor *)widgetBackgroundColorDark;
|
||||
+ (UIColor *)widgetBackgroundColorLight;
|
||||
+ (UIColor *)separatorColorDark;
|
||||
+ (UIColor *)separatorColorLight;
|
||||
+ (UIColor *)textColorDark;
|
||||
+ (UIColor *)textColorLight;
|
||||
+ (UIColor *)appBackgroundColorDark;
|
||||
+ (UIColor *)appBackgroundColorLight;
|
||||
+ (UIColor *)textColorGray;
|
||||
+ (UIColor *)lowProfileGray;
|
||||
|
||||
@end
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
//
|
||||
// UIColor+Theme.h
|
||||
// Moonlight-ZWM
|
||||
//
|
||||
// Created by True砖家 on 2025.5.25.
|
||||
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
|
||||
//
|
||||
|
||||
#import "UIColor+Theme.h"
|
||||
|
||||
@implementation UIColor (Theme)
|
||||
|
||||
+ (UIColor *)appPrimaryColor {
|
||||
return [UIColor colorWithRed:0.0 green:0.48 blue:1.0 alpha:1.0]; // #0A84FF
|
||||
}
|
||||
|
||||
+ (UIColor *)appSecondaryColor {
|
||||
return [UIColor colorWithRed:0.0 green:0.48 blue:1.0 alpha:1.0]; // 可换其他常用色
|
||||
}
|
||||
|
||||
+ (UIColor *)appPrimaryColorWithAlpha {
|
||||
return [[UIColor appPrimaryColor] colorWithAlphaComponent:0.24]; // #0A84FF
|
||||
}
|
||||
|
||||
|
||||
+ (UIColor *)widgetBackgroundColorDark{
|
||||
return [UIColor colorWithRed:44.0/255.0 green:44.0/255.0 blue:46.0/255.0 alpha:1.0];
|
||||
}
|
||||
|
||||
+ (UIColor *)widgetBackgroundColorLight{
|
||||
return [UIColor colorWithRed:242.0/255.0 green:242.0/255.0 blue:247.0/255.0 alpha:1.0];
|
||||
}
|
||||
|
||||
+ (UIColor *)separatorColorDark{
|
||||
return [UIColor colorWithWhite:0.28 alpha:1.0];
|
||||
}
|
||||
|
||||
+ (UIColor *)separatorColorLight{
|
||||
return [UIColor colorWithWhite:0.1 alpha:0.28];
|
||||
}
|
||||
|
||||
+ (UIColor *)textColorDark{
|
||||
return [UIColor whiteColor];
|
||||
}
|
||||
|
||||
+ (UIColor *)textColorLight{
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
|
||||
+ (UIColor *)textColorGray{
|
||||
return [UIColor colorWithRed:0.55 green:0.55 blue:0.6 alpha:0.95];
|
||||
}
|
||||
|
||||
+ (UIColor *)lowProfileGray{
|
||||
return [UIColor colorWithRed:0.65 green:0.65 blue:0.65 alpha:0.4];
|
||||
}
|
||||
|
||||
+ (UIColor *)appBackgroundColorDark {
|
||||
return [UIColor colorWithRed:28.0/255.0 green:28.0/255.0 blue:30.0/255.0 alpha:1.0];
|
||||
}
|
||||
|
||||
+ (UIColor *)appBackgroundColorLight {
|
||||
return [UIColor whiteColor];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -32,6 +32,8 @@
|
||||
#import "LocalizationHelper.h"
|
||||
#import "CustomEdgeSlideGestureRecognizer.h"
|
||||
#import "DataManager.h"
|
||||
#import "HostCardView.h"
|
||||
#import "UIColor+Theme.h"
|
||||
#import "Moonlight-Swift.h" // not used yet.
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
@@ -314,7 +316,7 @@ static NSMutableSet* hostList;
|
||||
[self updateTitle];
|
||||
[self disableUpButton];
|
||||
[self.collectionView removeFromSuperview]; // necessary for new scroll host view reloading mechanism
|
||||
[self.view setBackgroundColor:[UIColor darkGrayColor]];
|
||||
|
||||
[self reloadScrollHostView]; // host view must be reloaded here
|
||||
}
|
||||
|
||||
@@ -972,16 +974,27 @@ static NSMutableSet* hostList;
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
[settingsViewController.resolutionSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.resolutionStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.framerateSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.fpsStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController widget:settingsViewController.bitrateSlider setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.bitrateStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.optimizeSettingsSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.optimizeSettingsStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.audioOnPCSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.audioOnPcStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.codecSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.codecStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.yuv444Selector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.yuv444Stack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.hdrSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.HdrStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.framePacingSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.framepacingStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.btMouseSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.citrixX1MouseStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.externalDisplayModeSelector setEnabled:!self.settingsExpandedInStreamView];
|
||||
settingsViewController.externalDisplayModeStack.hidden = self.settingsExpandedInStreamView;
|
||||
[settingsViewController.backToStreamingButton setEnabled:self.settingsExpandedInStreamView]; // will be deprecated soon
|
||||
// [settingsViewController.unlockDisplayOrientationSelector setEnabled:!self.settingsExpandedInStreamView && [self isFullScreenRequired]];//need "requires fullscreen" enabled in the app bunddle to make runtime orientation limitation woring
|
||||
}
|
||||
@@ -1116,10 +1129,10 @@ static NSMutableSet* hostList;
|
||||
// return isPortrait;
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
- (void)viewDidLoad{
|
||||
[super viewDidLoad];
|
||||
//[OrientationHelper updateOrientationToLandscape];
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
self.settingsExpandedInStreamView = false; // init this flag
|
||||
self.revealViewController.isStreaming = false; //init this flag for rvlVC
|
||||
@@ -1216,6 +1229,10 @@ static NSMutableSet* hostList;
|
||||
[self.view addSubview:hostScrollView];
|
||||
|
||||
if ([hostList count] == 1) [self hostClicked:[hostList anyObject] view:nil]; // auto click for single host
|
||||
|
||||
|
||||
|
||||
|
||||
//if([SettingsViewController isLandscapeNow] != _streamConfig.width > _streamConfig.height)
|
||||
//[self simulateSettingsButtonPress]; //force expand setting view if orientation changed since last quit from app.
|
||||
//[self simulateSettingsButtonPress]; //force expand setting view if orientation changed since last quit from app.
|
||||
@@ -1225,8 +1242,7 @@ static NSMutableSet* hostList;
|
||||
// [settingsViewController updateResolutionTable];
|
||||
}
|
||||
|
||||
-(void)handleRealOrientationChange{
|
||||
|
||||
-(void)viewDidLayoutSubviews{
|
||||
}
|
||||
|
||||
-(void)reloadScrollHostView{
|
||||
@@ -1418,6 +1434,7 @@ static NSMutableSet* hostList;
|
||||
- (void)viewDidAppear:(BOOL)animated
|
||||
{
|
||||
[super viewDidAppear:NO];
|
||||
[self reloadScrollHostView];
|
||||
[self attachWaterMark];
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
@@ -1462,6 +1479,13 @@ static NSMutableSet* hostList;
|
||||
- (void)viewWillAppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
/* this makes background color works*/
|
||||
for (UIView *subview in self.view.subviews) {
|
||||
[subview removeFromSuperview]; // 暂时移除所有子视图
|
||||
}
|
||||
|
||||
self.view.backgroundColor = [UIColor appBackgroundColorDark]; //theme test
|
||||
|
||||
// We can get here on home press while streaming
|
||||
// since the stream view segues to us just before
|
||||
@@ -1568,7 +1592,25 @@ static NSMutableSet* hostList;
|
||||
// Sort the host list in alphabetical order
|
||||
NSArray* sortedHostList = [[hostList allObjects] sortedArrayUsingSelector:@selector(compareName:)];
|
||||
for (TemporaryHost* comp in sortedHostList) {
|
||||
compView = [[UIComputerView alloc] initWithComputer:comp andCallback:self];
|
||||
compView = [[UIComputerView alloc] initWithComputer:comp andCallback:self]; // host view created here
|
||||
|
||||
// new host card test
|
||||
// if([comp.name isEqualToString: @"ASRockPC"]) {
|
||||
if([comp.name isEqualToString: @"PianoServer"]) {
|
||||
//if([comp.name isEqualToString: @"TrueZj"]) {
|
||||
HostCardView *testCard = [[HostCardView alloc] initWithHost:comp];
|
||||
|
||||
[self.view addSubview:testCard];
|
||||
// [testCard resizeBySizeFactor:3];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[testCard.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor constant:0],
|
||||
[testCard.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor constant:150],
|
||||
]];
|
||||
|
||||
}
|
||||
//
|
||||
|
||||
|
||||
compView.center = CGPointMake([self getCompViewX:compView addComp:addComp prevEdge:prevEdge], hostScrollView.frame.size.height / 2);
|
||||
prevEdge = compView.frame.origin.x + compView.frame.size.width;
|
||||
[hostScrollView addSubview:compView];
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#import "SettingsViewController.h"
|
||||
#import "TemporarySettings.h"
|
||||
#import "DataManager.h"
|
||||
#import "MenuSectionView.h"
|
||||
|
||||
#import <UIKit/UIGestureRecognizerSubclass.h>
|
||||
#import <VideoToolbox/VideoToolbox.h>
|
||||
@@ -340,6 +341,51 @@ BOOL isCustomResolution(CGSize res) {
|
||||
return [self isIPhone] ? UINavigationBarHeightIPhone : UINavigationBarHeightIPad;
|
||||
}
|
||||
|
||||
|
||||
- (void)initParentStack{
|
||||
self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
|
||||
// 可选:确保 scrollView 开启垂直滚动
|
||||
self.scrollView.alwaysBounceVertical = YES;
|
||||
parentStack = [[UIStackView alloc] init];
|
||||
parentStack.axis = UILayoutConstraintAxisVertical;
|
||||
parentStack.spacing = 0;
|
||||
parentStack.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[self.scrollView addSubview:parentStack];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[parentStack.topAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.topAnchor constant: [self getStandardNavBarHeight] + 13],
|
||||
[parentStack.bottomAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.bottomAnchor constant:-20],
|
||||
[parentStack.leadingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.leadingAnchor constant: 14],
|
||||
[parentStack.trailingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.trailingAnchor constant: -15],
|
||||
[parentStack.widthAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.widthAnchor]
|
||||
]];
|
||||
}
|
||||
|
||||
- (void)layoutSections{
|
||||
MenuSectionView *videoSection = [[MenuSectionView alloc] init];
|
||||
videoSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Video"];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
[videoSection setSectionIcon:[UIImage systemImageNamed:@"airplayvideo"]];
|
||||
} else [videoSection setSectionIcon:nil];
|
||||
[videoSection addSubStackView:_resolutionStack];
|
||||
[videoSection addSubStackView:_fpsStack];
|
||||
[videoSection addSubStackView:_codecStack];
|
||||
[videoSection addToParentStack:parentStack];
|
||||
[videoSection setExpanded:YES];
|
||||
|
||||
MenuSectionView *gesturesSection = [[MenuSectionView alloc] init];
|
||||
gesturesSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Gestures"];
|
||||
if (@available(iOS 13.0, *)) {
|
||||
[gesturesSection setSectionIcon:[UIImage systemImageNamed:@"hand.draw"]];
|
||||
} else [gesturesSection setSectionIcon:nil];
|
||||
[gesturesSection addSubStackView:_keyboardToggleFingerNumStack];
|
||||
[gesturesSection addSubStackView:_slideToSettingsScreenEdgeStack];
|
||||
[gesturesSection addSubStackView:_slideToCmdToolScreenEdgeStack];
|
||||
[gesturesSection addSubStackView:_slideToSettingsDistanceStack];
|
||||
[gesturesSection addToParentStack:parentStack];
|
||||
[gesturesSection setExpanded:YES];
|
||||
}
|
||||
|
||||
|
||||
- (void)layoutWidgetes {
|
||||
|
||||
// [self.view addSubview:self.navigationBar];
|
||||
@@ -349,60 +395,65 @@ BOOL isCustomResolution(CGSize res) {
|
||||
// 可选:确保 scrollView 开启垂直滚动
|
||||
self.scrollView.alwaysBounceVertical = YES;
|
||||
|
||||
parentStack = [[UIStackView alloc] init];
|
||||
parentStack.axis = UILayoutConstraintAxisVertical;
|
||||
parentStack.spacing = 13;
|
||||
parentStack.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[self.scrollView addSubview:parentStack];
|
||||
UIStackView* parentStackTmp = [[UIStackView alloc] init];
|
||||
parentStackTmp.axis = UILayoutConstraintAxisVertical;
|
||||
parentStackTmp.spacing = 13;
|
||||
parentStackTmp.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[self.scrollView addSubview:parentStackTmp];
|
||||
[NSLayoutConstraint activateConstraints:@[
|
||||
[parentStack.topAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.topAnchor constant: [self getStandardNavBarHeight] + 20],
|
||||
[parentStack.bottomAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.bottomAnchor constant:-20],
|
||||
[parentStack.leadingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.leadingAnchor constant: 14],
|
||||
[parentStack.trailingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.trailingAnchor constant: -15],
|
||||
[parentStack.widthAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.widthAnchor]
|
||||
[parentStackTmp.topAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.topAnchor constant: [self getStandardNavBarHeight] + 300],
|
||||
[parentStackTmp.bottomAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.bottomAnchor constant:-20],
|
||||
[parentStackTmp.leadingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.leadingAnchor constant: 14],
|
||||
[parentStackTmp.trailingAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.trailingAnchor constant: -15],
|
||||
[parentStackTmp.widthAnchor constraintEqualToAnchor:self.scrollView.contentLayoutGuide.widthAnchor]
|
||||
]];
|
||||
|
||||
[parentStack addArrangedSubview:self.resolutionStack];
|
||||
|
||||
[parentStackTmp addArrangedSubview:self.resolutionStack];
|
||||
// self.resolutionStack.hidden = YES;
|
||||
[parentStack addArrangedSubview:self.fpsStack];
|
||||
[parentStackTmp addArrangedSubview:self.fpsStack];
|
||||
// self.fpsStack.hidden = YES;
|
||||
[parentStack addArrangedSubview:self.bitrateStack];
|
||||
[parentStackTmp addArrangedSubview:self.bitrateStack];
|
||||
// self.bitrateStack.hidden = YES;
|
||||
[parentStack addArrangedSubview:self.touchModeStack];
|
||||
[parentStack addArrangedSubview:self.asyncTouchStack];
|
||||
[parentStack addArrangedSubview:self.pointerVelocityDividerStack];
|
||||
[parentStack addArrangedSubview:self.pointerVelocityFactorStack];
|
||||
[parentStack addArrangedSubview:self.touchMoveEventIntervalStack];
|
||||
[parentStack addArrangedSubview:self.mousePointerVelocityStack];
|
||||
[parentStack addArrangedSubview:self.onScreenWidgetStack];
|
||||
[parentStack addArrangedSubview:self.keyboardToggleFingerNumStack];
|
||||
[parentStack addArrangedSubview:self.liftStreamViewForKeyboardStack];
|
||||
[parentStack addArrangedSubview:self.showKeyboardToolbarStack];
|
||||
[parentStack addArrangedSubview:self.slideToSettingsScreenEdgeStack];
|
||||
[parentStack addArrangedSubview:self.slideToCmdToolScreenEdgeStack];
|
||||
[parentStack addArrangedSubview:self.slideToSettingsDistanceStack];
|
||||
[parentStack addArrangedSubview:self.optimizeSettingsStack];
|
||||
[parentStack addArrangedSubview:self.multiControllerStack];
|
||||
[parentStack addArrangedSubview:self.swapAbaxyStack];
|
||||
[parentStack addArrangedSubview:self.audioOnPcStack];
|
||||
[parentStack addArrangedSubview:self.codecStack];
|
||||
[parentStack addArrangedSubview:self.yuv444Stack];
|
||||
[parentStack addArrangedSubview:self.HdrStack];
|
||||
[parentStack addArrangedSubview:self.framepacingStack];
|
||||
[parentStack addArrangedSubview:self.reverseMouseWheelDirectionStack];
|
||||
[parentStack addArrangedSubview:self.citrixX1MouseStack];
|
||||
[parentStack addArrangedSubview:self.statsOverlayStack];
|
||||
[parentStack addArrangedSubview:self.unlockDisplayOrientationStack];
|
||||
[parentStack addArrangedSubview:self.externalDisplayModeStack];
|
||||
[parentStack addArrangedSubview:self.localMousePointerModeStack];
|
||||
[parentStackTmp addArrangedSubview:self.touchModeStack];
|
||||
[parentStackTmp addArrangedSubview:self.asyncTouchStack];
|
||||
[parentStackTmp addArrangedSubview:self.pointerVelocityDividerStack];
|
||||
[parentStackTmp addArrangedSubview:self.pointerVelocityFactorStack];
|
||||
[parentStackTmp addArrangedSubview:self.touchMoveEventIntervalStack];
|
||||
[parentStackTmp addArrangedSubview:self.mousePointerVelocityStack];
|
||||
[parentStackTmp addArrangedSubview:self.onScreenWidgetStack];
|
||||
[parentStackTmp addArrangedSubview:self.keyboardToggleFingerNumStack];
|
||||
[parentStackTmp addArrangedSubview:self.liftStreamViewForKeyboardStack];
|
||||
[parentStackTmp addArrangedSubview:self.showKeyboardToolbarStack];
|
||||
[parentStackTmp addArrangedSubview:self.slideToSettingsScreenEdgeStack];
|
||||
[parentStackTmp addArrangedSubview:self.slideToCmdToolScreenEdgeStack];
|
||||
[parentStackTmp addArrangedSubview:self.slideToSettingsDistanceStack];
|
||||
[parentStackTmp addArrangedSubview:self.optimizeSettingsStack];
|
||||
[parentStackTmp addArrangedSubview:self.multiControllerStack];
|
||||
[parentStackTmp addArrangedSubview:self.swapAbaxyStack];
|
||||
[parentStackTmp addArrangedSubview:self.audioOnPcStack];
|
||||
[parentStackTmp addArrangedSubview:self.codecStack];
|
||||
[parentStackTmp addArrangedSubview:self.yuv444Stack];
|
||||
[parentStackTmp addArrangedSubview:self.HdrStack];
|
||||
[parentStackTmp addArrangedSubview:self.framepacingStack];
|
||||
[parentStackTmp addArrangedSubview:self.reverseMouseWheelDirectionStack];
|
||||
[parentStackTmp addArrangedSubview:self.citrixX1MouseStack];
|
||||
[parentStackTmp addArrangedSubview:self.statsOverlayStack];
|
||||
[parentStackTmp addArrangedSubview:self.unlockDisplayOrientationStack];
|
||||
[parentStackTmp addArrangedSubview:self.externalDisplayModeStack];
|
||||
[parentStackTmp addArrangedSubview:self.localMousePointerModeStack];
|
||||
[parentStackTmp removeFromSuperview];
|
||||
}
|
||||
|
||||
|
||||
- (void)viewDidLoad {
|
||||
//[self pushDownExistingWidgets];
|
||||
//[self addExitButtonOnTop];
|
||||
|
||||
BOOL isIPad = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
|
||||
if(isIPad) [self layoutWidgetes]; // layout for ipad tmply
|
||||
if(isIPad) [self layoutWidgetes]; // layout for ipad tmply
|
||||
|
||||
[self initParentStack];
|
||||
[self layoutSections];
|
||||
|
||||
|
||||
|
||||
self->slideToCloseSettingsViewRecognizer = [[CustomEdgeSlideGestureRecognizer alloc] initWithTarget:self action:@selector(edgeSwiped)];
|
||||
slideToCloseSettingsViewRecognizer.edges = UIRectEdgeLeft;
|
||||
|
||||
@@ -20,3 +20,4 @@ int main(int argc, char * argv[])
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
840751B32BF49C050096B657 /* CustomTapGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 840751B22BF49C050096B657 /* CustomTapGestureRecognizer.m */; };
|
||||
84203F232C5F24C00032EEED /* OnScreenButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84203F222C5F24C00032EEED /* OnScreenButtonView.swift */; };
|
||||
841BAC922DE35D6B00DA639E /* UIColor+Theme.m in Sources */ = {isa = PBXBuildFile; fileRef = 841BAC912DE35D6B00DA639E /* UIColor+Theme.m */; };
|
||||
84203F232C5F24C00032EEED /* OnScreenWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84203F222C5F24C00032EEED /* OnScreenWidgetView.swift */; };
|
||||
84351B0E2C29ACCB00A77989 /* LayoutOnScreenControls.m in Sources */ = {isa = PBXBuildFile; fileRef = 84351B072C29ACCA00A77989 /* LayoutOnScreenControls.m */; };
|
||||
84351B0F2C29ACCB00A77989 /* OnScreenButtonState.m in Sources */ = {isa = PBXBuildFile; fileRef = 84351B092C29ACCA00A77989 /* OnScreenButtonState.m */; };
|
||||
84351B102C29ACCB00A77989 /* OSCProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 84351B0A2C29ACCA00A77989 /* OSCProfile.m */; };
|
||||
@@ -18,6 +19,7 @@
|
||||
84351B2D2C29AD6100A77989 /* ToolBarContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 84351B292C29AD6000A77989 /* ToolBarContainerView.m */; };
|
||||
84351B5C2C29ADBE00A77989 /* ProfileTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 84351B592C29ADBE00A77989 /* ProfileTableViewCell.m */; };
|
||||
84351B5D2C29ADBE00A77989 /* ProfileTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84351B5B2C29ADBE00A77989 /* ProfileTableViewCell.xib */; };
|
||||
843667F02D9D7173004A7D7F /* widgetTemplates.bin in Resources */ = {isa = PBXBuildFile; fileRef = 843667EF2D9D7173004A7D7F /* widgetTemplates.bin */; };
|
||||
843CC7F02C1E757D00BBC475 /* NativeTouchPointer.m in Sources */ = {isa = PBXBuildFile; fileRef = 843CC7EF2C1E757D00BBC475 /* NativeTouchPointer.m */; };
|
||||
843CC7F62C1E7A1700BBC475 /* NativeTouchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 843CC7F52C1E7A1700BBC475 /* NativeTouchHandler.m */; };
|
||||
843E93BE2C41528700B1651F /* OrientationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843E93BD2C41528700B1651F /* OrientationHelper.swift */; };
|
||||
@@ -25,6 +27,8 @@
|
||||
8454AC662C31907F00F0A302 /* iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8454AC682C31907F00F0A302 /* iPad.storyboard */; };
|
||||
8454AC6A2C319BDA00F0A302 /* iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8454AC6C2C319BDA00F0A302 /* iPhone.storyboard */; };
|
||||
84591A512BE1625E006AAB10 /* CustomEdgeSlideGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 84591A502BE1625E006AAB10 /* CustomEdgeSlideGestureRecognizer.m */; };
|
||||
847D2FDB2DDA015F00937A62 /* MenuSectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 847D2FDA2DDA015F00937A62 /* MenuSectionView.m */; };
|
||||
848F456A2DDCD12500581E36 /* HostCardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 848F45692DDCD12500581E36 /* HostCardView.m */; };
|
||||
84E1CDEC2C4F67D300547904 /* CommandManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E1CDEB2C4F67D300547904 /* CommandManager.swift */; };
|
||||
84E1CDEF2C4F688E00547904 /* CommandManagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E1CDEE2C4F688E00547904 /* CommandManagerViewController.swift */; };
|
||||
84E1CDFA2C4FE83400547904 /* SwiftLocalizationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E1CDF92C4FE83400547904 /* SwiftLocalizationHelper.swift */; };
|
||||
@@ -127,7 +131,9 @@
|
||||
693B3A9A218638CD00982F7B /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||
840751B12BF49B5A0096B657 /* CustomTapGestureRecognizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomTapGestureRecognizer.h; sourceTree = "<group>"; };
|
||||
840751B22BF49C050096B657 /* CustomTapGestureRecognizer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomTapGestureRecognizer.m; sourceTree = "<group>"; };
|
||||
84203F222C5F24C00032EEED /* OnScreenButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnScreenButtonView.swift; sourceTree = "<group>"; };
|
||||
841BAC8F2DE35BEC00DA639E /* UIColor+Theme.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIColor+Theme.h"; sourceTree = "<group>"; };
|
||||
841BAC912DE35D6B00DA639E /* UIColor+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Theme.m"; sourceTree = "<group>"; };
|
||||
84203F222C5F24C00032EEED /* OnScreenWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnScreenWidgetView.swift; sourceTree = "<group>"; };
|
||||
84351B062C29ACCA00A77989 /* OnScreenButtonState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnScreenButtonState.h; sourceTree = "<group>"; };
|
||||
84351B072C29ACCA00A77989 /* LayoutOnScreenControls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LayoutOnScreenControls.m; sourceTree = "<group>"; };
|
||||
84351B082C29ACCA00A77989 /* OSCProfilesManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSCProfilesManager.h; sourceTree = "<group>"; };
|
||||
@@ -145,6 +151,7 @@
|
||||
84351B592C29ADBE00A77989 /* ProfileTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProfileTableViewCell.m; sourceTree = "<group>"; };
|
||||
84351B5A2C29ADBE00A77989 /* ProfileTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileTableViewCell.h; sourceTree = "<group>"; };
|
||||
84351B5B2C29ADBE00A77989 /* ProfileTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProfileTableViewCell.xib; sourceTree = "<group>"; };
|
||||
843667EF2D9D7173004A7D7F /* widgetTemplates.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = widgetTemplates.bin; path = Limelight/PresetConfigs/widgetTemplates.bin; sourceTree = SOURCE_ROOT; };
|
||||
843CC7EE2C1E757D00BBC475 /* NativeTouchPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeTouchPointer.h; sourceTree = "<group>"; };
|
||||
843CC7EF2C1E757D00BBC475 /* NativeTouchPointer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NativeTouchPointer.m; sourceTree = "<group>"; };
|
||||
843CC7F42C1E778000BBC475 /* NativeTouchHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NativeTouchHandler.h; sourceTree = "<group>"; };
|
||||
@@ -158,6 +165,10 @@
|
||||
8454AC6D2C319BDA00F0A302 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/iPhone.xcstrings; sourceTree = "<group>"; };
|
||||
84591A4F2BE16240006AAB10 /* CustomEdgeSlideGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomEdgeSlideGestureRecognizer.h; sourceTree = "<group>"; };
|
||||
84591A502BE1625E006AAB10 /* CustomEdgeSlideGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomEdgeSlideGestureRecognizer.m; sourceTree = "<group>"; };
|
||||
847D2FD82DDA00C800937A62 /* MenuSectionView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MenuSectionView.h; sourceTree = "<group>"; };
|
||||
847D2FDA2DDA015F00937A62 /* MenuSectionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MenuSectionView.m; sourceTree = "<group>"; };
|
||||
848F45682DDCD0D600581E36 /* HostCardView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HostCardView.h; sourceTree = "<group>"; };
|
||||
848F45692DDCD12500581E36 /* HostCardView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HostCardView.m; sourceTree = "<group>"; };
|
||||
84D8EB932C5146AD00FC10A9 /* Moonlight-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Moonlight-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
84E1CDEB2C4F67D300547904 /* CommandManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandManager.swift; sourceTree = "<group>"; };
|
||||
84E1CDEE2C4F688E00547904 /* CommandManagerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandManagerViewController.swift; sourceTree = "<group>"; };
|
||||
@@ -375,6 +386,14 @@
|
||||
path = Cells;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
843667ED2D9D70A3004A7D7F /* PresetConfigs */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
843667EF2D9D7173004A7D7F /* widgetTemplates.bin */,
|
||||
);
|
||||
name = PresetConfigs;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
84FD0B492C312C0B006B5BE5 /* Localization */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -479,6 +498,12 @@
|
||||
FB290CFA19B2C406004C83CF /* Supporting Files */,
|
||||
FB290D0219B2C406004C83CF /* AppDelegate.h */,
|
||||
FB290D0319B2C406004C83CF /* AppDelegate.m */,
|
||||
848F45682DDCD0D600581E36 /* HostCardView.h */,
|
||||
848F45692DDCD12500581E36 /* HostCardView.m */,
|
||||
841BAC8F2DE35BEC00DA639E /* UIColor+Theme.h */,
|
||||
841BAC912DE35D6B00DA639E /* UIColor+Theme.m */,
|
||||
847D2FD82DDA00C800937A62 /* MenuSectionView.h */,
|
||||
847D2FDA2DDA015F00937A62 /* MenuSectionView.m */,
|
||||
FBDE86DE19F7A837001C18A8 /* UIComputerView.h */,
|
||||
FBDE86DF19F7A837001C18A8 /* UIComputerView.m */,
|
||||
FBDE86E419F82297001C18A8 /* UIAppView.h */,
|
||||
@@ -499,6 +524,7 @@
|
||||
FB290CFA19B2C406004C83CF /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
843667ED2D9D70A3004A7D7F /* PresetConfigs */,
|
||||
FB290CFB19B2C406004C83CF /* Limelight-Info.plist */,
|
||||
FB290CFC19B2C406004C83CF /* InfoPlist.strings */,
|
||||
FB290CFF19B2C406004C83CF /* main.m */,
|
||||
@@ -551,7 +577,7 @@
|
||||
988FCD3F293B091B003050E2 /* KeyboardInputField.h */,
|
||||
988FCD40293B091B003050E2 /* KeyboardInputField.m */,
|
||||
84E1CDEB2C4F67D300547904 /* CommandManager.swift */,
|
||||
84203F222C5F24C00032EEED /* OnScreenButtonView.swift */,
|
||||
84203F222C5F24C00032EEED /* OnScreenWidgetView.swift */,
|
||||
);
|
||||
path = Input;
|
||||
sourceTree = "<group>";
|
||||
@@ -815,6 +841,7 @@
|
||||
FB89463819F6473800339C8A /* Launch Screen.xib in Resources */,
|
||||
8454AC662C31907F00F0A302 /* iPad.storyboard in Resources */,
|
||||
8454AC6A2C319BDA00F0A302 /* iPhone.storyboard in Resources */,
|
||||
843667F02D9D7173004A7D7F /* widgetTemplates.bin in Resources */,
|
||||
84FD0B542C3134A6006B5BE5 /* Localizable.xcstrings in Resources */,
|
||||
84351B5D2C29ADBE00A77989 /* ProfileTableViewCell.xib in Resources */,
|
||||
);
|
||||
@@ -843,6 +870,7 @@
|
||||
843E93BE2C41528700B1651F /* OrientationHelper.swift in Sources */,
|
||||
FB4678FF1A565DAC00377732 /* WakeOnLanManager.m in Sources */,
|
||||
84E1CDEC2C4F67D300547904 /* CommandManager.swift in Sources */,
|
||||
847D2FDB2DDA015F00937A62 /* MenuSectionView.m in Sources */,
|
||||
FB53E1431BE5DC4400CD6ECE /* IdManager.m in Sources */,
|
||||
9897B6A1221260EF00966419 /* Controller.m in Sources */,
|
||||
84351B112C29ACCB00A77989 /* OSCProfilesManager.m in Sources */,
|
||||
@@ -851,7 +879,7 @@
|
||||
FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */,
|
||||
FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */,
|
||||
FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */,
|
||||
84203F232C5F24C00032EEED /* OnScreenButtonView.swift in Sources */,
|
||||
84203F232C5F24C00032EEED /* OnScreenWidgetView.swift in Sources */,
|
||||
84FD0B512C31338D006B5BE5 /* LocalizationHelper.m in Sources */,
|
||||
FB1D59971BBCCB6400F482CA /* ComputerScrollView.m in Sources */,
|
||||
FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */,
|
||||
@@ -862,10 +890,12 @@
|
||||
FB89462B19F646E200339C8A /* StreamView.m in Sources */,
|
||||
840751B32BF49C050096B657 /* CustomTapGestureRecognizer.m in Sources */,
|
||||
FB4678FA1A55FFAD00377732 /* DiscoveryManager.m in Sources */,
|
||||
841BAC922DE35D6B00DA639E /* UIColor+Theme.m in Sources */,
|
||||
98D5856D1C0EA79600F6CC00 /* TemporaryHost.m in Sources */,
|
||||
FB89463519F646E200339C8A /* MainFrameViewController.m in Sources */,
|
||||
FBD1C8E21A8AD71400C6703C /* Logger.m in Sources */,
|
||||
FB1D599A1BBCCD7E00F482CA /* AppCollectionView.m in Sources */,
|
||||
848F456A2DDCD12500581E36 /* HostCardView.m in Sources */,
|
||||
FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */,
|
||||
9827E7A32514366900F25707 /* HapticContext.m in Sources */,
|
||||
9832D1361BBCD5C50036EF48 /* TemporaryApp.m in Sources */,
|
||||
|
||||
Reference in New Issue
Block a user