| @@ -14,8 +14,8 @@ | |||
| * 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 "Widget.hpp" | |||
| @@ -74,11 +74,11 @@ protected: | |||
| bool onMotion(const MotionEvent&) override; | |||
| private: | |||
| Image fImageNormal; | |||
| Image fImageHover; | |||
| Image fImageDown; | |||
| int fCurButton; | |||
| int fCurState; | |||
| Image fImageNormal; | |||
| Image fImageHover; | |||
| Image fImageDown; | |||
| int fCurButton; | |||
| int fCurState; | |||
| Callback* fCallback; | |||
| @@ -270,4 +270,4 @@ private: | |||
| END_NAMESPACE_DGL | |||
| #endif // DGL_WIDGETS_HPP_INCLUDED | |||
| #endif // DGL_IMAGE_WIDGETS_HPP_INCLUDED | |||
| @@ -21,6 +21,7 @@ OBJS = \ | |||
| src/Image.cpp.o \ | |||
| src/ImageWidgets.cpp.o \ | |||
| src/NanoVG.cpp.o \ | |||
| src/NanoWidgets.cpp.o \ | |||
| src/Widget.cpp.o | |||
| 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); | |||
| // release button | |||
| const int button = fCurButton; | |||
| fCurButton = -1; | |||
| // cursor was moved outside the button bounds, ignore click | |||
| if (! contains(ev.pos)) | |||
| { | |||
| fCurState = 0; | |||
| fCurState = 0; | |||
| repaint(); | |||
| return true; | |||
| } | |||
| @@ -218,7 +219,7 @@ bool ImageButton::onMouse(const MouseEvent& ev) | |||
| repaint(); | |||
| if (fCallback != nullptr) | |||
| fCallback->imageButtonClicked(this, fCurButton); | |||
| fCallback->imageButtonClicked(this, button); | |||
| return true; | |||
| } | |||
| @@ -44,10 +44,8 @@ | |||
| // Include NanoVG OpenGL implementation | |||
| //#define STB_IMAGE_STATIC | |||
| #define BLENDISH_IMPLEMENTATION | |||
| #define NANOVG_GL2_IMPLEMENTATION | |||
| #include "nanovg/nanovg_gl.h" | |||
| #include "oui-blendish/blendish.h" | |||
| #if defined(NANOVG_GL2) | |||
| # 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 | |||
| 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); | |||
| // State handling | |||
| @@ -161,7 +161,7 @@ int fons__tt_init(FONScontext *context) | |||
| 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; | |||
| FONS_NOTUSED(context); | |||
| @@ -256,7 +256,7 @@ int fons__tt_init(FONScontext *context) | |||
| 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; | |||
| FONS_NOTUSED(dataSize); | |||
| @@ -361,7 +361,7 @@ struct FONSfont | |||
| { | |||
| FONSttFontImpl font; | |||
| char name[64]; | |||
| unsigned char* data; | |||
| const unsigned char* data; | |||
| int dataSize; | |||
| unsigned char freeData; | |||
| float ascender; | |||
| @@ -818,7 +818,7 @@ static void fons__freeFont(FONSfont* font) | |||
| { | |||
| if (font == NULL) return; | |||
| 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); | |||
| } | |||
| @@ -878,7 +878,7 @@ error: | |||
| 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; | |||
| FONSfont* font; | |||
| @@ -719,7 +719,7 @@ int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags) | |||
| 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; | |||
| 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); | |||
| } | |||
| 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); | |||
| } | |||
| @@ -317,7 +317,7 @@ int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags); | |||
| // Creates image by loading it from the specified chunk of memory. | |||
| // 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. | |||
| // 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. | |||
| // 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. | |||
| int nvgFindFont(NVGcontext* ctx, const char* name); | |||