From e2b9c17ba3d4b7d9f2c1c97d45d47fea53ac3d61 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Wed, 3 Nov 2021 18:48:10 +0000 Subject: [PATCH] Added Size::align() --- src/Geometry/Size.php | 87 +++++++++++++++++++++++++++++++++++++ tests/Geometry/SizeTest.php | 45 +++++++++++++++++++ 2 files changed, 132 insertions(+) diff --git a/src/Geometry/Size.php b/src/Geometry/Size.php index 4f19bc30..b2e4f71f 100644 --- a/src/Geometry/Size.php +++ b/src/Geometry/Size.php @@ -89,4 +89,91 @@ class Size implements SizeInterface { return $this->getWidth() < $this->getHeight(); } + + /** + * Aligns current size's pivot point to given position + * and moves point automatically by offset. + * + * @param string $position + * @param int $offset_x + * @param int $offset_y + * @return Size + */ + public function align(string $position, int $offset_x = 0, int $offset_y = 0): self + { + switch (strtolower($position)) { + case 'top': + case 'top-center': + case 'top-middle': + case 'center-top': + case 'middle-top': + $x = intval($this->width / 2); + $y = 0 + $offset_y; + break; + + case 'top-right': + case 'right-top': + $x = $this->width - $offset_x; + $y = 0 + $offset_y; + break; + + case 'left': + case 'left-center': + case 'left-middle': + case 'center-left': + case 'middle-left': + $x = 0 + $offset_x; + $y = intval($this->height / 2); + break; + + case 'right': + case 'right-center': + case 'right-middle': + case 'center-right': + case 'middle-right': + $x = $this->width - $offset_x; + $y = intval($this->height / 2); + break; + + case 'bottom-left': + case 'left-bottom': + $x = 0 + $offset_x; + $y = $this->height - $offset_y; + break; + + case 'bottom': + case 'bottom-center': + case 'bottom-middle': + case 'center-bottom': + case 'middle-bottom': + $x = intval($this->width / 2); + $y = $this->height - $offset_y; + break; + + case 'bottom-right': + case 'right-bottom': + $x = $this->width - $offset_x; + $y = $this->height - $offset_y; + break; + + case 'center': + case 'middle': + case 'center-center': + case 'middle-middle': + $x = intval($this->width / 2) + $offset_x; + $y = intval($this->height / 2) + $offset_y; + break; + + default: + case 'top-left': + case 'left-top': + $x = 0 + $offset_x; + $y = 0 + $offset_y; + break; + } + + $this->pivot->setPosition($x, $y); + + return $this; + } } diff --git a/tests/Geometry/SizeTest.php b/tests/Geometry/SizeTest.php index e3e9c348..47090238 100644 --- a/tests/Geometry/SizeTest.php +++ b/tests/Geometry/SizeTest.php @@ -98,4 +98,49 @@ class SizeTest extends TestCase $box = new Size(200, 300); $this->assertTrue($box->isPortrait()); } + + public function testAlign(): void + { + $box = new Size(640, 480); + $this->assertEquals(0, $box->getPivot()->getX()); + $this->assertEquals(0, $box->getPivot()->getY()); + + $box->align('top-left', 3, 3); + $this->assertEquals(3, $box->getPivot()->getX()); + $this->assertEquals(3, $box->getPivot()->getY()); + + $box->align('top', 3, 3); + $this->assertEquals(320, $box->getPivot()->getX()); + $this->assertEquals(3, $box->getPivot()->getY()); + + $box->align('top-right', 3, 3); + $this->assertEquals(637, $box->getPivot()->getX()); + $this->assertEquals(3, $box->getPivot()->getY()); + + $box->align('left', 3, 3); + $this->assertEquals(3, $box->getPivot()->getX()); + $this->assertEquals(240, $box->getPivot()->getY()); + + $box->align('center', 3, 3); + $this->assertEquals(323, $box->getPivot()->getX()); + $this->assertEquals(243, $box->getPivot()->getY()); + + $box->align('right', 3, 3); + $this->assertEquals(637, $box->getPivot()->getX()); + $this->assertEquals(240, $box->getPivot()->getY()); + + $box->align('bottom-left', 3, 3); + $this->assertEquals(3, $box->getPivot()->getX()); + $this->assertEquals(477, $box->getPivot()->getY()); + + $box->align('bottom', 3, 3); + $this->assertEquals(320, $box->getPivot()->getX()); + $this->assertEquals(477, $box->getPivot()->getY()); + + $result = $box->align('bottom-right', 3, 3); + $this->assertEquals(637, $box->getPivot()->getX()); + $this->assertEquals(477, $box->getPivot()->getY()); + + $this->assertInstanceOf(Size::class, $result); + } }