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