Skip to content

Commit

Permalink
Pongo EtiquetasContadores tras un puntero único
Browse files Browse the repository at this point in the history
  • Loading branch information
autosquash committed Oct 12, 2023
1 parent a0db033 commit 7d240d1
Show file tree
Hide file tree
Showing 5 changed files with 228 additions and 207 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ add_executable(pizzeria
src/vista/cadenas.cpp
src/vista/componentes.cpp
src/vista/etiquetas.cpp
src/vista/etiquetas_contadores.cpp
src/vista/grid.cpp
src/vista/paneles.cpp
src/vista/vista.cpp
Expand Down
190 changes: 13 additions & 177 deletions src/vista/etiquetas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@
#include "../textos.h"
#include "../vista/cadenas.h"
#include "componentes.h"
#include "etiquetas_contadores.h"
#include "vista_basics.h"

#define TAMANO_FUENTE_INFO 36
#define TAMANO_FUENTE_RESULTADO 48

namespace medidas {
constexpr int TAMANO_FUENTE_TITULO_PANELES = 36;
constexpr int TAMANO_FUENTE_ETIQUETAS = 24;
constexpr int DESPLAZAMIENTO_VERTICAL_ETIQUETAS_PIZZAS_PREPARADAS = 50;
constexpr int DESPLAZAMIENTO_VERTICAL_ETIQUETAS_PIZZAS_SERVIDAS = 50;
const sf::Vector2f POSICION_INSTRUCCIONES_O_RESULTADO = {200, 200};
} // namespace medidas

Expand All @@ -36,175 +34,6 @@ sf::Text crearEtiquetaTituloPanel(
return etiqueta;
}

sf::Vector2f obtener_posicion_etiqueta_contador_pizzas(
size_t indice_etiqueta, IndicePanel indice_panel,
int desplazamiento_vertical
) {
const auto pos_panel = obtener_posicion_panel(indice_panel);
const auto pos_x = pos_panel.x + medidas::MARGEN_IZQ_ETIQUETAS;
const auto pos_y = pos_panel.y + medidas::FILA_CONTENIDO_PANEL +
desplazamiento_vertical * indice_etiqueta;
return sf::Vector2f(pos_x, pos_y);
}

/* Crea una etiqueta para un contador (dependiendo del panel tendrá uno u otro
* significado)*/
sf::Text crearEtiquetaContadorPizzas(
IndicePanel indice_panel, //
size_t indice_etiqueta, //
int desplazamiento_vertical, //
const sf::Font &font //
) {
const auto posicion = obtener_posicion_etiqueta_contador_pizzas(
indice_etiqueta, indice_panel, desplazamiento_vertical
);
const int tamano = medidas::TAMANO_FUENTE_ETIQUETAS;
const auto color = sf::Color::White;
const auto fuente = FuenteTexto{tamano, color, font};
return crearEtiqueta(fuente, posicion);
}

sf::Text
crearEtiquetaPizzasPreparadas(const sf::Font &font, size_t indice_etiqueta) {
return crearEtiquetaContadorPizzas(
IndicePanel::PANEL_PREPARADAS, //
indice_etiqueta, //
medidas::DESPLAZAMIENTO_VERTICAL_ETIQUETAS_PIZZAS_PREPARADAS, //
font //
);
}

sf::Text
crearEtiquetaPizzasServidas(const sf::Font &font, size_t indice_etiqueta) {
return crearEtiquetaContadorPizzas(
IndicePanel::PANEL_PEDIDOS, //
indice_etiqueta, //
medidas::DESPLAZAMIENTO_VERTICAL_ETIQUETAS_PIZZAS_SERVIDAS, //
font
);
}
void EtiquetasContadores::setup(const std::vector<TipoPizza> &tp_disponibles) {
int i = 0;
for (auto &tp : tp_disponibles) {
texto_preparadas[tp] = crearEtiquetaPizzasPreparadas(font, i);
if (es_estatico) {
texto_servidas[tp] = crearEtiquetaPizzasServidas(font, i);
}
i++;
}
};

std::string
crea_linea_completitud_pizza(const TipoPizza &tp, int parte, int todo) {
const auto nombre_pizza = tipo_pizza_to_string.at(tp);
std::string s = ( //
nombre_pizza + ": " + //
std::to_string(parte) + //
std::string("/") + //
std::to_string(todo) //
);
return s;
}

/* Crea una string representando un pedido. Una línea por tipo de pizza, con el
* formato TipoPizza: n/m
*/
std::string pedido_to_string(const Pedido &pedido) {
std::string s;
for (auto &par : pedido.contenido) {
s.append(
crea_linea_completitud_pizza(
par.first, par.second.servido, par.second.objetivo
) +
"\n"
);
}
return s;
}

void EtiquetasContadores::actualizar(
const PizzasAContadores &pizzas_a_contadores, //
const Pedidos &pedidos //
) {
for (auto &par : pizzas_a_contadores) {
const auto &tp = par.first;
const auto &contadores_tp = par.second;
auto &nombre_pizza = tipo_pizza_to_string.at(tp);
std::string preparadas =
nombre_pizza + ": " + std::to_string(contadores_tp.preparadas);
texto_preparadas.at(tp).setString(preparadas);
}
if (es_estatico) {
_actualizar_pedido_estatico(pizzas_a_contadores, pedidos);
} else {
_actualizar_pedidos_dinamicos(pedidos);
}
}

float get_bottom(const sf::FloatRect &rect) { //
return rect.top + rect.height;
}

void EtiquetasContadores::_actualizar_pedido_estatico(
const PizzasAContadores &pizzas_a_contadores, //
const Pedidos &pedidos //
) {
assert(pedidos.size() == 1);
const auto &pedido_unico = pedidos.at(0);
for (auto &par : pizzas_a_contadores) {
const auto &tp = par.first;
const auto &contadores_tp = par.second;
std::string servidas = crea_linea_completitud_pizza(
tp, contadores_tp.servidas, pedido_unico.contenido.at(tp).objetivo
);
texto_servidas.at(tp).setString(servidas);
}
}

void EtiquetasContadores::_actualizar_pedidos_dinamicos( //
const Pedidos &pedidos
) {
// Creamos las etiquetas con los textos
const auto tamano_fuente = 22;
texto_pedidos.clear();
for (auto &pedido : pedidos) {
const auto texto = pedido_to_string(pedido);
const auto etiqueta = sf::Text(texto, font, tamano_fuente);
texto_pedidos.push_back(etiqueta);
}
assert(texto_pedidos.size() == pedidos.size());

// Les asignamos su posicion correcta
float pos_x, pos_y;
const auto separacion_vertical = 0;

// Calcula la posicion del primer pedido
const auto pos_panel = obtener_posicion_panel(IndicePanel::PANEL_PEDIDOS);
pos_x = pos_panel.x + medidas::MARGEN_IZQ_ETIQUETAS;
pos_y = pos_panel.y + medidas::FILA_CONTENIDO_PANEL;

for (auto &texto_pedido : texto_pedidos) {
texto_pedido.setPosition(pos_x, pos_y);
// Calcula la posicion del siguiente pedido
const auto g_bounds = texto_pedido.getGlobalBounds();
pos_y = get_bottom(g_bounds) + separacion_vertical;
}
}

void EtiquetasContadores::dibujar(sf::RenderWindow &ventana) const {
for (auto &par : texto_preparadas) {
auto &etiqueta = par.second;
ventana.draw(etiqueta);
}
for (auto &par : texto_servidas) {
auto &etiqueta = par.second;
ventana.draw(etiqueta);
}
for (auto &etiqueta : texto_pedidos) {
ventana.draw(etiqueta);
}
}

sf::Text generar_etiqueta_instrucciones(
const sf::Font &font, //
const std::string &plantilla, //
Expand All @@ -229,24 +58,31 @@ sf::Text generar_etiqueta_resultado(const sf::Font &font) {
return etiqueta;
}

EtiquetasGenerales::EtiquetasGenerales(bool es_estatico, const sf::Font &font)
: font(font) {
contadores = std::make_unique<EtiquetasContadores>(es_estatico, font);
}

EtiquetasGenerales::~EtiquetasGenerales() = default;

void EtiquetasGenerales::setup(
const std::string &instr, //
NumNivel num_nivel, //
const std::vector<TipoPizza> &tp_disponibles, // //
int total_objetivos
const std::vector<TipoPizza> &tp_disponibles, //
int total_objetivos //
) {
const auto instrucciones =
generar_etiqueta_instrucciones(font, instr, num_nivel, total_objetivos);
const auto resultado = generar_etiqueta_resultado(font);
info = {instrucciones, resultado};
contadores.setup(tp_disponibles);
contadores->setup(tp_disponibles);
}

void EtiquetasGenerales::actualizar_y_dibujar_contadores(
const PizzasAContadores &pizzas_a_contadores, //
const Pedidos &pedidos, //
sf::RenderWindow &ventana //
) {
contadores.actualizar(pizzas_a_contadores, pedidos);
contadores.dibujar(ventana);
contadores->actualizar(pizzas_a_contadores, pedidos);
contadores->dibujar(ventana);
}
35 changes: 5 additions & 30 deletions src/vista/etiquetas.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,11 @@
#include "../general.h"
#include "../shared.h"
#include <SFML/Graphics.hpp>
#include <memory>

struct Globales;

namespace {
struct EtiquetasContadores {
private:
const sf::Font &font;
// Indica si el sistema de pedidos es estatico
const bool es_estatico;

void _actualizar_pedidos_dinamicos(const Pedidos &pedidos);
void _actualizar_pedido_estatico(
const PizzasAContadores &pizzas_a_contadores, //
const Pedidos &pedidos //
);

public:
std::map<TipoPizza, sf::Text> texto_preparadas;
std::map<TipoPizza, sf::Text> texto_servidas;
std::vector<sf::Text> texto_pedidos;
EtiquetasContadores(bool es_estatico, const sf::Font &font)
: es_estatico(es_estatico), font(font) {}
void setup(const std::vector<TipoPizza> &tp_disponibles);
void actualizar(
const PizzasAContadores &pizzas_a_contadores, //
const Pedidos &pedidos //
);
void dibujar(sf::RenderWindow &ventana) const;
};
} // namespace
struct EtiquetasContadores;

struct EtiquetasInfo {
sf::Text instrucciones;
Expand All @@ -43,12 +18,12 @@ struct EtiquetasInfo {
struct EtiquetasGenerales {
private:
const sf::Font &font;
EtiquetasContadores contadores;
std::unique_ptr<EtiquetasContadores> contadores;

public:
EtiquetasInfo info;
EtiquetasGenerales(bool es_estatico, const sf::Font &font)
: font(font), contadores(es_estatico, font) {}
EtiquetasGenerales(bool es_estatico, const sf::Font &font);
~EtiquetasGenerales();

void setup(
const std::string &instr, //
Expand Down
Loading

0 comments on commit 7d240d1

Please sign in to comment.