| @@ -70,7 +70,7 @@ struct RackWidget : widget::OpaqueWidget { | |||
| std::vector<ModuleWidget*> getModules(); | |||
| bool hasModules(); | |||
| void updateModuleOldPositions(); | |||
| history::ComplexAction* getModuleDragAction(); | |||
| history::ComplexAction* getModuleMoveAction(); | |||
| // Module selection methods | |||
| @@ -82,6 +82,9 @@ static ModuleWidget* chooseModel(plugin::Model* model) { | |||
| mi.added++; | |||
| mi.lastAdded = system::getUnixTime(); | |||
| history::ComplexAction* h = new history::ComplexAction; | |||
| h->name = "add module"; | |||
| // Create Module and ModuleWidget | |||
| INFO("Creating module %s", model->getFullName().c_str()); | |||
| engine::Module* module = model->createModule(); | |||
| @@ -89,16 +92,20 @@ static ModuleWidget* chooseModel(plugin::Model* model) { | |||
| INFO("Creating module widget %s", model->getFullName().c_str()); | |||
| ModuleWidget* moduleWidget = model->createModuleWidget(module); | |||
| APP->scene->rack->updateModuleOldPositions(); | |||
| APP->scene->rack->addModuleAtMouse(moduleWidget); | |||
| h->push(APP->scene->rack->getModuleMoveAction()); | |||
| // Load template preset | |||
| moduleWidget->loadTemplate(); | |||
| // history::ModuleAdd | |||
| history::ModuleAdd* h = new history::ModuleAdd; | |||
| h->name = "create module"; | |||
| history::ModuleAdd* ha = new history::ModuleAdd; | |||
| // This serializes the module so redoing returns to the current state. | |||
| h->setModule(moduleWidget); | |||
| ha->setModule(moduleWidget); | |||
| h->push(ha); | |||
| APP->history->push(h); | |||
| // Hide Module Browser | |||
| @@ -402,12 +402,12 @@ void ModuleWidget::onButton(const ButtonEvent& e) { | |||
| // Toggle selection on Shift-click | |||
| if ((e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
| APP->scene->rack->select(this, true); | |||
| return; | |||
| } | |||
| if ((e.mods & RACK_MOD_MASK) == 0) { | |||
| // If module positions are locked, don't consume left-click | |||
| if (settings::lockModules) { | |||
| return; | |||
| } | |||
| // If module positions are locked, don't consume left-click | |||
| if (settings::lockModules) { | |||
| return; | |||
| } | |||
| internal->dragOffset = e.pos; | |||
| @@ -442,7 +442,7 @@ void ModuleWidget::onDragEnd(const DragEndEvent& e) { | |||
| // The next time the module is dragged, it should always move immediately | |||
| internal->dragEnabled = true; | |||
| history::ComplexAction* h = APP->scene->rack->getModuleDragAction(); | |||
| history::ComplexAction* h = APP->scene->rack->getModuleMoveAction(); | |||
| if (!h->isEmpty()) | |||
| APP->history->push(h); | |||
| else | |||
| @@ -816,7 +816,9 @@ void ModuleWidget::cloneAction(bool cloneCables) { | |||
| // Clone ModuleWidget | |||
| INFO("Creating module widget %s", model->getFullName().c_str()); | |||
| ModuleWidget* clonedModuleWidget = model->createModuleWidget(clonedModule); | |||
| APP->scene->rack->updateModuleOldPositions(); | |||
| APP->scene->rack->addModuleAtMouse(clonedModuleWidget); | |||
| h->push(APP->scene->rack->getModuleMoveAction()); | |||
| // history::ModuleAdd | |||
| history::ModuleAdd* hma = new history::ModuleAdd; | |||
| @@ -871,7 +873,7 @@ void ModuleWidget::bypassAction(bool bypassed) { | |||
| void ModuleWidget::removeAction() { | |||
| history::ComplexAction* complexAction = new history::ComplexAction; | |||
| complexAction->name = "remove module"; | |||
| complexAction->name = "delete module"; | |||
| appendDisconnectActions(complexAction); | |||
| // history::ModuleRemove | |||
| @@ -536,13 +536,20 @@ void RackWidget::pasteModuleJsonAction(json_t* moduleJ) { | |||
| assert(mw); | |||
| assert(mw->module); | |||
| history::ComplexAction* h = new history::ComplexAction; | |||
| h->name = "paste module"; | |||
| APP->engine->addModule(mw->module); | |||
| updateModuleOldPositions(); | |||
| addModuleAtMouse(mw); | |||
| h->push(getModuleMoveAction()); | |||
| // history::ModuleAdd | |||
| history::ModuleAdd* h = new history::ModuleAdd; | |||
| h->name = "paste module"; | |||
| h->setModule(mw); | |||
| history::ModuleAdd* ha = new history::ModuleAdd; | |||
| ha->setModule(mw); | |||
| h->push(ha); | |||
| APP->history->push(h); | |||
| } | |||
| @@ -591,7 +598,7 @@ void RackWidget::addModuleAtMouse(ModuleWidget* mw) { | |||
| assert(mw); | |||
| // Move module nearest to the mouse position | |||
| math::Vec pos = internal->mousePos.minus(mw->box.size.div(2)); | |||
| setModulePosNearest(mw, pos); | |||
| setModulePosForce(mw, pos); | |||
| addModule(mw); | |||
| } | |||
| @@ -783,7 +790,7 @@ void RackWidget::updateModuleOldPositions() { | |||
| } | |||
| } | |||
| history::ComplexAction* RackWidget::getModuleDragAction() { | |||
| history::ComplexAction* RackWidget::getModuleMoveAction() { | |||
| history::ComplexAction* h = new history::ComplexAction; | |||
| h->name = "move modules"; | |||
| @@ -1130,7 +1137,7 @@ bool RackWidget::isSelectionBypassed() { | |||
| void RackWidget::deleteSelectionAction() { | |||
| history::ComplexAction* complexAction = new history::ComplexAction; | |||
| complexAction->name = "remove modules"; | |||
| complexAction->name = "delete modules"; | |||
| // Copy selected set since removing ModuleWidgets modifies it. | |||
| std::set<ModuleWidget*> selectedModules = getSelected(); | |||