| @@ -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); | |||||
| } | } | ||||