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