diff --git a/src/app/ModuleBrowser.cpp b/src/app/ModuleBrowser.cpp index 2eb3dea3..a0997aeb 100644 --- a/src/app/ModuleBrowser.cpp +++ b/src/app/ModuleBrowser.cpp @@ -42,7 +42,7 @@ static fuzzysearch::Database modelDb; static bool modelDbInitialized = false; -static void modelDbInit() { +static void fuzzySearchInit() { if (modelDbInitialized) return; modelDb.setWeights({1.f, 1.f, 0.1f, 1.f, 0.5f, 0.5f}); @@ -447,7 +447,9 @@ struct ModuleBrowser : widget::OpaqueWidget { std::string brand; std::set tagIds = {}; + // Caches and temporary state std::map prefilteredModelScores; + std::map modelOrders; ModuleBrowser() { const float margin = 10; @@ -523,12 +525,14 @@ struct ModuleBrowser : widget::OpaqueWidget { void resetModelBoxes() { modelContainer->clearChildren(); + modelOrders.clear(); // Iterate plugins // for (int i = 0; i < 100; i++) for (plugin::Plugin* plugin : plugin::plugins) { // Get module slugs from module whitelist const auto& pluginIt = settings::moduleWhitelist.find(plugin->slug); // Iterate models in plugin + int modelIndex = 0; for (plugin::Model* model : plugin->models) { // Don't show module if plugin whitelist exists but the module is not in it. if (pluginIt != settings::moduleWhitelist.end()) { @@ -541,6 +545,9 @@ struct ModuleBrowser : widget::OpaqueWidget { ModelBox* modelBox = new ModelBox; modelBox->setModel(model); modelContainer->addChild(modelBox); + + modelOrders[model] = modelIndex; + modelIndex++; } } } @@ -633,36 +640,42 @@ struct ModuleBrowser : widget::OpaqueWidget { // Sort ModelBoxes if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_UPDATED) { - sortModels([](ModelBox* m) { + sortModels([this](ModelBox* m) { plugin::Plugin* p = m->model->plugin; - return std::make_tuple(-p->modifiedTimestamp, p->brand, m->model->name); + int modelOrder = get(modelOrders, m->model, 0); + return std::make_tuple(-p->modifiedTimestamp, p->brand, p->name, modelOrder); }); } else if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_LAST_USED) { - sortModels([](ModelBox* m) { + sortModels([this](ModelBox* m) { plugin::Plugin* p = m->model->plugin; const settings::ModuleUsage* mu = settings::getModuleUsage(p->slug, m->model->slug); double lastTime = mu ? mu->lastTime : -INFINITY; - return std::make_tuple(-lastTime, -p->modifiedTimestamp, p->brand); + int modelOrder = get(modelOrders, m->model, 0); + return std::make_tuple(-lastTime, -p->modifiedTimestamp, p->brand, p->name, modelOrder); }); } else if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_MOST_USED) { - sortModels([](ModelBox* m) { + sortModels([this](ModelBox* m) { plugin::Plugin* p = m->model->plugin; const settings::ModuleUsage* mu = settings::getModuleUsage(p->slug, m->model->slug); int count = mu ? mu->count : 0; double lastTime = mu ? mu->lastTime : -INFINITY; - return std::make_tuple(-count, -lastTime, -p->modifiedTimestamp, p->brand); + int modelOrder = get(modelOrders, m->model, 0); + return std::make_tuple(-count, -lastTime, -p->modifiedTimestamp, p->brand, p->name, modelOrder); }); } else if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_BRAND) { - sortModels([](ModelBox* m) { - return std::make_tuple(m->model->plugin->brand, m->model->name); + sortModels([this](ModelBox* m) { + plugin::Plugin* p = m->model->plugin; + int modelOrder = get(modelOrders, m->model, 0); + return std::make_tuple(p->brand, p->name, modelOrder); }); } else if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_NAME) { sortModels([](ModelBox* m) { - return std::make_tuple(m->model->name, m->model->plugin->brand); + plugin::Plugin* p = m->model->plugin; + return std::make_tuple(m->model->name, p->brand); }); } else if (settings::moduleBrowserSort == settings::MODULE_BROWSER_SORT_RANDOM) { @@ -678,7 +691,7 @@ struct ModuleBrowser : widget::OpaqueWidget { } else { // Lazily initialize search database - modelDbInit(); + fuzzySearchInit(); // Score results against search query auto results = modelDb.search(search); // DEBUG("=============");