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