Pārlūkot izejas kodu

Fix not responding statusbar

Dydzio 7 gadi atpakaļ
vecāks
revīzija
22ce535a2a

+ 6 - 6
client/windows/CCastleInterface.cpp

@@ -1096,7 +1096,7 @@ void CTownInfo::clickRight(tribool down, bool previousState)
 }
 
 CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInstance * from):
-	CWindowObject(PLAYER_COLORED | BORDERED),
+	CStatusbarWindow(PLAYER_COLORED | BORDERED),
 	town(Town)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1316,7 +1316,7 @@ void CHallInterface::CBuildingBox::clickRight(tribool down, bool previousState)
 }
 
 CHallInterface::CHallInterface(const CGTownInstance * Town):
-	CWindowObject(PLAYER_COLORED | BORDERED, Town->town->clientInfo.hallBackground),
+	CStatusbarWindow(PLAYER_COLORED | BORDERED, Town->town->clientInfo.hallBackground),
 	town(Town)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1365,7 +1365,7 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
 }
 
 CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Building, int state, bool rightClick):
-	CWindowObject(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), "TPUBUILD"),
+	CStatusbarWindow(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), "TPUBUILD"),
 	town(Town),
 	building(Building)
 {
@@ -1494,7 +1494,7 @@ void LabeledValue::hover(bool on)
 }
 
 CFortScreen::CFortScreen(const CGTownInstance * town):
-	CWindowObject(PLAYER_COLORED | BORDERED, getBgName(town))
+	CStatusbarWindow(PLAYER_COLORED | BORDERED, getBgName(town))
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 	ui32 fortSize = town->creatures.size();
@@ -1678,7 +1678,7 @@ void CFortScreen::RecruitArea::clickRight(tribool down, bool previousState)
 }
 
 CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner,std::string imagem)
-	: CWindowObject(BORDERED, imagem)
+	: CStatusbarWindow(BORDERED, imagem)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 
@@ -1750,7 +1750,7 @@ void CMageGuildScreen::Scroll::hover(bool on)
 }
 
 CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid):
-	CWindowObject(PLAYER_COLORED, "TPSMITH")
+	CStatusbarWindow(PLAYER_COLORED, "TPSMITH")
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 

+ 6 - 12
client/windows/CCastleInterface.h

@@ -195,7 +195,7 @@ public:
 };
 
 /// Class which manages the castle window
-class CCastleInterface : public CWindowObject, public CGarrisonHolder
+class CCastleInterface : public CStatusbarWindow, public CGarrisonHolder
 {
 	std::shared_ptr<CLabel> title;
 	std::shared_ptr<CLabel> income;
@@ -203,7 +203,6 @@ class CCastleInterface : public CWindowObject, public CGarrisonHolder
 
 	std::shared_ptr<CPicture> panel;
 	std::shared_ptr<CResDataBar> resdatabar;
-	std::shared_ptr<CGStatusBar> statusbar;
 
 	std::shared_ptr<CTownInfo> hall;
 	std::shared_ptr<CTownInfo> fort;
@@ -240,7 +239,7 @@ public:
 };
 
 /// Hall window where you can build things
-class CHallInterface : public CWindowObject
+class CHallInterface : public CStatusbarWindow
 {
 	class CBuildingBox : public CIntObject
 	{
@@ -264,7 +263,6 @@ class CHallInterface : public CWindowObject
 	std::vector<std::vector<std::shared_ptr<CBuildingBox>>> boxes;
 	std::shared_ptr<CLabel> title;
 	std::shared_ptr<CMinorResDataBar> resdatabar;
-	std::shared_ptr<CGStatusBar> statusbar;
 	std::shared_ptr<CButton> exit;
 
 public:
@@ -272,13 +270,12 @@ public:
 };
 
 ///  Window where you can decide to buy a building or not
-class CBuildWindow: public CWindowObject
+class CBuildWindow: public CStatusbarWindow
 {
 	const CGTownInstance * town;
 	const CBuilding * building;
 
 	std::shared_ptr<CAnimImage> icon;
-	std::shared_ptr<CGStatusBar> statusbar;
 	std::shared_ptr<CLabel> name;
 	std::shared_ptr<CTextBox> description;
 	std::shared_ptr<CTextBox> stateText;
@@ -308,7 +305,7 @@ public:
 };
 
 /// The fort screen where you can afford units
-class CFortScreen : public CWindowObject
+class CFortScreen : public CStatusbarWindow
 {
 	class RecruitArea : public CIntObject
 	{
@@ -336,7 +333,6 @@ class CFortScreen : public CWindowObject
 	std::shared_ptr<CLabel> title;
 	std::vector<std::shared_ptr<RecruitArea>> recAreas;
 	std::shared_ptr<CMinorResDataBar> resdatabar;
-	std::shared_ptr<CGStatusBar> statusbar;
 	std::shared_ptr<CButton> exit;
 
 	std::string getBgName(const CGTownInstance * town);
@@ -348,7 +344,7 @@ public:
 };
 
 /// The mage guild screen where you can see which spells you have
-class CMageGuildScreen : public CWindowObject
+class CMageGuildScreen : public CStatusbarWindow
 {
 	class Scroll : public CIntObject
 	{
@@ -367,14 +363,13 @@ class CMageGuildScreen : public CWindowObject
 	std::vector<std::shared_ptr<CAnimImage>> emptyScrolls;
 
 	std::shared_ptr<CMinorResDataBar> resdatabar;
-	std::shared_ptr<CGStatusBar> statusbar;
 
 public:
 	CMageGuildScreen(CCastleInterface * owner,std::string image);
 };
 
 /// The blacksmith window where you can buy available in town war machine
-class CBlacksmithDialog : public CWindowObject
+class CBlacksmithDialog : public CStatusbarWindow
 {
 	std::shared_ptr<CButton> buy;
 	std::shared_ptr<CButton> cancel;
@@ -384,7 +379,6 @@ class CBlacksmithDialog : public CWindowObject
 	std::shared_ptr<CAnimImage> costIcon;
 	std::shared_ptr<CLabel> costText;
 	std::shared_ptr<CLabel> costValue;
-	std::shared_ptr<CGStatusBar> statusbar;
 
 public:
 	CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid);

+ 14 - 0
client/windows/CWindowObject.cpp

@@ -238,3 +238,17 @@ void CWindowObject::clickRight(tribool down, bool previousState)
 	close();
 	CCS->curh->show();
 }
+
+CStatusbarWindow::CStatusbarWindow(int options, std::string imageName, Point centerAt) : CWindowObject(options, imageName, centerAt)
+{
+}
+
+CStatusbarWindow::CStatusbarWindow(int options, std::string imageName) : CWindowObject(options, imageName)
+{
+}
+
+void CStatusbarWindow::activate()
+{
+	CIntObject::activate();
+	GH.statusbar = statusbar;
+}

+ 12 - 0
client/windows/CWindowObject.h

@@ -11,6 +11,8 @@
 
 #include "../gui/CIntObject.h"
 
+class CGStatusBar;
+
 class CWindowObject : public WindowBase
 {
 	std::shared_ptr<CPicture> createBg(std::string imageName, bool playerColored);
@@ -50,3 +52,13 @@ public:
 
 	void showAll(SDL_Surface * to) override;
 };
+
+class CStatusbarWindow : public CWindowObject
+{
+public:
+	CStatusbarWindow(int options, std::string imageName, Point centerAt);
+	CStatusbarWindow(int options, std::string imageName = "");
+	void activate() override;
+protected:
+	std::shared_ptr<CGStatusBar> statusbar;
+};

+ 18 - 18
client/windows/GUIClasses.cpp

@@ -194,7 +194,7 @@ void CRecruitmentWindow::showAll(SDL_Surface * to)
 }
 
 CRecruitmentWindow::CRecruitmentWindow(const CGDwelling * Dwelling, int Level, const CArmedInstance * Dst, const std::function<void(CreatureID,int)> & Recruit, int y_offset):
-	CWindowObject(PLAYER_COLORED, "TPRCRT"),
+	CStatusbarWindow(PLAYER_COLORED, "TPRCRT"),
 	onRecruit(Recruit),
 	level(Level),
 	dst(Dst),
@@ -205,7 +205,7 @@ CRecruitmentWindow::CRecruitmentWindow(const CGDwelling * Dwelling, int Level, c
 
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	slider = std::make_shared<CSlider>(Point(176,279),135,std::bind(&CRecruitmentWindow::sliderMoved,this, _1),0,0,0,true);
 
@@ -630,7 +630,7 @@ void CSystemOptionsWindow::closeAndPushEvent(int eventType, int code)
 }
 
 CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj)
-	: CWindowObject(PLAYER_COLORED, "TPTAVERN"),
+	: CStatusbarWindow(PLAYER_COLORED, "TPTAVERN"),
 	tavernObj(TavernObj)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -656,7 +656,7 @@ CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj)
 	auto rumorText = boost::str(boost::format(CGI->generaltexth->allTexts[216]) % LOCPLINT->cb->getTavernRumor(tavernObj));
 	rumor = std::make_shared<CTextBox>(rumorText, Rect(32, 190, 330, 68), 0, FONT_SMALL, CENTER, Colors::WHITE);
 
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 	cancel = std::make_shared<CButton>(Point(310, 428), "ICANCEL.DEF", CButton::tooltip(CGI->generaltexth->tavernInfo[7]), std::bind(&CTavernWindow::close, this), SDLK_ESCAPE);
 	recruit = std::make_shared<CButton>(Point(272, 355), "TPTAV01.DEF", CButton::tooltip(), std::bind(&CTavernWindow::recruitb, this), SDLK_RETURN);
 	thiefGuild = std::make_shared<CButton>(Point(22, 428), "TPTAV02.DEF", CButton::tooltip(CGI->generaltexth->tavernInfo[5]), std::bind(&CTavernWindow::thievesguildb, this), SDLK_t);
@@ -788,7 +788,7 @@ void CTavernWindow::HeroPortrait::hover(bool on)
 }
 
 CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID queryID)
-	: CWindowObject(PLAYER_COLORED | BORDERED, "TRADE2")
+	: CStatusbarWindow(PLAYER_COLORED | BORDERED, "TRADE2")
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 
@@ -920,7 +920,7 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 	questlogButton[1] = std::make_shared<CButton>(Point(740, 44), "hsbtns4.def", CButton::tooltip(CGI->generaltexth->heroscrn[0]), std::bind(&CExchangeWindow::questlog, this, 1));
 
 	Rect barRect(5, 578, 725, 18);
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, barRect, 5, 578, false));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, barRect, 5, 578, false));
 
 	//garrison interface
 	garr = std::make_shared<CGarrisonInt>(69, 131, 4, Point(418,0), heroInst[0], heroInst[1], true, true);
@@ -978,7 +978,7 @@ void CExchangeWindow::updateWidgets()
 }
 
 CShipyardWindow::CShipyardWindow(const std::vector<si32> & cost, int state, int boatType, const std::function<void()> & onBuy)
-	: CWindowObject(PLAYER_COLORED, "TPSHIP")
+	: CStatusbarWindow(PLAYER_COLORED, "TPSHIP")
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
 
@@ -1013,7 +1013,7 @@ CShipyardWindow::CShipyardWindow(const std::vector<si32> & cost, int state, int
 		}
 	}
 
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	title = std::make_shared<CLabel>(164, 27,  FONT_BIG, CENTER, Colors::YELLOW, CGI->generaltexth->jktexts[13]);
 	costLabel = std::make_shared<CLabel>(164, 220, FONT_MEDIUM, CENTER, Colors::WHITE, CGI->generaltexth->jktexts[14]);
@@ -1159,7 +1159,7 @@ void CTransformerWindow::updateGarrisons()
 }
 
 CTransformerWindow::CTransformerWindow(const CGHeroInstance * _hero, const CGTownInstance * _town)
-	: CWindowObject(PLAYER_COLORED, "SKTRNBK"),
+	: CStatusbarWindow(PLAYER_COLORED, "SKTRNBK"),
 	hero(_hero),
 	town(_town)
 {
@@ -1178,7 +1178,7 @@ CTransformerWindow::CTransformerWindow(const CGHeroInstance * _hero, const CGTow
 	all = std::make_shared<CButton>(Point(146, 416), "ALTARMY.DEF", CGI->generaltexth->zelp[590], [&](){ addAll(); }, SDLK_a);
 	convert = std::make_shared<CButton>(Point(269, 416), "ALTSACR.DEF", CGI->generaltexth->zelp[591], [&](){ makeDeal(); }, SDLK_RETURN);
 	cancel = std::make_shared<CButton>(Point(392, 416), "ICANCEL.DEF", CGI->generaltexth->zelp[592], [&](){ close(); },SDLK_ESCAPE);
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	titleLeft = std::make_shared<CLabel>(153, 29,FONT_SMALL, CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[485]);//holding area
 	titleRight = std::make_shared<CLabel>(153+295, 29, FONT_SMALL, CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[486]);//transformer
@@ -1254,7 +1254,7 @@ void CUniversityWindow::CItem::showAll(SDL_Surface * to)
 }
 
 CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket * _market)
-	: CWindowObject(PLAYER_COLORED, "UNIVERS1"),
+	: CStatusbarWindow(PLAYER_COLORED, "UNIVERS1"),
 	hero(_hero),
 	market(_market)
 {
@@ -1283,7 +1283,7 @@ CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket
 		items.push_back(std::make_shared<CItem>(this, goods[i], 54+i*104, 234));
 
 	cancel = std::make_shared<CButton>(Point(200, 313), "IOKAY.DEF", CGI->generaltexth->zelp[632], [&](){ close(); }, SDLK_RETURN);
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 }
 
 void CUniversityWindow::makeDeal(int skill)
@@ -1293,7 +1293,7 @@ void CUniversityWindow::makeDeal(int skill)
 
 
 CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, int SKILL, bool available)
-	: CWindowObject(PLAYER_COLORED, "UNIVERS2.PCX"),
+	: CStatusbarWindow(PLAYER_COLORED, "UNIVERS2.PCX"),
 	owner(owner_)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1324,7 +1324,7 @@ CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, int SKILL, bo
 	confirm->block(!available);
 
 	cancel = std::make_shared<CButton>(Point(252,299), "ICANCEL.DEF", CGI->generaltexth->zelp[631], [&](){ close(); }, SDLK_ESCAPE);
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 }
 
 void CUnivConfirmWindow::makeDeal(int skill)
@@ -1375,7 +1375,7 @@ void CGarrisonWindow::updateGarrisons()
 }
 
 CHillFortWindow::CHillFortWindow(const CGHeroInstance * visitor, const CGObjectInstance * object)
-	: CWindowObject(PLAYER_COLORED, "APHLFTBK"),
+	: CStatusbarWindow(PLAYER_COLORED, "APHLFTBK"),
 	fort(object),
 	hero(visitor)
 {
@@ -1409,7 +1409,7 @@ CHillFortWindow::CHillFortWindow(const CGHeroInstance * visitor, const CGObjectI
 		upgradeAll->addImage(image);
 
 	quit = std::make_shared<CButton>(Point(294, 275), "IOKAY.DEF", CButton::tooltip(), std::bind(&CHillFortWindow::close, this), SDLK_RETURN);
-	statusBar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
+	statusbar = CGStatusBar::create(std::make_shared<CPicture>(*background, Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
 
 	garr = std::make_shared<CGarrisonInt>(108, 60, 18, Point(), hero, nullptr);
 	updateGarrisons();
@@ -1579,7 +1579,7 @@ int CHillFortWindow::getState(SlotID slot)
 }
 
 CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner):
-	CWindowObject(PLAYER_COLORED | BORDERED, "TpRank"),
+	CStatusbarWindow(PLAYER_COLORED | BORDERED, "TpRank"),
 	owner(_owner)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1590,7 +1590,7 @@ CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner):
 
 	exitb = std::make_shared<CButton>(Point(748, 556), "TPMAGE1", CButton::tooltip(CGI->generaltexth->allTexts[600]), [&](){ close();}, SDLK_RETURN);
 	exitb->assignedKeys.insert(SDLK_ESCAPE);
-	statusBar = CGStatusBar::create(3, 555, "TStatBar.bmp", 742);
+	statusbar = CGStatusBar::create(3, 555, "TStatBar.bmp", 742);
 
 	resdatabar = std::make_shared<CMinorResDataBar>();
 	resdatabar->moveBy(pos.topLeft(), true);

+ 9 - 20
client/windows/GUIClasses.h

@@ -38,7 +38,7 @@ class CResDataBar;
 class CHeroWithMaybePickedArtifact;
 
 /// Recruitment window where you can recruit creatures
-class CRecruitmentWindow : public CWindowObject
+class CRecruitmentWindow : public CStatusbarWindow
 {
 	class CCreatureCard : public CIntObject, public std::enable_shared_from_this<CCreatureCard>
 	{
@@ -64,8 +64,6 @@ class CRecruitmentWindow : public CWindowObject
 	int level;
 	const CArmedInstance * dst;
 
-	std::shared_ptr<CGStatusBar> statusBar;
-
 	std::shared_ptr<CCreatureCard> selected;
 	std::vector<std::shared_ptr<CCreatureCard>> cards;
 
@@ -235,7 +233,7 @@ public:
 	CSystemOptionsWindow();
 };
 
-class CTavernWindow : public CWindowObject
+class CTavernWindow : public CStatusbarWindow
 {
 public:
 	class HeroPortrait : public CIntObject
@@ -273,7 +271,6 @@ public:
 	std::shared_ptr<CLabel> title;
 	std::shared_ptr<CLabel> cost;
 	std::shared_ptr<CTextBox> rumor;
-	std::shared_ptr<CGStatusBar> statusBar;
 
 	CTavernWindow(const CGObjectInstance * TavernObj);
 	~CTavernWindow();
@@ -283,7 +280,7 @@ public:
 	void show(SDL_Surface * to) override;
 };
 
-class CExchangeWindow : public CWindowObject, public CGarrisonHolder, public CWindowWithArtifacts
+class CExchangeWindow : public CStatusbarWindow, public CGarrisonHolder, public CWindowWithArtifacts
 {
 	std::array<std::shared_ptr<CHeroWithMaybePickedArtifact>, 2> herosWArt;
 
@@ -312,7 +309,6 @@ class CExchangeWindow : public CWindowObject, public CGarrisonHolder, public CWi
 	std::shared_ptr<CButton> quit;
 	std::array<std::shared_ptr<CButton>, 2> questlogButton;
 
-	std::shared_ptr<CGStatusBar> statusBar;
 	std::shared_ptr<CGarrisonInt> garr;
 
 public:
@@ -330,7 +326,7 @@ public:
 };
 
 /// Here you can buy ships
-class CShipyardWindow : public CWindowObject
+class CShipyardWindow : public CStatusbarWindow
 {
 	std::shared_ptr<CPicture> bgWater;
 	std::shared_ptr<CAnimImage> bgShip;
@@ -346,7 +342,6 @@ class CShipyardWindow : public CWindowObject
 	std::shared_ptr<CButton> build;
 	std::shared_ptr<CButton> quit;
 
-	std::shared_ptr<CGStatusBar> statusBar;
 public:
 	CShipyardWindow(const std::vector<si32> & cost, int state, int boatType, const std::function<void()> & onBuy);
 };
@@ -373,7 +368,7 @@ public:
 };
 
 /// Creature transformer window
-class CTransformerWindow : public CWindowObject, public CGarrisonHolder
+class CTransformerWindow : public CStatusbarWindow, public CGarrisonHolder
 {
 	class CItem : public CIntObject
 	{
@@ -405,7 +400,6 @@ class CTransformerWindow : public CWindowObject, public CGarrisonHolder
 	std::shared_ptr<CButton> all;
 	std::shared_ptr<CButton> convert;
 	std::shared_ptr<CButton> cancel;
-	std::shared_ptr<CGStatusBar> statusBar;
 public:
 
 	void makeDeal();
@@ -414,7 +408,7 @@ public:
 	CTransformerWindow(const CGHeroInstance * _hero, const CGTownInstance * _town);
 };
 
-class CUniversityWindow : public CWindowObject
+class CUniversityWindow : public CStatusbarWindow
 {
 	class CItem : public CIntObject
 	{
@@ -443,7 +437,6 @@ class CUniversityWindow : public CWindowObject
 	std::vector<std::shared_ptr<CItem>> items;
 
 	std::shared_ptr<CButton> cancel;
-	std::shared_ptr<CGStatusBar> statusBar;
 	std::shared_ptr<CIntObject> titlePic;
 	std::shared_ptr<CLabel> title;
 	std::shared_ptr<CTextBox> clerkSpeech;
@@ -455,7 +448,7 @@ public:
 };
 
 /// Confirmation window for University
-class CUnivConfirmWindow : public CWindowObject
+class CUnivConfirmWindow : public CStatusbarWindow
 {
 	std::shared_ptr<CTextBox> clerkSpeech;
 	std::shared_ptr<CLabel> name;
@@ -463,7 +456,6 @@ class CUnivConfirmWindow : public CWindowObject
 	std::shared_ptr<CAnimImage> icon;
 
 	CUniversityWindow * owner;
-	std::shared_ptr<CGStatusBar> statusBar;
 	std::shared_ptr<CButton> confirm;
 	std::shared_ptr<CButton> cancel;
 
@@ -494,7 +486,7 @@ public:
 };
 
 /// Hill fort is the building where you can upgrade units
-class CHillFortWindow : public CWindowObject, public CGarrisonHolder
+class CHillFortWindow : public CStatusbarWindow, public CGarrisonHolder
 {
 private:
 	static const int slotsCount = 7;
@@ -522,8 +514,6 @@ private:
 
 	std::shared_ptr<CGarrisonInt> garr;
 
-	std::shared_ptr<CGStatusBar> statusBar;
-
 	std::string getDefForSlot(SlotID slot);
 	std::string getTextForSlot(SlotID slot);
 
@@ -534,11 +524,10 @@ public:
 	void updateGarrisons() override;//update buttons after garrison changes
 };
 
-class CThievesGuildWindow : public CWindowObject
+class CThievesGuildWindow : public CStatusbarWindow
 {
 	const CGObjectInstance * owner;
 
-	std::shared_ptr<CGStatusBar> statusBar;
 	std::shared_ptr<CButton> exitb;
 	std::shared_ptr<CMinorResDataBar> resdatabar;