90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
#include "ReservedArea.hpp"
|
|
#include "../../macros.hpp"
|
|
|
|
using namespace Desktop;
|
|
|
|
// fuck me. Writing this at 11pm, and I have an in-class test tomorrow.
|
|
// I am failing that bitch
|
|
|
|
CReservedArea::CReservedArea(const Vector2D& tl, const Vector2D& br) : m_initialTopLeft(tl.clamp({0, 0})), m_initialBottomRight(br.clamp({0, 0})) {
|
|
calculate();
|
|
}
|
|
|
|
CReservedArea::CReservedArea(double top, double right, double bottom, double left) :
|
|
m_initialTopLeft(std::max(left, 0.0), std::max(top, 0.0)), m_initialBottomRight(std::max(right, 0.0), std::max(bottom, 0.0)) {
|
|
calculate();
|
|
}
|
|
|
|
CReservedArea::CReservedArea(const CBox& parent, const CBox& child) {
|
|
ASSERT(!parent.empty() && !child.empty());
|
|
|
|
ASSERT(parent.containsPoint(child.pos() + Vector2D{0.0001, 0.0001}));
|
|
ASSERT(parent.containsPoint(child.pos() + child.size() - Vector2D{0.0001, 0.0001}));
|
|
|
|
m_initialTopLeft = child.pos() - parent.pos();
|
|
m_initialBottomRight = (parent.pos() + parent.size()) - (child.pos() + child.size());
|
|
|
|
calculate();
|
|
}
|
|
|
|
void CReservedArea::calculate() {
|
|
m_bottomRight = m_initialBottomRight;
|
|
m_topLeft = m_initialTopLeft;
|
|
|
|
for (const auto& e : m_dynamicReserved) {
|
|
m_bottomRight += e.bottomRight;
|
|
m_topLeft += e.topLeft;
|
|
}
|
|
}
|
|
|
|
CBox CReservedArea::apply(const CBox& other) const {
|
|
auto c = other.copy();
|
|
c.x += m_topLeft.x;
|
|
c.y += m_topLeft.y;
|
|
c.w -= m_topLeft.x + m_bottomRight.x;
|
|
c.h -= m_topLeft.y + m_bottomRight.y;
|
|
return c;
|
|
}
|
|
|
|
void CReservedArea::applyip(CBox& other) const {
|
|
other.x += m_topLeft.x;
|
|
other.y += m_topLeft.y;
|
|
other.w -= m_topLeft.x + m_bottomRight.x;
|
|
other.h -= m_topLeft.y + m_bottomRight.y;
|
|
}
|
|
|
|
bool CReservedArea::operator==(const CReservedArea& other) const {
|
|
return other.m_bottomRight == m_bottomRight && other.m_topLeft == m_topLeft;
|
|
}
|
|
|
|
double CReservedArea::left() const {
|
|
return m_topLeft.x;
|
|
}
|
|
|
|
double CReservedArea::right() const {
|
|
return m_bottomRight.x;
|
|
}
|
|
|
|
double CReservedArea::top() const {
|
|
return m_topLeft.y;
|
|
}
|
|
|
|
double CReservedArea::bottom() const {
|
|
return m_bottomRight.y;
|
|
}
|
|
|
|
void CReservedArea::resetType(eReservedDynamicType t) {
|
|
m_dynamicReserved[t] = {};
|
|
calculate();
|
|
}
|
|
|
|
void CReservedArea::addType(eReservedDynamicType t, const Vector2D& topLeft, const Vector2D& bottomRight) {
|
|
auto& ref = m_dynamicReserved[t];
|
|
ref.topLeft += topLeft;
|
|
ref.bottomRight += bottomRight;
|
|
calculate();
|
|
}
|
|
|
|
void CReservedArea::addType(eReservedDynamicType t, const CReservedArea& area) {
|
|
addType(t, {area.left(), area.top()}, {area.right(), area.bottom()});
|
|
}
|