Set dimensions, position & alignment separately

This commit is contained in:
2022-05-19 23:31:53 +02:00
parent 9a6ae2c6d9
commit 3934e4777f
6 changed files with 106 additions and 31 deletions

View File

@ -11,7 +11,7 @@
constexpr const char* FT_LOGO_PATH = "resources/Fasttube_Logo-white.bmp";
constexpr const char* AVENIR_FONT_PATH = "resources/Avenir-Book.ttf";
class AMI : public View {
class AMI final : public View {
public:
AMI(SDL_Renderer* renderer);
@ -20,5 +20,8 @@ public:
private:
TTF_Font* avenir;
std::vector<std::unique_ptr<Widget>> widgets;
std::vector<Widget*> widgets;
ImageWidget ft_logo;
TextWidget choose;
};

View File

@ -5,6 +5,7 @@
class View {
public:
View(SDL_Renderer* renderer);
virtual ~View();
virtual void draw() = 0;

View File

@ -6,24 +6,36 @@
#include <optional>
#include <string>
enum class Alignment { LEFT, RIGHT, CENTER };
struct PositionInfo {
int x;
int y;
Alignment align;
};
class Widget {
public:
Widget(SDL_Renderer* renderer, SDL_Rect dest_rect);
Widget(SDL_Renderer* renderer);
virtual ~Widget();
virtual void update_rect(SDL_Rect new_rect);
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);
virtual void draw() = 0;
protected:
void recalculate_rect();
SDL_Renderer* renderer;
SDL_Rect dest_rect;
SDL_Rect rect;
PositionInfo pos;
};
class TextureWidget : public Widget {
public:
TextureWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
std::optional<SDL_Texture*> texture);
TextureWidget(SDL_Renderer* renderer, std::optional<SDL_Texture*> texture);
~TextureWidget();
virtual void draw() override;
@ -31,18 +43,18 @@ public:
void update_texture(SDL_Texture* new_texture);
private:
void update_dimensions_from_texture(SDL_Texture* texture);
std::optional<SDL_Texture*> texture;
};
class ImageWidget : public TextureWidget {
public:
ImageWidget(SDL_Renderer* renderer, SDL_Rect dest_rect,
const std::string& path);
ImageWidget(SDL_Renderer* renderer, const std::string& path);
};
class TextWidget : public TextureWidget {
public:
TextWidget(SDL_Renderer* renderer, SDL_Rect dest_rect, TTF_Font* font,
TextWidget(SDL_Renderer* renderer, TTF_Font* font,
const std::string& initial_text = "");
~TextWidget();