From 5fce1ae46400576c7d65a9ea63ff1c00952cf71c Mon Sep 17 00:00:00 2001 From: SupSuper Date: Tue, 20 Nov 2018 00:14:16 +0000 Subject: BACKENDS: Move OSX file browser into backend --- backends/dialogs/macosx/macosx-dialogs.mm | 215 ++++++++++++++++++++++++++++++ backends/module.mk | 1 + devtools/create_project/xcode.cpp | 13 -- gui/browser_osx.mm | 215 ------------------------------ gui/module.mk | 14 +- 5 files changed, 217 insertions(+), 241 deletions(-) create mode 100644 backends/dialogs/macosx/macosx-dialogs.mm delete mode 100644 gui/browser_osx.mm diff --git a/backends/dialogs/macosx/macosx-dialogs.mm b/backends/dialogs/macosx/macosx-dialogs.mm new file mode 100644 index 0000000000..ffb64ee96a --- /dev/null +++ b/backends/dialogs/macosx/macosx-dialogs.mm @@ -0,0 +1,215 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// Disable symbol overrides so that we can use system headers +#define FORBIDDEN_SYMBOL_ALLOW_ALL + +#include "gui/browser.h" + +#include "common/config-manager.h" +#include "common/system.h" +#include "common/events.h" +#include "common/algorithm.h" +#include "common/translation.h" + +#include +#include +#include +#include +#include +#include +#include + + +@interface BrowserDialogPresenter : NSObject { +@public + NSURL *_url; +@private + NSOpenPanel *_panel; +} +- (id) init; +- (void) dealloc; +- (void) showOpenPanel: (NSOpenPanel*) panel; +- (IBAction) showHiddenFiles : (id) sender; +@end + +@implementation BrowserDialogPresenter + +- (id) init { + self = [super init]; + _url = 0; + _panel = 0; + return self; +} + +- (void) dealloc { + [_url release]; + [super dealloc]; +} + +- (void) showOpenPanel: (NSOpenPanel*) panel { + _panel = panel; + + NSButton *showHiddenFilesButton = 0; + if ([panel respondsToSelector:@selector(setShowsHiddenFiles:)]) { + showHiddenFilesButton = [[NSButton alloc] init]; + [showHiddenFilesButton setButtonType:NSSwitchButton]; + +#ifdef USE_TRANSLATION + CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); + CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); + CFRelease(encStr); +#else + CFStringEncoding stringEncoding = kCFStringEncodingASCII; +#endif + CFStringRef hiddenFilesString = CFStringCreateWithCString(0, _("Show hidden files"), stringEncoding); + [showHiddenFilesButton setTitle:(NSString*)hiddenFilesString]; + CFRelease(hiddenFilesString); + + [showHiddenFilesButton sizeToFit]; + if (ConfMan.getBool("gui_browser_show_hidden", Common::ConfigManager::kApplicationDomain)) { + [showHiddenFilesButton setState:NSOnState]; + [panel setShowsHiddenFiles: YES]; + } else { + [showHiddenFilesButton setState:NSOffState]; + [panel setShowsHiddenFiles: NO]; + } + [panel setAccessoryView:showHiddenFilesButton]; + + [showHiddenFilesButton setTarget:self]; + [showHiddenFilesButton setAction:@selector(showHiddenFiles:)]; + } + +#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1090 + if ([panel runModal] == NSOKButton) { +#else + if ([panel runModal] == NSModalResponseOK) { +#endif + NSURL *url = [panel URL]; + if ([url isFileURL]) { + _url = url; + [_url retain]; + } + } + + [showHiddenFilesButton release]; + _panel = 0; +} + +- (IBAction) showHiddenFiles : (id) sender { + if ([sender state] == NSOnState) { + [_panel setShowsHiddenFiles: YES]; + ConfMan.setBool("gui_browser_show_hidden", true, Common::ConfigManager::kApplicationDomain); + } else { + [_panel setShowsHiddenFiles: NO]; + ConfMan.setBool("gui_browser_show_hidden", false, Common::ConfigManager::kApplicationDomain); + } +} + +@end + +namespace GUI { + +BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) + : Dialog("Browser") { + + // remember whether this is a file browser or a directory browser. + _isDirBrowser = dirBrowser; + + // Get current encoding +#ifdef USE_TRANSLATION + CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); + CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); + CFRelease(encStr); +#else + CFStringEncoding stringEncoding = kCFStringEncodingASCII; +#endif + + // Convert title to NSString + _titleRef = CFStringCreateWithCString(0, title, stringEncoding); + + // Convert button text to NSString + _chooseRef = CFStringCreateWithCString(0, _("Choose"), stringEncoding); +} + +BrowserDialog::~BrowserDialog() { + CFRelease(_titleRef); + CFRelease(_chooseRef); +} + +int BrowserDialog::runModal() { + bool choiceMade = false; + + // If in fullscreen mode, switch to windowed mode + bool wasFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode); + if (wasFullscreen) { + g_system->beginGFXTransaction(); + g_system->setFeatureState(OSystem::kFeatureFullscreenMode, false); + g_system->endGFXTransaction(); + } + + // Temporarily show the real mouse + CGDisplayShowCursor(kCGDirectMainDisplay); + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSWindow *keyWindow = [[NSApplication sharedApplication] keyWindow]; + + + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanChooseFiles:!_isDirBrowser]; + [panel setCanChooseDirectories:_isDirBrowser]; + if (_isDirBrowser) + [panel setTreatsFilePackagesAsDirectories:true]; + [panel setTitle:(NSString *)_titleRef]; + [panel setPrompt:(NSString *)_chooseRef]; + + BrowserDialogPresenter* presenter = [[BrowserDialogPresenter alloc] init]; + [presenter performSelectorOnMainThread:@selector(showOpenPanel:) withObject:panel waitUntilDone:YES]; + if (presenter->_url) { + Common::String filename = [[presenter->_url path] UTF8String]; + _choice = Common::FSNode(filename); + choiceMade = true; + } + [presenter release]; + + [pool release]; + [keyWindow makeKeyAndOrderFront:nil]; + + // While the native macOS file browser is open, any input events (e.g. keypresses) are + // still received by the NSApplication. With SDL backend for example this results in the + // events beeing queued and processed after we return, thus dispatching events that were + // intended for the native file browser. For example: pressing Esc to cancel the native + // macOS file browser would cause the application to quit in addition to closing the + // file browser. To avoid this happening clear all pending events. + g_system->getEventManager()->getEventDispatcher()->clearEvents(); + + // If we were in fullscreen mode, switch back + if (wasFullscreen) { + g_system->beginGFXTransaction(); + g_system->setFeatureState(OSystem::kFeatureFullscreenMode, true); + g_system->endGFXTransaction(); + } + + return choiceMade; +} + +} // End of namespace GUI diff --git a/backends/module.mk b/backends/module.mk index f7d6ad21dc..ad02481bfa 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -179,6 +179,7 @@ endif ifdef MACOSX MODULE_OBJS += \ audiocd/macosx/macosx-audiocd.o \ + dialogs/macosx/macosx-dialogs.o \ midi/coreaudio.o \ midi/coremidi.o \ updates/macosx/macosx-updates.o \ diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp index a04d250a3e..ed6baf6963 100644 --- a/devtools/create_project/xcode.cpp +++ b/devtools/create_project/xcode.cpp @@ -391,14 +391,6 @@ void XcodeProvider::writeFileListToProject(const FileNode &dir, std::ofstream &p // for folders, we shouldn't add folders as file references, obviously. if (node->children.empty()) { group->addChildFile(node->name); - - // HACK: Also add browser_osx.mm, since browser.cpp is added for - // iOS and browser_osx.mm for macOS, and create_project cannot - // deal with two competing exclusive ifdefs in module.mk going - // into one project - if (filePrefix.find("/gui/") == filePrefix.size() - 5 && node->name == "browser.cpp") { - group->addChildFile("browser_osx.mm"); - } } // Process child nodes if (!node->children.empty()) @@ -1121,11 +1113,6 @@ void XcodeProvider::setupAdditionalSources(std::string targetName, Property &fil if (targetIsIOS(targetName)) { const std::string absoluteCatalogPath = _projectRoot + "/dists/ios7/Images.xcassets"; ADD_SETTING_ORDER_NOVALUE(files, getHash(absoluteCatalogPath), "Image Asset Catalog", order++); - } else { - // HACK: browser_osx.mm needs to be added - const std::string browserPath = "gui/browser_osx.mm"; - const std::string comment = "browser_osx.mm in Sources"; - ADD_SETTING_ORDER_NOVALUE(files, getHash(browserPath), comment, order++); } } diff --git a/gui/browser_osx.mm b/gui/browser_osx.mm deleted file mode 100644 index ffb64ee96a..0000000000 --- a/gui/browser_osx.mm +++ /dev/null @@ -1,215 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -// Disable symbol overrides so that we can use system headers -#define FORBIDDEN_SYMBOL_ALLOW_ALL - -#include "gui/browser.h" - -#include "common/config-manager.h" -#include "common/system.h" -#include "common/events.h" -#include "common/algorithm.h" -#include "common/translation.h" - -#include -#include -#include -#include -#include -#include -#include - - -@interface BrowserDialogPresenter : NSObject { -@public - NSURL *_url; -@private - NSOpenPanel *_panel; -} -- (id) init; -- (void) dealloc; -- (void) showOpenPanel: (NSOpenPanel*) panel; -- (IBAction) showHiddenFiles : (id) sender; -@end - -@implementation BrowserDialogPresenter - -- (id) init { - self = [super init]; - _url = 0; - _panel = 0; - return self; -} - -- (void) dealloc { - [_url release]; - [super dealloc]; -} - -- (void) showOpenPanel: (NSOpenPanel*) panel { - _panel = panel; - - NSButton *showHiddenFilesButton = 0; - if ([panel respondsToSelector:@selector(setShowsHiddenFiles:)]) { - showHiddenFilesButton = [[NSButton alloc] init]; - [showHiddenFilesButton setButtonType:NSSwitchButton]; - -#ifdef USE_TRANSLATION - CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); - CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); - CFRelease(encStr); -#else - CFStringEncoding stringEncoding = kCFStringEncodingASCII; -#endif - CFStringRef hiddenFilesString = CFStringCreateWithCString(0, _("Show hidden files"), stringEncoding); - [showHiddenFilesButton setTitle:(NSString*)hiddenFilesString]; - CFRelease(hiddenFilesString); - - [showHiddenFilesButton sizeToFit]; - if (ConfMan.getBool("gui_browser_show_hidden", Common::ConfigManager::kApplicationDomain)) { - [showHiddenFilesButton setState:NSOnState]; - [panel setShowsHiddenFiles: YES]; - } else { - [showHiddenFilesButton setState:NSOffState]; - [panel setShowsHiddenFiles: NO]; - } - [panel setAccessoryView:showHiddenFilesButton]; - - [showHiddenFilesButton setTarget:self]; - [showHiddenFilesButton setAction:@selector(showHiddenFiles:)]; - } - -#if MAC_OS_X_VERSION_MAX_ALLOWED <= 1090 - if ([panel runModal] == NSOKButton) { -#else - if ([panel runModal] == NSModalResponseOK) { -#endif - NSURL *url = [panel URL]; - if ([url isFileURL]) { - _url = url; - [_url retain]; - } - } - - [showHiddenFilesButton release]; - _panel = 0; -} - -- (IBAction) showHiddenFiles : (id) sender { - if ([sender state] == NSOnState) { - [_panel setShowsHiddenFiles: YES]; - ConfMan.setBool("gui_browser_show_hidden", true, Common::ConfigManager::kApplicationDomain); - } else { - [_panel setShowsHiddenFiles: NO]; - ConfMan.setBool("gui_browser_show_hidden", false, Common::ConfigManager::kApplicationDomain); - } -} - -@end - -namespace GUI { - -BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) - : Dialog("Browser") { - - // remember whether this is a file browser or a directory browser. - _isDirBrowser = dirBrowser; - - // Get current encoding -#ifdef USE_TRANSLATION - CFStringRef encStr = CFStringCreateWithCString(NULL, TransMan.getCurrentCharset().c_str(), kCFStringEncodingASCII); - CFStringEncoding stringEncoding = CFStringConvertIANACharSetNameToEncoding(encStr); - CFRelease(encStr); -#else - CFStringEncoding stringEncoding = kCFStringEncodingASCII; -#endif - - // Convert title to NSString - _titleRef = CFStringCreateWithCString(0, title, stringEncoding); - - // Convert button text to NSString - _chooseRef = CFStringCreateWithCString(0, _("Choose"), stringEncoding); -} - -BrowserDialog::~BrowserDialog() { - CFRelease(_titleRef); - CFRelease(_chooseRef); -} - -int BrowserDialog::runModal() { - bool choiceMade = false; - - // If in fullscreen mode, switch to windowed mode - bool wasFullscreen = g_system->getFeatureState(OSystem::kFeatureFullscreenMode); - if (wasFullscreen) { - g_system->beginGFXTransaction(); - g_system->setFeatureState(OSystem::kFeatureFullscreenMode, false); - g_system->endGFXTransaction(); - } - - // Temporarily show the real mouse - CGDisplayShowCursor(kCGDirectMainDisplay); - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSWindow *keyWindow = [[NSApplication sharedApplication] keyWindow]; - - - NSOpenPanel *panel = [NSOpenPanel openPanel]; - [panel setCanChooseFiles:!_isDirBrowser]; - [panel setCanChooseDirectories:_isDirBrowser]; - if (_isDirBrowser) - [panel setTreatsFilePackagesAsDirectories:true]; - [panel setTitle:(NSString *)_titleRef]; - [panel setPrompt:(NSString *)_chooseRef]; - - BrowserDialogPresenter* presenter = [[BrowserDialogPresenter alloc] init]; - [presenter performSelectorOnMainThread:@selector(showOpenPanel:) withObject:panel waitUntilDone:YES]; - if (presenter->_url) { - Common::String filename = [[presenter->_url path] UTF8String]; - _choice = Common::FSNode(filename); - choiceMade = true; - } - [presenter release]; - - [pool release]; - [keyWindow makeKeyAndOrderFront:nil]; - - // While the native macOS file browser is open, any input events (e.g. keypresses) are - // still received by the NSApplication. With SDL backend for example this results in the - // events beeing queued and processed after we return, thus dispatching events that were - // intended for the native file browser. For example: pressing Esc to cancel the native - // macOS file browser would cause the application to quit in addition to closing the - // file browser. To avoid this happening clear all pending events. - g_system->getEventManager()->getEventDispatcher()->clearEvents(); - - // If we were in fullscreen mode, switch back - if (wasFullscreen) { - g_system->beginGFXTransaction(); - g_system->setFeatureState(OSystem::kFeatureFullscreenMode, true); - g_system->endGFXTransaction(); - } - - return choiceMade; -} - -} // End of namespace GUI diff --git a/gui/module.mk b/gui/module.mk index 0218e082b4..87f8dec3b2 100644 --- a/gui/module.mk +++ b/gui/module.mk @@ -2,6 +2,7 @@ MODULE := gui MODULE_OBJS := \ about.o \ + browser.o \ chooser.o \ console.o \ debugger.o \ @@ -38,19 +39,6 @@ MODULE_OBJS := \ widgets/scrollcontainer.o \ widgets/tab.o -ifdef IPHONE -MODULE_OBJS += \ - browser.o -else -ifdef MACOSX -MODULE_OBJS += \ - browser_osx.o -else -MODULE_OBJS += \ - browser.o -endif -endif - ifdef USE_CLOUD ifdef USE_LIBCURL MODULE_OBJS += \ -- cgit v1.2.3