Selection

rs-grid utilise un modele de selection ancre/focus. L'ancre est le point de depart de la selection ; le focus est le point ou elle se termine actuellement. Le shift-clic etend la selection de l'ancre vers un nouveau focus.

SelectionState

SelectionState suit deux positions :

ChampDescription
anchorOrigine de la selection (definie au mousedown)
focusFin actuelle de la selection (mise a jour au shift-clic)

Chaque position peut faire reference a une cellule, une ligne ou une colonne. La granularite mixte (ancre sur une cellule, focus sur une ligne) n'est pas supportee.

Commandes

// Selectionner une cellule unique
grid_state.apply(GridCommand::SelectCell { row: 0, col: 2 });

// Etendre la selection (equivalent du shift-clic)
grid_state.apply(GridCommand::ExtendSelection { row: 5, col: 2 });

// Selectionner une ligne entiere
grid_state.apply(GridCommand::SelectRow { row: 3 });

// Selectionner une colonne entiere
grid_state.apply(GridCommand::SelectColumn { col: 1 });

// Effacer la selection
grid_state.apply(GridCommand::ClearSelection);

Hit-testing

Etant donne une coordonnee pixel (x, y) relative au canvas, le hit-testing retourne la cellule sous le curseur :

let hit = grid_state.hit_test(x, y);
// Retourne Option<HitResult> avec { row: u64, col: usize }

Le hit-testing utilise le meme tableau precalcule de decalages de colonnes que le viewport, offrant une performance O(log n). Le hit-testing des lignes est O(1) avec une hauteur de ligne uniforme.

Warning

N'introduisez jamais un parcours O(n) dans le chemin du hit-testing. La garantie O(log n) est un invariant fondamental.

Rendu de la selection

SceneBuilder lit SelectionState et emet des entrees ScenePrimitive::Rect avec la couleur de surbrillance de selection pour chaque cellule selectionnee dans le viewport.

Tip

Meme avec une selection de toute la grille (toutes les lignes x toutes les colonnes), seules les primitives des cellules visibles sont construites. La taille de la scene est limitee par le viewport, pas par la taille de la selection.