From 61dbb603dc68d0117d7fbfda2599106047a451c8 Mon Sep 17 00:00:00 2001 From: gulliver-madrid <49131885+gulliver-madrid@users.noreply.github.com> Date: Mon, 22 Jan 2024 18:54:20 +0100 Subject: [PATCH] Utiliza ComponenteConFont para pasar las fuentes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Los componentes se estructuran por medio de un árbol jerárquico. --- dev/estructura.md | 18 ++ src/controlador_clicks.cpp | 15 +- src/controlador_clicks.h | 16 +- src/demos/demo_nivel.cpp | 1 - src/globales.cpp | 6 +- src/globales.h | 7 +- src/modelo/modelo_interno.h | 3 +- src/nivel.h | 6 +- src/setup_juego.h | 2 +- src/vista/barras_progreso.cpp | 11 +- src/vista/barras_progreso.h | 9 +- src/vista/botones_app.cpp | 180 ++++++------------ src/vista/botones_app.h | 34 ++-- src/vista/botones_encargar.h | 61 ++++++ src/vista/componente.cpp | 22 ++- src/vista/componente.h | 11 +- src/vista/componentes/barra_progreso.cpp | 21 +- src/vista/componentes/barra_progreso.h | 9 +- src/vista/componentes/boton_con_texto.cpp | 63 ++++-- src/vista/componentes/boton_con_texto.h | 23 ++- src/vista/componentes/boton_data.h | 5 - src/vista/componentes/botones.cpp | 41 ++-- src/vista/componentes/botones.h | 23 ++- src/vista/componentes/componente_old_style.h | 2 +- src/vista/componentes/crear_etiqueta.cpp | 26 +-- src/vista/componentes/crear_etiqueta.h | 22 +-- src/vista/componentes/etiqueta.cpp | 37 ++-- src/vista/componentes/etiqueta.h | 25 +-- src/vista/datos_botones.h | 20 ++ src/vista/enlace_vista.h | 4 +- src/vista/etiquetas/etiquetas.cpp | 16 +- src/vista/etiquetas/etiquetas.h | 10 +- .../etiquetas/etiquetas_barra_estado.cpp | 10 +- src/vista/etiquetas/etiquetas_barra_estado.h | 5 +- src/vista/etiquetas/etiquetas_info.cpp | 12 +- src/vista/etiquetas/etiquetas_info.h | 5 +- src/vista/etiquetas/etiquetas_pedidos.cpp | 6 +- src/vista/etiquetas/etiquetas_preparadas.cpp | 7 +- .../fabrica_etiquetas_preparadas.cpp | 6 +- src/vista/paneles.cpp | 98 +++++++--- src/vista/paneles.h | 37 ++-- src/vista/vista.cpp | 27 ++- src/vista/vista_shared.h | 7 + 43 files changed, 572 insertions(+), 397 deletions(-) create mode 100644 src/vista/botones_encargar.h create mode 100644 src/vista/datos_botones.h diff --git a/dev/estructura.md b/dev/estructura.md index eddaff52..c793485f 100644 --- a/dev/estructura.md +++ b/dev/estructura.md @@ -246,10 +246,21 @@ - vista/basicos_vista.h - vista/componentes/botones.h - vista/componentes/crear_etiqueta.h + - vista/datos_botones.h - vista/botones_app.h: - modelo/dominio.h + - vista/componente.h + - vista/componentes/boton_con_texto.h + - vista/vista_shared.h + +- vista/botones_encargar.h: + - modelo/dominio.h + - templates/helpers.h + - vista/basicos_vista.h - vista/componentes/boton_con_texto.h + - vista/componentes/botones.h + - vista/datos_botones.h - vista/cadenas.cpp: - vista/cadenas.h @@ -268,6 +279,7 @@ - vista/componentes/barra_progreso.h: - shared/font.h + - vista/componente.h - vista/componentes/boton_con_texto.cpp: - vista/componentes/boton_con_texto.h @@ -276,6 +288,7 @@ - vista/componentes/etiqueta.h - vista/componentes/boton_con_texto.h: + - vista/componente.h - vista/componentes/boton_data.h - vista/componentes/componente_old_style.h @@ -288,6 +301,7 @@ - vista/componentes/botones.h: - vista/componentes/boton_con_texto.h + - vista/vista_shared.h - vista/componentes/crear_etiqueta.cpp: - vista/componentes/crear_etiqueta.h @@ -298,6 +312,7 @@ - vista/componentes/etiqueta.cpp: - vista/componentes/etiqueta.h + - juego_assert.h - shared/font.h - vista/componentes/etiqueta.h: @@ -346,6 +361,7 @@ - vista/etiquetas/etiquetas_barra_estado.h: - shared/font.h + - vista/componente.h - vista/etiquetas/etiquetas_info.cpp: - vista/etiquetas/etiquetas_info.h @@ -358,6 +374,7 @@ - vista/etiquetas/etiquetas_info.h: - shared/font.h - shared/num_nivel.h + - vista/componente.h - vista/presentacion_vista.h - vista/etiquetas/etiquetas_pedidos.cpp: @@ -406,6 +423,7 @@ - shared/log_init.h - templates/dibujar_elementos.h - vista/basicos_vista.h + - vista/botones_encargar.h - vista/componentes/etiqueta.h - vista/etiquetas/etiquetas.h diff --git a/src/controlador_clicks.cpp b/src/controlador_clicks.cpp index 7ffae03c..b4c2f6cc 100644 --- a/src/controlador_clicks.cpp +++ b/src/controlador_clicks.cpp @@ -5,9 +5,10 @@ #include "vista/botones_app.h" std::optional ControladorClicks::genera_comando( - const std::function &pulsado, // - const std::shared_ptr &botones, // - const FaseNivel fase_actual // + const std::function boton)> + &pulsado, // + const std::shared_ptr &botones, // + const FaseNivel fase_actual // ) { // Fijos if (pulsado(botones->generales.salir)) { @@ -48,9 +49,11 @@ std::optional ControladorClicks::procesa_click( const FaseNivel fase_actual, // const sf::Vector2i &mouse_pos // ) { - const auto pulsado = [globales, &mouse_pos](const BotonConTexto &boton) { - return globales->detecta_colision(boton, mouse_pos); - }; + const auto pulsado = + [globales, &mouse_pos](const std::shared_ptr boton) { + auto deteccion = globales->detecta_colision(boton, mouse_pos); + return deteccion; + }; std::optional comando = genera_comando( // pulsado, botones, fase_actual ); diff --git a/src/controlador_clicks.h b/src/controlador_clicks.h index 2583ab00..a4095a3b 100644 --- a/src/controlador_clicks.h +++ b/src/controlador_clicks.h @@ -3,21 +3,21 @@ #include "modelo_amplio/comandos.h" #include #include +#include #include enum class FaseNivel; -struct BotonConTexto; +class BotonConTexto; class BotonesApp; -struct ModeloAmplio; -struct Globales; -struct RealizadorBase; +class Globales; -struct ControladorClicks { +class ControladorClicks { private: std::optional genera_comando( - const std::function &pulsado, // - const std::shared_ptr &, // - const FaseNivel fase_actual // + const std::function boton)> + &pulsado, // + const std::shared_ptr &, // + const FaseNivel fase_actual // ); public: diff --git a/src/demos/demo_nivel.cpp b/src/demos/demo_nivel.cpp index b63dd10f..45b5bcc5 100644 --- a/src/demos/demo_nivel.cpp +++ b/src/demos/demo_nivel.cpp @@ -7,7 +7,6 @@ #include int demo_nivel(NumNivelOpcional numero_nivel) { - std::cout << "DEMO NIVEL " << numero_nivel.to_string() << std::endl; int indice_nivel = numero_nivel.get_valor() - 1; const auto globales = std::make_shared(); diff --git a/src/globales.cpp b/src/globales.cpp index d6a39afe..1be544f9 100644 --- a/src/globales.cpp +++ b/src/globales.cpp @@ -2,11 +2,11 @@ #include "vista/componentes/boton_con_texto.h" bool Globales::detecta_colision( - const BotonConTexto &boton, const sf::Vector2i &mouse_pos + std::shared_ptr boton, const sf::Vector2i &mouse_pos ) { - bool hay_colision = boton.colisiona(mouse_pos); + bool hay_colision = boton->colisiona(mouse_pos); if (hay_colision) { - const auto id_boton = boton.get_id(); + const auto id_boton = boton->get_id(); sf::Sound &sound = sounds[id_boton]; if (button_click_buffer) { sound.setBuffer(button_click_buffer.value()); diff --git a/src/globales.h b/src/globales.h index b37087cf..dcc40e21 100644 --- a/src/globales.h +++ b/src/globales.h @@ -5,15 +5,16 @@ #include #include #include +#include #include namespace sf { class Sound; } -struct BotonConTexto; +class BotonConTexto; -struct Globales { +class Globales { private: std::map sounds; @@ -24,6 +25,6 @@ struct Globales { std::optional button_click_buffer; sf::Music music; bool detecta_colision( - const BotonConTexto &boton, const sf::Vector2i &mouse_pos // + std::shared_ptr boton, const sf::Vector2i &mouse_pos ); }; diff --git a/src/modelo/modelo_interno.h b/src/modelo/modelo_interno.h index d63a5593..a9c6f747 100644 --- a/src/modelo/modelo_interno.h +++ b/src/modelo/modelo_interno.h @@ -4,7 +4,8 @@ #include "datos_modelo_interno.h" #include "encargos.h" -struct ModeloInterno { +class ModeloInterno { + public: GestorTiempoJuego gestor_tiempo; modelo::ControlPizzas control_pizzas; Encargos encargos; diff --git a/src/nivel.h b/src/nivel.h index d254d14b..9c97f0f2 100644 --- a/src/nivel.h +++ b/src/nivel.h @@ -8,12 +8,12 @@ #include "vista/grid.h" #include "vista/vista.h" -enum class FaseNivel; class BotonesApp; -struct ControladorClicks; +class ControladorClicks; +class Globales; +enum class FaseNivel; struct DatosNivel; struct EjecucionEnProceso; -struct Globales; namespace modelo { struct ControlPizzas; diff --git a/src/setup_juego.h b/src/setup_juego.h index 7cad8696..ec62b3bf 100644 --- a/src/setup_juego.h +++ b/src/setup_juego.h @@ -4,6 +4,6 @@ #include -struct Globales; +class Globales; bool setup_juego(std::shared_ptr); diff --git a/src/vista/barras_progreso.cpp b/src/vista/barras_progreso.cpp index 70335c2a..b2b05695 100644 --- a/src/vista/barras_progreso.cpp +++ b/src/vista/barras_progreso.cpp @@ -7,11 +7,11 @@ namespace medidas { } // namespace medidas /* Crea y actualiza las barras de progreso */ -std::vector crear_barras_progreso( +std::vector> crear_barras_progreso( const VistaPreparacionPizzas &vista_preparacion_pizzas, const sf::Vector2f &pos_panel, const OptionalFont &font ) { - std::vector vect{}; + std::vector> vect{}; const int pos_x = pos_panel.x + medidas::MARGEN_IZQ_ETIQUETAS; const int pos_y_inicial = pos_panel.y + medidas::FILA_CONTENIDO_PANEL; const int ancho = 300; @@ -28,14 +28,13 @@ std::vector crear_barras_progreso( colores::barra_progreso::RELLENO, colores::barra_progreso::TEXTO, }; - BarraProgresoConNombre bpn( + auto bpn = std::make_shared( dimensiones, // vista_preparacion_pizza.nombre_pizza, // posicion, // - bpn_colors, // - font // + bpn_colors // ); - bpn.actualizar_porcentaje(vista_preparacion_pizza.porcentaje); + bpn->actualizar_porcentaje(vista_preparacion_pizza.porcentaje); vect.push_back(bpn); i++; } diff --git a/src/vista/barras_progreso.h b/src/vista/barras_progreso.h index 72a58d5a..cd414461 100644 --- a/src/vista/barras_progreso.h +++ b/src/vista/barras_progreso.h @@ -2,12 +2,13 @@ #include "componentes/barra_progreso.h" #include "presentaciones.h" +#include #include struct EstadoPreparacionPizzas; -std::vector crear_barras_progreso( // - const VistaPreparacionPizzas &, // - const sf::Vector2f &pos_panel, // - const OptionalFont & // +std::vector> crear_barras_progreso( // + const VistaPreparacionPizzas &, // + const sf::Vector2f &pos_panel, // + const OptionalFont & // ); diff --git a/src/vista/botones_app.cpp b/src/vista/botones_app.cpp index 077765f0..6f6f5fb1 100644 --- a/src/vista/botones_app.cpp +++ b/src/vista/botones_app.cpp @@ -4,38 +4,16 @@ #include "basicos_vista.h" #include "componentes/botones.h" #include "componentes/crear_etiqueta.h" +#include "datos_botones.h" #include #include #include +#include #include // para back_inserter +#include -using std::move; using std::vector; -namespace colores { - namespace botones_encargar { - const auto FONDO = sf::Color::Green; - const auto TEXTO = sf::Color::Black; - } // namespace botones_encargar - namespace botones_despachar { - const auto FONDO = sf::Color::Green; - const auto TEXTO = sf::Color::Black; - } // namespace botones_despachar -} // namespace colores - -namespace medidas { - const auto POSICION_BOTON_EMPEZAR = sf::Vector2f(500, 450); - const auto DIF_VERTICAL_BOTONES_ENCARGAR = 80; -} // namespace medidas - -/////////////////////////////////////////// -// BotonesGenerales -////////////////////////////////////////// - -const vector BotonesGenerales::obtener_todos() { - return {&alternar_grid, &reiniciar, &salir}; -} - namespace { const vector datos_botones_generales = { @@ -53,68 +31,6 @@ namespace { "Empezar", sf::Color::Green, sf::Color::Black }; - vector anadir_fuente( // - const vector &datos, const OptionalFont &font - ) { - vector result; - transform( - datos.begin(), datos.end(), std::back_inserter(result), - [&font](BotonData data) -> BotonDataConFont { // - return {data, font}; - } - ); - return result; - } - - /** - * Crea y posiciona los botones asociados con la accion "encargar". - * @param font: Fuente a utilizar para el texto del boton. - * @param tp_disponibles: Tipos de pizza disponibles para encargar. - * @return TipoPizzaToBoton: Un mapa que asocia cada TipoPizza con un - * BotonConTexto. - */ - TipoPizzaToBoton _crear_botones_encargar( - const OptionalFont &font, // - const dominio::TiposDePizza &tp_disponibles // - ) { - // Constantes para definir la posicion de cada boton - const auto rect_panel = basicos_vista::obtener_rect_panel( // - IndicePanel::PANEL_ENCARGAR - ); - const sf::Vector2f pos_panel = rect_panel.getPosition(); - const auto pos_inicial_relativa_al_panel = sf::Vector2f( - medidas::MARGEN_IZQ_ETIQUETAS, medidas::FILA_CONTENIDO_PANEL - ); - - // Lambda para crear boton data - const auto crear_boton_data = [](dominio::TipoPizza tp) { - assert(has_key(tipo_pizza_to_string, tp)); - const std::string pizza_str = tipo_pizza_to_string.at(tp); - return BotonData{ - pizza_str, // - colores::botones_encargar::FONDO, // - colores::botones_encargar::TEXTO // - }; - }; - - // Crea los botones - TipoPizzaToBoton botones; - vector ordenados; - for (auto tp : tp_disponibles) { - const BotonData boton_data = crear_boton_data(tp); - botones.emplace(tp, BotonConTexto({boton_data, font})); - botones.at(tp).establecer_contenedor(rect_panel); - ordenados.push_back(&botones.at(tp)); - } - - // Posiciona los botones - const int dif_vertical = medidas::DIF_VERTICAL_BOTONES_ENCARGAR; - colocar_botones_en_vertical( - ordenados, pos_inicial_relativa_al_panel, dif_vertical - ); - return botones; - } - TipoPizzaToBoton _crear_botones_despachar( const OptionalFont &font, // const dominio::TiposDePizza &tp_disponibles // @@ -134,18 +50,15 @@ namespace { ); // Crea los botones - vector ordenados; + vector> ordenados; for (auto tp : tp_disponibles) { - botones.emplace( - tp, // - BotonConTexto( - {boton_data_botones_despachar, font}, // - escala // - ) + auto boton = std::make_shared( + boton_data_botones_despachar, escala ); + botones.insert(std::make_pair(tp, boton)); assert(has_key(botones, tp)); - botones.at(tp).establecer_contenedor(rect_panel); - ordenados.push_back(&botones.at(tp)); + botones.at(tp)->establecer_contenedor(rect_panel); + ordenados.push_back(botones.at(tp)); } // Posiciona los botones @@ -170,62 +83,89 @@ namespace { const OptionalFont &font ) { const auto pos_derecha = _obtener_pos_dcha_botones_generales(); - const auto datos_botones = anadir_fuente( // - datos_botones_generales, font - ); - auto botones = crear_botones_alineados_derecha( pos_derecha, // - datos_botones, // + datos_botones_generales, // sf::FloatRect(), // medidas::SEPARACION_HORIZONTAL_ENTRE_BOTONES_GENERALES // ); assert(botones.size() == 3); return { - move(botones.at(2)), - move(botones.at(1)), - move(botones.at(0)), + botones.at(2), + botones.at(1), + botones.at(0), }; } - BotonConTexto _crear_boton_empezar(const OptionalFont &font) { - return BotonConTexto( - {boton_data_empezar, font}, // + std::shared_ptr _crear_boton_empezar() { + return std::make_shared( + boton_data_empezar, // medidas::POSICION_BOTON_EMPEZAR // ); } } // namespace +/////////////////////////////////////////// +// BotonesGenerales +////////////////////////////////////////// + +Botones BotonesGenerales::obtener_todos() const { + return {alternar_grid, reiniciar, salir}; +} +void BotonesGenerales::alinear() { + // TODO: eliminar duplicacion con otro metodo + const auto pos_derecha = _obtener_pos_dcha_botones_generales(); + const auto separacion = + medidas::SEPARACION_HORIZONTAL_ENTRE_BOTONES_GENERALES; + alinear_botones_derecha( + {alternar_grid, reiniciar, salir}, pos_derecha, separacion + ); +} + /////////////////////////////////////////// // BotonesApp ////////////////////////////////////////// /* Establece la variable miembro 'todos', que agrupa todos los botones */ void BotonesApp::_establecer_todos() { - todos = {&empezar}; + todos = {empezar}; const int num_fijos = todos.size(); - for (auto &boton : generales.obtener_todos()) { + for (auto boton : generales.obtener_todos()) { todos.push_back(boton); } - for (auto &[_, boton] : despachar) { - todos.push_back(&boton); + for (auto [_, boton] : despachar) { + // TODO: usar log en vez de iostream + std::cout << "Anadiendo boton despachar con id " << boton->get_id() + << std::endl; + todos.push_back(boton); } - for (auto &[_, boton] : encargar) { - todos.push_back(&boton); + for (auto [_, boton] : encargar) { + std::cout << "Anadiendo boton encargar con id " << boton->get_id() + << std::endl; + todos.push_back(boton); } } /* Crea todos los botones */ BotonesApp::BotonesApp( - const OptionalFont &font, const dominio::TiposDePizza &tp_disponibles + const OptionalFont &font, const dominio::TiposDePizza &tp_disponibles, + TipoPizzaToBoton &botones_encargar ) - : empezar(_crear_boton_empezar(font)), + : empezar(_crear_boton_empezar()), generales(_crear_botones_generales(font)), - encargar(_crear_botones_encargar(font, tp_disponibles)), - despachar(_crear_botones_despachar(font, tp_disponibles)) { + despachar(_crear_botones_despachar(font, tp_disponibles)), + encargar(botones_encargar) { _establecer_todos(); + for (auto btn : todos) { + add_child(btn); + } +} + +void BotonesApp::set_font(const OptionalFont &new_font) { + ComponenteConFont::set_font(new_font); + generales.alinear(); } void BotonesApp::draw( @@ -240,10 +180,12 @@ void BotonesApp::draw( } void BotonesApp::mostrar_botones_nivel(bool nuevo_valor) { + // TODO:ver quien es el responsable de activar los botones encargar, si + // BotoneApp o su panel for (auto &[_, boton] : despachar) { - boton.visible = nuevo_valor; + boton->visible = nuevo_valor; } for (auto &[_, boton] : encargar) { - boton.visible = nuevo_valor; + boton->visible = nuevo_valor; } } diff --git a/src/vista/botones_app.h b/src/vista/botones_app.h index 06e5cebb..2ee733e2 100644 --- a/src/vista/botones_app.h +++ b/src/vista/botones_app.h @@ -1,36 +1,38 @@ #pragma once #include "../modelo/dominio.h" +#include "componente.h" #include "componentes/boton_con_texto.h" - -namespace modelo { - enum class TipoPizza; -} - -using TipoPizzaToBoton = std::map; +#include "vista_shared.h" struct BotonesGenerales { - BotonConTexto alternar_grid; - BotonConTexto reiniciar; - BotonConTexto salir; - const std::vector obtener_todos(); + std::shared_ptr alternar_grid; + std::shared_ptr reiniciar; + std::shared_ptr salir; + void alinear(); + Botones obtener_todos() const; }; -class BotonesApp : public sf::Drawable { +class BotonesApp : public ComponenteConFont { private: - std::vector todos; + std::vector> todos; void _establecer_todos(); public: - BotonConTexto empezar; - TipoPizzaToBoton encargar; + std::shared_ptr empezar; + // Solo para recibir input + TipoPizzaToBoton &encargar; TipoPizzaToBoton despachar; BotonesGenerales generales; - + // TODO: remove optional font del constructor + // ojo: podria haber algun error raro al liberar memoria segun el orden, + // debido a que botones encargar es una referencia BotonesApp( - const OptionalFont &font, const dominio::TiposDePizza &tp_disponibles + const OptionalFont &font, const dominio::TiposDePizza &tp_disponibles, + TipoPizzaToBoton &botones ); void mostrar_botones_nivel(bool nuevo_valor); + virtual void set_font(const OptionalFont &new_font) override; virtual void draw( sf::RenderTarget &target, // sf::RenderStates states // diff --git a/src/vista/botones_encargar.h b/src/vista/botones_encargar.h new file mode 100644 index 00000000..84ec8a12 --- /dev/null +++ b/src/vista/botones_encargar.h @@ -0,0 +1,61 @@ +#pragma once + +#include "../modelo/dominio.h" +#include "../templates/helpers.h" +#include "basicos_vista.h" +#include "componentes/boton_con_texto.h" +#include "componentes/botones.h" +#include "datos_botones.h" +#include +#include + +using std::vector; + +/** + * Crea y posiciona los botones asociados con la accion "encargar". + * @param font: Fuente a utilizar para el texto del boton. + * @param tp_disponibles: Tipos de pizza disponibles para encargar. + * @return TipoPizzaToBoton: Un mapa que asocia cada TipoPizza con un + * BotonConTexto. + */ +TipoPizzaToBoton _crear_botones_encargar( // + const dominio::TiposDePizza &tp_disponibles // +) { + // Constantes para definir la posicion de cada boton + const auto rect_panel = basicos_vista::obtener_rect_panel( // + IndicePanel::PANEL_ENCARGAR + ); + const sf::Vector2f pos_panel = rect_panel.getPosition(); + const auto pos_inicial_relativa_al_panel = sf::Vector2f( + medidas::MARGEN_IZQ_ETIQUETAS, medidas::FILA_CONTENIDO_PANEL + ); + + // Lambda para crear boton data + const auto crear_boton_data = [](dominio::TipoPizza tp) { + assert(has_key(tipo_pizza_to_string, tp)); + const std::string pizza_str = tipo_pizza_to_string.at(tp); + return BotonData{ + pizza_str, // + colores::botones_encargar::FONDO, // + colores::botones_encargar::TEXTO // + }; + }; + + // Crea los botones + TipoPizzaToBoton botones; + vector> ordenados; + for (auto tp : tp_disponibles) { + const BotonData boton_data = crear_boton_data(tp); + BotonData data = {boton_data}; + botones[tp] = std::make_shared(data); + botones.at(tp)->establecer_contenedor(rect_panel); + ordenados.push_back(botones.at(tp)); + } + + // Posiciona los botones + const int dif_vertical = medidas::DIF_VERTICAL_BOTONES_ENCARGAR; + colocar_botones_en_vertical( + ordenados, pos_inicial_relativa_al_panel, dif_vertical + ); + return botones; +} diff --git a/src/vista/componente.cpp b/src/vista/componente.cpp index d9f8d053..b13a7f42 100644 --- a/src/vista/componente.cpp +++ b/src/vista/componente.cpp @@ -2,7 +2,7 @@ namespace { /* Anade la fuente si el componente es componente con font */ - void try_to_add_font(ComponentePtr &comp, OptionalFont &font) { + void try_to_add_font(ComponenteSharedPtr &comp, OptionalFont &font) { auto comp_f = std::dynamic_pointer_cast(comp); if (comp_f) { comp_f->set_font(font); @@ -14,18 +14,30 @@ namespace { // Componente (public) ////////////////////////////////////////// -void Componente::add_child(ComponentePtr child) { // +void Componente::add_child(ComponenteSharedPtr child) { // + assert(child); children.push_back(child); } +void Componente::remove_child(ComponenteSharedPtr child) { // + assert(child); + children.erase( + std::remove_if( + children.begin(), children.end(), + [&child](const ComponenteSharedPtr &comp) { return comp == child; } + ), + children.end() + ); +} -std::vector Componente::get_children() const { return children; } +std::vector Componente::get_children() const { + return children; +} /////////////////////////////////////////// // ComponenteConFont (public) ////////////////////////////////////////// -void ComponenteConFont::add_child(ComponentePtr child) { - +void ComponenteConFont::add_child(ComponenteSharedPtr child) { if (font.exists()) { try_to_add_font(child, font); } diff --git a/src/vista/componente.h b/src/vista/componente.h index fbf7ee4c..2eddd0fa 100644 --- a/src/vista/componente.h +++ b/src/vista/componente.h @@ -7,7 +7,7 @@ #include class Componente; -using ComponentePtr = std::shared_ptr; +using ComponenteSharedPtr = std::shared_ptr; /////////////////////////////////////////// // Componente @@ -15,12 +15,13 @@ using ComponentePtr = std::shared_ptr; class Componente : public sf::Drawable { protected: - std::vector children; + std::vector children; public: virtual ~Componente() = default; - virtual void add_child(ComponentePtr child); - std::vector get_children() const; + virtual void add_child(ComponenteSharedPtr child); + virtual void remove_child(ComponenteSharedPtr child); + std::vector get_children() const; }; /////////////////////////////////////////// @@ -29,6 +30,6 @@ class Componente : public sf::Drawable { class ComponenteConFont : public Componente, public ObjetoConFont { public: - virtual void add_child(ComponentePtr child) override; + virtual void add_child(ComponenteSharedPtr child) override; virtual void set_font(const OptionalFont &new_font) override; }; diff --git a/src/vista/componentes/barra_progreso.cpp b/src/vista/componentes/barra_progreso.cpp index 433b4a77..40e1c4fc 100644 --- a/src/vista/componentes/barra_progreso.cpp +++ b/src/vista/componentes/barra_progreso.cpp @@ -1,7 +1,7 @@ #include "barra_progreso.h" #include "../../templates/dibujar_elementos.h" -#include "etiqueta.h" #include "crear_etiqueta.h" +#include "etiqueta.h" #include /////////////////////////////////////////// @@ -51,15 +51,14 @@ void BarraProgreso::draw( std::shared_ptr BarraProgresoConNombre::_crear_etiqueta( const std::string &texto, // const sf::Vector2f &posicion_barra, // - const sf::Color &color_texto, // - const OptionalFont &font // + const sf::Color &color_texto // ) { return crear_etiqueta( - texto, // - 24, // - color_texto, // - font, // - {posicion_barra.x + 20, posicion_barra.y + 5} // + texto, // + 24, // + color_texto, // + {posicion_barra.x + 20, posicion_barra.y + 5}, // + std::string("etiqueta barra progreso") ); } @@ -67,11 +66,11 @@ BarraProgresoConNombre::BarraProgresoConNombre( const sf::Vector2f &dimensiones, // const std::string &texto, // const sf::Vector2f &posicion, // - const BPNColors &bpn_colors, // - const OptionalFont &font // + const BPNColors &bpn_colors // ) : bp(dimensiones, posicion, bpn_colors.color_pair), - etiqueta(_crear_etiqueta(texto, posicion, bpn_colors.color_texto, font)) { + etiqueta(_crear_etiqueta(texto, posicion, bpn_colors.color_texto)) { + add_child(etiqueta); } void BarraProgresoConNombre::actualizar_porcentaje(int porcentaje) { // diff --git a/src/vista/componentes/barra_progreso.h b/src/vista/componentes/barra_progreso.h index e09dbfc1..d27e9866 100644 --- a/src/vista/componentes/barra_progreso.h +++ b/src/vista/componentes/barra_progreso.h @@ -1,6 +1,7 @@ #pragma once #include "../../shared/font.h" +#include "../componente.h" #include #include #include @@ -52,15 +53,14 @@ struct BPNColors { sf::Color color_texto; }; -struct BarraProgresoConNombre : public sf::Drawable { +class BarraProgresoConNombre : public ComponenteConFont { private: std::shared_ptr etiqueta; BarraProgreso bp; static std::shared_ptr _crear_etiqueta( const std::string &texto, // const sf::Vector2f &posicion_barra, // - const sf::Color &color_texto, // - const OptionalFont & // + const sf::Color &color_texto // ); public: @@ -68,8 +68,7 @@ struct BarraProgresoConNombre : public sf::Drawable { const sf::Vector2f &dimensiones, // const std::string &texto, // const sf::Vector2f &posicion, // - const BPNColors &bpn_colors, // - const OptionalFont & // + const BPNColors &bpn_colors // ); void actualizar_porcentaje(int porcentaje); virtual void draw( diff --git a/src/vista/componentes/boton_con_texto.cpp b/src/vista/componentes/boton_con_texto.cpp index 5ab37746..bff35203 100644 --- a/src/vista/componentes/boton_con_texto.cpp +++ b/src/vista/componentes/boton_con_texto.cpp @@ -1,9 +1,10 @@ #include "boton_con_texto.h" #include "../../templates/dibujar_elementos.h" -#include "etiqueta.h" #include "crear_etiqueta.h" +#include "etiqueta.h" #include #include +#include namespace medidas { constexpr int MARGEN_BOTON = 20; @@ -132,6 +133,25 @@ void BotonConTexto::_actualizar_posicion_absoluta() { _etiqueta->set_position(pos_etiqueta.x, pos_etiqueta.y); } +void BotonConTexto::resize() { + const auto margen_ambos_lados = get_margen_ambos_lados(); + const sf::FloatRect rect_etiqueta = _etiqueta->get_global_bounds(); + + _forma.setSize(sf::Vector2f( + rect_etiqueta.width + margen_ambos_lados, + rect_etiqueta.height + margen_ambos_lados + )); +} + +int BotonConTexto::get_margen_ambos_lados() { + // La escala del margen es proporcional al cuadrado de la escala del boton + const auto escala = this->_escala; + const int margen = medidas::MARGEN_BOTON * (escala * escala); + const auto margen_ambos_lados = margen * 2; + return margen_ambos_lados; +} + +// TODO: corregir titulos secciones //////// Metodos publicos /** @@ -146,29 +166,25 @@ void BotonConTexto::_actualizar_posicion_absoluta() { * @param escala Factor de escala para el tamano del boton y del texto. */ BotonConTexto::BotonConTexto( - const BotonDataConFont &boton_data, // - double escala // + const BotonData boton_data, // + double escala // ) : BotonConTexto() { this->_escala = escala; - // La escala del margen es proporcional al cuadrado de la escala del boton - const int margen = medidas::MARGEN_BOTON * (escala * escala); - const auto margen_ambos_lados = margen * 2; // Primero creamos la etiqueta para usar sus limites en el Rect _etiqueta = crear_etiqueta( - boton_data.data.texto, // - medidas::TAMANO_TEXTO_BOTONES * escala, // - boton_data.data.color_texto, // - boton_data.font // + boton_data.texto, // + medidas::TAMANO_TEXTO_BOTONES * escala, // + boton_data.color_texto, // + Vector2f_CERO, // + "etiqueta boton con texto " + boton_data.texto // ); - const sf::FloatRect rect_etiqueta = _etiqueta->get_global_bounds(); + add_child(_etiqueta); + _color_fondo = boton_data.color_fondo; - _forma.setSize(sf::Vector2f( - rect_etiqueta.width + margen_ambos_lados, - rect_etiqueta.height + margen_ambos_lados - )); - _forma.setFillColor(boton_data.data.color_fondo); + resize(); + _forma.setFillColor(_color_fondo); }; /** @@ -186,10 +202,10 @@ BotonConTexto::BotonConTexto( * @param escala Factor de escala para el tamano del boton y del texto. */ BotonConTexto::BotonConTexto( - const BotonDataConFont &boton_data, // - const sf::Vector2f &posicion, // - Align align, // - double escala // + const BotonData boton_data, // + const sf::Vector2f &posicion, // + Align align, // + double escala // ) : BotonConTexto(boton_data, escala) { establecer_posicion(posicion, align); @@ -287,6 +303,8 @@ void BotonConTexto::draw( ) const { if (!visible) return; + std::cout << "Dibujando boton con texto cuya etiqueta es " + << _etiqueta->nombre << std::endl; dibujar_elementos(target, std::make_tuple(_forma, *_etiqueta)); } @@ -336,3 +354,8 @@ size_t BotonConTexto::get_id() const { // bool BotonConTexto::esta_activo() const { // return _activo; } + +void BotonConTexto::set_font(const OptionalFont &new_font) { + ComponenteConFont::set_font(new_font); + resize(); +} diff --git a/src/vista/componentes/boton_con_texto.h b/src/vista/componentes/boton_con_texto.h index 689f2c85..293ca907 100644 --- a/src/vista/componentes/boton_con_texto.h +++ b/src/vista/componentes/boton_con_texto.h @@ -1,5 +1,6 @@ #pragma once +#include "../componente.h" #include "boton_data.h" #include "componente_old_style.h" #include @@ -14,7 +15,7 @@ namespace sf { struct Posicionamiento; -class BotonConTexto : public ComponenteOldStyle { +class BotonConTexto : public ComponenteOldStyle, public ComponenteConFont { private: static size_t _proximo_id; std::optional _id; @@ -22,6 +23,9 @@ class BotonConTexto : public ComponenteOldStyle { sf::RectangleShape _forma; std::shared_ptr _etiqueta; + // TODO: ver si es necesario + sf::Color _color_fondo = sf::Color::White; + std::unique_ptr posicionamiento; // Solo puede modificarse la escala en la construccion double _escala = 1; @@ -30,18 +34,20 @@ class BotonConTexto : public ComponenteOldStyle { BotonConTexto(); void _asignar_id(); void _actualizar_posicion_absoluta(); + void resize(); + int BotonConTexto::get_margen_ambos_lados(); public: bool visible = false; BotonConTexto( - const BotonDataConFont &boton_data, // - double escala = 1 // + const BotonData boton_data, // + double escala = 1 // ); BotonConTexto( - const BotonDataConFont &boton_data, // - const sf::Vector2f &posicion, // - Align align = Align::Left, // - double escala = 1 // + const BotonData boton_data, // + const sf::Vector2f &posicion, // + Align align = Align::Left, // + double escala = 1 // ); // Eliminamos operadores de copia y asignacion @@ -71,11 +77,12 @@ class BotonConTexto : public ComponenteOldStyle { return _forma.getGlobalBounds(); } void actualizar(); + virtual void set_font(const OptionalFont &new_font) override; virtual void draw( sf::RenderTarget &target, // sf::RenderStates states // ) const override; - + // TODO: reorganizar miembros private: std::optional colorBotonActivo; }; diff --git a/src/vista/componentes/boton_data.h b/src/vista/componentes/boton_data.h index 4f9d67cd..7f658231 100644 --- a/src/vista/componentes/boton_data.h +++ b/src/vista/componentes/boton_data.h @@ -10,8 +10,3 @@ struct BotonData { sf::Color color_fondo; sf::Color color_texto = sf::Color::White; }; - -struct BotonDataConFont { - BotonData data; - const OptionalFont &font; -}; diff --git a/src/vista/componentes/botones.cpp b/src/vista/componentes/botones.cpp index dd5b1b90..e35bcfc9 100644 --- a/src/vista/componentes/botones.cpp +++ b/src/vista/componentes/botones.cpp @@ -5,15 +5,14 @@ /* * Crea un grupo de botones en un contenedor. */ -std::vector _crear_botones( // - const std::vector &datos_botones, - const sf::FloatRect &contenedor +Botones _crear_botones( // + const std::vector &datos_botones, const sf::FloatRect &contenedor ) { // Crea los botones - std::vector botones; + Botones botones; for (auto &dato : datos_botones) { - botones.emplace_back(dato); - botones.back().establecer_contenedor(contenedor); + botones.push_back(std::make_shared(dato)); + botones.back()->establecer_contenedor(contenedor); } return botones; } @@ -32,10 +31,10 @@ std::vector _crear_botones( // * - posicion_inicial: posicion del primer boton en la hilera. * - separacion: espacio horizontal entre los botones. */ -void _alinear_botones_derecha( - const std::vector &botones, // - const sf::Vector2f &posicion_inicial, // - int separacion // +void alinear_botones_derecha( + const Botones &botones, // + const sf::Vector2f &posicion_inicial, // + int separacion // ) { int next_pos_x = posicion_inicial.x; for (auto &boton : botones) { @@ -50,18 +49,14 @@ void _alinear_botones_derecha( * Crea una hilera de botones alienados a la derecha. El orden en el que se * reciben los datos y se anaden al vector de botones es de derecha a izquierda. */ -std::vector crear_botones_alineados_derecha( - const sf::Vector2f &posicion_inicial, // - const std::vector &datos_botones, // - const sf::FloatRect &contenedor, // - int separacion // +Botones crear_botones_alineados_derecha( + const sf::Vector2f &posicion_inicial, // + const std::vector &datos_botones, // + const sf::FloatRect &contenedor, // + int separacion // ) { auto botones = _crear_botones(datos_botones, contenedor); - std::vector botones_ptr; - for (auto &boton : botones) { - botones_ptr.push_back(&boton); - } - _alinear_botones_derecha(botones_ptr, posicion_inicial, separacion); + alinear_botones_derecha(botones, posicion_inicial, separacion); return botones; } @@ -91,9 +86,9 @@ sf::Vector2f _mover_vertical( // * la del siguiente. */ void colocar_botones_en_vertical( - const std::vector &botones, // - const sf::Vector2f &pos_inicial, // - float diferencia // + const std::vector> &botones, // + const sf::Vector2f &pos_inicial, // + float diferencia // ) { size_t i = 0; for (auto &boton : botones) { diff --git a/src/vista/componentes/botones.h b/src/vista/componentes/botones.h index 529dd823..3816023c 100644 --- a/src/vista/componentes/botones.h +++ b/src/vista/componentes/botones.h @@ -1,16 +1,23 @@ #pragma once +#include "../vista_shared.h" #include "boton_con_texto.h" -std::vector crear_botones_alineados_derecha( - const sf::Vector2f &posicion_inicial, // - const std::vector &datos_botones, // - const sf::FloatRect &contenedor = sf::FloatRect(), // - int separacion = 0 // +void alinear_botones_derecha( + const Botones &botones, // + const sf::Vector2f &posicion_inicial, // + int separacion // +); + +Botones crear_botones_alineados_derecha( + const sf::Vector2f &posicion_inicial, // + const std::vector &datos_botones, // + const sf::FloatRect &contenedor = sf::FloatRect(), // + int separacion = 0 // ); void colocar_botones_en_vertical( - const std::vector &botones, // - const sf::Vector2f &pos_inicial, // - float diferencia // + const std::vector> &botones, // + const sf::Vector2f &pos_inicial, // + float diferencia // ); diff --git a/src/vista/componentes/componente_old_style.h b/src/vista/componentes/componente_old_style.h index e7e3891e..2ce02b47 100644 --- a/src/vista/componentes/componente_old_style.h +++ b/src/vista/componentes/componente_old_style.h @@ -8,7 +8,7 @@ enum class Align { // Right }; -class ComponenteOldStyle : public sf::Drawable { +class ComponenteOldStyle { public: void virtual establecer_contenedor(const sf::FloatRect &) = 0; }; diff --git a/src/vista/componentes/crear_etiqueta.cpp b/src/vista/componentes/crear_etiqueta.cpp index 9d559af9..7bfd0c7a 100644 --- a/src/vista/componentes/crear_etiqueta.cpp +++ b/src/vista/componentes/crear_etiqueta.cpp @@ -6,30 +6,30 @@ std::shared_ptr crear_etiqueta( const std::string &texto, // int tamano_fuente, // - const OptionalFont &font // + const std::string nombre // ) { - return std::make_shared(texto, tamano_fuente, font); + return std::make_shared(texto, tamano_fuente, nombre); } std::shared_ptr crear_etiqueta( - const std::string &texto, // - int tamano_fuente, // - const sf::Color &color, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + int tamano_fuente, // + const sf::Color &color, // + const sf::Vector2f &posicion, // + const std::string nombre // ) { return std::make_shared( - texto, tamano_fuente, color, font, posicion + texto, tamano_fuente, color, posicion, nombre ); } /* Sobrecarga para usar EstiloTexto */ std::shared_ptr crear_etiqueta( - const std::string &texto, // - const EstiloTexto &estilo, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + const EstiloTexto &estilo, // + const sf::Vector2f &posicion, // + const std::string nombre // ) { - return std::make_shared(texto, estilo, font, posicion); + return std::make_shared(texto, estilo, posicion, nombre); } diff --git a/src/vista/componentes/crear_etiqueta.h b/src/vista/componentes/crear_etiqueta.h index 4b6f9fdd..3b14abc7 100644 --- a/src/vista/componentes/crear_etiqueta.h +++ b/src/vista/componentes/crear_etiqueta.h @@ -1,4 +1,3 @@ - #pragma once #include "../../shared/font.h" @@ -27,22 +26,23 @@ const auto Vector2f_CERO = sf::Vector2f(0, 0); std::shared_ptr crear_etiqueta( const std::string &texto, // int tamano_fuente, // - const OptionalFont & // + const std::string nombre // ); std::shared_ptr crear_etiqueta( - const std::string &texto, // - int tamano_fuente, // - const sf::Color &color, // - const OptionalFont &font, // - const sf::Vector2f &posicion = Vector2f_CERO // + const std::string &texto, // + int tamano_fuente, // + const sf::Color &color, // + const sf::Vector2f &posicion, // + const std::string nombre // ); +// const sf::Vector2f &posicion = Vector2f_CERO // /* Sobrecarga para usar EstiloTexto */ std::shared_ptr crear_etiqueta( - const std::string &texto, // - const EstiloTexto &estilo, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + const EstiloTexto &estilo, // + const sf::Vector2f &posicion, // + const std::string nombre // ); diff --git a/src/vista/componentes/etiqueta.cpp b/src/vista/componentes/etiqueta.cpp index d0865b3c..92d34b61 100644 --- a/src/vista/componentes/etiqueta.cpp +++ b/src/vista/componentes/etiqueta.cpp @@ -1,38 +1,37 @@ #include "etiqueta.h" +#include "../../juego_assert.h" #include "../../shared/font.h" Etiqueta::Etiqueta( const std::string &texto, // int tamano_fuente, // - const OptionalFont &font // + const std::string nombre // ) { this->font = font; etiqueta.setString(texto); - if (font.exists()) { - etiqueta.setFont(*font.get_pointer()); - etiqueta.setCharacterSize(tamano_fuente); - }; + etiqueta.setCharacterSize(tamano_fuente); + this->nombre = nombre; } Etiqueta::Etiqueta( - const std::string &texto, // - int tamano_fuente, // - const sf::Color &color, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + int tamano_fuente, // + const sf::Color &color, // + const sf::Vector2f &posicion, // + const std::string nombre // ) - : Etiqueta(texto, tamano_fuente, font) { + : Etiqueta(texto, tamano_fuente, nombre) { etiqueta.setFillColor(color); etiqueta.setPosition(posicion); } Etiqueta::Etiqueta( - const std::string &texto, // - const EstiloTexto &estilo, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + const EstiloTexto &estilo, // + const sf::Vector2f &posicion, // + const std::string nombre // ) - : Etiqueta(texto, estilo.tamano, estilo.color, font, posicion) {} + : Etiqueta(texto, estilo.tamano, estilo.color, posicion, nombre) {} void Etiqueta::actualizar_texto(const std::string &texto) { // etiqueta.setString(texto); @@ -43,10 +42,14 @@ sf::FloatRect Etiqueta::get_global_bounds() { // void Etiqueta::set_position(float x, float y) { // etiqueta.setPosition(x, y); } +void Etiqueta::set_font(const OptionalFont &new_font) { + ComponenteConFont::set_font(new_font); + etiqueta.setFont(*new_font.get_pointer()); +} void Etiqueta::draw( sf::RenderTarget &target, // sf::RenderStates states // ) const { - assert(font.exists()); + juego_assert(font.exists(), "Falta la fuente en " + nombre); target.draw(etiqueta); }; diff --git a/src/vista/componentes/etiqueta.h b/src/vista/componentes/etiqueta.h index 29d12e18..d3942ae9 100644 --- a/src/vista/componentes/etiqueta.h +++ b/src/vista/componentes/etiqueta.h @@ -15,30 +15,33 @@ class Etiqueta : public ComponenteConFont { sf::Text etiqueta; public: + // nombre a propositos de debug + std::string nombre; Etiqueta( const std::string &texto, // int tamano_fuente, // - const OptionalFont &font // + const std::string nombre // ); Etiqueta( - const std::string &texto, // - int tamano_fuente, // - const sf::Color &color, // - const OptionalFont &font, // - const sf::Vector2f &posicion // - + const std::string &texto, // + int tamano_fuente, // + const sf::Color &color, // + const sf::Vector2f &posicion, // + const std::string nombre // ); + /* Sobrecarga para usar EstiloTexto */ Etiqueta( - const std::string &texto, // - const EstiloTexto &estilo, // - const OptionalFont &font, // - const sf::Vector2f &posicion // + const std::string &texto, // + const EstiloTexto &estilo, // + const sf::Vector2f &posicion, // + const std::string nombre // ); void actualizar_texto(const std::string &texto); sf::FloatRect get_global_bounds(); void set_position(float x, float y); + virtual void set_font(const OptionalFont &new_font) override; virtual void draw( sf::RenderTarget &target, // sf::RenderStates states // diff --git a/src/vista/datos_botones.h b/src/vista/datos_botones.h new file mode 100644 index 00000000..d4397c97 --- /dev/null +++ b/src/vista/datos_botones.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +namespace colores { + namespace botones_encargar { + const auto FONDO = sf::Color::Green; + const auto TEXTO = sf::Color::Black; + } // namespace botones_encargar + namespace botones_despachar { + const auto FONDO = sf::Color::Green; + const auto TEXTO = sf::Color::Black; + } // namespace botones_despachar +} // namespace colores + +namespace medidas { + const auto POSICION_BOTON_EMPEZAR = sf::Vector2f(500, 450); + const auto DIF_VERTICAL_BOTONES_ENCARGAR = 80; +} // namespace medidas diff --git a/src/vista/enlace_vista.h b/src/vista/enlace_vista.h index 35216b95..6a9aef6e 100644 --- a/src/vista/enlace_vista.h +++ b/src/vista/enlace_vista.h @@ -7,9 +7,9 @@ #include struct ActivacionBotones; -struct ModeloInterno; -class Vista; class BotonesApp; +class ModeloInterno; +class Vista; namespace sf { class RenderTarget; diff --git a/src/vista/etiquetas/etiquetas.cpp b/src/vista/etiquetas/etiquetas.cpp index 1429ce9f..f4b68a9f 100644 --- a/src/vista/etiquetas/etiquetas.cpp +++ b/src/vista/etiquetas/etiquetas.cpp @@ -1,8 +1,8 @@ #include "etiquetas.h" #include "../basicos_vista.h" #include "../cadenas.h" -#include "../componentes/etiqueta.h" #include "../componentes/crear_etiqueta.h" +#include "../componentes/etiqueta.h" #include "../presentacion_vista.h" #include "etiquetas_barra_estado.h" #include "etiquetas_info.h" @@ -23,12 +23,13 @@ namespace estilos { // EtiquetasGenerales ////////////////////////////////////////// -EtiquetasGenerales::EtiquetasGenerales(const OptionalFont &font) { - set_font(font); +EtiquetasGenerales::EtiquetasGenerales() { etiquetas_pedidos = std::make_shared(); - info = std::make_unique(font); - barra_estado = std::make_unique(font); + info = std::make_shared(); + barra_estado = std::make_shared(); add_child(etiquetas_pedidos); + add_child(info); + add_child(barra_estado); } EtiquetasGenerales::~EtiquetasGenerales() = default; @@ -95,5 +96,8 @@ std::shared_ptr FabricaEtiquetasTituloPanel::crearEtiquetaTituloPanel( ) const { const auto posicion = get_posicion_etiqueta_titulo_panel(posicion_panel); const auto texto = interpolar_unicode(texto_crudo); - return crear_etiqueta(texto, estilos::TITULO_PANEL, font, posicion); + return crear_etiqueta( + texto, estilos::TITULO_PANEL, posicion, + "etiqueta titulo panel " + texto_crudo + ); } diff --git a/src/vista/etiquetas/etiquetas.h b/src/vista/etiquetas/etiquetas.h index 21d57e3f..94755cdc 100644 --- a/src/vista/etiquetas/etiquetas.h +++ b/src/vista/etiquetas/etiquetas.h @@ -21,8 +21,8 @@ class Etiqueta; class EtiquetasBarraEstado; class EtiquetasPreparadas; class EtiquetasPedidos; -struct EtiquetasInfo; -struct Globales; +class Globales; +class EtiquetasInfo; /////////////////////////////////////////// // EtiquetasGenerales @@ -33,11 +33,11 @@ struct EtiquetasGenerales : public ComponenteConFont { private: // std::shared_ptr etiquetas_preparadas; std::shared_ptr etiquetas_pedidos; - std::unique_ptr info; - std::unique_ptr barra_estado; + std::shared_ptr info; + std::shared_ptr barra_estado; public: - EtiquetasGenerales(const OptionalFont &); + EtiquetasGenerales(); EtiquetasGenerales(const EtiquetasGenerales &) = delete; EtiquetasGenerales &operator=(const EtiquetasGenerales &) = delete; ~EtiquetasGenerales(); diff --git a/src/vista/etiquetas/etiquetas_barra_estado.cpp b/src/vista/etiquetas/etiquetas_barra_estado.cpp index e6bd799a..f7b02fde 100644 --- a/src/vista/etiquetas/etiquetas_barra_estado.cpp +++ b/src/vista/etiquetas/etiquetas_barra_estado.cpp @@ -4,8 +4,8 @@ #include "../../tiempo.h" #include "../basicos_vista.h" #include "../cadenas.h" -#include "../componentes/etiqueta.h" #include "../componentes/crear_etiqueta.h" +#include "../componentes/etiqueta.h" #include "../presentador.h" #include #include @@ -13,8 +13,7 @@ const auto crear_texto = presentador::crea_texto_etiqueta_barra_estado; -EtiquetasBarraEstado::EtiquetasBarraEstado(const OptionalFont &font) - : ObjetoConFont(font) { +EtiquetasBarraEstado::EtiquetasBarraEstado() { const EstiloTexto estilo = { medidas::TAMANO_TEXTO_GRANDE, sf::Color::Yellow }; @@ -22,7 +21,10 @@ EtiquetasBarraEstado::EtiquetasBarraEstado(const OptionalFont &font) const sf::Vector2f posicion = { medidas::MARGEN_IZQ_PANELES, medidas::FILA_BARRA_ESTADO }; - etiqueta = crear_etiqueta(texto_inicial, estilo, font, posicion); + etiqueta = crear_etiqueta( + texto_inicial, estilo, posicion, "etiqueta barra estado" + ); + add_child(etiqueta); } void EtiquetasBarraEstado::actualizar( diff --git a/src/vista/etiquetas/etiquetas_barra_estado.h b/src/vista/etiquetas/etiquetas_barra_estado.h index ed053c1c..cae8be54 100644 --- a/src/vista/etiquetas/etiquetas_barra_estado.h +++ b/src/vista/etiquetas/etiquetas_barra_estado.h @@ -1,6 +1,7 @@ #pragma once #include "../../shared/font.h" +#include "../componente.h" #include namespace sf { @@ -11,13 +12,13 @@ namespace sf { class Etiqueta; -class EtiquetasBarraEstado : public ObjetoConFont, public sf::Drawable { +class EtiquetasBarraEstado : public ComponenteConFont { private: std::shared_ptr etiqueta; public: - EtiquetasBarraEstado(const OptionalFont &); + EtiquetasBarraEstado(); void actualizar(const sf::Time &, const sf::Time &); virtual void draw( sf::RenderTarget &target, // diff --git a/src/vista/etiquetas/etiquetas_info.cpp b/src/vista/etiquetas/etiquetas_info.cpp index 10e2520b..83cc7ad4 100644 --- a/src/vista/etiquetas/etiquetas_info.cpp +++ b/src/vista/etiquetas/etiquetas_info.cpp @@ -27,17 +27,17 @@ namespace estilos { // FabricaEtiquetasInfo ////////////////////////////////////////// -struct FabricaEtiquetasInfo : public ObjetoConFont { +struct FabricaEtiquetasInfo { private: std::shared_ptr crear_etiqueta_info( const std::string &texto, const EstiloTexto &estilo ) const { const auto posicion = medidas::POSICION_INSTRUCCIONES_O_RESULTADO; - return crear_etiqueta(texto, estilo, font, posicion); + return crear_etiqueta(texto, estilo, posicion, "etiqueta info"); } public: - FabricaEtiquetasInfo(const OptionalFont &font) : ObjetoConFont(font) {} + FabricaEtiquetasInfo() {} std::shared_ptr crear_etiqueta_instrucciones( const std::string &plantilla, // const NumNivelOpcional &num_nivel // @@ -61,17 +61,19 @@ struct FabricaEtiquetasInfo : public ObjetoConFont { // EtiquetasInfo ////////////////////////////////////////// -EtiquetasInfo::EtiquetasInfo(const OptionalFont &font) : ObjetoConFont(font) {} +EtiquetasInfo::EtiquetasInfo() {} void EtiquetasInfo::setup( const std::string &instr, // const NumNivelOpcional &num_nivel // ) { - const auto fabrica = FabricaEtiquetasInfo(font); + const auto fabrica = FabricaEtiquetasInfo(); LOG(info) << "Construyendo instrucciones" << std::endl; instrucciones = fabrica.crear_etiqueta_instrucciones(instr, num_nivel); LOG(info) << "Construyendo etiqueta resultado" << std::endl; resultado = fabrica.crear_etiqueta_resultado(); + add_child(instrucciones); + add_child(resultado); } void EtiquetasInfo::set_presentacion_vista( diff --git a/src/vista/etiquetas/etiquetas_info.h b/src/vista/etiquetas/etiquetas_info.h index 0178c6d2..c4a1775e 100644 --- a/src/vista/etiquetas/etiquetas_info.h +++ b/src/vista/etiquetas/etiquetas_info.h @@ -2,6 +2,7 @@ #include "../../shared/font.h" #include "../../shared/num_nivel.h" +#include "../componente.h" #include "../presentacion_vista.h" #include #include @@ -9,7 +10,7 @@ class Etiqueta; -struct EtiquetasInfo : public ObjetoConFont, public sf::Drawable { +class EtiquetasInfo : public ComponenteConFont { private: std::shared_ptr presentacion_vista; @@ -17,7 +18,7 @@ struct EtiquetasInfo : public ObjetoConFont, public sf::Drawable { std::shared_ptr instrucciones; std::shared_ptr resultado; - EtiquetasInfo(const OptionalFont &); + EtiquetasInfo(); void setup( const std::string &instr, // const NumNivelOpcional & // diff --git a/src/vista/etiquetas/etiquetas_pedidos.cpp b/src/vista/etiquetas/etiquetas_pedidos.cpp index eb96a82b..c1e436dd 100644 --- a/src/vista/etiquetas/etiquetas_pedidos.cpp +++ b/src/vista/etiquetas/etiquetas_pedidos.cpp @@ -5,8 +5,8 @@ #include "../../templates/dibujar_elementos.h" #include "../../templates/helpers.h" #include "../basicos_vista.h" -#include "../componentes/etiqueta.h" #include "../componentes/crear_etiqueta.h" +#include "../componentes/etiqueta.h" #include "../presentador.h" #include #include @@ -46,7 +46,9 @@ namespace { std::string texto, const OptionalFont &font, size_t num_items // ) { static const auto tamano_fuente = 22; - const auto etiqueta = crear_etiqueta(texto, tamano_fuente, font); + const auto etiqueta = + crear_etiqueta(texto, tamano_fuente, "etiqueta pedidos"); + etiqueta->set_font(font); const auto shape = build_card_pedido_shape(num_items); return {etiqueta, shape}; } diff --git a/src/vista/etiquetas/etiquetas_preparadas.cpp b/src/vista/etiquetas/etiquetas_preparadas.cpp index 715432ce..6822efeb 100644 --- a/src/vista/etiquetas/etiquetas_preparadas.cpp +++ b/src/vista/etiquetas/etiquetas_preparadas.cpp @@ -20,11 +20,12 @@ void EtiquetasPreparadas::setup(const dominio::TiposDePizza &tp_disponibles) { FabricaEtiquetasPreparadas fabrica(font); int i = 0; for (auto tp : tp_disponibles) { - etiquetas_preparadas.emplace( - tp, fabrica.crearEtiquetaPizzasPreparadas(i) - ); + auto etiqueta = fabrica.crearEtiquetaPizzasPreparadas(i); + etiquetas_preparadas.emplace(tp, etiqueta); + add_child(etiqueta); i++; } + LOG(debug) << "etiquetas_preparadas: " << tp_disponibles.size(); }; diff --git a/src/vista/etiquetas/fabrica_etiquetas_preparadas.cpp b/src/vista/etiquetas/fabrica_etiquetas_preparadas.cpp index d8975115..0c7ba8ef 100644 --- a/src/vista/etiquetas/fabrica_etiquetas_preparadas.cpp +++ b/src/vista/etiquetas/fabrica_etiquetas_preparadas.cpp @@ -1,7 +1,7 @@ #include "fabrica_etiquetas_preparadas.h" #include "../basicos_vista.h" -#include "../componentes/etiqueta.h" #include "../componentes/crear_etiqueta.h" +#include "../componentes/etiqueta.h" namespace medidas { constexpr int TAMANO_FUENTE_ETIQUETAS = 24; @@ -42,7 +42,9 @@ sf::Vector2f FabricaEtiquetasPreparadas::_obtener_posicion_etiqueta( std::shared_ptr FabricaEtiquetasPreparadas::_crear_etiqueta( // sf::Vector2f posicion ) const { - return crear_etiqueta("", estilos::CONTADORES, font, posicion); + return crear_etiqueta( + "", estilos::CONTADORES, posicion, "etiqueta preparadas" + ); } /////////////////////////////////////////// diff --git a/src/vista/paneles.cpp b/src/vista/paneles.cpp index 894ffec3..ec9c1797 100644 --- a/src/vista/paneles.cpp +++ b/src/vista/paneles.cpp @@ -2,6 +2,7 @@ #include "../shared/log_init.h" #include "../templates/dibujar_elementos.h" #include "basicos_vista.h" +#include "botones_encargar.h" #include "componentes/etiqueta.h" #include "etiquetas/etiquetas.h" #include @@ -42,7 +43,9 @@ namespace { Panel::Panel(IndicePanel indice, std::shared_ptr etiqueta) : indice(indice), forma(crear_panel_estandar(indice)), - etiqueta_titulo(etiqueta) {} + etiqueta_titulo(etiqueta) { + add_child(etiqueta_titulo); +} void Panel::draw( sf::RenderTarget &target, // @@ -52,15 +55,46 @@ void Panel::draw( target.draw(*etiqueta_titulo); } +/////////////////////////////////////////// +// PanelEncargar (public) +///////////////////////////////////////// + +PanelEncargar::PanelEncargar( + IndicePanel indice, std::shared_ptr etiqueta, + const dominio::TiposDePizza &tp_disponibles +) + : Panel(indice, etiqueta), + encargar(_crear_botones_encargar(tp_disponibles)) { + for (auto [_, btn] : encargar) { + std::cout << "Panel encargar anade un boton" << std::endl; + add_child(btn); + } +} + +void PanelEncargar::actualizar( + const VistaPreparacionPizzas &vista_preparacion // +) {} + +void PanelEncargar::draw( + sf::RenderTarget &target, // + sf::RenderStates states // +) const { + Panel::draw(target, states); + for (auto &[_, boton_ptr] : encargar) { + assert(boton_ptr != nullptr); + boton_ptr->actualizar(); + target.draw(*boton_ptr); + } +} + /////////////////////////////////////////// // PanelEnPreparacion (public) ///////////////////////////////////////// PanelEnPreparacion::PanelEnPreparacion( - IndicePanel indice, std::shared_ptr etiqueta, - const OptionalFont &font + IndicePanel indice, std::shared_ptr etiqueta ) - : Panel(indice, etiqueta), ObjetoConFont(font) {} + : Panel(indice, etiqueta) {} void PanelEnPreparacion::actualizar( const VistaPreparacionPizzas &vista_preparacion // @@ -68,9 +102,15 @@ void PanelEnPreparacion::actualizar( auto pos_panel = basicos_vista::obtener_posicion_panel( // IndicePanel::PANEL_EN_PREPARACION ); + for (auto bpn : barras_progreso_con_nombres) { + remove_child(bpn); + } barras_progreso_con_nombres = crear_barras_progreso( // vista_preparacion, pos_panel, font ); + for (auto bpn : barras_progreso_con_nombres) { + add_child(bpn); + } } void PanelEnPreparacion::draw( @@ -78,8 +118,8 @@ void PanelEnPreparacion::draw( sf::RenderStates states // ) const { Panel::draw(target, states); - for (auto &bpn : barras_progreso_con_nombres) { - target.draw(bpn); + for (auto bpn : barras_progreso_con_nombres) { + target.draw(*bpn); } } @@ -113,6 +153,7 @@ void PanelPreparadas::draw( sf::RenderTarget &target, // sf::RenderStates states // ) const { + // assert(false); //TODO: remove Panel::draw(target, states); target.draw(*etiquetas_preparadas); } @@ -121,48 +162,46 @@ void PanelPreparadas::draw( // Paneles (public) ///////////////////////////////////////// -Paneles::Paneles( - const dominio::TiposDePizza &tp_disponibles, const OptionalFont &font -) - : ObjetoConFont(font) { +Paneles::Paneles(const dominio::TiposDePizza &tp_disponibles) { const FabricaEtiquetasTituloPanel fabrica(font); LOG(debug) << "A punto de crear los paneles"; for (auto indice : paneles_posibles) { - std::unique_ptr panel = nullptr; + std::shared_ptr panel = nullptr; auto titulo = fabrica.crearEtiquetaTituloPanel( basicos_vista::obtener_posicion_panel(indice), // texto_titulos_paneles.at(indice) ); - if (indice == IndicePanel::PANEL_EN_PREPARACION) { - panel = std::make_unique( - indice, std::move(titulo), font + + if (indice == IndicePanel::PANEL_ENCARGAR) { + panel = std::make_shared( // + indice, titulo, tp_disponibles ); + } else if (indice == IndicePanel::PANEL_EN_PREPARACION) { + panel = std::make_shared(indice, titulo); } else if (indice == IndicePanel::PANEL_PREPARADAS) { LOG(debug) << "A punto de crear panel preparadas"; - panel = - std::make_unique(indice, std::move(titulo)); - LOG(debug) << "A punto de obtener un puntero a panel preparadas"; + panel = std::make_shared(indice, titulo); auto &panel_preparadas = dynamic_cast(*panel); - // Por ahora es necesario pasar la fuente antes del setup - // porque despues no hay manera de pasarla a las instancias - // de sf::Text - LOG(debug) << "A punto de establecer la fuente de panel preparadas"; - // Solo fuera de tests - // assert(font.exists()); - panel_preparadas.set_font(font); LOG(debug) << "A punto de hacer el setup de panel preparadas"; panel_preparadas.setup(tp_disponibles); - LOG(debug) << "Despues del setup de panel preparadas"; + LOG(debug) << "Despues del setup de panel preparadas"; } else { - panel = std::make_unique(indice, std::move(titulo)); + panel = std::make_shared(indice, titulo); } - _paneles.emplace(indice, std::move(panel)); - // La propiedad de panel se ha transferido debido al uso de move - assert(panel == nullptr); + + _paneles.emplace(indice, panel); + add_child(panel); } LOG(debug) << "Paneles creados"; } +std::shared_ptr Paneles::get_panel_encargar() { + auto panel = _paneles.at(IndicePanel::PANEL_ENCARGAR); + auto panel_encargar = std::dynamic_pointer_cast(panel); + assert(panel_encargar); + return panel_encargar; +} + void Paneles::actualizar( // const VistaPreparacionPizzas &vista_preparacion, // const PizzasToStrings &vista_preparadas // @@ -189,5 +228,6 @@ void Paneles::draw( ) const { if (!visible) return; + std::cout << "Dibujando " << _paneles.size() << " paneles" << std::endl; dibujar_elementos(target, _paneles); } diff --git a/src/vista/paneles.h b/src/vista/paneles.h index a1d7614d..84ce156e 100644 --- a/src/vista/paneles.h +++ b/src/vista/paneles.h @@ -8,6 +8,7 @@ #include #include +class BotonConTexto; class Etiqueta; enum class IndicePanel; @@ -15,7 +16,7 @@ enum class IndicePanel; // Panel ///////////////////////////////////////// -struct Panel : public sf::Drawable { +struct Panel : public ComponenteConFont { IndicePanel indice; sf::RectangleShape forma; std::shared_ptr etiqueta_titulo; @@ -27,15 +28,30 @@ struct Panel : public sf::Drawable { }; /////////////////////////////////////////// -// PanelEnPreparacion +// PanelEncargar ///////////////////////////////////////// -struct PanelEnPreparacion : public Panel, public ObjetoConFont { - std::vector barras_progreso_con_nombres; - PanelEnPreparacion( +struct PanelEncargar : public Panel { + TipoPizzaToBoton encargar; + PanelEncargar( IndicePanel indice, std::shared_ptr etiqueta, - const OptionalFont &font + const dominio::TiposDePizza &tp_disponibles + ); + void actualizar(const VistaPreparacionPizzas &vista_preparacion // ); + virtual void draw( + sf::RenderTarget &target, // + sf::RenderStates states // + ) const override; +}; + +/////////////////////////////////////////// +// PanelEnPreparacion +///////////////////////////////////////// + +struct PanelEnPreparacion : public Panel { + std::vector> barras_progreso_con_nombres; + PanelEnPreparacion(IndicePanel indice, std::shared_ptr etiqueta); void actualizar(const VistaPreparacionPizzas &vista_preparacion // ); virtual void draw( @@ -48,7 +64,7 @@ struct PanelEnPreparacion : public Panel, public ObjetoConFont { // PanelPreparadas ///////////////////////////////////////// -struct PanelPreparadas : public Panel, public ComponenteConFont { +struct PanelPreparadas : public Panel { std::shared_ptr etiquetas_preparadas; PanelPreparadas::PanelPreparadas( IndicePanel indice, std::shared_ptr etiqueta @@ -76,17 +92,16 @@ class PanelesObservables { // Paneles ///////////////////////////////////////// -class Paneles : public ObjetoConFont, - public sf::Drawable, - public PanelesObservables { +class Paneles : public ComponenteConFont, public PanelesObservables { private: std::map> _paneles; public: bool visible = false; - Paneles(const dominio::TiposDePizza &tp_disponibles, const OptionalFont &); + Paneles(const dominio::TiposDePizza &tp_disponibles); + std::shared_ptr get_panel_encargar(); void Paneles::actualizar( // const VistaPreparacionPizzas &vista_preparacion, // const PizzasToStrings &vista_preparadas // diff --git a/src/vista/vista.cpp b/src/vista/vista.cpp index a079971b..1c2cbef7 100644 --- a/src/vista/vista.cpp +++ b/src/vista/vista.cpp @@ -28,7 +28,7 @@ namespace { for (auto &[tp, debe_estar_activo] : activacion_botones.despachar) { assert(has_key(botones_despachar, tp)); auto &boton_despachar = botones_despachar.at(tp); - boton_despachar.activacion_condicional(debe_estar_activo); + boton_despachar->activacion_condicional(debe_estar_activo); } } @@ -80,21 +80,28 @@ void Vista::setup( const NumNivelOpcional &num_nivel // ) { this->grid = grid; - botones = std::make_shared(font, tp_disponibles); - paneles = std::make_shared(tp_disponibles, font); + paneles = std::make_shared(tp_disponibles); + auto panel_encargar = paneles->get_panel_encargar(); + auto &botones_encargar = panel_encargar->encargar; + botones = + std::make_shared(font, tp_disponibles, botones_encargar); LOG(info) << "Inicializando etiquetas" << std::endl; - etiquetas = std::make_shared(font); + etiquetas = std::make_shared(); etiquetas->setup( instrucciones, // num_nivel, // tp_disponibles // ); + add_child(botones); + add_child(paneles); + add_child(etiquetas); + LOG(info) << "Etiquetas inicializadas" << std::endl; // Mostrar botones iniciales - botones->generales.alternar_grid.visible = MODO_DESARROLLO; - botones->generales.reiniciar.visible = true; - botones->generales.salir.visible = true; - botones->empezar.visible = true; + botones->generales.alternar_grid->visible = MODO_DESARROLLO; + botones->generales.reiniciar->visible = true; + botones->generales.salir->visible = true; + botones->empezar->visible = true; } void Vista::set_presentacion_vista( @@ -124,7 +131,7 @@ void Vista::actualizar_interfaz_grafico( } void Vista::mostrar_elementos_fase_activa() { - botones->empezar.visible = false; + botones->empezar->visible = false; botones->mostrar_botones_nivel(true); paneles->visible = true; } @@ -140,7 +147,7 @@ void Vista::activar_botones_condicionalmente( botones->despachar, activacion_botones ); for (auto &[_, boton] : botones->encargar) { - boton.activacion_condicional(activacion_botones.encargar); + boton->activacion_condicional(activacion_botones.encargar); } } diff --git a/src/vista/vista_shared.h b/src/vista/vista_shared.h index b64bef31..955bf1b7 100644 --- a/src/vista/vista_shared.h +++ b/src/vista/vista_shared.h @@ -1,10 +1,17 @@ #pragma once #include +#include #include +#include + +class BotonConTexto; namespace dominio { enum class TipoPizza; } using PizzasToStrings = std::map; +using TipoPizzaToBoton = + std::map>; +using Botones = std::vector>;