@@ -1,6 +1,6 @@ | |||
/* | |||
* 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 | |||
* 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 | |||
#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/ImageBase.cpp.o \ | |||
../build/dgl/ImageBaseWidgets.cpp.o \ | |||
../build/dgl/Layout.cpp.o \ | |||
../build/dgl/Resources.cpp.o \ | |||
../build/dgl/SubWidget.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 |