Browse Source

More work for distrho GL UI

tags/1.9.4
falkTX 12 years ago
parent
commit
07a09bbf38
6 changed files with 220 additions and 78 deletions
  1. +6
    -4
      source/libs/distrho/dgl/Image.hpp
  2. +24
    -11
      source/libs/distrho/dgl/Widget.hpp
  3. +6
    -0
      source/libs/distrho/dgl/Window.hpp
  4. +101
    -0
      source/libs/distrho/dgl/src/Image.cpp
  5. +19
    -37
      source/libs/distrho/dgl/src/Widget.cpp
  6. +64
    -26
      source/libs/distrho/dgl/src/Window.cpp

+ 6
- 4
source/libs/distrho/dgl/Image.hpp View File

@@ -27,10 +27,10 @@ class Image
{
public:
Image();
Image(const char* data, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE);
Image(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE);
Image(const Image& image);

void loadFromMemory(const char* data, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE);
void loadFromMemory(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE);

bool isValid() const;

@@ -38,12 +38,14 @@ public:
int getHeight() const;
const Size<int>& getSize() const;

const char* getData() const;
const char* getRawData() const;
GLenum getFormat() const;
GLenum getType() const;

Image& operator=(const Image& image);

private:
const char* fData;
const char* fRawData;
Size<int> fSize;
GLenum fFormat;
GLenum fType;


+ 24
- 11
source/libs/distrho/dgl/Widget.hpp View File

@@ -28,22 +28,35 @@ class Window;
class Widget
{
public:
Widget(Window* parent = nullptr);
Widget(Window* parent);
virtual ~Widget();

bool isVisible();
void setVisible(bool yesNo);

void show()
{
setVisible(true);
}

void hide()
{
setVisible(false);
}

protected:
void onDisplay();
void onKeyboard(bool press, uint32_t key);
void onMouse(int button, bool press, int x, int y);
void onMotion(int x, int y);
void onScroll(float dx, float dy);
void onSpecial(bool press, Key key);
void onReshape(int width, int height);
void onClose();
virtual void onDisplay();
virtual void onKeyboard(bool press, uint32_t key);
virtual void onMouse(int button, bool press, int x, int y);
virtual void onMotion(int x, int y);
virtual void onScroll(float dx, float dy);
virtual void onSpecial(bool press, Key key);
virtual void onReshape(int width, int height);
virtual void onClose();

private:
class Private;
Private* const kPrivate;
Window* fParent;
bool fVisible;
friend class Window;
};



+ 6
- 0
source/libs/distrho/dgl/Window.hpp View File

@@ -24,6 +24,7 @@ START_NAMESPACE_DISTRHO
// -------------------------------------------------

class App;
class Widget;

class Window
{
@@ -39,10 +40,15 @@ public:

bool isVisible();
void setVisible(bool yesNo);
void setResizable(bool yesNo);
void setSize(unsigned int width, unsigned int height);
void setWindowTitle(const char* title);

intptr_t getWindowId();

void addWidget(Widget* widget);
void removeWidget(Widget* widget);

void show()
{
setVisible(true);


+ 101
- 0
source/libs/distrho/dgl/src/Image.cpp View File

@@ -0,0 +1,101 @@
/*
* DISTRHO Plugin Toolkit (DPT)
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* For a full copy of the license see the LGPL.txt file
*/

#include "../Image.hpp"

START_NAMESPACE_DISTRHO

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

Image::Image()
: fRawData(nullptr),
fSize(0, 0),
fFormat(0),
fType(0)
{
}

Image::Image(const char* rawData, const Size<int>& size, GLenum format, GLenum type)
: fRawData(rawData),
fSize(size),
fFormat(format),
fType(type)
{
}

Image::Image(const Image& image)
: fRawData(image.fRawData),
fSize(image.fSize),
fFormat(image.fFormat),
fType(image.fType)
{
}

void Image::loadFromMemory(const char* rawData, const Size<int>& size, GLenum format, GLenum type)
{
fRawData = rawData;
fSize = size;
fFormat = format;
fType = type;
}

bool Image::isValid() const
{
return (fRawData != nullptr && getWidth() > 0 && getHeight() > 0);
}

int Image::getWidth() const
{
return fSize.getWidth();
}

int Image::getHeight() const
{
return fSize.getHeight();
}

const Size<int>& Image::getSize() const
{
return fSize;
}

const char* Image::getRawData() const
{
return fRawData;
}

GLenum Image::getFormat() const
{
return fFormat;
}

GLenum Image::getType() const
{
return fType;
}

Image& Image::operator=(const Image& image)
{
fRawData = image.fRawData;
fSize = image.fSize;
fFormat = image.fFormat;
fType = image.fType;
return *this;
}

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

END_NAMESPACE_DISTRHO

+ 19
- 37
source/libs/distrho/dgl/src/Widget.cpp View File

@@ -18,58 +18,40 @@
#include "../Widget.hpp"
#include "../Window.hpp"

START_NAMESPACE_DISTRHO

// -------------------------------------------------
// Window Private
#include <cstdio>

class Widget::Private
{
public:
Private(Window* parent)
: fApp(nullptr),
fWindow(nullptr)
{
if (parent == nullptr)
{
fApp = new App;
fWindow = new Window(fApp);
}
}

~Private()
{
if (fWindow != nullptr)
delete fWindow;
if (fApp != nullptr)
delete fApp;
}

private:
App* fApp;
Window* fWindow;
};
START_NAMESPACE_DISTRHO

// -------------------------------------------------
// Widget

Widget::Widget(Window* parent)
: kPrivate(new Private(parent))
: fParent(parent),
fVisible(true)
{
parent->addWidget(this);
}

Widget::~Widget()
{
}

void Widget::onDisplay()
bool Widget::isVisible()
{
//if (fParent == nullptr)
// glColor3f(0.0f, 1.0f, 0.0f);
//else
glColor3f(0.0f, 0.0f, 1.0f);
glRectf(-0.75f, 0.75f, 0.75f, -0.75f);
return fVisible;
}

void Widget::setVisible(bool yesNo)
{
if (yesNo == fVisible)
return;

fVisible = yesNo;
fParent->repaint();
}

void Widget::onDisplay()
{
}

void Widget::onKeyboard(bool, uint32_t)


+ 64
- 26
source/libs/distrho/dgl/src/Window.cpp View File

@@ -58,7 +58,7 @@ public:
Private(Window* self, App::Private* app, Private* parent, intptr_t parentId = 0)
: kApp(app),
kSelf(self),
kView(puglCreate(parentId, "test", 300, 100, false, false)),
kView(puglCreate(parentId, "Window", 600, 500, false, false)),
fParent(parent),
fChildFocus(nullptr),
fVisible(false),
@@ -75,6 +75,12 @@ public:
if (kView == nullptr)
return;

// we can't have both
if (parent != nullptr)
{
assert(parentId != 0);
}

puglSetHandle(kView, this);
puglSetDisplayFunc(kView, onDisplayCallback);
puglSetKeyboardFunc(kView, onKeyboardCallback);
@@ -85,21 +91,13 @@ public:
puglSetReshapeFunc(kView, onReshapeCallback);
puglSetCloseFunc(kView, onCloseCallback);

#if DISTRHO_OS_LINUX
PuglInternals* impl = kView->impl;

#if DISTRHO_OS_WINDOWS
//hwnd = impl->hwnd;

if (parent != nullptr)
{
//PuglInternals* parentImpl = parent->kView->impl;
//SetParent(parentImpl->hwnd, hwnd);
}
#elif DISTRHO_OS_LINUX
xDisplay = impl->display;
xWindow = impl->win;

if (parent != nullptr)
if (parent != nullptr && parentId == 0)
{
PuglInternals* parentImpl = parent->kView->impl;
bool parentWasVisible = parent->isVisible();
@@ -232,18 +230,10 @@ public:

UpdateWindow(hwnd);
#elif DISTRHO_OS_LINUX
XEvent event;

if (yesNo)
{
XMapRaised(xDisplay, xWindow);
XIfEvent(xDisplay, &event, &isMapNotify, (XPointer)&xWindow);
}
else
{
XUnmapWindow(xDisplay, xWindow);
XIfEvent(xDisplay, &event, &isUnmapNotify, (XPointer)&xWindow);
}

XFlush(xDisplay);
#endif
@@ -254,6 +244,24 @@ public:
kApp->oneHidden();
}

void setSize(unsigned int width, unsigned int height)
{
#if DISTRHO_OS_LINUX
XSizeHints sizeHints;
memset(&sizeHints, 0, sizeof(sizeHints));

sizeHints.flags = PMinSize|PMaxSize;
sizeHints.min_width = width;
sizeHints.min_height = height;
sizeHints.max_width = width;
sizeHints.max_height = height;
XSetNormalHints(xDisplay, xWindow, &sizeHints);
XFlush(xDisplay);
#endif

repaint();
}

void setWindowTitle(const char* title)
{
#if DISTRHO_OS_WINDOWS
@@ -269,6 +277,16 @@ public:
return puglGetNativeWindow(kView);
}

void addWidget(Widget* widget)
{
fWidgets.push_back(widget);
}

void removeWidget(Widget* widget)
{
fWidgets.remove(widget);
}

protected:
void onDisplay()
{
@@ -277,7 +295,8 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onDisplay();
if (widget->isVisible())
widget->onDisplay();
}
}

@@ -289,7 +308,8 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onKeyboard(press, key);
if (widget->isVisible())
widget->onKeyboard(press, key);
}
}

@@ -301,7 +321,8 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onMouse(button, press, x, y);
if (widget->isVisible())
widget->onMouse(button, press, x, y);
}
}

@@ -313,7 +334,8 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onMotion(x, y);
if (widget->isVisible())
widget->onMotion(x, y);
}
}

@@ -325,7 +347,8 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onScroll(dx, dy);
if (widget->isVisible())
widget->onScroll(dx, dy);
}
}

@@ -337,13 +360,13 @@ protected:
FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
widget->onSpecial(press, key);
if (widget->isVisible())
widget->onSpecial(press, key);
}
}

void onReshape(int width, int height)
{

FOR_EACH_WIDGET(it)
{
Widget* widget = *it;
@@ -482,6 +505,11 @@ void Window::setVisible(bool yesNo)
kPrivate->setVisible(yesNo);
}

void Window::setSize(unsigned int width, unsigned int height)
{
kPrivate->setSize(width, height);
}

void Window::setWindowTitle(const char* title)
{
kPrivate->setWindowTitle(title);
@@ -492,6 +520,16 @@ intptr_t Window::getWindowId()
return kPrivate->getWindowId();
}

void Window::addWidget(Widget* widget)
{
kPrivate->addWidget(widget);
}

void Window::removeWidget(Widget* widget)
{
kPrivate->removeWidget(widget);
}

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

END_NAMESPACE_DISTRHO

Loading…
Cancel
Save