Lephisto/src/gui.cpp

157 lines
4.2 KiB
C++

#include "libs.h"
#include "gui.h"
namespace Gui {
namespace RawEvents {
sigc::signal<void, MouseMotionEvent*> onMouseMotion;
sigc::signal<void, MouseButtonEvent*> onMouseDown;
sigc::signal<void, MouseButtonEvent*> onMouseUp;
sigc::signal<void, SDL_KeyboardEvent*> onKeyDown;
sigc::signal<void, SDL_KeyboardEvent*> onKeyUp;
}
namespace Color {
const float bg[] = { .25, .37, .63 };
const float bgShadow[] = { .08, .12, .21 };
}
void HandleSDLEvent(SDL_Event* event) {
switch(event->type) {
case SDL_MOUSEBUTTONDOWN:
Screen::OnClick(&event->button);
break;
case SDL_MOUSEBUTTONUP:
Screen::OnClick(&event->button);
break;
case SDL_KEYDOWN:
Screen::OnKeyDown(&event->key.keysym);
break;
case SDL_KEYUP:
RawEvents::onKeyUp.emit(&event->key);
break;
case SDL_MOUSEMOTION:
Screen::OnMouseMotion(&event->motion);
break;
}
}
struct TimerSignal {
Uint32 goTime;
sigc::signal<void>* sig;
};
static std::list<TimerSignal> g_timeSignals;
void AddTimer(Uint32 ms, sigc::signal<void>* s) {
TimerSignal _s;
_s.goTime = SDL_GetTicks() + ms;
_s.sig = s;
g_timeSignals.push_back(_s);
}
void RemoveTimer(sigc::signal<void>* s) {
for(std::list<TimerSignal>::iterator i = g_timeSignals.begin();
i!= g_timeSignals.end();) {
if((*i).sig == s)
i = g_timeSignals.erase(i);
else ++i;
}
}
static void ExpireTimers(Uint32 t) {
for(std::list<TimerSignal>::iterator i = g_timeSignals.begin();
i != g_timeSignals.end();) {
if(t >= (*i).goTime)
i = g_timeSignals.erase(i);
else ++i;
}
}
void Draw(void) {
Uint32 t = SDL_GetTicks();
/* Let's abuse it like an update() function also.. */
for(std::list<TimerSignal>::iterator i = g_timeSignals.begin(); i != g_timeSignals.end(); ++i) {
if(t >= (*i).goTime)(*i).sig->emit();
}
ExpireTimers(t);
Screen::Draw();
}
void Init(int screen_width, int screen_height, int ui_width, int ui_height) {
Screen::Init(screen_width, screen_height, ui_width, ui_height);
}
namespace Theme {
static const float BORDER_WIDTH = 2.0;
void DrawHollowRect(const float size[2]) {
GLfloat vertices[] = { 0,0,
0, size[1],
size[0], size[1],
size[0], 0,
BORDER_WIDTH, BORDER_WIDTH,
BORDER_WIDTH, size[1]-BORDER_WIDTH,
size[0]-BORDER_WIDTH, size[1]-BORDER_WIDTH,
size[0]-BORDER_WIDTH, BORDER_WIDTH };
GLubyte indices[] = {
0,1,5,4, 0,4,7,3,
3,7,6,2, 1,2,6,5 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(w, GL_FLOAT, 0, vertices);
glDrawElements(GL_QUADS, 16, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
}
void DrawIndent(const float size[2]) {
GLfloat vertices[] = { 0,0,
0, size[1],
size[0], size[1],
size[0], 0,
BORDER_WIDTH, BORDER_WIDTH,
BORDER_WIDTH, size[1]-BORDER_WIDTH,
size[0]-BORDER_WIDTH, size[1]-BORDER_WIDTH,
size[0]-BORDER_WIDTH, BORDER_WIDTH };
GLubyte indices[] = {
0,1,5,4, 0,4,7,3,
3,7,6,2, 1,2,6,5,
4,5,6,7 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glColor3fv(Color::bgShadow);
glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices);
glColor3f(.6, .6, .6);
glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices+8);
glColor3fv(Color::bg);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, indices+16);
glDisableClientState(GL_VERTEX_ARRAY);
}
void DrawOutdent(const float size[2]) {
GLfloat vertices[] = {0,0,
0, size[1],
size[0], size[1],
size[0], 0,
BORDER_WIDTH, BORDER_WIDTH,
BORDER_WIDTH, size[1]-BORDER_WIDTH,
size[0] - BORDER_WIDTH, size[1] - BORDER_WIDTH,
size[0] - BORDER_WIDTH, BORDER_WIDTH };
GLubyte indices = {
0,1,5,4, 0,4,7,3,
3,7,6,2, 1,2,6,5,
4,5,6,7 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glColor3f(.6, .6, .6);
glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices);
glColor3fv(Color::bgShadow);
glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices+8);
glColor3fv(Color::bg);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, indices+16);
glDisableClientState(GL_VERTEX_ARRAY);
}
}
}