| @@ -9,22 +9,32 @@ namespace event { | |||
| struct State; | |||
| } | |||
| namespace history { | |||
| struct State; | |||
| } | |||
| struct Scene; | |||
| struct Engine; | |||
| struct Window; | |||
| /** Contains the application state */ | |||
| struct Context { | |||
| struct App { | |||
| event::State *event = NULL; | |||
| Scene *scene = NULL; | |||
| Engine *engine = NULL; | |||
| Window *window = NULL; | |||
| history::State *history = NULL; | |||
| App(); | |||
| ~App(); | |||
| }; | |||
| void appInit(); | |||
| void appDestroy(); | |||
| /** Returns the global context */ | |||
| Context *context(); | |||
| App *app(); | |||
| } // namespace rack | |||
| @@ -1,7 +1,7 @@ | |||
| #pragma once | |||
| #include "app/common.hpp" | |||
| #include "app/ParamWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -3,7 +3,7 @@ | |||
| #include "widgets/TransparentWidget.hpp" | |||
| #include "widgets/FramebufferWidget.hpp" | |||
| #include "widgets/SVGWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -23,7 +23,7 @@ struct PanelBorder : TransparentWidget { | |||
| struct SVGPanel : FramebufferWidget { | |||
| void step() override { | |||
| if (math::isNear(context()->window->pixelRatio, 1.0)) { | |||
| if (math::isNear(app()->window->pixelRatio, 1.0)) { | |||
| // Small details draw poorly at low DPI, so oversample when drawing to the framebuffer | |||
| oversample = 2.0; | |||
| } | |||
| @@ -7,7 +7,7 @@ | |||
| #include "app/ParamWidget.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "engine/Module.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "window.hpp" | |||
| @@ -150,12 +150,12 @@ TMenuItem *createMenuItem(std::string text, std::string rightText = "") { | |||
| inline Menu *createMenu() { | |||
| Menu *o = new Menu; | |||
| o->box.pos = context()->window->mousePos; | |||
| o->box.pos = app()->window->mousePos; | |||
| MenuOverlay *menuOverlay = new MenuOverlay; | |||
| menuOverlay->addChild(o); | |||
| context()->scene->addChild(menuOverlay); | |||
| app()->scene->addChild(menuOverlay); | |||
| return o; | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| #pragma once | |||
| #include "common.hpp" | |||
| namespace rack { | |||
| namespace history { | |||
| struct Action { | |||
| virtual ~Action() {} | |||
| virtual void commit() {} | |||
| virtual void commitInverse() {} | |||
| }; | |||
| struct State { | |||
| void push(Action *action); | |||
| void undo(); | |||
| void redo(); | |||
| }; | |||
| } // namespace history | |||
| } // namespace rack | |||
| @@ -8,7 +8,7 @@ | |||
| #include "network.hpp" | |||
| #include "asset.hpp" | |||
| #include "window.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "helpers.hpp" | |||
| #include "widgets/Widget.hpp" | |||
| @@ -140,11 +140,11 @@ DEPRECATED TPortWidget *createPort(math::Vec pos, PortWidget::Type type, Module | |||
| //////////////////// | |||
| DEPRECATED inline float engineGetSampleRate() { | |||
| return context()->engine->getSampleRate(); | |||
| return app()->engine->getSampleRate(); | |||
| } | |||
| DEPRECATED inline float engineGetSampleTime() { | |||
| return context()->engine->getSampleTime(); | |||
| return app()->engine->getSampleTime(); | |||
| } | |||
| //////////////////// | |||
| @@ -153,11 +153,11 @@ DEPRECATED inline float engineGetSampleTime() { | |||
| using namespace dsp; | |||
| inline float gainToDb(float gain) { | |||
| DEPRECATED inline float gainToDb(float gain) { | |||
| return dsp::amplitudeToDb(gain); | |||
| } | |||
| inline float dbToGain(float db) { | |||
| DEPRECATED inline float dbToGain(float db) { | |||
| return dsp::dbToAmplitude(db); | |||
| } | |||
| @@ -3,7 +3,7 @@ | |||
| #include "ui/Menu.hpp" | |||
| #include "ui/MenuEntry.hpp" | |||
| #include "ui/MenuOverlay.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -1,7 +1,7 @@ | |||
| #pragma once | |||
| #include "ui/common.hpp" | |||
| #include "ui/MenuEntry.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -17,8 +17,8 @@ struct MenuLabel : MenuEntry { | |||
| void step() override { | |||
| // Add 10 more pixels because Retina measurements are sometimes too small | |||
| const float rightPadding = 10.0; | |||
| // HACK use context()->window->vg from the window. | |||
| box.size.x = bndLabelWidth(context()->window->vg, -1, text.c_str()) + rightPadding; | |||
| // HACK use app()->window->vg from the window. | |||
| box.size.x = bndLabelWidth(app()->window->vg, -1, text.c_str()) + rightPadding; | |||
| Widget::step(); | |||
| } | |||
| }; | |||
| @@ -2,7 +2,7 @@ | |||
| #include "widgets/OpaqueWidget.hpp" | |||
| #include "ui/Quantity.hpp" | |||
| #include "ui/common.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -32,7 +32,7 @@ struct Slider : OpaqueWidget { | |||
| void onDragStart(const event::DragStart &e) override { | |||
| state = BND_ACTIVE; | |||
| context()->window->cursorLock(); | |||
| app()->window->cursorLock(); | |||
| } | |||
| void onDragMove(const event::DragMove &e) override { | |||
| @@ -43,7 +43,7 @@ struct Slider : OpaqueWidget { | |||
| void onDragEnd(const event::DragEnd &e) override { | |||
| state = BND_DEFAULT; | |||
| context()->window->cursorUnlock(); | |||
| app()->window->cursorUnlock(); | |||
| } | |||
| void onButton(const event::Button &e) override { | |||
| @@ -2,7 +2,7 @@ | |||
| #include "widgets/OpaqueWidget.hpp" | |||
| #include "ui/common.hpp" | |||
| #include "event.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -11,8 +11,10 @@ | |||
| #ifdef ARCH_MAC | |||
| #define WINDOW_MOD GLFW_MOD_SUPER | |||
| #define WINDOW_MOD_KEY_NAME "Cmd" | |||
| #else | |||
| #define WINDOW_MOD GLFW_MOD_CONTROL | |||
| #define WINDOW_MOD_KEY_NAME "Ctrl" | |||
| #endif | |||
| @@ -5,7 +5,7 @@ | |||
| #include <thread> | |||
| #include <mutex> | |||
| #include <condition_variable> | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #define AUDIO_OUTPUTS 8 | |||
| @@ -143,7 +143,7 @@ struct AudioInterface : Module { | |||
| void AudioInterface::step() { | |||
| // Update SRC states | |||
| int sampleRate = (int) context()->engine->getSampleRate(); | |||
| int sampleRate = (int) app()->engine->getSampleRate(); | |||
| inputSrc.setRates(audioIO.sampleRate, sampleRate); | |||
| outputSrc.setRates(sampleRate, audioIO.sampleRate); | |||
| @@ -1,5 +1,5 @@ | |||
| #include "Core.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| using namespace rack; | |||
| @@ -39,14 +39,14 @@ struct ModuleResizeHandle : virtual Widget { | |||
| } | |||
| } | |||
| void onDragStart(const event::DragStart &e) override { | |||
| dragX = context()->scene->rackWidget->lastMousePos.x; | |||
| dragX = app()->scene->rackWidget->lastMousePos.x; | |||
| ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | |||
| originalBox = m->box; | |||
| } | |||
| void onDragMove(const event::DragMove &e) override { | |||
| ModuleWidget *m = getAncestorOfType<ModuleWidget>(); | |||
| float newDragX = context()->scene->rackWidget->lastMousePos.x; | |||
| float newDragX = app()->scene->rackWidget->lastMousePos.x; | |||
| float deltaX = newDragX - dragX; | |||
| Rect newBox = originalBox; | |||
| @@ -62,7 +62,7 @@ struct ModuleResizeHandle : virtual Widget { | |||
| newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH; | |||
| newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x; | |||
| } | |||
| context()->scene->rackWidget->requestModuleBox(m, newBox); | |||
| app()->scene->rackWidget->requestModuleBox(m, newBox); | |||
| } | |||
| void draw(NVGcontext *vg) override { | |||
| for (float x = 5.0; x <= 10.0; x += 5.0) { | |||
| @@ -45,7 +45,7 @@ struct MIDICCToCVInterface : Module { | |||
| processMessage(msg); | |||
| } | |||
| float lambda = 100.f * context()->engine->getSampleTime(); | |||
| float lambda = 100.f * app()->engine->getSampleTime(); | |||
| for (int i = 0; i < 16; i++) { | |||
| int learnedCc = learnedCcs[i]; | |||
| float value = rescale(clamp(ccs[learnedCc], -127, 127), 0, 127, 0.f, 10.f); | |||
| @@ -132,8 +132,8 @@ struct MidiCcChoice : GridChoice { | |||
| else { | |||
| text = string::f("%d", module->learnedCcs[id]); | |||
| color.a = 1.0; | |||
| if (context()->event->selectedWidget == this) | |||
| context()->event->selectedWidget = NULL; | |||
| if (app()->event->selectedWidget == this) | |||
| app()->event->selectedWidget = NULL; | |||
| } | |||
| } | |||
| @@ -165,11 +165,11 @@ struct MidiCcChoice : GridChoice { | |||
| } | |||
| void onSelectKey(const event::SelectKey &e) override { | |||
| if (context()->event->selectedWidget == this) { | |||
| if (app()->event->selectedWidget == this) { | |||
| if (e.action == GLFW_PRESS && (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER)) { | |||
| event::Deselect eDeselect; | |||
| onDeselect(eDeselect); | |||
| context()->event->selectedWidget = NULL; | |||
| app()->event->selectedWidget = NULL; | |||
| e.consume(this); | |||
| } | |||
| } | |||
| @@ -144,7 +144,7 @@ struct MIDIToCVInterface : Module { | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| float deltaTime = context()->engine->getSampleTime(); | |||
| float deltaTime = app()->engine->getSampleTime(); | |||
| outputs[CV_OUTPUT].setVoltage((lastNote - 60) / 12.f); | |||
| outputs[GATE_OUTPUT].setVoltage(gate ? 10.f : 0.f); | |||
| @@ -71,7 +71,7 @@ struct MIDITriggerToCVInterface : Module { | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| float deltaTime = context()->engine->getSampleTime(); | |||
| float deltaTime = app()->engine->getSampleTime(); | |||
| for (int i = 0; i < 16; i++) { | |||
| if (gateTimes[i] > 0.f) { | |||
| @@ -175,8 +175,8 @@ struct MidiTrigChoice : GridChoice { | |||
| text = string::f("%s%d", noteNames[semi], oct); | |||
| color.a = 1.0; | |||
| if (context()->event->selectedWidget == this) | |||
| context()->event->selectedWidget = NULL; | |||
| if (app()->event->selectedWidget == this) | |||
| app()->event->selectedWidget = NULL; | |||
| } | |||
| } | |||
| @@ -0,0 +1,48 @@ | |||
| #include "app.hpp" | |||
| #include "event.hpp" | |||
| #include "window.hpp" | |||
| #include "engine/Engine.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "history.hpp" | |||
| namespace rack { | |||
| App::App() { | |||
| event = new event::State; | |||
| history = new history::State; | |||
| window = new Window; | |||
| engine = new Engine; | |||
| scene = new Scene; | |||
| event->rootWidget = scene; | |||
| } | |||
| App::~App() { | |||
| delete scene; scene = NULL; | |||
| delete event; event = NULL; | |||
| delete history; history = NULL; | |||
| delete engine; engine = NULL; | |||
| delete window; window = NULL; | |||
| } | |||
| static App *c = NULL; | |||
| void appInit() { | |||
| assert(!c); | |||
| c = new App; | |||
| } | |||
| void appDestroy() { | |||
| assert(c); | |||
| delete c; | |||
| c = NULL; | |||
| } | |||
| App *app() { | |||
| return c; | |||
| } | |||
| } // namespace rack | |||
| @@ -17,11 +17,11 @@ void Knob::onButton(const event::Button &e) { | |||
| } | |||
| void Knob::onDragStart(const event::DragStart &e) { | |||
| context()->window->cursorLock(); | |||
| app()->window->cursorLock(); | |||
| } | |||
| void Knob::onDragEnd(const event::DragEnd &e) { | |||
| context()->window->cursorUnlock(); | |||
| app()->window->cursorUnlock(); | |||
| } | |||
| void Knob::onDragMove(const event::DragMove &e) { | |||
| @@ -37,7 +37,7 @@ void Knob::onDragMove(const event::DragMove &e) { | |||
| float delta = KNOB_SENSITIVITY * -e.mouseDelta.y * speed * range; | |||
| // Drag slower if Mod is held | |||
| if (context()->window->isModPressed()) | |||
| if (app()->window->isModPressed()) | |||
| delta /= 16.f; | |||
| quantity->moveValue(delta); | |||
| } | |||
| @@ -2,7 +2,7 @@ | |||
| #include "asset.hpp" | |||
| #include "window.hpp" | |||
| #include "event.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -86,12 +86,12 @@ void LedDisplayTextField::draw(NVGcontext *vg) { | |||
| NVGcolor highlightColor = color; | |||
| highlightColor.a = 0.5; | |||
| int begin = std::min(cursor, selection); | |||
| int end = (this == context()->event->selectedWidget) ? std::max(cursor, selection) : -1; | |||
| int end = (this == app()->event->selectedWidget) ? std::max(cursor, selection) : -1; | |||
| bndIconLabelCaret(vg, textOffset.x, textOffset.y, | |||
| box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | |||
| -1, color, 12, text.c_str(), highlightColor, begin, end); | |||
| bndSetFont(context()->window->uiFont->handle); | |||
| bndSetFont(app()->window->uiFont->handle); | |||
| } | |||
| nvgResetScissor(vg); | |||
| @@ -99,10 +99,10 @@ void LedDisplayTextField::draw(NVGcontext *vg) { | |||
| int LedDisplayTextField::getTextPosition(math::Vec mousePos) { | |||
| bndSetFont(font->handle); | |||
| int textPos = bndIconLabelTextPosition(context()->window->vg, textOffset.x, textOffset.y, | |||
| int textPos = bndIconLabelTextPosition(app()->window->vg, textOffset.x, textOffset.y, | |||
| box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y, | |||
| -1, 12, text.c_str(), mousePos.x, mousePos.y); | |||
| bndSetFont(context()->window->uiFont->handle); | |||
| bndSetFont(app()->window->uiFont->handle); | |||
| return textPos; | |||
| } | |||
| @@ -7,7 +7,7 @@ | |||
| #include "app/ModuleWidget.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "plugin.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include <set> | |||
| #include <algorithm> | |||
| @@ -21,26 +21,17 @@ static std::set<Model*> sFavoriteModels; | |||
| struct ModuleBox : OpaqueWidget { | |||
| Model *model; | |||
| bool initialized = false; | |||
| void setModel(Model *model) { | |||
| this->model = model; | |||
| Widget *transparentWidget = new TransparentWidget; | |||
| addChild(transparentWidget); | |||
| ZoomWidget *zoomWidget = new ZoomWidget; | |||
| zoomWidget->setZoom(0.5); | |||
| transparentWidget->addChild(zoomWidget); | |||
| ModuleWidget *moduleWidget = model->createModuleWidgetNull(); | |||
| zoomWidget->addChild(moduleWidget); | |||
| box.size = math::Vec(moduleWidget->box.size.x, RACK_GRID_SIZE.y).mult(zoomWidget->zoom).ceil(); | |||
| box.size.x = 70.f; | |||
| box.size.y = std::ceil(RACK_GRID_SIZE.y * 0.5f); | |||
| math::Vec p; | |||
| p.y = box.size.y; | |||
| box.size.y += 40.0; | |||
| box.size.x = std::max(box.size.x, 70.f); | |||
| Label *nameLabel = new Label; | |||
| nameLabel->text = model->name; | |||
| @@ -56,8 +47,25 @@ struct ModuleBox : OpaqueWidget { | |||
| } | |||
| void draw(NVGcontext *vg) override { | |||
| // Lazily create ModuleWidget when drawn | |||
| if (!initialized) { | |||
| Widget *transparentWidget = new TransparentWidget; | |||
| addChild(transparentWidget); | |||
| ZoomWidget *zoomWidget = new ZoomWidget; | |||
| zoomWidget->setZoom(0.5f); | |||
| transparentWidget->addChild(zoomWidget); | |||
| ModuleWidget *moduleWidget = model->createModuleWidgetNull(); | |||
| zoomWidget->addChild(moduleWidget); | |||
| float width = std::ceil(moduleWidget->box.size.x * 0.5f); | |||
| box.size.x = std::max(box.size.x, width); | |||
| initialized = true; | |||
| } | |||
| OpaqueWidget::draw(vg); | |||
| if (context()->event->hoveredWidget == this) { | |||
| if (app()->event->hoveredWidget == this) { | |||
| nvgBeginPath(vg); | |||
| nvgRect(vg, 0.0, 0.0, box.size.x, box.size.y); | |||
| nvgFillColor(vg, nvgRGBAf(1, 1, 1, 0.25)); | |||
| @@ -70,7 +78,7 @@ struct ModuleBox : OpaqueWidget { | |||
| // Create module | |||
| ModuleWidget *moduleWidget = model->createModuleWidget(); | |||
| assert(moduleWidget); | |||
| context()->scene->rackWidget->addModule(moduleWidget); | |||
| app()->scene->rackWidget->addModule(moduleWidget); | |||
| // This is a bit nonstandard/unsupported usage, but pretend the moduleWidget was clicked so it can be dragged in the RackWidget | |||
| e.consume(moduleWidget); | |||
| // Close Module Browser | |||
| @@ -5,7 +5,7 @@ | |||
| #include "app/Scene.hpp" | |||
| #include "app/SVGPanel.hpp" | |||
| #include "helpers.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "settings.hpp" | |||
| #include "osdialog.h" | |||
| @@ -16,20 +16,20 @@ namespace rack { | |||
| ModuleWidget::ModuleWidget(Module *module) { | |||
| if (module) { | |||
| context()->engine->addModule(module); | |||
| app()->engine->addModule(module); | |||
| } | |||
| this->module = module; | |||
| } | |||
| ModuleWidget::~ModuleWidget() { | |||
| // HACK | |||
| // If we try to disconnect wires in the Module Browser (e.g. when Rack is closed while the Module Browser is open), context()->scene->rackWidget will be an invalid pointer. | |||
| // If we try to disconnect wires in the Module Browser (e.g. when Rack is closed while the Module Browser is open), app()->scene->rackWidget will be an invalid pointer. | |||
| // So only attempt to disconnect if the module is not NULL. | |||
| if (module) | |||
| disconnect(); | |||
| // Remove and delete the Module instance | |||
| if (module) { | |||
| context()->engine->removeModule(module); | |||
| app()->engine->removeModule(module); | |||
| delete module; | |||
| module = NULL; | |||
| } | |||
| @@ -136,11 +136,11 @@ void ModuleWidget::copyClipboard() { | |||
| DEFER({ | |||
| free(moduleJson); | |||
| }); | |||
| glfwSetClipboardString(context()->window->win, moduleJson); | |||
| glfwSetClipboardString(app()->window->win, moduleJson); | |||
| } | |||
| void ModuleWidget::pasteClipboard() { | |||
| const char *moduleJson = glfwGetClipboardString(context()->window->win); | |||
| const char *moduleJson = glfwGetClipboardString(app()->window->win); | |||
| if (!moduleJson) { | |||
| WARN("Could not get text from clipboard."); | |||
| return; | |||
| @@ -261,22 +261,22 @@ void ModuleWidget::toggleBypass() { | |||
| void ModuleWidget::disconnect() { | |||
| for (PortWidget *input : inputs) { | |||
| context()->scene->rackWidget->wireContainer->removeAllWires(input); | |||
| app()->scene->rackWidget->wireContainer->removeAllWires(input); | |||
| } | |||
| for (PortWidget *output : outputs) { | |||
| context()->scene->rackWidget->wireContainer->removeAllWires(output); | |||
| app()->scene->rackWidget->wireContainer->removeAllWires(output); | |||
| } | |||
| } | |||
| void ModuleWidget::reset() { | |||
| if (module) { | |||
| context()->engine->resetModule(module); | |||
| app()->engine->resetModule(module); | |||
| } | |||
| } | |||
| void ModuleWidget::randomize() { | |||
| if (module) { | |||
| context()->engine->randomizeModule(module); | |||
| app()->engine->randomizeModule(module); | |||
| } | |||
| } | |||
| @@ -298,7 +298,7 @@ void ModuleWidget::draw(NVGcontext *vg) { | |||
| std::string cpuText = string::f("%.0f mS", module->cpuTime * 1000.f); | |||
| // TODO Use blendish text function | |||
| nvgFontFaceId(vg, context()->window->uiFont->handle); | |||
| nvgFontFaceId(vg, app()->window->uiFont->handle); | |||
| nvgFontSize(vg, 12); | |||
| nvgFillColor(vg, nvgRGBf(1, 1, 1)); | |||
| nvgText(vg, 10.0, box.size.y - 6.0, cpuText.c_str(), NULL); | |||
| @@ -331,8 +331,8 @@ void ModuleWidget::onHover(const event::Hover &e) { | |||
| OpaqueWidget::onHover(e); | |||
| // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | |||
| if (glfwGetKey(context()->window->win, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(context()->window->win, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | |||
| if (!context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (glfwGetKey(app()->window->win, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(app()->window->win, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | |||
| if (!app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| requestedDelete = true; | |||
| return; | |||
| } | |||
| @@ -352,43 +352,43 @@ void ModuleWidget::onHoverKey(const event::HoverKey &e) { | |||
| if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_I: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| reset(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_R: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| randomize(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_C: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| copyClipboard(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_V: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| pasteClipboard(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_D: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| context()->scene->rackWidget->cloneModule(this); | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| app()->scene->rackWidget->cloneModule(this); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_U: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| disconnect(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_E: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if (app()->window->isModPressed() && !app()->window->isShiftPressed()) { | |||
| toggleBypass(); | |||
| e.consume(this); | |||
| } | |||
| @@ -401,7 +401,7 @@ void ModuleWidget::onHoverKey(const event::HoverKey &e) { | |||
| } | |||
| void ModuleWidget::onDragStart(const event::DragStart &e) { | |||
| dragPos = context()->scene->rackWidget->lastMousePos.minus(box.pos); | |||
| dragPos = app()->scene->rackWidget->lastMousePos.minus(box.pos); | |||
| } | |||
| void ModuleWidget::onDragEnd(const event::DragEnd &e) { | |||
| @@ -410,8 +410,8 @@ void ModuleWidget::onDragEnd(const event::DragEnd &e) { | |||
| void ModuleWidget::onDragMove(const event::DragMove &e) { | |||
| if (!settings::lockModules) { | |||
| math::Rect newBox = box; | |||
| newBox.pos = context()->scene->rackWidget->lastMousePos.minus(dragPos); | |||
| context()->scene->rackWidget->requestModuleBoxNearest(this, newBox); | |||
| newBox.pos = app()->scene->rackWidget->lastMousePos.minus(dragPos); | |||
| app()->scene->rackWidget->requestModuleBoxNearest(this, newBox); | |||
| } | |||
| } | |||
| @@ -498,7 +498,7 @@ struct ModuleCloneItem : MenuItem { | |||
| rightText = WINDOW_MOD_KEY_NAME "+D"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->cloneModule(moduleWidget); | |||
| app()->scene->rackWidget->cloneModule(moduleWidget); | |||
| } | |||
| }; | |||
| @@ -526,7 +526,7 @@ struct ModuleDeleteItem : MenuItem { | |||
| rightText = "Backspace/Delete"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->deleteModule(moduleWidget); | |||
| app()->scene->rackWidget->deleteModule(moduleWidget); | |||
| delete moduleWidget; | |||
| } | |||
| }; | |||
| @@ -3,7 +3,7 @@ | |||
| #include "ui/TextField.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "app/ParamQuantity.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "settings.hpp" | |||
| #include "random.hpp" | |||
| @@ -16,7 +16,7 @@ struct ParamField : TextField { | |||
| void step() override { | |||
| // Keep selected | |||
| context()->event->setSelected(this); | |||
| app()->event->setSelected(this); | |||
| } | |||
| void setParamWidget(ParamWidget *paramWidget) { | |||
| @@ -104,7 +104,7 @@ void ParamWidget::onButton(const event::Button &e) { | |||
| if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_LEFT && (e.mods & GLFW_MOD_SHIFT) && !(e.mods & GLFW_MOD_CONTROL)) { | |||
| // Create ParamField | |||
| MenuOverlay *overlay = new MenuOverlay; | |||
| context()->scene->addChild(overlay); | |||
| app()->scene->addChild(overlay); | |||
| ParamField *paramField = new ParamField; | |||
| paramField->box.size.x = 100; | |||
| @@ -119,13 +119,13 @@ void ParamWidget::onButton(const event::Button &e) { | |||
| void ParamWidget::onEnter(const event::Enter &e) { | |||
| if (settings::paramTooltip && !tooltip) { | |||
| tooltip = new Tooltip; | |||
| context()->scene->addChild(tooltip); | |||
| app()->scene->addChild(tooltip); | |||
| } | |||
| } | |||
| void ParamWidget::onLeave(const event::Leave &e) { | |||
| if (tooltip) { | |||
| context()->scene->removeChild(tooltip); | |||
| app()->scene->removeChild(tooltip); | |||
| delete tooltip; | |||
| tooltip = NULL; | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| #include "app/PortWidget.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "window.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "componentlibrary.hpp" | |||
| @@ -28,7 +28,7 @@ PortWidget::~PortWidget() { | |||
| // HACK | |||
| // See ModuleWidget::~ModuleWidget for description | |||
| if (module) | |||
| context()->scene->rackWidget->wireContainer->removeAllWires(this); | |||
| app()->scene->rackWidget->wireContainer->removeAllWires(this); | |||
| } | |||
| void PortWidget::step() { | |||
| @@ -48,7 +48,7 @@ void PortWidget::step() { | |||
| } | |||
| void PortWidget::draw(NVGcontext *vg) { | |||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||
| WireWidget *activeWire = app()->scene->rackWidget->wireContainer->activeWire; | |||
| if (activeWire) { | |||
| // Dim the PortWidget if the active wire cannot plug into this PortWidget | |||
| if (type == INPUT ? activeWire->inputPort : activeWire->outputPort) | |||
| @@ -58,7 +58,7 @@ void PortWidget::draw(NVGcontext *vg) { | |||
| void PortWidget::onButton(const event::Button &e) { | |||
| if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_RIGHT) { | |||
| context()->scene->rackWidget->wireContainer->removeTopWire(this); | |||
| app()->scene->rackWidget->wireContainer->removeTopWire(this); | |||
| // HACK | |||
| // Update hovered*PortWidget of active wire if applicable | |||
| @@ -71,8 +71,8 @@ void PortWidget::onButton(const event::Button &e) { | |||
| void PortWidget::onDragStart(const event::DragStart &e) { | |||
| // Try to grab wire on top of stack | |||
| WireWidget *wire = NULL; | |||
| if (type == INPUT || !context()->window->isModPressed()) { | |||
| wire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||
| if (type == INPUT || !app()->window->isModPressed()) { | |||
| wire = app()->scene->rackWidget->wireContainer->getTopWire(this); | |||
| } | |||
| if (wire) { | |||
| @@ -85,13 +85,13 @@ void PortWidget::onDragStart(const event::DragStart &e) { | |||
| wire = new WireWidget; | |||
| (type == INPUT ? wire->inputPort : wire->outputPort) = this; | |||
| } | |||
| context()->scene->rackWidget->wireContainer->setActiveWire(wire); | |||
| app()->scene->rackWidget->wireContainer->setActiveWire(wire); | |||
| } | |||
| void PortWidget::onDragEnd(const event::DragEnd &e) { | |||
| // FIXME | |||
| // If the source PortWidget is deleted, this will be called, removing the cable | |||
| context()->scene->rackWidget->wireContainer->commitActiveWire(); | |||
| app()->scene->rackWidget->wireContainer->commitActiveWire(); | |||
| } | |||
| void PortWidget::onDragDrop(const event::DragDrop &e) { | |||
| @@ -112,12 +112,12 @@ void PortWidget::onDragEnter(const event::DragEnter &e) { | |||
| // Reject ports if this is an input port and something is already plugged into it | |||
| if (type == INPUT) { | |||
| WireWidget *topWire = context()->scene->rackWidget->wireContainer->getTopWire(this); | |||
| WireWidget *topWire = app()->scene->rackWidget->wireContainer->getTopWire(this); | |||
| if (topWire) | |||
| return; | |||
| } | |||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||
| WireWidget *activeWire = app()->scene->rackWidget->wireContainer->activeWire; | |||
| if (activeWire) { | |||
| (type == INPUT ? activeWire->hoveredInputPort : activeWire->hoveredOutputPort) = this; | |||
| } | |||
| @@ -128,7 +128,7 @@ void PortWidget::onDragLeave(const event::DragLeave &e) { | |||
| if (!originPort) | |||
| return; | |||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||
| WireWidget *activeWire = app()->scene->rackWidget->wireContainer->activeWire; | |||
| if (activeWire) { | |||
| (type == INPUT ? activeWire->hoveredInputPort : activeWire->hoveredOutputPort) = NULL; | |||
| } | |||
| @@ -1,17 +1,17 @@ | |||
| #include "app/RackScrollWidget.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "window.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| void RackScrollWidget::step() { | |||
| math::Vec pos = context()->window->mousePos; | |||
| math::Vec pos = app()->window->mousePos; | |||
| math::Rect viewport = getViewport(box.zeroPos()); | |||
| // Scroll rack if dragging cable near the edge of the screen | |||
| if (context()->scene->rackWidget->wireContainer->activeWire) { | |||
| if (app()->scene->rackWidget->wireContainer->activeWire) { | |||
| float margin = 20.0; | |||
| float speed = 15.0; | |||
| if (pos.x <= viewport.pos.x + margin) | |||
| @@ -9,7 +9,7 @@ | |||
| #include "asset.hpp" | |||
| #include "system.hpp" | |||
| #include "plugin.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -60,7 +60,7 @@ void RackWidget::clear() { | |||
| wireContainer->clearChildren(); | |||
| moduleContainer->clearChildren(); | |||
| context()->scene->scrollWidget->offset = math::Vec(0, 0); | |||
| app()->scene->scrollWidget->offset = math::Vec(0, 0); | |||
| } | |||
| void RackWidget::reset() { | |||
| @@ -432,7 +432,7 @@ ModuleWidget *RackWidget::moduleFromJson(json_t *moduleJ) { | |||
| } | |||
| void RackWidget::pastePresetClipboard() { | |||
| const char *moduleJson = glfwGetClipboardString(context()->window->win); | |||
| const char *moduleJson = glfwGetClipboardString(app()->window->win); | |||
| if (!moduleJson) { | |||
| WARN("Could not get text from clipboard."); | |||
| return; | |||
| @@ -539,7 +539,7 @@ void RackWidget::step() { | |||
| } | |||
| // Autosave every 15 seconds | |||
| int frame = context()->window->frame; | |||
| int frame = app()->window->frame; | |||
| if (frame > 0 && frame % (60 * 15) == 0) { | |||
| save(asset::user("autosave.vcv")); | |||
| settings::save(asset::user("settings.json")); | |||
| @@ -566,7 +566,7 @@ void RackWidget::onButton(const event::Button &e) { | |||
| OpaqueWidget::onButton(e); | |||
| if (e.getConsumed() == this) { | |||
| if (e.action == GLFW_PRESS && e.button == GLFW_MOUSE_BUTTON_RIGHT) { | |||
| context()->scene->moduleBrowser->visible = true; | |||
| app()->scene->moduleBrowser->visible = true; | |||
| } | |||
| } | |||
| } | |||
| @@ -4,7 +4,8 @@ | |||
| #include "app/Scene.hpp" | |||
| #include "app/ModuleBrowser.hpp" | |||
| #include "app/RackScrollWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "history.hpp" | |||
| #include <thread> | |||
| @@ -64,7 +65,7 @@ void Scene::step() { | |||
| if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, versionMessage.c_str())) { | |||
| std::thread t(system::openBrowser, "https://vcvrack.com/"); | |||
| t.detach(); | |||
| context()->window->close(); | |||
| app()->window->close(); | |||
| } | |||
| latestVersion = ""; | |||
| } | |||
| @@ -78,50 +79,60 @@ void Scene::onHoverKey(const event::HoverKey &e) { | |||
| if (e.action == GLFW_PRESS) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_N: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->reset(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_Q: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| context()->window->close(); | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| app()->window->close(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_O: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->loadDialog(); | |||
| e.consume(this); | |||
| } | |||
| if (context()->window->isModPressed() && context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && (e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->revert(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_S: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->saveDialog(); | |||
| e.consume(this); | |||
| } | |||
| if (context()->window->isModPressed() && context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && (e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->saveAsDialog(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_V: { | |||
| if (context()->window->isModPressed() && !context()->window->isShiftPressed()) { | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| rackWidget->pastePresetClipboard(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_Z: { | |||
| if ((e.mods & WINDOW_MOD) && !(e.mods & GLFW_MOD_SHIFT)) { | |||
| app()->history->undo(); | |||
| e.consume(this); | |||
| } | |||
| if ((e.mods & WINDOW_MOD) && (e.mods & GLFW_MOD_SHIFT)) { | |||
| app()->history->redo(); | |||
| e.consume(this); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_ENTER: | |||
| case GLFW_KEY_KP_ENTER: { | |||
| moduleBrowser->visible = true; | |||
| e.consume(this); | |||
| } break; | |||
| case GLFW_KEY_F11: { | |||
| context()->window->setFullScreen(!context()->window->isFullScreen()); | |||
| app()->window->setFullScreen(!app()->window->isFullScreen()); | |||
| e.consume(this); | |||
| } | |||
| } | |||
| @@ -10,7 +10,7 @@ | |||
| #include "ui/PasswordField.hpp" | |||
| #include "ui/ProgressBar.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "settings.hpp" | |||
| #include "helpers.hpp" | |||
| #include "system.hpp" | |||
| @@ -23,7 +23,7 @@ namespace rack { | |||
| struct MenuButton : Button { | |||
| void step() override { | |||
| box.size.x = bndLabelWidth(context()->window->vg, -1, text.c_str()); | |||
| box.size.x = bndLabelWidth(app()->window->vg, -1, text.c_str()); | |||
| Widget::step(); | |||
| } | |||
| void draw(NVGcontext *vg) override { | |||
| @@ -38,7 +38,7 @@ struct NewItem : MenuItem { | |||
| rightText = "(" WINDOW_MOD_KEY_NAME "+N)"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->reset(); | |||
| app()->scene->rackWidget->reset(); | |||
| } | |||
| }; | |||
| @@ -49,7 +49,7 @@ struct OpenItem : MenuItem { | |||
| rightText = "(" WINDOW_MOD_KEY_NAME "+O)"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->loadDialog(); | |||
| app()->scene->rackWidget->loadDialog(); | |||
| } | |||
| }; | |||
| @@ -60,7 +60,7 @@ struct SaveItem : MenuItem { | |||
| rightText = "(" WINDOW_MOD_KEY_NAME "+S)"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->saveDialog(); | |||
| app()->scene->rackWidget->saveDialog(); | |||
| } | |||
| }; | |||
| @@ -71,7 +71,7 @@ struct SaveAsItem : MenuItem { | |||
| rightText = "(" WINDOW_MOD_KEY_NAME "+Shift+S)"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->saveAsDialog(); | |||
| app()->scene->rackWidget->saveAsDialog(); | |||
| } | |||
| }; | |||
| @@ -81,7 +81,7 @@ struct SaveTemplateItem : MenuItem { | |||
| text = "Save template"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->saveTemplate(); | |||
| app()->scene->rackWidget->saveTemplate(); | |||
| } | |||
| }; | |||
| @@ -91,7 +91,7 @@ struct RevertItem : MenuItem { | |||
| text = "Revert"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->revert(); | |||
| app()->scene->rackWidget->revert(); | |||
| } | |||
| }; | |||
| @@ -101,7 +101,7 @@ struct DisconnectCablesItem : MenuItem { | |||
| text = "Disconnect cables"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->scene->rackWidget->disconnect(); | |||
| app()->scene->rackWidget->disconnect(); | |||
| } | |||
| }; | |||
| @@ -112,7 +112,7 @@ struct QuitItem : MenuItem { | |||
| rightText = "(" WINDOW_MOD_KEY_NAME "+Q)"; | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->window->close(); | |||
| app()->window->close(); | |||
| } | |||
| }; | |||
| @@ -222,10 +222,10 @@ struct LockModulesItem : MenuItem { | |||
| struct EnginePauseItem : MenuItem { | |||
| EnginePauseItem() { | |||
| text = "Pause engine"; | |||
| rightText = CHECKMARK(context()->engine->paused); | |||
| rightText = CHECKMARK(app()->engine->paused); | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->engine->paused ^= true; | |||
| app()->engine->paused ^= true; | |||
| } | |||
| }; | |||
| @@ -235,11 +235,11 @@ struct SampleRateValueItem : MenuItem { | |||
| SampleRateValueItem(float sampleRate) { | |||
| this->sampleRate = sampleRate; | |||
| text = string::f("%.0f Hz", sampleRate); | |||
| rightText = CHECKMARK(context()->engine->getSampleRate() == sampleRate); | |||
| rightText = CHECKMARK(app()->engine->getSampleRate() == sampleRate); | |||
| } | |||
| void onAction(const event::Action &e) override { | |||
| context()->engine->setSampleRate(sampleRate); | |||
| context()->engine->paused = false; | |||
| app()->engine->setSampleRate(sampleRate); | |||
| app()->engine->paused = false; | |||
| } | |||
| }; | |||
| @@ -314,7 +314,7 @@ struct AccountEmailField : TextField { | |||
| } | |||
| void onSelectKey(const event::SelectKey &e) override { | |||
| if (e.action == GLFW_PRESS && e.key == GLFW_KEY_TAB) { | |||
| context()->event->selectedWidget = passwordField; | |||
| app()->event->selectedWidget = passwordField; | |||
| e.consume(this); | |||
| return; | |||
| } | |||
| @@ -399,7 +399,7 @@ struct SyncItem : MenuItem { | |||
| // // Display message if we've completed updates | |||
| // if (completed) { | |||
| // if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, "All plugins have been updated. Close Rack and re-launch it to load new updates.")) { | |||
| // context()->window->close(); | |||
| // app()->window->close(); | |||
| // } | |||
| // completed = false; | |||
| // } | |||
| @@ -4,7 +4,7 @@ | |||
| #include "componentlibrary.hpp" | |||
| #include "window.hpp" | |||
| #include "event.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "settings.hpp" | |||
| @@ -111,12 +111,12 @@ void WireWidget::updateWire() { | |||
| wire->outputId = outputPort->portId; | |||
| wire->inputModule = inputPort->module; | |||
| wire->inputId = inputPort->portId; | |||
| context()->engine->addWire(wire); | |||
| app()->engine->addWire(wire); | |||
| } | |||
| } | |||
| else { | |||
| if (wire) { | |||
| context()->engine->removeWire(wire); | |||
| app()->engine->removeWire(wire); | |||
| delete wire; | |||
| wire = NULL; | |||
| } | |||
| @@ -125,25 +125,25 @@ void WireWidget::updateWire() { | |||
| math::Vec WireWidget::getOutputPos() { | |||
| if (outputPort) { | |||
| return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||
| return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), app()->scene->rackWidget); | |||
| } | |||
| else if (hoveredOutputPort) { | |||
| return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||
| return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), app()->scene->rackWidget); | |||
| } | |||
| else { | |||
| return context()->scene->rackWidget->lastMousePos; | |||
| return app()->scene->rackWidget->lastMousePos; | |||
| } | |||
| } | |||
| math::Vec WireWidget::getInputPos() { | |||
| if (inputPort) { | |||
| return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||
| return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), app()->scene->rackWidget); | |||
| } | |||
| else if (hoveredInputPort) { | |||
| return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), context()->scene->rackWidget); | |||
| return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), app()->scene->rackWidget); | |||
| } | |||
| else { | |||
| return context()->scene->rackWidget->lastMousePos; | |||
| return app()->scene->rackWidget->lastMousePos; | |||
| } | |||
| } | |||
| @@ -167,14 +167,14 @@ void WireWidget::draw(NVGcontext *vg) { | |||
| float opacity = settings::wireOpacity; | |||
| float tension = settings::wireTension; | |||
| WireWidget *activeWire = context()->scene->rackWidget->wireContainer->activeWire; | |||
| WireWidget *activeWire = app()->scene->rackWidget->wireContainer->activeWire; | |||
| if (activeWire) { | |||
| // Draw as opaque if the wire is active | |||
| if (activeWire == this) | |||
| opacity = 1.0; | |||
| } | |||
| else { | |||
| PortWidget *hoveredPort = dynamic_cast<PortWidget*>(context()->event->hoveredWidget); | |||
| PortWidget *hoveredPort = dynamic_cast<PortWidget*>(app()->event->hoveredWidget); | |||
| if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort)) | |||
| opacity = 1.0; | |||
| } | |||
| @@ -1,15 +0,0 @@ | |||
| #include "context.hpp" | |||
| namespace rack { | |||
| static Context c; | |||
| Context *context() { | |||
| return &c; | |||
| } | |||
| } // namespace rack | |||
| @@ -1,6 +1,6 @@ | |||
| #include "engine/Light.hpp" | |||
| #include "engine/Engine.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| namespace rack { | |||
| @@ -16,7 +16,7 @@ void Light::setBrightnessSmooth(float brightness, float frames) { | |||
| float v = (brightness > 0.f) ? std::pow(brightness, 2) : 0.f; | |||
| if (v < value) { | |||
| // Fade out light with lambda = framerate | |||
| value += (v - value) * context()->engine->getSampleTime() * frames * 60.f; | |||
| value += (v - value) * app()->engine->getSampleTime() * frames * 60.f; | |||
| } | |||
| else { | |||
| // Immediately illuminate light | |||
| @@ -0,0 +1,22 @@ | |||
| #include "history.hpp" | |||
| namespace rack { | |||
| namespace history { | |||
| void State::push(Action *action) { | |||
| } | |||
| void State::undo() { | |||
| DEBUG("undo"); | |||
| } | |||
| void State::redo() { | |||
| DEBUG("redo"); | |||
| } | |||
| } // namespace history | |||
| } // namespace rack | |||
| @@ -9,7 +9,7 @@ | |||
| #include "engine/Engine.hpp" | |||
| #include "app/Scene.hpp" | |||
| #include "plugin.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "ui.hpp" | |||
| #include <unistd.h> | |||
| @@ -79,12 +79,8 @@ int main(int argc, char *argv[]) { | |||
| plugin::init(devMode); | |||
| // Initialize app | |||
| context()->event = new event::State; | |||
| context()->window = new Window; | |||
| context()->engine = new Engine; | |||
| context()->scene = new Scene; | |||
| context()->scene->devMode = devMode; | |||
| context()->event->rootWidget = context()->scene; | |||
| appInit(); | |||
| app()->scene->devMode = devMode; | |||
| settings::load(asset::user("settings.json")); | |||
| if (patchFile.empty()) { | |||
| @@ -94,36 +90,29 @@ int main(int argc, char *argv[]) { | |||
| settings::save(asset::user("settings.json")); | |||
| settings::skipLoadOnLaunch = false; | |||
| if (oldSkipLoadOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) { | |||
| context()->scene->rackWidget->lastPath = ""; | |||
| app()->scene->rackWidget->lastPath = ""; | |||
| } | |||
| else { | |||
| // Load autosave | |||
| std::string oldLastPath = context()->scene->rackWidget->lastPath; | |||
| context()->scene->rackWidget->load(asset::user("autosave.vcv")); | |||
| context()->scene->rackWidget->lastPath = oldLastPath; | |||
| std::string oldLastPath = app()->scene->rackWidget->lastPath; | |||
| app()->scene->rackWidget->load(asset::user("autosave.vcv")); | |||
| app()->scene->rackWidget->lastPath = oldLastPath; | |||
| } | |||
| } | |||
| else { | |||
| // Load patch | |||
| context()->scene->rackWidget->load(patchFile); | |||
| context()->scene->rackWidget->lastPath = patchFile; | |||
| app()->scene->rackWidget->load(patchFile); | |||
| app()->scene->rackWidget->lastPath = patchFile; | |||
| } | |||
| context()->engine->start(); | |||
| context()->window->run(); | |||
| context()->engine->stop(); | |||
| app()->engine->start(); | |||
| app()->window->run(); | |||
| app()->engine->stop(); | |||
| // Destroy app | |||
| context()->scene->rackWidget->save(asset::user("autosave.vcv")); | |||
| app()->scene->rackWidget->save(asset::user("autosave.vcv")); | |||
| settings::save(asset::user("settings.json")); | |||
| delete context()->scene; | |||
| context()->scene = NULL; | |||
| delete context()->event; | |||
| context()->event = NULL; | |||
| delete context()->engine; | |||
| context()->engine = NULL; | |||
| delete context()->window; | |||
| context()->window = NULL; | |||
| appDestroy(); | |||
| // Destroy environment | |||
| plugin::destroy(); | |||
| @@ -3,7 +3,7 @@ | |||
| #include "network.hpp" | |||
| #include "asset.hpp" | |||
| #include "string.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "app/common.hpp" | |||
| #include "plugin/callbacks.hpp" | |||
| @@ -4,7 +4,7 @@ | |||
| #include "app/Scene.hpp" | |||
| #include "app/ModuleBrowser.hpp" | |||
| #include "engine/Engine.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include <jansson.h> | |||
| @@ -20,14 +20,14 @@ static json_t *settingsToJson() { | |||
| json_t *tokenJ = json_string(plugin::token.c_str()); | |||
| json_object_set_new(rootJ, "token", tokenJ); | |||
| if (!context()->window->isMaximized()) { | |||
| if (!app()->window->isMaximized()) { | |||
| // windowSize | |||
| math::Vec windowSize = context()->window->getWindowSize(); | |||
| math::Vec windowSize = app()->window->getWindowSize(); | |||
| json_t *windowSizeJ = json_pack("[f, f]", windowSize.x, windowSize.y); | |||
| json_object_set_new(rootJ, "windowSize", windowSizeJ); | |||
| // windowPos | |||
| math::Vec windowPos = context()->window->getWindowPos(); | |||
| math::Vec windowPos = app()->window->getWindowPos(); | |||
| json_t *windowPosJ = json_pack("[f, f]", windowPos.x, windowPos.y); | |||
| json_object_set_new(rootJ, "windowPos", windowPosJ); | |||
| } | |||
| @@ -45,15 +45,15 @@ static json_t *settingsToJson() { | |||
| json_object_set_new(rootJ, "zoom", zoomJ); | |||
| // allowCursorLock | |||
| json_t *allowCursorLockJ = json_boolean(context()->window->allowCursorLock); | |||
| json_t *allowCursorLockJ = json_boolean(app()->window->allowCursorLock); | |||
| json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | |||
| // sampleRate | |||
| json_t *sampleRateJ = json_real(context()->engine->getSampleRate()); | |||
| json_t *sampleRateJ = json_real(app()->engine->getSampleRate()); | |||
| json_object_set_new(rootJ, "sampleRate", sampleRateJ); | |||
| // lastPath | |||
| json_t *lastPathJ = json_string(context()->scene->rackWidget->lastPath.c_str()); | |||
| json_t *lastPathJ = json_string(app()->scene->rackWidget->lastPath.c_str()); | |||
| json_object_set_new(rootJ, "lastPath", lastPathJ); | |||
| // skipLoadOnLaunch | |||
| @@ -87,7 +87,7 @@ static void settingsFromJson(json_t *rootJ) { | |||
| if (windowSizeJ) { | |||
| double width, height; | |||
| json_unpack(windowSizeJ, "[F, F]", &width, &height); | |||
| context()->window->setWindowSize(math::Vec(width, height)); | |||
| app()->window->setWindowSize(math::Vec(width, height)); | |||
| } | |||
| // windowPos | |||
| @@ -95,7 +95,7 @@ static void settingsFromJson(json_t *rootJ) { | |||
| if (windowPosJ) { | |||
| double x, y; | |||
| json_unpack(windowPosJ, "[F, F]", &x, &y); | |||
| context()->window->setWindowPos(math::Vec(x, y)); | |||
| app()->window->setWindowPos(math::Vec(x, y)); | |||
| } | |||
| // wireOpacity | |||
| @@ -116,19 +116,19 @@ static void settingsFromJson(json_t *rootJ) { | |||
| // allowCursorLock | |||
| json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); | |||
| if (allowCursorLockJ) | |||
| context()->window->allowCursorLock = json_is_true(allowCursorLockJ); | |||
| app()->window->allowCursorLock = json_is_true(allowCursorLockJ); | |||
| // sampleRate | |||
| json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); | |||
| if (sampleRateJ) { | |||
| float sampleRate = json_number_value(sampleRateJ); | |||
| context()->engine->setSampleRate(sampleRate); | |||
| app()->engine->setSampleRate(sampleRate); | |||
| } | |||
| // lastPath | |||
| json_t *lastPathJ = json_object_get(rootJ, "lastPath"); | |||
| if (lastPathJ) | |||
| context()->scene->rackWidget->lastPath = json_string_value(lastPathJ); | |||
| app()->scene->rackWidget->lastPath = json_string_value(lastPathJ); | |||
| // skipLoadOnLaunch | |||
| json_t *skipLoadOnLaunchJ = json_object_get(rootJ, "skipLoadOnLaunch"); | |||
| @@ -7,7 +7,7 @@ namespace rack { | |||
| void MenuItem::draw(NVGcontext *vg) { | |||
| BNDwidgetState state = BND_DEFAULT; | |||
| if (context()->event->hoveredWidget == this) | |||
| if (app()->event->hoveredWidget == this) | |||
| state = BND_HOVER; | |||
| // Set active state if this MenuItem | |||
| @@ -30,9 +30,9 @@ void MenuItem::draw(NVGcontext *vg) { | |||
| void MenuItem::step() { | |||
| // Add 10 more pixels because measurements on high-DPI screens are sometimes too small for some reason | |||
| const float rightPadding = 10.0; | |||
| // HACK use context()->window->vg from the window. | |||
| // All this does is inspect the font, so it shouldn't modify context()->window->vg and should work when called from a FramebufferWidget for example. | |||
| box.size.x = bndLabelWidth(context()->window->vg, -1, text.c_str()) + bndLabelWidth(context()->window->vg, -1, rightText.c_str()) + rightPadding; | |||
| // HACK use app()->window->vg from the window. | |||
| // All this does is inspect the font, so it shouldn't modify app()->window->vg and should work when called from a FramebufferWidget for example. | |||
| box.size.x = bndLabelWidth(app()->window->vg, -1, text.c_str()) + bndLabelWidth(app()->window->vg, -1, rightText.c_str()) + rightPadding; | |||
| Widget::step(); | |||
| } | |||
| @@ -1,6 +1,6 @@ | |||
| #include "ui/ScrollBar.hpp" | |||
| #include "ui/ScrollWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "window.hpp" | |||
| @@ -20,7 +20,7 @@ void ScrollBar::draw(NVGcontext *vg) { | |||
| void ScrollBar::onDragStart(const event::DragStart &e) { | |||
| state = BND_ACTIVE; | |||
| context()->window->cursorLock(); | |||
| app()->window->cursorLock(); | |||
| } | |||
| void ScrollBar::onDragMove(const event::DragMove &e) { | |||
| @@ -34,7 +34,7 @@ void ScrollBar::onDragMove(const event::DragMove &e) { | |||
| void ScrollBar::onDragEnd(const event::DragEnd &e) { | |||
| state = BND_DEFAULT; | |||
| context()->window->cursorUnlock(); | |||
| app()->window->cursorUnlock(); | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| #include "ui/ScrollWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "event.hpp" | |||
| @@ -70,25 +70,25 @@ void ScrollWidget::step() { | |||
| void ScrollWidget::onHover(const event::Hover &e) { | |||
| // Scroll with arrow keys | |||
| if (!context()->event->selectedWidget) { | |||
| if (!app()->event->selectedWidget) { | |||
| float arrowSpeed = 30.0; | |||
| if (context()->window->isShiftPressed() && context()->window->isModPressed()) | |||
| if (app()->window->isShiftPressed() && app()->window->isModPressed()) | |||
| arrowSpeed /= 16.0; | |||
| else if (context()->window->isShiftPressed()) | |||
| else if (app()->window->isShiftPressed()) | |||
| arrowSpeed *= 4.0; | |||
| else if (context()->window->isModPressed()) | |||
| else if (app()->window->isModPressed()) | |||
| arrowSpeed /= 4.0; | |||
| if (glfwGetKey(context()->window->win, GLFW_KEY_LEFT) == GLFW_PRESS) { | |||
| if (glfwGetKey(app()->window->win, GLFW_KEY_LEFT) == GLFW_PRESS) { | |||
| offset.x -= arrowSpeed; | |||
| } | |||
| if (glfwGetKey(context()->window->win, GLFW_KEY_RIGHT) == GLFW_PRESS) { | |||
| if (glfwGetKey(app()->window->win, GLFW_KEY_RIGHT) == GLFW_PRESS) { | |||
| offset.x += arrowSpeed; | |||
| } | |||
| if (glfwGetKey(context()->window->win, GLFW_KEY_UP) == GLFW_PRESS) { | |||
| if (glfwGetKey(app()->window->win, GLFW_KEY_UP) == GLFW_PRESS) { | |||
| offset.y -= arrowSpeed; | |||
| } | |||
| if (glfwGetKey(context()->window->win, GLFW_KEY_DOWN) == GLFW_PRESS) { | |||
| if (glfwGetKey(app()->window->win, GLFW_KEY_DOWN) == GLFW_PRESS) { | |||
| offset.y += arrowSpeed; | |||
| } | |||
| } | |||
| @@ -11,9 +11,9 @@ void TextField::draw(NVGcontext *vg) { | |||
| nvgScissor(vg, 0, 0, box.size.x, box.size.y); | |||
| BNDwidgetState state; | |||
| if (this == context()->event->selectedWidget) | |||
| if (this == app()->event->selectedWidget) | |||
| state = BND_ACTIVE; | |||
| else if (this == context()->event->hoveredWidget) | |||
| else if (this == app()->event->hoveredWidget) | |||
| state = BND_HOVER; | |||
| else | |||
| state = BND_DEFAULT; | |||
| @@ -37,7 +37,7 @@ void TextField::onButton(const event::Button &e) { | |||
| } | |||
| void TextField::onHover(const event::Hover &e) { | |||
| if (this == context()->event->draggedWidget) { | |||
| if (this == app()->event->draggedWidget) { | |||
| int pos = getTextPosition(e.pos); | |||
| if (pos != selection) { | |||
| cursor = pos; | |||
| @@ -94,7 +94,7 @@ void TextField::onSelectKey(const event::SelectKey &e) { | |||
| } | |||
| } break; | |||
| case GLFW_KEY_LEFT: { | |||
| if (context()->window->isModPressed()) { | |||
| if (app()->window->isModPressed()) { | |||
| while (--cursor > 0) { | |||
| if (text[cursor] == ' ') | |||
| break; | |||
| @@ -103,12 +103,12 @@ void TextField::onSelectKey(const event::SelectKey &e) { | |||
| else { | |||
| cursor--; | |||
| } | |||
| if (!context()->window->isShiftPressed()) { | |||
| if (!app()->window->isShiftPressed()) { | |||
| selection = cursor; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_RIGHT: { | |||
| if (context()->window->isModPressed()) { | |||
| if (app()->window->isModPressed()) { | |||
| while (++cursor < (int) text.size()) { | |||
| if (text[cursor] == ' ') | |||
| break; | |||
| @@ -117,7 +117,7 @@ void TextField::onSelectKey(const event::SelectKey &e) { | |||
| else { | |||
| cursor++; | |||
| } | |||
| if (!context()->window->isShiftPressed()) { | |||
| if (!app()->window->isShiftPressed()) { | |||
| selection = cursor; | |||
| } | |||
| } break; | |||
| @@ -128,33 +128,33 @@ void TextField::onSelectKey(const event::SelectKey &e) { | |||
| selection = cursor = text.size(); | |||
| } break; | |||
| case GLFW_KEY_V: { | |||
| if (context()->window->isModPressed()) { | |||
| const char *newText = glfwGetClipboardString(context()->window->win); | |||
| if (app()->window->isModPressed()) { | |||
| const char *newText = glfwGetClipboardString(app()->window->win); | |||
| if (newText) | |||
| insertText(newText); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_X: { | |||
| if (context()->window->isModPressed()) { | |||
| if (app()->window->isModPressed()) { | |||
| if (cursor != selection) { | |||
| int begin = std::min(cursor, selection); | |||
| std::string selectedText = text.substr(begin, std::abs(selection - cursor)); | |||
| glfwSetClipboardString(context()->window->win, selectedText.c_str()); | |||
| glfwSetClipboardString(app()->window->win, selectedText.c_str()); | |||
| insertText(""); | |||
| } | |||
| } | |||
| } break; | |||
| case GLFW_KEY_C: { | |||
| if (context()->window->isModPressed()) { | |||
| if (app()->window->isModPressed()) { | |||
| if (cursor != selection) { | |||
| int begin = std::min(cursor, selection); | |||
| std::string selectedText = text.substr(begin, std::abs(selection - cursor)); | |||
| glfwSetClipboardString(context()->window->win, selectedText.c_str()); | |||
| glfwSetClipboardString(app()->window->win, selectedText.c_str()); | |||
| } | |||
| } | |||
| } break; | |||
| case GLFW_KEY_A: { | |||
| if (context()->window->isModPressed()) { | |||
| if (app()->window->isModPressed()) { | |||
| selectAll(); | |||
| } | |||
| } break; | |||
| @@ -203,7 +203,7 @@ void TextField::selectAll() { | |||
| } | |||
| int TextField::getTextPosition(math::Vec mousePos) { | |||
| return bndTextFieldTextPosition(context()->window->vg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), mousePos.x, mousePos.y); | |||
| return bndTextFieldTextPosition(app()->window->vg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), mousePos.x, mousePos.y); | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| #include "ui/Tooltip.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include "window.hpp" | |||
| @@ -8,8 +8,8 @@ namespace rack { | |||
| void Tooltip::step() { | |||
| // Wrap size to contents | |||
| box.size.x = bndLabelWidth(context()->window->vg, -1, text.c_str()) + 10.0; | |||
| box.size.y = bndLabelHeight(context()->window->vg, -1, text.c_str(), INFINITY); | |||
| box.size.x = bndLabelWidth(app()->window->vg, -1, text.c_str()) + 10.0; | |||
| box.size.y = bndLabelHeight(app()->window->vg, -1, text.c_str(), INFINITY); | |||
| Widget::step(); | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| #include "widgets/FramebufferWidget.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include <nanovg_gl.h> | |||
| #include <nanovg_gl_utils.h> | |||
| @@ -55,7 +55,7 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||
| internal->box.pos = internal->box.pos.mult(s).floor(); | |||
| internal->box.size = internal->box.size.mult(s).ceil().plus(math::Vec(1, 1)); | |||
| math::Vec fbSize = internal->box.size.mult(context()->window->pixelRatio * oversample); | |||
| math::Vec fbSize = internal->box.size.mult(app()->window->pixelRatio * oversample); | |||
| if (!fbSize.isFinite()) | |||
| return; | |||
| @@ -66,7 +66,7 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||
| // Delete old one first to free up GPU memory | |||
| internal->setFramebuffer(NULL); | |||
| // Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context. | |||
| NVGLUframebuffer *fb = nvgluCreateFramebuffer(context()->window->vg, fbSize.x, fbSize.y, 0); | |||
| NVGLUframebuffer *fb = nvgluCreateFramebuffer(app()->window->vg, fbSize.x, fbSize.y, 0); | |||
| if (!fb) | |||
| return; | |||
| internal->setFramebuffer(fb); | |||
| @@ -76,10 +76,10 @@ void FramebufferWidget::draw(NVGcontext *vg) { | |||
| glClearColor(0.0, 0.0, 0.0, 0.0); | |||
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |||
| NVGcontext *framebufferVg = context()->window->framebufferVg; | |||
| nvgBeginFrame(framebufferVg, fbSize.x, fbSize.y, context()->window->pixelRatio * oversample); | |||
| NVGcontext *framebufferVg = app()->window->framebufferVg; | |||
| nvgBeginFrame(framebufferVg, fbSize.x, fbSize.y, app()->window->pixelRatio * oversample); | |||
| nvgScale(framebufferVg, context()->window->pixelRatio * oversample, context()->window->pixelRatio * oversample); | |||
| nvgScale(framebufferVg, app()->window->pixelRatio * oversample, app()->window->pixelRatio * oversample); | |||
| // Use local scaling | |||
| nvgTranslate(framebufferVg, bf.x, bf.y); | |||
| nvgTranslate(framebufferVg, -internal->box.pos.x, -internal->box.pos.y); | |||
| @@ -1,6 +1,6 @@ | |||
| #include "widgets/Widget.hpp" | |||
| #include "event.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include <algorithm> | |||
| @@ -58,7 +58,7 @@ void Widget::removeChild(Widget *child) { | |||
| // Make sure `this` is the child's parent | |||
| assert(child->parent == this); | |||
| // Prepare to remove widget from the event state | |||
| context()->event->finalizeWidget(child); | |||
| app()->event->finalizeWidget(child); | |||
| // Delete child from children list | |||
| auto it = std::find(children.begin(), children.end(), child); | |||
| assert(it != children.end()); | |||
| @@ -69,7 +69,7 @@ void Widget::removeChild(Widget *child) { | |||
| void Widget::clearChildren() { | |||
| for (Widget *child : children) { | |||
| context()->event->finalizeWidget(child); | |||
| app()->event->finalizeWidget(child); | |||
| child->parent = NULL; | |||
| delete child; | |||
| } | |||
| @@ -81,7 +81,7 @@ void Widget::step() { | |||
| Widget *child = *it; | |||
| // Delete children if a delete is requested | |||
| if (child->requestedDelete) { | |||
| context()->event->finalizeWidget(child); | |||
| app()->event->finalizeWidget(child); | |||
| it = children.erase(it); | |||
| child->parent = NULL; | |||
| delete child; | |||
| @@ -107,7 +107,7 @@ void Widget::draw(NVGcontext *vg) { | |||
| child->draw(vg); | |||
| // Draw red hitboxes | |||
| // if (context()->event->hoveredWidget == child) { | |||
| // if (app()->event->hoveredWidget == child) { | |||
| // nvgBeginPath(vg); | |||
| // nvgRect(vg, 0, 0, child->box.size.x, child->box.size.y); | |||
| // nvgFillColor(vg, nvgRGBAf(1, 0, 0, 0.5)); | |||
| @@ -4,7 +4,7 @@ | |||
| #include "keyboard.hpp" | |||
| #include "gamepad.hpp" | |||
| #include "event.hpp" | |||
| #include "context.hpp" | |||
| #include "app.hpp" | |||
| #include <map> | |||
| #include <queue> | |||
| @@ -70,7 +70,7 @@ static void mouseButtonCallback(GLFWwindow *win, int button, int action, int mod | |||
| } | |||
| #endif | |||
| context()->event->handleButton(window->mousePos, button, action, mods); | |||
| app()->event->handleButton(window->mousePos, button, action, mods); | |||
| } | |||
| static void Window_mouseButtonStickyPop(Window *window) { | |||
| @@ -111,12 +111,12 @@ static void cursorPosCallback(GLFWwindow *win, double xpos, double ypos) { | |||
| window->mousePos = mousePos; | |||
| context()->event->handleHover(mousePos, mouseDelta); | |||
| app()->event->handleHover(mousePos, mouseDelta); | |||
| } | |||
| static void cursorEnterCallback(GLFWwindow *win, int entered) { | |||
| if (!entered) { | |||
| context()->event->handleLeave(); | |||
| app()->event->handleLeave(); | |||
| } | |||
| } | |||
| @@ -129,17 +129,17 @@ static void scrollCallback(GLFWwindow *win, double x, double y) { | |||
| #endif | |||
| scrollDelta = scrollDelta.mult(50.0); | |||
| context()->event->handleScroll(window->mousePos, scrollDelta); | |||
| app()->event->handleScroll(window->mousePos, scrollDelta); | |||
| } | |||
| static void charCallback(GLFWwindow *win, unsigned int codepoint) { | |||
| Window *window = (Window*) glfwGetWindowUserPointer(win); | |||
| context()->event->handleText(window->mousePos, codepoint); | |||
| app()->event->handleText(window->mousePos, codepoint); | |||
| } | |||
| static void keyCallback(GLFWwindow *win, int key, int scancode, int action, int mods) { | |||
| Window *window = (Window*) glfwGetWindowUserPointer(win); | |||
| context()->event->handleKey(window->mousePos, key, scancode, action, mods); | |||
| app()->event->handleKey(window->mousePos, key, scancode, action, mods); | |||
| // Keyboard MIDI driver | |||
| if (!(mods & (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL | GLFW_MOD_ALT | GLFW_MOD_SUPER))) { | |||
| @@ -158,7 +158,7 @@ static void dropCallback(GLFWwindow *win, int count, const char **paths) { | |||
| for (int i = 0; i < count; i++) { | |||
| pathsVec.push_back(paths[i]); | |||
| } | |||
| context()->event->handleDrop(window->mousePos, pathsVec); | |||
| app()->event->handleDrop(window->mousePos, pathsVec); | |||
| } | |||
| static void errorCallback(int error, const char *description) { | |||
| @@ -280,7 +280,7 @@ static void Window_renderGui(Window *window) { | |||
| nvgReset(window->vg); | |||
| nvgScale(window->vg, window->pixelRatio, window->pixelRatio); | |||
| context()->event->rootWidget->draw(window->vg); | |||
| app()->event->rootWidget->draw(window->vg); | |||
| glViewport(0, 0, width, height); | |||
| glClearColor(0.0, 0.0, 0.0, 1.0); | |||
| @@ -312,9 +312,9 @@ void Window::run() { | |||
| windowTitle = APP_NAME; | |||
| windowTitle += " "; | |||
| windowTitle += APP_VERSION; | |||
| if (!context()->scene->rackWidget->lastPath.empty()) { | |||
| if (!app()->scene->rackWidget->lastPath.empty()) { | |||
| windowTitle += " - "; | |||
| windowTitle += string::filename(context()->scene->rackWidget->lastPath); | |||
| windowTitle += string::filename(app()->scene->rackWidget->lastPath); | |||
| } | |||
| if (windowTitle != internal->lastWindowTitle) { | |||
| glfwSetWindowTitle(win, windowTitle.c_str()); | |||
| @@ -326,7 +326,7 @@ void Window::run() { | |||
| glfwGetWindowContentScale(win, &newPixelRatio, NULL); | |||
| newPixelRatio = std::round(newPixelRatio); | |||
| if (newPixelRatio != pixelRatio) { | |||
| context()->event->handleZoom(); | |||
| app()->event->handleZoom(); | |||
| pixelRatio = newPixelRatio; | |||
| } | |||
| @@ -337,10 +337,10 @@ void Window::run() { | |||
| glfwGetWindowSize(win, &windowWidth, &windowHeight); | |||
| windowRatio = (float)width / windowWidth; | |||
| context()->event->rootWidget->box.size = math::Vec(width, height).div(pixelRatio); | |||
| app()->event->rootWidget->box.size = math::Vec(width, height).div(pixelRatio); | |||
| // Step scene | |||
| context()->event->rootWidget->step(); | |||
| app()->event->rootWidget->step(); | |||
| // Render | |||
| bool visible = glfwGetWindowAttrib(win, GLFW_VISIBLE) && !glfwGetWindowAttrib(win, GLFW_ICONIFIED); | |||
| @@ -444,7 +444,7 @@ bool Window::isFullScreen() { | |||
| //////////////////// | |||
| Font::Font(const std::string &filename) { | |||
| handle = nvgCreateFont(context()->window->vg, filename.c_str(), filename.c_str()); | |||
| handle = nvgCreateFont(app()->window->vg, filename.c_str(), filename.c_str()); | |||
| if (handle >= 0) { | |||
| INFO("Loaded font %s", filename.c_str()); | |||
| } | |||
| @@ -470,7 +470,7 @@ std::shared_ptr<Font> Font::load(const std::string &filename) { | |||
| //////////////////// | |||
| Image::Image(const std::string &filename) { | |||
| handle = nvgCreateImage(context()->window->vg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | |||
| handle = nvgCreateImage(app()->window->vg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | |||
| if (handle > 0) { | |||
| INFO("Loaded image %s", filename.c_str()); | |||
| } | |||
| @@ -481,7 +481,7 @@ Image::Image(const std::string &filename) { | |||
| Image::~Image() { | |||
| // TODO What if handle is invalid? | |||
| nvgDeleteImage(context()->window->vg, handle); | |||
| nvgDeleteImage(app()->window->vg, handle); | |||
| } | |||
| std::shared_ptr<Image> Image::load(const std::string &filename) { | |||