SameBoy/iOS/GBSlotButton.m

151 lines
5.3 KiB
Objective-C

#import "GBSlotButton.h"
@implementation GBSlotButton
{
UIImageView *_imageView;
}
+ (instancetype)buttonWithLabelText:(NSString *)labelText
{
GBSlotButton *ret = [self buttonWithType:UIButtonTypeCustom];
if (!ret) return nil;
ret.frame = CGRectMake(0, 0, 0x100, 0x100);
ret->_slotSubtitleLabel = [[UILabel alloc] init];
ret->_slotSubtitleLabel.text = @"Empty";
ret->_slotSubtitleLabel.font = [UIFont systemFontOfSize:UIFont.smallSystemFontSize];
if (@available(iOS 13.0, *)) {
ret->_slotSubtitleLabel.textColor = [UIColor secondaryLabelColor];
}
else {
ret->_slotSubtitleLabel.textColor = [UIColor systemGrayColor];
}
[ret->_slotSubtitleLabel sizeToFit];
ret->_slotSubtitleLabel.textAlignment = NSTextAlignmentCenter;
CGRect slotSubtitleLabelRect = ret->_slotSubtitleLabel.frame;
slotSubtitleLabelRect.size.width = 0x100;
slotSubtitleLabelRect.origin.y = 0x100 - slotSubtitleLabelRect.size.height - 8;
ret->_slotSubtitleLabel.frame = slotSubtitleLabelRect;
ret->_slotSubtitleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
[ret addSubview:ret->_slotSubtitleLabel];
ret->_label = [[UILabel alloc] init];
ret->_label.text = labelText;
[ret->_label sizeToFit];
ret->_label.textAlignment = NSTextAlignmentCenter;
CGRect labelRect = ret->_label.frame;
labelRect.size.width = 0x100;
labelRect.origin.y = slotSubtitleLabelRect.origin.y - labelRect.size.height - 4;
ret->_label.frame = labelRect;
ret->_label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
[ret addSubview:ret->_label];
ret.backgroundColor = [UIColor clearColor];
ret->_imageView = [[UIImageView alloc] initWithImage:nil];
ret.imageView.layer.cornerRadius = 6;
ret.imageView.layer.masksToBounds = true;
if (@available(iOS 13.0, *)) {
ret.imageView.layer.borderColor = [UIColor tertiaryLabelColor] .CGColor;
}
else {
ret.imageView.layer.borderColor = [UIColor colorWithWhite:0 alpha:0.5].CGColor;
}
ret.imageView.layer.borderWidth = 1;
ret.imageView.layer.backgroundColor = [UIColor whiteColor].CGColor;
[ret addSubview:ret.imageView];
return ret;
}
- (UIImageView *)imageView
{
return _imageView;
}
- (void)setHighlighted:(BOOL)highlighted
{
if (_showingMenu) return;
if (highlighted == self.isHighlighted) return;
[super setHighlighted:highlighted];
[UIView animateWithDuration:0.25 animations:^{
if (highlighted) {
if (@available(iOS 13.0, *)) {
self.backgroundColor = [UIColor tertiarySystemFillColor];
}
else {
self.backgroundColor = [UIColor colorWithRed:118 / 255.0
green:118 / 255.0
blue:128 / 255.0
alpha:0.12];
}
self.imageView.layer.opacity = 11 / 12.0;
}
else {
self.backgroundColor = [UIColor clearColor];
self.imageView.layer.opacity = 1;
}
}];
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
CGRect screenshotRect = self.bounds;
screenshotRect.size.width -= 8;
screenshotRect.origin.x += 4;
screenshotRect.size.height = _label.frame.origin.y - 16;
screenshotRect.origin.y += 8;
double scale = [UIApplication sharedApplication].keyWindow.screen.scale;
double nativeWidth = 160.0 / scale;
double nativeHeight = 144.0 / scale;
if (screenshotRect.size.width > nativeWidth &&
screenshotRect.size.height > nativeHeight) {
self.imageView.layer.magnificationFilter = kCAFilterNearest;
double newWidth = floor(screenshotRect.size.width / nativeWidth) * nativeWidth;
screenshotRect.origin.x += (screenshotRect.size.width - newWidth) / 2;
screenshotRect.size.width = newWidth;
double newHeight = floor(screenshotRect.size.height / nativeHeight) * nativeHeight;
screenshotRect.origin.y += (screenshotRect.size.height - newHeight) / 2;
screenshotRect.size.height = newHeight;
}
else {
self.imageView.layer.magnificationFilter = kCAFilterLinear;
}
double aspect = screenshotRect.size.width / screenshotRect.size.height;
if (aspect > 160.0 / 144.0) {
// Too wide
double newWidth = screenshotRect.size.height / 144 * 160;
screenshotRect.origin.x += (screenshotRect.size.width - newWidth) / 2;
screenshotRect.size.width = newWidth;
}
else {
// Too narrow
double newHeight = screenshotRect.size.width / 160 * 144;
screenshotRect.origin.y += (screenshotRect.size.height - newHeight) / 2;
screenshotRect.size.height = newHeight;
}
screenshotRect.origin.x = round(screenshotRect.origin.x);
screenshotRect.origin.y = round(screenshotRect.origin.y);
self.imageView.frame = screenshotRect;
}
- (void)setShowingMenu:(bool)showingMenu
{
if (showingMenu) {
self.highlighted = true;
_showingMenu = true;
}
else {
_showingMenu = false;
self.highlighted = false;
}
}
@end