Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/src/WidgetPrivateData.cpp @ 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/src/WidgetPrivateData.cpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,232 @@ +/* + * 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 "WidgetPrivateData.hpp" +#include "SubWidgetPrivateData.hpp" +#include "../TopLevelWidget.hpp" + +START_NAMESPACE_DGL + +#define FOR_EACH_SUBWIDGET(it) \ + for (std::list<SubWidget*>::iterator it = subWidgets.begin(); it != subWidgets.end(); ++it) + +#define FOR_EACH_SUBWIDGET_INV(rit) \ + for (std::list<SubWidget*>::reverse_iterator rit = subWidgets.rbegin(); rit != subWidgets.rend(); ++rit) + +// ----------------------------------------------------------------------- + +Widget::PrivateData::PrivateData(Widget* const s, TopLevelWidget* const tlw) + : self(s), + topLevelWidget(tlw), + parentWidget(nullptr), + id(0), + name(nullptr), + needsScaling(false), + visible(true), + size(0, 0), + subWidgets() {} + +Widget::PrivateData::PrivateData(Widget* const s, Widget* const pw) + : self(s), + topLevelWidget(findTopLevelWidget(pw)), + parentWidget(pw), + id(0), + name(nullptr), + needsScaling(false), + visible(true), + size(0, 0), + subWidgets() {} + +Widget::PrivateData::~PrivateData() +{ + subWidgets.clear(); + std::free(name); +} + +void Widget::PrivateData::displaySubWidgets(const uint width, const uint height, const double autoScaleFactor) +{ + if (subWidgets.size() == 0) + return; + + for (std::list<SubWidget*>::iterator it = subWidgets.begin(); it != subWidgets.end(); ++it) + { + SubWidget* const subwidget(*it); + + if (subwidget->isVisible()) + subwidget->pData->display(width, height, autoScaleFactor); + } +} + +// ----------------------------------------------------------------------- + +bool Widget::PrivateData::giveKeyboardEventForSubWidgets(const KeyboardEvent& ev) +{ + if (! visible) + return false; + if (subWidgets.size() == 0) + return false; + + FOR_EACH_SUBWIDGET_INV(rit) + { + SubWidget* const widget(*rit); + + if (widget->isVisible() && widget->onKeyboard(ev)) + return true; + } + + return false; +} + +bool Widget::PrivateData::giveCharacterInputEventForSubWidgets(const CharacterInputEvent& ev) +{ + if (! visible) + return false; + if (subWidgets.size() == 0) + return false; + + FOR_EACH_SUBWIDGET_INV(rit) + { + SubWidget* const widget(*rit); + + if (widget->isVisible() && widget->onCharacterInput(ev)) + return true; + } + + return false; +} + +bool Widget::PrivateData::giveMouseEventForSubWidgets(MouseEvent& ev) +{ + if (! visible) + return false; + if (subWidgets.size() == 0) + return false; + + const double x = ev.absolutePos.getX(); + const double y = ev.absolutePos.getY(); + + if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self)) + { + if (selfw->pData->needsViewportScaling) + { + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); + } + } + + FOR_EACH_SUBWIDGET_INV(rit) + { + SubWidget* const widget(*rit); + + if (! widget->isVisible()) + continue; + + ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), + y - widget->getAbsoluteY() + widget->getMargin().getY()); + + if (widget->onMouse(ev)) + return true; + } + + return false; +} + +bool Widget::PrivateData::giveMotionEventForSubWidgets(MotionEvent& ev) +{ + if (! visible) + return false; + if (subWidgets.size() == 0) + return false; + + const double x = ev.absolutePos.getX(); + const double y = ev.absolutePos.getY(); + + if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self)) + { + if (selfw->pData->needsViewportScaling) + { + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); + } + } + + FOR_EACH_SUBWIDGET_INV(rit) + { + SubWidget* const widget(*rit); + + if (! widget->isVisible()) + continue; + + ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), + y - widget->getAbsoluteY() + widget->getMargin().getY()); + + if (widget->onMotion(ev)) + return true; + } + + return false; +} + +bool Widget::PrivateData::giveScrollEventForSubWidgets(ScrollEvent& ev) +{ + if (! visible) + return false; + if (subWidgets.size() == 0) + return false; + + const double x = ev.absolutePos.getX(); + const double y = ev.absolutePos.getY(); + + if (SubWidget* const selfw = dynamic_cast<SubWidget*>(self)) + { + if (selfw->pData->needsViewportScaling) + { + ev.absolutePos.setX(x - selfw->getAbsoluteX() + selfw->getMargin().getX()); + ev.absolutePos.setY(y - selfw->getAbsoluteY() + selfw->getMargin().getY()); + } + } + + FOR_EACH_SUBWIDGET_INV(rit) + { + SubWidget* const widget(*rit); + + if (! widget->isVisible()) + continue; + + ev.pos = Point<double>(x - widget->getAbsoluteX() + widget->getMargin().getX(), + y - widget->getAbsoluteY() + widget->getMargin().getY()); + + if (widget->onScroll(ev)) + return true; + } + + return false; +} + +// ----------------------------------------------------------------------- + +TopLevelWidget* Widget::PrivateData::findTopLevelWidget(Widget* const pw) +{ + if (pw->pData->topLevelWidget != nullptr) + return pw->pData->topLevelWidget; + if (pw->pData->parentWidget != nullptr) + return findTopLevelWidget(pw->pData->parentWidget); + return nullptr; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL