about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-04-06 20:18:31 +0200
committeroy <Tom_Adams@web.de>2011-04-06 20:18:31 +0200
commitb985fdc20ad7c7072bcef0ec58e0c1146f6aa7e0 (patch)
tree852a1ba5435d35fc4eeba8518978029789184d34
parent3fc6e2d2eb8ef4eddd2c9ec56802111a9f8539ea (diff)
downloadzcatch-b985fdc20ad7c7072bcef0ec58e0c1146f6aa7e0.tar.gz
zcatch-b985fdc20ad7c7072bcef0ec58e0c1146f6aa7e0.zip
added new friend/mute buttons by Crises and reworked the player options like Landil suggested. Closes #579
-rw-r--r--data/gui_buttons.pngbin13232 -> 2106 bytes
-rw-r--r--data/gui_icons.pngbin0 -> 7545 bytes
-rw-r--r--datasrc/content.py15
-rw-r--r--src/game/client/components/menus.cpp38
-rw-r--r--src/game/client/components/menus.h3
-rw-r--r--src/game/client/components/menus_ingame.cpp74
6 files changed, 96 insertions, 34 deletions
diff --git a/data/gui_buttons.png b/data/gui_buttons.png
index 3593569f..ea9a701d 100644
--- a/data/gui_buttons.png
+++ b/data/gui_buttons.png
Binary files differdiff --git a/data/gui_icons.png b/data/gui_icons.png
new file mode 100644
index 00000000..61f33841
--- /dev/null
+++ b/data/gui_icons.png
Binary files differdiff --git a/datasrc/content.py b/datasrc/content.py
index 712bba70..31f5092f 100644
--- a/datasrc/content.py
+++ b/datasrc/content.py
@@ -229,6 +229,7 @@ image_emoticons = Image("emoticons", "emoticons.png")
 image_demobuttons = Image("demobuttons", "demo_buttons.png")
 image_fileicons = Image("fileicons", "file_icons.png")
 image_guibuttons = Image("guibuttons", "gui_buttons.png")
+image_guiicons = Image("guiicons", "gui_icons.png")
 
 container.images.Add(image_null)
 container.images.Add(image_game)
@@ -242,6 +243,7 @@ container.images.Add(Image("console_bar", "console_bar.png"))
 container.images.Add(image_demobuttons)
 container.images.Add(image_fileicons)
 container.images.Add(image_guibuttons)
+container.images.Add(image_guiicons)
 
 container.pickups.Add(Pickup("health"))
 container.pickups.Add(Pickup("armor"))
@@ -255,7 +257,8 @@ set_browseicons = SpriteSet("browseicons", image_browseicons, 4, 1)
 set_emoticons = SpriteSet("emoticons", image_emoticons, 4, 4)
 set_demobuttons = SpriteSet("demobuttons", image_demobuttons, 5, 1)
 set_fileicons = SpriteSet("fileicons", image_fileicons, 8, 1)
-set_guibuttons = SpriteSet("guibuttons", image_guibuttons, 16, 2)
+set_guibuttons = SpriteSet("guibuttons", image_guibuttons, 6, 2)
+set_guiicons = SpriteSet("guiicons", image_guiicons, 8, 2)
 
 container.spritesets.Add(set_particles)
 container.spritesets.Add(set_game)
@@ -265,6 +268,7 @@ container.spritesets.Add(set_emoticons)
 container.spritesets.Add(set_demobuttons)
 container.spritesets.Add(set_fileicons)
 container.spritesets.Add(set_guibuttons)
+container.spritesets.Add(set_guiicons)
 
 container.sprites.Add(Sprite("part_slice", set_particles, 0,0,1,1))
 container.sprites.Add(Sprite("part_ball", set_particles, 1,0,1,1))
@@ -387,11 +391,12 @@ container.sprites.Add(Sprite("file_folder", set_fileicons, 2,0,1,1))
 container.sprites.Add(Sprite("file_map1", set_fileicons, 5,0,1,1))
 container.sprites.Add(Sprite("file_map2", set_fileicons, 6,0,1,1))
 
-container.sprites.Add(Sprite("guibutton_chatoff", set_guibuttons, 0,0,4,2))
-container.sprites.Add(Sprite("guibutton_chaton", set_guibuttons, 4,0,4,2))
-container.sprites.Add(Sprite("guibutton_friendadd", set_guibuttons, 8,0,4,2))
-container.sprites.Add(Sprite("guibutton_friendrem", set_guibuttons, 12,0,4,2))
+container.sprites.Add(Sprite("guibutton_off", set_guibuttons, 0,0,2,2))
+container.sprites.Add(Sprite("guibutton_on", set_guibuttons, 2,0,2,2))
+container.sprites.Add(Sprite("guibutton_hover", set_guibuttons, 4,0,2,2))
 
+container.sprites.Add(Sprite("guiicon_mute", set_guiicons, 0,0,4,2))
+container.sprites.Add(Sprite("guiicon_friend", set_guiicons, 4,0,4,2))
 
 anim = Animation("base")
 anim.body.frames.Add(AnimKeyframe(0, 0, -4, 0))
diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp
index d8ddb276..568b3a6e 100644
--- a/src/game/client/components/menus.cpp
+++ b/src/game/client/components/menus.cpp
@@ -92,6 +92,23 @@ int CMenus::DoButton_Icon(int ImageId, int SpriteId, const CUIRect *pRect)
 	return 0;
 }
 
+int CMenus::DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect)
+{
+	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIBUTTONS].m_Id);
+	Graphics()->QuadsBegin();
+	RenderTools()->SelectSprite(Checked?SPRITE_GUIBUTTON_ON:SPRITE_GUIBUTTON_OFF);
+	IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h);
+	Graphics()->QuadsDrawTL(&QuadItem, 1);
+	if((UI()->HotItem() == pID))
+	{
+		RenderTools()->SelectSprite(SPRITE_GUIBUTTON_HOVER);
+		IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h);
+		Graphics()->QuadsDrawTL(&QuadItem, 1);
+	}
+	Graphics()->QuadsEnd();
+	
+	return UI()->DoButtonLogic(pID, "", Checked, pRect);
+}
 
 int CMenus::DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect)
 {
@@ -555,22 +572,23 @@ int CMenus::RenderMenubar(CUIRect r)
 		// online menus
 		Box.VSplitLeft(90.0f, &Button, &Box);
 		static int s_GameButton=0;
-		if(DoButton_MenuTab(&s_GameButton, Localize("Game"), m_ActivePage==PAGE_GAME, &Button, CUI::CORNER_T))
+		if(DoButton_MenuTab(&s_GameButton, Localize("Game"), m_ActivePage==PAGE_GAME, &Button, CUI::CORNER_TL))
 			NewPage = PAGE_GAME;
 
-		Box.VSplitLeft(4.0f, 0, &Box);
-		Box.VSplitLeft(140.0f, &Button, &Box);
+		Box.VSplitLeft(90.0f, &Button, &Box);
+		static int s_PlayersButton=0;
+		if(DoButton_MenuTab(&s_PlayersButton, Localize("Players"), m_ActivePage==PAGE_PLAYERS, &Button, 0))
+			NewPage = PAGE_PLAYERS;
+
+		Box.VSplitLeft(130.0f, &Button, &Box);
 		static int s_ServerInfoButton=0;
-		if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), m_ActivePage==PAGE_SERVER_INFO, &Button, CUI::CORNER_T))
+		if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), m_ActivePage==PAGE_SERVER_INFO, &Button, 0))
 			NewPage = PAGE_SERVER_INFO;
 
-		Box.VSplitLeft(4.0f, 0, &Box);
-		Box.VSplitLeft(140.0f, &Button, &Box);
+		Box.VSplitLeft(130.0f, &Button, &Box);
 		static int s_CallVoteButton=0;
-		if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), m_ActivePage==PAGE_CALLVOTE, &Button, CUI::CORNER_T))
+		if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), m_ActivePage==PAGE_CALLVOTE, &Button, CUI::CORNER_TR))
 			NewPage = PAGE_CALLVOTE;
-			
-		Box.VSplitLeft(30.0f, 0, &Box);
 	}
 		
 	/*
@@ -799,6 +817,8 @@ int CMenus::Render()
 		{
 			if(m_GamePage == PAGE_GAME)
 				RenderGame(MainView);
+			else if(m_GamePage == PAGE_PLAYERS)
+				RenderPlayers(MainView);
 			else if(m_GamePage == PAGE_SERVER_INFO)
 				RenderServerInfo(MainView);
 			else if(m_GamePage == PAGE_CALLVOTE)
diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h
index 758bcd3d..11047a0b 100644
--- a/src/game/client/components/menus.h
+++ b/src/game/client/components/menus.h
@@ -39,6 +39,7 @@ class CMenus : public CComponent
 
 	int DoButton_DemoPlayer(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
 	int DoButton_Sprite(const void *pID, int ImageID, int SpriteID, int Checked, const CUIRect *pRect, int Corners);
+	int DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect);
 	int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
 	int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners);
 
@@ -111,6 +112,7 @@ class CMenus : public CComponent
 	{
 		PAGE_NEWS=1,
 		PAGE_GAME,
+		PAGE_PLAYERS,
 		PAGE_SERVER_INFO,
 		PAGE_CALLVOTE,
 		PAGE_INTERNET,
@@ -215,6 +217,7 @@ class CMenus : public CComponent
 	
 	// found in menus_ingame.cpp
 	void RenderGame(CUIRect MainView);
+	void RenderPlayers(CUIRect MainView);
 	void RenderServerInfo(CUIRect MainView);
 	void RenderServerControl(CUIRect MainView);
 	void RenderServerControlKick(CUIRect MainView, bool FilterSpectators);
diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp
index d3e9933f..254faade 100644
--- a/src/game/client/components/menus_ingame.cpp
+++ b/src/game/client/components/menus_ingame.cpp
@@ -5,6 +5,7 @@
 #include <engine/config.h>
 #include <engine/demo.h>
 #include <engine/friends.h>
+#include <engine/graphics.h>
 #include <engine/serverbrowser.h>
 #include <engine/textrender.h>
 #include <engine/shared/config.h>
@@ -24,11 +25,11 @@
 
 void CMenus::RenderGame(CUIRect MainView)
 {
-	CUIRect Button, ButtonBar, Options;
-	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
+	CUIRect Button, ButtonBar;
+	MainView.HSplitTop(45.0f, &ButtonBar, &MainView);
+	RenderTools()->DrawUIRect(&ButtonBar, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
 	
 	// button bar
-	MainView.HSplitTop(45.0f, &ButtonBar, &MainView);
 	ButtonBar.HSplitTop(10.0f, 0, &ButtonBar);
 	ButtonBar.HSplitTop(25.0f, &ButtonBar, 0);
 	ButtonBar.VMargin(10.0f, &ButtonBar);
@@ -106,6 +107,12 @@ void CMenus::RenderGame(CUIRect MainView)
 		else
 			Client()->DemoRecorder_Stop();
 	}
+}
+
+void CMenus::RenderPlayers(CUIRect MainView)
+{
+	CUIRect Button, ButtonBar, Options, Player;
+	RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
 
 	// player options
 	MainView.Margin(10.0f, &Options);
@@ -114,14 +121,40 @@ void CMenus::RenderGame(CUIRect MainView)
 	Options.HSplitTop(50.0f, &Button, &Options);
 	UI()->DoLabelScaled(&Button, Localize("Player options"), 34.0f, -1);
 
-	CUIRect Player;
-	static int s_aPlayerIDs[MAX_CLIENTS][4] = {{0}};
-	for(int i = 0; i < MAX_CLIENTS; ++i)
+	// headline
+	Options.HSplitTop(34.0f, &ButtonBar, &Options);
+	ButtonBar.VSplitRight(220.0f, &Player, &ButtonBar);
+	UI()->DoLabelScaled(&Player, Localize("Player"), 24.0f, -1);
+
+	ButtonBar.HMargin(1.0f, &ButtonBar);
+	float Width = ButtonBar.h*2.0f;
+	ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
+	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIICONS].m_Id);
+	Graphics()->QuadsBegin();
+	RenderTools()->SelectSprite(SPRITE_GUIICON_MUTE);
+	IGraphics::CQuadItem QuadItem(Button.x, Button.y, Button.w, Button.h);
+	Graphics()->QuadsDrawTL(&QuadItem, 1);
+	Graphics()->QuadsEnd();
+
+	ButtonBar.VSplitLeft(20.0f, 0, &ButtonBar);
+	ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
+	Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIICONS].m_Id);
+	Graphics()->QuadsBegin();
+	RenderTools()->SelectSprite(SPRITE_GUIICON_FRIEND);
+	QuadItem = IGraphics::CQuadItem(Button.x, Button.y, Button.w, Button.h);
+	Graphics()->QuadsDrawTL(&QuadItem, 1);
+	Graphics()->QuadsEnd();
+
+	// options
+	static int s_aPlayerIDs[MAX_CLIENTS][2] = {{0}};
+	for(int i = 0, Count = 0; i < MAX_CLIENTS; ++i)
 	{
 		if(!m_pClient->m_Snap.m_paPlayerInfos[i] || i == m_pClient->m_Snap.m_LocalClientID)
 			continue;
 
 		Options.HSplitTop(28.0f, &ButtonBar, &Options);
+		if(Count++%2 == 0)
+			RenderTools()->DrawUIRect(&ButtonBar, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 10.0f);
 		ButtonBar.VSplitRight(220.0f, &Player, &ButtonBar);
 
 		// player info
@@ -142,22 +175,23 @@ void CMenus::RenderGame(CUIRect MainView)
 		TextRender()->TextEx(&Cursor, m_pClient->m_aClients[i].m_aClan, -1);
 
 		// ignore button
-		ButtonBar.HMargin(1.0f, &ButtonBar);
-		ButtonBar.VSplitLeft(ButtonBar.h*2.0f, &Button, &ButtonBar);
-		if(DoButton_Sprite(&s_aPlayerIDs[i][0], IMAGE_GUIBUTTONS, SPRITE_GUIBUTTON_CHATON, !m_pClient->m_aClients[i].m_ChatIgnore, &Button,  CUI::CORNER_L))
-			m_pClient->m_aClients[i].m_ChatIgnore = 0;
-		ButtonBar.VSplitLeft(ButtonBar.h*2.0f, &Button, &ButtonBar);
-		if(DoButton_Sprite(&s_aPlayerIDs[i][1], IMAGE_GUIBUTTONS, SPRITE_GUIBUTTON_CHATOFF, m_pClient->m_aClients[i].m_ChatIgnore, &Button,  CUI::CORNER_R))
-			m_pClient->m_aClients[i].m_ChatIgnore = 1;
+		ButtonBar.HMargin(2.0f, &ButtonBar);
+		ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
+		Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button);
+		Button.VSplitLeft(Button.h, &Button, 0);
+		if(DoButton_Toggle(&s_aPlayerIDs[i][0], m_pClient->m_aClients[i].m_ChatIgnore, &Button))
+			m_pClient->m_aClients[i].m_ChatIgnore ^= 1;
 
 		// friend button
-		ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar);
-		ButtonBar.VSplitLeft(ButtonBar.h*2.0f, &Button, &ButtonBar);
-		if(DoButton_Sprite(&s_aPlayerIDs[i][2], IMAGE_GUIBUTTONS, SPRITE_GUIBUTTON_FRIENDREM, !m_pClient->m_aClients[i].m_Friend, &Button,  CUI::CORNER_L))
-			m_pClient->Friends()->RemoveFriend(m_pClient->m_aClients[i].m_aName, m_pClient->m_aClients[i].m_aClan);
-		ButtonBar.VSplitLeft(ButtonBar.h*2.0f, &Button, &ButtonBar);
-		if(DoButton_Sprite(&s_aPlayerIDs[i][3], IMAGE_GUIBUTTONS, SPRITE_GUIBUTTON_FRIENDADD, m_pClient->m_aClients[i].m_Friend, &Button,  CUI::CORNER_R))
-			m_pClient->Friends()->AddFriend(m_pClient->m_aClients[i].m_aName, m_pClient->m_aClients[i].m_aClan);
+		ButtonBar.VSplitLeft(20.0f, &Button, &ButtonBar);
+		ButtonBar.VSplitLeft(Width, &Button, &ButtonBar);
+		Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button);
+		Button.VSplitLeft(Button.h, &Button, 0);
+		if(DoButton_Toggle(&s_aPlayerIDs[i][1], m_pClient->m_aClients[i].m_Friend, &Button))
+			if(m_pClient->m_aClients[i].m_Friend)
+				m_pClient->Friends()->RemoveFriend(m_pClient->m_aClients[i].m_aName, m_pClient->m_aClients[i].m_aClan);
+			else
+				m_pClient->Friends()->AddFriend(m_pClient->m_aClients[i].m_aName, m_pClient->m_aClients[i].m_aClan);
 	}
 	
 	/*