diff --git a/src/core/Blank.cpp b/src/core/Blank.cpp index 07f4c691..be397c04 100644 --- a/src/core/Blank.cpp +++ b/src/core/Blank.cpp @@ -5,8 +5,8 @@ using namespace rack; struct ModuleResizeHandle : Widget { bool right = false; - float originalWidth; - float totalX; + float dragX; + Rect originalBox; ModuleResizeHandle() { box.size = Vec(RACK_GRID_WIDTH * 1, RACK_GRID_HEIGHT); } @@ -17,25 +17,28 @@ struct ModuleResizeHandle : Widget { } } void onDragStart(EventDragStart &e) override { - assert(parent); - originalWidth = parent->box.size.x; - totalX = 0.0; + dragX = gRackWidget->lastMousePos.x; + ModuleWidget *m = getAncestorOfType(); + originalBox = m->box; } void onDragMove(EventDragMove &e) override { - ModuleWidget *m = dynamic_cast(parent); - assert(m); - totalX += e.mouseRel.x; - float targetWidth = originalWidth; - if (right) - targetWidth += totalX; - else - targetWidth -= totalX; - targetWidth = RACK_GRID_WIDTH * roundf(targetWidth / RACK_GRID_WIDTH); - targetWidth = fmaxf(targetWidth, RACK_GRID_WIDTH * 3); - Rect newBox = m->box; - newBox.size.x = targetWidth; - if (!right) { - newBox.pos.x = m->box.pos.x + m->box.size.x - newBox.size.x; + ModuleWidget *m = getAncestorOfType(); + + float newDragX = gRackWidget->lastMousePos.x; + float deltaX = newDragX - dragX; + + Rect newBox = originalBox; + const float minWidth = 3 * RACK_GRID_WIDTH; + if (right) { + newBox.size.x += deltaX; + newBox.size.x = fmaxf(newBox.size.x, minWidth); + newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; + } + else { + newBox.size.x -= deltaX; + newBox.size.x = fmaxf(newBox.size.x, minWidth); + newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; + newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; } gRackWidget->requestModuleBox(m, newBox); }