Add open/save file dialogs for Mac
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#if PLATFORM_MAC
|
||||
|
||||
#include "MacFileSystem.h"
|
||||
#include "MacUtils.h"
|
||||
#include "Engine/Platform/File.h"
|
||||
#include "Engine/Core/Types/String.h"
|
||||
#include "Engine/Core/Types/StringView.h"
|
||||
@@ -19,9 +20,122 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <AppKit/AppKit.h>
|
||||
|
||||
const DateTime UnixEpoch(1970, 1, 1);
|
||||
|
||||
void InitMacDialog(NSSavePanel* dialog, const StringView& initialDirectory, const StringView& filter, const StringView& title)
|
||||
{
|
||||
if (initialDirectory.HasChars())
|
||||
{
|
||||
[dialog setDirectoryURL:[NSURL fileURLWithPath:(NSString*)MacUtils::ToString(initialDirectory) isDirectory:YES]];
|
||||
}
|
||||
if (filter.HasChars())
|
||||
{
|
||||
// TODO: finish file tpye filter support
|
||||
/*NSMutableArray* fileTypes = [[NSMutableArray alloc] init];
|
||||
Array<String> entries;
|
||||
String(filter).Split('\0', entries);
|
||||
for (int32 i = 1; i < entries.Count(); i += 2)
|
||||
{
|
||||
String extension = entries[i];
|
||||
if (extension.StartsWith(TEXT("*.")))
|
||||
extension = extension.Substring(2);
|
||||
[fileTypes addObject:(NSString*)MacUtils::ToString(extension)];
|
||||
}
|
||||
[dialog setAllowedFileTypes:fileTypes];*/
|
||||
}
|
||||
if (title.HasChars())
|
||||
{
|
||||
[dialog setMessage:(NSString*)MacUtils::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(MacUtils::ToString((CFStringRef)[[urls objectAtIndex:i] path]));
|
||||
}
|
||||
else
|
||||
{
|
||||
const NSURL* url = [dialog URL];
|
||||
filenames.Add(MacUtils::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(MacUtils::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 = MacUtils::ToString((CFStringRef)[url path]);
|
||||
result = false;
|
||||
}
|
||||
|
||||
[focusedWindow makeKeyAndOrderFront:nil];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool MacFileSystem::ShowFileExplorer(const StringView& path)
|
||||
{
|
||||
return Platform::StartProcess(TEXT("open"), String::Format(TEXT("\"{0}\""), path), StringView::Empty) != 0;
|
||||
}
|
||||
|
||||
bool MacFileSystem::CreateDirectory(const StringView& path)
|
||||
{
|
||||
const StringAsANSI<> pathAnsi(*path, path.Length());
|
||||
|
||||
Reference in New Issue
Block a user