Updated GUI library
This commit is contained in:
+20
-20
@@ -21,6 +21,8 @@
|
||||
*/
|
||||
#include "button.hpp"
|
||||
|
||||
#include "render_text_texture.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
void Button::DrawTo(SDL_Renderer* renderer) {
|
||||
@@ -51,19 +53,9 @@ void Button::SetBackgroundTexture(SDL_Renderer* renderer, SDL_Texture* texture)
|
||||
image.SetClipH(image.GetClipH() / 3);
|
||||
}
|
||||
|
||||
void Button::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string s, SDL_Color color) {
|
||||
//make the surface (from SDL_ttf)
|
||||
SDL_Surface* surf = TTF_RenderText_Solid(font, s.c_str(), color);
|
||||
if (!surf) {
|
||||
throw(std::runtime_error("Failed to create a TTF surface"));
|
||||
}
|
||||
|
||||
void Button::SetText(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string s) {
|
||||
//convert to texture
|
||||
SDL_Texture* text = SDL_CreateTextureFromSurface(renderer, surf);
|
||||
SDL_FreeSurface(surf);
|
||||
if (!text) {
|
||||
throw(std::runtime_error("Failed to create a TTF texture"));
|
||||
}
|
||||
SDL_Texture* text = renderTextTexture(renderer, font, color, s);
|
||||
|
||||
//get the dimensions & rects
|
||||
int x, y, w, h;
|
||||
@@ -87,14 +79,6 @@ void Button::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string s, SDL_
|
||||
SDL_DestroyTexture(text);
|
||||
}
|
||||
|
||||
void Button::SetX(int x) {
|
||||
posX = x;
|
||||
}
|
||||
|
||||
void Button::SetY(int y) {
|
||||
posY = y;
|
||||
}
|
||||
|
||||
Button::State Button::MouseMotion(SDL_MouseMotionEvent const& event) {
|
||||
//if out of bounds, exit
|
||||
if (!CheckBounds(event.x, event.y)) {
|
||||
@@ -156,6 +140,22 @@ Button::State Button::GetState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
int Button::SetX(int i) {
|
||||
return posX = i;
|
||||
}
|
||||
|
||||
int Button::SetY(int i) {
|
||||
return posY = i;
|
||||
}
|
||||
|
||||
int Button::GetX() const {
|
||||
return posX;
|
||||
}
|
||||
|
||||
int Button::GetY() const {
|
||||
return posY;
|
||||
}
|
||||
|
||||
bool Button::CheckBounds(int x, int y) {
|
||||
//return if true (x, y) is within bounds, otherwise return false
|
||||
return !(
|
||||
|
||||
@@ -27,11 +27,6 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
constexpr SDL_Color COLOR_WHITE = {255, 255, 255, 255};
|
||||
constexpr SDL_Color COLOR_RED = {255, 0, 0, 255};
|
||||
constexpr SDL_Color COLOR_ORANGE = {255, 127, 0, 255};
|
||||
constexpr SDL_Color COLOR_BLUE = {0, 0, 255, 255};
|
||||
|
||||
class Button {
|
||||
public:
|
||||
enum State {
|
||||
@@ -46,9 +41,7 @@ public:
|
||||
|
||||
//setup
|
||||
void SetBackgroundTexture(SDL_Renderer*, SDL_Texture*);
|
||||
void SetText(SDL_Renderer*, TTF_Font*, std::string, SDL_Color);
|
||||
void SetX(int x);
|
||||
void SetY(int y);
|
||||
void SetText(SDL_Renderer*, TTF_Font*, SDL_Color, std::string);
|
||||
|
||||
//capture input
|
||||
State MouseMotion(SDL_MouseMotionEvent const&);
|
||||
@@ -59,10 +52,16 @@ public:
|
||||
void SetState(State); //TODO: idle, busy or disabled
|
||||
State GetState();
|
||||
|
||||
//accessors & mutators
|
||||
int SetX(int x);
|
||||
int SetY(int y);
|
||||
int GetX() const;
|
||||
int GetY() const;
|
||||
|
||||
protected:
|
||||
bool CheckBounds(int x, int y);
|
||||
|
||||
Image image;
|
||||
int posX = 0, posY = 0;
|
||||
State state = State::IDLE;
|
||||
int posX = 0, posY = 0;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#config
|
||||
INCLUDES+=.
|
||||
INCLUDES+=. ../utilities
|
||||
LIBS+=
|
||||
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "render_text_texture.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string str) {
|
||||
//make the surface (from SDL_ttf)
|
||||
SDL_Surface* surface = TTF_RenderText_Solid(font, str.c_str(), color);
|
||||
if (!surface) {
|
||||
throw(std::runtime_error("Failed to create a TTF surface"));
|
||||
}
|
||||
|
||||
//convert to texture
|
||||
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||||
|
||||
//cleanup
|
||||
SDL_FreeSurface(surface);
|
||||
|
||||
//check
|
||||
if (!texture) {
|
||||
throw(std::runtime_error("Failed to create a TTF texture"));
|
||||
}
|
||||
|
||||
//NOTE: free the texture yourself
|
||||
return texture;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
#include "SDL2/SDL_ttf.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer*, TTF_Font*, SDL_Color color, std::string);
|
||||
@@ -31,15 +31,18 @@ TextBox::~TextBox() {
|
||||
//
|
||||
}
|
||||
|
||||
void TextBox::DrawTo(SDL_Renderer* renderer, int posX, int posY, int pointSize) {
|
||||
void TextBox::DrawTo(SDL_Renderer* renderer) {
|
||||
int renderY = posY;
|
||||
for (std::list<TextLine>::iterator it = lineList.begin(); it != lineList.end(); it++) {
|
||||
it->DrawTo(renderer, posX, posY);
|
||||
posY += pointSize;
|
||||
it->SetX(posX);
|
||||
it->SetY(renderY);
|
||||
it->DrawTo(renderer);
|
||||
renderY += it->GetPointHeight();
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox::PushLine(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
lineList.emplace_front(renderer, font, str, color);
|
||||
void TextBox::PushLine(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string str) {
|
||||
lineList.emplace_back(renderer, font, color, str, 0, 0);
|
||||
}
|
||||
|
||||
void TextBox::PopLine(int num) {
|
||||
@@ -47,10 +50,26 @@ void TextBox::PopLine(int num) {
|
||||
num < lineList.size() ? num : lineList.size();
|
||||
|
||||
for (int i = 0; i < num; ++i) {
|
||||
lineList.pop_back();
|
||||
lineList.pop_front();
|
||||
}
|
||||
}
|
||||
|
||||
void TextBox::ClearLines() {
|
||||
lineList.clear();
|
||||
}
|
||||
|
||||
int TextBox::SetX(int i) {
|
||||
return posX = i;
|
||||
}
|
||||
|
||||
int TextBox::SetY(int i) {
|
||||
return posY = i;
|
||||
}
|
||||
|
||||
int TextBox::GetX() const {
|
||||
return posX;
|
||||
}
|
||||
|
||||
int TextBox::GetY() const {
|
||||
return posY;
|
||||
}
|
||||
|
||||
@@ -34,12 +34,18 @@ public:
|
||||
TextBox();
|
||||
~TextBox();
|
||||
|
||||
void DrawTo(SDL_Renderer*, int posX, int posY, int pointSize);
|
||||
void DrawTo(SDL_Renderer*);
|
||||
|
||||
void PushLine(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
void PushLine(SDL_Renderer*, TTF_Font*, SDL_Color color, std::string);
|
||||
void PopLine(int num = 1);
|
||||
void ClearLines();
|
||||
|
||||
int SetX(int i);
|
||||
int SetY(int i);
|
||||
int GetX() const;
|
||||
int GetY() const;
|
||||
|
||||
private:
|
||||
std::list<TextLine> lineList;
|
||||
int posX = 0, posY = 0;
|
||||
};
|
||||
@@ -0,0 +1,109 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#include "text_field.hpp"
|
||||
|
||||
#include "render_text_texture.hpp"
|
||||
|
||||
TextField::TextField() {
|
||||
//
|
||||
}
|
||||
|
||||
TextField::~TextField() {
|
||||
SDL_DestroyTexture(texture);
|
||||
}
|
||||
|
||||
void TextField::DrawTo(SDL_Renderer* renderer) {
|
||||
if (!texture) {
|
||||
return;
|
||||
}
|
||||
SDL_Rect dclip = {posX, posY, 0, 0};
|
||||
SDL_QueryTexture(texture, nullptr, nullptr, &dclip.w, &dclip.h);
|
||||
SDL_RenderCopy(renderer, texture, nullptr, &dclip);
|
||||
}
|
||||
|
||||
std::string TextField::PushText(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string s) {
|
||||
text += s;
|
||||
return SetText(renderer, font, color, text);
|
||||
}
|
||||
|
||||
std::string TextField::SetText(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string s) {
|
||||
text = s;
|
||||
SDL_DestroyTexture(texture);
|
||||
if (text.size()) {
|
||||
texture = renderTextTexture(renderer, font, color, text);
|
||||
}
|
||||
else {
|
||||
texture = nullptr;
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
std::string TextField::PopChars(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, int i) {
|
||||
if (text.size() > 0) {
|
||||
text.erase(text.size() - i);
|
||||
}
|
||||
return SetText(renderer, font, color, text);
|
||||
}
|
||||
|
||||
std::string TextField::GetText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
bool TextField::MouseButtonDown(SDL_MouseButtonEvent const& event) {
|
||||
BoundingBox cursorBox = {event.x, event.y, 0, 0};
|
||||
BoundingBox fieldBox = bounds;
|
||||
fieldBox.x += posX;
|
||||
fieldBox.y += posY;
|
||||
return focus = fieldBox.CheckOverlap(cursorBox);
|
||||
}
|
||||
|
||||
BoundingBox TextField::SetBounds(BoundingBox b) {
|
||||
return bounds = b;
|
||||
}
|
||||
|
||||
BoundingBox TextField::GetBounds() {
|
||||
return bounds;
|
||||
}
|
||||
|
||||
bool TextField::SetFocus(bool b) {
|
||||
return focus = b;
|
||||
}
|
||||
|
||||
bool TextField::GetFocus() {
|
||||
return focus;
|
||||
}
|
||||
|
||||
int TextField::SetX(int i) {
|
||||
return posX = i;
|
||||
}
|
||||
|
||||
int TextField::SetY(int i) {
|
||||
return posY = i;
|
||||
}
|
||||
|
||||
int TextField::GetX() const {
|
||||
return posX;
|
||||
}
|
||||
|
||||
int TextField::GetY() const {
|
||||
return posY;
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/* Copyright: (c) Kayne Ruse 2013-2016
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "bounding_box.hpp"
|
||||
|
||||
#include "SDL2/SDL.h"
|
||||
#include "SDL2/SDL_ttf.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class TextField {
|
||||
public:
|
||||
TextField();
|
||||
~TextField();
|
||||
|
||||
void DrawTo(SDL_Renderer*);
|
||||
|
||||
//input
|
||||
std::string PushText(SDL_Renderer*, TTF_Font*, SDL_Color color, std::string);
|
||||
std::string SetText(SDL_Renderer*, TTF_Font*, SDL_Color color, std::string);
|
||||
std::string PopChars(SDL_Renderer*, TTF_Font*, SDL_Color color, int i);
|
||||
|
||||
std::string GetText();
|
||||
|
||||
bool MouseButtonDown(SDL_MouseButtonEvent const& event);
|
||||
|
||||
BoundingBox SetBounds(BoundingBox b);
|
||||
BoundingBox GetBounds();
|
||||
|
||||
bool SetFocus(bool b);
|
||||
bool GetFocus();
|
||||
|
||||
//accessors & mutators
|
||||
int SetX(int i);
|
||||
int SetY(int i);
|
||||
int GetX() const;
|
||||
int GetY() const;
|
||||
|
||||
private:
|
||||
SDL_Texture* texture = nullptr;
|
||||
std::string text;
|
||||
BoundingBox bounds;
|
||||
bool focus = false;
|
||||
int posX = 0, posY = 0;
|
||||
};
|
||||
@@ -21,50 +21,58 @@
|
||||
*/
|
||||
#include "text_line.hpp"
|
||||
|
||||
#include "render_text_texture.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
//make the surface (from SDL_ttf)
|
||||
SDL_Surface* surface = TTF_RenderText_Solid(font, str.c_str(), color);
|
||||
if (!surface) {
|
||||
throw(std::runtime_error("Failed to create a TTF surface"));
|
||||
}
|
||||
|
||||
//convert to texture
|
||||
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||||
|
||||
//cleanup
|
||||
SDL_FreeSurface(surface);
|
||||
|
||||
//check
|
||||
if (!texture) {
|
||||
throw(std::runtime_error("Failed to create a TTF texture"));
|
||||
}
|
||||
|
||||
//NOTE: free the texture yourself
|
||||
return texture;
|
||||
}
|
||||
|
||||
TextLine::TextLine() {
|
||||
//
|
||||
}
|
||||
|
||||
TextLine::TextLine(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string str, int x, int y) {
|
||||
SetText(renderer, font, color, str);
|
||||
posX = x;
|
||||
posY = y;
|
||||
}
|
||||
|
||||
TextLine::~TextLine() {
|
||||
ClearText();
|
||||
}
|
||||
|
||||
void TextLine::DrawTo(SDL_Renderer* renderer, int posX, int posY) {
|
||||
void TextLine::DrawTo(SDL_Renderer* renderer) {
|
||||
SDL_Rect dclip = {posX, posY, 0, 0};
|
||||
SDL_QueryTexture(texture, nullptr, nullptr, &dclip.w, &dclip.h);
|
||||
SDL_RenderCopy(renderer, texture, nullptr, &dclip);
|
||||
}
|
||||
|
||||
void TextLine::SetText(SDL_Renderer* renderer, TTF_Font* font, std::string str, SDL_Color color) {
|
||||
void TextLine::SetText(SDL_Renderer* renderer, TTF_Font* font, SDL_Color color, std::string str) {
|
||||
//just use the above global function
|
||||
SDL_DestroyTexture(texture);
|
||||
texture = renderTextTexture(renderer, font, str, color);
|
||||
texture = renderTextTexture(renderer, font, color, str);
|
||||
pointHeight = TTF_FontHeight(font);
|
||||
}
|
||||
|
||||
void TextLine::ClearText() {
|
||||
SDL_DestroyTexture(texture);
|
||||
pointHeight = 0;
|
||||
}
|
||||
|
||||
int TextLine::SetX(int i) {
|
||||
return posX = i;
|
||||
}
|
||||
|
||||
int TextLine::SetY(int i) {
|
||||
return posY = i;
|
||||
}
|
||||
|
||||
int TextLine::GetX() const {
|
||||
return posX;
|
||||
}
|
||||
|
||||
int TextLine::GetY() const {
|
||||
return posY;
|
||||
}
|
||||
|
||||
int TextLine::GetPointHeight() {
|
||||
return pointHeight;
|
||||
}
|
||||
@@ -26,20 +26,28 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
SDL_Texture* renderTextTexture(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
|
||||
class TextLine {
|
||||
public:
|
||||
TextLine();
|
||||
TextLine(SDL_Renderer* r, TTF_Font* f, std::string s, SDL_Color c)
|
||||
{ SetText(r, f, s, c); }
|
||||
TextLine(SDL_Renderer*, TTF_Font*, SDL_Color, std::string, int x, int y);
|
||||
virtual ~TextLine();
|
||||
|
||||
void DrawTo(SDL_Renderer*, int posX, int posY);
|
||||
void DrawTo(SDL_Renderer*);
|
||||
|
||||
void SetText(SDL_Renderer*, TTF_Font*, std::string, SDL_Color color);
|
||||
void SetText(SDL_Renderer*, TTF_Font*, SDL_Color, std::string);
|
||||
void ClearText();
|
||||
|
||||
//accessors & mutators
|
||||
int SetX(int i);
|
||||
int SetY(int i);
|
||||
int GetX() const;
|
||||
int GetY() const;
|
||||
|
||||
//utility
|
||||
int GetPointHeight();
|
||||
|
||||
protected:
|
||||
SDL_Texture* texture = nullptr;
|
||||
int posX = 0, posY = 0;
|
||||
int pointHeight = 0; //internal use for TextBox
|
||||
};
|
||||
Reference in New Issue
Block a user