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