Browse Source

Add PortCloneCableItem implementation.

tags/v2.0.0
Andrew Belt 3 years ago
parent
commit
d64a8da846
1 changed files with 38 additions and 9 deletions
  1. +38
    -9
      src/app/PortWidget.cpp

+ 38
- 9
src/app/PortWidget.cpp View File

@@ -18,6 +18,7 @@ struct PortWidget::Internal {
ui::Tooltip* tooltip = NULL; ui::Tooltip* tooltip = NULL;
/** For overriding onDragStart behavior by menu items. */ /** For overriding onDragStart behavior by menu items. */
CableWidget* overrideCw = NULL; CableWidget* overrideCw = NULL;
CableWidget* overrideCloneCw = NULL;
bool overrideCreateCable = false; bool overrideCreateCable = false;
NVGcolor overrideColor = color::BLACK_TRANSPARENT; NVGcolor overrideColor = color::BLACK_TRANSPARENT;
}; };
@@ -91,6 +92,27 @@ struct ColorMenuItem : ui::MenuItem {
}; };




struct PortCloneCableItem : ui::MenuItem {
PortWidget* pw;
CableWidget* cw;

void onButton(const ButtonEvent& e) override {
OpaqueWidget::onButton(e);
if (disabled)
return;
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & RACK_MOD_MASK) == 0) {
// Set PortWidget::onDragStart overrides
pw->internal->overrideCloneCw = cw;

// Pretend the PortWidget was clicked
e.consume(pw);
// Deletes `this`
doAction();
}
}
};


struct PortCableItem : ColorMenuItem { struct PortCableItem : ColorMenuItem {
PortWidget* pw; PortWidget* pw;
CableWidget* cw; CableWidget* cw;
@@ -211,11 +233,12 @@ void PortWidget::createContextMenu() {
!topCw !topCw
)); ));


// TODO
if (type == engine::Port::INPUT) { if (type == engine::Port::INPUT) {
menu->addChild(createMenuItem("Duplicate top cable", RACK_MOD_CTRL_NAME "+drag", NULL, true));
}
else {
PortCloneCableItem* item = createMenuItem<PortCloneCableItem>("Duplicate top cable", RACK_MOD_CTRL_NAME "+drag");
item->disabled = !topCw;
item->pw = this;
item->cw = topCw;
menu->addChild(item);
} }


menu->addChild(new ui::MenuSeparator); menu->addChild(new ui::MenuSeparator);
@@ -317,6 +340,7 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
DEFER({ DEFER({
// Reset overrides // Reset overrides
internal->overrideCw = NULL; internal->overrideCw = NULL;
internal->overrideCloneCw = NULL;
internal->overrideCreateCable = false; internal->overrideCreateCable = false;
internal->overrideColor = color::BLACK_TRANSPARENT; internal->overrideColor = color::BLACK_TRANSPARENT;
}); });
@@ -325,18 +349,23 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
if (internal->overrideCreateCable) { if (internal->overrideCreateCable) {
// Keep cable NULL. Will be created below // Keep cable NULL. Will be created below
} }
else if ((APP->window->getMods() & RACK_MOD_MASK) == RACK_MOD_CTRL) {
else if (internal->overrideCloneCw || (APP->window->getMods() & RACK_MOD_MASK) == RACK_MOD_CTRL) {
if (type == engine::Port::OUTPUT) { if (type == engine::Port::OUTPUT) {
// Ctrl-clicking an output creates a new cable. // Ctrl-clicking an output creates a new cable.
// Keep cable NULL. Will be created below // Keep cable NULL. Will be created below
} }
else { else {
// Ctrl-clicking an input clones the cable already patched to it. // Ctrl-clicking an input clones the cable already patched to it.
CableWidget* topCw = APP->scene->rack->getTopCable(this);
if (topCw) {
CableWidget* cloneCw;
if (internal->overrideCloneCw)
cloneCw = internal->overrideCloneCw;
else
cloneCw = APP->scene->rack->getTopCable(this);

if (cloneCw) {
cw = new CableWidget; cw = new CableWidget;
cw->color = topCw->color;
cw->outputPort = topCw->outputPort;
cw->color = cloneCw->color;
cw->outputPort = cloneCw->outputPort;
cw->updateCable(); cw->updateCable();
} }
} }


Loading…
Cancel
Save