mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:08:13 +00:00

These are useful when doing widgets that can be switched between vertical and horizontal mode, such as GSlider. The idea is that instead of using "x" and "y" directly, you use the "primary" and "secondary" offset/size for the Orientation you're configured in.
106 lines
2.3 KiB
C++
106 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <AK/AKString.h>
|
|
#include <AK/LogStream.h>
|
|
#include <LibDraw/Orientation.h>
|
|
|
|
class Rect;
|
|
struct WSAPI_Point;
|
|
|
|
class Point {
|
|
public:
|
|
Point() {}
|
|
Point(int x, int y)
|
|
: m_x(x)
|
|
, m_y(y)
|
|
{
|
|
}
|
|
Point(const WSAPI_Point&);
|
|
|
|
int x() const { return m_x; }
|
|
int y() const { return m_y; }
|
|
|
|
void set_x(int x) { m_x = x; }
|
|
void set_y(int y) { m_y = y; }
|
|
|
|
void move_by(int dx, int dy)
|
|
{
|
|
m_x += dx;
|
|
m_y += dy;
|
|
}
|
|
|
|
void move_by(const Point& delta)
|
|
{
|
|
move_by(delta.x(), delta.y());
|
|
}
|
|
|
|
Point translated(const Point& delta) const
|
|
{
|
|
Point point = *this;
|
|
point.move_by(delta);
|
|
return point;
|
|
}
|
|
|
|
Point translated(int dx, int dy) const
|
|
{
|
|
Point point = *this;
|
|
point.move_by(dx, dy);
|
|
return point;
|
|
}
|
|
|
|
void constrain(const Rect&);
|
|
|
|
bool operator==(const Point& other) const
|
|
{
|
|
return m_x == other.m_x
|
|
&& m_y == other.m_y;
|
|
}
|
|
|
|
bool operator!=(const Point& other) const
|
|
{
|
|
return !(*this == other);
|
|
}
|
|
|
|
Point operator-() const { return { -m_x, -m_y }; }
|
|
Point operator-(const Point& other) const { return { m_x - other.m_x, m_y - other.m_y }; }
|
|
|
|
operator WSAPI_Point() const;
|
|
String to_string() const { return String::format("[%d,%d]", x(), y()); }
|
|
|
|
bool is_null() const { return !m_x && !m_y; }
|
|
|
|
int primary_offset_for_orientation(Orientation orientation) const
|
|
{
|
|
return orientation == Orientation::Vertical ? y() : x();
|
|
}
|
|
|
|
void set_primary_offset_for_orientation(Orientation orientation, int value)
|
|
{
|
|
if (orientation == Orientation::Vertical)
|
|
set_y(value);
|
|
else
|
|
set_x(value);
|
|
}
|
|
|
|
int secondary_offset_for_orientation(Orientation orientation) const
|
|
{
|
|
return orientation == Orientation::Vertical ? x() : y();
|
|
}
|
|
|
|
void set_secondary_offset_for_orientation(Orientation orientation, int value)
|
|
{
|
|
if (orientation == Orientation::Vertical)
|
|
set_x(value);
|
|
else
|
|
set_y(value);
|
|
}
|
|
|
|
private:
|
|
int m_x { 0 };
|
|
int m_y { 0 };
|
|
};
|
|
|
|
inline const LogStream& operator<<(const LogStream& stream, const Point& value)
|
|
{
|
|
return stream << value.to_string();
|
|
}
|