Browse Source

Add "All cables" menu item to port context menu for dragging multiple cables.

tags/v2.6.0
Andrew Belt 5 months ago
parent
commit
854f2f121e
1 changed files with 42 additions and 15 deletions
  1. +42
    -15
      src/app/PortWidget.cpp

+ 42
- 15
src/app/PortWidget.cpp View File

@@ -17,7 +17,7 @@ namespace app {
struct PortWidget::Internal { 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;
std::vector<CableWidget*> overrideCws;
CableWidget* overrideCloneCw = NULL; CableWidget* overrideCloneCw = NULL;
bool overrideCreateCable = false; bool overrideCreateCable = false;
/** When dragging port, this is the grabbed end type of the cable. */ /** When dragging port, this is the grabbed end type of the cable. */
@@ -128,7 +128,7 @@ struct PortCableItem : ui::ColorDotMenuItem {
return; return;
if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & RACK_MOD_MASK) == 0) { if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & RACK_MOD_MASK) == 0) {
// Set PortWidget::onDragStart overrides // Set PortWidget::onDragStart overrides
pw->internal->overrideCw = cw;
pw->internal->overrideCws.push_back(cw);


// Pretend the PortWidget was clicked // Pretend the PortWidget was clicked
e.consume(pw); e.consume(pw);
@@ -156,6 +156,25 @@ struct PortCableItem : ui::ColorDotMenuItem {
}; };




struct PortAllCablesItem : ui::MenuItem {
PortWidget* pw;
std::vector<CableWidget*> cws;

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

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


struct PortCreateCableItem : ui::MenuItem { struct PortCreateCableItem : ui::MenuItem {
PortWidget* pw; PortWidget* pw;


@@ -321,6 +340,13 @@ void PortWidget::createContextMenu() {
item->cw = cw; item->cw = cw;
menu->addChild(item); menu->addChild(item);
} }

if (cws.size() > 1) {
PortAllCablesItem* item = createMenuItem<PortAllCablesItem>("All cables");
item->pw = this;
item->cws = cws;
menu->addChild(item);
}
} }


appendContextMenu(menu); appendContextMenu(menu);
@@ -393,7 +419,7 @@ void PortWidget::onDragStart(const DragStartEvent& e) {


DEFER({ DEFER({
// Reset overrides // Reset overrides
internal->overrideCw = NULL;
internal->overrideCws.clear();
internal->overrideCloneCw = NULL; internal->overrideCloneCw = NULL;
internal->overrideCreateCable = false; internal->overrideCreateCable = false;
}); });
@@ -406,7 +432,7 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
internal->history = new history::ComplexAction; internal->history = new history::ComplexAction;
internal->history->name = "move cable"; internal->history->name = "move cable";


CableWidget* cw = NULL;
std::vector<CableWidget*> cws;
int mods = APP->window->getMods(); int mods = APP->window->getMods();
if (internal->overrideCreateCable || (mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { if (internal->overrideCreateCable || (mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
// Create cable with Ctrl+drag or PortCreateCableItem // Create cable with Ctrl+drag or PortCreateCableItem
@@ -419,22 +445,27 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
cloneCw = APP->scene->rack->getTopCable(this); cloneCw = APP->scene->rack->getTopCable(this);


if (cloneCw) { if (cloneCw) {
cw = new CableWidget;
CableWidget* cw = new CableWidget;
cw->color = cloneCw->color; cw->color = cloneCw->color;
if (type == engine::Port::OUTPUT) if (type == engine::Port::OUTPUT)
cw->inputPort = cloneCw->inputPort; cw->inputPort = cloneCw->inputPort;
else else
cw->outputPort = cloneCw->outputPort; cw->outputPort = cloneCw->outputPort;
internal->draggedType = type; internal->draggedType = type;
APP->scene->rack->addCable(cw);
cws.push_back(cw);
} }
} }
else { else {
// Grab cable on top of stack // Grab cable on top of stack
cw = internal->overrideCw;
if (!cw)
cw = APP->scene->rack->getTopCable(this);
cws = internal->overrideCws;
if (cws.empty()) {
CableWidget* cw = APP->scene->rack->getTopCable(this);
if (cw)
cws.push_back(cw);
}


if (cw) {
for (CableWidget* cw : cws) {
// history::CableRemove // history::CableRemove
history::CableRemove* h = new history::CableRemove; history::CableRemove* h = new history::CableRemove;
h->setCable(cw); h->setCable(cw);
@@ -454,8 +485,8 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
} }


// If not using existing cable, create new cable // If not using existing cable, create new cable
if (!cw) {
cw = new CableWidget;
if (cws.empty()) {
CableWidget* cw = new CableWidget;


// Set color // Set color
cw->color = APP->scene->rack->getNextCableColor(); cw->color = APP->scene->rack->getNextCableColor();
@@ -463,10 +494,6 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
// Set port // Set port
cw->getPort(type) = this; cw->getPort(type) = this;
internal->draggedType = (type == engine::Port::INPUT) ? engine::Port::OUTPUT : engine::Port::INPUT; internal->draggedType = (type == engine::Port::INPUT) ? engine::Port::OUTPUT : engine::Port::INPUT;
}

// Add cable to rack if not already added
if (!cw->getParent()) {
APP->scene->rack->addCable(cw); APP->scene->rack->addCable(cw);
} }
} }


Loading…
Cancel
Save