Un modèle de briques pour réaliser des interfaces graphiques: le toolkit Ubit

Eric Lecolinet (elc@enst.fr) - ENST Paris / Dept. INFRES - CNRS URA 820


1. Motivation et Objectifs

L'expérience montre qu'il est souvent difficile et plutôt laborieux de créer des objets graphiques sophistiqués spécifiques à un type d'application donné en utilisant la plupart des toolkits graphiques actuels. D'autre part, les APIs des toolkits courants sont souvent excessivement compliquées et peu génériques. En particulier, la gestion de l'interaction est généralement assez primitive et se résume pour l'essentiel à l'implémentation d'une nuée de fonctions de "callback" ou équivalent (par exemple les soit-disant "signaux").

Ceci constitue un frein important au développement de nouvelles techniques d'interaction, et plus particulièrement - en ce qui nous concerne - de techniques de visualisation de l'information. Plusieurs projets de recherche ont tenté de résoudre ce problème dans le passé mais force est de constater que ces projets ont rarement dépassé le cadre des laboratoires de recherche. Ceci est particulièrement sensible dans le "monde C et C++", où les toolkits récents (Qt, Gtk) semblent pour l'essentiel ignorer les acquis de ces recherches passées (par opposition au "monde Java" ou le modèle Java/Swing peut constituer un début de solution intéressant à certains des problèmes cités).

Notre objectif est de réaliser un toolkit C++, multi-plateformes (X-Window et Windows), "domaine public" (plus exactement sous "licence GPL") qui serve de "laboratoire d'idées" pour tenter de résoudre ces problématiques. Ce nouveau toolkit est (et sera) orienté autour des principes listés ci-après.

A. Généricité et (relative) simplicité de l'API

Les APIs habituelles sont généralement insuffisamment génériques et font apparaître trop de "détails" liés à des contraintes d'implémentation bas niveau, ce qui complique l'implémentation et l'évolutivité des interfaces (en particulier dans le cadre d'un processus itératif de conception / implémentation de systèmes interactifs.) D'autre part le code nécessaire à l'implémentation des interfaces tend souvent à être excessivement verbeux et peu compréhensible (exemples typiques: Motif ou Gtk) faute d'APIs génériques, bien construites et suffisamment "haut niveau".

B. Flexibilité et évolutivité des objets graphiques

Le système doit favoriser la créations d'objets nouveaux, spécifiques à une application donnée et/ou utilisant des techniques non conventionnelles. Ces nouveaux objets doivent pouvoir être créés en écrivant le moins de code possible via la réutilisation et la combinaison d'objets déjà existants.

C. Unification interfaces conventionnelles vs. hypertexte

Le toolkit doit tendre a réduire la fracture artificielle (car essentiellement historique) qui existe actuellement entre le monde des interfaces graphiques "classiques" et celui du document structuré et des hypertextes. Cette fracture n'a en grande partie plus lieu d'être comme de démontre assez clairement l'évolution des interfaces sur le Web.

D. Simplification de l'interaction

Le recours aux fonctions de callback doit être minimisé. Au contraire, le système doit permettre de spécifier un maximum de comportements soit implicitement via des règles structurales bien définies, soit explicitement via des spécifications déclaratives ou des contraintes.

E. Nouvelles techniques d'interaction et Visualisation de l'Information

A terme, le but est d'incorporer un certain nombre de caractéristiques "standard" (zoom, transparence...) dans le toolkit pour faciliter l'implémentation d'interfaces mettant en oeuvre des techniques de Visualisation de l'Information.

2. Solutions Proposées

Ubit diffère essentiellement des toolkits actuels par son architecture. Habituellement, les "widgets" ou autres "controls" fournis par les toolkits standard sont plutôt de "gros objets" gourmands en ressources physiques implémentant quantités de fonctionnalités hétérogènes généralement inutiles pour une tâche donnée - à l'exception de la "fonctionnalité oublié" qui serait justement nécessaire pour l'application que l'on est en train de réaliser. Ceci entraîne un manque de flexibilité des objets existants, une adéquation insuffisante entre les objets fournis et ce que l'on souhaite réaliser et un gaspillage excessif des ressources physiques. De plus, la création d'objets nouveaux par sous-classage est souvent un réel casse-tête du fait de la complexité et de l'hétérogénéité interne des objets existants.

Par opposition, Ubit est essentiellement composé d'un ensemble de briques de base:

Les "gadgets" de haut niveau ne sont que des combinaisons de briques de bases et sont eux-mêmes des briques combinables avec d'autres objets. Ceci permet de réaliser une grande variété d'objets "hybrides" par simple combinaison d'objets élémentaires, préexistants ou spécifiquement crées pour une application données. Ainsi la "richesse" du toolkit ne provient pas des objets fournis de manière standard mais des possibilités de combinaison et d'enrichissement de ces objets.

La propriété de "libre combinaison" permet par ailleurs de créer de manière triviale des objets composites (mélangeant texte, images et objets graphiques classiques), du pseudo-hypertexte, ou des objets très spécifiques (typiquement en composant plusieurs gadgets entre-eux, quelle que soit leur nature).

Cette architecture implique également des changements importants dans la manière de gérer l'interaction dans la mesure où elle effectue un transfert du contrôle vers les objets élémentaires. Cet aspect est d'autant plus sensible que tous les objets sont partageables ce qui introduit des contraintes structurales implicites délivrant le programmeur de nombreuse tâches d'interaction et de synchronisation. Par exemple, une fonte, une couleur, une "décoration" (les encadrements, les ombrages, etc.), une chaîne de caractères (éventuellement éditable) sont des objets à part entière qui peuvent être partagés par plusieurs gadgets. Le contrôle de la valeur courante de ces objets élémentaire ne s'effectue pas au niveau des gadgets mais via les objets élémentaires eux-mêmes, tout changement de valeur étant automatiquement répercuté sur les gadgets. Ces gadgets seront donc implicitement synchronisés du fait même de la structure de l'interface (c'est-à-dire des liens qui lient les objets dans le graphe d'instanciation).

Les gadgets sont eux-mêmes "partageables" dans la mesure où ils peuvent également avoir plusieurs parents. Ceci implique deux types de conséquences suivant la nature des objets concernés:

Enfin, le toolkit offre un certain nombre de propriétés visant à simplifier l'implémentation des interfaces. En premier lieu, deux APIs interchangeables sont offertes au programmeur. La première est procédurale et plus ou moins similaire à Java AWT. La seconde est pseudo-déclarative et permet de spécifier les GUIs sous forme de listes imbriquées. Ces deux APIs sont librement "mélangeables" et ne nécessitent pas l'utilisation d'un pré-processeur particulier.

D'autre part, le toolkit remplace la classique notion d'événement par celle d'état et de transition d'état. Chaque gadget incorpore un gestionnaire d'états capable de déterminer à tout moment l'ensemble des états courants de l'objet concerné (par exemple s'il est visible, s'il est sélectionné, s'il est "pressé", si l'on est en train d'y entrer du texte, etc.). Ceci permet en particulier de spécifier nombre de comportements de manière pseudo-déclarative via la notion de propriété conditionnelle. Il est en effet possible de définir de cette manière quelle couleurs, quelles fontes, quelles décorations, quelles chaînes de caratères, etc. seront effectivement affichées selon l'état de l'objet (par exemple si on clique dessus, si la souris entre dans l'objet, etc.)

3. Etat courant et travail futur

Le toolkit Ubit est actuellement en cours de réalisation. L'objectif à plus long terme est d'en faire un toolkit dédié pour la visualisation de l'information. On s'intéressera en particulier dans un premier temps aux possibilités de zoom quantique et de transparence. D'autre part, la propriété d'ubiquité pourrait être étendue à la réalisation d'interfaces distribuées pour la réalisation de collecticiels.


Email: elc@enst.fr
Web: http://www.enst.fr/~elc
Tel: +33 - 1 45 81 78 87,
Pmail: ENST / INFRES - 46 rue Barrault - 75013 Paris - France.