LibDraw: Add orientation-based offset/size manipulation helpers.

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.
This commit is contained in:
Andreas Kling 2019-07-20 16:46:33 +02:00
parent 26e252b0f8
commit 8ab1923abe
Notes: sideshowbarker 2024-07-19 13:07:19 +09:00
2 changed files with 73 additions and 0 deletions

View file

@ -2,6 +2,7 @@
#include <AK/AKString.h>
#include <AK/LogStream.h>
#include <LibDraw/Orientation.h>
class Rect;
struct WSAPI_Point;
@ -68,6 +69,32 @@ public:
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 };

View file

@ -2,6 +2,7 @@
#include <AK/AKString.h>
#include <AK/LogStream.h>
#include <LibDraw/Orientation.h>
#include <LibDraw/Point.h>
#include <LibDraw/Size.h>
#include <LibDraw/TextAlignment.h>
@ -132,6 +133,51 @@ public:
&& bottom() >= other.bottom();
}
int primary_offset_for_orientation(Orientation orientation) const { return m_location.primary_offset_for_orientation(orientation); }
void set_primary_offset_for_orientation(Orientation orientation, int value) { m_location.set_primary_offset_for_orientation(orientation, value); }
int secondary_offset_for_orientation(Orientation orientation) const { return m_location.secondary_offset_for_orientation(orientation); }
void set_secondary_offset_for_orientation(Orientation orientation, int value) { m_location.set_secondary_offset_for_orientation(orientation, value); }
int primary_size_for_orientation(Orientation orientation) const
{
return orientation == Orientation::Vertical ? height() : width();
}
void set_primary_size_for_orientation(Orientation orientation, int value)
{
if (orientation == Orientation::Vertical)
set_height(value);
else
set_width(value);
}
int secondary_size_for_orientation(Orientation orientation) const
{
return orientation == Orientation::Vertical ? width() : height();
}
void set_secondary_size_for_orientation(Orientation orientation, int value)
{
if (orientation == Orientation::Vertical)
set_width(value);
else
set_height(value);
}
int first_edge_for_orientation(Orientation orientation) const
{
if (orientation == Orientation::Vertical)
return top();
return left();
}
int last_edge_for_orientation(Orientation orientation) const
{
if (orientation == Orientation::Vertical)
return bottom();
return right();
}
int left() const { return x(); }
int right() const { return x() + width() - 1; }
int top() const { return y(); }