// Copyright (c) Wojciech Figat. All rights reserved. #if PLATFORM_MAC #include "MacFileSystem.h" #include "Engine/Platform/Apple/AppleUtils.h" #include "Engine/Platform/File.h" #include "Engine/Platform/Platform.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/StringView.h" #include "Engine/Core/Types/TimeSpan.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Core/Math/Math.h" #include "Engine/Core/Log.h" #include "Engine/Utilities/StringConverter.h" #include #include #include #include #include #include #include #include #include #include #include void InitMacDialog(NSSavePanel* dialog, const StringView& initialDirectory, const StringView& filter, const StringView& title) { if (initialDirectory.HasChars()) { [dialog setDirectoryURL:[NSURL fileURLWithPath:(NSString*)AppleUtils::ToString(initialDirectory) isDirectory:YES]]; } if (filter.HasChars()) { Array entries; String(filter).Split('\0', entries); if (entries.HasItems() && !(entries.Count() == 2 && entries[1] == TEXT("*.*"))) { NSMutableArray* fileTypes = [[NSMutableArray alloc] init]; for (int32 i = 1; i < entries.Count(); i += 2) { StringView extension = entries[i]; if (extension.StartsWith(TEXT("*."))) extension = extension.Substring(2); NSString* extensionStr = (NSString*)AppleUtils::ToString(extension); #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__MAC_11_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0 UTType* type = [UTType typeWithFilenameExtension:extensionStr]; [fileTypes addObject:type]; } dialog.allowedContentTypes = fileTypes; #else [fileTypes addObject:extensionStr]; } [dialog setAllowedFileTypes:fileTypes]; #endif } } if (title.HasChars()) { [dialog setMessage:(NSString*)AppleUtils::ToString(title)]; } } bool MacFileSystem::ShowOpenFileDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& filter, bool multiSelect, const StringView& title, Array& filenames) { bool result = true; @autoreleasepool { NSWindow* focusedWindow = [[NSApplication sharedApplication] keyWindow]; NSOpenPanel* dialog = [NSOpenPanel openPanel]; [dialog setCanChooseFiles:YES]; [dialog setCanChooseDirectories:NO]; [dialog setAllowsMultipleSelection:multiSelect ? YES : NO]; InitMacDialog(dialog, initialDirectory, filter, title); if ([dialog runModal] == NSModalResponseOK) { if (multiSelect) { const NSArray* urls = [dialog URLs]; for (int32 i = 0; i < [urls count]; i++) filenames.Add(AppleUtils::ToString((CFStringRef)[[urls objectAtIndex:i] path])); } else { const NSURL* url = [dialog URL]; filenames.Add(AppleUtils::ToString((CFStringRef)[url path])); } result = false; } [focusedWindow makeKeyAndOrderFront:nil]; } return result; } bool MacFileSystem::ShowSaveFileDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& filter, bool multiSelect, const StringView& title, Array& filenames) { bool result = true; @autoreleasepool { NSWindow* focusedWindow = [[NSApplication sharedApplication] keyWindow]; NSSavePanel* dialog = [NSSavePanel savePanel]; [dialog setExtensionHidden:NO]; InitMacDialog(dialog, initialDirectory, filter, title); if ([dialog runModal] == NSModalResponseOK) { const NSURL* url = [dialog URL]; filenames.Add(AppleUtils::ToString((CFStringRef)[url path])); result = false; } [focusedWindow makeKeyAndOrderFront:nil]; } return result; } bool MacFileSystem::ShowBrowseFolderDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& title, String& path) { bool result = true; @autoreleasepool { NSWindow* focusedWindow = [[NSApplication sharedApplication] keyWindow]; NSOpenPanel* dialog = [NSOpenPanel openPanel]; [dialog setCanChooseFiles:NO]; [dialog setCanChooseDirectories:YES]; [dialog setCanCreateDirectories:YES]; [dialog setAllowsMultipleSelection:NO]; InitMacDialog(dialog, initialDirectory, StringView::Empty, title); if ([dialog runModal] == NSModalResponseOK) { const NSURL* url = [dialog URL]; path = AppleUtils::ToString((CFStringRef)[url path]); result = false; } [focusedWindow makeKeyAndOrderFront:nil]; } return result; } bool MacFileSystem::ShowFileExplorer(const StringView& path) { String fullPath = FileSystem::ConvertRelativePathToAbsolute(path); NSString* selectFile = AppleUtils::ToNSString(fullPath); NSString* inFileViewerRootedAtPath = AppleUtils::ToNSString(String::Empty); if (FileSystem::DirectoryExists(fullPath)) { // Show folder contents inFileViewerRootedAtPath = selectFile; selectFile = nullptr; } return [[NSWorkspace sharedWorkspace] selectFile: selectFile inFileViewerRootedAtPath: inFileViewerRootedAtPath]; } #endif