Panel now holds data on how it should be rendered and render just uses that instead of calculating it.
This commit is contained in:
parent
1a3bbaedda
commit
f79e7638c0
5 changed files with 27 additions and 17 deletions
|
@ -16,7 +16,7 @@ void Panel::add(Component child) {
|
||||||
|
|
||||||
void Panel::render() {
|
void Panel::render() {
|
||||||
$dirty = true;
|
$dirty = true;
|
||||||
if($must_clear) $screen.Clear();
|
if(must_clear) $screen.Clear();
|
||||||
Render($screen, $component->Render());
|
Render($screen, $component->Render());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
panel.hpp
16
panel.hpp
|
@ -6,9 +6,12 @@
|
||||||
#include <ftxui/dom/canvas.hpp>
|
#include <ftxui/dom/canvas.hpp>
|
||||||
#include <ftxui/screen/screen.hpp>
|
#include <ftxui/screen/screen.hpp>
|
||||||
#include <ftxui/dom/canvas.hpp>
|
#include <ftxui/dom/canvas.hpp>
|
||||||
|
#include <SFML/Graphics/Color.hpp>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
|
|
||||||
|
const int UI_PANEL_BORDER_PX=5;
|
||||||
|
|
||||||
using ftxui::Renderer, ftxui::Component, ftxui::Element, ftxui::Screen;
|
using ftxui::Renderer, ftxui::Component, ftxui::Element, ftxui::Screen;
|
||||||
|
|
||||||
struct Panel {
|
struct Panel {
|
||||||
|
@ -16,20 +19,25 @@ struct Panel {
|
||||||
int y;
|
int y;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
std::wstring $screenout;
|
bool has_border = false;
|
||||||
|
bool must_clear = true;
|
||||||
|
sf::Color default_bg = sf::Color(0,0,0);
|
||||||
|
sf::Color border_color = sf::Color::Red;
|
||||||
|
int border_px = UI_PANEL_BORDER_PX;
|
||||||
|
|
||||||
bool $dirty = true;
|
bool $dirty = true;
|
||||||
Component $component;
|
Component $component;
|
||||||
Screen $screen;
|
Screen $screen;
|
||||||
bool $must_clear = true;
|
|
||||||
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
|
||||||
|
std::wstring $screenout;
|
||||||
|
|
||||||
Panel(int width, int height, int x, int y, bool must_clear=true) :
|
Panel(int width, int height, int x, int y, bool must_clear=true) :
|
||||||
x(x),
|
x(x),
|
||||||
y(y),
|
y(y),
|
||||||
width(width),
|
width(width),
|
||||||
height(height),
|
height(height),
|
||||||
$screen(Screen(width, height)),
|
must_clear(must_clear),
|
||||||
$must_clear(must_clear)
|
$screen(Screen(width, height))
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
16
render.cpp
16
render.cpp
|
@ -216,18 +216,16 @@ void SFMLRender::render_text(const std::wstring &text, float start_x, float star
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SFMLRender::draw_text(Panel &panel, bool with_border) {
|
void SFMLRender::draw_text(Panel &panel) {
|
||||||
int border_px = with_border ? UI_PANEL_BORDER_PX : 0;
|
|
||||||
|
|
||||||
sf::RectangleShape backing(
|
sf::RectangleShape backing(
|
||||||
sf::Vector2f($ui_bounds.width * panel.width + border_px,
|
sf::Vector2f($ui_bounds.width * panel.width + panel.border_px,
|
||||||
$ui_bounds.height * panel.height + border_px));
|
$ui_bounds.height * panel.height + panel.border_px));
|
||||||
|
|
||||||
backing.setFillColor(sf::Color(0, 0, 0));
|
backing.setFillColor(panel.default_bg);
|
||||||
|
|
||||||
if(with_border) {
|
if(panel.has_border) {
|
||||||
backing.setOutlineColor(color(Value::MID));
|
backing.setOutlineColor(panel.border_color);
|
||||||
backing.setOutlineThickness(border_px);
|
backing.setOutlineThickness(panel.border_px);
|
||||||
}
|
}
|
||||||
|
|
||||||
backing.setPosition(panel.x, panel.y);
|
backing.setPosition(panel.x, panel.y);
|
||||||
|
|
|
@ -23,7 +23,6 @@ const int BASE_MAP_FONT_SIZE=90;
|
||||||
const wchar_t BG_TILE = L'█';
|
const wchar_t BG_TILE = L'█';
|
||||||
const wchar_t UI_BASE_CHAR = L'█';
|
const wchar_t UI_BASE_CHAR = L'█';
|
||||||
const int BG_BOX_OFFSET=5;
|
const int BG_BOX_OFFSET=5;
|
||||||
const int UI_PANEL_BORDER_PX=5;
|
|
||||||
|
|
||||||
enum class Value {
|
enum class Value {
|
||||||
BLACK=0, DARK_DARK, DARK_MID,
|
BLACK=0, DARK_DARK, DARK_MID,
|
||||||
|
@ -59,7 +58,7 @@ struct SFMLRender {
|
||||||
bool resize_map(int new_size, Point &view_port);
|
bool resize_map(int new_size, Point &view_port);
|
||||||
void render_grid(const std::wstring &text, float x, float y);
|
void render_grid(const std::wstring &text, float x, float y);
|
||||||
void render_text(const std::wstring &text, float x, float y);
|
void render_text(const std::wstring &text, float x, float y);
|
||||||
void draw_text(Panel &panel, bool with_border=false);
|
void draw_text(Panel &panel);
|
||||||
void draw_grid(Panel &panel, float map_off_x=0.0f, float map_off_y=0.0f);
|
void draw_grid(Panel &panel, float map_off_x=0.0f, float map_off_y=0.0f);
|
||||||
|
|
||||||
bool poll_event(sf::Event &event) {
|
bool poll_event(sf::Event &event) {
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
TODAY'S GOAL:
|
TODAY'S GOAL:
|
||||||
|
|
||||||
TODO:
|
* Clean up renderer.
|
||||||
* panels and everything except renderer should use character coodinates
|
* panels and everything except renderer should use character coodinates
|
||||||
* panels should know if they're text vs. grid rendered
|
* panels should know if they're text vs. grid rendered
|
||||||
|
* Image -> Text converter.
|
||||||
|
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
* Keep panel unified by implementing border and backing on grids too.
|
||||||
* Can std::any be defaulted to a noop in the events?
|
* Can std::any be defaulted to a noop in the events?
|
||||||
* Save file isn't saving gold.
|
* Save file isn't saving gold.
|
||||||
* Inventory needs to be better, but need some kinds of "weapons" or other loot to get and not just gold.
|
* Inventory needs to be better, but need some kinds of "weapons" or other loot to get and not just gold.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue