Explorar el Código

Fix remaining graphical artifacts on switching from world view

Ivan Savenko hace 2 años
padre
commit
342ea138f9

+ 2 - 0
client/adventureMap/CAdventureMapInterface.cpp

@@ -788,6 +788,8 @@ void CAdventureMapInterface::onScreenResize()
 	widget = std::make_shared<CAdventureMapWidget>(shortcuts);
 	widget->getMapView()->onViewMapActivated();
 	widget->setPlayer(currentPlayerID);
+	widget->updateActiveState();
+	widget->getMinimap()->update();
 
 	if (isActive())
 		widget->activate();

+ 5 - 3
client/adventureMap/CAdventureMapWidget.cpp

@@ -238,7 +238,7 @@ std::shared_ptr<CIntObject> CAdventureMapWidget::buildMapHeroList(const JsonNode
 	Point itemOffset(input["itemsOffset"]["x"].Integer(), input["itemsOffset"]["y"].Integer());
 	int itemsCount = input["itemsCount"].Integer();
 
-	auto result = std::make_shared<CHeroList>(itemsCount, item.topLeft(), itemOffset, LOCPLINT->localState->getWanderingHeroes().size());
+	auto result = std::make_shared<CHeroList>(itemsCount, area, item.topLeft() - area.topLeft(), itemOffset, LOCPLINT->localState->getWanderingHeroes().size());
 
 
 	if(!input["scrollUp"].isNull())
@@ -272,7 +272,8 @@ std::shared_ptr<CIntObject> CAdventureMapWidget::buildMapTownList(const JsonNode
 	Point itemOffset(input["itemsOffset"]["x"].Integer(), input["itemsOffset"]["y"].Integer());
 	int itemsCount = input["itemsCount"].Integer();
 
-	auto result = std::make_shared<CTownList>(itemsCount, item.topLeft(), itemOffset, LOCPLINT->localState->getOwnedTowns().size());
+	auto result = std::make_shared<CTownList>(itemsCount, area, item.topLeft() - area.topLeft(), itemOffset, LOCPLINT->localState->getOwnedTowns().size());
+
 
 	if(!input["scrollUp"].isNull())
 		result->setScrollUpButton(std::dynamic_pointer_cast<CButton>(buildMapButton(input["scrollUp"])));
@@ -427,7 +428,6 @@ void CAdventureMapWidget::updateActiveStateChildden(CIntObject * widget)
 			if (container->disableCondition == "worldViewMode")
 				container->setEnabled(!shortcuts->optionInWorldView());
 
-
 			updateActiveStateChildden(container);
 		}
 	}
@@ -439,4 +439,6 @@ void CAdventureMapWidget::updateActiveState()
 
 	for (auto entry: shortcuts->getShortcuts())
 		setShortcutBlocked(entry.shortcut, !entry.isEnabled);
+
+	//GH.totalRedraw(); // FIXME: required to eliminate graphical artifacts on leaving world view mode
 }

+ 22 - 10
client/adventureMap/CList.cpp

@@ -20,6 +20,7 @@
 #include "../CPlayerInterface.h"
 #include "../PlayerLocalState.h"
 #include "../gui/CGuiHandler.h"
+#include "../renderSDL/SDL_Extensions.h"
 
 #include "../../lib/CGeneralTextHandler.h"
 #include "../../lib/CHeroHandler.h"
@@ -81,22 +82,31 @@ void CList::CListItem::onSelect(bool on)
 	redraw();
 }
 
-CList::CList(int Size, Point position)
-	: CIntObject(0, position),
+CList::CList(int Size, Rect widgetDimensions)
+	: CIntObject(0, widgetDimensions.topLeft()),
 	size(Size),
 	selected(nullptr)
 {
+	pos.w = widgetDimensions.w;
+	pos.h = widgetDimensions.h;
+}
 
+void CList::showAll(SDL_Surface * to)
+{
+	CSDL_Ext::fillRect(to, pos, Colors::BLACK);
+	CIntObject::showAll(to);
 }
 
-void CList::createList(Point itemOffset, size_t listAmount)
+void CList::createList(Point firstItemPosition, Point itemPositionDelta, size_t listAmount)
 {
 	OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
-	listBox = std::make_shared<CListBox>(std::bind(&CList::createItem, this, _1), Point(0, 0), itemOffset, size, listAmount);
+	listBox = std::make_shared<CListBox>(std::bind(&CList::createItem, this, _1), firstItemPosition, itemPositionDelta, size, listAmount);
 }
 
 void CList::setScrollUpButton(std::shared_ptr<CButton> button)
 {
+	addChild(button.get());
+
 	scrollUp = button;
 	scrollUp->addCallback(std::bind(&CListBox::moveToPrev, listBox));
 	scrollUp->addCallback(std::bind(&CList::update, this));
@@ -105,6 +115,8 @@ void CList::setScrollUpButton(std::shared_ptr<CButton> button)
 
 void CList::setScrollDownButton(std::shared_ptr<CButton> button)
 {
+	addChild(button.get());
+
 	scrollDown = button;
 	scrollDown->addCallback(std::bind(&CList::update, this));
 	scrollDown->addCallback(std::bind(&CListBox::moveToNext, listBox));
@@ -242,10 +254,10 @@ std::shared_ptr<CIntObject> CHeroList::createItem(size_t index)
 	return std::make_shared<CEmptyHeroItem>();
 }
 
-CHeroList::CHeroList(int size, Point position, Point itemOffset, size_t listAmount)
-	: CList(size, position)
+CHeroList::CHeroList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount)
+	: CList(visibleItemsCount, widgetPosition)
 {
-	createList(itemOffset, listAmount);
+	createList(firstItemOffset, itemOffsetDelta, initialItemsCount);
 }
 
 void CHeroList::select(const CGHeroInstance * hero)
@@ -325,10 +337,10 @@ std::string CTownList::CTownItem::getHoverText()
 	return town->getObjectName();
 }
 
-CTownList::CTownList(int size, Point position, Point itemOffset, size_t listAmount)
-	: CList(size, position)
+CTownList::CTownList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount)
+	: CList(visibleItemsCount, widgetPosition)
 {
-	createList(itemOffset, listAmount);
+	createList(firstItemOffset, itemOffsetDelta, initialItemsCount);
 }
 
 void CTownList::select(const CGTownInstance * town)

+ 6 - 4
client/adventureMap/CList.h

@@ -67,9 +67,9 @@ private:
 protected:
 	std::shared_ptr<CListBox> listBox;
 
-	CList(int size, Point position);
+	CList(int size, Rect widgetDimensions);
 
-	void createList(Point itemOffset, size_t listAmount);
+	void createList(Point firstItemPosition, Point itemPositionDelta, size_t listAmount);
 
 	virtual std::shared_ptr<CIntObject> createItem(size_t index) = 0;
 
@@ -90,6 +90,8 @@ public:
 	void selectIndex(int which);
 	void selectNext();
 	void selectPrev();
+
+	void showAll(SDL_Surface * to) override;
 };
 
 /// List of heroes which is shown at the right of the adventure map screen
@@ -125,7 +127,7 @@ class CHeroList	: public CList
 
 	std::shared_ptr<CIntObject> createItem(size_t index);
 public:
-	CHeroList(int size, Point position, Point itemOffset, size_t listAmount);
+	CHeroList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount);
 
 	/// Select specific hero and scroll if needed
 	void select(const CGHeroInstance * hero = nullptr);
@@ -155,7 +157,7 @@ class CTownList	: public CList
 
 	std::shared_ptr<CIntObject> createItem(size_t index) override;
 public:
-	CTownList(int size, Point position, Point itemOffset, size_t listAmount);
+	CTownList(int visibleItemsCount, Rect widgetPosition, Point firstItemOffset, Point itemOffsetDelta, size_t initialItemsCount);
 
 	/// Select specific town and scroll if needed
 	void select(const CGTownInstance * town = nullptr);

+ 0 - 1
client/battle/BattleWindow.cpp

@@ -72,7 +72,6 @@ BattleWindow::BattleWindow(BattleInterface & owner):
 	
 	console = widget<BattleConsole>("console");
 
-	GH.statusbar = console;
 	owner.console = console;
 
 	owner.fieldController.reset( new BattleFieldController(owner));

+ 1 - 1
client/windows/CCastleInterface.cpp

@@ -1200,7 +1200,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
 	statusbar = CGStatusBar::create(statusbarBackground);
 	resdatabar = std::make_shared<CResDataBar>("ARESBAR", 3, 575, 32, 2, 85, 85);
 
-	townlist = std::make_shared<CTownList>(3, Point(745, 430), Point(0, 32), LOCPLINT->localState->getOwnedTowns().size() );
+	townlist = std::make_shared<CTownList>(3, Rect(Point(745, 430), Point(48, 32*4)), Point(0,0), Point(0, 32), LOCPLINT->localState->getOwnedTowns().size() );
 	townlist->setScrollUpButton( std::make_shared<CButton>( Point(744, 414), "IAM014", CButton::tooltipLocalized("core.help.306")));
 	townlist->setScrollDownButton( std::make_shared<CButton>( Point(744, 526), "IAM015", CButton::tooltipLocalized("core.help.307")));
 

+ 27 - 33
config/widgets/adventureMap.json

@@ -1,14 +1,7 @@
 {
 	"options" : {
-
 		// player-colored images used for background
 		"imagesPlayerColored" : [ "AdvMap.pcx" ],
-
-		// widgets that are only visible in world view mode
-		"worldViewWidgets" : [ "worldViewContainer" ],
-		
-		// widgets that are only visible in game view mode
-		"gameViewWidgets" : [ "townListContainer", "heroListContainer", "buttonsContainer", "infobox" ],
 	},
 
 	"items":
@@ -77,12 +70,6 @@
 			"image" : "AdvMap.pcx",
 			"area" : { "right": 0, "top" : 0, "width" : 199, "height" : 196 }
 		},
-		{
-			"type": "adventureMapImage",
-			"name" : "backgroundRightInfobar",
-			"image" : "AdvMap.pcx",
-			"area" : { "bottom": 0, "right" : 0, "width" : 199, "height" : 211 }
-		},
 		{
 			"type": "adventureMapImage",
 			"name": "backgroundHeroListBorderLeft",
@@ -280,29 +267,29 @@
 					"type": "adventureMapImage",
 					"name" : "backgroundBelowHeroTownList",
 					"image" : "AdvMap.pcx",
-					"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 3 },
-					"sourceArea": { "bottom" : 208, "height" : 3, "right" : 0, "width" : 193 }
+					"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 4 },
+					"sourceArea": { "bottom" : 208, "height" : 4, "right" : 0, "width" : 193 }
 				},
 				// Hero List
 				{
 					"type": "adventureMapHeroList",
 					"name" : "heroList",
-					"area": { "top": 0, "right" : 127, "width" : 64, "height" : 192 },
+					"area": { "top": 0, "right" : 125, "width" : 68, "height" : 193 },
 					"scrollUp" : {
 						"type": "adventureMapButton",
 						"name": "heroListScrollUp",
 						"image" : "IAM012.DEF",
 						"help" : "core.help.303",
-						"area": { "top" : 0, "left": 0, "width" : 64, "height" : 16 }
+						"area": { "top" : 0, "left": 2, "width" : 64, "height" : 16 }
 					},
 					"scrollDown" : {
 						"type": "adventureMapButton",
 						"name": "heroListScrollDown",
 						"image" : "IAM013.DEF",
 						"help" : "core.help.304",
-						"area": { "bottom" : 0, "left": 0, "width" : 64, "height" : 16 }
+						"area": { "bottom" : 0, "left": 2, "width" : 64, "height" : 16 }
 					},
-					"item" : { "top" :  16, "left": 1, "width" : 62, "height" : 32 },
+					"item" : { "top" :  16, "left": 3, "width" : 62, "height" : 32 },
 					"itemsOffset" : { "x" : 0, "y" : 32 },
 					"itemsCount" : 5
 				},
@@ -310,22 +297,22 @@
 				{
 					"type": "adventureMapTownList",
 					"name" : "townList",
-					"area": { "top": 0, "right" : 5, "width" : 48, "height" : 192 },
+					"area": { "top": 0, "right" : 3, "width" : 51, "height" : 193 },
 					"scrollUp" : {
 						"type": "adventureMapButton",
 						"name": "townListScrollUp",
 						"image" : "IAM014.DEF",
 						"help" : "core.help.306",
-						"area": { "top" : 0, "left": 0, "width" : 48, "height" : 16 }
+						"area": { "top" : 0, "left": 1, "width" : 48, "height" : 16 }
 					},
 					"scrollDown" : {
 						"type": "adventureMapButton",
 						"name": "townListScrollDown",
 						"image" : "IAM015.DEF",
 						"help" : "core.help.307",
-						"area": { "bottom" : 0, "left": 0, "width" : 48, "height" : 16 }
+						"area": { "bottom" : 0, "left": 1, "width" : 48, "height" : 16 }
 					},
-					"item" : { "top" :  16, "left": 0, "width" : 48, "height" : 32 },
+					"item" : { "top" :  16, "left": 2, "width" : 48, "height" : 32 },
 					"itemsOffset" : { "x" : 0, "y" : 32 },
 					"itemsCount" : 5
 				},
@@ -373,15 +360,15 @@
 					"type": "adventureMapImage",
 					"name" : "backgroundBelowHeroTownList",
 					"image" : "AdvMap.pcx",
-					"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 3 },
-					"sourceArea": { "bottom" : 208, "height" : 3, "right" : 0, "width" : 193 }
+					"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 4 },
+					"sourceArea": { "bottom" : 208, "height" : 4, "right" : 0, "width" : 193 }
 				},
 				// Hero List
 				{
 					"type": "adventureMapHeroList",
 					"name" : "heroList",
-					"area": { "top": 0, "right" : 127, "width" : 64, "height" : 256 },
-					"item" : { "top" :  0, "left": 1, "width" : 62, "height" : 32 },
+					"area": { "top": 0, "right" : 125, "width" : 68, "height" : 257 },
+					"item" : { "top" :  1, "left": 3, "width" : 62, "height" : 32 },
 					"itemsOffset" : { "x" : 0, "y" : 32 },
 					"itemsCount" : 8
 				},
@@ -389,22 +376,22 @@
 				{
 					"type": "adventureMapTownList",
 					"name" : "townList",
-					"area": { "top": 0, "right" : 5, "width" : 48, "height" : 256 },
+					"area": { "top": 0, "right" : 3, "width" : 51, "height" : 257 },
 					"scrollUp" : {
 						"type": "adventureMapButton",
 						"name": "townListScrollUp",
 						"image" : "IAM014.DEF",
 						"help" : "core.help.306",
-						"area": { "top" : 0, "left": 0, "width" : 48, "height" : 16 }
+						"area": { "top" : 0, "left": 1, "width" : 48, "height" : 16 }
 					},
 					"scrollDown" : {
 						"type": "adventureMapButton",
 						"name": "townListScrollDown",
 						"image" : "IAM015.DEF",
 						"help" : "core.help.307",
-						"area": { "bottom" : 0, "left": 0, "width" : 48, "height" : 16 }
+						"area": { "bottom" : 0, "left": 1, "width" : 48, "height" : 16 }
 					},
-					"item" : { "top" :  16, "left": 0, "width" : 48, "height" : 32 },
+					"item" : { "top" :  16, "left": 1, "width" : 48, "height" : 32 },
 					"itemsOffset" : { "x" : 0, "y" : 32 },
 					"itemsCount" : 7
 				},
@@ -438,13 +425,20 @@
 			"type": "adventureMapContainer",
 			"name" : "adventureInfobarContainer",
 			"hideWhen" : "worldViewMode",
-			"area": { "bottom": 44, "right" : 19, "width" : 175, "height" : 168 }
+			"area" : { "bottom": 0, "right" : 0, "width" : 199, "height" : 211 }
 			"items" : [
 				// Infobar
+				{
+					"type": "adventureMapImage",
+					"name" : "backgroundRightInfobar",
+					"image" : "AdvMap.pcx",
+					"area": { "top": 0, "bottom" : 0, "left" : 0, "right" : 0 },
+					"sourceArea" : { "bottom": 0, "right" : 0, "width" : 199, "height" : 211 }
+				},
 				{
 					"type": "adventureInfobar",
 					"name": "infoBar",
-					"area": { "bottom": 0, "top" : 0, "left" : 0, "right" : 0 }
+					"area": { "bottom": 44, "right" : 19, "width" : 175, "height" : 168 }
 				}
 			]
 		},