Browse Source

Update copyright year

Signed-off-by: falkTX <falktx@falktx.com>
master
falkTX 4 months ago
parent
commit
803b0c6740
2 changed files with 408 additions and 1 deletions
  1. +1
    -1
      LICENSE
  2. +407
    -0
      tests/Demo.cpp

+ 1
- 1
LICENSE View File

@@ -1,5 +1,5 @@
DISTRHO Plugin Framework (DPF)
Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>

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


+ 407
- 0
tests/Demo.cpp View File

@@ -0,0 +1,407 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>
*
* 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.
*/

#include "tests.hpp"

#include "widgets/ExampleColorWidget.hpp"
#include "widgets/ExampleImagesWidget.hpp"
#include "widgets/ExampleRectanglesWidget.hpp"
#include "widgets/ExampleShapesWidget.hpp"
#ifdef DGL_OPENGL
#include "widgets/ExampleTextWidget.hpp"
#endif

#include "demo_res/DemoArtwork.cpp"
#include "images_res/CatPics.cpp"

#ifdef DGL_CAIRO
#include "../dgl/Cairo.hpp"
typedef DGL_NAMESPACE::CairoImage DemoImage;
#endif
#ifdef DGL_OPENGL
#include "../dgl/OpenGL.hpp"
typedef DGL_NAMESPACE::OpenGLImage DemoImage;
#endif
#ifdef DGL_VULKAN
#include "../dgl/Vulkan.hpp"
typedef DGL_NAMESPACE::VulkanImage DemoImage;
#endif

START_NAMESPACE_DGL

typedef ExampleImagesWidget<SubWidget, DemoImage> ExampleImagesSubWidget;
typedef ExampleImagesWidget<TopLevelWidget, DemoImage> ExampleImagesTopLevelWidget;
typedef ExampleImagesWidget<StandaloneWindow, DemoImage> ExampleImagesStandaloneWindow;

// --------------------------------------------------------------------------------------------------------------------
// Left side tab-like widget

class LeftSideWidget : public SubWidget
{
public:
#ifdef DGL_OPENGL
static const int kPageCount = 5;
#else
static const int kPageCount = 4;
#endif

class Callback
{
public:
virtual ~Callback() {}
virtual void curPageChanged(int curPage) = 0;
};

LeftSideWidget(Widget* parent, Callback* const cb)
: SubWidget(parent),
callback(cb),
curPage(0),
curHover(-1)
{

using namespace DemoArtwork;
img1.loadFromMemory(ico1Data, ico1Width, ico1Height, kImageFormatBGR);
img2.loadFromMemory(ico2Data, ico2Width, ico2Height, kImageFormatBGR);
img3.loadFromMemory(ico3Data, ico3Width, ico2Height, kImageFormatBGR);
img4.loadFromMemory(ico4Data, ico4Width, ico4Height, kImageFormatBGR);

#ifdef DGL_OPENGL
img5.loadFromMemory(ico5Data, ico5Width, ico5Height, kImageFormatBGR);

// for text
nvg.loadSharedResources();
#endif
}

protected:
void onDisplay() override
{
const GraphicsContext& context(getGraphicsContext());
const int iconSize = bgIcon.getWidth();

Color(0.027f, 0.027f, 0.027f).setFor(context);
Rectangle<uint>(0, 0, getSize()).draw(context);

bgIcon.setY(curPage*iconSize + curPage*3);

Color(0.129f, 0.129f, 0.129f).setFor(context);
bgIcon.draw(context);

Color(0.184f, 0.184f, 0.184f).setFor(context);
bgIcon.drawOutline(context);

if (curHover != curPage && curHover != -1)
{
Rectangle<int> rHover(1, curHover*iconSize + curHover*3, iconSize-2, iconSize-2);

Color(0.071f, 0.071f, 0.071f).setFor(context);
rHover.draw(context);

Color(0.102f, 0.102f, 0.102f).setFor(context);
rHover.drawOutline(context);
}

Color(0.184f, 0.184f, 0.184f).setFor(context);
lineSep.draw(context);

// reset color
Color(1.0f, 1.0f, 1.0f, 1.0f).setFor(context, true);

const int pad = iconSize/2 - DemoArtwork::ico1Width/2;

img1.drawAt(context, pad, pad);
img2.drawAt(context, pad, pad + 3 + iconSize);
img3.drawAt(context, pad, pad + 6 + iconSize*2);
img4.drawAt(context, pad, pad + 9 + iconSize*3);

#ifdef DGL_OPENGL
img5.drawAt(context, pad, pad + 12 + iconSize*4);

// draw some text
nvg.beginFrame(this);

nvg.fontSize(23.0f);
nvg.textAlign(NanoVG::ALIGN_LEFT|NanoVG::ALIGN_TOP);
//nvg.textLineHeight(20.0f);

nvg.fillColor(220,220,220,220);
nvg.textBox(10, 420, iconSize, "Haha,", nullptr);
nvg.textBox(15, 440, iconSize, "Look!", nullptr);

nvg.endFrame();
#endif
}

bool onMouse(const MouseEvent& ev) override
{
if (ev.button != 1 || ! ev.press)
return false;
if (! contains(ev.pos))
return false;

const int iconSize = bgIcon.getWidth();

for (int i=0; i<kPageCount; ++i)
{
bgIcon.setY(i*iconSize + i*3);

if (bgIcon.contains(ev.pos))
{
curPage = i;
callback->curPageChanged(i);
repaint();
break;
}
}

return true;
}

bool onMotion(const MotionEvent& ev) override
{
if (contains(ev.pos))
{
const int iconSize = bgIcon.getWidth();

for (int i=0; i<kPageCount; ++i)
{
bgIcon.setY(i*iconSize + i*3);

if (bgIcon.contains(ev.pos))
{
if (curHover == i)
return true;

curHover = i;
repaint();
return true;
}
}

if (curHover == -1)
return true;

curHover = -1;
repaint();
return true;
}
else
{
if (curHover == -1)
return false;

curHover = -1;
repaint();
return true;
}
}

void onResize(const ResizeEvent& ev) override
{
const uint width = ev.size.getWidth();
const uint height = ev.size.getHeight();

bgIcon.setWidth(width-4);
bgIcon.setHeight(width-4);

lineSep.setStartPos(width, 0);
lineSep.setEndPos(width, height);
}

private:
Callback* const callback;
int curPage, curHover;
Rectangle<double> bgIcon;
Line<int> lineSep;
DemoImage img1, img2, img3, img4, img5;

#ifdef DGL_OPENGL
// for text
NanoVG nvg;
#endif
};

// --------------------------------------------------------------------------------------------------------------------
// Main Demo Window, having a left-side tab-like widget and main area for current widget

class DemoWindow : public StandaloneWindow,
public LeftSideWidget::Callback
{
static const int kSidebarWidth = 81;

public:
#ifdef DGL_CAIRO
static constexpr const char* const kExampleWidgetName = "Demo - Cairo";
#endif
#ifdef DGL_OPENGL
static constexpr const char* const kExampleWidgetName = "Demo - OpenGL";
#endif
#ifdef DGL_VULKAN
static constexpr const char* const kExampleWidgetName = "Demo - Vulkan";
#endif

DemoWindow(Application& app)
: StandaloneWindow(app),
wColor(this),
wImages(this),
wRects(this),
wShapes(this),
#ifdef DGL_OPENGL
wText(this),
#endif
wLeft(this, this),
curWidget(nullptr)
{
wColor.hide();
wImages.hide();
wRects.hide();
wShapes.hide();
#ifdef DGL_OPENGL
wText.hide();
#endif

wColor.setAbsoluteX(kSidebarWidth);
wImages.setAbsoluteX(kSidebarWidth);
wRects.setAbsoluteX(kSidebarWidth);
wShapes.setAbsoluteX(kSidebarWidth);
#ifdef DGL_OPENGL
wText.setAbsoluteX(kSidebarWidth);
#endif
wLeft.setAbsolutePos(2, 2);

curPageChanged(0);
}

protected:
void curPageChanged(int curPage) override
{
if (curWidget != nullptr)
curWidget->hide();

switch (curPage)
{
case 0:
curWidget = &wColor;
break;
case 1:
curWidget = &wImages;
break;
case 2:
curWidget = &wRects;
break;
case 3:
curWidget = &wShapes;
break;
#ifdef DGL_OPENGL
case 4:
curWidget = &wText;
break;
#endif
default:
curWidget = nullptr;
break;
}

if (curWidget != nullptr)
curWidget->show();
}

void onDisplay() override
{
}

void onReshape(uint width, uint height) override
{
StandaloneWindow::onReshape(width, height);

if (width < kSidebarWidth)
return;

Size<uint> size(width-kSidebarWidth, height);
wColor.setSize(size);
wImages.setSize(size);
wRects.setSize(size);
wShapes.setSize(size);
#ifdef DGL_OPENGL
wText.setSize(size);
#endif
wLeft.setSize(kSidebarWidth-4, height-4);
}

private:
ExampleColorSubWidget wColor;
ExampleImagesSubWidget wImages;
ExampleRectanglesSubWidget wRects;
ExampleShapesSubWidget wShapes;
#ifdef DGL_OPENGL
ExampleTextSubWidget wText;
#endif
LeftSideWidget wLeft;

Widget* curWidget;
};

// --------------------------------------------------------------------------------------------------------------------
// Special handy function that runs a StandaloneWindow inside the function scope

template <class ExampleWidgetStandaloneWindow>
void createAndShowExampleWidgetStandaloneWindow(Application& app)
{
ExampleWidgetStandaloneWindow swin(app);
swin.setResizable(true);
swin.setSize(600, 500);
swin.setTitle(ExampleWidgetStandaloneWindow::kExampleWidgetName);
swin.show();
app.exec();
}

// --------------------------------------------------------------------------------------------------------------------

END_NAMESPACE_DGL

int main(int argc, char* argv[])
{
USE_NAMESPACE_DGL;
using DGL_NAMESPACE::Window;

Application app;

if (argc > 1)
{
/**/ if (std::strcmp(argv[1], "color") == 0)
createAndShowExampleWidgetStandaloneWindow<ExampleColorStandaloneWindow>(app);
else if (std::strcmp(argv[1], "images") == 0)
createAndShowExampleWidgetStandaloneWindow<ExampleImagesStandaloneWindow>(app);
else if (std::strcmp(argv[1], "rectangles") == 0)
createAndShowExampleWidgetStandaloneWindow<ExampleRectanglesStandaloneWindow>(app);
else if (std::strcmp(argv[1], "shapes") == 0)
createAndShowExampleWidgetStandaloneWindow<ExampleShapesStandaloneWindow>(app);
#ifdef DGL_OPENGL
else if (std::strcmp(argv[1], "text") == 0)
createAndShowExampleWidgetStandaloneWindow<ExampleTextStandaloneWindow>(app);
#endif
else
d_stderr2("Invalid demo mode, must be one of: color, images, rectangles or shapes");
}
else
{
createAndShowExampleWidgetStandaloneWindow<DemoWindow>(app);
}

return 0;
}

// --------------------------------------------------------------------------------------------------------------------

Loading…
Cancel
Save