1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-16 05:16:33 +00:00

Improve topic and magic effect list padding accuracy

This also touches the quest list, but there are bigger problems with the journal than just padding
This commit is contained in:
Alexei Kotov 2025-03-09 19:20:24 +03:00
parent a49a900a7b
commit 3f63700e99
3 changed files with 33 additions and 16 deletions

View file

@ -588,10 +588,13 @@ namespace MWGui
if (mTopicsList->getItemCount() > 0) if (mTopicsList->getItemCount() > 0)
mTopicsList->addSeparator(); mTopicsList->addSeparator();
// Morrowind uses 3 px invisible borders for padding topics
constexpr int verticalPadding = 3;
for (const auto& keyword : mKeywords) for (const auto& keyword : mKeywords)
{ {
std::string topicId = Misc::StringUtils::lowerCase(keyword); std::string topicId = Misc::StringUtils::lowerCase(keyword);
mTopicsList->addItem(keyword); mTopicsList->addItem(keyword, verticalPadding);
auto t = std::make_unique<Topic>(keyword); auto t = std::make_unique<Topic>(keyword);
mKeywordSearch.seed(topicId, intptr_t(t.get())); mKeywordSearch.seed(topicId, intptr_t(t.get()));

View file

@ -29,14 +29,14 @@ namespace Gui
MyGUI::Align::Top | MyGUI::Align::Left | MyGUI::Align::Stretch, getName() + "_ScrollView"); MyGUI::Align::Top | MyGUI::Align::Left | MyGUI::Align::Stretch, getName() + "_ScrollView");
} }
void MWList::addItem(std::string_view name) void MWList::addItem(std::string_view name, int verticalPadding)
{ {
mItems.emplace_back(name); mItems.emplace_back(name, verticalPadding);
} }
void MWList::addSeparator() void MWList::addSeparator()
{ {
mItems.emplace_back(std::string{}); addItem({});
} }
void MWList::adjustSize() void MWList::adjustSize()
@ -48,7 +48,6 @@ namespace Gui
{ {
constexpr int _scrollBarWidth = 20; // fetch this from skin? constexpr int _scrollBarWidth = 20; // fetch this from skin?
const int scrollBarWidth = scrollbarShown ? _scrollBarWidth : 0; const int scrollBarWidth = scrollbarShown ? _scrollBarWidth : 0;
constexpr int spacing = 3;
int viewPosition = -mScrollView->getViewOffset().top; int viewPosition = -mScrollView->getViewOffset().top;
while (mScrollView->getChildCount()) while (mScrollView->getChildCount())
@ -60,25 +59,27 @@ namespace Gui
int i = 0; int i = 0;
for (const auto& item : mItems) for (const auto& item : mItems)
{ {
if (!item.empty()) mItemHeight += item.mVPadding;
if (!item.mName.empty())
{ {
if (mListItemSkin.empty()) if (mListItemSkin.empty())
return; return;
MyGUI::Button* button = mScrollView->createWidget<MyGUI::Button>(mListItemSkin, MyGUI::Button* button = mScrollView->createWidget<MyGUI::Button>(mListItemSkin,
MyGUI::IntCoord(0, mItemHeight, mScrollView->getSize().width - scrollBarWidth - 2, 24), MyGUI::IntCoord(0, mItemHeight, mScrollView->getSize().width - scrollBarWidth - 2, 24),
MyGUI::Align::Left | MyGUI::Align::Top, getName() + "_item_" + item); MyGUI::Align::Left | MyGUI::Align::Top, getName() + "_item_" + item.mName);
button->setCaption(item); button->setCaption(item.mName);
button->getSubWidgetText()->setWordWrap(true); button->getSubWidgetText()->setWordWrap(true);
button->getSubWidgetText()->setTextAlign(MyGUI::Align::Left); button->getSubWidgetText()->setTextAlign(MyGUI::Align::Left);
button->eventMouseWheel += MyGUI::newDelegate(this, &MWList::onMouseWheelMoved); button->eventMouseWheel += MyGUI::newDelegate(this, &MWList::onMouseWheelMoved);
button->eventMouseButtonClick += MyGUI::newDelegate(this, &MWList::onItemSelected); button->eventMouseButtonClick += MyGUI::newDelegate(this, &MWList::onItemSelected);
button->setNeedKeyFocus(true); button->setNeedKeyFocus(true);
int height = button->getTextSize().height; // Morrowind list item text widgets are typically 18 pixels tall
int height = button->getTextSize().height + 2;
button->setSize(MyGUI::IntSize(button->getSize().width, height)); button->setSize(MyGUI::IntSize(button->getSize().width, height));
button->setUserData(i); button->setUserData(i);
mItemHeight += height + spacing; mItemHeight += height;
} }
else else
{ {
@ -87,8 +88,9 @@ namespace Gui
MyGUI::Align::Left | MyGUI::Align::Top | MyGUI::Align::HStretch); MyGUI::Align::Left | MyGUI::Align::Top | MyGUI::Align::HStretch);
separator->setNeedMouseFocus(false); separator->setNeedMouseFocus(false);
mItemHeight += 18 + spacing; mItemHeight += 18;
} }
mItemHeight += item.mVPadding;
++i; ++i;
} }
@ -123,18 +125,19 @@ namespace Gui
const std::string& MWList::getItemNameAt(size_t at) const std::string& MWList::getItemNameAt(size_t at)
{ {
assert(at < mItems.size() && "List item out of bounds"); assert(at < mItems.size() && "List item out of bounds");
return mItems[at]; return mItems[at].mName;
} }
void MWList::sort() void MWList::sort()
{ {
// A special case for separators is not needed for now // A special case for separators is not needed for now
std::sort(mItems.begin(), mItems.end(), Misc::StringUtils::ciLess); std::sort(mItems.begin(), mItems.end(),
[](const auto& left, const auto& right) { return Misc::StringUtils::ciLess(left.mName, right.mName); });
} }
void MWList::removeItem(const std::string& name) void MWList::removeItem(const std::string& name)
{ {
auto it = std::find(mItems.begin(), mItems.end(), name); auto it = std::find_if(mItems.begin(), mItems.end(), [&name](const auto& item) { return item.mName == name; });
assert(it != mItems.end()); assert(it != mItems.end());
mItems.erase(it); mItems.erase(it);
} }

View file

@ -36,7 +36,7 @@ namespace Gui
void adjustSize(); void adjustSize();
void sort(); void sort();
void addItem(std::string_view name); void addItem(std::string_view name, int verticalPadding = 0);
void addSeparator(); ///< add a seperator between the current and the next item. void addSeparator(); ///< add a seperator between the current and the next item.
void removeItem(const std::string& name); void removeItem(const std::string& name);
size_t getItemCount(); size_t getItemCount();
@ -64,7 +64,18 @@ namespace Gui
MyGUI::Widget* mClient; MyGUI::Widget* mClient;
std::string mListItemSkin; std::string mListItemSkin;
std::vector<std::string> mItems; struct ListItemData
{
std::string mName;
int mVPadding;
ListItemData(std::string_view name, int verticalPadding)
: mName(name)
, mVPadding(verticalPadding)
{
}
};
std::vector<ListItemData> mItems;
int mItemHeight; // height of all items int mItemHeight; // height of all items
}; };