summaryrefslogtreecommitdiff
path: root/src/gui/position.cpp
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2018-08-20 20:34:57 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2018-08-20 20:34:57 -0400
commita4460f6d9453bbd7e584937686449cef3e19f052 (patch)
tree037c208f1e20302ed048c0952ef8e3418add9c86 /src/gui/position.cpp
Initial commit0.0.0
Diffstat (limited to 'src/gui/position.cpp')
-rw-r--r--src/gui/position.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/gui/position.cpp b/src/gui/position.cpp
new file mode 100644
index 0000000..03514a4
--- /dev/null
+++ b/src/gui/position.cpp
@@ -0,0 +1,107 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2018 Leo Tenenbaum
+// This file is part of GraphColoring.
+//
+// GraphColoring is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// GraphColoring is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with GraphColoring. If not, see <https://www.gnu.org/licenses/>.
+////////////////////////////////////////////////////////////////////////////////
+
+#include "position.hpp"
+
+#include <iostream>
+
+#include "utils/errors.hpp"
+
+namespace gui {
+
+Position::Position(int x_, int y_, double relx_, double rely_,
+ const Size* parent_size_, const Position* parent_pos_)
+{
+ SetPos(x_, y_);
+ SetRel(relx_, rely_);
+ SetParent(parent_size_, parent_pos_);
+}
+
+int Position::X() const
+{
+ int xpos = x;
+ if (parent_size != nullptr)
+ xpos += relx * parent_size->X();
+ if (parent_pos != nullptr)
+ xpos += parent_pos->X();
+ return xpos;
+}
+
+int Position::Y() const
+{
+ int ypos = y;
+ if (parent_size != nullptr)
+ ypos += rely * parent_size->Y();
+ if (parent_pos != nullptr)
+ ypos += parent_pos->Y();
+ return ypos;
+}
+
+void Position::SetX(int x_) { x = x_; }
+void Position::SetY(int y_) { y = y_; }
+
+
+void Position::SetPos(int x_, int y_)
+{
+ SetX(x_);
+ SetY(y_);
+}
+
+void Position::SetRel(double relx_, double rely_)
+{
+ relx = relx_;
+ rely = rely_;
+}
+
+void Position::SetParent(const Size* parent_size_, const Position* parent_pos_)
+{
+ parent_size = parent_size_;
+ parent_pos = parent_pos_;
+}
+
+int Position::AlignAxis(Alignment alignment, int val, int size)
+{
+ switch (alignment)
+ {
+ case Alignment::LEFT:
+ return val;
+ case Alignment::RIGHT:
+ return val - size;
+ case Alignment::CENTER:
+ return val - size/2;
+ }
+ return -1;
+}
+
+int Position::AlignedX(Alignment horizontal_align, int width) const
+{
+ return AlignAxis(horizontal_align, X(), width);
+}
+
+int Position::AlignedY(Alignment vertical_align, int height) const
+{
+ return AlignAxis(vertical_align, Y(), height);
+}
+
+std::ostream& operator<<(std::ostream& os, Position pos)
+{
+ os << "(" << pos.X() << ", " << pos.Y() << ")";
+ return os;
+}
+
+} // namespace gui