/* * DISTRHO Plugin Framework (DPF) * Copyright (C) 2012-2015 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this * permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // ------------------------------------------------------ // DGL Stuff #include "NanoWidgets.hpp" #include "StandaloneWindow.hpp" #include "extra/ScopedPointer.hpp" #include "extra/String.hpp" #include "src/nanovg/nanovg.h" #include "src/oui-blendish/blendish.h" // ------------------------------------------------------ // use namespace USE_NAMESPACE_DISTRHO; USE_NAMESPACE_DGL; // ------------------------------------------------------ // Test class BlendishCommon : public NanoWidget { public: enum State { kStateDefault = 0, // not interacting kStateHover = 1, // the mouse is hovering over the control kStateActive = 2 // the widget is activated (pressed) or in an active state (toggled) }; BlendishCommon(NanoWidget* groupWidget) : NanoWidget(groupWidget), fState(kStateDefault) { /* NVGcontext* const context(getContext()); if (nvgFindFont(context, "__dpf_blendish__") < 0) { bndSetFont(nvgCreateFont(context, "__dpf_blendish__", "./blendish_res/DejaVuSans.ttf")); bndSetIconImage(nvgCreateImage(context, "./blendish_res/blender_icons16.png", 0)); }*/ setSize(250, BND_WIDGET_HEIGHT); } State getCurrentState() const noexcept { return fState; } protected: bool onMouse(const MouseEvent& e) { if (! e.press) return false; if (! contains(e.pos)) return false; if (fState == kStateActive) fState = kStateHover; else fState = kStateActive; repaint(); return true; } bool onMotion(const MotionEvent& e) { if (! contains(e.pos)) { if (fState == kStateHover) { fState = kStateDefault; repaint(); return true; } return false; } if (fState == kStateDefault) { fState = kStateHover; repaint(); } return true; } private: State fState; }; // ------------------------------------------------------ // Test class BlendishLabel : public BlendishCommon { public: BlendishLabel(NanoWidget* groupWidget) : BlendishCommon(groupWidget), fIconId(-1), fText() { setText("this is a label"); //_updateBounds(); } int getIconId() const noexcept { return fIconId; } void setIconId(int iconId) noexcept { if (fIconId == iconId) return; fIconId = iconId; _updateBounds(); repaint(); } const char* getText() const noexcept { return fText; } void setText(const char* text) noexcept { if (fText == text) return; fText = text; _updateBounds(); repaint(); } protected: void onNanoDisplay() override { bndLabel(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), fIconId, fText); } private: int fIconId; String fText; void _updateBounds() { const float width = bndLabelWidth (getContext(), fIconId, fText); const float height = bndLabelHeight(getContext(), fIconId, fText, width); setSize(width, height); } }; class BlendishToolButton : public BlendishCommon { public: BlendishToolButton(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndToolButton(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), 0, static_cast(getCurrentState()), BND_ICON_SOUND, "this is a tool-button [sound]"); } }; class BlendishPushButton: public BlendishCommon { public: BlendishPushButton(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndRadioButton(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), 0, static_cast(getCurrentState()), BND_ICON_NEW, "this is a push-button [file->new]"); } }; // text field here class BlendishCheckbox : public BlendishCommon { public: BlendishCheckbox(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndOptionButton(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), static_cast(getCurrentState()), "this is a checkbox"); } }; class BlendishComboBox : public BlendishCommon { public: BlendishComboBox(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndChoiceButton(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), 0, static_cast(getCurrentState()), BND_ICON_NEW, "this is a combobox"); // bndMenuBackground // bndMenuLabel // bndMenuItem } }; class BlendishColorButton : public BlendishCommon { public: BlendishColorButton(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndColorButton(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), BND_DEFAULT, Color::fromHTML("#132487")); } }; // bndNumberField class BlendishSlider : public BlendishCommon { public: BlendishSlider(NanoWidget* groupWidget) : BlendishCommon(groupWidget) {} protected: void onNanoDisplay() override { bndSlider(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), 0, static_cast(getCurrentState()), 0.25f, "this is a slider", "and value"); } }; class BlendishScrollBar : public BlendishCommon { public: BlendishScrollBar(NanoWidget* groupWidget, bool horizontal) : BlendishCommon(groupWidget) { if (horizontal) setSize(250, BND_SCROLLBAR_HEIGHT); else setSize(BND_SCROLLBAR_WIDTH, 200); } protected: void onNanoDisplay() override { bndScrollBar(getContext(), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), static_cast(getCurrentState()), 0.25f, 0.5f); } }; // bndTooltipBackground // bndNodePort // bndNodeWire // bndColoredNodeWire // bndNodeBackground // bndSplitterWidgets // bndJoinAreaOverlay // ------------------------------------------------------ // Test class TestWidget : public NanoWidget { public: TestWidget(Window& parent) : NanoWidget(parent, NanoVG::CREATE_ANTIALIAS|NanoVG::CREATE_STENCIL_STROKES), w1_R(this, "this is a real button", BND_ICON_ALIGN), w0(this), w2(this), w3(this), w4(this), w5(this), w6(this), w7(this, true), w7b(this, false) { w1_R.setAbsolutePos(10, 10+25*1); w0.setAbsolutePos(10, 10+25*0); w2.setAbsolutePos(10, 10+25*2); w3.setAbsolutePos(10, 10+25*3); w4.setAbsolutePos(10, 10+25*4); w5.setAbsolutePos(10, 10+25*5); w6.setAbsolutePos(10, 10+25*6); w7.setAbsolutePos(10, 10+25*7); //w8.setAbsolutePos(10, 10+25*8); //w9.setAbsolutePos(10, 10+25*9); w7b.setAbsolutePos(470, 10); } protected: void onNanoDisplay() override { glClearColor(0.3f, 0.3f, 0.32f, 1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); } private: BlendishButton w1_R; BlendishLabel w0; BlendishPushButton w2; BlendishCheckbox w3; BlendishComboBox w4; BlendishColorButton w5; BlendishSlider w6; BlendishScrollBar w7; BlendishScrollBar w7b; }; // ------------------------------------------------------ // main entry point int main() { StandaloneWindow win; TestWidget w(win); win.setSize(500, 500); win.setTitle("Blendish"); win.exec(); return 0; } // ------------------------------------------------------