Browse Source

Move ModuleWidget cloning code from RackWidget to ModuleWidget. Make ModuleWidget position based on mouse position.

tags/v1.0.0
Andrew Belt 6 years ago
parent
commit
a77a04ad22
4 changed files with 21 additions and 15 deletions
  1. +1
    -0
      include/app/ModuleWidget.hpp
  2. +0
    -1
      include/app/RackWidget.hpp
  3. +20
    -3
      src/app/ModuleWidget.cpp
  4. +0
    -11
      src/app/RackWidget.cpp

+ 1
- 0
include/app/ModuleWidget.hpp View File

@@ -80,6 +80,7 @@ struct ModuleWidget : OpaqueWidget {

void removeAction();
void bypassAction();
void cloneAction();
void createContextMenu();
/** Override to add context menu entries to your subclass.
It is recommended to add a blank MenuEntry first for spacing.


+ 0
- 1
include/app/RackWidget.hpp View File

@@ -45,7 +45,6 @@ struct RackWidget : OpaqueWidget {
void addModuleAtMouse(ModuleWidget *m);
/** Removes the module and transfers ownership to the caller */
void removeModule(ModuleWidget *m);
void cloneModule(ModuleWidget *m);
/** Sets a module's box if non-colliding. Returns true if set */
bool requestModuleBox(ModuleWidget *m, math::Rect box);
/** Moves a module to the closest non-colliding position */


+ 20
- 3
src/app/ModuleWidget.cpp View File

@@ -97,7 +97,7 @@ struct ModuleCloneItem : MenuItem {
rightText = WINDOW_MOD_CTRL_NAME "+D";
}
void onAction(const event::Action &e) override {
app()->scene->rackWidget->cloneModule(moduleWidget);
moduleWidget->cloneAction();
}
};

@@ -229,8 +229,7 @@ void ModuleWidget::onHoverKey(const event::HoverKey &e) {
} break;
case GLFW_KEY_D: {
if ((e.mods & WINDOW_MOD_MASK) == WINDOW_MOD_CTRL) {
app()->scene->rackWidget->cloneModule(this);
e.consume(this);
cloneAction();
}
} break;
case GLFW_KEY_U: {
@@ -548,6 +547,24 @@ void ModuleWidget::bypassAction() {
h->redo();
}

void ModuleWidget::cloneAction() {
ModuleWidget *clonedModuleWidget = model->createModuleWidget();
assert(clonedModuleWidget);
// JSON serialization is the obvious way to do this
json_t *moduleJ = toJson();
clonedModuleWidget->fromJson(moduleJ);
json_decref(moduleJ);

app()->scene->rackWidget->addModuleAtMouse(clonedModuleWidget);

// Push ModuleAdd history action
history::ModuleAdd *h = new history::ModuleAdd;
h->model = clonedModuleWidget->model;
h->moduleId = clonedModuleWidget->module->id;
h->pos = clonedModuleWidget->box.pos;
app()->history->push(h);
}

void ModuleWidget::createContextMenu() {
Menu *menu = createMenu();
assert(model);


+ 0
- 11
src/app/RackWidget.cpp View File

@@ -495,17 +495,6 @@ void RackWidget::removeModule(ModuleWidget *m) {
moduleContainer->removeChild(m);
}

void RackWidget::cloneModule(ModuleWidget *m) {
// JSON serialization is the obvious way to do this
json_t *moduleJ = m->toJson();
ModuleWidget *clonedModuleWidget = moduleFromJson(moduleJ);
json_decref(moduleJ);
addModule(clonedModuleWidget);
math::Rect clonedBox = clonedModuleWidget->box;
clonedBox.pos = m->box.pos;
requestModuleBoxNearest(clonedModuleWidget, clonedBox);
}

bool RackWidget::requestModuleBox(ModuleWidget *m, math::Rect box) {
if (box.pos.x < 0 || box.pos.y < 0)
return false;


Loading…
Cancel
Save