Browse Source

Add Shift-click module selecting. When dragging modules, always set the y position to the rack row the mouse is hovering.

tags/v2.0.0
Andrew Belt 3 years ago
parent
commit
6d539f04e5
2 changed files with 34 additions and 28 deletions
  1. +1
    -1
      include/app/ModuleWidget.hpp
  2. +33
    -27
      src/app/ModuleWidget.cpp

+ 1
- 1
include/app/ModuleWidget.hpp View File

@@ -63,8 +63,8 @@ struct ModuleWidget : widget::OpaqueWidget {
*/
virtual void appendContextMenu(ui::Menu* menu) {}

void onButton(const ButtonEvent& e) override;
void onHoverKey(const HoverKeyEvent& e) override;
void onButton(const ButtonEvent& e) override;
void onDragStart(const DragStartEvent& e) override;
void onDragEnd(const DragEndEvent& e) override;
void onDragMove(const DragMoveEvent& e) override;


+ 33
- 27
src/app/ModuleWidget.cpp View File

@@ -255,35 +255,15 @@ void ModuleWidget::drawShadow(const DrawArgs& args) {
nvgBeginPath(args.vg);
float r = 20; // Blur radius
float c = 20; // Corner radius
math::Vec b = math::Vec(-10, 30); // Offset from each corner
nvgRect(args.vg, b.x - r, b.y - r, box.size.x - 2 * b.x + 2 * r, box.size.y - 2 * b.y + 2 * r);
math::Rect shadowBox = box.zeroPos().grow(math::Vec(10, -30));
math::Rect shadowOutsideBox = shadowBox.grow(math::Vec(r, r));
nvgRect(args.vg, RECT_ARGS(shadowOutsideBox));
NVGcolor shadowColor = nvgRGBAf(0, 0, 0, 0.2);
NVGcolor transparentColor = nvgRGBAf(0, 0, 0, 0);
nvgFillPaint(args.vg, nvgBoxGradient(args.vg, b.x, b.y, box.size.x - 2 * b.x, box.size.y - 2 * b.y, c, r, shadowColor, transparentColor));
nvgFillPaint(args.vg, nvgBoxGradient(args.vg, RECT_ARGS(shadowBox), c, r, shadowColor, transparentColor));
nvgFill(args.vg);
}

void ModuleWidget::onButton(const ButtonEvent& e) {
// Don't consume left button if `lockModules` is enabled.
if (settings::lockModules)
Widget::onButton(e);
else
OpaqueWidget::onButton(e);

// Set starting drag position even if we don't consume it
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) {
internal->dragOffset = e.pos;
}

if (e.isConsumed())
return;

if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_RIGHT) {
createContextMenu();
e.consume(this);
}
}

void ModuleWidget::onHoverKey(const HoverKeyEvent& e) {
OpaqueWidget::onHoverKey(e);
if (e.isConsumed())
@@ -328,6 +308,29 @@ void ModuleWidget::onHoverKey(const HoverKeyEvent& e) {
}
}

void ModuleWidget::onButton(const ButtonEvent& e) {
OpaqueWidget::onButton(e);

if (e.getTarget() == this) {
// Set starting drag position
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT) {
internal->dragOffset = e.pos;
}
// Toggle selection on Shift-click
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) {
internal->selected ^= true;
}
}

if (!e.isConsumed()) {
// Open context menu on right-click
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_RIGHT) {
createContextMenu();
e.consume(this);
}
}
}

void ModuleWidget::onDragStart(const DragStartEvent& e) {
if (e.button == GLFW_MOUSE_BUTTON_LEFT) {
// HACK Disable FramebufferWidget redrawing subpixels while dragging
@@ -365,14 +368,17 @@ void ModuleWidget::onDragMove(const DragMoveEvent& e) {
if (!internal->dragRackPos.isFinite())
internal->dragRackPos = mousePos;
// Check if the mouse has moved enough to start dragging the module.
const float dist = RACK_GRID_WIDTH;
if (internal->dragRackPos.minus(mousePos).square() >= std::pow(dist, 2))
const float minDist = RACK_GRID_WIDTH;
if (internal->dragRackPos.minus(mousePos).square() >= std::pow(minDist, 2))
internal->dragEnabled = true;
}

// Move module
if (internal->dragEnabled) {
math::Vec pos = mousePos.minus(internal->dragOffset);
// Round y coordinate to nearest rack height
math::Vec pos = mousePos;
pos.x -= internal->dragOffset.x;
pos.y -= RACK_GRID_HEIGHT / 2;
if ((APP->window->getMods() & RACK_MOD_MASK) == RACK_MOD_CTRL)
APP->scene->rack->setModulePosForce(this, pos);
else


Loading…
Cancel
Save