160 lines
5.5 KiB
C++
160 lines
5.5 KiB
C++
// 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 <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <cerrno>
|
|
#include <dirent.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <AppKit/AppKit.h>
|
|
#include <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
|
|
|
|
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<String> 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<String>& 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<String>& 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
|