forked from Mirrors/openclonk
editor: Change FileSelect abstraction to use StdStrBuf
Of course, windows still uses a buffer on the stack, but at least the other versions don't.
parent
05608a3edd
commit
e537296829
|
@ -232,20 +232,20 @@ bool C4Console::FileSave(bool fSaveGame)
|
|||
bool C4Console::FileSaveAs(bool fSaveGame)
|
||||
{
|
||||
// Do save-as dialog
|
||||
char filename[512+1];
|
||||
SCopy(Game.ScenarioFile.GetName(),filename);
|
||||
if (!FileSelect(filename,512,
|
||||
StdStrBuf filename;
|
||||
filename.Copy(Game.ScenarioFile.GetName());
|
||||
if (!FileSelect(&filename,
|
||||
"Clonk 4 Scenario\0*.ocs\0\0",
|
||||
OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
|
||||
true)) return false;
|
||||
DefaultExtension(filename,"ocs");
|
||||
DefaultExtension(&filename,"ocs");
|
||||
bool fOkay=true;
|
||||
// Close current scenario file
|
||||
if (!Game.ScenarioFile.Close()) fOkay=false;
|
||||
// Copy current scenario file to target
|
||||
if (!C4Group_CopyItem(Game.ScenarioFilename,filename)) fOkay=false;
|
||||
if (!C4Group_CopyItem(Game.ScenarioFilename,filename.getData())) fOkay=false;
|
||||
// Open new scenario file
|
||||
SCopy(filename,Game.ScenarioFilename);
|
||||
SCopy(filename.getData(),Game.ScenarioFilename);
|
||||
|
||||
SetCaption(GetFilename(Game.ScenarioFilename));
|
||||
if (!Game.ScenarioFile.Open(Game.ScenarioFilename)) fOkay=false;
|
||||
|
@ -267,40 +267,40 @@ bool C4Console::Message(const char *szMessage, bool fQuery)
|
|||
bool C4Console::FileOpen()
|
||||
{
|
||||
// Get scenario file name
|
||||
char c4sfile[512+1]="";
|
||||
if (!FileSelect(c4sfile,512,
|
||||
StdStrBuf c4sfile ("");
|
||||
if (!FileSelect(&c4sfile,
|
||||
FILE_SELECT_FILTER_FOR_C4S,
|
||||
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST))
|
||||
return false;
|
||||
Application.ClearCommandLine();
|
||||
// Open game
|
||||
Application.OpenGame(c4sfile);
|
||||
Application.OpenGame(c4sfile.getData());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool C4Console::FileOpenWPlrs()
|
||||
{
|
||||
// Get scenario file name
|
||||
char c4sfile[512+1]="";
|
||||
if (!FileSelect(c4sfile,512,
|
||||
StdStrBuf c4sfile ("");
|
||||
if (!FileSelect(&c4sfile,
|
||||
FILE_SELECT_FILTER_FOR_C4S,
|
||||
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST))
|
||||
return false;
|
||||
// Get player file name(s)
|
||||
char c4pfile[4096+1]="";
|
||||
if (!FileSelect(c4pfile,4096,
|
||||
StdStrBuf c4pfile ("");
|
||||
if (!FileSelect(&c4pfile,
|
||||
"Clonk 4 Player\0*.ocp\0\0",
|
||||
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_EXPLORER
|
||||
)) return false;
|
||||
// Compose command line
|
||||
Application.ClearCommandLine();
|
||||
if (DirectoryExists(c4pfile)) // Multiplayer
|
||||
if (DirectoryExists(c4pfile.getData())) // Multiplayer
|
||||
{
|
||||
const char *cptr = c4pfile + SLen(c4pfile) + 1;
|
||||
const char *cptr = c4pfile.getData() + SLen(c4pfile.getData()) + 1;
|
||||
while (*cptr)
|
||||
{
|
||||
char c4pfile2[512 + 1] = "";
|
||||
SAppend(c4pfile, c4pfile2, 512);
|
||||
SAppend(c4pfile.getData(), c4pfile2, 512);
|
||||
SAppend(DirSep, c4pfile2, 512);
|
||||
SAppend(cptr, c4pfile2, 512);
|
||||
SAddModule(Game.PlayerFilenames, c4pfile2);
|
||||
|
@ -309,10 +309,10 @@ bool C4Console::FileOpenWPlrs()
|
|||
}
|
||||
else // Single player
|
||||
{
|
||||
SAddModule(Game.PlayerFilenames, c4pfile);
|
||||
SAddModule(Game.PlayerFilenames, c4pfile.getData());
|
||||
}
|
||||
// Open game
|
||||
Application.OpenGame(c4sfile);
|
||||
Application.OpenGame(c4sfile.getData());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -323,9 +323,9 @@ bool C4Console::FileClose()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool C4Console::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
bool C4Console::FileSelect(StdStrBuf * sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
{
|
||||
return C4ConsoleGUI::FileSelect(sFilename, iSize, szFilter, dwFlags, fSave);
|
||||
return C4ConsoleGUI::FileSelect(sFilename, szFilter, dwFlags, fSave);
|
||||
}
|
||||
|
||||
bool C4Console::FileRecord()
|
||||
|
@ -444,44 +444,31 @@ void C4Console::UpdateMenus()
|
|||
|
||||
void C4Console::PlayerJoin()
|
||||
{
|
||||
|
||||
// Get player file name(s)
|
||||
char c4pfile[4096+1]="";
|
||||
if (!FileSelect(c4pfile,4096,
|
||||
StdStrBuf c4pfile ("");
|
||||
if (!FileSelect(&c4pfile,
|
||||
"Clonk 4 Player\0*.ocp\0\0",
|
||||
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_EXPLORER
|
||||
)) return;
|
||||
|
||||
// Compose player file list
|
||||
char c4plist[6000]="";
|
||||
// Multiple players
|
||||
if (DirectoryExists(c4pfile))
|
||||
if (DirectoryExists(c4pfile.getData()))
|
||||
{
|
||||
const char *cptr = c4pfile+SLen(c4pfile)+1;
|
||||
const char *cptr = c4pfile.getData() + SLen(c4pfile.getData()) + 1;
|
||||
while (*cptr)
|
||||
{
|
||||
SNewSegment(c4plist);
|
||||
SAppend(c4pfile,c4plist); SAppend(DirSep ,c4plist); SAppend(cptr,c4plist);
|
||||
StdStrBuf f;
|
||||
f.Copy(c4pfile.getData());
|
||||
f.AppendBackslash(); f.Append(cptr);
|
||||
cptr += SLen(cptr)+1;
|
||||
::Players.JoinNew(f.getData());
|
||||
}
|
||||
}
|
||||
// Single player
|
||||
else
|
||||
{
|
||||
SAppend(c4pfile,c4plist);
|
||||
::Players.JoinNew(c4pfile.getData());
|
||||
}
|
||||
|
||||
// Join players (via network/ctrl queue)
|
||||
char szPlayerFilename[_MAX_PATH+1];
|
||||
for (int iPar=0; SCopySegment(c4plist,iPar,szPlayerFilename,';',_MAX_PATH); iPar++)
|
||||
if (szPlayerFilename[0])
|
||||
{
|
||||
if (::Network.isEnabled())
|
||||
::Network.Players.JoinLocalPlayer(szPlayerFilename, true);
|
||||
else
|
||||
::Players.CtrlJoinLocalNoNetwork(szPlayerFilename, Game.Clients.getLocalID(), Game.Clients.getLocalName());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void C4Console::UpdateNetMenu()
|
||||
|
@ -583,7 +570,7 @@ CStdWindow * C4ConsoleGUI::CreateConsoleWindow(CStdApp*) {return 0;}
|
|||
void C4ConsoleGUI::DisplayInfoText(C4ConsoleGUI::InfoTextType, StdStrBuf&) {}
|
||||
void C4ConsoleGUI::DoEnableControls(bool) {}
|
||||
bool C4ConsoleGUI::DoUpdateHaltCtrls(bool) {return 0;}
|
||||
bool C4ConsoleGUI::FileSelect(char*, int, char const*, unsigned int, bool) {return 0;}
|
||||
bool C4ConsoleGUI::FileSelect(StdStrBuf *, char const*, unsigned int, bool) {return 0;}
|
||||
bool C4ConsoleGUI::Message(char const*, bool) {return 0;}
|
||||
void C4ConsoleGUI::Out(char const*) {}
|
||||
bool C4ConsoleGUI::PropertyDlgOpen() {return 0;}
|
||||
|
|
|
@ -82,7 +82,7 @@ public:
|
|||
void PlayerJoin();
|
||||
void ViewportNew();
|
||||
void HelpAbout();
|
||||
bool FileSelect(char *sFilename, int iSize, const char *szFilter, DWORD dwFlags, bool fSave=false);
|
||||
bool FileSelect(StdStrBuf *sFilename, const char *szFilter, DWORD dwFlags, bool fSave=false);
|
||||
bool SaveGame(bool fSaveGame);
|
||||
bool FileSaveAs(bool fSaveGame);
|
||||
bool FileSave(bool fSaveGame);
|
||||
|
|
|
@ -118,7 +118,7 @@ void C4ConsoleGUI::SetCaptionToFileName(const char* file_name)
|
|||
[ctrler(this).window setRepresentedFilename:[NSString stringWithUTF8String:file_name]];
|
||||
}
|
||||
|
||||
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
{
|
||||
NSSavePanel* savePanel = fSave ? [NSSavePanel savePanel] : [NSOpenPanel openPanel];
|
||||
if (!fSave)
|
||||
|
@ -128,7 +128,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
|
|||
}
|
||||
if ([savePanel runModal] == NSFileHandlingPanelOKButton && [[savePanel URL] isFileURL])
|
||||
{
|
||||
strncpy(sFilename, [[savePanel URL].path cStringUsingEncoding:NSUTF8StringEncoding], iSize);
|
||||
sFilename->Copy([[savePanel URL].path cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -665,16 +665,16 @@ bool C4ConsoleGUI::UpdateModeCtrls(int iMode)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
{
|
||||
GtkWidget* dialog = gtk_file_chooser_dialog_new(fSave ? "Save file..." : "Load file...", GTK_WINDOW(window), fSave ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, fSave ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
|
||||
|
||||
// TODO: Set dialog modal?
|
||||
|
||||
if (g_path_is_absolute(sFilename) )
|
||||
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sFilename);
|
||||
if (g_path_is_absolute(sFilename->getData()) )
|
||||
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sFilename->getData());
|
||||
else if (fSave)
|
||||
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), sFilename);
|
||||
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), sFilename->getData());
|
||||
|
||||
// Install file filter
|
||||
while (*szFilter)
|
||||
|
@ -749,7 +749,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
|
|||
{
|
||||
// Just the file name without multiselect
|
||||
char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
||||
SCopy(filename, sFilename, iSize);
|
||||
sFilename->Copy(filename);
|
||||
g_free(filename);
|
||||
}
|
||||
else
|
||||
|
@ -757,10 +757,8 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
|
|||
// Otherwise its the folder followed by the file names,
|
||||
// separated by '\0'-bytes
|
||||
char* folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
|
||||
int len = SLen(folder);
|
||||
|
||||
if (iSize > 0) SCopy(folder, sFilename, Min(len + 1, iSize));
|
||||
iSize -= (len + 1); sFilename += (len + 1);
|
||||
sFilename->Copy(folder);
|
||||
g_free(folder);
|
||||
|
||||
GSList* files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
|
||||
|
@ -769,16 +767,14 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
|
|||
const char* file = static_cast<const char*>(item->data);
|
||||
char* basefile = g_path_get_basename(file);
|
||||
|
||||
int len = SLen(basefile);
|
||||
if (iSize > 0) SCopy(basefile, sFilename, Min(len + 1, iSize));
|
||||
iSize -= (len + 1); sFilename += (len + 1);
|
||||
sFilename->AppendChar('\0');
|
||||
sFilename->Append(basefile);
|
||||
|
||||
g_free(basefile);
|
||||
g_free(item->data);
|
||||
}
|
||||
|
||||
// End of list
|
||||
*sFilename = '\0';
|
||||
g_slist_free(files);
|
||||
}
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ public:
|
|||
void DisplayInfoText(InfoTextType type, StdStrBuf& text);
|
||||
void SetCaptionToFileName(const char* file_name);
|
||||
void SetCaption(const char *caption);
|
||||
bool FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave);
|
||||
bool FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave);
|
||||
void AddMenuItemForPlayer(C4Player *player, StdStrBuf& player_text);
|
||||
void AddKickPlayerMenuItem(C4Player *player, StdStrBuf& player_text, bool enabled);
|
||||
void ClearViewportMenu();
|
||||
|
|
|
@ -772,17 +772,18 @@ void C4ConsoleGUI::ShowAboutWithCopyright(StdStrBuf ©right)
|
|||
MessageBoxW(NULL, strMessage.GetWideChar(), ADDL(C4ENGINECAPTION), MB_ICONINFORMATION | MB_TASKMODAL);
|
||||
}
|
||||
|
||||
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
|
||||
{
|
||||
enum { ArbitraryMaximumLength = 4096 };
|
||||
char buffer[ArbitraryMaximumLength];
|
||||
SCopy(sFilename->getData(), buffer, ArbitraryMaximumLength);
|
||||
OPENFILENAME ofn;
|
||||
ZeroMem(&ofn,sizeof(ofn));
|
||||
ofn.lStructSize=sizeof(ofn);
|
||||
ofn.hwndOwner=hWindow;
|
||||
ofn.lpstrFilter=szFilter;
|
||||
ofn.lpstrFile=sFilename;
|
||||
ofn.nMaxFile=iSize;
|
||||
ofn.nFileOffset= GetFilename(sFilename) - sFilename;
|
||||
ofn.nFileExtension= GetExtension(sFilename) - sFilename;
|
||||
ofn.lpstrFile=buffer;
|
||||
ofn.nMaxFile=ArbitraryMaximumLength;
|
||||
ofn.Flags=dwFlags;
|
||||
|
||||
bool fResult;
|
||||
|
@ -794,6 +795,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
|
|||
|
||||
// Reset working directory to exe path as Windows file dialog might have changed it
|
||||
SetCurrentDirectory(wd);
|
||||
sFilename->Copy(buffer);
|
||||
return fResult;
|
||||
}
|
||||
|
||||
|
|
|
@ -319,39 +319,18 @@ C4Player* C4PlayerList::Join(const char *szFilename, bool fScenarioInit, int iAt
|
|||
return pPlr;
|
||||
}
|
||||
|
||||
bool C4PlayerList::CtrlJoinLocalNoNetwork(const char *szFilename, int iAtClient, const char *szAtClientName)
|
||||
// Join players (via network/ctrl queue)
|
||||
void C4PlayerList::JoinNew(const char *szFilename)
|
||||
{
|
||||
assert(!::Network.isEnabled());
|
||||
// Create temp copy of player file without portraits
|
||||
// Why? This is local join!
|
||||
/*
|
||||
char szTempFilename[_MAX_PATH + 1] = "";
|
||||
const char *szOriginalFilename = szFilename;
|
||||
if (!Config.Network.SendPortraits)
|
||||
{
|
||||
SCopy(Config.AtTempPath(GetFilename(szFilename)), szTempFilename, _MAX_PATH);
|
||||
if (!CopyItem(szFilename, szTempFilename)) return false;
|
||||
C4Group hGroup;
|
||||
if (hGroup.Open(szTempFilename))
|
||||
{
|
||||
hGroup.Delete(C4CFN_Portraits, true);
|
||||
hGroup.Close();
|
||||
}
|
||||
szFilename = szTempFilename;
|
||||
} */
|
||||
// pack - not needed for new res system
|
||||
/*if(DirectoryExists(szFilename))
|
||||
if(!C4Group_PackDirectory(szFilename))
|
||||
return false;*/
|
||||
if (::Network.isEnabled())
|
||||
{
|
||||
::Network.Players.JoinLocalPlayer(szFilename, true);
|
||||
return;
|
||||
}
|
||||
// security
|
||||
if (!ItemExists(szFilename)) return false;
|
||||
if (!ItemExists(szFilename)) return;
|
||||
// join via player info
|
||||
bool fSuccess = Game.PlayerInfos.DoLocalNonNetworkPlayerJoin(szFilename);
|
||||
// Delete temp player file
|
||||
/*if(*szTempFilename) EraseItem(szTempFilename);*/
|
||||
|
||||
// Done
|
||||
return fSuccess;
|
||||
Game.PlayerInfos.DoLocalNonNetworkPlayerJoin(szFilename);
|
||||
}
|
||||
|
||||
void SetClientPrefix(char *szFilename, const char *szClient)
|
||||
|
|
|
@ -58,7 +58,7 @@ public:
|
|||
C4Player *GetAtRemoteClient(int iIndex=0) const;
|
||||
C4Player *GetByInfoID(int iInfoID) const;
|
||||
C4Player *Join(const char *szFilename, bool fScenarioInit, int iAtClient, const char *szAtClientName, class C4PlayerInfo *pInfo, C4ValueNumbers *);
|
||||
bool CtrlJoinLocalNoNetwork(const char *szFilename, int iAtClient, const char *szAtClientName);
|
||||
void JoinNew(const char *szFilename);
|
||||
bool CtrlJoin(const class C4Network2ResCore &ResCore, int iClientID, int idPlayerInfo);
|
||||
bool FileInUse(const char *szFilename) const;
|
||||
bool Retire(C4Player *pPlr);
|
||||
|
|
|
@ -709,11 +709,8 @@ bool C4MainMenu::MenuCommand(const char *szCommand, bool fIsCloseCommand)
|
|||
// not in league or replay mode
|
||||
if (Game.Parameters.isLeague() || Game.C4S.Head.Replay) return false;
|
||||
// join player
|
||||
if (::Network.isEnabled())
|
||||
// 2do: not for observers and such?
|
||||
::Network.Players.JoinLocalPlayer(szCommand+11, true);
|
||||
else
|
||||
::Players.CtrlJoinLocalNoNetwork(szCommand+11, Game.Clients.getLocalID(), Game.Clients.getLocalName());
|
||||
// 2do: not for observers and such?
|
||||
Players.JoinNew(szCommand+11);
|
||||
return true;
|
||||
}
|
||||
// SetHostility
|
||||
|
|
Loading…
Reference in New Issue