### 3.6. Estendere lo script Text Box

#### 3.6.1. Gestire correttamente l'annullamento

When creating a script, you want to give your users the ability to undo their actions, should they make a mistake. This is easily accomplished by calling the functions `gimp-image-undo-group-start` and `gimp-image-undo-group-end` around the code that manipulates the image. You can think of them as matched statements that let GIMP know when to start and stop recording manipulations on the image, so that those manipulations can later be undone.

Se si crea una immagine completamente nuova non ha molto senso utilizzare queste funzioni poiché non si sta modificando una immagine preesistente. Tuttavia quando si modificano altre immagini è consigliabile farne uso.

L'annullamento di uno script è possibile solo quando si utilizzano queste funzioni.

#### 3.6.2. Ulteriore estensione dello script

Ora che si ha uno script per creare riquadri di testo aggiungiamovi due funzionalità:

- Currently, the image is resized to fit exactly around the text — there's no room for anything, like drop shadows or special effects (even though many scripts will automatically resize the image as necessary). Let's add a buffer around the text, and even let the user specify how much buffer to add as a percentage of the size of the resultant text.

- Questo script potrebbe facilmente essere utilizzato in altri script che lavorano con il testo. Lo si estenderà facendogli restituire l'immagine e i livelli in modo che altri script possano chiamarlo e utilizzare le immagini e i livelli creati.

#### 3.6.3. Modificare i parametri e la funzione di registrazione

Per consentire all'utente di specificare la dimensione della spaziatura si aggiungerà un parametro alla funzione principale e alla funzione di registrazione:

      (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
      (let*
            (
               ; define our local variables
               ; create a new image:
               (theImageWidth  10)
               (theImageHeight 10)
               (theImage (car
                              (gimp-image-new
                               theImageWidth
                               theImageHeight
                               RGB
                              )
                         )
               )
               (theText)          ;a declaration for the text
                                  ;we create later

               (theBuffer)        ;added

               (theLayer
                         (car
                             (gimp-layer-new
                              theImage
                               "layer 1"
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              100
                              LAYER-MODE-NORMAL
                             )
                         )
               )
            ) ;end of our local variables

       [Code here]
     )

      (script-fu-register
        "script-fu-text-box"                        ;function name
        "Text Box"                                  ;menu label
        "Creates a simple text box, sized to fit\
          around the user's choice of text,\
          font, font size, and color."              ;description
        "Michael Terry"                             ;author
        "copyright 1997, Michael Terry;\
          2009, the GIMP Documentation Team"        ;copyright notice
        "October 27, 1997"                          ;date created
        ""                                      ;image type that the script works on
        SF-STRING      "Text"          "Text Box"   ;a string variable
        SF-FONT        "Font"          "Charter"    ;a font variable
        SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                    ;a spin-button
        SF-COLOR       "Color"         '(0 0 0)     ;color variable
        SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                    ;a slider
      )
      (script-fu-menu-register "script-fu-text-box" "<Image>/Filters/Tutorial")

#### 3.6.4. Aggiungere nuovo codice

Si aggiungerà il codice in due posizioni: appena prima il ridimensionamento dell'immagine e alla fine dello script (per restituire l'immagine, il livello e il testo).

Dopo aver ottenuto le dimensioni del testo si devono aggiustare i valori in base all'entità della spaziatura specificata dall'utente. Non si effettuerà nessun controllo di errore per assicurarsi che il valore sia compreso tra 0 e 100% anche per dare la possibilità di immettere valori superiori come ad esempio «200» come percentuale del buffer da aggiungere.

            (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

            (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
            (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )

Il codice imposta la spaziatura in basse all'altezza del testo e la somma due volte sia all'altezza che alla larghezza della nuova immagine. (La si somma due volte perché la spaziatura è su entrambi i lati).

Ora che l'immagine è stata ridimensionata tenendo conto della spaziatura si deve centrare il testo all'interno dell'immagine. Questo si ottiene spostando lungo le coordinate (x, y) il livello del testo di (`theBuffer`, `theBuffer`). Aggiungere la linea seguente dopo il ridimensionamento dell'immagine:

            (gimp-layer-set-offsets theText theBuffer theBuffer)

Go ahead and save your script, and try it out after restarting GIMP.

Quello che rimane è restituire l'immagine, il livello e il livello del testo. Dopo la visualizzazione dell'immagine aggiungere la linea seguente:

    (list theImage theLayer theText)

Questa è l'ultima linea della funzione, la lista viene quindi resa disponibile ad altri script che vogliano farne uso.

Per utilizzare il nuovo script Text Box in un altro script si potrebbe scrivere qualcosa come:

            (set! theResult (script-fu-text-box
                             "Some text"
                             "Charter" "30"
                             '(0 0 0)
                             "35"
                            )
            )
            (gimp-image-flatten (car theResult))

Complimenti, si è ora in procinto di acquisire la Cintura Nera di Script-Fu!

3.5. Aggiunta di ulteriori funzionalità |  | 3.7. Lo script e il suo funzionamento

Report a bug in GIMP Segnalate l'errore sulla piattaforma apposita