import { ViewsQuery } from './ViewsQuery'; import { Class_ViewSwitchProgress } from './viewSwitchProgress'; import type { Class_DrawingArea } from './DrawingArea'; import type { Type_JSON } from './Utils'; import type { Class_ApplicationData } from './ApplicationData'; /** * #1316 — Viewer intégral : lecture des vues en OpenSankey (open source). * * `ViewsReader` porte le sous-ensemble LECTURE du système de vues (décodage `views` + delta * `__patch`, reconstruction de la drawing area d'une vue, bascule `current_view`, navigation, * application de la sélection de visibilité). Il compose `ViewsQuery` (logique pure) comme le * faisait `ViewsManager`, et opère la DA via l'hôte `Class_ApplicationData`. * * La CRÉATION / ÉDITION des vues (heredited_attr, snapshot « original », dialogues de * sauvegarde, promotion light→heavy, suppression, sync depuis les view tags) reste en * OpenSankey+ : `ViewsManager` (OSP) ÉTEND cette classe et * - surcharge `fromViewJSON` pour reconstruire via `DrawingAreaPersistenceOSP` (fidélité * édition + `name` + conversion legacy pré-0.9) ; * - surcharge les hooks-gabarit de `setCurrentView` (`interceptViewChange`, * `afterHeavyViewLoaded`, `afterLightViewLoaded`, `updateViewMenus`) et de `viewsFromJSON` * (`onViewParsed`) pour y greffer la logique d'édition, SANS dupliquer le corps de lecture. * * Ainsi un viewer OS pur restitue un fichier multi-vues ; l'atelier d'édition reste OSP. */ export declare class ViewsReader { protected readonly host: Class_ApplicationData; protected readonly query: ViewsQuery; /** * os#1368 — Ordonnanceur du switch INTERACTIF (cf. `requestViewChange`) : pose l'indicateur, * cède la main au navigateur, puis travaille. Non armé tant que personne ne demande de switch * interactif : `setCurrentView` (chemin programmatique, exports et options de publication) * n'en dépend pas et reste strictement synchrone. */ protected switch_progress: Class_ViewSwitchProgress; /** * Le même ordonnanceur, ouvert aux AUTRES gestes lourds (filtrage par dataTag, os#1369) via * `Class_ApplicationData.runHeavyGesture`. Partagé à dessein : un seul voile à l'écran, et * l'invariant d'ordre vaut alors ENTRE les gestes — un changement de dataTag demandé pendant * une bascule de vue cédée ne s'applique plus avant elle. */ get gesture_progress(): Class_ViewSwitchProgress; constructor(host: Class_ApplicationData); resolveViewIdFromSelection(selection: string): string | null; resolveHeavyViewIdFromViewTagSelection(selection: Record): string | null; parseViewExtraFields(view_id: string, view_json: Type_JSON): void; get all_view_labels(): string[]; viewIdsWithLabel(label: string): string[]; get has_views(): boolean; get is_view_master(): boolean; get is_current_view_light(): boolean; get views_navigation_order(): string[]; get has_master_sankey(): boolean; get master_view(): Class_DrawingArea | undefined; get has_view_before(): boolean; get has_view_after(): boolean; get layout_view_sources(): Array<{ id: string; name: string; }>; pushViewIdInViewOrder(id: string): void; moveViewUpInOrder(id: string): void; moveViewDownInOrder(id: string): void; /** * Reconstruit une DA depuis le JSON d'une vue. OS : persistance de LECTURE * (`DrawingAreaPersistence`). OSP surcharge pour `DrawingAreaPersistenceOSP` (ajoute le `name` * de la DA + la conversion legacy pré-0.9). C'est LE point de couplage persistance. */ protected fromViewJSON(drawing_area: Class_DrawingArea, parsed_json: Type_JSON): void; /** * Appelé pour chaque vue lue par `viewsFromJSON`, après `parseViewExtraFields`. OS : rien. * OSP y migre les `heredited_attr` (overrides d'attributs par source — concept d'édition). */ protected onViewParsed(_view_id: string, _view_json: Type_JSON): void; /** * Intercepteur de bascule de vue (avant tout switch). OS : jamais (retourne false). OSP : * si la vue courante a des modifs non sauvegardées, déclenche la pop-up « sauvegarder ? » et * retourne true pour AVORTER le switch immédiat. */ protected interceptViewChange(_id: string): boolean; /** Après chargement d'une vue HEAVY. OS : rien. OSP : cascade heredited_attr + clone « original ». */ protected afterHeavyViewLoaded(_id: string): void; /** Après chargement d'une vue LIGHT. OS : rien. OSP : purge le snapshot « original ». */ protected afterLightViewLoaded(_id: string): void; /** Rafraîchit les composants de menu liés aux vues. OS : menus de base. OSP : + menus OSP. */ protected updateViewMenus(): void; /** * Construit une DA à partir du JSON gzip d'une vue, SANS toucher l'état vivant (ni la DA * courante ni son rendu). Utilisé par le switch de vue (via `extractViewFromJSON`). */ buildDrawingAreaFromViewJSON(json_object: Uint8Array, view_id: string): Class_DrawingArea; /** Reconstruit la DA d'une vue heavy depuis son snapshot et bascule la DA courante dessus. */ extractViewFromJSON(json_object: Uint8Array, view_id: string): void; /** * Retourne une DA temporaire reconstruite depuis le snapshot d'une vue (source de mise en * page), SANS basculer la DA courante. `master` => la DA maître vivante. */ getDrawingAreaFromViewId(id: string): Class_DrawingArea | undefined; /** Charge les vues d'un fichier (clé `views`) et rouvre sur la vue active sauvegardée. */ viewsFromJSON(json_object: Type_JSON): void; /** * Applique la sélection de visibilité d'une vue sur le Sankey OS courant : pour chaque groupe * de view tags, sélectionne l'étiquette demandée + active le mode filtre, ou éteint le filtre * si la vue ne contraint pas ce groupe (vue complète). * * os#1382 : plus de cas particulier pour les groupes unitaires câblés — ils ne sont * plus créés, et un ancien fichier qui en porte les décrit avec view_mode=false, donc * la boucle les traverse sans rien changer. */ applyViewTagSelection(selection: { [view_tagg_id: string]: string; } | undefined): void; /** * Bascule PROGRAMMATIQUE : strictement synchrone, inchangée. C'est le contrat dont dépendent les * appelants qui lisent la vue au retour — export de toutes les vues (`iterateAllViews`), * application des options de publication à l'ouverture, suites de tests. */ setCurrentView(id: string): void; /** * os#1368 — Bascule INTERACTIVE (geste d'utilisateur : sélecteur, bandeau, vignette, F7/F8/F9, * lien `view://`). Même corps que `setCurrentView`, seul l'ORDONNANCEMENT change : sur le chemin * heavy, un indicateur est posé, la main est rendue au navigateur le temps qu'il le peigne, puis * seulement le travail lourd démarre — et l'indicateur est retiré au retour, échec compris. * * L'interception OSP (« sauvegarder ? ») reste évaluée SYNCHRONEMENT, avant toute cession : un * switch avorté n'a pas d'indicateur à retirer. * * Le chemin light reste synchrone : il ne reconstruit rien, et lui coûter une frame pour un * clignotement serait pire que rien. */ requestViewChange(id: string): void | Promise; /** Corps du switch : pose la nouvelle vue (light/heavy), la visibilité, la caméra et redessine. */ protected applyViewChange(id: string): void; setCurrentViewToMaster(): void | Promise; setCurrentViewToNext(): void | Promise; setCurrentViewToPrev(): void | Promise; /** Doc markdown `view://` links : activer la vue ciblée (no-op si l'id n'existe plus). */ navigateToView(id: string): void | Promise; }