1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Fix text trimming in object window

- Do not attempt to preserve object count in string when string does not
contains object count
- Correctly look up last bracket, to correctly handle object names that
contain brackets
This commit is contained in:
Ivan Savenko
2025-10-27 19:33:48 +02:00
parent 6b4179af86
commit 483e170f6b
2 changed files with 17 additions and 9 deletions

View File

@@ -1596,7 +1596,7 @@ CObjectListWindow::CObjectListWindow(const std::vector<int> & _items, std::share
for(int id : _items)
{
std::string objectName = GAME->interface()->cb->getObjInstance(ObjectInstanceID(id))->getObjectName();
trimTextIfTooWide(objectName);
trimTextIfTooWide(objectName, false);
items.emplace_back(id, objectName);
}
itemsVisible = items;
@@ -1620,7 +1620,7 @@ CObjectListWindow::CObjectListWindow(const std::vector<std::string> & _items, st
for(size_t i = 0; i < _items.size(); i++)
{
std::string objectName = _items[i];
trimTextIfTooWide(objectName);
trimTextIfTooWide(objectName, true);
items.emplace_back(static_cast<int>(i), objectName);
}
itemsVisible = items;
@@ -1664,16 +1664,24 @@ void CObjectListWindow::init(std::shared_ptr<CIntObject> titleWidget_, std::stri
searchBox->setCallback(std::bind(&CObjectListWindow::itemsSearchCallback, this, std::placeholders::_1));
}
void CObjectListWindow::trimTextIfTooWide(std::string & text) const
void CObjectListWindow::trimTextIfTooWide(std::string & text, bool preserveCountSuffix) const
{
std::string suffix = "...";
int maxWidth = pos.w - 60; // 60 px for scrollbar and borders
auto posBrace = text.find('(');
auto posClosing = text.find(')');
std::string objCount = text.substr(posBrace, posClosing - posBrace) + ')';
if(text[0] == '{')
objCount = '}' + objCount;
suffix += "}";
if (preserveCountSuffix)
{
auto posBrace = text.find_last_of("(");
auto posClosing = text.find_last_of(")");
std::string objCount = text.substr(posBrace, posClosing - posBrace) + ')';
suffix += " ";
suffix += objCount;
}
const auto & font = ENGINE->renderHandler().loadFont(FONT_SMALL);
std::string suffix = "... " + objCount;
if(font->getStringWidth(text) >= maxWidth)
{