outils/OutilPalette.js

/*
 * Created by yvesb on 23/01/2017.
 */
/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */
import Outil from './Outil'
import NatObj from '../types/NatObj'
import Nat from '../types/Nat'
import addQueue from 'src/kernel/addQueue'

export default OutilPalette
/**
 * Outil servant à modifier le style de tracé ou la couleur d'un objet
 * @param {MtgApp} app L'application propriétaire
 * @constructor
 */
function OutilPalette (app) {
  Outil.call(this, app, 'Palette', 32810, false)
}

OutilPalette.prototype = new Outil()

OutilPalette.prototype.select = function () {
  const app = this.app
  Outil.prototype.select.call(this)
  app.outilPointageActif = app.outilPointageCre
  app.outilPointageActif.aDesigner = NatObj.NTtObjSaufDuplique
  app.outilPointageActif.reset()
  this.cursor = 'default'
}

/**
 * Fonction traitant l'objet désigné
 * @param {CElementGraphique} elg l'objet dont le style est à modifiér
 * @param {Point} point Coordonnées du point cliqué (pas utilisé ici)
 * @param bForProtocol : true seulement quand cette fonction est appelée depuis la boîte de dialogue de protocole
 */
OutilPalette.prototype.traiteObjetDesigne = function (elg, point, bForProtocol = false) {
  let i
  const app = this.app
  let objetChange = (app.getCouleur() !== elg.couleur)
  const styleTrait = app.getStyleTrait()
  const stylePoint = app.getStylePoint()
  const styleFleche = app.getStyleFleche()
  const styleMarqueSegment = app.getStyleMarqueSegment()
  const styleMarqueAngle = app.getStyleMarqueAngle()
  elg.donneCouleur(app.getCouleur())
  if (elg.estDeNature(Nat.or(NatObj.NSurface, NatObj.NDemiPlan))) {
    objetChange = objetChange || (elg.styleRemplissage !== app.getStyleRemplissage())
    // Nécessaire d'utiliser donneStyleRemplissage car pour un remplissage quadrillé il faut redéfinir le pattern
    if (objetChange) elg.donneStyleRemplissage(app.getStyleRemplissage())
  } else {
    if (elg.estDeNature(NatObj.NTtPoint)) {
      objetChange = objetChange || (elg.motif !== stylePoint)
      elg.motif = stylePoint
    } else {
      if (elg.estDeNature(NatObj.NLieuDiscret)) {
        objetChange = objetChange || (elg.motif !== stylePoint)
        elg.motif = stylePoint
      } else {
        if (elg.estDeNature(NatObj.NMarqueSegment)) {
          objetChange = objetChange || (elg.motif !== styleMarqueSegment) ||
            (elg.style !== styleTrait)
          elg.motif = styleMarqueSegment
          elg.style = styleTrait
        } else {
          if (elg.estDeNature(NatObj.NGrapheSuiteRecComplexe)) {
            objetChange = objetChange || (elg.motif !== stylePoint) ||
              (elg.style !== styleTrait)
            elg.motif = stylePoint
            elg.style = styleTrait
            elg.updateObjetsInternes()
          } else {
            if (elg.estDeNature(NatObj.NVecteur)) {
              objetChange = objetChange || (elg.motifFleche !== styleFleche)
              elg.donneStyleFleche(styleFleche)
            } else {
              if (elg.estDeNature(NatObj.NMarqueAngle)) {
                objetChange = objetChange || (elg.styleMarque !== styleMarqueAngle)
                elg.donneStyleMarque(styleMarqueAngle)
                if (elg.estOriente()) {
                  objetChange = objetChange || (elg.motifFleche !== styleFleche)
                  elg.donneStyleFleche(styleFleche)
                }
              } else {
                // Version 7.0 : Si on change le style du lieu d'objet d'un point
                // on donne au point ancetre du lieu d'objets le style de point actif
                if (elg.estDeNature(NatObj.NLieuObjet) && elg.elementAssocie.estDeNature(NatObj.NTtPoint)) {
                  elg.elementAssocie.motif = stylePoint
                  elg = elg.elementAssocie
                  objetChange = true
                }
              }
            }
          }
        }
      }
    }
  }
  if (elg.estDeNature(NatObj.NObjLigne)) {
    objetChange = objetChange || (elg.style !== styleTrait)
    elg.donneStyle(styleTrait)
  }
  if (bForProtocol) return
  this.saveFig()
  if (objetChange) {
    const list = app.listePr
    list.metAJourObjetsDependantDe(elg) // Nécessaire pour les lieux d'objets
    // Il faut d'abord appeler setReady4MathJax pour tous les éléments graphiques à réafficher
    // puis appeler via la pile de Mathjax une fonction qui va remplacer tous leur gElements
    // par un nouveaupour tenir compte du changement de style
    // I faut appeler positionne pour les élments dépendnat de elg par exemple pour les marques de segment
    list.positionneDependantsDe(false, app.dimf, elg)
    for (i = 0; i < list.longueur(); i++) {
      const el = list.get(i)
      if (el.existe && el.estDeNature(NatObj.NTtObj) && !el.estElementIntermediaire() && el.depDe(elg)) {
        el.setReady4MathJax()
      }
    }
    const svg = app.svgFigure
    addQueue(function () {
      for (i = 0; i < list.longueur(); i++) {
        const el = list.get(i)
        if (el.estDeNature(NatObj.NTtObj) && !el.estElementIntermediaire() && el.depDe(elg) && el.hasgElement) {
          const g = el.createg(svg, app.doc.couleurFond)
          svg.replaceChild(g, el.g)
          g.setAttribute('id', el.id)
          el.g = g
          if (el.estDeNature(NatObj.NObjNommable) && (el.nom !== '') &&
            !el.nomMasque) el.updateName(svg, true)
          if (el.estDeNature(NatObj.NEditeurFormule)) {
            if (el.affichageFormule) {
              el.latex.isToBeUpdated = true
              el.latex.update(svg)
              el.glatex = el.latex.g
            }
          }
        }
      }
    })
  }
  // this.select();
}