| @@ -12,6 +12,9 @@ namespace rack { | |||||
| static std::set<Model*> sFavoriteModels; | static std::set<Model*> sFavoriteModels; | ||||
| static std::string sManufacturerFilter; | |||||
| static ModelTag sTagFilter = NO_TAG; | |||||
| bool isMatch(std::string s, std::string search) { | bool isMatch(std::string s, std::string search) { | ||||
| @@ -73,6 +76,8 @@ struct BrowserListItem : OpaqueWidget { | |||||
| Widget::draw(vg); | Widget::draw(vg); | ||||
| } | } | ||||
| void onDragStart(EventDragStart &e) override; | |||||
| void onDragDrop(EventDragDrop &e) override { | void onDragDrop(EventDragDrop &e) override { | ||||
| if (e.origin != this) | if (e.origin != this) | ||||
| return; | return; | ||||
| @@ -88,12 +93,9 @@ struct BrowserListItem : OpaqueWidget { | |||||
| gScene->setOverlay(NULL); | gScene->setOverlay(NULL); | ||||
| } | } | ||||
| } | } | ||||
| void onMouseEnter(EventMouseEnter &e) override; | |||||
| }; | }; | ||||
| struct ModelItem : BrowserListItem { | struct ModelItem : BrowserListItem { | ||||
| Model *model; | Model *model; | ||||
| Label *manufacturerLabel; | Label *manufacturerLabel; | ||||
| @@ -286,12 +288,10 @@ struct SearchModuleField : TextField { | |||||
| }; | }; | ||||
| struct ModuleBrowser : OpaqueWidget { | |||||
| struct ModuleBrowser : VirtualWidget { | |||||
| SearchModuleField *searchField; | SearchModuleField *searchField; | ||||
| ScrollWidget *moduleScroll; | ScrollWidget *moduleScroll; | ||||
| BrowserList *moduleList; | BrowserList *moduleList; | ||||
| std::string manufacturerFilter; | |||||
| ModelTag tagFilter = NO_TAG; | |||||
| std::set<std::string> availableManufacturers; | std::set<std::string> availableManufacturers; | ||||
| std::set<ModelTag> availableTags; | std::set<ModelTag> availableTags; | ||||
| @@ -337,10 +337,10 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| } | } | ||||
| bool isModelFiltered(Model *model) { | bool isModelFiltered(Model *model) { | ||||
| if (!manufacturerFilter.empty() && model->manufacturer != manufacturerFilter) | |||||
| if (!sManufacturerFilter.empty() && model->manufacturer != sManufacturerFilter) | |||||
| return false; | return false; | ||||
| if (tagFilter != NO_TAG) { | |||||
| auto it = std::find(model->tags.begin(), model->tags.end(), tagFilter); | |||||
| if (sTagFilter != NO_TAG) { | |||||
| auto it = std::find(model->tags.begin(), model->tags.end(), sTagFilter); | |||||
| if (it == model->tags.end()) | if (it == model->tags.end()) | ||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -367,7 +367,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| } | } | ||||
| // Manufacturers | // Manufacturers | ||||
| if (manufacturerFilter.empty() && tagFilter == NO_TAG) { | |||||
| if (sManufacturerFilter.empty() && sTagFilter == NO_TAG) { | |||||
| // Manufacturer items | // Manufacturer items | ||||
| { | { | ||||
| SeparatorItem *item = new SeparatorItem(); | SeparatorItem *item = new SeparatorItem(); | ||||
| @@ -401,7 +401,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| } | } | ||||
| // Models | // Models | ||||
| if (!manufacturerFilter.empty() || tagFilter != NO_TAG || !search.empty()) { | |||||
| if (!sManufacturerFilter.empty() || sTagFilter != NO_TAG || !search.empty()) { | |||||
| { | { | ||||
| SeparatorItem *item = new SeparatorItem(); | SeparatorItem *item = new SeparatorItem(); | ||||
| item->setText("Modules"); | item->setText("Modules"); | ||||
| @@ -424,7 +424,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| box.pos.y = 60; | box.pos.y = 60; | ||||
| box.size.y = parent->box.size.y - 2 * box.pos.y; | box.size.y = parent->box.size.y - 2 * box.pos.y; | ||||
| moduleScroll->box.size.y = box.size.y - moduleScroll->box.pos.y; | |||||
| moduleScroll->box.size.y = min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y); | |||||
| gFocusedWidget = searchField; | gFocusedWidget = searchField; | ||||
| Widget::step(); | Widget::step(); | ||||
| } | } | ||||
| @@ -435,7 +435,7 @@ struct ModuleBrowser : OpaqueWidget { | |||||
| void ManufacturerItem::onAction(EventAction &e) { | void ManufacturerItem::onAction(EventAction &e) { | ||||
| ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ||||
| moduleBrowser->manufacturerFilter = manufacturer; | |||||
| sManufacturerFilter = manufacturer; | |||||
| moduleBrowser->clearSearch(); | moduleBrowser->clearSearch(); | ||||
| moduleBrowser->refreshSearch(); | moduleBrowser->refreshSearch(); | ||||
| e.consumed = false; | e.consumed = false; | ||||
| @@ -443,7 +443,7 @@ void ManufacturerItem::onAction(EventAction &e) { | |||||
| void TagItem::onAction(EventAction &e) { | void TagItem::onAction(EventAction &e) { | ||||
| ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ||||
| moduleBrowser->tagFilter = tag; | |||||
| sTagFilter = tag; | |||||
| moduleBrowser->clearSearch(); | moduleBrowser->clearSearch(); | ||||
| moduleBrowser->refreshSearch(); | moduleBrowser->refreshSearch(); | ||||
| e.consumed = false; | e.consumed = false; | ||||
| @@ -451,8 +451,8 @@ void TagItem::onAction(EventAction &e) { | |||||
| void ClearFilterItem::onAction(EventAction &e) { | void ClearFilterItem::onAction(EventAction &e) { | ||||
| ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>(); | ||||
| moduleBrowser->manufacturerFilter = ""; | |||||
| moduleBrowser->tagFilter = NO_TAG; | |||||
| sManufacturerFilter = ""; | |||||
| sTagFilter = NO_TAG; | |||||
| moduleBrowser->clearSearch(); | moduleBrowser->clearSearch(); | ||||
| moduleBrowser->refreshSearch(); | moduleBrowser->refreshSearch(); | ||||
| e.consumed = false; | e.consumed = false; | ||||
| @@ -475,9 +475,11 @@ void FavoriteRadioButton::onAction(EventAction &e) { | |||||
| moduleBrowser->refreshSearch(); | moduleBrowser->refreshSearch(); | ||||
| } | } | ||||
| void BrowserListItem::onMouseEnter(EventMouseEnter &e) { | |||||
| // BrowserList *list = getAncestorOfType<BrowserList>(); | |||||
| // list->selectItem(this); | |||||
| void BrowserListItem::onDragStart(EventDragStart &e) { | |||||
| BrowserList *list = dynamic_cast<BrowserList*>(parent); | |||||
| if (list) { | |||||
| list->selectItem(this); | |||||
| } | |||||
| } | } | ||||
| void SearchModuleField::onTextChange() { | void SearchModuleField::onTextChange() { | ||||