<?php
namespace nur\v\model;

/**
 * Interface ILayoutManager: interface pour un gestionnaire de mise en page
 */
interface ILayoutManager extends ITagsManager {
  /**
   * indiquer si du contenu est affiché dans la section actuelle. dans ce cas,
   * les contenus mis en attente seront affichés eux aussi si on utilise
   * {@link flushContent()}
   */
  function haveContent(): bool;

  /** mettre en attente l'affichage du contenu spécifié */
  function add($vs): void;

  /**
   * $haveContent spécifie s'il y a actuellement du contenu à afficher. mais
   * avant d'afficher ce contenu, il faut traiter le contenu en attente.
   *
   * si $haveContent==true et qu'il y a du contenu en attente, le retourner
   * pour affichage. sinon, retourner un tableau vide.
   *
   * ensuite, le contenu en attente est supprimé
   */
  function flushContent(bool $haveContent=false): ?array;

  /**
   * si {@link haveContent()} est vrai, retourner le contenu encore en attente
   * pour affichage, puis {@link flushContent()}
   */
  function flush(bool $haveContent=false): ?array;

  /**
   * @see ITagsManager::push()
   * faire {@link flushContent()} avant d'afficher $start
   */
  function push($mark, ?array $start=null, ?array $end=null): ?array;

  /**
   * @see ITagsManager::pop()
   * faire {@link flushContent()} avant de dépiler les couches
   */
  function pop($mark): ?array;

  /** commencer une ligne de façon inconditionnelle */
  function startRow($options=null): ?array;
  /** terminer la ligne en cours et en commencer une nouvelle */
  function row($options=null): ?array;

  /** terminer la colonne en cours et en commencer une nouvelle */
  function col($size, $options=null): ?array;

  /** terminer le panel en cours et en commencer un nouveau */
  function panel($title, $options=null): ?array;

  /** faire {@link flushContent()} puis terminer explicitement un panel */
  function endPanel(): ?array;

  /** faire {@link flushContent()} puis terminer explicitement une colonne */
  function endCol(): ?array;

  /** faire {@link flushContent()} puis terminer explicitement une ligne */
  function endRow(): ?array;

  /** faire {@link flushContent()} puis terminer toutes les sections en cours */
  function end(): ?array;
}