@@ -96,41 +96,32 @@ struct BefacoSlidePot : SpriteKnob { | |||||
// Jacks | // Jacks | ||||
//////////////////// | //////////////////// | ||||
template <typename BASE> | |||||
struct PJ301M : BASE { | |||||
PJ301M() { | |||||
this->box.size = Vec(24, 24); | |||||
this->spriteOffset = Vec(-2, -2); | |||||
this->spriteSize = Vec(30, 30); | |||||
this->spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
struct PJ301MPort : Port { | |||||
PJ301MPort() { | |||||
box.size = Vec(24, 24); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(30, 30); | |||||
spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
} | } | ||||
}; | }; | ||||
typedef PJ301M<InputPort> InputPortPJ301M; | |||||
typedef PJ301M<OutputPort> OutputPortPJ301M; | |||||
template <typename BASE> | |||||
struct PJ3410 : BASE { | |||||
PJ3410() { | |||||
this->box.size = Vec(32, 31); | |||||
this->spriteOffset = Vec(-1, -1); | |||||
this->spriteSize = Vec(36, 36); | |||||
this->spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
struct PJ3410Port : Port { | |||||
PJ3410Port() { | |||||
box.size = Vec(32, 31); | |||||
spriteOffset = Vec(-1, -1); | |||||
spriteSize = Vec(36, 36); | |||||
spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
} | } | ||||
}; | }; | ||||
typedef PJ3410<InputPort> InputPortPJ3410; | |||||
typedef PJ3410<OutputPort> OutputPortPJ3410; | |||||
template <typename BASE> | |||||
struct CL1362 : BASE { | |||||
CL1362() { | |||||
this->box.size = Vec(33, 29); | |||||
this->spriteOffset = Vec(-2, -2); | |||||
this->spriteSize = Vec(39, 36); | |||||
this->spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
struct CL1362Port : Port { | |||||
CL1362Port() { | |||||
box.size = Vec(33, 29); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(39, 36); | |||||
spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
} | } | ||||
}; | }; | ||||
typedef CL1362<InputPort> InputPortCL1362; | |||||
typedef CL1362<OutputPort> OutputPortCL1362; | |||||
//////////////////// | //////////////////// | ||||
// Lights | // Lights | ||||
@@ -48,21 +48,23 @@ ParamWidget *createParam(Vec pos, Module *module, int paramId, float minValue, f | |||||
return param; | return param; | ||||
} | } | ||||
template <class TInputPort> | |||||
InputPort *createInput(Vec pos, Module *module, int inputId) { | |||||
InputPort *port = new TInputPort(); | |||||
template <class TPort> | |||||
Port *createInput(Vec pos, Module *module, int inputId) { | |||||
Port *port = new TPort(); | |||||
port->box.pos = pos; | port->box.pos = pos; | ||||
port->module = module; | port->module = module; | ||||
port->inputId = inputId; | |||||
port->type = Port::INPUT; | |||||
port->portId = inputId; | |||||
return port; | return port; | ||||
} | } | ||||
template <class TOutputPort> | |||||
OutputPort *createOutput(Vec pos, Module *module, int outputId) { | |||||
OutputPort *port = new TOutputPort(); | |||||
template <class TPort> | |||||
Port *createOutput(Vec pos, Module *module, int outputId) { | |||||
Port *port = new TPort(); | |||||
port->box.pos = pos; | port->box.pos = pos; | ||||
port->module = module; | port->module = module; | ||||
port->outputId = outputId; | |||||
port->type = Port::OUTPUT; | |||||
port->portId = outputId; | |||||
return port; | return port; | ||||
} | } | ||||
@@ -12,8 +12,7 @@ struct Wire; | |||||
struct RackWidget; | struct RackWidget; | ||||
struct ParamWidget; | struct ParamWidget; | ||||
struct InputPort; | |||||
struct OutputPort; | |||||
struct Port; | |||||
struct Scene; | struct Scene; | ||||
//////////////////// | //////////////////// | ||||
@@ -27,15 +26,15 @@ struct ModuleWidget : OpaqueWidget { | |||||
/** Owns the module pointer */ | /** Owns the module pointer */ | ||||
Module *module = NULL; | Module *module = NULL; | ||||
std::vector<InputPort*> inputs; | |||||
std::vector<OutputPort*> outputs; | |||||
std::vector<Port*> inputs; | |||||
std::vector<Port*> outputs; | |||||
std::vector<ParamWidget*> params; | std::vector<ParamWidget*> params; | ||||
~ModuleWidget(); | ~ModuleWidget(); | ||||
void setModule(Module *module); | void setModule(Module *module); | ||||
// Convenience functions for adding special widgets (calls addChild()) | // Convenience functions for adding special widgets (calls addChild()) | ||||
void addInput(InputPort *input); | |||||
void addOutput(OutputPort *output); | |||||
void addInput(Port *input); | |||||
void addOutput(Port *output); | |||||
void addParam(ParamWidget *param); | void addParam(ParamWidget *param); | ||||
json_t *toJson(); | json_t *toJson(); | ||||
@@ -56,10 +55,10 @@ struct ModuleWidget : OpaqueWidget { | |||||
}; | }; | ||||
struct WireWidget : OpaqueWidget { | struct WireWidget : OpaqueWidget { | ||||
OutputPort *outputPort = NULL; | |||||
InputPort *inputPort = NULL; | |||||
OutputPort *hoveredOutputPort = NULL; | |||||
InputPort *hoveredInputPort = NULL; | |||||
Port *inputPort = NULL; | |||||
Port *outputPort = NULL; | |||||
Port *hoveredInputPort = NULL; | |||||
Port *hoveredOutputPort = NULL; | |||||
Wire *wire = NULL; | Wire *wire = NULL; | ||||
NVGcolor color; | NVGcolor color; | ||||
@@ -182,35 +181,27 @@ struct MomentarySwitch : virtual Switch { | |||||
//////////////////// | //////////////////// | ||||
struct Port : OpaqueWidget, SpriteWidget { | struct Port : OpaqueWidget, SpriteWidget { | ||||
enum PortType { | |||||
INPUT, | |||||
OUTPUT | |||||
}; | |||||
Module *module = NULL; | Module *module = NULL; | ||||
WireWidget *connectedWire = NULL; | WireWidget *connectedWire = NULL; | ||||
PortType type; | |||||
int portId; | |||||
Port(); | Port(); | ||||
~Port(); | ~Port(); | ||||
void disconnect(); | void disconnect(); | ||||
void draw(NVGcontext *vg); | |||||
void onMouseDown(int button); | void onMouseDown(int button); | ||||
void onDragEnd(); | void onDragEnd(); | ||||
}; | |||||
struct InputPort : Port { | |||||
int inputId; | |||||
void onDragStart(); | |||||
void onDragDrop(Widget *origin); | |||||
void onDragEnter(Widget *origin); | |||||
void onDragLeave(Widget *origin); | |||||
void draw(NVGcontext *vg); | |||||
}; | |||||
struct OutputPort : Port { | |||||
int outputId; | |||||
void onDragStart(); | void onDragStart(); | ||||
void onDragDrop(Widget *origin); | void onDragDrop(Widget *origin); | ||||
void onDragEnter(Widget *origin); | void onDragEnter(Widget *origin); | ||||
void onDragLeave(Widget *origin); | void onDragLeave(Widget *origin); | ||||
void draw(NVGcontext *vg); | |||||
}; | }; | ||||
//////////////////// | //////////////////// | ||||
@@ -459,8 +459,8 @@ AudioInterfaceWidget::AudioInterfaceWidget() { | |||||
} | } | ||||
yPos += 5; | yPos += 5; | ||||
addInput(createInput<InputPortPJ3410>(Vec(20, yPos), module, AudioInterface::AUDIO1_INPUT)); | |||||
addInput(createInput<InputPortPJ3410>(Vec(70, yPos), module, AudioInterface::AUDIO2_INPUT)); | |||||
addInput(createInput<PJ3410Port>(Vec(20, yPos), module, AudioInterface::AUDIO1_INPUT)); | |||||
addInput(createInput<PJ3410Port>(Vec(70, yPos), module, AudioInterface::AUDIO2_INPUT)); | |||||
yPos += 35 + margin; | yPos += 35 + margin; | ||||
{ | { | ||||
@@ -472,7 +472,7 @@ AudioInterfaceWidget::AudioInterfaceWidget() { | |||||
} | } | ||||
yPos += 5; | yPos += 5; | ||||
addOutput(createOutput<OutputPortPJ3410>(Vec(20, yPos), module, AudioInterface::AUDIO1_OUTPUT)); | |||||
addOutput(createOutput<OutputPortPJ3410>(Vec(70, yPos), module, AudioInterface::AUDIO2_OUTPUT)); | |||||
addOutput(createOutput<PJ3410Port>(Vec(20, yPos), module, AudioInterface::AUDIO1_OUTPUT)); | |||||
addOutput(createOutput<PJ3410Port>(Vec(70, yPos), module, AudioInterface::AUDIO2_OUTPUT)); | |||||
yPos += 35 + margin; | yPos += 35 + margin; | ||||
} | } |
@@ -254,8 +254,8 @@ MidiInterfaceWidget::MidiInterfaceWidget() { | |||||
} | } | ||||
yPos += 5; | yPos += 5; | ||||
addOutput(createOutput<OutputPortPJ3410>(Vec(20, yPos), module, MidiInterface::PITCH_OUTPUT)); | |||||
addOutput(createOutput<OutputPortPJ3410>(Vec(70, yPos), module, MidiInterface::GATE_OUTPUT)); | |||||
addOutput(createOutput<PJ3410Port>(Vec(20, yPos), module, MidiInterface::PITCH_OUTPUT)); | |||||
addOutput(createOutput<PJ3410Port>(Vec(70, yPos), module, MidiInterface::GATE_OUTPUT)); | |||||
yPos += 25 + margin; | yPos += 25 + margin; | ||||
{ | { | ||||
@@ -1,53 +0,0 @@ | |||||
#include "scene.hpp" | |||||
namespace rack { | |||||
void InputPort::onDragStart() { | |||||
if (connectedWire) { | |||||
// Disconnect wire from this port, but set it as the active wire | |||||
connectedWire->inputPort = NULL; | |||||
connectedWire->updateWire(); | |||||
gRackWidget->activeWire = connectedWire; | |||||
connectedWire = NULL; | |||||
} | |||||
else { | |||||
connectedWire = new WireWidget(); | |||||
connectedWire->inputPort = this; | |||||
gRackWidget->wireContainer->addChild(connectedWire); | |||||
gRackWidget->activeWire = connectedWire; | |||||
} | |||||
} | |||||
void InputPort::onDragDrop(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
if (gRackWidget->activeWire->inputPort) return; | |||||
gRackWidget->activeWire->inputPort = this; | |||||
connectedWire = gRackWidget->activeWire; | |||||
} | |||||
} | |||||
void InputPort::onDragEnter(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredInputPort = this; | |||||
} | |||||
} | |||||
void InputPort::onDragLeave(Widget *origin) { | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
} | |||||
} | |||||
void InputPort::draw(NVGcontext *vg) { | |||||
if (gRackWidget->activeWire) { | |||||
if (gRackWidget->activeWire->inputPort) | |||||
nvgGlobalAlpha(vg, 0.5); | |||||
} | |||||
SpriteWidget::draw(vg); | |||||
} | |||||
} // namespace rack |
@@ -22,12 +22,12 @@ void ModuleWidget::setModule(Module *module) { | |||||
this->module = module; | this->module = module; | ||||
} | } | ||||
void ModuleWidget::addInput(InputPort *input) { | |||||
void ModuleWidget::addInput(Port *input) { | |||||
inputs.push_back(input); | inputs.push_back(input); | ||||
addChild(input); | addChild(input); | ||||
} | } | ||||
void ModuleWidget::addOutput(OutputPort *output) { | |||||
void ModuleWidget::addOutput(Port *output) { | |||||
outputs.push_back(output); | outputs.push_back(output); | ||||
addChild(output); | addChild(output); | ||||
} | } | ||||
@@ -77,10 +77,10 @@ void ModuleWidget::fromJson(json_t *root) { | |||||
} | } | ||||
void ModuleWidget::disconnectPorts() { | void ModuleWidget::disconnectPorts() { | ||||
for (InputPort *input : inputs) { | |||||
for (Port *input : inputs) { | |||||
input->disconnect(); | input->disconnect(); | ||||
} | } | ||||
for (OutputPort *output : outputs) { | |||||
for (Port *output : outputs) { | |||||
output->disconnect(); | output->disconnect(); | ||||
} | } | ||||
} | } | ||||
@@ -1,53 +0,0 @@ | |||||
#include "scene.hpp" | |||||
namespace rack { | |||||
void OutputPort::onDragStart() { | |||||
if (connectedWire) { | |||||
// Disconnect wire from this port, but set it as the active wire | |||||
connectedWire->outputPort = NULL; | |||||
connectedWire->updateWire(); | |||||
gRackWidget->activeWire = connectedWire; | |||||
connectedWire = NULL; | |||||
} | |||||
else { | |||||
connectedWire = new WireWidget(); | |||||
connectedWire->outputPort = this; | |||||
gRackWidget->wireContainer->addChild(connectedWire); | |||||
gRackWidget->activeWire = connectedWire; | |||||
} | |||||
} | |||||
void OutputPort::onDragDrop(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
if (gRackWidget->activeWire->outputPort) return; | |||||
gRackWidget->activeWire->outputPort = this; | |||||
connectedWire = gRackWidget->activeWire; | |||||
} | |||||
} | |||||
void OutputPort::onDragEnter(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredOutputPort = this; | |||||
} | |||||
} | |||||
void OutputPort::onDragLeave(Widget *origin) { | |||||
if (gRackWidget->activeWire) { | |||||
gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
} | |||||
} | |||||
void OutputPort::draw(NVGcontext *vg) { | |||||
if (gRackWidget->activeWire) { | |||||
if (gRackWidget->activeWire->outputPort) | |||||
nvgGlobalAlpha(vg, 0.5); | |||||
} | |||||
SpriteWidget::draw(vg); | |||||
} | |||||
} // namespace rack |
@@ -19,6 +19,14 @@ void Port::disconnect() { | |||||
} | } | ||||
} | } | ||||
void Port::draw(NVGcontext *vg) { | |||||
if (gRackWidget->activeWire) { | |||||
if (type == INPUT ? gRackWidget->activeWire->inputPort : gRackWidget->activeWire->outputPort) | |||||
nvgGlobalAlpha(vg, 0.5); | |||||
} | |||||
SpriteWidget::draw(vg); | |||||
} | |||||
void Port::onMouseDown(int button) { | void Port::onMouseDown(int button) { | ||||
if (button == 1) { | if (button == 1) { | ||||
disconnect(); | disconnect(); | ||||
@@ -36,4 +44,63 @@ void Port::onDragEnd() { | |||||
gRackWidget->activeWire = NULL; | gRackWidget->activeWire = NULL; | ||||
} | } | ||||
void Port::onDragStart() { | |||||
if (connectedWire) { | |||||
// Disconnect wire from this port, but set it as the active wire | |||||
if (type == INPUT) | |||||
connectedWire->inputPort = NULL; | |||||
else | |||||
connectedWire->outputPort = NULL; | |||||
connectedWire->updateWire(); | |||||
gRackWidget->activeWire = connectedWire; | |||||
connectedWire = NULL; | |||||
} | |||||
else { | |||||
connectedWire = new WireWidget(); | |||||
if (type == INPUT) | |||||
connectedWire->inputPort = this; | |||||
else | |||||
connectedWire->outputPort = this; | |||||
gRackWidget->wireContainer->addChild(connectedWire); | |||||
gRackWidget->activeWire = connectedWire; | |||||
} | |||||
} | |||||
void Port::onDragDrop(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
if (type == INPUT) { | |||||
gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
if (gRackWidget->activeWire->inputPort) return; | |||||
gRackWidget->activeWire->inputPort = this; | |||||
} | |||||
else { | |||||
gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
if (gRackWidget->activeWire->outputPort) return; | |||||
gRackWidget->activeWire->outputPort = this; | |||||
} | |||||
connectedWire = gRackWidget->activeWire; | |||||
} | |||||
} | |||||
void Port::onDragEnter(Widget *origin) { | |||||
if (connectedWire) return; | |||||
if (gRackWidget->activeWire) { | |||||
if (type == INPUT) | |||||
gRackWidget->activeWire->hoveredInputPort = this; | |||||
else | |||||
gRackWidget->activeWire->hoveredOutputPort = this; | |||||
} | |||||
} | |||||
void Port::onDragLeave(Widget *origin) { | |||||
if (gRackWidget->activeWire) { | |||||
if (type == INPUT) | |||||
gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
else | |||||
gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
} | |||||
} | |||||
} // namespace rack | } // namespace rack |
@@ -207,11 +207,11 @@ void RackWidget::fromJson(json_t *root) { | |||||
// Get ports | // Get ports | ||||
ModuleWidget *outputModuleWidget = moduleWidgets[outputModuleId]; | ModuleWidget *outputModuleWidget = moduleWidgets[outputModuleId]; | ||||
if (!outputModuleWidget) continue; | if (!outputModuleWidget) continue; | ||||
OutputPort *outputPort = outputModuleWidget->outputs[outputId]; | |||||
Port *outputPort = outputModuleWidget->outputs[outputId]; | |||||
if (!outputPort) continue; | if (!outputPort) continue; | ||||
ModuleWidget *inputModuleWidget = moduleWidgets[inputModuleId]; | ModuleWidget *inputModuleWidget = moduleWidgets[inputModuleId]; | ||||
if (!inputModuleWidget) continue; | if (!inputModuleWidget) continue; | ||||
InputPort *inputPort = inputModuleWidget->inputs[inputId]; | |||||
Port *inputPort = inputModuleWidget->inputs[inputId]; | |||||
if (!inputPort) continue; | if (!inputPort) continue; | ||||
// Create WireWidget | // Create WireWidget | ||||
WireWidget *wireWidget = new WireWidget(); | WireWidget *wireWidget = new WireWidget(); | ||||
@@ -105,11 +105,15 @@ void WireWidget::updateWire() { | |||||
wire = NULL; | wire = NULL; | ||||
} | } | ||||
if (inputPort && outputPort) { | if (inputPort && outputPort) { | ||||
// Check correct types | |||||
assert(inputPort->type == Port::INPUT); | |||||
assert(outputPort->type == Port::OUTPUT); | |||||
wire = new Wire(); | wire = new Wire(); | ||||
wire->outputModule = outputPort->module; | wire->outputModule = outputPort->module; | ||||
wire->outputId = outputPort->outputId; | |||||
wire->outputId = outputPort->portId; | |||||
wire->inputModule = inputPort->module; | wire->inputModule = inputPort->module; | ||||
wire->inputId = inputPort->inputId; | |||||
wire->inputId = inputPort->portId; | |||||
engineAddWire(wire); | engineAddWire(wire); | ||||
} | } | ||||
} | } | ||||