diff options
| -rw-r--r-- | src/engine/demo.h | 1 | ||||
| -rw-r--r-- | src/engine/shared/demo.cpp | 19 | ||||
| -rw-r--r-- | src/engine/shared/demo.h | 1 | ||||
| -rw-r--r-- | src/game/client/components/menus.h | 2 | ||||
| -rw-r--r-- | src/game/client/components/menus_demo.cpp | 27 |
5 files changed, 48 insertions, 2 deletions
diff --git a/src/engine/demo.h b/src/engine/demo.h index e0cad387..e901de36 100644 --- a/src/engine/demo.h +++ b/src/engine/demo.h @@ -25,6 +25,7 @@ public: virtual void Unpause() = 0; virtual const CInfo *BaseInfo() const = 0; virtual char *GetDemoName() = 0; + virtual bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, char *pMap, int BufferSize) const = 0; }; class IDemoRecorder : public IInterface diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 4ae4a4c5..5d82d1c0 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -742,3 +742,22 @@ char *CDemoPlayer::GetDemoName() return pDemoShortName; } +bool CDemoPlayer::GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, char *pMap, int BufferSize) const +{ + IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); + if(!File) + return false; + + CDemoHeader Header; + io_read(File, &Header, sizeof(Header)); + if(mem_comp(Header.m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) != 0) + { + io_close(File); + return false; + } + + str_copy(pMap, Header.m_aMap, BufferSize); + + io_close(File); + return true; +} diff --git a/src/engine/shared/demo.h b/src/engine/shared/demo.h index 9d510542..be643371 100644 --- a/src/engine/shared/demo.h +++ b/src/engine/shared/demo.h @@ -112,6 +112,7 @@ public: int SetPos(float Precent); const CInfo *BaseInfo() const { return &m_Info.m_Info; } char *GetDemoName(); + bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, char *pMap, int BufferSize) const; int Update(); diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 7ab03b81..3d11cf91 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -160,6 +160,8 @@ class CMenus : public CComponent char m_aName[128]; bool m_IsDir; int m_StorageType; + bool m_Valid; + char m_aMap[64]; bool operator<(const CDemoItem &Other) { return !str_comp(m_aFilename, "..") ? true : !str_comp(Other.m_aFilename, "..") ? false : m_IsDir && !Other.m_IsDir ? true : !m_IsDir && Other.m_IsDir ? false : diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 9a8a7706..20aee00f 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -429,9 +429,19 @@ void CMenus::DemolistFetchCallback(const char *pName, int IsDir, int StorageType CDemoItem Item; str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename)); if(IsDir) + { str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pName); + Item.m_aMap[0] = 0; + Item.m_Valid = false; + } else + { str_format(Item.m_aName, min(static_cast<int>(sizeof(Item.m_aName)), Length), " %s", pName); + char aBuffer[512]; + str_format(aBuffer, sizeof(aBuffer), "%s/%s", pSelf->m_aCurrentDemoFolder, Item.m_aFilename); + // TODO: many items slow this down, don't load the info from every file when making the filelist + Item.m_Valid = pSelf->DemoPlayer()->GetDemoInfo(pSelf->Storage(), aBuffer, StorageType, Item.m_aMap, sizeof(Item.m_aMap)); + } Item.m_IsDir = IsDir != 0; Item.m_StorageType = StorageType; pSelf->m_lDemos.add(Item); @@ -475,6 +485,19 @@ void CMenus::RenderDemoList(CUIRect MainView) } m_DemolistDelEntry = false; } + + char aFooterLabel[128] = {0}; + if(m_DemolistSelectedIndex >= 0) + { + if(str_comp(m_lDemos[m_DemolistSelectedIndex].m_aFilename, "..") == 0) + str_copy(aFooterLabel, Localize("Parent Folder"), sizeof(aFooterLabel)); + else if(m_DemolistSelectedIsDir) + str_copy(aFooterLabel, Localize("Folder"), sizeof(aFooterLabel)); + else if(!m_lDemos[m_DemolistSelectedIndex].m_Valid) + str_copy(aFooterLabel, Localize("Invalid Demo"), sizeof(aFooterLabel)); + else + str_format(aFooterLabel, sizeof(aFooterLabel), "%s: %s", Localize("Map"), m_lDemos[m_DemolistSelectedIndex].m_aMap); + } // render background RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); @@ -490,7 +513,7 @@ void CMenus::RenderDemoList(CUIRect MainView) static int s_DemoListId = 0; static float s_ScrollValue = 0; - UiDoListboxStart(&s_DemoListId, &MainView, 17.0f, Localize("Demos"), "", m_lDemos.size(), 1, m_DemolistSelectedIndex, s_ScrollValue); + UiDoListboxStart(&s_DemoListId, &MainView, 17.0f, Localize("Demos"), aFooterLabel, m_lDemos.size(), 1, m_DemolistSelectedIndex, s_ScrollValue); for(sorted_array<CDemoItem>::range r = m_lDemos.all(); !r.empty(); r.pop_front()) { CListboxItem Item = UiDoListboxNextItem((void*)(&r.front())); @@ -507,7 +530,7 @@ void CMenus::RenderDemoList(CUIRect MainView) DemolistPopulate(); DemolistOnUpdate(false); } - + static int s_PlayButton = 0; if(DoButton_Menu(&s_PlayButton, m_DemolistSelectedIsDir?Localize("Open"):Localize("Play"), 0, &PlayRect) || Activated) { |