@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
@@ -168,6 +168,21 @@ private: | |||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
class SliderEventHandler | |||||
{ | |||||
public: | |||||
explicit SliderEventHandler(SubWidget* self); | |||||
virtual ~SliderEventHandler(); | |||||
private: | |||||
struct PrivateData; | |||||
PrivateData* const pData; | |||||
DISTRHO_LEAK_DETECTOR(SliderEventHandler) | |||||
}; | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | END_NAMESPACE_DGL | ||||
#endif // DGL_EVENT_HANDLERS_HPP_INCLUDED | #endif // DGL_EVENT_HANDLERS_HPP_INCLUDED | ||||
@@ -0,0 +1,64 @@ | |||||
/* | |||||
* 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. | |||||
*/ | |||||
#ifndef DGL_LAYOUT_HPP_INCLUDED | |||||
#define DGL_LAYOUT_HPP_INCLUDED | |||||
#include "Base.hpp" | |||||
#include <list> | |||||
START_NAMESPACE_DGL | |||||
class SubWidget; | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
// NOTE: under development, API to be finalized and documented soon | |||||
enum SizeHint { | |||||
Expanding, | |||||
Fixed | |||||
}; | |||||
struct SubWidgetWithSizeHint { | |||||
SubWidget* widget; | |||||
SizeHint sizeHint; | |||||
}; | |||||
template<bool horizontal> | |||||
struct Layout | |||||
{ | |||||
std::list<SubWidgetWithSizeHint> widgets; | |||||
uint setAbsolutePos(int x, int y, uint padding); | |||||
void setSize(uint size, uint padding); | |||||
}; | |||||
typedef Layout<true> HorizontalLayout; | |||||
typedef Layout<false> VerticalLayout; | |||||
struct VerticallyStackedHorizontalLayout | |||||
{ | |||||
std::list<HorizontalLayout*> items; | |||||
void setAbsolutePos(int x, int y, uint padding); | |||||
void setWidth(uint width, uint padding); | |||||
}; | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | |||||
#endif // DGL_LAYOUT_HPP_INCLUDED |
@@ -34,6 +34,7 @@ OBJS_common = \ | |||||
../build/dgl/Geometry.cpp.o \ | ../build/dgl/Geometry.cpp.o \ | ||||
../build/dgl/ImageBase.cpp.o \ | ../build/dgl/ImageBase.cpp.o \ | ||||
../build/dgl/ImageBaseWidgets.cpp.o \ | ../build/dgl/ImageBaseWidgets.cpp.o \ | ||||
../build/dgl/Layout.cpp.o \ | |||||
../build/dgl/Resources.cpp.o \ | ../build/dgl/Resources.cpp.o \ | ||||
../build/dgl/SubWidget.cpp.o \ | ../build/dgl/SubWidget.cpp.o \ | ||||
../build/dgl/SubWidgetPrivateData.cpp.o \ | ../build/dgl/SubWidgetPrivateData.cpp.o \ | ||||
@@ -0,0 +1,89 @@ | |||||
/* | |||||
* DISTRHO Plugin Framework (DPF) | |||||
* Copyright (C) 2012-2022 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 "../Layout.hpp" | |||||
#include "../SubWidget.hpp" | |||||
START_NAMESPACE_DGL | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
template<> // horizontal | |||||
uint Layout<true>::setAbsolutePos(int x, const int y, const uint padding) | |||||
{ | |||||
uint maxHeight = 0; | |||||
for (SubWidgetWithSizeHint& s : widgets) | |||||
{ | |||||
maxHeight = std::max(maxHeight, s.widget->getHeight()); | |||||
s.widget->setAbsolutePos(x, y); | |||||
x += s.widget->getWidth(); | |||||
x += padding; | |||||
} | |||||
return maxHeight; | |||||
} | |||||
template<> // horizontal | |||||
void Layout<true>::setSize(const uint width, const uint padding) | |||||
{ | |||||
uint maxHeight = 0; | |||||
uint nonFixedWidth = width; | |||||
uint numDynamiclySizedWidgets = 0; | |||||
for (SubWidgetWithSizeHint& s : widgets) | |||||
{ | |||||
maxHeight = std::max(maxHeight, s.widget->getHeight()); | |||||
if (s.sizeHint == Fixed) | |||||
nonFixedWidth -= s.widget->getWidth(); | |||||
else | |||||
++numDynamiclySizedWidgets; | |||||
} | |||||
const uint widthPerWidget = numDynamiclySizedWidgets != 0 | |||||
? (nonFixedWidth - padding * numDynamiclySizedWidgets) / numDynamiclySizedWidgets | |||||
: 0; | |||||
for (SubWidgetWithSizeHint& s : widgets) | |||||
{ | |||||
if (s.sizeHint != Fixed) | |||||
s.widget->setSize(widthPerWidget, maxHeight); | |||||
else | |||||
s.widget->setHeight(maxHeight); | |||||
} | |||||
} | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
void VerticallyStackedHorizontalLayout::setAbsolutePos(const int x, int y, const uint padding) | |||||
{ | |||||
for (HorizontalLayout* l : items) | |||||
{ | |||||
y += l->setAbsolutePos(x, y, padding); | |||||
y += padding; | |||||
} | |||||
} | |||||
void VerticallyStackedHorizontalLayout::setWidth(const uint width, const uint padding) | |||||
{ | |||||
for (HorizontalLayout* l : items) | |||||
l->setSize(width, padding); | |||||
} | |||||
// -------------------------------------------------------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL |