From 962dc18ee4827b464764ec3708be3d00a9143971 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 21 Mar 2019 22:22:02 +0800 Subject: ... --- src/ui/layout_control.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/ui/layout_control.cpp (limited to 'src/ui/layout_control.cpp') diff --git a/src/ui/layout_control.cpp b/src/ui/layout_control.cpp new file mode 100644 index 00000000..d2b430dd --- /dev/null +++ b/src/ui/layout_control.cpp @@ -0,0 +1,52 @@ +#include "layout_control.hpp" + +#include "window.hpp" + +namespace cru::ui { +void ControlAddChildCheck(Control* control) { + if (control->GetParent() != nullptr) + throw std::invalid_argument("The control already has a parent."); + + if (dynamic_cast(control)) + throw std::invalid_argument("Can't add a window as child."); +} + +LayoutControl::~LayoutControl() { + for (const auto child : children_) delete child; +} + +void LayoutControl::AddChild(Control* control, const int position) { + ControlAddChildCheck(control); + + if (position < 0 || static_cast(position) > + this->children_.size()) + throw std::invalid_argument("The position is out of range."); + + children_.insert(this->children_.cbegin() + position, control); + + control->_SetParent(this); + control->_SetDescendantWindow(GetWindow()); + + OnAddChild(control, position); +} + +void LayoutControl::RemoveChild(const int position) { + if (position < 0 || static_castchildren_.size())>(position) >= + this->children_.size()) + throw std::invalid_argument("The position is out of range."); + + const auto i = children_.cbegin() + position; + const auto child = *i; + + children_.erase(i); + + child->_SetParent(nullptr); + child->_SetDescendantWindow(nullptr); + + OnRemoveChild(child, position); +} + +void LayoutControl::OnAddChild(Control* child, int position) {} + +void LayoutControl::OnRemoveChild(Control* child, int position) {} +} // namespace cru::ui -- cgit v1.2.3