From 7d6b9d22119a39013e074ad137e067bf3080263c Mon Sep 17 00:00:00 2001 From: Andrew Belt Date: Mon, 27 Jun 2022 15:48:11 -0400 Subject: [PATCH] Add squeezeModules setting and menu bar item to toggle new squeeze or old nearest/force behavior. --- include/settings.hpp | 1 + src/app/MenuBar.cpp | 2 ++ src/app/ModuleWidget.cpp | 11 ++++++++++- src/app/RackWidget.cpp | 25 +++++++++++++++---------- src/settings.cpp | 7 +++++++ 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/include/settings.hpp b/include/settings.hpp index deb4dd7a..1685c3bc 100644 --- a/include/settings.hpp +++ b/include/settings.hpp @@ -66,6 +66,7 @@ extern int threadCount; extern bool tooltips; extern bool cpuMeter; extern bool lockModules; +extern bool squeezeModules; extern int frameSwapInterval; extern float autosaveInterval; extern bool skipLoadOnLaunch; diff --git a/src/app/MenuBar.cpp b/src/app/MenuBar.cpp index 93e2e0a9..b61adb49 100644 --- a/src/app/MenuBar.cpp +++ b/src/app/MenuBar.cpp @@ -467,6 +467,8 @@ struct ViewButton : MenuButton { menu->addChild(knobScrollSensitivitySlider); menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules)); + + menu->addChild(createBoolPtrMenuItem("Auto-squeeze modules when dragging", "", &settings::squeezeModules)); } }; diff --git a/src/app/ModuleWidget.cpp b/src/app/ModuleWidget.cpp index fbf5371e..74c56648 100644 --- a/src/app/ModuleWidget.cpp +++ b/src/app/ModuleWidget.cpp @@ -478,13 +478,22 @@ void ModuleWidget::onDragMove(const DragMoveEvent& e) { math::Vec pos = mousePos; pos.x -= internal->dragOffset.x; pos.y -= RACK_GRID_HEIGHT / 2; + if (APP->scene->rack->isSelected(this)) { pos = (pos / RACK_GRID_SIZE).round() * RACK_GRID_SIZE; math::Vec delta = pos.minus(box.pos); APP->scene->rack->setSelectionPosNearest(delta); } else { - APP->scene->rack->setModulePosForce(this, pos); + if (settings::squeezeModules) { + APP->scene->rack->setModulePosSqueeze(this, pos); + } + else { + if ((APP->window->getMods() & RACK_MOD_MASK) == RACK_MOD_CTRL) + APP->scene->rack->setModulePosForce(this, pos); + else + APP->scene->rack->setModulePosNearest(this, pos); + } } } } diff --git a/src/app/RackWidget.cpp b/src/app/RackWidget.cpp index 94d89ffb..c3a3ef66 100644 --- a/src/app/RackWidget.cpp +++ b/src/app/RackWidget.cpp @@ -598,7 +598,12 @@ void RackWidget::addModuleAtMouse(ModuleWidget* mw) { assert(mw); // Move module nearest to the mouse position math::Vec pos = internal->mousePos.minus(mw->box.size.div(2)); - setModulePosSqueeze(mw, pos); + + if (settings::squeezeModules) + setModulePosSqueeze(mw, pos); + else + setModulePosNearest(mw, pos); + addModule(mw); } @@ -666,21 +671,21 @@ bool RackWidget::requestModulePos(ModuleWidget* mw, math::Vec pos) { } static math::Vec eachNearestGridPos(math::Vec pos, std::function f) { - math::Vec leftPos = pos.div(RACK_GRID_SIZE).floor().mult(RACK_GRID_SIZE); - math::Vec rightPos = leftPos + math::Vec(RACK_GRID_WIDTH, 0); + math::Vec leftPos = (pos / RACK_GRID_SIZE).round(); + math::Vec rightPos = leftPos + math::Vec(1, 0); while (true) { - if (f(leftPos)) - return leftPos; - leftPos.x -= RACK_GRID_WIDTH; + if (f(leftPos * RACK_GRID_SIZE)) + return leftPos * RACK_GRID_SIZE; + leftPos.x -= 1; - if (f(rightPos)) - return rightPos; - rightPos.x += RACK_GRID_WIDTH; + if (f(rightPos * RACK_GRID_SIZE)) + return rightPos * RACK_GRID_SIZE; + rightPos.x += 1; } assert(false); - return leftPos; + return math::Vec(); } void RackWidget::setModulePosNearest(ModuleWidget* mw, math::Vec pos) { diff --git a/src/settings.cpp b/src/settings.cpp index 59d91ec2..af7e2632 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -40,6 +40,7 @@ int threadCount = 1; bool tooltips = true; bool cpuMeter = false; bool lockModules = false; +bool squeezeModules = true; #if defined ARCH_MAC // Most Mac GPUs can't handle rendering the screen every frame, so use ~30 Hz by default. int frameSwapInterval = 2; @@ -153,6 +154,8 @@ json_t* toJson() { json_object_set_new(rootJ, "lockModules", json_boolean(lockModules)); + json_object_set_new(rootJ, "squeezeModules", json_boolean(squeezeModules)); + json_object_set_new(rootJ, "frameSwapInterval", json_integer(frameSwapInterval)); json_object_set_new(rootJ, "autosaveInterval", json_real(autosaveInterval)); @@ -338,6 +341,10 @@ void fromJson(json_t* rootJ) { if (lockModulesJ) lockModules = json_boolean_value(lockModulesJ); + json_t* squeezeModulesJ = json_object_get(rootJ, "squeezeModules"); + if (squeezeModulesJ) + squeezeModules = json_boolean_value(squeezeModulesJ); + json_t* frameSwapIntervalJ = json_object_get(rootJ, "frameSwapInterval"); if (frameSwapIntervalJ) frameSwapInterval = json_integer_value(frameSwapIntervalJ);