summaryrefslogtreecommitdiff
path: root/src/interface/Panel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/Panel.cpp')
-rw-r--r--src/interface/Panel.cpp160
1 files changed, 111 insertions, 49 deletions
diff --git a/src/interface/Panel.cpp b/src/interface/Panel.cpp
index d2de97e..3b9cfc1 100644
--- a/src/interface/Panel.cpp
+++ b/src/interface/Panel.cpp
@@ -7,25 +7,40 @@
#include "interface/Point.h"
#include "interface/Window.h"
#include "interface/Component.h"
+#include "graphics/Graphics.h"
using namespace ui;
-Panel::Panel(Window* parent_state):
- Component(parent_state)
-{
-
-}
-
Panel::Panel(Point position, Point size):
- Component(position, size)
-{
-
-}
-
-Panel::Panel():
- Component()
-{
-
+ Component(position, size),
+ InnerSize(size),
+ ViewportPosition(0, 0),
+ mouseInside(false)
+{
+#ifdef OGLI
+ GLint lastVid;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastVid);
+
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &myVidTex);
+ glBindTexture(GL_TEXTURE_2D, myVidTex);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, XRES+BARSIZE, YRES+MENUSIZE, 0, GL_RGBA, GL_FLOAT, NULL);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+
+ //FBO
+ glGenFramebuffers(1, &myVid);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, myVid);
+ glEnable(GL_BLEND);
+ glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, myVidTex, 0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Reset framebuffer binding
+ glDisable(GL_TEXTURE_2D);
+
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, lastVid);
+#else
+ myVid = new pixel[(XRES+BARSIZE)*(YRES+MENUSIZE)];
+#endif
}
Panel::~Panel()
@@ -35,11 +50,18 @@ Panel::~Panel()
if( children[i] )
delete children[i];
}
+#ifdef OGLI
+ glDeleteTextures(1, &myVidTex);
+ glDeleteFramebuffers(1, &myVid);
+#else
+ delete[] myVid;
+#endif
}
void Panel::AddChild(Component* c)
{
c->SetParent(this);
+ c->SetParentWindow(this->GetParentWindow());
}
int Panel::GetChildCount()
@@ -75,8 +97,20 @@ void Panel::RemoveChild(unsigned idx, bool freeMem)
void Panel::Draw(const Point& screenPos)
{
+
// draw ourself first
XDraw(screenPos);
+#ifdef OGLI
+ GLint lastVid;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastVid);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, myVid);
+ glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+#else
+ pixel * lastVid = ui::Engine::Ref().g->vid;
+ ui::Engine::Ref().g->vid = myVid;
+ std::fill(myVid, myVid+((XRES+BARSIZE)*(YRES+MENUSIZE)), 0);
+#endif
// attempt to draw all children
for(int i = 0; i < children.size(); ++i)
@@ -84,26 +118,52 @@ void Panel::Draw(const Point& screenPos)
// the component must be visible
if(children[i]->Visible)
{
- if(GetParentWindow()->AllowExclusiveDrawing)
+ //check if the component is in the screen, draw if it is
+ if( children[i]->Position.X + ViewportPosition.X + children[i]->Size.X >= 0 &&
+ children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y >= 0 &&
+ children[i]->Position.X + ViewportPosition.X < ui::Engine::Ref().GetWidth() &&
+ children[i]->Position.Y + ViewportPosition.Y < ui::Engine::Ref().GetHeight() )
{
- //who cares if the component is off the screen? draw anyway.
- Point scrpos = screenPos + children[i]->Position;
+ Point scrpos = /*screenPos + */children[i]->Position + ViewportPosition;
children[i]->Draw(scrpos);
}
- else
- {
- //check if the component is in the screen, draw if it is
- if( children[i]->Position.X + children[i]->Size.X >= 0 &&
- children[i]->Position.Y + children[i]->Size.Y >= 0 &&
- children[i]->Position.X < ui::Engine::Ref().GetWidth() &&
- children[i]->Position.Y < ui::Engine::Ref().GetHeight() )
- {
- Point scrpos = screenPos + children[i]->Position;
- children[i]->Draw(scrpos);
- }
- }
}
}
+
+#ifdef OGLI
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, lastVid);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, myVidTex);
+
+ int x = screenPos.X, y = screenPos.Y;
+ int h = Size.Y, w = Size.X;
+
+ double texX = double(Size.X)/double(XRES+BARSIZE), texY = 1, texYB = 1-(double(Size.Y)/double(YRES+MENUSIZE));
+
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, texYB);
+ glVertex2f(x, y+h);
+ glTexCoord2d(texX, texYB);
+ glVertex2f(x+w, y+h);
+ glTexCoord2d(texX, texY);
+ glVertex2f(x+w, y);
+ glTexCoord2d(0, texY);
+ glVertex2f(x, y);
+ glEnd();
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+#else
+ ui::Engine::Ref().g->vid = lastVid;
+
+ //dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x;
+ for (int row = 0; row < Size.Y; row++)
+ {
+ std::copy(myVid+(row*Size.W), myVid+(row*Size.W)+Size.W, lastVid+(screenPos.Y*(XRES+BARSIZE))+screenPos.X);
+ }
+#endif
}
void Panel::Tick(float dt)
@@ -137,14 +197,14 @@ void Panel::OnMouseClick(int localx, int localy, unsigned button)
if(!children[i]->Locked)
{
//is mouse inside?
- if( localx >= children[i]->Position.X &&
- localy >= children[i]->Position.Y &&
- localx < children[i]->Position.X + children[i]->Size.X &&
- localy < children[i]->Position.Y + children[i]->Size.Y )
+ if( localx >= children[i]->Position.X + ViewportPosition.X &&
+ localy >= children[i]->Position.Y + ViewportPosition.Y &&
+ localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
+ localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
{
childclicked = true;
GetParentWindow()->FocusComponent(children[i]);
- children[i]->OnMouseClick(localx - children[i]->Position.X, localy - children[i]->Position.Y, button);
+ children[i]->OnMouseClick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button);
break;
}
}
@@ -196,7 +256,7 @@ void Panel::OnMouseMoved(int localx, int localy, int dx, int dy)
for(int i = 0; i < children.size(); ++i)
{
if(!children[i]->Locked)
- children[i]->OnMouseMoved(localx - children[i]->Position.X, localy - children[i]->Position.Y, dx, dy);
+ children[i]->OnMouseMoved(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy);
}
}
@@ -206,7 +266,7 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
{
if(!children[i]->Locked)
{
- Point local (localx - children[i]->Position.X, localy - children[i]->Position.Y)
+ Point local (localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y)
, prevlocal (local.X - dx, local.Y - dy);
// mouse currently inside?
@@ -215,7 +275,7 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
local.X < children[i]->Size.X &&
local.Y < children[i]->Size.Y )
{
- children[i]->OnMouseMovedInside(localx - children[i]->Position.X, localy - children[i]->Position.Y, dx, dy);
+ children[i]->OnMouseMovedInside(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy);
// was the mouse outside?
if(!(prevlocal.X >= 0 &&
@@ -248,11 +308,13 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy)
void Panel::OnMouseEnter(int localx, int localy)
{
+ mouseInside = true;
XOnMouseEnter(localx, localy);
}
void Panel::OnMouseLeave(int localx, int localy)
{
+ mouseInside = false;
XOnMouseLeave(localx, localy);
}
@@ -267,13 +329,13 @@ void Panel::OnMouseUnclick(int localx, int localy, unsigned button)
if(!children[i]->Locked)
{
//is mouse inside?
- if( localx >= children[i]->Position.X &&
- localy >= children[i]->Position.Y &&
- localx < children[i]->Position.X + children[i]->Size.X &&
- localy < children[i]->Position.Y + children[i]->Size.Y )
+ if( localx >= children[i]->Position.X + ViewportPosition.X &&
+ localy >= children[i]->Position.Y + ViewportPosition.Y &&
+ localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
+ localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
{
childunclicked = true;
- children[i]->OnMouseUnclick(localx - children[i]->Position.X, localy - children[i]->Position.Y, button);
+ children[i]->OnMouseUnclick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button);
break;
}
}
@@ -302,7 +364,7 @@ void Panel::OnMouseWheel(int localx, int localy, int d)
for(int i = 0; i < children.size(); ++i)
{
if(!children[i]->Locked)
- children[i]->OnMouseWheel(localx - children[i]->Position.X, localy - children[i]->Position.Y, d);
+ children[i]->OnMouseWheel(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, d);
}
}
@@ -316,12 +378,12 @@ void Panel::OnMouseWheelInside(int localx, int localy, int d)
if(!children[i]->Locked)
{
//is mouse inside?
- if( localx >= children[i]->Position.X &&
- localy >= children[i]->Position.Y &&
- localx < children[i]->Position.X + children[i]->Size.X &&
- localy < children[i]->Position.Y + children[i]->Size.Y )
+ if( localx >= children[i]->Position.X + ViewportPosition.X &&
+ localy >= children[i]->Position.Y + ViewportPosition.Y &&
+ localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X &&
+ localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y )
{
- children[i]->OnMouseWheelInside(localx - children[i]->Position.X, localy - children[i]->Position.Y, d);
+ children[i]->OnMouseWheelInside(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, d);
break;
}
}