Liens entre structure et layout

Les travaux sur la version 2.5.0 du Core, et plus précisément le développement de la nouvelle interface graphique de CiviKey nous ont permis de soulever une nouvelle problématique qui a entrainé l’évolution de la structure même de ce que sont un clavier et son affichage (ou layout).

Un petit rappel ne fait pas de mal

Les classes qui définissent la structure des objets d’un contexte CiviKey sont organisées en deux sections parallèles :

  • la structure de « ce qu’est un clavier », au sens des données liées au comportement et à la nature des objets (propriété Enabled et commandes associées à l’appui d’une touche par exemple)
  • et la façon dont ces claviers doivent être affichés : les Layouts (propriété Visible et positionnement à l’écran par exemple).

 

D’abord, de nouveaux noms

Lors de l’évolution décrite ci-après, on s’est rapidement rendu compte que les noms des classes n’étaient pas suffisamment explicites : ils avaient déjà évolué une première fois pour perdre le préfixe CVK (ICVKContext est devenu IContext), et l’ajout des interfaces « Current » (voir ci-dessous) a fait déborder le vase (avec un horrible ICurrentActualKeyLayoutCurrent…). Olivier a donc décidé de renommer certaines interfaces pour plus de clarté : IKeyboardZone devient IZone (parce qu’après tout, lorsqu’on travaille dans CiviKey on sait bien qu’une zone est une zone de clavier) ; IActualKey devient IKeyMode (car « actual » étant un faux-ami en anglais, certains ne comprenait pas le sens « Réel » de ce nom, IKeyMode est plus clair car cet objet représente simplement une touche - ou Key - dans un Mode donné). Du côté des layouts certains noms ont changé aussi en respectant une parfaite cohérence avec la section structurelle. L’intérêt de ce re-nommage est double :

  • les noms des objets sont « alignés » sur leur « structure » et il est beaucoup plus facile de s’y retrouver.
  • cela permet aussi de séparer les objets Layout des objets Structure dans la liste des classes dans Visual Studio : les Layouts, commençant tous par « ILayout » sont regroupés et non plus éparpillés parmi les autre classes/interfaces.

 

Voici donc la nouvelle organisation des interfaces du modèle :

Avant Maintenant
  • IContext
    • IKeyboard
      • IKeyboardZone
        • IKey
          • IActualKey
      • IKeyboardLayout
        • IKeyboardZoneLayout
          • IKeyLayout
            • IActualKeyLayout
  • IContext
    • IKeyboard
      • IZone
        • IKey
          • IKeyMode
      • ILayout
        • ILayoutZone
          • ILayoutKey
            • ILayoutKeyMode

Mais où est le problème ?

Avant tout, si cela n’est pas déjà fait, il vous faut commencer par lire l’article d’Olivier sur les modes et les fallbacks calculés lorsqu’un IActualKey n’existe pas dans le mode courant.

Désormais armés pour comprendre les modes ainsi que les fallbacks, voici le souci lié à l’ancienne conception de ces classes:

Les relations qui lient les IXXX aux ILayoutXXX sont de type 1:1, et cela est très bien … sauf pour les IKeyMode vs. IKeyModeLayout. En effet cela oblige chaque IKeyMode à « posséder » son ILayoutKeyMode, donc pour deux IKeyMode il faut deux ILayoutKeyMode distincts, ce qui impose donc redéfinir les valeurs des propriétés de ces ILayoutKeyMode, or dans la plupart des cas (99% je pense) les propriétés de layout (largeur, hauteur, position) ne changent pas entre deux IKeyMode différents (ce qui change, ce sont le comportement ou le label). Cela entraine une copie des données, et du coup une surcharge, aussi bien pour le système que pour l’utilisateur lors de la modification de l’affichage d’un clavier (pour déplacer une touche, il faudrait modifier la position de chacun de ses IKeyMode via chaque ILayoutKeyMode).

La solution trouvée à ce problème est assez simple, il suffit d’appliquer le même principe de fallback (la façon dont on retrouve le « meilleur » IKeyMode pour un mode donné) aux ILayoutKeyMode que celui applicable aux IKeyMode. L’impact est qu’il n’y a plus de lien direct entre un IKeyMode et un ILayoutKeyMode. Par contre il est toujours possible via tout IKey de retrouver le ILayoutKey courant, et sur cet ILayoutKey de trouver le « meilleur » ILayoutKeyMode calculé en fonction du mode courant (et non en fonction de l’IKeyMode courant).

Afin de faciliter la programmation, deux nouvelles interfaces ont étés introduites dans le modèle : un IKeyModeCurrent étend IKeyMode, et un ILayoutKeyModeCurrent étend ILayoutKeyMode. Ces deux interfaces ne peuvent être obtenues que via les différentes propriétés « Current » et ne font qu’ajouter une propriété « IsFallBack » qui est vrai si l’objet ne correspond pas exactement au mode courant (mais est juste le « meilleur » objet calculé pour le mode courant).

Pour plus de détails vous trouverez ici le diagramme de classes des objets du Contexte (aussi disponible dans le dossier Context/Model du projet CK.Context de la solution CK.Core).

Le fallback est plus simple à comprendre car il s’applique de façon indépendante aux touches et à leurs layouts. L’implémentation bénéficie également de cette simplification : les objets (internes au CK.Context) qui implémentent IKeyMode et ILayoutKeyMode utilisent exactement le même mécanisme de gestion des fallbacks (qui, à l’occasion, a été optimisé).

Ajouter un commentaire

  Country flag

biuquote
  • Commentaire
  • Prévisualiser
Loading