Hit-Testing
Apercu
Le hit-testing convertit une position du pointeur (en coordonnees viewport) en cellule, en-tete de colonne ou en-tete de ligne sous le curseur. C'est le fondement de la selection au clic, du survol, de l'edition et des menus contextuels.
Fonctions
hit_test(vx, vy, model, scroll_x, scroll_y) → Option<CellCoord>
Resout une cellule de donnees a partir des coordonnees viewport :
- Verification de la gouttiere — si
vx < row_number_width, renvoieNone - Verification de l'en-tete — si
vy < header_height, renvoieNone - Recherche de colonne — utilise
ColumnOffsetspour une recherche en O(1) - Recherche de ligne — O(1) grace a la hauteur de ligne uniforme
Renvoie None si le pointeur se trouve sous la derniere ligne ou a droite de
la derniere colonne.
hit_test_col_header(vx, vy, model, scroll_x) → Option<usize>
Renvoie l'index de la colonne lors d'un clic sur un en-tete de colonne. Utilise pour :
- Basculer le tri
- Selection de colonne
- Detection du redimensionnement de colonne
hit_test_row_header(vx, vy, model, scroll_y) → Option<u64>
Renvoie l'index de la ligne lors d'un clic sur la gouttiere des numeros de ligne. Utilise pour :
- Selection de ligne
- Extension de la selection de ligne (glisser)
Colonnes epinglees
Le hit-testing prend en compte les colonnes epinglees :
Cela garantit que les clics sur les colonnes epinglees sont resolus correctement, quelle que soit la position du defilement horizontal.
Precision aux positions de defilement extremes
Pour les jeux de donnees tres volumineux (milliards de lignes), un calcul naif
(vy + scroll_y - header_height) / row_height perd en precision f64 car il
soustrait deux grands nombres.
Le code de hit-testing utilise une decomposition preservant la precision :
Cela maintient les valeurs intermediaires petites, preservant la precision meme pour des indices de ligne proches de la limite u64.
Performance
- Recherche de colonne : O(1) via les
ColumnOffsetsprecalcules - Recherche de ligne : O(1) avec une hauteur de ligne uniforme
- Total : O(1) par appel de hit-test
Ne jamais introduire d'algorithme en O(n) dans le chemin de hit-testing. Les offsets de colonnes sont precalcules une seule fois lors d'un changement de colonnes, et non a chaque evenement pointeur.