1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-18 13:12:50 +00:00

MR feedback

This commit is contained in:
uramer 2022-02-02 15:27:48 +01:00
parent f68c0c41a9
commit 946b8b804c
3 changed files with 31 additions and 29 deletions

View File

@ -712,10 +712,10 @@ namespace MWGui
void SettingsWindow::resizeScriptSettings()
{
static const int minListWidth = 150;
static const float relativeListWidth = 0.2f;
static const int padding = 2;
static const int outerPadding = padding * 2;
constexpr int minListWidth = 150;
constexpr float relativeListWidth = 0.2f;
constexpr int padding = 2;
constexpr int outerPadding = padding * 2;
MyGUI::IntSize parentSize = mScriptFilter->getParent()->getClientCoord().size();
int listWidth = std::max(minListWidth, static_cast<int>(parentSize.width * relativeListWidth));
int filterHeight = mScriptFilter->getSize().height;
@ -732,13 +732,13 @@ namespace MWGui
{
std::string escapeRegex(const std::string& str)
{
static std::regex specialChars(R"r([\^\.\[\$\(\)\|\*\+\?\{])r", std::regex_constants::extended);
static const std::regex specialChars(R"r([\^\.\[\$\(\)\|\*\+\?\{])r", std::regex_constants::extended);
return std::regex_replace(str, specialChars, R"(\$&)");
}
std::regex wordSearch(const std::string& query)
{
static std::regex wordsRegex(R"([^[:space:]]+)", std::regex_constants::extended);
static const std::regex wordsRegex(R"([^[:space:]]+)", std::regex_constants::extended);
auto wordsBegin = std::sregex_iterator(query.begin(), query.end(), wordsRegex);
auto wordsEnd = std::sregex_iterator();
std::string searchRegex("(");
@ -752,16 +752,15 @@ namespace MWGui
// query had only whitespace characters
if (searchRegex == "()")
searchRegex = "^(.*)$";
static auto flags = std::regex_constants::icase | std::regex_constants::extended;
return std::regex(searchRegex, flags);
return std::regex(searchRegex, std::regex_constants::extended | std::regex_constants::icase);
}
// use double to guarantee no overflow when casting from size_t
double weightedSearch(const std::regex& regex, const std::string& text)
{
std::smatch matches;
std::regex_search(text, matches, regex);
return matches.size();
// need a signed value, so cast to double (not an integer type to guarantee no overflow)
return static_cast<double>(matches.size());
}
}
@ -772,25 +771,31 @@ namespace MWGui
mScriptList->removeAllItems();
mScriptView->setCanvasSize({0, 0});
struct WeightedPage {
size_t mIndex;
std::string mName;
double mNameWeight;
double mHintWeight;
constexpr auto tie() const { return std::tie(mNameWeight, mHintWeight, mName); }
constexpr bool operator<(const WeightedPage& rhs) const { return tie() < rhs.tie(); }
};
std::regex searchRegex = wordSearch(mScriptFilter->getCaption());
std::vector<std::tuple<size_t, LuaUi::ScriptSettingsPage, double, double>> weightedPages;
std::vector<WeightedPage> weightedPages;
weightedPages.reserve(LuaUi::scriptSettingsPageCount());
for (size_t i = 0; i < LuaUi::scriptSettingsPageCount(); ++i)
{
LuaUi::ScriptSettingsPage page = LuaUi::scriptSettingsPageAt(i);
double nameSearch = 2 * weightedSearch(searchRegex, page.mName);
double hintSearch = weightedSearch(searchRegex, page.mSearchHints);
if ((nameSearch + hintSearch) > 0)
weightedPages.push_back({ i, page, -nameSearch, -hintSearch });
double nameWeight = weightedSearch(searchRegex, page.mName);
double hintWeight = weightedSearch(searchRegex, page.mSearchHints);
if ((nameWeight + hintWeight) > 0)
weightedPages.push_back({ i, page.mName, -nameWeight, -hintWeight });
}
std::sort(weightedPages.begin(), weightedPages.end(), [](const auto& a, const auto& b)
{
const auto& [iA, pageA, nameA, hintA] = a;
const auto& [iB, pageB, nameB, hintB] = b;
return std::tie(nameA, hintA, pageA.mName) < std::tie(nameB, hintB, pageB.mName);
});
for (const auto & [i, page, name, hint] : weightedPages)
mScriptList->addItem(page.mName, i);
std::sort(weightedPages.begin(), weightedPages.end());
for (const WeightedPage& weightedPage : weightedPages)
mScriptList->addItem(weightedPage.mName, weightedPage.mIndex);
// Hide script settings tab when the game world isn't loaded and scripts couldn't add their settings
bool disabled = LuaUi::scriptSettingsPageCount() == 0;

View File

@ -239,10 +239,7 @@ namespace MWLua
typeTable.set(it.second, it.first);
api["TYPE"] = LuaUtil::makeReadOnly(typeTable);
api["registerSettingsPage"] = [](sol::table options)
{
LuaUi::registerSettingsPage(options);
};
api["registerSettingsPage"] = &LuaUi::registerSettingsPage;
return LuaUtil::makeReadOnly(api);
}

View File

@ -38,7 +38,7 @@
---
-- Adds a settings page to main menu setting's Scripts tab.
-- @function [parent=#ui] regregisterSettingsPageister
-- @function [parent=#ui] registerSettingsPage
-- @param #SettingsPage page
---
@ -143,7 +143,7 @@
-- @field #number button Mouse button which triggered the event (could be nil)
---
-- Settings page parameters, passed as an argument to uyi.registerSettingsPage
-- Settings page parameters, passed as an argument to ui.registerSettingsPage
-- @type SettingsPage
-- @field #string name Name of the page, displayed in the list, used for search
-- @field #string searchHints Additional keywords used in search, not displayed anywhere