steering-wheel-rpi/include/widgets.h

95 lines
1.9 KiB
C
Raw Normal View History

2022-05-19 20:07:15 +02:00
#pragma once
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <optional>
#include <string>
2022-05-20 02:47:06 +02:00
#include <vector>
2022-05-19 20:07:15 +02:00
enum class Alignment { LEFT, RIGHT, CENTER };
struct PositionInfo {
PositionInfo();
int x;
int y;
Alignment align;
};
2022-05-19 20:07:15 +02:00
class Widget {
public:
Widget(SDL_Renderer* renderer);
2022-05-19 21:30:02 +02:00
virtual ~Widget();
2022-05-19 20:07:15 +02:00
virtual void set_width(int width, bool preserve_aspect_ratio = true);
virtual void set_height(int height, bool preserve_aspect_ratio = true);
virtual void set_position(int x, int y);
virtual void set_alignment(Alignment align);
2022-05-19 20:07:15 +02:00
2022-05-20 02:47:06 +02:00
int get_width();
int get_height();
const PositionInfo& get_position();
2022-05-19 20:07:15 +02:00
virtual void draw() = 0;
protected:
void recalculate_pos();
2022-05-19 20:07:15 +02:00
SDL_Renderer* renderer;
SDL_Rect rect;
PositionInfo pos;
2022-05-19 20:07:15 +02:00
};
class TextureWidget : public Widget {
public:
TextureWidget(SDL_Renderer* renderer, std::optional<SDL_Texture*> texture);
2022-05-19 20:07:15 +02:00
~TextureWidget();
virtual void draw() override;
void update_texture(SDL_Texture* new_texture);
private:
void update_dimensions_from_texture(SDL_Texture* texture);
2022-05-19 20:07:15 +02:00
std::optional<SDL_Texture*> texture;
};
class ImageWidget : public TextureWidget {
public:
ImageWidget(SDL_Renderer* renderer, const std::string& path);
2022-05-19 20:07:15 +02:00
};
class TextWidget : public TextureWidget {
public:
TextWidget(SDL_Renderer* renderer, TTF_Font* font,
2022-05-19 20:07:15 +02:00
const std::string& initial_text = "");
~TextWidget();
void update_text(const std::string& new_text);
protected:
TTF_Font* font;
std::string text;
SDL_Texture* generate_text(const std::string& text);
2022-05-20 02:47:06 +02:00
};
class ListWidget : public Widget {
public:
ListWidget(SDL_Renderer* renderer, int element_height,
Alignment element_alignment);
virtual ~ListWidget();
void add_element(Widget* element);
virtual void draw() override;
protected:
int element_height;
Alignment element_alignment;
std::vector<Widget*> elements;
void place_element(Widget* element, int index);
2022-05-19 20:07:15 +02:00
};