1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-29 21:56:54 +02:00

Merge pull request #5160 from Laserlicht/alt_town

[1.6.2] show building names with ALT
This commit is contained in:
Ivan Savenko 2024-12-30 21:52:32 +02:00 committed by GitHub
commit 8bf5c474d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 80 additions and 3 deletions

View File

@ -81,6 +81,8 @@ public:
//test transparency of specific pixel
virtual bool isTransparent(const Point & coords) const = 0;
virtual Rect contentRect() const = 0;
virtual Point dimensions() const = 0;
int width() const;
int height() const;
@ -109,6 +111,7 @@ public:
virtual Point dimensions() const = 0;
virtual void exportBitmap(const boost::filesystem::path & path, SDL_Palette * palette) const = 0;
virtual bool isTransparent(const Point & coords) const = 0;
virtual Rect contentRect() const = 0;
virtual void draw(SDL_Surface * where, SDL_Palette * palette, const Point & dest, const Rect * src, const ColorRGBA & colorMultiplier, uint8_t alpha, EImageBlitMode mode) const = 0;
[[nodiscard]] virtual std::shared_ptr<IImage> createImageReference(EImageBlitMode mode) const = 0;

View File

@ -60,6 +60,11 @@ bool ImageScaled::isTransparent(const Point &coords) const
return source->isTransparent(coords);
}
Rect ImageScaled::contentRect() const
{
return source->contentRect();
}
Point ImageScaled::dimensions() const
{
return source->dimensions();

View File

@ -52,6 +52,7 @@ public:
void scaleTo(const Point & size) override;
void exportBitmap(const boost::filesystem::path & path) const override;
bool isTransparent(const Point & coords) const override;
Rect contentRect() const override;
Point dimensions() const override;
void setAlpha(uint8_t value) override;
void setBlitMode(EImageBlitMode mode) override;

View File

@ -382,6 +382,13 @@ bool SDLImageShared::isTransparent(const Point & coords) const
return true;
}
Rect SDLImageShared::contentRect() const
{
auto tmpMargins = margins / preScaleFactor;
auto tmpSize = Point(surf->w, surf->h) / preScaleFactor;
return Rect(tmpMargins, tmpSize);
}
Point SDLImageShared::dimensions() const
{
return fullSize / preScaleFactor;
@ -615,6 +622,11 @@ bool SDLImageBase::isTransparent(const Point & coords) const
return image->isTransparent(coords);
}
Rect SDLImageBase::contentRect() const
{
return image->contentRect();
}
Point SDLImageBase::dimensions() const
{
return image->dimensions();

View File

@ -57,6 +57,7 @@ public:
void exportBitmap(const boost::filesystem::path & path, SDL_Palette * palette) const override;
Point dimensions() const override;
bool isTransparent(const Point & coords) const override;
Rect contentRect() const override;
[[nodiscard]] std::shared_ptr<IImage> createImageReference(EImageBlitMode mode) const override;
[[nodiscard]] std::shared_ptr<const ISharedImage> horizontalFlip() const override;
[[nodiscard]] std::shared_ptr<const ISharedImage> verticalFlip() const override;
@ -78,6 +79,7 @@ public:
SDLImageBase(const std::shared_ptr<const ISharedImage> & image, EImageBlitMode mode);
bool isTransparent(const Point & coords) const override;
Rect contentRect() const override;
Point dimensions() const override;
void setAlpha(uint8_t value) override;
void setBlitMode(EImageBlitMode mode) override;

View File

@ -36,6 +36,7 @@
#include "../render/IRenderHandler.h"
#include "../render/CAnimation.h"
#include "../render/ColorFilter.h"
#include "../render/IFont.h"
#include "../adventureMap/AdventureMapInterface.h"
#include "../adventureMap/CList.h"
#include "../adventureMap/CResDataBar.h"
@ -173,6 +174,8 @@ void CBuildingRect::show(Canvas & to)
{
uint32_t stageDelay = BUILDING_APPEAR_TIMEPOINT;
bool showTextOverlay = GH.isKeyboardAltDown();
if(stateTimeCounter < BUILDING_APPEAR_TIMEPOINT)
{
setAlpha(255 * stateTimeCounter / stageDelay);
@ -188,7 +191,7 @@ void CBuildingRect::show(Canvas & to)
{
if(stateTimeCounter >= BUILD_ANIMATION_FINISHED_TIMEPOINT)
{
if(parent->selectedBuilding == this)
if(parent->selectedBuilding == this || showTextOverlay)
to.draw(border, pos.topLeft());
return;
}
@ -232,9 +235,9 @@ std::string CBuildingRect::getSubtitle()//hover text for building
if (!getBuilding())
return "";
int bid = getBuilding()->bid;
auto bid = getBuilding()->bid;
if (bid<30)//non-dwellings - only building name
if (!bid.IsDwelling())//non-dwellings - only building name
return town->getTown()->buildings.at(getBuilding()->bid)->getNameTranslated();
else//dwellings - recruit %creature%
{
@ -646,6 +649,54 @@ void CCastleBuildings::recreate()
boost::sort(children, buildSorter); //TODO: create building in blit order
}
void CCastleBuildings::drawOverlays(Canvas & to, std::vector<std::shared_ptr<CBuildingRect>> buildingRects)
{
std::vector<Rect> textRects;
for(auto & buildingRect : buildingRects)
{
if(!buildingRect->border)
continue;
auto building = buildingRect->getBuilding();
if (!building)
continue;
auto bid = building->bid;
auto overlay = town->getTown()->buildings.at(bid)->getNameTranslated();
const auto & font = GH.renderHandler().loadFont(FONT_TINY);
auto backColor = Colors::GREEN; // Other
if(bid.IsDwelling())
backColor = Colors::PURPLE; // dwelling
auto contentRect = buildingRect->border->contentRect();
auto center = Rect(buildingRect->pos.x + contentRect.x, buildingRect->pos.y + contentRect.y, contentRect.w, contentRect.h).center();
Point dimensions(font->getStringWidth(overlay), font->getLineHeight());
Rect textRect = Rect(center - dimensions / 2, dimensions).resize(2);
while(!pos.resize(-5).isInside(Point(textRect.topLeft().x, textRect.center().y)))
textRect.x++;
while(!pos.resize(-5).isInside(Point(textRect.topRight().x, textRect.center().y)))
textRect.x--;
while(std::any_of(textRects.begin(), textRects.end(), [textRect](Rect existingTextRect) { return existingTextRect.resize(3).intersectionTest(textRect); }))
textRect.y++;
textRects.push_back(textRect);
to.drawColor(textRect, backColor);
to.drawBorder(textRect, Colors::BRIGHT_YELLOW);
to.drawText(textRect.center(), EFonts::FONT_TINY, Colors::BLACK, ETextAlignment::CENTER, overlay);
}
}
void CCastleBuildings::show(Canvas & to)
{
CIntObject::show(to);
bool showTextOverlay = GH.isKeyboardAltDown();
if(showTextOverlay)
drawOverlays(to, buildings);
}
void CCastleBuildings::addBuilding(BuildingID building)
{
//FIXME: implement faster method without complete recreation of town

View File

@ -159,6 +159,9 @@ class CCastleBuildings : public CIntObject
void openTownHall();
void recreate();
void drawOverlays(Canvas & to, std::vector<std::shared_ptr<CBuildingRect>> buildingRects);
void show(Canvas & to) override;
public:
CBuildingRect * selectedBuilding;