@@ -14,8 +14,8 @@ | |||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
*/ | */ | ||||
#ifndef DGL_WIDGETS_HPP_INCLUDED | |||||
#define DGL_WIDGETS_HPP_INCLUDED | |||||
#ifndef DGL_IMAGE_WIDGETS_HPP_INCLUDED | |||||
#define DGL_IMAGE_WIDGETS_HPP_INCLUDED | |||||
#include "Image.hpp" | #include "Image.hpp" | ||||
#include "Widget.hpp" | #include "Widget.hpp" | ||||
@@ -74,11 +74,11 @@ protected: | |||||
bool onMotion(const MotionEvent&) override; | bool onMotion(const MotionEvent&) override; | ||||
private: | private: | ||||
Image fImageNormal; | |||||
Image fImageHover; | |||||
Image fImageDown; | |||||
int fCurButton; | |||||
int fCurState; | |||||
Image fImageNormal; | |||||
Image fImageHover; | |||||
Image fImageDown; | |||||
int fCurButton; | |||||
int fCurState; | |||||
Callback* fCallback; | Callback* fCallback; | ||||
@@ -270,4 +270,4 @@ private: | |||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL | ||||
#endif // DGL_WIDGETS_HPP_INCLUDED | |||||
#endif // DGL_IMAGE_WIDGETS_HPP_INCLUDED |
@@ -21,6 +21,7 @@ OBJS = \ | |||||
src/Image.cpp.o \ | src/Image.cpp.o \ | ||||
src/ImageWidgets.cpp.o \ | src/ImageWidgets.cpp.o \ | ||||
src/NanoVG.cpp.o \ | src/NanoVG.cpp.o \ | ||||
src/NanoWidgets.cpp.o \ | |||||
src/Widget.cpp.o | src/Widget.cpp.o | ||||
ifeq ($(MACOS),true) | ifeq ($(MACOS),true) | ||||
@@ -0,0 +1,70 @@ | |||||
/* | |||||
* DISTRHO Plugin Framework (DPF) | |||||
* Copyright (C) 2012-2015 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. | |||||
*/ | |||||
#ifndef DGL_NANO_WIDGETS_HPP_INCLUDED | |||||
#define DGL_NANO_WIDGETS_HPP_INCLUDED | |||||
#include "NanoVG.hpp" | |||||
#include "../distrho/extra/String.hpp" | |||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
class BlendishButton : public NanoWidget | |||||
{ | |||||
public: | |||||
class Callback | |||||
{ | |||||
public: | |||||
virtual ~Callback() {} | |||||
virtual void blendishButtonClicked(BlendishButton* blendishButton, int button) = 0; | |||||
}; | |||||
explicit BlendishButton(Window& parent, const char* text = "", int iconId = -1) noexcept; | |||||
explicit BlendishButton(NanoWidget* widget, const char* text = "", int iconId = -1) noexcept; | |||||
int getIconId() const noexcept; | |||||
void setIconId(int iconId) noexcept; | |||||
const char* getText() const noexcept; | |||||
void setText(const char* text) noexcept; | |||||
void setCallback(Callback* callback) noexcept; | |||||
protected: | |||||
void onNanoDisplay() override; | |||||
bool onMouse(const MouseEvent&) override; | |||||
bool onMotion(const MotionEvent&) override; | |||||
private: | |||||
int fCurButton; | |||||
int fCurState; | |||||
int fIconId; | |||||
DISTRHO_NAMESPACE::String fText; | |||||
Callback* fCallback; | |||||
void _updateBounds(); | |||||
DISTRHO_LEAK_DETECTOR(BlendishButton) | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | |||||
#endif // DGL_NANO_WIDGETS_HPP_INCLUDED |
@@ -203,12 +203,13 @@ bool ImageButton::onMouse(const MouseEvent& ev) | |||||
DISTRHO_SAFE_ASSERT(fCurState == 2); | DISTRHO_SAFE_ASSERT(fCurState == 2); | ||||
// release button | // release button | ||||
const int button = fCurButton; | |||||
fCurButton = -1; | fCurButton = -1; | ||||
// cursor was moved outside the button bounds, ignore click | // cursor was moved outside the button bounds, ignore click | ||||
if (! contains(ev.pos)) | if (! contains(ev.pos)) | ||||
{ | { | ||||
fCurState = 0; | |||||
fCurState = 0; | |||||
repaint(); | repaint(); | ||||
return true; | return true; | ||||
} | } | ||||
@@ -218,7 +219,7 @@ bool ImageButton::onMouse(const MouseEvent& ev) | |||||
repaint(); | repaint(); | ||||
if (fCallback != nullptr) | if (fCallback != nullptr) | ||||
fCallback->imageButtonClicked(this, fCurButton); | |||||
fCallback->imageButtonClicked(this, button); | |||||
return true; | return true; | ||||
} | } | ||||
@@ -44,10 +44,8 @@ | |||||
// Include NanoVG OpenGL implementation | // Include NanoVG OpenGL implementation | ||||
//#define STB_IMAGE_STATIC | //#define STB_IMAGE_STATIC | ||||
#define BLENDISH_IMPLEMENTATION | |||||
#define NANOVG_GL2_IMPLEMENTATION | #define NANOVG_GL2_IMPLEMENTATION | ||||
#include "nanovg/nanovg_gl.h" | #include "nanovg/nanovg_gl.h" | ||||
#include "oui-blendish/blendish.h" | |||||
#if defined(NANOVG_GL2) | #if defined(NANOVG_GL2) | ||||
# define nvgCreateGL nvgCreateGL2 | # define nvgCreateGL nvgCreateGL2 | ||||
@@ -0,0 +1,194 @@ | |||||
/* | |||||
* DISTRHO Plugin Framework (DPF) | |||||
* Copyright (C) 2012-2015 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 "../NanoWidgets.hpp" | |||||
#define BLENDISH_IMPLEMENTATION | |||||
#include "nanovg/nanovg.h" | |||||
#include "oui-blendish/blendish.h" | |||||
#include "oui-blendish/blendish_resources.h" | |||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
static void registerBlendishResourcesIfNeeded(NVGcontext* const context) | |||||
{ | |||||
if (nvgFindFont(context, "__dpf_blendish__") >= 0) | |||||
return; | |||||
using namespace blendish_resources; | |||||
bndSetFont(nvgCreateFontMem(context, "__dpf_blendish__", (const uchar*)dejavusans_ttf, dejavusans_ttf_size, 0)); | |||||
bndSetIconImage(nvgCreateImageMem(context, 0, (const uchar*)blender_icons16_png, blender_icons16_png_size)); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
BlendishButton::BlendishButton(Window& parent, const char* text, int iconId) noexcept | |||||
: NanoWidget(parent), | |||||
fCurButton(-1), | |||||
fCurState(0), | |||||
fIconId(iconId), | |||||
fText(text), | |||||
fCallback(nullptr), | |||||
leakDetector_BlendishButton() | |||||
{ | |||||
registerBlendishResourcesIfNeeded(getContext()); | |||||
_updateBounds(); | |||||
} | |||||
BlendishButton::BlendishButton(NanoWidget* widget, const char* text, int iconId) noexcept | |||||
: NanoWidget(widget), | |||||
fCurButton(-1), | |||||
fCurState(0), | |||||
fIconId(iconId), | |||||
fText(text), | |||||
fCallback(nullptr), | |||||
leakDetector_BlendishButton() | |||||
{ | |||||
registerBlendishResourcesIfNeeded(getContext()); | |||||
_updateBounds(); | |||||
} | |||||
int BlendishButton::getIconId() const noexcept | |||||
{ | |||||
return fIconId; | |||||
} | |||||
void BlendishButton::setIconId(int iconId) noexcept | |||||
{ | |||||
if (fIconId == iconId) | |||||
return; | |||||
fIconId = iconId; | |||||
_updateBounds(); | |||||
repaint(); | |||||
} | |||||
const char* BlendishButton::getText() const noexcept | |||||
{ | |||||
return fText; | |||||
} | |||||
void BlendishButton::setText(const char* text) noexcept | |||||
{ | |||||
if (fText == text) | |||||
return; | |||||
fText = text; | |||||
_updateBounds(); | |||||
repaint(); | |||||
} | |||||
void BlendishButton::setCallback(Callback* callback) noexcept | |||||
{ | |||||
fCallback = callback; | |||||
} | |||||
void BlendishButton::onNanoDisplay() | |||||
{ | |||||
bndToolButton(getContext(), | |||||
getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), | |||||
0, static_cast<BNDwidgetState>(fCurState), fIconId, fText); | |||||
} | |||||
bool BlendishButton::onMouse(const MouseEvent& ev) | |||||
{ | |||||
// button was released, handle it now | |||||
if (fCurButton != -1 && ! ev.press) | |||||
{ | |||||
DISTRHO_SAFE_ASSERT(fCurState == 2); | |||||
// release button | |||||
const int button = fCurButton; | |||||
fCurButton = -1; | |||||
// cursor was moved outside the button bounds, ignore click | |||||
if (! contains(ev.pos)) | |||||
{ | |||||
fCurState = 0; | |||||
repaint(); | |||||
return true; | |||||
} | |||||
// still on bounds, register click | |||||
fCurState = 1; | |||||
repaint(); | |||||
if (fCallback != nullptr) | |||||
fCallback->blendishButtonClicked(this, button); | |||||
return true; | |||||
} | |||||
// button was pressed, wait for release | |||||
if (ev.press && contains(ev.pos)) | |||||
{ | |||||
fCurButton = ev.button; | |||||
fCurState = 2; | |||||
repaint(); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
bool BlendishButton::onMotion(const MotionEvent& ev) | |||||
{ | |||||
// keep pressed | |||||
if (fCurButton != -1) | |||||
return true; | |||||
if (contains(ev.pos)) | |||||
{ | |||||
// check if entering hover | |||||
if (fCurState == 0) | |||||
{ | |||||
fCurState = 1; | |||||
repaint(); | |||||
return true; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
// check if exiting hover | |||||
if (fCurState == 1) | |||||
{ | |||||
fCurState = 0; | |||||
repaint(); | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
void BlendishButton::_updateBounds() | |||||
{ | |||||
const float width = bndLabelWidth (getContext(), fIconId, fText); | |||||
const float height = bndLabelHeight(getContext(), fIconId, fText, width); | |||||
setSize(width, height); | |||||
} | |||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | |||||
#include "oui-blendish/blendish_resources.cpp" | |||||
// ----------------------------------------------------------------------- |
@@ -97,7 +97,7 @@ int fonsResetAtlas(FONScontext* stash, int width, int height); | |||||
// Add fonts | // Add fonts | ||||
int fonsAddFont(FONScontext* s, const char* name, const char* path); | int fonsAddFont(FONScontext* s, const char* name, const char* path); | ||||
int fonsAddFontMem(FONScontext* s, const char* name, unsigned char* data, int ndata, int freeData); | |||||
int fonsAddFontMem(FONScontext* s, const char* name, const unsigned char* data, int ndata, int freeData); | |||||
int fonsGetFontByName(FONScontext* s, const char* name); | int fonsGetFontByName(FONScontext* s, const char* name); | ||||
// State handling | // State handling | ||||
@@ -161,7 +161,7 @@ int fons__tt_init(FONScontext *context) | |||||
return ftError == 0; | return ftError == 0; | ||||
} | } | ||||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize) | |||||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, const unsigned char *data, int dataSize) | |||||
{ | { | ||||
FT_Error ftError; | FT_Error ftError; | ||||
FONS_NOTUSED(context); | FONS_NOTUSED(context); | ||||
@@ -256,7 +256,7 @@ int fons__tt_init(FONScontext *context) | |||||
return 1; | return 1; | ||||
} | } | ||||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize) | |||||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, const unsigned char *data, int dataSize) | |||||
{ | { | ||||
int stbError; | int stbError; | ||||
FONS_NOTUSED(dataSize); | FONS_NOTUSED(dataSize); | ||||
@@ -361,7 +361,7 @@ struct FONSfont | |||||
{ | { | ||||
FONSttFontImpl font; | FONSttFontImpl font; | ||||
char name[64]; | char name[64]; | ||||
unsigned char* data; | |||||
const unsigned char* data; | |||||
int dataSize; | int dataSize; | ||||
unsigned char freeData; | unsigned char freeData; | ||||
float ascender; | float ascender; | ||||
@@ -818,7 +818,7 @@ static void fons__freeFont(FONSfont* font) | |||||
{ | { | ||||
if (font == NULL) return; | if (font == NULL) return; | ||||
if (font->glyphs) free(font->glyphs); | if (font->glyphs) free(font->glyphs); | ||||
if (font->freeData && font->data) free(font->data); | |||||
if (font->freeData && font->data) free((void*)font->data); | |||||
free(font); | free(font); | ||||
} | } | ||||
@@ -878,7 +878,7 @@ error: | |||||
FONS_NOTUSED(ignore); | FONS_NOTUSED(ignore); | ||||
} | } | ||||
int fonsAddFontMem(FONScontext* stash, const char* name, unsigned char* data, int dataSize, int freeData) | |||||
int fonsAddFontMem(FONScontext* stash, const char* name, const unsigned char* data, int dataSize, int freeData) | |||||
{ | { | ||||
int i, ascent, descent, fh, lineGap; | int i, ascent, descent, fh, lineGap; | ||||
FONSfont* font; | FONSfont* font; | ||||
@@ -719,7 +719,7 @@ int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags) | |||||
return image; | return image; | ||||
} | } | ||||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata) | |||||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, const unsigned char* data, int ndata) | |||||
{ | { | ||||
int w, h, n, image; | int w, h, n, image; | ||||
unsigned char* img = stbi_load_from_memory(data, ndata, &w, &h, &n, 4); | unsigned char* img = stbi_load_from_memory(data, ndata, &w, &h, &n, 4); | ||||
@@ -2159,7 +2159,7 @@ int nvgCreateFont(NVGcontext* ctx, const char* name, const char* path) | |||||
return fonsAddFont(ctx->fs, name, path); | return fonsAddFont(ctx->fs, name, path); | ||||
} | } | ||||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData) | |||||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, const unsigned char* data, int ndata, int freeData) | |||||
{ | { | ||||
return fonsAddFontMem(ctx->fs, name, data, ndata, freeData); | return fonsAddFontMem(ctx->fs, name, data, ndata, freeData); | ||||
} | } | ||||
@@ -317,7 +317,7 @@ int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags); | |||||
// Creates image by loading it from the specified chunk of memory. | // Creates image by loading it from the specified chunk of memory. | ||||
// Returns handle to the image. | // Returns handle to the image. | ||||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata); | |||||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, const unsigned char* data, int ndata); | |||||
// Creates image from specified image data. | // Creates image from specified image data. | ||||
// Returns handle to the image. | // Returns handle to the image. | ||||
@@ -489,7 +489,7 @@ int nvgCreateFont(NVGcontext* ctx, const char* name, const char* filename); | |||||
// Creates image by loading it from the specified memory chunk. | // Creates image by loading it from the specified memory chunk. | ||||
// Returns handle to the font. | // Returns handle to the font. | ||||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData); | |||||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, const unsigned char* data, int ndata, int freeData); | |||||
// Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. | // Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. | ||||
int nvgFindFont(NVGcontext* ctx, const char* name); | int nvgFindFont(NVGcontext* ctx, const char* name); | ||||