@@ -313,6 +313,7 @@ struct Toolbar : OpaqueWidget { | |||||
Slider *wireOpacitySlider; | Slider *wireOpacitySlider; | ||||
Slider *wireTensionSlider; | Slider *wireTensionSlider; | ||||
RadioButton *cpuUsageButton; | RadioButton *cpuUsageButton; | ||||
RadioButton *plugLightButton; | |||||
Toolbar(); | Toolbar(); | ||||
void draw(NVGcontext *vg); | void draw(NVGcontext *vg); | ||||
@@ -327,7 +328,6 @@ struct PluginManagerWidget : Widget { | |||||
}; | }; | ||||
struct RackScene : Scene { | struct RackScene : Scene { | ||||
Toolbar *toolbar; | |||||
ScrollWidget *scrollWidget; | ScrollWidget *scrollWidget; | ||||
ZoomWidget *zoomWidget; | ZoomWidget *zoomWidget; | ||||
@@ -345,7 +345,9 @@ extern std::string gApplicationName; | |||||
extern std::string gApplicationVersion; | extern std::string gApplicationVersion; | ||||
extern std::string gApiHost; | extern std::string gApiHost; | ||||
// Easy access to "singleton" widgets | |||||
extern RackWidget *gRackWidget; | extern RackWidget *gRackWidget; | ||||
extern Toolbar *gToolbar; | |||||
void sceneInit(); | void sceneInit(); | ||||
void sceneDestroy(); | void sceneDestroy(); | ||||
@@ -8,6 +8,7 @@ std::string gApplicationVersion = TOSTRING(VERSION); | |||||
std::string gApiHost = "http://api.vcvrack.com"; | std::string gApiHost = "http://api.vcvrack.com"; | ||||
RackWidget *gRackWidget = NULL; | RackWidget *gRackWidget = NULL; | ||||
Toolbar *gToolbar = NULL; | |||||
void sceneInit() { | void sceneInit() { | ||||
@@ -40,9 +40,9 @@ RackScene::RackScene() { | |||||
} | } | ||||
addChild(scrollWidget); | addChild(scrollWidget); | ||||
toolbar = new Toolbar(); | |||||
addChild(toolbar); | |||||
scrollWidget->box.pos.y = toolbar->box.size.y; | |||||
gToolbar = new Toolbar(); | |||||
addChild(gToolbar); | |||||
scrollWidget->box.pos.y = gToolbar->box.size.y; | |||||
// Check for new version | // Check for new version | ||||
if (gApplicationVersion != "dev") { | if (gApplicationVersion != "dev") { | ||||
@@ -53,7 +53,7 @@ RackScene::RackScene() { | |||||
void RackScene::step() { | void RackScene::step() { | ||||
// Resize owned descendants | // Resize owned descendants | ||||
toolbar->box.size.x = box.size.x; | |||||
gToolbar->box.size.x = box.size.x; | |||||
scrollWidget->box.size = box.size.minus(scrollWidget->box.pos); | scrollWidget->box.size = box.size.minus(scrollWidget->box.pos); | ||||
// Resize to be a bit larger than the ScrollWidget viewport | // Resize to be a bit larger than the ScrollWidget viewport | ||||
@@ -395,7 +395,7 @@ struct AddPluginMenuItem : MenuItem { | |||||
if (!plugin->path.empty()) { | if (!plugin->path.empty()) { | ||||
UrlItem *item = new UrlItem(); | UrlItem *item = new UrlItem(); | ||||
item->text = "Browse Directory"; | |||||
item->text = "Browse directory"; | |||||
item->url = plugin->path; | item->url = plugin->path; | ||||
menu->pushChild(item); | menu->pushChild(item); | ||||
} | } | ||||
@@ -410,7 +410,7 @@ void RackWidget::onMouseDownOpaque(int button) { | |||||
Menu *menu = gScene->createMenu(); | Menu *menu = gScene->createMenu(); | ||||
MenuLabel *menuLabel = new MenuLabel(); | MenuLabel *menuLabel = new MenuLabel(); | ||||
menuLabel->text = "Add Module"; | |||||
menuLabel->text = "Add module"; | |||||
menu->pushChild(menuLabel); | menu->pushChild(menuLabel); | ||||
for (Plugin *plugin : gPlugins) { | for (Plugin *plugin : gPlugins) { | ||||
AddPluginMenuItem *item = new AddPluginMenuItem(); | AddPluginMenuItem *item = new AddPluginMenuItem(); | ||||
@@ -53,7 +53,7 @@ struct FileChoice : ChoiceButton { | |||||
menu->pushChild(saveItem); | menu->pushChild(saveItem); | ||||
MenuItem *saveAsItem = new SaveAsItem(); | MenuItem *saveAsItem = new SaveAsItem(); | ||||
saveAsItem->text = "Save As"; | |||||
saveAsItem->text = "Save as"; | |||||
saveAsItem->rightText = GUI_MOD_KEY_NAME "+Shift+S"; | saveAsItem->rightText = GUI_MOD_KEY_NAME "+Shift+S"; | ||||
menu->pushChild(saveAsItem); | menu->pushChild(saveAsItem); | ||||
} | } | ||||
@@ -82,7 +82,7 @@ struct SampleRateChoice : ChoiceButton { | |||||
menu->box.size.x = box.size.x; | menu->box.size.x = box.size.x; | ||||
PauseItem *pauseItem = new PauseItem(); | PauseItem *pauseItem = new PauseItem(); | ||||
pauseItem->text = gPaused ? "Resume Engine" : "Pause Engine"; | |||||
pauseItem->text = gPaused ? "Resume engine" : "Pause engine"; | |||||
menu->pushChild(pauseItem); | menu->pushChild(pauseItem); | ||||
float sampleRates[] = {44100, 48000, 88200, 96000, 176400, 192000}; | float sampleRates[] = {44100, 48000, 88200, 96000, 176400, 192000}; | ||||
@@ -154,6 +154,17 @@ Toolbar::Toolbar() { | |||||
xPos += wireTensionSlider->box.size.x; | xPos += wireTensionSlider->box.size.x; | ||||
} | } | ||||
xPos += margin; | |||||
{ | |||||
plugLightButton = new RadioButton(); | |||||
plugLightButton->box.pos = Vec(xPos, margin); | |||||
plugLightButton->box.size.x = 100; | |||||
plugLightButton->label = "Plug lights"; | |||||
plugLightButton->setValue(1.0); | |||||
addChild(plugLightButton); | |||||
xPos += plugLightButton->box.size.x; | |||||
} | |||||
/* | /* | ||||
xPos += margin; | xPos += margin; | ||||
{ | { | ||||
@@ -151,8 +151,8 @@ Vec WireWidget::getInputPos() { | |||||
} | } | ||||
void WireWidget::draw(NVGcontext *vg) { | void WireWidget::draw(NVGcontext *vg) { | ||||
float opacity = dynamic_cast<RackScene*>(gScene)->toolbar->wireOpacitySlider->value / 100.0; | |||||
float tension = dynamic_cast<RackScene*>(gScene)->toolbar->wireTensionSlider->value; | |||||
float opacity = gToolbar->wireOpacitySlider->value / 100.0; | |||||
float tension = gToolbar->wireTensionSlider->value; | |||||
// Draw as opaque if an "incomplete" wire | // Draw as opaque if an "incomplete" wire | ||||
if (!(inputPort && outputPort)) | if (!(inputPort && outputPort)) | ||||
@@ -169,19 +169,27 @@ void WireWidget::drawPlugs(NVGcontext *vg) { | |||||
drawPlug(vg, inputPos, color); | drawPlug(vg, inputPos, color); | ||||
// Draw plug light | // Draw plug light | ||||
if (wire) { | |||||
Output &output = wire->outputModule->outputs[wire->outputId]; | |||||
float value = output.value / 8.0; | |||||
outputLight->box.size = Vec(10, 10); | |||||
inputLight->box.size = Vec(10, 10); | |||||
outputLight->box.pos = outputPos.minus(Vec(5, 5)); | |||||
inputLight->box.pos = inputPos.minus(Vec(5, 5)); | |||||
outputLight->setValue(value); | |||||
inputLight->setValue(value); | |||||
if (gToolbar->plugLightButton->value > 0.0) { | |||||
if (wire) { | |||||
Output &output = wire->outputModule->outputs[wire->outputId]; | |||||
float value = output.value / 8.0; | |||||
outputLight->box.size = Vec(10, 10); | |||||
inputLight->box.size = Vec(10, 10); | |||||
outputLight->box.pos = outputPos.minus(Vec(5, 5)); | |||||
inputLight->box.pos = inputPos.minus(Vec(5, 5)); | |||||
outputLight->setValue(value); | |||||
inputLight->setValue(value); | |||||
} | |||||
else { | |||||
outputLight->setValue(0.0); | |||||
inputLight->setValue(0.0); | |||||
} | |||||
outputLight->visible = true; | |||||
inputLight->visible = true; | |||||
} | } | ||||
else { | else { | ||||
outputLight->setValue(0.0); | |||||
inputLight->setValue(0.0); | |||||
outputLight->visible = false; | |||||
inputLight->visible = false; | |||||
} | } | ||||
Widget::draw(vg); | Widget::draw(vg); | ||||
} | } | ||||
@@ -18,12 +18,12 @@ static json_t *settingsToJson() { | |||||
json_object_set_new(rootJ, "token", tokenJ); | json_object_set_new(rootJ, "token", tokenJ); | ||||
// opacity | // opacity | ||||
float opacity = dynamic_cast<RackScene*>(gScene)->toolbar->wireOpacitySlider->value; | |||||
float opacity = gToolbar->wireOpacitySlider->value; | |||||
json_t *opacityJ = json_real(opacity); | json_t *opacityJ = json_real(opacity); | ||||
json_object_set_new(rootJ, "wireOpacity", opacityJ); | json_object_set_new(rootJ, "wireOpacity", opacityJ); | ||||
// tension | // tension | ||||
float tension = dynamic_cast<RackScene*>(gScene)->toolbar->wireTensionSlider->value; | |||||
float tension = gToolbar->wireTensionSlider->value; | |||||
json_t *tensionJ = json_real(tension); | json_t *tensionJ = json_real(tension); | ||||
json_object_set_new(rootJ, "wireTension", tensionJ); | json_object_set_new(rootJ, "wireTension", tensionJ); | ||||
@@ -36,6 +36,10 @@ static json_t *settingsToJson() { | |||||
json_t *sampleRateJ = json_real(sampleRate); | json_t *sampleRateJ = json_real(sampleRate); | ||||
json_object_set_new(rootJ, "sampleRate", sampleRateJ); | json_object_set_new(rootJ, "sampleRate", sampleRateJ); | ||||
// plugLight | |||||
json_t *plugLightJ = json_boolean(gToolbar->plugLightButton->value > 0.0); | |||||
json_object_set_new(rootJ, "plugLight", plugLightJ); | |||||
return rootJ; | return rootJ; | ||||
} | } | ||||
@@ -48,12 +52,12 @@ static void settingsFromJson(json_t *rootJ) { | |||||
// opacity | // opacity | ||||
json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | json_t *opacityJ = json_object_get(rootJ, "wireOpacity"); | ||||
if (opacityJ) | if (opacityJ) | ||||
dynamic_cast<RackScene*>(gScene)->toolbar->wireOpacitySlider->value = json_number_value(opacityJ); | |||||
gToolbar->wireOpacitySlider->value = json_number_value(opacityJ); | |||||
// tension | // tension | ||||
json_t *tensionJ = json_object_get(rootJ, "wireTension"); | json_t *tensionJ = json_object_get(rootJ, "wireTension"); | ||||
if (tensionJ) | if (tensionJ) | ||||
dynamic_cast<RackScene*>(gScene)->toolbar->wireTensionSlider->value = json_number_value(tensionJ); | |||||
gToolbar->wireTensionSlider->value = json_number_value(tensionJ); | |||||
// allowCursorLock | // allowCursorLock | ||||
json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); | json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); | ||||
@@ -66,6 +70,11 @@ static void settingsFromJson(json_t *rootJ) { | |||||
float sampleRate = json_number_value(sampleRateJ); | float sampleRate = json_number_value(sampleRateJ); | ||||
engineSetSampleRate(sampleRate); | engineSetSampleRate(sampleRate); | ||||
} | } | ||||
// plugLight | |||||
json_t *plugLightJ = json_object_get(rootJ, "plugLight"); | |||||
if (plugLightJ) | |||||
gToolbar->plugLightButton->setValue(json_is_true(plugLightJ) ? 1.0 : 0.0); | |||||
} | } | ||||