Browse Source

Add squeezeModules setting and menu bar item to toggle new squeeze or old nearest/force behavior.

tags/v2.1.2
Andrew Belt 2 years ago
parent
commit
7d6b9d2211
5 changed files with 35 additions and 11 deletions
  1. +1
    -0
      include/settings.hpp
  2. +2
    -0
      src/app/MenuBar.cpp
  3. +10
    -1
      src/app/ModuleWidget.cpp
  4. +15
    -10
      src/app/RackWidget.cpp
  5. +7
    -0
      src/settings.cpp

+ 1
- 0
include/settings.hpp View File

@@ -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;


+ 2
- 0
src/app/MenuBar.cpp View File

@@ -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));
}
};



+ 10
- 1
src/app/ModuleWidget.cpp View File

@@ -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);
}
}
}
}


+ 15
- 10
src/app/RackWidget.cpp View File

@@ -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<bool(math::Vec pos)> 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) {


+ 7
- 0
src/settings.cpp View File

@@ -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);


Loading…
Cancel
Save