diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index f7ad248..5c1c89e 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -180,6 +180,7 @@ GLFWAPI const char* glfwGetKeyName(const int key, int) namespace rack { namespace app { widget::Widget* createMenuBar(bool isStandalone); + void hideResizeHandle(Scene* scene); } namespace window { void WindowSetPluginUI(Window* window, DISTRHO_NAMESPACE::UI* ui); @@ -269,12 +270,19 @@ public: context->nativeWindowId = window.getNativeWindowHandle(); if (isResizable()) - fResizeHandle.hide(); + hideResizeHandle(context->scene); const double scaleFactor = getScaleFactor(); if (scaleFactor != 1) + { + setGeometryConstraints(640 * scaleFactor, 480 * scaleFactor); setSize(1228 * scaleFactor, 666 * scaleFactor); + } + else + { + setGeometryConstraints(640, 480); + } rack::contextSet(context); diff --git a/src/ResizeHandle.hpp b/src/ResizeHandle.hpp index 3753b3d..2e2ece0 100644 --- a/src/ResizeHandle.hpp +++ b/src/ResizeHandle.hpp @@ -53,29 +53,8 @@ public: protected: void onDisplay() override { - const GraphicsContext& context(getGraphicsContext()); - const double lineWidth = 1.0 * getScaleFactor(); - -#ifdef DGL_OPENGL - // glUseProgram(0); - glMatrixMode(GL_MODELVIEW); -#endif - - // draw white lines, 1px wide - Color(1.0f, 1.0f, 1.0f).setFor(context); - l1.draw(context, lineWidth); - l2.draw(context, lineWidth); - l3.draw(context, lineWidth); - - // draw black lines, offset by 1px and 1px wide - Color(0.0f, 0.0f, 0.0f).setFor(context); - Line l1b(l1), l2b(l2), l3b(l3); - l1b.moveBy(lineWidth, lineWidth); - l2b.moveBy(lineWidth, lineWidth); - l3b.moveBy(lineWidth, lineWidth); - l1b.draw(context, lineWidth); - l2b.draw(context, lineWidth); - l3b.draw(context, lineWidth); + /* Nothing here, we purposefully avoid drawing anything. + * The resize handle is on the plugin UI directly. */ } bool onMouse(const MouseEvent& ev) override diff --git a/src/override/Scene.cpp b/src/override/Scene.cpp index cd2d737..94338a2 100644 --- a/src/override/Scene.cpp +++ b/src/override/Scene.cpp @@ -46,11 +46,58 @@ namespace rack { namespace app { +struct ResizeHandle : widget::OpaqueWidget { + void draw(const DrawArgs& args) override { + nvgStrokeColor(args.vg, nvgRGBf(1, 1, 1)); + nvgStrokeWidth(args.vg, 1); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x, 0); + nvgLineTo(args.vg, 0, box.size.y); + nvgStroke(args.vg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x + 5, 0); + nvgLineTo(args.vg, 0, box.size.y + 5); + nvgStroke(args.vg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x + 10, 0); + nvgLineTo(args.vg, 0, box.size.y + 10); + nvgStroke(args.vg); + + nvgStrokeColor(args.vg, nvgRGBf(0, 0, 0)); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x+1, 0); + nvgLineTo(args.vg, 0, box.size.y+1); + nvgStroke(args.vg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x + 6, 0); + nvgLineTo(args.vg, 0, box.size.y + 6); + nvgStroke(args.vg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg, box.size.x + 11, 0); + nvgLineTo(args.vg, 0, box.size.y + 11); + nvgStroke(args.vg); + } +}; + + struct Scene::Internal { + ResizeHandle* resizeHandle; + bool heldArrowKeys[4] = {}; }; +void hideResizeHandle(Scene* scene) { + scene->internal->resizeHandle->hide(); +} + + Scene::Scene() { internal = new Internal; @@ -65,6 +112,10 @@ Scene::Scene() { browser = browserCreate(); browser->hide(); addChild(browser); + + internal->resizeHandle = new ResizeHandle; + internal->resizeHandle->box.size = math::Vec(16, 16); + addChild(internal->resizeHandle); } @@ -79,6 +130,8 @@ math::Vec Scene::getMousePos() { void Scene::step() { + internal->resizeHandle->box.pos = box.size.minus(internal->resizeHandle->box.size); + // Resize owned descendants menuBar->box.size.x = box.size.x; rackScroll->box.pos.y = menuBar->box.size.y; diff --git a/src/override/Window.cpp b/src/override/Window.cpp index 85f8fc1..fbbcebf 100644 --- a/src/override/Window.cpp +++ b/src/override/Window.cpp @@ -325,6 +325,9 @@ math::Vec Window::getSize() { void Window::setSize(math::Vec size) { internal->size = size.max(minWindowSize); + + if (DISTRHO_NAMESPACE::UI* const ui = internal->ui) + ui->setSize(internal->size.x, internal->size.y); }