Restrict file browser UI by file type

This commit is contained in:
elasota
2020-11-12 02:35:07 -05:00
parent 2febed5d2a
commit 66a111dd23
6 changed files with 41 additions and 16 deletions

View File

@@ -99,7 +99,7 @@ Boolean CreateNewHouse (void)
char savePath[sizeof(theSpec.m_name) + 1]; char savePath[sizeof(theSpec.m_name) + 1];
size_t savePathLength = 0; size_t savePathLength = 0;
if (!fm->PromptSaveFile(theSpec.m_dir, savePath, savePathLength, sizeof(theSpec.m_name), PSTR("My House"), PSTR("Create House"), GetHouseDetailsAPI())) if (!fm->PromptSaveFile(theSpec.m_dir, 'gliH', savePath, savePathLength, sizeof(theSpec.m_name), PSTR("My House"), PSTR("Create House"), GetHouseDetailsAPI()))
return false; return false;
assert(savePathLength < sizeof(theSpec.m_name) - 1); assert(savePathLength < sizeof(theSpec.m_name) - 1);

View File

@@ -163,7 +163,7 @@ void SaveGame2 (void)
char savePath[sizeof(spec.m_name) + 1]; char savePath[sizeof(spec.m_name) + 1];
size_t savePathLength = 0; size_t savePathLength = 0;
if (!fm->PromptSaveFile(spec.m_dir, savePath, savePathLength, sizeof(spec.m_name), PLPasStr(gameNameStr), PSTR("Save Game"), GetSavedGameDetailsAPI())) if (!fm->PromptSaveFile(spec.m_dir, 'gliG', savePath, savePathLength, sizeof(spec.m_name), PLPasStr(gameNameStr), PSTR("Save Game"), GetSavedGameDetailsAPI()))
{ {
mm->Release(savedGame); mm->Release(savedGame);
return; return;
@@ -272,7 +272,7 @@ Boolean OpenSavedGame (void)
char savePath[sizeof(spec.m_name) + 1]; char savePath[sizeof(spec.m_name) + 1];
size_t savePathLength = 0; size_t savePathLength = 0;
if (!fm->PromptOpenFile(spec.m_dir, savePath, savePathLength, sizeof(spec.m_name), PSTR("Open Saved Game"), GetSavedGameDetailsAPI())) if (!fm->PromptOpenFile(spec.m_dir, 'gliG', savePath, savePathLength, sizeof(spec.m_name), PSTR("Open Saved Game"), GetSavedGameDetailsAPI()))
return false; return false;
assert(savePathLength < sizeof(spec.m_name) - 1); assert(savePathLength < sizeof(spec.m_name) - 1);

View File

@@ -6,12 +6,14 @@
#include "FontFamily.h" #include "FontFamily.h"
#include "GpApplicationName.h" #include "GpApplicationName.h"
#include "GpBuildVersion.h" #include "GpBuildVersion.h"
#include "GpIOStream.h"
#include "GpRenderedFontMetrics.h" #include "GpRenderedFontMetrics.h"
#include "HostFileSystem.h" #include "HostFileSystem.h"
#include "HostDirectoryCursor.h" #include "HostDirectoryCursor.h"
#include "HostSystemServices.h" #include "HostSystemServices.h"
#include "IGpFont.h" #include "IGpFont.h"
#include "WindowManager.h" #include "WindowManager.h"
#include "MacFileInfo.h"
#include "MemoryManager.h" #include "MemoryManager.h"
#include "PLStandardColors.h" #include "PLStandardColors.h"
#include "RenderedFont.h" #include "RenderedFont.h"
@@ -175,11 +177,11 @@ namespace PortabilityLayer
size_t oldSize = m_entries.MMBlock()->m_size; size_t oldSize = m_entries.MMBlock()->m_size;
if (!mm->ResizeHandle(m_entries.MMBlock(), oldSize + sizeof(FileEntry))) if (!mm->ResizeHandle(m_entries.MMBlock(), oldSize + sizeof(FileEntry)))
return false; return false;
FileEntry &entry = (*m_entries)[m_numEntries++]; FileEntry &entry = (*m_entries)[m_numEntries++];
entry.m_nameStr = NameStr_t(nameLen, name); entry.m_nameStr = NameStr_t(nameLen, name);
entry.m_fileDetails = details; entry.m_fileDetails = details;
return true; return true;
} }
@@ -562,7 +564,7 @@ namespace PortabilityLayer
return hit; return hit;
} }
bool FileBrowserUI::Prompt(Mode mode, VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) bool FileBrowserUI::Prompt(Mode mode, VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI)
{ {
int dialogID = 0; int dialogID = 0;
bool isObstructive = false; bool isObstructive = false;
@@ -607,6 +609,27 @@ namespace PortabilityLayer
if (!memcmp(nameExt, ".gpf", 4)) if (!memcmp(nameExt, ".gpf", 4))
{ {
GpIOStream *metadataStream = fs->OpenFile(dirID, fileName, false, GpFileCreationDispositions::kOpenExisting);
if (!metadataStream)
continue;
MacFilePropertiesSerialized serializedMetadata;
if (metadataStream->Read(&serializedMetadata, sizeof(serializedMetadata)) != sizeof(serializedMetadata))
{
metadataStream->Close();
continue;
}
metadataStream->Close();
MacFileProperties metadata;
serializedMetadata.Deserialize(metadata);
char ftype[4];
fileType.ExportAsChars(ftype);
if (memcmp(metadata.m_fileType, ftype, 4))
continue;
if (!uiImpl.AppendName(fileName, nameLength - 4, callbackAPI.m_loadFileDetailsCallback(dirID, PLPasStr(nameLength - 4, fileName)))) if (!uiImpl.AppendName(fileName, nameLength - 4, callbackAPI.m_loadFileDetailsCallback(dirID, PLPasStr(nameLength - 4, fileName))))
{ {
dirCursor->Destroy(); dirCursor->Destroy();
@@ -779,7 +802,7 @@ namespace PortabilityLayer
outPathLength = uiFileName.Length(); outPathLength = uiFileName.Length();
} }
dialog->Destroy(); dialog->Destroy();
return confirmed; return confirmed;
} }

View File

@@ -11,6 +11,8 @@ struct Rect;
namespace PortabilityLayer namespace PortabilityLayer
{ {
class ResTypeID;
struct FileBrowserUI_DetailsCallbackAPI struct FileBrowserUI_DetailsCallbackAPI
{ {
void(*m_drawLabelsCallback)(DrawSurface *surface, const Point &basePoint); void(*m_drawLabelsCallback)(DrawSurface *surface, const Point &basePoint);
@@ -30,6 +32,6 @@ namespace PortabilityLayer
Mode_Open, Mode_Open,
}; };
static bool Prompt(Mode mode, VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI); static bool Prompt(Mode mode, VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI);
}; };
} }

View File

@@ -35,8 +35,8 @@ namespace PortabilityLayer
PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override; PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override;
PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override; PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override;
bool PromptSaveFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; bool PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override;
bool PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; bool PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override;
static FileManagerImpl *GetInstance(); static FileManagerImpl *GetInstance();
@@ -176,18 +176,18 @@ namespace PortabilityLayer
return RawOpenFileFork(dirID, filename, ".gpa", permission, ignoreMeta, createDisposition, outStream); return RawOpenFileFork(dirID, filename, ".gpa", permission, ignoreMeta, createDisposition, outStream);
} }
bool FileManagerImpl::PromptSaveFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) bool FileManagerImpl::PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI)
{ {
ExtendedFileName_t extFN; ExtendedFileName_t extFN;
if (!ConstructFilename(extFN, initialFileName, "")) if (!ConstructFilename(extFN, initialFileName, ""))
return false; return false;
return FileBrowserUI::Prompt(FileBrowserUI::Mode_Save, dirID, path, outPathLength, pathCapacity, initialFileName, promptText, detailsAPI); return FileBrowserUI::Prompt(FileBrowserUI::Mode_Save, dirID, fileType, path, outPathLength, pathCapacity, initialFileName, promptText, detailsAPI);
} }
bool FileManagerImpl::PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) bool FileManagerImpl::PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI)
{ {
return FileBrowserUI::Prompt(FileBrowserUI::Mode_Open, dirID, path, outPathLength, pathCapacity, PSTR(""), promptText, detailsAPI); return FileBrowserUI::Prompt(FileBrowserUI::Mode_Open, dirID, fileType, path, outPathLength, pathCapacity, PSTR(""), promptText, detailsAPI);
} }
FileManagerImpl *FileManagerImpl::GetInstance() FileManagerImpl *FileManagerImpl::GetInstance()

View File

@@ -36,8 +36,8 @@ namespace PortabilityLayer
virtual PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0; virtual PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0;
virtual PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0; virtual PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0;
virtual bool PromptSaveFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; virtual bool PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0;
virtual bool PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; virtual bool PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0;
static FileManager *GetInstance(); static FileManager *GetInstance();
}; };