78 lines
1.6 KiB
C++
78 lines
1.6 KiB
C++
#include "FloatingWidget.hpp"
|
|
|
|
using namespace tp;
|
|
|
|
void FloatingWidget::process(const EventHandler& events) {
|
|
const auto relativePointer = events.getPointer();
|
|
|
|
bool inside = getRelativeAreaT().isInside(relativePointer);
|
|
|
|
if (inside && events.isPressed(InputID::MOUSE1)) {
|
|
mPointerStart = relativePointer;
|
|
mIsFloating = true;
|
|
|
|
if (resizeHandleRect().isInside(relativePointer)) {
|
|
mIsResizing = true;
|
|
}
|
|
|
|
bringToFront();
|
|
}
|
|
|
|
|
|
if (mIsFloating && events.isReleased(InputID::MOUSE1)) {
|
|
mIsFloating = false;
|
|
mIsResizing = false;
|
|
}
|
|
|
|
mPointerCurrent = relativePointer;
|
|
|
|
// triggerWidgetUpdate();
|
|
}
|
|
|
|
void FloatingWidget::pickRect() {
|
|
if (mIsFloating) {
|
|
auto area = getAreaCache();
|
|
|
|
if (mIsResizing) {
|
|
mPointerCurrent.clamp(mMinSize, mMaxSize);
|
|
|
|
area.size = mPointerCurrent + mHandleSize / 2.f;
|
|
|
|
for (auto child : mChildren) {
|
|
child->triggerWidgetUpdate("floating menu resized");
|
|
}
|
|
|
|
} else if (mIsFloating) {
|
|
area.pos += mPointerCurrent - mPointerStart;
|
|
}
|
|
|
|
setAreaCache(area);
|
|
}
|
|
|
|
clampMinMaxSize();
|
|
}
|
|
|
|
void FloatingWidget::draw(Canvas& canvas) {
|
|
canvas.rect(resizeHandleRect(), RGBA(0.7f), 2);
|
|
canvas.rect(getRelativeArea(), RGBA(0.5f), 10);
|
|
}
|
|
|
|
RectF FloatingWidget::resizeHandleRect() {
|
|
auto area = getRelativeArea();
|
|
area.pos = area.p3() - mHandleSize;
|
|
area.size = mHandleSize;
|
|
area.shrink(mHandlePadding);
|
|
return area;
|
|
}
|
|
|
|
bool FloatingWidget::propagateEventsToChildren() const {
|
|
return !mIsFloating;
|
|
}
|
|
|
|
bool FloatingWidget::isFloating() const {
|
|
return mIsFloating;
|
|
}
|
|
|
|
bool FloatingWidget::needsNextFrame() const {
|
|
return Widget::needsNextFrame() || isFloating();
|
|
}
|