Skip to content

Commit

Permalink
math: add Edges (#10)
Browse files Browse the repository at this point in the history
  • Loading branch information
outfoxxed authored Jul 27, 2024
1 parent 962582a commit a950624
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 1 deletion.
8 changes: 7 additions & 1 deletion include/hyprutils/math/Box.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,12 @@ namespace Hyprutils::Math {
*/
Vector2D size() const;

/**
* @brief Retrieves the size of the box offset by its position.
* @return Vector2D representing the bottom right extent of the box.
*/
Vector2D extent() const;

/**
* @brief Finds the closest point within the box to a given vector.
* @param vec Vector from which to find the closest point.
Expand Down Expand Up @@ -179,4 +185,4 @@ namespace Hyprutils::Math {
private:
CBox roundInternal();
};
}
}
110 changes: 110 additions & 0 deletions include/hyprutils/math/Edges.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#pragma once
#include <cstdint>

namespace Hyprutils::Math {

/**
* @brief Flag set of box edges
*/
class CEdges {
public:
enum eEdges : uint8_t {
NONE = 0,
TOP = 1,
LEFT = 2,
BOTTOM = 4,
RIGHT = 8,
};

CEdges() = default;
CEdges(eEdges edges) : m_edges(edges) {}
CEdges(uint8_t edges) : m_edges(static_cast<eEdges>(edges)) {}

bool operator==(const CEdges& other) {
return m_edges == other.m_edges;
}

CEdges operator|(const CEdges& other) {
return m_edges | other.m_edges;
}

CEdges operator&(const CEdges& other) {
return m_edges & other.m_edges;
}

CEdges operator^(const CEdges& other) {
return m_edges ^ other.m_edges;
}

void operator|=(const CEdges& other) {
m_edges = (*this | other).m_edges;
}

void operator&=(const CEdges& other) {
m_edges = (*this & other).m_edges;
}

void operator^=(const CEdges& other) {
m_edges = (*this ^ other).m_edges;
}

/**
* @return if the edge set contains the top edge.
*/
bool top() {
return m_edges & TOP;
}

/**
* @return if the edge set contains the left edge.
*/
bool left() {
return m_edges & LEFT;
}

/**
* @return if the edge set contains the bottom edge.
*/
bool bottom() {
return m_edges & BOTTOM;
}

/**
* @return if the edge set contains the right edge.
*/
bool right() {
return m_edges & RIGHT;
}

/**
* @param top The state the top edge should be set to.
*/
void setTop(bool top) {
m_edges = static_cast<eEdges>((m_edges & ~TOP) | (TOP * top));
}

/**
* @param left The state the left edge should be set to.
*/
void setLeft(bool left) {
m_edges = static_cast<eEdges>((m_edges & ~LEFT) | (LEFT * left));
}

/**
* @param bottom The state the bottom edge should be set to.
*/
void setBottom(bool bottom) {
m_edges = static_cast<eEdges>((m_edges & ~BOTTOM) | (BOTTOM * bottom));
}

/**
* @param right The state the right edge should be set to.
*/
void setRight(bool right) {
m_edges = static_cast<eEdges>((m_edges & ~RIGHT) | (RIGHT * right));
}

eEdges m_edges = NONE;
};

}
4 changes: 4 additions & 0 deletions src/math/Box.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ Vector2D Hyprutils::Math::CBox::size() const {
return {w, h};
}

Vector2D Hyprutils::Math::CBox::extent() const {
return pos() + size();
}

Vector2D Hyprutils::Math::CBox::closestPoint(const Vector2D& vec) const {
if (containsPoint(vec))
return vec;
Expand Down

0 comments on commit a950624

Please sign in to comment.