• # Algo simple

    Posté par . En réponse au journal Les artistes, ce fléau ou l'invasion des profanateurs de GUI. Évalué à 7.

    Franchement, je ferais le truc suivant : découper l'espcace en quatre quadrants (haut bas droite gauche), et naviguer vers la fenêtre la plus proche dans le quadrant correspondant au déplacement. Quelque chose comme (sans les pointeurs nus dégueus):

    Widget * current = get_current_widget();
    Widget * next = NULL;
    vector<Widget *> all_windows;
    int direction = 1; // 1, 2, 3, or 4
    for (auto ww = all_windows.begin(); ww != all_windows.end(); w++) {
     bool keep = false;
     double angle = arccos(/* bla bla, don't forget the sign */);
     switch(direction) { // first, keep the widget only if it is in the good quadrant
     case 1: // say, right
     if ((angle > 7*pi/4) || (angle < pi/4)) {
     keep = true;
     break;
     case 2:
     /* etc */
     }
     if (keep) { // Then, select the closest one
     if (next == NULL)
     next = ww;
     else {
     if (dist (current, ww) < dist(current, next)) // if necessary: in case of equality, choose according to some stable criterion
     next = ww;
     }
     }
    }
    

    Bon, après, il faudrait vérifier si c'est intuitif. En cas d'égalité, il faut choisir toujours le même, quelle que soit la règle (histoire d'avoir de la cohérence dans l'interface).

    Ça me semble vachement plus simple que les autres solutions envisagées.