Prechádzať zdrojové kódy

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.
Andreas Kling 6 rokov pred
rodič
commit
8ab1923abe
2 zmenil súbory, kde vykonal 73 pridanie a 0 odobranie
  1. 27 0
      Libraries/LibDraw/Point.h
  2. 46 0
      Libraries/LibDraw/Rect.h

+ 27 - 0
Libraries/LibDraw/Point.h

@@ -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 };

+ 46 - 0
Libraries/LibDraw/Rect.h

@@ -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(); }