feat(tables): Tips proactivos cada ~10s

- Añade table_tips[] con 8 tips de atajos
- Añade tip_index a VirtualAdvancedTableState
- Rota tip cada 600 frames (~10s @ 60fps)
- result.current_tip contiene tip a mostrar
- Solo muestra tips con focus y sin edición activa
This commit is contained in:
reugenio 2025-12-27 21:47:39 +01:00
parent dc82340381
commit 5c7964bacc
3 changed files with 45 additions and 0 deletions

View file

@ -26,6 +26,26 @@ const Command = @import("../core/command.zig");
const Layout = @import("../core/layout.zig"); const Layout = @import("../core/layout.zig");
const Style = @import("../core/style.zig"); const Style = @import("../core/style.zig");
// =============================================================================
// Tips Proactivos (FASE I)
// =============================================================================
/// Tips de atajos de teclado para mostrar en StatusLine
/// Rotan cada ~10 segundos para enseñar atajos al usuario
pub const table_tips = [_][]const u8{
"Tip: F2 o Space para editar celda",
"Tip: Tab/Shift+Tab navega entre celdas",
"Tip: Ctrl+N crea nuevo registro",
"Tip: Ctrl+Delete o Ctrl+B borra registro",
"Tip: Ctrl+Shift+1..9 ordena por columna",
"Tip: Ctrl+Home/End va al inicio/fin",
"Tip: Enter confirma y baja, Escape cancela",
"Tip: Al editar, tecla directa reemplaza todo",
};
/// Frames entre rotación de tips (~10s @ 60fps)
pub const TIP_ROTATION_FRAMES: u32 = 600;
// ============================================================================= // =============================================================================
// Tipos comunes // Tipos comunes
// ============================================================================= // =============================================================================

View file

@ -126,6 +126,9 @@ pub const VirtualAdvancedTableState = struct {
/// Frame counter para animaciones /// Frame counter para animaciones
frame_count: u32 = 0, frame_count: u32 = 0,
/// Índice del tip actual (para tips proactivos rotativos)
tip_index: u8 = 0,
// ========================================================================= // =========================================================================
// Buffers persistentes para texto formateado (evitar stack buffer escape) // Buffers persistentes para texto formateado (evitar stack buffer escape)
// ========================================================================= // =========================================================================

View file

@ -145,6 +145,14 @@ pub const VirtualAdvancedTableResult = struct {
/// @deprecated /// @deprecated
previous_row: ?usize = null, previous_row: ?usize = null,
// =========================================================================
// Tips Proactivos (FASE I)
// =========================================================================
/// Tip actual para mostrar en StatusLine (null = sin tip)
/// Rota automáticamente cada ~10 segundos (600 frames @ 60fps)
current_tip: ?[]const u8 = null,
/// Obtiene los cambios como slice (helper para compatibilidad) /// Obtiene los cambios como slice (helper para compatibilidad)
pub fn getRowChanges(self: *const VirtualAdvancedTableResult) []const table_core.PendingCellChange { pub fn getRowChanges(self: *const VirtualAdvancedTableResult) []const table_core.PendingCellChange {
return self.row_changes[0..self.row_changes_count]; return self.row_changes[0..self.row_changes_count];
@ -434,6 +442,20 @@ pub fn virtualAdvancedTableRect(
} }
} }
// =========================================================================
// Tips Proactivos (FASE I): Rotar tips cada ~10 segundos
// =========================================================================
list_state.frame_count +%= 1; // Wrap around en overflow
// Solo mostrar tips si tiene focus y no está editando
if (has_focus and !list_state.isEditing()) {
// Rotar tip cada TIP_ROTATION_FRAMES frames
if (list_state.frame_count % table_core.TIP_ROTATION_FRAMES == 0) {
list_state.tip_index = @intCast((list_state.tip_index + 1) % table_core.table_tips.len);
}
result.current_tip = table_core.table_tips[list_state.tip_index];
}
return result; return result;
} }