feat(paged_datasource): Handle injected rows in data access
When an injected row exists (Ctrl+N between lines): - getRowCount(): adds 1 to total count - getCellValueInto(): returns edit buffer values for injected row, shifts indices for rows after injection - getRowId(): returns injected_row_id for injected row, shifts indices for rows after injection This enables transparent rendering of injected rows without modifying the drawing code.
This commit is contained in:
parent
712466adc8
commit
5800d01a67
1 changed files with 54 additions and 3 deletions
|
|
@ -51,24 +51,57 @@ pub const PagedDataSource = struct {
|
||||||
// Implementación de TableDataSource
|
// Implementación de TableDataSource
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
||||||
/// Retorna el número total de filas (filtered count)
|
/// Retorna el número total de filas (filtered count + inyección)
|
||||||
pub fn getRowCount(self: *Self) usize {
|
pub fn getRowCount(self: *Self) usize {
|
||||||
// Usar conteo filtrado si está disponible
|
// Usar conteo filtrado si está disponible
|
||||||
const count_info = self.state.getDisplayCount();
|
const count_info = self.state.getDisplayCount();
|
||||||
return count_info.value;
|
var count = count_info.value;
|
||||||
|
|
||||||
|
// Si hay una fila inyectada, sumar 1 al conteo visual
|
||||||
|
if (self.state.injected_row_idx != null) {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Escribe el valor de una celda en el buffer proporcionado.
|
/// Escribe el valor de una celda en el buffer proporcionado.
|
||||||
/// El row es índice global, se convierte a índice de ventana.
|
/// El row es índice global, se convierte a índice de ventana.
|
||||||
|
/// Maneja filas inyectadas (Ctrl+N entre líneas).
|
||||||
/// Retorna slice del buffer con el contenido.
|
/// Retorna slice del buffer con el contenido.
|
||||||
pub fn getCellValueInto(self: *Self, row: usize, col: usize, buf: []u8) []const u8 {
|
pub fn getCellValueInto(self: *Self, row: usize, col: usize, buf: []u8) []const u8 {
|
||||||
// Validar columna
|
// Validar columna
|
||||||
if (col >= self.columns.len) return "";
|
if (col >= self.columns.len) return "";
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Manejo de fila inyectada
|
||||||
|
// =====================================================================
|
||||||
|
if (self.state.injected_row_idx) |inj_idx| {
|
||||||
|
if (row == inj_idx) {
|
||||||
|
// Esta es la fila inyectada - leer del edit buffer
|
||||||
|
if (self.state.row_edit_buffer.getPendingValue(col)) |pending| {
|
||||||
|
const copy_len = @min(pending.len, buf.len);
|
||||||
|
@memcpy(buf[0..copy_len], pending[0..copy_len]);
|
||||||
|
return buf[0..copy_len];
|
||||||
|
}
|
||||||
|
// Sin valor pendiente - retornar vacío (celda nueva)
|
||||||
|
return "";
|
||||||
|
} else if (row > inj_idx) {
|
||||||
|
// Fila después de la inyección - ajustar índice (-1)
|
||||||
|
return self.getCellValueFromProvider(row - 1, col, buf);
|
||||||
|
}
|
||||||
|
// row < inj_idx: continuar normal
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flujo normal (sin inyección o row < inj_idx)
|
||||||
|
return self.getCellValueFromProvider(row, col, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Helper interno: obtiene valor de celda del provider (sin ajuste por inyección)
|
||||||
|
fn getCellValueFromProvider(self: *Self, row: usize, col: usize, buf: []u8) []const u8 {
|
||||||
// Convertir índice global a índice de ventana
|
// Convertir índice global a índice de ventana
|
||||||
const window_idx = self.state.globalToWindowIndex(row) orelse {
|
const window_idx = self.state.globalToWindowIndex(row) orelse {
|
||||||
// Fila fuera de ventana actual - retornar vacío
|
// Fila fuera de ventana actual - retornar vacío
|
||||||
// (el caller debería asegurarse de pedir solo filas visibles)
|
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -88,7 +121,25 @@ pub const PagedDataSource = struct {
|
||||||
|
|
||||||
/// Retorna el ID único de una fila.
|
/// Retorna el ID único de una fila.
|
||||||
/// Si está en ventana, usa window data. Si no, consulta al provider.
|
/// Si está en ventana, usa window data. Si no, consulta al provider.
|
||||||
|
/// Maneja filas inyectadas (Ctrl+N entre líneas).
|
||||||
pub fn getRowId(self: *Self, row: usize) i64 {
|
pub fn getRowId(self: *Self, row: usize) i64 {
|
||||||
|
// Manejo de fila inyectada
|
||||||
|
if (self.state.injected_row_idx) |inj_idx| {
|
||||||
|
if (row == inj_idx) {
|
||||||
|
// Esta es la fila inyectada
|
||||||
|
return self.state.injected_row_id;
|
||||||
|
} else if (row > inj_idx) {
|
||||||
|
// Fila después de la inyección - ajustar índice
|
||||||
|
return self.getRowIdFromProvider(row - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flujo normal
|
||||||
|
return self.getRowIdFromProvider(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Helper interno: obtiene ID de fila del provider (sin ajuste por inyección)
|
||||||
|
fn getRowIdFromProvider(self: *Self, row: usize) i64 {
|
||||||
// Intentar obtener de la ventana
|
// Intentar obtener de la ventana
|
||||||
if (self.state.globalToWindowIndex(row)) |window_idx| {
|
if (self.state.globalToWindowIndex(row)) |window_idx| {
|
||||||
if (window_idx < self.state.current_window.len) {
|
if (window_idx < self.state.current_window.len) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue