; +-------------------------------------------------------------+
; | Dialog Couleurs/Déco v2.5 (colorholic edition)              |
; | © Gen, Nisroch & coco77 2004-2021                           |
; | Site: http://wushunisroch.free.fr                           |
; | Pour toutes infos : irc://irc.geeknode.org/zebulon.fr       |
; +-------------------------------------------------------------+

alias f4 { if ($dialog(color).title != $null) { dialog -v color | halt }
  dialog -m color color
}

/*
Console de gestion des couleurs
*/
dialog color {
  title "Couleurs & Décoration"
  size -1 -1 230 300
  ; Boutons
  button "&OK" 17,70 269 90 25, ok
  button "Aide &couleurs" 18,5 132 80 25
  button "Reset coul." 19,90 132 65 25
  button "Reset déco" 20,160 132 65 25
  ; Couleurs
  text "Clic dans l'editbox, CTRL+K ,        faites votre choix." 7,15 23 95 40
  text "Majuscule" 45,120 23 80 15
  edit "" 4,120 40 35 20, autohs  
  text "Texte" 55,180 23 43 15
  edit "" 5,180 40 35 20, autohs
  ; Options
  check "&Gras" 13,20 195 60 20
  check "&Majuscule" 1,20 175 70 20
  check "&Activer" 2,120 195 60 20
  check "&Souligner pseudo" 3,120 175 100 20
  ; Décoration
  text "Avant" 200,15 85 35 15
  edit "" 300,15 102 95 20, autohs
  text "Après" 400,120 85 35 15
  edit "" 500,120 102 95 20, autohs
  ; Panels
  box "Couleurs" 40,5 10 220 58
  box "Options" 50,5 161 220 57
  box "Décorations" 100,5 72 220 57
  box "Aperçu" 60,5 222 220 42
}

/*
Initialisation du dialog
*/
on 1:dialog:color:init:0: {
  if (%deco.soul == on) { did -c color 3 }
  if (%deco.enable == on) { did -c color 2 }
  if (%deco.maj == on) { did -c color 1 }
  if (%deco.gras != $null) { did -c color 13 }
  did -a color 4 %deco.color1
  did -a color 5 %deco.color2
  did -a color 300 %deco.begin
  did -a color 500 %deco.end
  ; Création de la fenêtre d'aperçu
  window -Bhk0do +dL @Aperçu
  dcx Mark $dname color_cb
  xdialog -c color 62 window 7 237 233 20 @Aperçu
  if (%deco.soul == on) { aline @Aperçu $coloration(test  $+ $me) }
  else aline @Aperçu $coloration(test $me)
}

/*
Réactions au clic
*/
on 1:dialog:color:sclick:*:{
  ; Aide couleurs
  if ($did == 18) { coul }
  ; Reset couleurs
  if ($did == 19) {
    set %deco.color1
    set %deco.color2
    did -r color 4,5
    color.refresh
  }
  ; Reset déco
  if ($did == 20) {
    set %deco.begin
    set %deco.end
    did -r color 300,500
    color.refresh
  }
  ; Activation du script
  if ($did == 2) {
    if (%deco.enable == on) { %deco.enable = $null | did -u color 2 }
    elseif (%deco.enable == $null) { set %deco.enable on | did -c color 2 }
    else { set %deco.enable on | did -c color 2 }
    color.refresh
  }
  ; Activation du gras
  if ($did == 13) { 
    if (%deco.gras != $null) { %deco.gras = $null | did -u color 13 }
    elseif (%deco.gras = $null) { set %deco.gras  | did -c color 13 }
    else { set %deco.gras  | did -c color 13 }
    color.refresh
  }
  ; Activation de la majuscule
  if ($did == 1) { 
    if (%deco.maj == on) { %deco.maj = $null | did -u color 1 }
    elseif (%deco.maj == $null) { set %deco.maj on | did -c color 1 }
    else { set %deco.maj on | did -c color 1 }
    color.refresh
  }
  ; Activation des pseudos soulignés
  if ($did == 3) {
    if (%deco.soul == on) { %deco.soul = $null | did -u color 3 }
    elseif (%deco.soul == $null) { set %deco.soul on | did -c color 3 }
    else { set %deco.soul on | did -c color 3 }
    color.refresh
  }
}

/*
Gestion et affichage couleurs décorations
*/
on 1:dialog:color:edit:*:{
  if ($did == 4) {
    if ($len($did(4)) < 3) { set %deco.color1 0 $+ $right($did(4),1) | did -a color 4 %deco.color1 | color.refresh }
    else { set %deco.color1 $did(4) | color.refresh }
  }
  if ($did == 5) {
    if ($len($did(5)) < 3) { set %deco.color2 0 $+ $right($did(5),1) | did -a color 5 %deco.color2 | color.refresh }
    else { set %deco.color2 $did(5) | color.refresh }
    if (%deco.color2 == %deco.color1) { set %deco.color2 | color.refresh }
  }
  if ($did == 300) { set %deco.begin $did(300) | color.refresh }
  if ($did == 500) { set %deco.end $did(500) | color.refresh }
}

/*
Evènement
*/
on 1:input:*:{
  ; Input problem
  var %1
  if (($1- !== ?) && ($left($1-,1) == ?) && ($left($1-,2) !== ??)) {
    var %lettre = $?="Lettre manquante ? $crlf $+ $1", %1 = %lettre $+ $right($1-,-1)
  }
  else { %1 = $1- }
  ; Exceptions
  if (%deco.enable != on ) { goto fin }                      ; Le script est actif
  if (/ isin $left($1-,1)) { goto fin }                      ; Ce n'est pas une /commande
  if ($matchtokcs($chan(#).mode,c,0,32) == 1) { goto fin }   ; Le mode +c n'est pas actif sur le canal
  if (anime isin $chan)  { goto fin }                        ; "anime" n'est pas dans le nom du canal
  if (fansub isin $chan) { goto fin }                        ; "fansub" n'est pas dans le nom du canal
  if (otaku isin $chan)  { goto fin }                        ; "otaku" ça c'est pour mes coupaings
  if (moetaku isin $chan) { goto fin }                       ; "#moetaku" except
  if (http: isin $left($1-,5)) { goto fin }                  ; Ce n'est pas une adresse "http:"
  if (https: isin $left($1-,6)) { goto fin }                 ; Ce n'est pas une adresse "https:"
  if (ftp: isin $left($1-,4)) { goto fin }                   ; Ce n'est pas une adresse "ftp:"
  if (www isin $left($1-,3)) { goto fin }                    ; Ce n'est pas une adresse "www"
  if (! isin $left($1-,1)) { goto fin }                      ; Ce n'est pas un !trigger
  if ( isin $left($1-,1)) { goto fin }                      ; Le texte ne commence pas par une couleur (Ctrl+K)
  if ( isin $left($1-,1)) { goto fin }                      ; Le texte n'est pas en mode reverse (Ctrl+R)
  if ( isin $left($1-,1)) { goto fin }                      ; Le texte ne commence pas par Ctrl+O
  if ($active == $query($active)) { goto fin }               ; Le script est actif pour les fenêtre query aussi ... ou pas
  ; Fonction de coloration
  if ($query($active) != $null || $chan != $null) { .say $coloration(%1) | halt }
  :fin
}

/*
Coloration
*/
alias coloration {
  var %line
  ; Souligner les pseudos
  if (%deco.soul == on) {
    var %nb  = 1, %mot = $gettok($1-, %nb, 32), %punct, %reg = ^([^,.>!?;:]+)([,.>!?;:]+)$
    while (%mot != $null) {
      if ($regsub(%mot, %reg, \2, %punct) == 0) { %punct = $null }
      %mot = $regsubex(%mot, %reg, \1)
      if (%mot ison #) { var %line %line  $+ %mot $+  $+ %punct }
      else { var %line %line %mot $+ %punct }
      inc %nb
      %mot = $gettok($1-, %nb, 32)
    }
  }
  else { %line = $1- }
  ; Saut de tous les caractères Ctrl+u, Ctrl+b & Ctrl+i et arrêt à un caractère Ctrl+k
  var %c = 1
  var %txt.left = $left(%line,%c)
  while ($regex($right(%txt.left,1),[]) > 0) {
    if (%c > $len(%line)) { break }
    inc %c 
    %txt.left = $left(%line,%c)
    if ($right(%txt.left,1) == ) { return %line }
  }
  ; Application de la Majuscule
  if (%deco.maj == on) { %txt.left = $upper(%txt.left) }
  var %txt.right = $mid(%line, $calc(%c + 1))
  ; Correction problème de virgule
  if ($left(%txt.right, 1) == $chr(44)) { %txt.right = $chr(44) $+ 99 $+ %txt.right }
  ; Application des couleurs et retour de la fonction
  return %deco.begin  $+ $+(%deco.gras,%deco.color1,%txt.left,%deco.color2,%txt.right, %deco.end)
}

; Rafraichissement de la fenêtre d'aperçu
alias -l color.refresh {
  if (%deco.soul == on) { rline @Aperçu 1 $coloration(test  $+ $me) }
  else rline @Aperçu 1 $coloration(test $me)
}

; Alias obligatoire pour DCX
alias color_cb { if (($2 == sclick) && ($3 == 0)) { haltdef } }

; Retourne la valeur de la luminosité d'une couleur en %
alias bright { return $calc(($gettok($rgb($1),1,44) + $gettok($rgb($1),2,44) + $gettok($rgb($1),3,44)) / (3 * 2.55)) }


; Fermeture du dialog
on 1:dialog:color:close:*: { .timer 1 0.2 window -c @Aperçu }

/*
Aide pour tester les couleurs
*/
alias coul {
  var %txt.white = 0
  var %txt.black = 1
  if ($bright($color(0)) < 50) { %txt.white = 1 | %txt.black = 0 }
  echo -ag  $+ %col1 $+ *******************
  var %i = 0
  while (%i < 99) {
    var %txt.color = %txt.white | if ($bright($color(%i)) > 50) { %txt.color = %txt.black }
    var %l =  $+ %txt.color $+ , $+ [ %i ] $+ %deco.c [ $+ [ %i ] ] $+  $+ [ %i ] $+ , $+ [ %i ]
    while ($len(%l) < 40) { %l = %l $+ _ }
    echo -ag $wrap(%l, $window($active).font, $window($active).fontsize, 160, 0, 1) %i
    inc %i
  }
  echo -ag  $+ %col1 $+ *******************
}
