diff --git a/source/ui/context.cpp b/source/ui/context.cpp index 9a3346b..3ace489 100644 --- a/source/ui/context.cpp +++ b/source/ui/context.cpp @@ -16,8 +16,8 @@ namespace ui Context::~Context() { - SDL_DestroyRenderer(this->ren); SDL_DestroyTexture(this->fontTex); + SDL_DestroyRenderer(this->ren); } SDL_Texture *Context::CreateTexture(int width, int height) @@ -88,6 +88,12 @@ namespace ui return ( (tmp_x >= x) && (tmp_x < x+w) && (tmp_y >= y) && (tmp_y < y+h) ); } + void Context::Clear(uint32_t color) + { + SDL_SetRenderDrawColor(ren, (color>>16)&0xff, (color>>8)&0xff, color&0xff, (color>>24)&0xff); + SDL_RenderClear(ren); + } + void Context::DrawRect(int x, int y, int w, int h, uint32_t color) { SDL_FRect rect {float(this->offsetX+x), float(this->offsetY+y), float(w), float(h)}; @@ -123,4 +129,9 @@ namespace ui SDL_SetTextureColorMod(this->fontTex, (color>>16)&0xff, (color>>8)&0xff, color&0xff); for (int i=0; i<(int)strlen(text);++i) if (text[i]!=32) DrawChar(x+i*CHR_W, y, text[i]); } + + void Context::Present() + { + SDL_RenderPresent(this->ren); + } } \ No newline at end of file diff --git a/source/ui/context.h b/source/ui/context.h index af29ff1..d46f9af 100644 --- a/source/ui/context.h +++ b/source/ui/context.h @@ -22,12 +22,15 @@ namespace ui bool IsMouseInside(int x, int y, int w, int h); + void Clear(uint32_t color); void DrawRect(int x, int y, int w, int h, uint32_t color); void FillRect(int x, int y, int w, int h, uint32_t color); void DrawLine(int x1, int y1, int x2, int y2, uint32_t color); void DrawChar(int x, int y, char chr, uint32_t color=0xffffffff); void DrawText(int x, int y, const char *text, uint32_t color); + void Present(); + protected: SDL_Window *win; SDL_Renderer *ren; diff --git a/source/ui/window.cpp b/source/ui/window.cpp index f0d7c1e..6093048 100644 --- a/source/ui/window.cpp +++ b/source/ui/window.cpp @@ -26,16 +26,55 @@ namespace ui bool Window::HandleEvents(SDL_Event *e) { switch (e->type) { + case SDL_EVENT_WINDOW_EXPOSED: + case SDL_EVENT_WINDOW_SHOWN: + this->Update(); + break; + case SDL_EVENT_MOUSE_MOTION: input.mouse.x = e->motion.x; input.mouse.y = e->motion.y; + this->Update(); + break; + + case SDL_EVENT_MOUSE_BUTTON_DOWN: + input.mouse.buttons[e->button.button-1] = mbsDown; + this->Update(); + input.mouse.buttons[e->button.button-1] = mbsPressed; + break; + + case SDL_EVENT_MOUSE_BUTTON_UP: + input.mouse.buttons[e->button.button-1] = mbsUp; + this->Update(); + input.mouse.buttons[e->button.button-1] = mbsReleased; + break; - // ... + case SDL_EVENT_MOUSE_WHEEL: + input.mouse.wheel = e->wheel.integer_y; + this->Update(); + input.mouse.wheel = 0; + break; + case SDL_EVENT_KEY_DOWN: + input.keyboard.keyDown = e->key.scancode; + this->Update(); + input.keyboard.keyDown = 0; + break; + + case SDL_EVENT_KEY_UP: + input.keyboard.keyUp = e->key.scancode; + this->Update(); + input.keyboard.keyUp = 0; + break; + default: break; } } + void Window::Update() + { + this->context->Clear(0xff1e1e1e); + } /* MÈTODES ESTATICS */ /* ================ */ diff --git a/source/ui/window.h b/source/ui/window.h index bc8c876..62f9d41 100644 --- a/source/ui/window.h +++ b/source/ui/window.h @@ -10,6 +10,7 @@ namespace ui struct { int x, y; MouseButtonState buttons[3] = {mbsReleased, mbsReleased, mbsReleased}; + int wheel = 0; } mouse; struct { uint8_t keyDown = 0; @@ -25,6 +26,7 @@ namespace ui ~Window(); bool HandleEvents(SDL_Event *e); + virtual void Update(); static void DistributeEvent(SDL_Event *e);