From a1e57aaeafdfdc3f69145f2650eaf148114b484a Mon Sep 17 00:00:00 2001 From: elexis Date: Wed, 2 Dec 2015 13:53:44 +0000 Subject: [PATCH] Replay menu cleanups. Fixes #3440. Hides the summary-button in the replaymenu in case the summary wasn't saved. Corrects the timestamp for incompatible replays. Remove unused UNUSED from header files. Use string8() instead of OsString(). Mention a reported compiler warning. Use const& instead of a copy in StartVisualReplay(). This was SVN commit r17356. --- .../mods/public/gui/replaymenu/replay_menu.js | 5 +++-- source/ps/VisualReplay.cpp | 18 +++++++++++------- source/ps/VisualReplay.h | 7 ++++++- .../ps/scripting/JSInterface_VisualReplay.cpp | 6 ++++++ source/ps/scripting/JSInterface_VisualReplay.h | 7 ++++--- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/binaries/data/mods/public/gui/replaymenu/replay_menu.js b/binaries/data/mods/public/gui/replaymenu/replay_menu.js index e6f21964d1..0ae9ed6056 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_menu.js +++ b/binaries/data/mods/public/gui/replaymenu/replay_menu.js @@ -57,7 +57,7 @@ function loadReplays() for (let replay of g_Replays) { // Use time saved in file, otherwise file mod date - replay.timestamp = replay.attribs.timestamp ? +replay.attribs.timestamp : +replay.filemod_timestamp; + replay.timestamp = replay.attribs.timestamp ? +replay.attribs.timestamp : +replay.filemod_timestamp-replay.duration; // Check replay for compability replay.isCompatible = isReplayCompatible(replay); @@ -187,7 +187,7 @@ function displayReplayDetails() Engine.GetGUIObjectByName("replayInfoEmpty").hidden = replaySelected; Engine.GetGUIObjectByName("startReplayButton").enabled = replaySelected; Engine.GetGUIObjectByName("deleteReplayButton").enabled = replaySelected; - Engine.GetGUIObjectByName("summaryButton").enabled = replaySelected; + Engine.GetGUIObjectByName("summaryButton").hidden = true; if (!replaySelected) return; @@ -204,6 +204,7 @@ function displayReplayDetails() Engine.GetGUIObjectByName("sgPlayersNames").caption = getReplayTeamText(replay); Engine.GetGUIObjectByName("sgMapDescription").caption = mapData.description; Engine.GetGUIObjectByName("sgMapPreview").sprite = "cropped:(0.7812,0.5859)session/icons/mappreview/" + mapData.preview; + Engine.GetGUIObjectByName("summaryButton").hidden = !Engine.HasReplayMetadata(replay.directory); } /** diff --git a/source/ps/VisualReplay.cpp b/source/ps/VisualReplay.cpp index 7cbd34e320..9d0c7f8bc8 100644 --- a/source/ps/VisualReplay.cpp +++ b/source/ps/VisualReplay.cpp @@ -46,7 +46,7 @@ OsPath VisualReplay::GetDirectoryName() return OsPath(psLogDir() / L"sim_log"); } -void VisualReplay::StartVisualReplay(CStrW directory) +void VisualReplay::StartVisualReplay(const CStrW& directory) { ENSURE(!g_NetServer); ENSURE(!g_NetClient); @@ -142,6 +142,7 @@ inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, c return -1; if (debugParser) + // TODO: throws a compiler warning on some systems debug_printf("At position %i of %lu after %i lines reads.\n", currentPosition, fileSize, linesRead); if (!replayStream->good()) @@ -293,23 +294,26 @@ void VisualReplay::SaveReplayMetadata(const CStrW& data) const OsPath fileName = g_Game->GetReplayLogger().GetDirectory() / L"metadata.json"; CreateDirectories(fileName.Parent(), 0700); - std::ofstream stream (OsString(fileName).c_str(), std::ofstream::out | std::ofstream::trunc); + std::ofstream stream (fileName.string8().c_str(), std::ofstream::out | std::ofstream::trunc); stream << utf8_from_wstring(data); stream.close(); } +bool VisualReplay::HasReplayMetadata(const CStrW& directoryName) +{ + return FileExists(GetDirectoryName() / directoryName / L"metadata.json"); +} + JS::Value VisualReplay::GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName) { - const OsPath filePath = GetDirectoryName() / directoryName / L"metadata.json"; + if (!HasReplayMetadata(directoryName)) + return JSVAL_NULL; JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); JSAutoRequest rq(cx); JS::RootedValue metadata(cx); - if (!FileExists(filePath)) - return JSVAL_NULL; - - std::ifstream* stream = new std::ifstream(OsString(filePath).c_str()); + std::ifstream* stream = new std::ifstream(OsPath(GetDirectoryName() / directoryName / L"metadata.json").string8()); ENSURE(stream->good()); CStr line; std::getline(*stream, line); diff --git a/source/ps/VisualReplay.h b/source/ps/VisualReplay.h index bf873fd82a..56b9b8f534 100644 --- a/source/ps/VisualReplay.h +++ b/source/ps/VisualReplay.h @@ -39,7 +39,7 @@ OsPath GetDirectoryName(); /** * Replays the commands.txt file in the given subdirectory visually. */ -void StartVisualReplay(CStrW directory); +void StartVisualReplay(const CStrW& directory); /** * Get a list of replays to display in the GUI. @@ -68,6 +68,11 @@ bool DeleteReplay(const CStrW& replayFile); */ JS::Value GetReplayAttributes(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName); +/** + * Returns whether or not the metadata / summary screen data has been saved properly when the game ended. + */ +bool HasReplayMetadata(const CStrW& directoryName); + /** * Returns the metadata of a replay. */ diff --git a/source/ps/scripting/JSInterface_VisualReplay.cpp b/source/ps/scripting/JSInterface_VisualReplay.cpp index d3ca1797f9..aea7eb76c1 100644 --- a/source/ps/scripting/JSInterface_VisualReplay.cpp +++ b/source/ps/scripting/JSInterface_VisualReplay.cpp @@ -40,6 +40,11 @@ JS::Value JSI_VisualReplay::GetReplayAttributes(ScriptInterface::CxPrivate* pCxP return VisualReplay::GetReplayAttributes(pCxPrivate, directoryName); } +bool JSI_VisualReplay::HasReplayMetadata(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW directoryName) +{ + return VisualReplay::HasReplayMetadata(directoryName); +} + JS::Value JSI_VisualReplay::GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, CStrW directoryName) { return VisualReplay::GetReplayMetadata(pCxPrivate, directoryName); @@ -57,5 +62,6 @@ void JSI_VisualReplay::RegisterScriptFunctions(ScriptInterface& scriptInterface) scriptInterface.RegisterFunction("StartVisualReplay"); scriptInterface.RegisterFunction("GetReplayAttributes"); scriptInterface.RegisterFunction("GetReplayMetadata"); + scriptInterface.RegisterFunction("HasReplayMetadata"); scriptInterface.RegisterFunction("SaveReplayMetadata"); } diff --git a/source/ps/scripting/JSInterface_VisualReplay.h b/source/ps/scripting/JSInterface_VisualReplay.h index a0756e1127..600e9371fc 100644 --- a/source/ps/scripting/JSInterface_VisualReplay.h +++ b/source/ps/scripting/JSInterface_VisualReplay.h @@ -23,12 +23,13 @@ namespace JSI_VisualReplay { - void StartVisualReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW directory); - bool DeleteReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW replayFile); + void StartVisualReplay(ScriptInterface::CxPrivate* pCxPrivate, CStrW directory); + bool DeleteReplay(ScriptInterface::CxPrivate* pCxPrivate, CStrW replayFile); JS::Value GetReplays(ScriptInterface::CxPrivate* pCxPrivate); JS::Value GetReplayAttributes(ScriptInterface::CxPrivate* pCxPrivate, CStrW directoryName); + bool HasReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, CStrW directoryName); JS::Value GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, CStrW directoryName); - void SaveReplayMetadata(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW data); + void SaveReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, CStrW data); void RegisterScriptFunctions(ScriptInterface& scriptInterface); }