/* * Copyright 2019-2019 Attila Kocsis. All rights reserved. * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE */ #include "entry_p.h" #if BX_PLATFORM_OSX #include #include #include #include #include #include #import #include "dialog.h" class Split { public: Split(const bx::StringView& _str, char _ch) : m_str(_str) , m_token(_str.getPtr(), bx::strFind(_str, _ch).getPtr() ) , m_ch(_ch) { } bx::StringView next() { bx::StringView result = m_token; m_token = bx::strTrim( bx::StringView(m_token.getTerm()+1, bx::strFind(bx::StringView(m_token.getTerm()+1, m_str.getTerm() ), m_ch).getPtr()) , " \t\n" ); return result; } bool isDone() const { return m_token.isEmpty(); } private: const bx::StringView& m_str; bx::StringView m_token; char m_ch; }; bool openFileSelectionDialog( bx::FilePath& _inOutFilePath , FileSelectionDialogType::Enum _type , const bx::StringView& _title , const bx::StringView& _filter ) { NSMutableArray* fileTypes = [NSMutableArray arrayWithCapacity:10]; for (bx::LineReader lr(_filter); !lr.isDone();) { const bx::StringView line = lr.next(); const bx::StringView sep = bx::strFind(line, '|'); if (!sep.isEmpty() ) { for (Split split(bx::strTrim(bx::StringView(sep.getPtr()+1, line.getTerm() ), " "), ' ') ; !split.isDone() ; ) { const bx::StringView token = split.next(); if (token.getLength() >= 3 && token.getPtr()[0] == '*' && token.getPtr()[1] == '.' && bx::isAlphaNum(token.getPtr()[2]) ) { NSString* extension = [[NSString alloc] initWithBytes:token.getPtr()+2 length:token.getLength()-2 encoding:NSASCIIStringEncoding]; [fileTypes addObject: extension]; } } } } __block NSString* fileName = nil; void (^invokeDialog)(void) = ^{ NSSavePanel* panel = nil; if (FileSelectionDialogType::Open == _type) { NSOpenPanel* openPanel = [NSOpenPanel openPanel]; openPanel.canChooseFiles = TRUE; openPanel.allowsMultipleSelection = FALSE; openPanel.canChooseDirectories = FALSE; panel = openPanel; } else { panel = [NSSavePanel savePanel]; } panel.message = [[NSString alloc] initWithBytes:_title.getPtr() length:_title.getLength() encoding:NSASCIIStringEncoding]; panel.directoryURL = [NSURL URLWithString:@(_inOutFilePath.getCPtr())]; panel.allowedFileTypes = fileTypes; if ([panel runModal] == NSModalResponseOK) { NSURL* url = [panel URL]; if (nil != url) { fileName = [url path]; [fileName retain]; } } [panel close]; }; if ([NSThread isMainThread]) { invokeDialog(); } else { bx::Semaphore semaphore; bx::Semaphore* psemaphore = &semaphore; CFRunLoopPerformBlock( [[NSRunLoop mainRunLoop] getCFRunLoop] , kCFRunLoopCommonModes , ^{ invokeDialog(); psemaphore->post(); }); semaphore.wait(); } if (fileName != nil) { _inOutFilePath.set([fileName UTF8String]); [fileName release]; return true; } return false; } #endif // BX_PLATFORM_OSX