| @@ -100,7 +100,7 @@ struct BrowserListItem : OpaqueWidget { | |||
| struct ModelItem : BrowserListItem { | |||
| Model *model; | |||
| Label *authorLabel; | |||
| Label *authorLabel = NULL; | |||
| ModelItem() { | |||
| box.size.y = 2*BND_WIDGET_HEIGHT + 3*itemMargin; | |||
| @@ -115,11 +115,14 @@ struct ModelItem : BrowserListItem { | |||
| nameLabel->text = model->name; | |||
| addChild(nameLabel); | |||
| authorLabel = Widget::create<Label>(Vec(0, 0 + itemMargin)); | |||
| authorLabel->alignment = Label::RIGHT_ALIGNMENT; | |||
| authorLabel->text = model->author; | |||
| authorLabel->color.a = 0.5; | |||
| addChild(authorLabel); | |||
| // Hide author label if filtering by author | |||
| if (sAuthorFilter.empty()) { | |||
| authorLabel = Widget::create<Label>(Vec(0, 0 + itemMargin)); | |||
| authorLabel->alignment = Label::RIGHT_ALIGNMENT; | |||
| authorLabel->text = model->author; | |||
| authorLabel->color.a = 0.5; | |||
| addChild(authorLabel); | |||
| } | |||
| SequentialLayout *layout2 = Widget::create<SequentialLayout>(Vec(7, BND_WIDGET_HEIGHT + itemMargin)); | |||
| layout2->spacing = 0; | |||
| @@ -155,7 +158,8 @@ struct ModelItem : BrowserListItem { | |||
| void step() override { | |||
| BrowserListItem::step(); | |||
| authorLabel->box.size.x = box.size.x - BND_SCROLLBAR_WIDTH; | |||
| if (authorLabel) | |||
| authorLabel->box.size.x = box.size.x - BND_SCROLLBAR_WIDTH; | |||
| } | |||
| void onAction(EventAction &e) override { | |||
| @@ -364,29 +368,22 @@ struct ModuleBrowser : OpaqueWidget { | |||
| std::string search = searchField->text; | |||
| moduleList->clearChildren(); | |||
| moduleList->selected = 0; | |||
| bool filterPage = !(sAuthorFilter.empty() && sTagFilter == NO_TAG); | |||
| // Clear filter | |||
| if (!(sAuthorFilter.empty() && sTagFilter == NO_TAG)) { | |||
| ClearFilterItem *item = new ClearFilterItem(); | |||
| moduleList->addChild(item); | |||
| } | |||
| // Favorites | |||
| if (!sFavoriteModels.empty()) { | |||
| SeparatorItem *item = new SeparatorItem(); | |||
| item->setText("Favorites"); | |||
| moduleList->addChild(item); | |||
| } | |||
| for (Model *model : sFavoriteModels) { | |||
| if (isModelFiltered(model) && isModelMatch(model, search)) { | |||
| ModelItem *item = new ModelItem(); | |||
| item->setModel(model); | |||
| if (!filterPage) { | |||
| // Favorites | |||
| if (!sFavoriteModels.empty()) { | |||
| SeparatorItem *item = new SeparatorItem(); | |||
| item->setText("Favorites"); | |||
| moduleList->addChild(item); | |||
| } | |||
| } | |||
| // Author/tag subpage | |||
| if (sAuthorFilter.empty() && sTagFilter == NO_TAG) { | |||
| for (Model *model : sFavoriteModels) { | |||
| if (isModelFiltered(model) && isModelMatch(model, search)) { | |||
| ModelItem *item = new ModelItem(); | |||
| item->setModel(model); | |||
| moduleList->addChild(item); | |||
| } | |||
| } | |||
| // Author items | |||
| { | |||
| SeparatorItem *item = new SeparatorItem(); | |||
| @@ -414,14 +411,27 @@ struct ModuleBrowser : OpaqueWidget { | |||
| } | |||
| } | |||
| } | |||
| else { | |||
| // Clear filter | |||
| ClearFilterItem *item = new ClearFilterItem(); | |||
| moduleList->addChild(item); | |||
| } | |||
| // Models | |||
| if (!sAuthorFilter.empty() || sTagFilter != NO_TAG || !search.empty()) { | |||
| { | |||
| if (filterPage || !search.empty()) { | |||
| if (!search.empty()) { | |||
| SeparatorItem *item = new SeparatorItem(); | |||
| item->setText("Modules"); | |||
| moduleList->addChild(item); | |||
| } | |||
| else if (filterPage) { | |||
| SeparatorItem *item = new SeparatorItem(); | |||
| if (!sAuthorFilter.empty()) | |||
| item->setText(sAuthorFilter); | |||
| else if (sTagFilter != NO_TAG) | |||
| item->setText("Tag: " + gTagNames[sTagFilter]); | |||
| moduleList->addChild(item); | |||
| } | |||
| // Modules | |||
| for (Plugin *plugin : gPlugins) { | |||
| for (Model *model : plugin->models) { | |||
| if (isModelFiltered(model) && isModelMatch(model, search)) { | |||