2
0
Эх сурвалжийг харах

add slider for displaying skills

Laserlicht 4 сар өмнө
parent
commit
918fbff5ac

+ 15 - 3
client/windows/CHeroWindow.cpp

@@ -28,6 +28,7 @@
 #include "../widgets/CGarrisonInt.h"
 #include "../widgets/TextControls.h"
 #include "../widgets/Buttons.h"
+#include "../widgets/Slider.h"
 #include "../render/IRenderHandler.h"
 
 #include "../lib/CConfigHandler.h"
@@ -148,9 +149,18 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
 	expValue = std::make_shared<CLabel>(68, 252);
 	manaValue = std::make_shared<CLabel>(211, 252);
 
+	if(hero->secSkills.size() > 8)
+	{
+		auto divisionRoundUp = [](int x, int y){ return (x + (y - 1)) / y; };
+		int lines = divisionRoundUp(hero->secSkills.size(), 2);
+		secSkillSlider = std::make_shared<CSlider>(Point(284, 276), 189, [this](int val){ CHeroWindow::update(); }, 4, lines, 0, Orientation::VERTICAL, CSlider::BROWN);
+		secSkillSlider->setPanningStep(48);
+		secSkillSlider->setScrollBounds(Rect(-266, 0, secSkillSlider->pos.x - pos.x + secSkillSlider->pos.w, secSkillSlider->pos.h));
+	}
+
 	for(int i = 0; i < std::min<size_t>(hero->secSkills.size(), 8u); ++i)
 	{
-		Rect r = Rect(i%2 == 0  ?  18  :  162,  276 + 48 * (i/2),  136,  42);
+		Rect r = Rect(i%2 == 0  ?  18  :  162,  276 + 48 * (i/2),  (secSkillSlider && i%2 == 1) ? 120 : 136,  42);
 		secSkills.emplace_back(std::make_shared<CSecSkillPlace>(r.topLeft(), CSecSkillPlace::ImageSize::MEDIUM));
 
 		int x = (i % 2) ? 212 : 68;
@@ -175,6 +185,8 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
 
 void CHeroWindow::update()
 {
+	OBJECT_CONSTRUCTION;
+
 	CWindowWithArtifacts::update();
 	auto & heroscrn = LIBRARY->generaltexth->heroscrn;
 	assert(curHero);
@@ -195,7 +207,6 @@ void CHeroWindow::update()
 	portraitImage->setFrame(curHero->getIconIndex());
 
 	{
-		OBJECT_CONSTRUCTION;
 		if(!garr)
 		{
 			bool removableTroops = curHero->getOwner() == GAME->interface()->playerID;
@@ -235,7 +246,8 @@ void CHeroWindow::update()
 	//secondary skills support
 	for(size_t g=0; g< secSkills.size(); ++g)
 	{
-		SecondarySkill skill = curHero->secSkills[g].first;
+		int offset = secSkillSlider ? secSkillSlider->getValue() * 2 : 0;
+		SecondarySkill skill = curHero->secSkills[g + offset].first;
 		int	level = curHero->getSecSkillLevel(skill);
 		std::string skillName = skill.toEntity(LIBRARY)->getNameTranslated();
 		std::string skillValue = LIBRARY->generaltexth->levels[level-1];

+ 2 - 0
client/windows/CHeroWindow.h

@@ -33,6 +33,7 @@ class CToggleGroup;
 class CGStatusBar;
 class CTextBox;
 class CGarrisonInt;
+class CSlider;
 
 /// Button which switches hero selection
 class CHeroSwitcher : public CIntObject
@@ -77,6 +78,7 @@ class CHeroWindow : public CStatusbarWindow, public IGarrisonHolder, public CWin
 	std::vector< std::shared_ptr<CSecSkillPlace>> secSkills;
 	std::vector<std::shared_ptr<CLabel>> secSkillNames;
 	std::vector<std::shared_ptr<CLabel>> secSkillValues;
+	std::shared_ptr<CSlider> secSkillSlider;
 
 	std::shared_ptr<CButton> quitButton;
 	std::shared_ptr<CTextBox> dismissLabel;