commit bd92cf20616f59a6e55c6204b35a284e61e9bb12
parent c494e265cf7dafb2ebf8109c3c337157049bab97
Author: falkTX <falktx@falktx.com>
Date: Thu, 18 Aug 2022 03:42:52 +0100
Start of layout related classes, WIP
Diffstat:
4 files changed, 170 insertions(+), 1 deletion(-)
diff --git a/dgl/EventHandlers.hpp b/dgl/EventHandlers.hpp
@@ -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
diff --git a/dgl/Layout.hpp b/dgl/Layout.hpp
@@ -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
diff --git 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
@@ -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