summaryrefslogtreecommitdiff
path: root/src/interface/State.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/State.cpp')
-rw-r--r--src/interface/State.cpp384
1 files changed, 221 insertions, 163 deletions
diff --git a/src/interface/State.cpp b/src/interface/State.cpp
index 2828751..665e2e8 100644
--- a/src/interface/State.cpp
+++ b/src/interface/State.cpp
@@ -1,233 +1,291 @@
-/*
- * State.cpp
- *
- * Created on: Jan 8, 2012
- * Author: Simon
- */
-
#include <vector>
-#include <iostream>
-#include <cstring>
-
+#include "interface/Component.h"
+#include "interface/Engine.h"
#include "interface/State.h"
+//#include "Platform.h"
-namespace ui {
+using namespace ui;
-State::State(int w, int h):
- mouseX(0),
- mouseY(0),
- mouseXP(0),
- mouseYP(0),
- width(w),
- height(h),
- Components()
+State::State()
+: UserData(NULL)
+, focusedComponent_(NULL)
{
}
State::~State()
{
- //Components.~vector(); // just in case // devnote : Nope.jpg Nate :3 -frankbro
+ for(unsigned i = 0, sz = Components.size(); i < sz; ++i)
+ if( Components[i] )
+ delete Components[i];
+}
+
+void State::AddComponent(Component* c)
+{
+ // TODO: do a check if component was already added?
+ if(c->GetParentState()==NULL)
+ {
+ c->SetParentState(this);
+ Components.push_back(c);
+ }
+ else
+ {
+ //Component already has a state, don't sad it
+ }
+}
+
+unsigned State::GetComponentCount()
+{
+ return Components.size();
+}
+
+Component* State::GetComponent(unsigned idx)
+{
+ return Components[idx];
+}
+
+void State::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 State::RemoveComponent(unsigned idx)
+{
+ // free component and remove it.
+ delete Components[idx];
+ Components.erase(Components.begin() + idx);
}
-void State::Add(Component* child)
+bool State::IsFocused(const Component* c) const
{
- Components.push_back(child);
- child->Parent = this;
+ return c == focusedComponent_;
}
-void State::Remove(Component* child)
+void State::FocusComponent(Component* c)
{
- for(int i = 0; i < Components.size(); i++)
- if(Components[i] == child)
- {
- Components.erase(Components.begin() + i);
- break;
- }
+ this->focusedComponent_ = c;
}
-void State::Draw(void* userdata)
+void State::DoExit()
{
- //draw
- for(int i = 0; i < Components.size(); i++)
- {
- if(Components[i]->Visible)
- {
- if(AllowExclusiveDrawing)
- {
- Components[i]->Draw(userdata);
- }
- else if(
- Components[i]->X + Components[i]->Width >= 0 &&
- Components[i]->Y + Components[i]->Height >= 0 &&
- Components[i]->X < width &&
- Components[i]->Y < height )
- {
- Components[i]->Draw(userdata);
- }
- }
- }
+
+ OnExit();
}
-void State::Tick(float dt)
+void State::DoInitialized()
+{
+
+ OnInitialized();
+}
+
+void State::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 + Components[i]->Size.X >= 0 &&
+ Components[i]->Position.Y + Components[i]->Size.Y >= 0 &&
+ Components[i]->Position.X < ui::Engine::Ref().GetWidth() &&
+ Components[i]->Position.Y < ui::Engine::Ref().GetHeight() )
+ {
+ Point scrpos(Components[i]->Position.X, Components[i]->Position.Y);
+ Components[i]->Draw( Point(scrpos) );
+ }
+ }
+ }
+
+ OnDraw();
+}
+
+void State::DoTick(float dt)
{
//on mouse hover
- for(int i = 0; i < Components.size(); i++)
- if( mouseX >= Components[i]->X &&
- mouseY >= Components[i]->Y &&
- mouseX < Components[i]->X + Components[i]->Width &&
- mouseY < Components[i]->Y + Components[i]->Height )
- {
- if(Components[i]->Enabled)
- {
- Components[i]->OnMouseHover(mouseX, mouseY);
- }
+ for(int i = Components.size() - 1; i >= 0; --i)
+ {
+ if(!Components[i]->Locked &&
+ ui::Engine::Ref().GetMouseX() >= Components[i]->Position.X &&
+ ui::Engine::Ref().GetMouseY() >= Components[i]->Position.Y &&
+ ui::Engine::Ref().GetMouseX() < Components[i]->Position.X + Components[i]->Size.X &&
+ ui::Engine::Ref().GetMouseY() < Components[i]->Position.Y + Components[i]->Size.Y )
+ {
+ Components[i]->OnMouseHover(ui::Engine::Ref().GetMouseX() - Components[i]->Position.X, ui::Engine::Ref().GetMouseY() - Components[i]->Position.Y);
break;
}
-
+ }
+
//tick
- for(int i = 0; i < Components.size(); i++)
+ for(int i = 0, sz = Components.size(); i < sz; ++i)
+ {
Components[i]->Tick(dt);
+ }
+
+ OnTick(dt);
}
-void State::OnKeyPress(int key, bool shift, bool ctrl, bool alt)
+void State::DoKeyPress(int key, bool shift, bool ctrl, bool alt)
{
//on key press
if(focusedComponent_ != NULL)
- if(focusedComponent_->Enabled)
+ {
+ if(!focusedComponent_->Locked)
focusedComponent_->OnKeyPress(key, shift, ctrl, alt);
+ }
+
+ OnKeyPress(key, shift, ctrl, alt);
}
-void State::OnKeyRelease(int key, bool shift, bool ctrl, bool alt)
+void State::DoKeyRelease(int key, bool shift, bool ctrl, bool alt)
{
//on key unpress
if(focusedComponent_ != NULL)
- if(focusedComponent_->Enabled)
+ {
+ if(!focusedComponent_->Locked)
focusedComponent_->OnKeyRelease(key, shift, ctrl, alt);
+ }
+
+ OnKeyRelease(key, shift, ctrl, alt);
}
-void State::OnMouseDown(int x, int y, unsigned int button)
+void State::DoMouseDown(int x, int y, unsigned button)
{
//on mouse click
- for(int i = Components.size() - 1; i > -1 ; i--)
- if(Components[i]->Enabled)
- if(x >= Components[i]->X && y >= Components[i]->Y && x < Components[i]->X + Components[i]->Width && y < Components[i]->Y + Components[i]->Height)
+ 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)
{
- Components[i]->OnMouseClick(x - Components[i]->X, y - Components[i]->Y, button);
- this->focusedComponent_ = Components[i]; //set this component as the focused component
+ 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]->Enabled)
- Components[i]->OnMouseDown(x - Components[i]->X, y - Components[i]->Y, button);
+ for(int i = Components.size() - 1; i > -1 ; --i)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseDown(x, y, button);
+ }
+
+ OnMouseDown(x, y, button);
}
-void State::OnMouseMove(int x, int y)
+void State::DoMouseMove(int x, int y, int dx, int dy)
{
- //update mouse coords
- mouseX = x;
- mouseY = y;
-
//on mouse move (if true, and inside)
- for(int i = Components.size() - 1; i > -1 ; i--)
- if(Components[i]->Enabled)
+ for(int i = Components.size() - 1; i > -1 ; --i)
+ {
+ if(!Components[i]->Locked)
{
- int localX = x - Components[i]->X;
- int localY = y - Components[i]->Y;
- int localXP = mouseXP - Components[i]->X;
- int localYP = mouseYP - Components[i]->Y;
- int dx = x - mouseXP;
- int dy = x - mouseYP;
-
- Components[i]->OnMouseMoved(localX, localY, dx, dy);
-
- //is the mouse inside
- if(localX >= 0 &&
- localY >= 0 &&
- localX < Components[i]->Width &&
- localY < Components[i]->Height )
- {
- //was the mouse outside last tick?
- if(localXP < 0 ||
- localXP >= Components[i]->Width ||
- localYP < 0 ||
- localYP >= Components[i]->Height )
- {
- Components[i]->OnMouseEnter(localX, localY, dx, dy);
- }
-
- Components[i]->OnMouseMovedInside(localX, localY, dx, dy);
-
- break; //found the top-most component under mouse, break that shit
- }
- //not inside, let's see if it used to be inside last tick
- else if (localXP >= 0 &&
- localYP >= 0 &&
- localXP < Components[i]->Width &&
- localYP < Components[i]->Height )
- {
- Components[i]->OnMouseLeave(localX, localY, x - mouseXP, y - mouseYP);
- }
- }
- else //is locked
- {
- int localX = x - Components[i]->X;
- int localY = y - Components[i]->Y;
-
- //is the mouse inside
- if(localX >= 0 &&
- localY >= 0 &&
- localX < Components[i]->Width &&
- localY < Components[i]->Height )
- {
- break; //it's the top-most component under the mouse, we don't want to go under it.
- }
+ 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);
+ }
+
+ }
}
- // end of for loop here
+ }
- //set the previous mouse coords
- mouseXP = x;
- mouseYP = y;
+ OnMouseMove(x, y, dx, dy);
}
-void State::OnMouseUp(int x, int y, unsigned int button)
+void State::DoMouseUp(int x, int y, unsigned button)
{
//on mouse unclick
- for(int i = Components.size() - 1; i > -1 ; i--)
- if(Components[i]->Enabled)
- if(x >= Components[i]->X && y >= Components[i]->Y && x < Components[i]->X + Components[i]->Width && y < Components[i]->Y + Components[i]->Height)
+ 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]->X, y - Components[i]->Y, button);
+ 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 > -1 ; i--)
- if(Components[i]->Enabled)
- Components[i]->OnMouseUp(x - Components[i]->X, y - Components[i]->Y, button);
+ for(int i = Components.size() - 1; i >= 0 ; --i)
+ {
+ if(!Components[i]->Locked)
+ Components[i]->OnMouseUp(x, y, button);
+ }
+
+ OnMouseUp(x, y, button);
}
-void State::OnMouseWheel(int x, int y, int d)
+void State::DoMouseWheel(int x, int y, int d)
{
- //focused mouse wheel
- if(focusedComponent_ != NULL)
- focusedComponent_->OnMouseWheelFocused(x - focusedComponent_->X, y - focusedComponent_->Y, d);
-
- //mouse wheel inside
- for(int i = Components.size() - 1; i > -1 ; i--)
- if(x >= Components[i]->X && y >= Components[i]->Y && x < Components[i]->X + Components[i]->Width && y < Components[i]->Y + Components[i]->Height)
+ //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]->Enabled)
- Components[i]->OnMouseWheelInside(x - Components[i]->X, y - Components[i]->Y, d);
- break; //found top-most component under mouse
+ 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 > -1 ; i--)
- if(Components[i]->Enabled)
- Components[i]->OnMouseWheel(x - Components[i]->X, y - Components[i]->Y, d);
-}
-
+ 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);
+ }
-} /* namespace ui */
+ OnMouseWheel(x, y, d);
+}