fix: Help Overlay - corregir solapamiento de columnas y layout
Tres correcciones importantes para el Help Overlay: 1. Solapamiento de columnas corregido: - Añadidos column1_width_ y column2_width_ para anchos reales - calculateTextDimensions() ahora incluye encabezados en cálculo - rebuildCachedTexture() usa anchos reales de columnas - Columna 2 empieza en padding + column1_width_ + padding - Elimina cálculo erróneo column_width = (box_width_ - padding*3)/2 2. Layout en alta resolución corregido: - Eliminado ancho mínimo forzado del 90% de dimensión menor - box_width_ ahora usa directamente text_width (justo lo necesario) - Antes: 1920x1080 → min 972px aunque contenido necesite 600px - Ahora: box ajustado al contenido sin espacio vacío extra 3. Fullscreen/resize corregido: - reinitializeFontSize() ya NO llama a calculateBoxDimensions() - Evita recalcular con physical_width_ y physical_height_ antiguos - Confía en updatePhysicalWindowSize() que se llama después - Antes: textura cacheada creada con dimensiones incorrectas - Ahora: textura siempre creada con dimensiones correctas Resultado: - Columnas no se montan entre sí - Box ajustado al contenido sin espacio vacío derecha - Cambios fullscreen/ventana funcionan correctamente - Overlay se recalcula apropiadamente en todos los casos 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,8 @@ HelpOverlay::HelpOverlay()
|
|||||||
box_height_(0),
|
box_height_(0),
|
||||||
box_x_(0),
|
box_x_(0),
|
||||||
box_y_(0),
|
box_y_(0),
|
||||||
|
column1_width_(0),
|
||||||
|
column2_width_(0),
|
||||||
cached_texture_(nullptr),
|
cached_texture_(nullptr),
|
||||||
last_category_color_({0, 0, 0, 255}),
|
last_category_color_({0, 0, 0, 255}),
|
||||||
last_content_color_({0, 0, 0, 255}),
|
last_content_color_({0, 0, 0, 255}),
|
||||||
@@ -112,8 +114,9 @@ void HelpOverlay::reinitializeFontSize(int new_font_size) {
|
|||||||
// Reinicializar text renderer con nuevo tamaño
|
// Reinicializar text renderer con nuevo tamaño
|
||||||
text_renderer_->reinitialize(new_font_size);
|
text_renderer_->reinitialize(new_font_size);
|
||||||
|
|
||||||
// Recalcular dimensiones del box (el texto ahora tiene distinto tamaño)
|
// NOTA: NO recalcular dimensiones aquí porque physical_width_ y physical_height_
|
||||||
calculateBoxDimensions();
|
// pueden tener valores antiguos. updatePhysicalWindowSize() se llamará después
|
||||||
|
// con las dimensiones correctas y recalculará todo apropiadamente.
|
||||||
|
|
||||||
// Marcar textura para regeneración completa
|
// Marcar textura para regeneración completa
|
||||||
texture_needs_rebuild_ = true;
|
texture_needs_rebuild_ = true;
|
||||||
@@ -141,15 +144,22 @@ void HelpOverlay::calculateTextDimensions(int& max_width, int& total_height) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Separador vacío o encabezado
|
// Separador vacío (no tiene key ni description)
|
||||||
if (binding.description[0] == '\0') {
|
if (binding.key[0] == '\0') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calcular ancho de esta línea: key + espacio + description
|
int line_width = 0;
|
||||||
int key_width = text_renderer_->getTextWidthPhysical(binding.key);
|
|
||||||
int desc_width = text_renderer_->getTextWidthPhysical(binding.description);
|
if (binding.description[0] == '\0') {
|
||||||
int line_width = key_width + 10 + desc_width; // 10px de separación
|
// Es un encabezado (solo tiene key, sin description)
|
||||||
|
line_width = text_renderer_->getTextWidthPhysical(binding.key);
|
||||||
|
} else {
|
||||||
|
// Es una línea normal con key + description
|
||||||
|
int key_width = text_renderer_->getTextWidthPhysical(binding.key);
|
||||||
|
int desc_width = text_renderer_->getTextWidthPhysical(binding.description);
|
||||||
|
line_width = key_width + 10 + desc_width; // 10px de separación
|
||||||
|
}
|
||||||
|
|
||||||
// Actualizar máximo de columna correspondiente
|
// Actualizar máximo de columna correspondiente
|
||||||
if (current_column == 0) {
|
if (current_column == 0) {
|
||||||
@@ -159,6 +169,10 @@ void HelpOverlay::calculateTextDimensions(int& max_width, int& total_height) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Almacenar anchos de columnas en miembros para uso posterior
|
||||||
|
column1_width_ = max_col1_width;
|
||||||
|
column2_width_ = max_col2_width;
|
||||||
|
|
||||||
// Ancho total: 2 columnas + 3 paddings (izq, medio, der)
|
// Ancho total: 2 columnas + 3 paddings (izq, medio, der)
|
||||||
max_width = max_col1_width + max_col2_width + padding * 3;
|
max_width = max_col1_width + max_col2_width + padding * 3;
|
||||||
|
|
||||||
@@ -178,12 +192,8 @@ void HelpOverlay::calculateBoxDimensions() {
|
|||||||
int text_width, text_height;
|
int text_width, text_height;
|
||||||
calculateTextDimensions(text_width, text_height);
|
calculateTextDimensions(text_width, text_height);
|
||||||
|
|
||||||
// Ancho mínimo: 90% de dimensión menor (como antes, para compatibilidad)
|
// Usar directamente el ancho y altura calculados según el contenido
|
||||||
int min_dimension = std::min(physical_width_, physical_height_);
|
box_width_ = text_width;
|
||||||
int min_width = static_cast<int>(min_dimension * 0.9f);
|
|
||||||
|
|
||||||
// Usar el mayor entre ancho calculado y ancho mínimo
|
|
||||||
box_width_ = std::max(text_width, min_width);
|
|
||||||
|
|
||||||
// Altura: 90% de altura física o altura calculada, el que sea menor
|
// Altura: 90% de altura física o altura calculada, el que sea menor
|
||||||
int max_height = static_cast<int>(physical_height_ * 0.9f);
|
int max_height = static_cast<int>(physical_height_ * 0.9f);
|
||||||
@@ -279,10 +289,9 @@ void HelpOverlay::rebuildCachedTexture() {
|
|||||||
last_content_color_ = content_color;
|
last_content_color_ = content_color;
|
||||||
last_bg_color_ = {static_cast<Uint8>(notif_bg_r), static_cast<Uint8>(notif_bg_g), static_cast<Uint8>(notif_bg_b), 255};
|
last_bg_color_ = {static_cast<Uint8>(notif_bg_r), static_cast<Uint8>(notif_bg_g), static_cast<Uint8>(notif_bg_b), 255};
|
||||||
|
|
||||||
// Configuración de espaciado (misma que renderHelpText())
|
// Configuración de espaciado
|
||||||
int line_height = text_renderer_->getTextHeight();
|
int line_height = text_renderer_->getTextHeight();
|
||||||
int padding = 25;
|
int padding = 25;
|
||||||
int column_width = (box_width_ - padding * 3) / 2;
|
|
||||||
|
|
||||||
int current_x = padding; // Coordenadas relativas a la textura (0,0)
|
int current_x = padding; // Coordenadas relativas a la textura (0,0)
|
||||||
int current_y = padding;
|
int current_y = padding;
|
||||||
@@ -301,7 +310,7 @@ void HelpOverlay::rebuildCachedTexture() {
|
|||||||
if (strcmp(binding.key, "[new_col]") == 0 && binding.description[0] == '\0') {
|
if (strcmp(binding.key, "[new_col]") == 0 && binding.description[0] == '\0') {
|
||||||
if (current_column == 0) {
|
if (current_column == 0) {
|
||||||
current_column = 1;
|
current_column = 1;
|
||||||
current_x = padding + column_width + padding;
|
current_x = padding + column1_width_ + padding; // Usar ancho real de columna 1
|
||||||
current_y = content_start_y;
|
current_y = content_start_y;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@@ -321,7 +330,7 @@ void HelpOverlay::rebuildCachedTexture() {
|
|||||||
|
|
||||||
if (current_y > box_height_ - padding && current_column == 0) {
|
if (current_y > box_height_ - padding && current_column == 0) {
|
||||||
current_column = 1;
|
current_column = 1;
|
||||||
current_x = padding + column_width + padding;
|
current_x = padding + column1_width_ + padding; // Usar ancho real de columna 1
|
||||||
current_y = content_start_y;
|
current_y = content_start_y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ class HelpOverlay {
|
|||||||
int box_x_;
|
int box_x_;
|
||||||
int box_y_;
|
int box_y_;
|
||||||
|
|
||||||
|
// Anchos individuales de cada columna (para evitar solapamiento)
|
||||||
|
int column1_width_;
|
||||||
|
int column2_width_;
|
||||||
|
|
||||||
// Sistema de caché para optimización de rendimiento
|
// Sistema de caché para optimización de rendimiento
|
||||||
SDL_Texture* cached_texture_; // Textura cacheada del overlay completo
|
SDL_Texture* cached_texture_; // Textura cacheada del overlay completo
|
||||||
SDL_Color last_category_color_; // Último color de categorías renderizado
|
SDL_Color last_category_color_; // Último color de categorías renderizado
|
||||||
|
|||||||
Reference in New Issue
Block a user