mirror of https://github.com/LIJI32/SameBoy.git
151 lines
5.3 KiB
Objective-C
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
|