summaryrefslogtreecommitdiff
path: root/src/interface/Window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/Window.cpp')
-rw-r--r--src/interface/Window.cpp291
1 files changed, 291 insertions, 0 deletions
diff --git a/src/interface/Window.cpp b/src/interface/Window.cpp
new file mode 100644
index 0000000..e28d34b
--- /dev/null
+++ b/src/interface/Window.cpp
@@ -0,0 +1,291 @@
+#include "Window.h"
+#include "Component.h"
+#include "interface/Point.h"
+
+using namespace ui;
+
+Window::Window(Point _position, Point _size):
+ Position(_position),
+ Size(_size),
+ focusedComponent_(NULL)
+{
+}
+
+Window::~Window()
+{
+ for(unsigned i = 0, sz = Components.size(); i < sz; ++i)
+ if( Components[i] )
+ delete Components[i];
+}
+
+void Window::AddComponent(Component* c)
+{
+ // TODO: do a check if component was already added?
+ if(c->GetParentWindow()==NULL)
+ {
+ c->SetParentWindow(this);
+ Components.push_back(c);
+ }
+ else
+ {
+ //Component already has a state, don't sad it
+ }
+}
+
+unsigned Window::GetComponentCount()
+{
+ return Components.size();
+}
+
+Component* Window::GetComponent(unsigned idx)
+{
+ return Components[idx];
+}
+
+void Window::RemoveComponent(Component* c)
+{
+ // remove component WITHOUT freeing it.
+ for(unsigned i = 0; i < Components.size(); ++i)
+ {
+ // find the appropriate component index
+ if(Components[i] == c)
+ {
+ Components.erase(Components.begin() + i);
+
+ // we're done
+ return;
+ }
+ }
+}
+
+void Window::RemoveComponent(unsigned idx)
+{
+ // free component and remove it.
+ delete Components[idx];
+ Components.erase(Components.begin() + idx);
+}
+
+bool Window::IsFocused(const Component* c) const
+{
+ return c == focusedComponent_;
+}
+
+void Window::FocusComponent(Component* c)
+{
+ this->focusedComponent_ = c;
+}
+
+void Window::DoExit()
+{
+
+ OnExit();
+}
+
+void Window::DoInitialized()
+{
+
+ OnInitialized();
+}
+
+void Window::DoDraw()
+{
+ //draw
+ for(int i = 0, sz = Components.size(); i < sz; ++i)
+ if(Components[i]->Visible)
+ {
+ if(AllowExclusiveDrawing)
+ {
+ Point scrpos(Components[i]->Position.X, Components[i]->Position.Y);
+ Components[i]->Draw(scrpos);
+ }
+ else
+ {
+ if( Components[i]->Position.X+Position.X + Components[i]->Size.X >= 0 &&
+ Components[i]->Position.Y+Position.Y + Components[i]->Size.Y >= 0 &&
+ Components[i]->Position.X+Position.X < ui::Engine::Ref().GetWidth() &&
+ Components[i]->Position.Y+Position.Y < ui::Engine::Ref().GetHeight() )
+ {
+ Point scrpos(Components[i]->Position.X + Position.X, Components[i]->Position.Y + Position.Y);
+ Components[i]->Draw( Point(scrpos) );
+ }
+ }
+ }
+
+ OnDraw();
+}
+
+void Window::DoTick(float dt)
+{
+ //on mouse hover
+ for(int i = Components.size() - 1; i >= 0; --i)
+ {
+ if(!Components[i]->Locked &&
+ ui::Engine::Ref().GetMouseX() >= Components[i]->Position.X+Position.X &&
+ ui::Engine::Ref().GetMouseY() >= Components[i]->Position.Y+Position.Y &&
+ ui::Engine::Ref().GetMouseX() < Components[i]->Position.X+Position.X + Components[i]->Size.X &&
+ ui::Engine::Ref().GetMouseY() < Components[i]->Position.Y+Position.Y + Components[i]->Size.Y )
+ {
+ Components[i]->OnMouseHover(ui::Engine::Ref().GetMouseX() - (Components[i]->Position.X + Position.X), ui::Engine::Ref().GetMouseY() - (Components[i]->Position.Y + Position.Y));
+ break;
+ }
+ }
+
+ //tick
+ for(int i = 0, sz = Components.size(); i < sz; ++i)
+ {
+ Components[i]->Tick(dt);
+ }
+
+ OnTick(dt);
+}
+
+void Window::DoKeyPress(int key, bool shift, bool ctrl, bool alt)
+{
+ //on key press
+ if(focusedComponent_ != NULL)
+ {
+ if(!focusedComponent_->Locked)
+ focusedComponent_->OnKeyPress(key, shift, ctrl, alt);
+ }
+
+ OnKeyPress(key, shift, ctrl, alt);
+}
+
+void Window::DoKeyRelease(int key, bool shift, bool ctrl, bool alt)
+{
+ //on key unpress
+ if(focusedComponent_ != NULL)
+ {
+ if(!focusedComponent_->Locked)
+ focusedComponent_->OnKeyRelease(key, shift, ctrl, alt);
+ }
+
+ OnKeyRelease(key, shift, ctrl, alt);
+}
+
+void Window::DoMouseDown(int x, int y, unsigned button)
+{
+ //on mouse click
+ bool clickState = false;
+ for(int i = Components.size() - 1; i > -1 ; --i)
+ {
+ if(!Components[i]->Locked)
+ {
+ if(x >= Components[i]->Position.X && y >= Components[i]->Position.Y && x < Components[i]->Position.X + Components[i]->Size.X && y < Components[i]->Position.Y + Components[i]->Size.Y)
+ {
+ FocusComponent(Components[i]);
+ Components[i]->OnMouseClick(x - Components[i]->Position.X, y - Components[i]->Position.Y, button);
+ clickState = true;
+ break;
+ }
+ }
+ }
+
+ if(!clickState)
+ FocusComponent(NULL);
+
+ //on mouse down
+ for(int i = Components.size() - 1; i > -1 ; --i)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseDown(x, y, button);
+ }
+
+ OnMouseDown(x, y, button);
+}
+
+void Window::DoMouseMove(int x, int y, int dx, int dy)
+{
+ //on mouse move (if true, and inside)
+ for(int i = Components.size() - 1; i > -1 ; --i)
+ {
+ if(!Components[i]->Locked)
+ {
+ Point local (x - Components[i]->Position.X, y - Components[i]->Position.Y)
+ , a (local.X - dx, local.Y - dy);
+
+ Components[i]->OnMouseMoved(local.X, local.Y, dx, dy);
+
+ if(local.X >= 0 &&
+ local.Y >= 0 &&
+ local.X < Components[i]->Size.X &&
+ local.Y < Components[i]->Size.Y )
+ {
+ Components[i]->OnMouseMovedInside(local.X, local.Y, dx, dy);
+
+ // entering?
+ if(!(
+ a.X >= 0 &&
+ a.Y >= 0 &&
+ a.X < Components[i]->Size.X &&
+ a.Y < Components[i]->Size.Y ))
+ {
+ Components[i]->OnMouseEnter(local.X, local.Y);
+ }
+ }
+ else
+ {
+ // leaving?
+ if( a.X >= 0 &&
+ a.Y >= 0 &&
+ a.X < Components[i]->Size.X &&
+ a.Y < Components[i]->Size.Y )
+ {
+ Components[i]->OnMouseLeave(local.X, local.Y);
+ }
+
+ }
+ }
+ }
+
+ OnMouseMove(x, y, dx, dy);
+}
+
+void Window::DoMouseUp(int x, int y, unsigned button)
+{
+ //on mouse unclick
+ for(int i = Components.size() - 1; i >= 0 ; --i)
+ {
+ if(!Components[i]->Locked)
+ {
+ if(x >= Components[i]->Position.X && y >= Components[i]->Position.Y && x < Components[i]->Position.X + Components[i]->Size.X && y < Components[i]->Position.Y + Components[i]->Size.Y)
+ {
+ Components[i]->OnMouseUnclick(x - Components[i]->Position.X, y - Components[i]->Position.Y, button);
+ break;
+ }
+ }
+ }
+
+ //on mouse up
+ for(int i = Components.size() - 1; i >= 0 ; --i)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseUp(x, y, button);
+ }
+
+ OnMouseUp(x, y, button);
+}
+
+void Window::DoMouseWheel(int x, int y, int d)
+{
+ //on mouse wheel focused
+ for(int i = Components.size() - 1; i >= 0 ; --i)
+ {
+ if(x >= Components[i]->Position.X && y >= Components[i]->Position.Y && x < Components[i]->Position.X + Components[i]->Size.X && y < Components[i]->Position.Y + Components[i]->Size.Y)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseWheelInside(x - Components[i]->Position.X, y - Components[i]->Position.Y, d);
+ break;
+ }
+ }
+
+ //on mouse wheel
+ for(int i = Components.size() - 1; i >= 0 ; --i)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseWheel(x - Components[i]->Position.X, y - Components[i]->Position.Y, d);
+ }
+
+ OnMouseWheel(x, y, d);
+}
+