Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/SubWidget.hpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/dgl/SubWidget.hpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,185 @@ +/* + * 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_SUBWIDGET_HPP_INCLUDED +#define DGL_SUBWIDGET_HPP_INCLUDED + +#include "Widget.hpp" + +START_NAMESPACE_DGL + +// -------------------------------------------------------------------------------------------------------------------- + +/** + Sub-Widget class. + + This class is the main entry point for creating any reusable widgets from within DGL. + It can be freely positioned from within a parent widget, thus being named subwidget. + + Many subwidgets can share the same parent, and subwidgets themselves can also have its own subwidgets. + It is subwidgets all the way down. + + TODO check absolute vs relative position and see what makes more sense. + + @see CairoSubWidget + */ +class SubWidget : public Widget +{ +public: + /** + Constructor. + */ + explicit SubWidget(Widget* parentWidget); + + /** + Destructor. + */ + ~SubWidget() override; + + /** + Check if this widget contains the point defined by @a x and @a y. + */ + // TODO rename as containsRelativePos + template<typename T> + bool contains(T x, T y) const noexcept; + + /** + Check if this widget contains the point @a pos. + */ + // TODO rename as containsRelativePos + template<typename T> + bool contains(const Point<T>& pos) const noexcept; + + /** + Get absolute X. + */ + int getAbsoluteX() const noexcept; + + /** + Get absolute Y. + */ + int getAbsoluteY() const noexcept; + + /** + Get absolute position. + */ + Point<int> getAbsolutePos() const noexcept; + + /** + Get absolute area of this subwidget. + This is the same as `Rectangle<int>(getAbsolutePos(), getSize());` + @see getConstrainedAbsoluteArea() + */ + Rectangle<int> getAbsoluteArea() const noexcept; + + /** + Get absolute area of this subwidget, with special consideration for not allowing negative values. + @see getAbsoluteArea() + */ + Rectangle<uint> getConstrainedAbsoluteArea() const noexcept; + + /** + Set absolute X. + */ + void setAbsoluteX(int x) noexcept; + + /** + Set absolute Y. + */ + void setAbsoluteY(int y) noexcept; + + /** + Set absolute position using @a x and @a y values. + */ + void setAbsolutePos(int x, int y) noexcept; + + /** + Set absolute position. + */ + void setAbsolutePos(const Point<int>& pos) noexcept; + + /** + Get the margin currently in use for widget coordinates. + By default this value is (0,0). + */ + Point<int> getMargin() const noexcept; + + /** + Set a margin to be used for widget coordinates using @a x and @a y values. + */ + void setMargin(int x, int y) noexcept; + + /** + Set a margin to be used for widget coordinates. + */ + void setMargin(const Point<int>& offset) noexcept; + + /** + Get parent Widget, as passed in the constructor. + */ + Widget* getParentWidget() const noexcept; + + /** + Request repaint of this subwidget's area to the window this widget belongs to. + */ + void repaint() noexcept override; + + /** + Pushes this widget to the "bottom" of the parent widget. + Makes the widget behave as if it was the first to be registered on the parent widget, thus being "on bottom". + */ + virtual void toBottom(); + + /** + Bring this widget to the "front" of the parent widget. + Makes the widget behave as if it was the last to be registered on the parent widget, thus being "in front". + */ + virtual void toFront(); + + /** + Indicate that this subwidget will draw out of bounds, and thus needs the entire viewport available for drawing. + */ + void setNeedsFullViewportDrawing(bool needsFullViewportForDrawing = true); + + /** + Indicate that this subwidget will always draw at its own internal size and needs scaling to fit target size. + */ + void setNeedsViewportScaling(bool needsViewportScaling = true, double autoScaleFactor = 0.0); + + /** + Indicate that this subwidget should not be drawn on screen, typically because it is managed by something else. + */ + void setSkipDrawing(bool skipDrawing = true); + +protected: + /** + A function called when the subwidget's absolute position is changed. + */ + virtual void onPositionChanged(const PositionChangedEvent&); + +private: + struct PrivateData; + PrivateData* const pData; + friend class Widget; + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SubWidget) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_SUBWIDGET_HPP_INCLUDED +