Browse Source

In RackWidget::setModulePosForce(), only shove right modules left if module's new box does not occupy old box.

tags/v2.1.0
Andrew Belt 2 years ago
parent
commit
074bca645a
1 changed files with 27 additions and 29 deletions
  1. +27
    -29
      src/app/RackWidget.cpp

+ 27
- 29
src/app/RackWidget.cpp View File

@@ -710,35 +710,33 @@ void RackWidget::setModulePosForce(ModuleWidget* mw, math::Vec pos) {
return a->box.getLeft() < b->box.getLeft(); return a->box.getLeft() < b->box.getLeft();
}; };


// Collect modules to the right of old pos
std::set<widget::Widget*, decltype(cmp)> rightOldModules(cmp);
for (widget::Widget* w2 : internal->moduleContainer->children) {
// Skip this module
if (w2 == mw)
continue;
// Modules must be on the same row as old pos
if (w2->box.getTop() != mw->box.getTop())
continue;
// Insert into rightOldModules
if (w2->box.getCenter().x >= mw->box.getCenter().x)
rightOldModules.insert(w2);
}

// Shove old right modules to the left
float xDelta = newBox.pos.x - mw->box.pos.x;
if (newBox.pos.y != mw->box.pos.y || xDelta > 0 || xDelta < -mw->box.size.x) {
xDelta = -mw->box.size.x;
}

float xRight = mw->box.getRight();
for (auto it = rightOldModules.begin(); it != rightOldModules.end(); it++) {
widget::Widget* w2 = *it;
// Break when module is no longer touching
if (xRight < w2->box.getLeft())
break;
xRight = w2->box.getRight();
// Move module to the left by the width of mw, so it replaces its position
w2->box.pos.x += xDelta;
// Check if new box occupies old box
if (!(newBox.pos.y == mw->box.pos.y && newBox.getLeft() <= mw->box.getRight() && newBox.getRight() >= mw->box.getLeft())) {
// Collect modules to the right of old pos
std::set<widget::Widget*, decltype(cmp)> rightOldModules(cmp);
for (widget::Widget* w2 : internal->moduleContainer->children) {
// Skip this module
if (w2 == mw)
continue;
// Modules must be on the same row as old pos
if (w2->box.getTop() != mw->box.getTop())
continue;
// Insert into rightOldModules
if (w2->box.getCenter().x >= mw->box.getCenter().x)
rightOldModules.insert(w2);
}

// Shove old right modules to the left
float xRight = mw->box.getRight();
for (auto it = rightOldModules.begin(); it != rightOldModules.end(); it++) {
widget::Widget* w2 = *it;
// Break when module is no longer touching
if (xRight < w2->box.getLeft())
break;
xRight = w2->box.getRight();
// Move module to the left by the width of mw, so it replaces its position
w2->box.pos.x -= mw->box.size.x;
}
} }


// Collect modules to the left and right of pos // Collect modules to the left and right of pos


Loading…
Cancel
Save