about summary refs log tree commit diff
path: root/src/game/client
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2010-09-29 00:53:53 +0200
committeroy <Tom_Adams@web.de>2010-09-29 00:53:53 +0200
commitaaf8e2bc8e02d37fb132c8acd7c2a8fe82c15117 (patch)
treed8898339563b2dbbc4bc55f579c3b180cd1c435f /src/game/client
parentc172c24fd1fbf6a430e1852e62e72f6e0cfeeb63 (diff)
downloadzcatch-aaf8e2bc8e02d37fb132c8acd7c2a8fe82c15117.tar.gz
zcatch-aaf8e2bc8e02d37fb132c8acd7c2a8fe82c15117.zip
cleaned up demo listing and fixed its sorting. Closes #73
Diffstat (limited to 'src/game/client')
-rw-r--r--src/game/client/components/menus.h13
-rw-r--r--src/game/client/components/menus_demo.cpp117
2 files changed, 65 insertions, 65 deletions
diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h
index 2fb53d13..a1e75f61 100644
--- a/src/game/client/components/menus.h
+++ b/src/game/client/components/menus.h
@@ -156,16 +156,23 @@ class CMenus : public CComponent
 	// demo
 	struct CDemoItem
 	{
-		char m_aFilename[512];
-		char m_aName[256];
+		char m_aFilename[128];
+		char m_aName[128];
+		bool m_IsDir;
+		int m_DirType;
 		
-		bool operator<(const CDemoItem &Other) { return str_comp(m_aName, Other.m_aName) < 0; } 
+		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 :
+														str_comp_filenames(m_aFilename, Other.m_aFilename) < 0; }
 	};
 	
 	sorted_array<CDemoItem> m_lDemos;
 	char m_aCurrentDemoFolder[256];
 	bool m_DemolistDelEntry;
+	int m_DemolistSelectedIndex;
+	bool m_DemolistSelectedIsDir;
 	
+	void DemolistOnUpdate(bool Reset);
 	void DemolistPopulate();
 	static void DemolistFetchCallback(const char *pName, int IsDir, int DirType, void *pUser);
 	
diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp
index abe59094..470a2529 100644
--- a/src/game/client/components/menus_demo.cpp
+++ b/src/game/client/components/menus_demo.cpp
@@ -410,61 +410,59 @@ int CMenus::UiDoListboxEnd(float *pScrollValue, bool *pItemActivated)
 
 void CMenus::DemolistFetchCallback(const char *pName, int IsDir, int DirType, void *pUser)
 {
-	if(pName[0] == '.')
-		return;
-	
 	CMenus *pSelf = (CMenus *)pUser;
+	int Length = str_length(pName);
+	if((pName[0] == '.' && (pName[1] == 0 ||
+		(pName[1] == '.' && pName[2] == 0 && !str_comp(pSelf->m_aCurrentDemoFolder, "demos")))) ||
+		(!IsDir && (Length < 5 || str_comp(pName+Length-5, ".demo"))))
+		return;
 	
 	CDemoItem Item;
-	str_format(Item.m_aFilename, sizeof(Item.m_aFilename), "%s%s%s/%s", pSelf->Storage()->GetDirectory(DirType),
-		pSelf->Storage()->GetDirectory(DirType)[0] ? "/" : "", pSelf->m_aCurrentDemoFolder, pName);
-	str_copy(Item.m_aName, pName, sizeof(Item.m_aName));
+	str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename));
+	if(IsDir)
+		str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pName);
+	else
+		str_format(Item.m_aName, min(static_cast<int>(sizeof(Item.m_aName)), Length), "    %s", pName);
+	Item.m_IsDir = IsDir != 0;
+	Item.m_DirType = DirType;
 	pSelf->m_lDemos.add(Item);
 }
 
 void CMenus::DemolistPopulate()
 {
 	m_lDemos.clear();
-	
-	if(str_comp(m_aCurrentDemoFolder, "demos") != 0) //add parent folder
-	{
-		CDemoItem Item;
-		str_copy(Item.m_aName, "..", sizeof(Item.m_aName));
-		str_copy(Item.m_aFilename, "..", sizeof(Item.m_aFilename));
-		m_lDemos.add(Item);
-	}
-	
 	Storage()->ListDirectory(IStorage::TYPE_SAVE|IStorage::TYPE_CURRENT, m_aCurrentDemoFolder, DemolistFetchCallback, this);
 }
 
+void CMenus::DemolistOnUpdate(bool Reset)
+{
+	m_DemolistSelectedIndex = Reset ? m_lDemos.size() > 0 ? 0 : -1 :
+										m_DemolistSelectedIndex >= m_lDemos.size() ? m_lDemos.size()-1 : m_DemolistSelectedIndex;
+	m_DemolistSelectedIsDir = m_DemolistSelectedIndex < 0 ? false : m_lDemos[m_DemolistSelectedIndex].m_IsDir;
+}
 
 void CMenus::RenderDemoList(CUIRect MainView)
 {
-	static int s_SelectedItem = -1;
 	static int s_Inited = 0;
 	if(!s_Inited)
 	{
 		DemolistPopulate();
+		DemolistOnUpdate(true);
 		s_Inited = 1;
-		if(m_lDemos.size() > 0)
-			s_SelectedItem = 0;
-	}
-
-	bool IsDir = false;
-	if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size())
-	{
-		if(str_comp(m_lDemos[s_SelectedItem].m_aName, "..") == 0 || fs_is_dir(m_lDemos[s_SelectedItem].m_aFilename))
-			IsDir = true;
 	}
 
 	// delete demo
 	if(m_DemolistDelEntry)
 	{
-		if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size() && !IsDir)
+		if(m_DemolistSelectedIndex >= 0 && !m_DemolistSelectedIsDir)
 		{
-			Storage()->RemoveFile(m_lDemos[s_SelectedItem].m_aFilename);
+			char aBuf[512];
+			str_format(aBuf, sizeof(aBuf), "%s%s%s/%s", Storage()->GetDirectory(m_lDemos[m_DemolistSelectedIndex].m_DirType),
+				Storage()->GetDirectory(m_lDemos[m_DemolistSelectedIndex].m_DirType)[0] ? "/" : "",
+				m_aCurrentDemoFolder, m_lDemos[m_DemolistSelectedIndex].m_aFilename);
+			Storage()->RemoveFile(aBuf);
 			DemolistPopulate();
-			s_SelectedItem = s_SelectedItem-1 < 0 ? m_lDemos.size() > 0 ? 0 : -1 : s_SelectedItem-1;
+			DemolistOnUpdate(false);
 		}
 		m_DemolistDelEntry = false;
 	}
@@ -473,15 +471,17 @@ void CMenus::RenderDemoList(CUIRect MainView)
 	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
 	MainView.Margin(10.0f, &MainView);
 	
-	CUIRect ButtonBar;
+	CUIRect ButtonBar, RefreshRect, PlayRect, DeleteRect;
 	MainView.HSplitBottom(ms_ButtonHeight+5.0f, &MainView, &ButtonBar);
 	ButtonBar.HSplitTop(5.0f, 0, &ButtonBar);
+	ButtonBar.VSplitRight(130.0f, &ButtonBar, &PlayRect);
+	ButtonBar.VSplitLeft(130.0f, &RefreshRect, &ButtonBar);
+	ButtonBar.VSplitLeft(10.0f, &DeleteRect, &ButtonBar);
+	ButtonBar.VSplitLeft(120.0f, &DeleteRect, &ButtonBar);
 	
 	static int s_DemoListId = 0;
 	static float s_ScrollValue = 0;
-	
-	UiDoListboxStart(&s_DemoListId, &MainView, 17.0f, Localize("Demos"), "", m_lDemos.size(), 1, s_SelectedItem, s_ScrollValue);
-	//for(int i = 0; i < num_demos; i++)
+	UiDoListboxStart(&s_DemoListId, &MainView, 17.0f, Localize("Demos"), "", 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()));
@@ -489,48 +489,41 @@ void CMenus::RenderDemoList(CUIRect MainView)
 			UI()->DoLabel(&Item.m_Rect, r.front().m_aName, Item.m_Rect.h*ms_FontmodHeight, -1);
 	}
 	bool Activated = false;
-	s_SelectedItem = UiDoListboxEnd(&s_ScrollValue, &Activated);
-	
-	CUIRect RefreshRect, PlayRect, DeleteRect;
-	ButtonBar.VSplitRight(130.0f, &ButtonBar, &PlayRect);
-	ButtonBar.VSplitLeft(130.0f, &RefreshRect, &ButtonBar);
-	ButtonBar.VSplitLeft(10.0f, &DeleteRect, &ButtonBar);
-	ButtonBar.VSplitLeft(120.0f, &DeleteRect, &ButtonBar);
+	m_DemolistSelectedIndex = UiDoListboxEnd(&s_ScrollValue, &Activated);
+	DemolistOnUpdate(false);
 	
 	static int s_RefreshButton = 0;
 	if(DoButton_Menu(&s_RefreshButton, Localize("Refresh"), 0, &RefreshRect))
 	{
 		DemolistPopulate();
+		DemolistOnUpdate(false);
 	}
 	
 	static int s_PlayButton = 0;
-	char aTitleButton[10];
-	if(IsDir)
-		str_copy(aTitleButton, Localize("Open"), sizeof(aTitleButton));
-	else
-		str_copy(aTitleButton, Localize("Play"), sizeof(aTitleButton));
-	
-	if(DoButton_Menu(&s_PlayButton, aTitleButton, 0, &PlayRect) || Activated)
+	if(DoButton_Menu(&s_PlayButton, m_DemolistSelectedIsDir?Localize("Open"):Localize("Play"), 0, &PlayRect) || Activated)
 	{
-		if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size())
+		if(m_DemolistSelectedIndex >= 0)
 		{
-			if(str_comp(m_lDemos[s_SelectedItem].m_aName, "..") == 0) //parent folder
-			{
-				fs_parent_dir(m_aCurrentDemoFolder);
-				DemolistPopulate();
-				s_SelectedItem = m_lDemos.size() > 0 ? 0 : -1;
-			}
-			else if(IsDir) //folder
+			if(m_DemolistSelectedIsDir)	// folder
 			{
-				char aTemp[256];
-				str_copy(aTemp, m_aCurrentDemoFolder, sizeof(aTemp));
-				str_format(m_aCurrentDemoFolder, sizeof(m_aCurrentDemoFolder), "%s/%s", aTemp, m_lDemos[s_SelectedItem].m_aName);
+				if(str_comp(m_lDemos[m_DemolistSelectedIndex].m_aFilename, "..") == 0)	// parent folder
+					fs_parent_dir(m_aCurrentDemoFolder);
+				else	// sub folder
+				{
+					char aTemp[256];
+					str_copy(aTemp, m_aCurrentDemoFolder, sizeof(aTemp));
+					str_format(m_aCurrentDemoFolder, sizeof(m_aCurrentDemoFolder), "%s/%s", aTemp, m_lDemos[m_DemolistSelectedIndex].m_aFilename);
+				}
 				DemolistPopulate();
-				s_SelectedItem = m_lDemos.size() > 0 ? 0 : -1;
+				DemolistOnUpdate(true);
 			}
-			else //file
+			else // file
 			{
-				const char *pError = Client()->DemoPlayer_Play(m_lDemos[s_SelectedItem].m_aFilename);
+				char aBuf[512];
+				str_format(aBuf, sizeof(aBuf), "%s%s%s/%s", Storage()->GetDirectory(m_lDemos[m_DemolistSelectedIndex].m_DirType),
+					Storage()->GetDirectory(m_lDemos[m_DemolistSelectedIndex].m_DirType)[0] ? "/" : "",
+					m_aCurrentDemoFolder, m_lDemos[m_DemolistSelectedIndex].m_aFilename);
+				const char *pError = Client()->DemoPlayer_Play(aBuf);
 				if(pError)
 					PopupMessage(Localize("Error"), str_comp(pError, "error loading demo") ? pError : Localize("error loading demo"), Localize("Ok"));
 				else
@@ -542,12 +535,12 @@ void CMenus::RenderDemoList(CUIRect MainView)
 		}
 	}
 	
-	if(!IsDir)
+	if(!m_DemolistSelectedIsDir)
 	{
 		static int s_DeleteButton = 0;
 		if(DoButton_Menu(&s_DeleteButton, Localize("Delete"), 0, &DeleteRect) || m_DeletePressed)
 		{
-			if(s_SelectedItem >= 0 && s_SelectedItem < m_lDemos.size())
+			if(m_DemolistSelectedIndex >= 0)
 			{
 				UI()->SetActiveItem(0);
 				m_Popup = POPUP_DELETE_DEMO;