Browse Source

When dragging cables, combine CableAdd and CableRemove actions into a ComplexAction that is pushed when dragging stops.

tags/v2.6.0
Andrew Belt 6 months ago
parent
commit
407b7cbf25
1 changed files with 42 additions and 21 deletions
  1. +42
    -21
      src/app/PortWidget.cpp

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

@@ -22,6 +22,8 @@ struct PortWidget::Internal {
bool overrideCreateCable = false;
/** When dragging port, this is the grabbed end type of the cable. */
engine::Port::Type draggedType = engine::Port::INPUT;
/** Created when dragging starts, deleted when it ends. */
history::ComplexAction* history = NULL;
};


@@ -396,6 +398,14 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
internal->overrideCreateCable = false;
});

// Create ComplexAction
if (internal->history) {
delete internal->history;
internal->history = NULL;
}
internal->history = new history::ComplexAction;
internal->history->name = "move cable";

CableWidget* cw = NULL;
int mods = APP->window->getMods();
if (internal->overrideCreateCable || (mods & RACK_MOD_MASK) == RACK_MOD_CTRL) {
@@ -415,7 +425,6 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
cw->inputPort = cloneCw->inputPort;
else
cw->outputPort = cloneCw->outputPort;
cw->updateCable();
internal->draggedType = type;
}
}
@@ -429,7 +438,7 @@ void PortWidget::onDragStart(const DragStartEvent& e) {
// history::CableRemove
history::CableRemove* h = new history::CableRemove;
h->setCable(cw);
APP->history->push(h);
internal->history->push(h);

// Reuse existing cable
cw->getPort(type) = NULL;
@@ -453,7 +462,6 @@ void PortWidget::onDragStart(const DragStartEvent& e) {

// Set port
cw->getPort(type) = this;
cw->updateCable();
internal->draggedType = (type == engine::Port::INPUT) ? engine::Port::OUTPUT : engine::Port::INPUT;
}

@@ -468,32 +476,32 @@ void PortWidget::onDragEnd(const DragEndEvent& e) {
if (e.button != GLFW_MOUSE_BUTTON_LEFT)
return;

std::vector<CableWidget*> cws = APP->scene->rack->getIncompleteCables();
if (cws.empty())
// Should never happen since it's created in onDragStart().
if (!internal->history)
return;

history::ComplexAction* h = new history::ComplexAction;

for (CableWidget* cw : cws) {
if (cw->isComplete()) {
// history::CableAdd
history::CableAdd* hAdd = new history::CableAdd;
hAdd->setCable(cw);
h->push(hAdd);
}
else {
APP->scene->rack->removeCable(cw);
delete cw;
}
// Remove all incomplete cables
for (CableWidget* cw : APP->scene->rack->getIncompleteCables()) {
APP->scene->rack->removeCable(cw);
delete cw;
}

// Push history
if (h->isEmpty()) {
delete h;
if (internal->history->isEmpty()) {
// No history actions, don't push anything
delete internal->history;
}
else if (internal->history->actions.size() == 1) {
// Push single history action
APP->history->push(internal->history->actions[0]);
internal->history->actions.clear();
delete internal->history;
}
else {
APP->history->push(h);
// Push ComplexAction
APP->history->push(internal->history);
}
internal->history = NULL;
}


@@ -511,6 +519,7 @@ void PortWidget::onDragDrop(const DragDropEvent& e) {
}

for (CableWidget* cw : APP->scene->rack->getIncompleteCables()) {
// These should already be NULL because onDragLeave() is called immediately before onDragDrop().
cw->hoveredOutputPort = NULL;
cw->hoveredInputPort = NULL;
if (type == engine::Port::OUTPUT) {
@@ -518,13 +527,25 @@ void PortWidget::onDragDrop(const DragDropEvent& e) {
if (cw->inputPort && !APP->scene->rack->getCable(this, cw->inputPort)) {
cw->outputPort = this;
}
else {
continue;
}
}
else {
if (cw->outputPort && !APP->scene->rack->getCable(cw->outputPort, this)) {
cw->inputPort = this;
}
else {
continue;
}
}
cw->updateCable();

history::CableAdd* h = new history::CableAdd;
h->setCable(cw);
pwOrigin->internal->history->push(h);

// TODO Reject history if plugging into same port
}
}



Loading…
Cancel
Save