API GridModel

Définition

pub struct GridModel {
    pub columns: Vec<ColumnDef>,
    pub data: Box<dyn DataSource>,
    pub row_height: f64,
    pub header_height: f64,
    pub column_offsets: ColumnOffsets,
    pub patches: HashMap<(u64, String), String>,
    pub row_number_width: f64,
    pub sort_order: Vec<u64>,
    pub pinned_count: usize,
    pub filters: HashMap<String, String>,
    pub filtered_indices: Vec<u64>,
    pub mode: DataSourceMode,
    pub scrollbar_size: f64,
    pub editable: bool,
    pub selectable: bool,
    pub column_reorderable: bool,
}

Champs

ChampTypeDéfautDescription
columnsVec<ColumnDef>Définitions de colonnes ordonnées
dataBox<dyn DataSource>Fournisseur de données sous-jacent
row_heightf64Hauteur des lignes de données (px logiques)
header_heightf64Hauteur de la ligne d'en-tête (px logiques)
column_offsetsColumnOffsetscalculéOffsets de bord gauche précalculés
patchesHashMap<(u64, String), String>videSurcharges de valeurs de cellules
row_number_widthf64autoLargeur du gutter (auto selon le nombre de lignes)
sort_orderVec<u64>videCorrespondance affichage → ligne physique
pinned_countusize0Nombre de colonnes épinglées en tête
filtersHashMap<String, String>videFiltres texte par colonne
filtered_indicesVec<u64>videIndices physiques des lignes filtrées
modeDataSourceModeClientSideDonnées côté client ou côté serveur
scrollbar_sizef6414.0Espace réservé à la scrollbar
editablebooltrueÉdition inline globale (le drapeau par colonne s'applique aussi)
selectablebooltrueSélection globale ; vide la sélection si passée à false
column_reorderablebooltrueDrag-to-reorder des en-têtes. MoveColumn fonctionne toujours

Constructeurs

// Données en mémoire
pub fn new(columns: Vec<ColumnDef>, rows: Vec<RowRecord>, row_height: f64, header_height: f64) -> Self

// Source de données personnalisée
pub fn with_data_source(columns: Vec<ColumnDef>, data: Box<dyn DataSource>, row_height: f64, header_height: f64) -> Self

Méthodes

MéthodeSignatureDescription
get_cell(row: u64, col_key: &str) -> Option<String>Lire une cellule (patches d'abord, puis source de données)
set_cell(row: u64, col_key: &str, value: String)Écrire une cellule dans la source de données
logical_to_physical(logical: u64) -> u64Correspondance ligne affichée → ligne de données
display_row_count() -> u64Nombre de lignes visibles (respecte les filtres)
total_width() -> f64Somme des largeurs de colonnes
total_height() -> f64row_count × row_height + header_height
pinned_width() -> f64Largeur totale des colonnes épinglées
compute_row_number_width(row_count: u64) -> f64Calcul auto de la largeur du gutter

GridModelBuilder

Un builder ergonomique pour construire un GridModel avec des valeurs par defaut sensees :

pub struct GridModelBuilder { /* ... */ }

impl GridModelBuilder {
    pub fn new(
        columns: Vec<ColumnDef>,
        data: Box<dyn DataSource>,
    ) -> Self;

    pub fn row_height(self, h: f64) -> Self;       // defaut 30.0
    pub fn header_height(self, h: f64) -> Self;     // defaut 40.0
    pub fn pinned_count(self, n: usize) -> Self;    // defaut 0
    pub fn mode(self, m: DataSourceMode) -> Self;   // defaut ClientSide
    pub fn scrollbar_size(self, s: f64) -> Self;    // defaut 14.0
    pub fn selectable(self, v: bool) -> Self;       // defaut true
    pub fn column_reorderable(self, v: bool) -> Self; // defaut true
    pub fn build(self) -> GridModel;
}

Exemple

let model = GridModelBuilder::new(columns, Box::new(data))
    .row_height(40.0)
    .pinned_count(2)
    .build();

pinned_count est ramene au nombre de colonnes si la valeur depasse columns.len().

Les constructeurs existants GridModel::new() et GridModel::with_data_source() restent disponibles.

DataSourceMode

pub enum DataSourceMode {
    ClientSide,  // tri/filtre effectué localement (par défaut)
    ServerSide,  // tri/filtre délégué au serveur
}