diff --git a/dgl/EventHandlers.hpp b/dgl/EventHandlers.hpp index a460440e..8d553b65 100644 --- a/dgl/EventHandlers.hpp +++ b/dgl/EventHandlers.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2021 Filipe Coelho + * Copyright (C) 2012-2022 Filipe Coelho * * 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 diff --git a/dgl/Layout.hpp b/dgl/Layout.hpp new file mode 100644 index 00000000..6a0a964a --- /dev/null +++ b/dgl/Layout.hpp @@ -0,0 +1,64 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2021 Filipe Coelho + * + * 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 + +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 +struct Layout +{ + std::list widgets; + uint setAbsolutePos(int x, int y, uint padding); + void setSize(uint size, uint padding); +}; + +typedef Layout HorizontalLayout; +typedef Layout VerticalLayout; + +struct VerticallyStackedHorizontalLayout +{ + std::list items; + void setAbsolutePos(int x, int y, uint padding); + void setWidth(uint width, uint padding); +}; + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_LAYOUT_HPP_INCLUDED diff --git a/dgl/Makefile b/dgl/Makefile index be92632c..c756bf0d 100644 --- a/dgl/Makefile +++ b/dgl/Makefile @@ -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 \ diff --git a/dgl/src/Layout.cpp b/dgl/src/Layout.cpp new file mode 100644 index 00000000..e924c648 --- /dev/null +++ b/dgl/src/Layout.cpp @@ -0,0 +1,89 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2022 Filipe Coelho + * + * 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::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::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