Surfaces et fenêtres

Un panneau peut vivre dans quatre hôtes : un dock, un onglet de la zone centrale, une fenêtre flottante, ou une fenêtre système détachée. Le contrat de fabrique est le même partout, et un seul point d'entrée décide du déplacement. Cette page décrit les quatre hôtes, les gestes de dépôt et ce qui est enregistré.

Les quatre hôtes

HôteFichierÉtatUsage
Dockshell-dock.jsisofind_shell_v1Inspecteurs, sorties, navigation.
Zone centralezone-centrale.jsisofind_zone_v1Carnet, consoles, vue de chaine : tout ce qui a besoin de largeur.
Fenêtre flottanteshell-flottant.jsisofind_flottant_v1Un panneau gardé au-dessus du travail en cours.
Fenêtre détachéeshell-detach.jsPortée par l'URL de la fenêtreSecond écran.

L'arbitre de placement

K.shell.placer(id, hote, point); // 'dock' | 'centre' | 'flottant' | 'fenetre' K.shell.hote(id); // ou il se trouve, ou null K.shell.ouvertQuelquePart(id);

placer ne tient pas de registre de ce qu'il croit savoir : il interroge chaque hôte à chaque appel. Un panneau ouvert par un chemin qui ignore placer, par exemple un bouton de plugin qui appelle directement le shell, est donc vu quand même, et libéré avant réouverture ailleurs.

K.shell.isOpen(id) répond sur le dock seulement, et n'a pas été élargi. Plusieurs appelants s'en servent pour décider s'il faut appeler K.shell.close : leur répondre autre chose corrigerait un affichage en cassant une logique. Pour savoir si un panneau est ouvert quelque part, utiliser K.shell.hote.

Fenêtres flottantes

Les fenêtres flottantes vivent dans une couche en position: fixed et pointer-events: none : seules les fenêtres elles-mêmes reçoivent le pointeur, le reste de l'application reste cliquable.

GesteEffet
Glisser l'entêteDéplace la fenêtre, bornée à l'écran.
Tirer un bord ou un coinRedimensionne, huit prises.
Double-clic sur l'entêteAgrandit, et rend la géométrie précédente au retour.
Lâcher sur un dockRange le panneau dans ce dock. Un dock replié sous 24 px n'est pas une cible.
Lâcher hors de la fenêtre de l'applicationDétache le panneau en fenêtre système, si le réglage et le drapeau detachable l'autorisent.

La zone centrale n'est pas une cible de dépôt. Elle occupe tout le milieu de l'écran, et en faire une cible interdirait de déplacer une fenêtre flottante sans risquer qu'un onglet l'avale. L'entrée reste dans le menu de l'entête.

Pendant un déplacement ou un redimensionnement, un bouclier transparent est levé au-dessus des cadres. Un cadre survolé capte les événements de pointeur dans son propre document, et le geste serait perdu dès que le curseur passe au-dessus d'un onglet.

Fenêtres détachées

Une fenêtre détachée est une fenêtre système, servie par une page unique de static/ à laquelle les identifiants de panneaux sont passés en chaine de requête. Une même fenêtre peut donc porter plusieurs panneaux côte à côte, et il n'existe qu'une page quel que soit leur nombre.

IsoFindDetach.detacher(id); IsoFindDetach.retirer(id); // retire un panneau, ferme la fenetre si c'etait le dernier IsoFindDetach.rattacher(label); // ferme la fenetre entiere

L'état des panneaux détachés n'est pas écrit des deux côtés : la fenêtre annonce ce qu'elle porte, et le côté principal s'y fie. Écrire aussi un registre local donnerait deux vérités pour un même fait, qui divergeraient à la première fermeture manquée.

Le drapeau detachable

Certains panneaux sont des adaptateurs : ils ne construisent pas leur contenu, ils déplacent dans leur hôte une carte bâtie ailleurs, comme l'éditeur Python ou les consoles R et PHREEQC. Sortir cette carte dans une autre fenêtre la couperait de son code d'origine. Ces panneaux déclarent donc detachable: false.

La garde est posée à la source, dans detacher et detacherVers, et non chez chaque appelant : le dock détache par glissement hors fenêtre et par son menu d'onglet, la flottante par son menu et par le lâcher dehors. L'entrée reste visible et grisée, avec sa raison, plutôt que masquée.

Modales converties en panneaux

Une modale de l'atelier convertie devient un panneau ordinaire, jamais une famille de surfaces parallèle. Le Gestionnaire de plugins et la Bibliothèque de plugins sont dans ce cas et s'ouvrent comme n'importe quel panneau, y compris au centre.

Les modales locales à une page ne sont pas converties. Leur contenu est construit par le code de la page, avec le CSS de la page, et le sortir de son document romprait les sélecteurs par lesquels ce code retrouve ses propres morceaux. Elles sont traitées autrement, par le plein rectangle de la zone centrale.

Dispositions nommées

Une disposition capture les trois surfaces gérées par l'application : { shell, zone, flottant }. Chaque part est appliquée si elle est présente et laissée intacte sinon, de sorte qu'une disposition enregistrée avant la V2.0 ne ferme aucune fenêtre flottante, puisqu'elle n'a jamais rien dit à leur sujet.

RéglageDéfautPortée
workspace.restorePanelsvraiLes panneaux du dock au démarrage.
workspace.restoreTabsvraiLes onglets de la zone centrale.
workspace.restoreFloatingvraiLes fenêtres flottantes.
workspace.detachDragvraiLe détachement au lâcher hors de la fenêtre.

Une disposition ne retient que les fenêtres flottantes ouvertes, leur ordre d'empilement et leur géométrie. La géométrie d'une fenêtre fermée reste une commodité de session : la verser dans un plan ferait qu'appliquer ce plan déplacerait des fenêtres qu'il n'ouvre même pas. Le flottant est appliqué après la zone, sans quoi un panneau que le plan veut voir flotter serait rouvert au centre.

Pages liées