diff --git a/CHANGELOG.md b/CHANGELOG.md index ba67aa5e..d6944c6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Tip: Use `git checkout v0.4.0` for example to check out any previous version men ### dev +- Automatically scroll when dragging cables to the edge of the screen + - Audible Instruments - Added Low CPU mode to Braids for draft-quality rendering diff --git a/include/widgets.hpp b/include/widgets.hpp index 693bccc1..cdf56b9b 100644 --- a/include/widgets.hpp +++ b/include/widgets.hpp @@ -288,7 +288,6 @@ struct Menu : OpaqueWidget { // Resizes menu and calls addChild() void pushChild(Widget *child); void setChildMenu(Menu *menu); - void fit(); void step() override; void draw(NVGcontext *vg) override; bool onScrollOpaque(Vec scrollRel) override; @@ -300,7 +299,7 @@ struct MenuEntry : OpaqueWidget { MenuEntry() { box.size = Vec(0, BND_WIDGET_HEIGHT); } - virtual float computeMinWidth(NVGcontext *vg); + void step() override; }; struct MenuLabel : MenuEntry { @@ -308,9 +307,7 @@ struct MenuLabel : MenuEntry { }; struct MenuItem : MenuEntry { - float computeMinWidth(NVGcontext *vg) override; void draw(NVGcontext *vg) override; - virtual Menu *createChildMenu() {return NULL;} void onMouseEnter() override; void onDragDrop(Widget *origin) override; diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index e27624cf..1d32c3e3 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -453,6 +453,25 @@ struct AddManufacturerMenuItem : MenuItem { } }; +struct SearchModuleField : TextField { + void onTextChange() override { + Menu *parentMenu = getAncestorOfType(); + assert(parentMenu); + + for (Widget *w : parentMenu->children) { + AddManufacturerMenuItem *a = dynamic_cast(w); + if (!a) + continue; + if (a->manufacturerName == text) { + a->visible = true; + } + else { + a->visible = false; + } + } + } +}; + void RackWidget::onMouseDownOpaque(int button) { if (button == 1) { Vec modulePos = gMousePos.minus(getAbsolutePos()); @@ -460,11 +479,14 @@ void RackWidget::onMouseDownOpaque(int button) { menu->pushChild(construct(&MenuLabel::text, "Add module")); + /* // TODO make functional - TextField *searchField = construct(); + TextField *searchField = construct(); + searchField->box.size.x = 100.0; menu->pushChild(searchField); // Focus search field gFocusedWidget = searchField; + */ // Collect manufacturer names std::set manufacturerNames; diff --git a/src/widgets/Menu.cpp b/src/widgets/Menu.cpp index 4099b1a4..e0bef04a 100644 --- a/src/widgets/Menu.cpp +++ b/src/widgets/Menu.cpp @@ -27,35 +27,27 @@ void Menu::setChildMenu(Menu *menu) { } } -void Menu::fit() { +void Menu::step() { // Try to fit into the parent's box if (parent) box = box.clamp(Rect(Vec(0, 0), parent->box.size)); -} -void Menu::step() { - fit(); Widget::step(); -} -void Menu::draw(NVGcontext *vg) { // Resize the width to the widest child for (Widget *child : children) { - MenuEntry *menuEntry = dynamic_cast(child); - if (!menuEntry) - continue; - float width = menuEntry->computeMinWidth(vg); - if (width > box.size.x) { - box.size.x = width; + if (child->box.size.x > box.size.x) { + box.size.x = child->box.size.x; } } // Resize widths of children for (Widget *child : children) { child->box.size.x = box.size.x; } +} +void Menu::draw(NVGcontext *vg) { bndMenuBackground(vg, 0.0, 0.0, box.size.x, box.size.y, BND_CORNER_NONE); - Widget::draw(vg); } @@ -65,7 +57,6 @@ bool Menu::onScrollOpaque(Vec scrollRel) { return true; if (!parent->box.contains(box)) box.pos = box.pos.plus(scrollRel); - fit(); return true; } diff --git a/src/widgets/MenuEntry.cpp b/src/widgets/MenuEntry.cpp index 6df5fd7b..e4ea9502 100644 --- a/src/widgets/MenuEntry.cpp +++ b/src/widgets/MenuEntry.cpp @@ -1,12 +1,17 @@ #include "widgets.hpp" +#include "gui.hpp" namespace rack { -float MenuEntry::computeMinWidth(NVGcontext *vg) { +void MenuEntry::step() { // Add 10 more pixels because Retina measurements are sometimes too small - return bndLabelWidth(vg, -1, text.c_str()) + 10.0; + const float rightPadding = 10.0; + // HACK use gVg from the gui. + // All this does is inspect the font, so it shouldn't modify gVg and should work when called from a FramebufferWidget for example. + box.size.x = bndLabelWidth(gVg, -1, text.c_str()) + bndLabelWidth(gVg, -1, rightText.c_str()) + rightPadding; + Widget::step(); } diff --git a/src/widgets/MenuItem.cpp b/src/widgets/MenuItem.cpp index 90e91869..8bc8c03e 100644 --- a/src/widgets/MenuItem.cpp +++ b/src/widgets/MenuItem.cpp @@ -4,12 +4,8 @@ namespace rack { -#define RIGHT_PADDING 10.0 #define BND_LABEL_FONT_SIZE 13 -float MenuItem::computeMinWidth(NVGcontext *vg) { - return MenuEntry::computeMinWidth(vg) + RIGHT_PADDING + bndLabelWidth(vg, -1, rightText.c_str()); -} void MenuItem::draw(NVGcontext *vg) { // Get state