diff --git a/CMakeLists.txt b/CMakeLists.txt index 5019a91f99..267e7e662e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1269,10 +1269,25 @@ elseif(TARGET SDL2::SDL2) endif() set(nativeExtraLibs ${nativeExtraLibs} SDL2::SDL2) if(APPLE) - set(nativeExtra ${nativeExtra} SDL/SDLMain.h SDL/SDLMain.mm SDL/SDLCocoaMetalLayer.h SDL/SDLCocoaMetalLayer.mm SDL/CocoaBarItems.mm SDL/CocoaBarItems.h UI/DarwinFileSystemServices.mm UI/DarwinFileSystemServices.h Common/Battery/AppleBatteryClient.m UI/PSPNSApplicationDelegate.mm UI/PSPNSApplicationDelegate.h) + set(nativeExtra ${nativeExtra} + SDL/SDLMain.h + SDL/SDLMain.mm + SDL/SDLCocoaMetalLayer.h + SDL/SDLCocoaMetalLayer.mm + SDL/CocoaBarItems.mm + SDL/CocoaBarItems.h + SDL/PPSSPPAboutViewController.m + SDL/PPSSPPAboutViewController.h + UI/DarwinFileSystemServices.mm + UI/DarwinFileSystemServices.h + Common/Battery/AppleBatteryClient.m + UI/PSPNSApplicationDelegate.mm + UI/PSPNSApplicationDelegate.h) + set_source_files_properties(UI/DarwinFileSystemServices.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) set_source_files_properties(UI/PSPNSApplicationDelegate.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) set_source_files_properties(SDL/CocoaBarItems.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) + set_source_files_properties(SDL/PPSSPPAboutViewController.m PROPERTIES COMPILE_FLAGS -fobjc-arc) set_source_files_properties(Common/Battery/AppleBatteryClient.m PROPERTIES COMPILE_FLAGS -fobjc-arc) set(nativeExtraLibs ${nativeExtraLibs} ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY}) elseif(USING_EGL) diff --git a/SDL/CocoaBarItems.mm b/SDL/CocoaBarItems.mm index 39cdc06b97..237ce3157c 100644 --- a/SDL/CocoaBarItems.mm +++ b/SDL/CocoaBarItems.mm @@ -6,9 +6,11 @@ // #import +#import "PPSSPPAboutViewController.h" #include "UI/DarwinFileSystemServices.h" #include "UI/PSPNSApplicationDelegate.h" + #include "Core/Debugger/SymbolMap.h" #include "Core/MemMap.h" #include "GPU/GPUInterface.h" @@ -96,15 +98,43 @@ void initializeOSXExtras() { } } - /* IGNORE THE BELOW and eat some nice cherries :3 NSArray *firstSubmenu = NSApp.menu.itemArray.firstObject.submenu.itemArray; for (NSMenuItem *item in firstSubmenu) { // about item, set action if ([item.title hasPrefix:@"About "]) { + item.target = self; + item.action = @selector(presentAboutMenu); break; } } - */ +} + +-(void)presentAboutMenu { + NSWindow *window = [NSWindow windowWithContentViewController:[PPSSPPAboutViewController new]]; + window.title = @"PPSSPP"; + window.titleVisibility = NSWindowTitleHidden; + window.titlebarAppearsTransparent = YES; + window.styleMask &= ~NSWindowStyleMaskResizable; + [[window standardWindowButton:NSWindowMiniaturizeButton] setEnabled:NO]; + + if (@available(macOS 10.15, *)) { + window.backgroundColor = [NSColor colorWithName:nil dynamicProvider:^NSColor * _Nonnull(NSAppearance * _Nonnull appearance) { + // check for dark/light mode (dark mode is OS X 10.14+ only) + /* no I can't use switch statements here it's an NSString pointer */ + if (appearance.name == NSAppearanceNameDarkAqua || + appearance.name == NSAppearanceNameAccessibilityHighContrastVibrantDark || + appearance.name == NSAppearanceNameAccessibilityHighContrastDarkAqua || + appearance.name == NSAppearanceNameVibrantDark) + return [NSColor colorWithRed:0.19 green:0.19 blue:0.19 alpha:1]; + + // macOS pre 10.14 is always light mode + return [NSColor whiteColor]; + }]; + } else { + window.backgroundColor = [NSColor whiteColor]; + } + + [[[NSWindowController alloc] initWithWindow:window] showWindow:nil]; } - (void)menuNeedsUpdate:(NSMenu *)menu { diff --git a/SDL/PPSSPPAboutViewController.h b/SDL/PPSSPPAboutViewController.h new file mode 100644 index 0000000000..8b3e5f2bad --- /dev/null +++ b/SDL/PPSSPPAboutViewController.h @@ -0,0 +1,13 @@ +// +// PPSSPPAboutViewController.h +// PPSSPP +// +// Created by Serena on 23/04/2023. +// + +#pragma once + +#import + +@interface PPSSPPAboutViewController : NSViewController +@end diff --git a/SDL/PPSSPPAboutViewController.m b/SDL/PPSSPPAboutViewController.m new file mode 100644 index 0000000000..99d205ae89 --- /dev/null +++ b/SDL/PPSSPPAboutViewController.m @@ -0,0 +1,91 @@ +// +// PPSSPPAboutViewController.m +// PPSSPP +// +// Created by Serena on 23/04/2023. +// + +#import // AppKit ftw +#import "PPSSPPAboutViewController.h" + +#if !__has_feature(objc_arc) +#error Caveman detected (warning emoji) please enable arc with -fobjc-arc +#endif + +extern const char *PPSSPP_GIT_VERSION; + +@implementation PPSSPPAboutViewController +- (void)loadView { + self.view = [[NSView alloc] init]; + [self.view setFrameSize:CGSizeMake(500, 180)]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + NSImageView *imageView = [[NSImageView alloc] init]; + imageView.translatesAutoresizingMaskIntoConstraints = NO; + imageView.image = [NSImage imageNamed:@"ppsspp.icns"];; + [self.view addSubview:imageView]; + + NSTextField *titleLabel = [NSTextField labelWithString:@"PPSSPP"]; + titleLabel.translatesAutoresizingMaskIntoConstraints = NO; + titleLabel.font = [NSFont systemFontOfSize:38]; + [self.view addSubview:titleLabel]; + + NSTextField *versionLabel = [NSTextField labelWithString:@(PPSSPP_GIT_VERSION)]; + versionLabel.translatesAutoresizingMaskIntoConstraints = NO; + versionLabel.textColor = [NSColor secondaryLabelColor]; + versionLabel.selectable = YES; /* in case someone wants to copy the version */ + [self.view addSubview:versionLabel]; + + NSTextField *descriptionLabel = [NSTextField wrappingLabelWithString:@"A PSP emulator for Android, Windows, Mac and Linux, written in C++"]; + descriptionLabel.translatesAutoresizingMaskIntoConstraints = NO; + + if (@available(macOS 11.0, *)) { + descriptionLabel.font = [NSFont preferredFontForTextStyle:NSFontTextStyleSubheadline options:@{}]; + } else { + descriptionLabel.font = [NSFont systemFontOfSize:10]; + } + + descriptionLabel.textColor = [NSColor colorWithRed:0.60 green:0.60 blue:0.60 alpha:1.0]; + [self.view addSubview:descriptionLabel]; + + NSButton *sourceCodeButton = [NSButton buttonWithTitle:@"Source Code" target:self action:@selector(sourceCodeButtonTapped)]; + sourceCodeButton.bezelStyle = NSBezelStyleRounded; + + NSButton *discordButton = [NSButton buttonWithTitle:@"Join Discord" target:self action: @selector(joinDiscord)]; + discordButton.bezelStyle = NSBezelStyleRounded; + + NSStackView *stackView = [NSStackView stackViewWithViews:@[discordButton, sourceCodeButton]]; + stackView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:stackView]; + + [NSLayoutConstraint activateConstraints:@[ + [imageView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor], + [imageView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:40], + + [titleLabel.leadingAnchor constraintEqualToAnchor:imageView.trailingAnchor constant:15], + [titleLabel.centerYAnchor constraintEqualToAnchor:imageView.topAnchor constant:25], + + [versionLabel.leadingAnchor constraintEqualToAnchor:titleLabel.leadingAnchor], + [versionLabel.centerYAnchor constraintEqualToAnchor:titleLabel.bottomAnchor constant:5], + + [descriptionLabel.leadingAnchor constraintEqualToAnchor:versionLabel.leadingAnchor], + [descriptionLabel.trailingAnchor constraintLessThanOrEqualToAnchor: self.view.trailingAnchor], + [descriptionLabel.centerYAnchor constraintEqualToAnchor:versionLabel.bottomAnchor constant:20], + + [stackView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-26.4], + [stackView.centerYAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-25] + ]]; +} + +-(void)sourceCodeButtonTapped { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://github.com/hrydgard/ppsspp"]]; +} + +-(void)joinDiscord { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://discord.gg/5NJB6dD"]]; +} + +@end