Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/01/2011, à 21:33

Totor

Barre de progression avec Zenity

Bonsoir (et meilleurs voeux à tou[te]s),

Zenity offre une barre de progression mais elle se présente sous forme de "popup". En conséquence, la progression peut être masquée par d'autres fenêtres.
J'ai donc regardé du côté de la fonctionnalité "notification" de zenity pour avoir une icone dynamique.

Il n'y a rien d'indiqué dans la documentation de zenity et après lecture du code source, j'ai pu constaté des options le permettant.

Reste à générer l'icone de progression dynamiquement.

Voici donc un petit script qui :
- génère un fichier png avec une barre de progression
- fourni à zenity le nom de l'icon à afficher et le texte du label

Le fichier png est décomposé de 2 parties :
- la barre de progression
- une zone de texte (limitée - Le label de l'icone permettant un complément d'info)

Par défaut, la zone de texte et le label correspondent à "<pct> %" mais il est tout à fait possible de mettre autre chose.
Exemple : Dans le cadre d'un script d'encodage de plusieurs fichiers
-  la zone de texte peut comporter l'information "quel est le pourcentage d'encodage du fichier en cours de traitement"
-  la barre de progression donne l'information "quel est le pourcentage d'encodage total".
-  et pour le label, l'information "Nom du fichier en cours d'encodage"

Le script :

#!/bin/bash

imgXSize=160
imgYSize=100
font="${HOME}/.fonts/NEUROPOL.ttf"
resultat=.$$_icon.png

gesHelp()
{
    [ $# -ne 0 ] && echo -e  "$@"
    myName=${0##*/}
    cat <<EOF
Usage : ${myName} [ -h | [-W <value>] [-H <value>] [ -f <name> ] ]

    Options:
    -h : print this help
    -W : Width of the icon
    -H : Height of the icon
    -f : font name or file's font name 
EOF
    [ $# -ne 0 ] && return 1
    return 0
}

gesHelpFunction()
{
    [ $# -ne 0 ] && echo -e  "$@"
    cat <<EOF
Usage : makeIcon [-t <value>] [-p <value>] [ -l <notification label> ]

    Options:
    -t : texte into icon 
        default value = "pct %"
    -p : percent of progress (integer) 
        default value=0
    -l : label of the notification
EOF
    [ $# -ne 0 ] && return 1
    return 0
}

makeIcon()
{ 
    unset pct texte label
    OPTIND=0
    while getopts :t:p:l: option
    do
        case "${option}" in
            :) gesHelpFunction "Invalid value for option '${OPTARG}'"
                return 1;;
            "?") gesHelpFunction "Unknown option : ${OPTARG}."
                return 1;;
            t) texte="${OPTARG}";;
            l) label="${OPTARG}";;
            p) pct="${OPTARG}";
                [ "${pct//[0-9]}" ] &&{ gesHelpFunction "Invalid value for option 'p'";  return 1; }
                
                 ((pct < 0 || pct >100 )) && { gesHelpFunction "Invalid value for option 'p'"; return 1; }
            ;;
        esac
    done
    [ ! "${pct}" ] && pct=0
    [ ! "${texte}" ] && texte="${pct} %"
    [ ! "${label}" ] && label="${pct} %"
    
    
    max=$((fillXmin+2*fillwc+(pct*barlength)/100))
    
convert -size ${imgXSize}x${imgYSize} \( xc:none -stroke ${borderColor} \
   -tile gradient:${cylindreEmptyColor} \
                   -draw "roundrectangle ${progressXmin},${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
   -stroke none \
  -tile gradient:${cylindreFullColor} \
                   -draw "roundrectangle ${fillXmin},${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
  -tile gradient:${cylindreFullColor2} \
                   -draw "roundrectangle $((max-2*fillwc)),${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
    \) \
    \( xc:none -stroke none \
            -tile gradient:${cylindreFullColor} \
            -draw "roundrectangle ${fillXmin},${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
            -tile gradient:${cylindreOutColor} \
            -draw "roundrectangle $((max-2*fillwc)),${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
        \( xc:none \
                -stroke ${borderColor} \
                -tile gradient:${cylindreEmptyColor} \
                 -draw "roundrectangle $((progressXmax-2*wc)),${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}"  \
                 -tile gradient:${cylindreInsideColor} \
                -draw "roundrectangle $((fillXmax-2*fillwc)),${fillYmin},${fillXmax},${fillYmax} ${fillwc},${fillhc}"  \) \
                -compose DstAtop -composite \) \
    -compose over -composite \
        -fill none -stroke ${borderColor} -draw "roundrectangle ${progressXmin},${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
        \( xc:none -fill none -stroke ${borderColor} \
            -draw "roundrectangle $((fillXmax-2*fillwc)),${fillYmin},${fillXmax},${fillYmax} ${fillwc},${fillhc}" \
            -draw "roundrectangle $((progressXmax-2*wc)),${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
        \) \
        -background none -layers merge \
    \(   -font "${font}"  \
        -stroke ${fontShadow} -fill red label:"${texte}" -trim +repage  \
        \( +clone -background ${fontShadow} -shadow 80x3+3+3 \
        \) +swap -background none -layers merge \) \
    -insert 0 -gravity center -append \
    -background none -gravity center -extent ${imgXSize}x${imgYSizeOrigin} \
   "${resultat}"
    printf "icon:%s\ntooltip:%s\n"  "${resultat}" "${label}"
}
OPTIND=0
while getopts :hH:W:f: option
do
    case "${option}" in
        h) gesHelp
            exit 0;;
        :) gesHelp "Invalid value for option '${OPTARG}'"
            exit 1;;
        "?") gesHelp "Unknown option : ${OPTARG}."
            exit 1;;
        H) imgYSize=${OPTARG};;
        W) imgXSize=${OPTARG};;
        f) font="${OPTARG}";;
    esac
done

borderColor=silver
cylindreEmptyColor=AliceBlue-DimGray
cylindreInsideColor=AliceBlue-darkgray
cylindreFullColor=green3-DarkGreen
cylindreFullColor2=green2-DarkGreen
cylindreOutColor=lime-Green4
texteColor=red


progressYmax=$(((imgYSize*95)/100)) 
progressYmin=$(((imgYSize*55)/100))
progressXmin=$(((imgXSize*5)/100))
progressXmax=$((imgXSize-progressXmin))
wc=$(((progressYmax-progressYmin)/4))
hc=$(((progressYmax-progressYmin)/2))
fontShadow=firebrick3


imgYSizeOrigin=${imgYSize}
epaisseur=$(((imgYSize*5)/100))
((progressYmin=epaisseur/2))
imgYSize=$((imgYSize*45/100))
((progressYmax=imgYSize-progressYmin))

fillYmin=$((progressYmin+epaisseur))
fillYmax=$((progressYmax-epaisseur))
fillwc=$(((fillYmax-fillYmin)/4))
fillhc=$(((fillYmax-fillYmin)/2))
fillXmin=$((progressXmin+epaisseur))
fillXmax=$((progressXmax-wc+fillwc))
barlength=$((fillXmax-2*fillwc-fillXmin))

Exemple d'utilisation :

#!/bin/bash

# chargement du script en précisant la taille de l'icon et la font à utiliser
# par défaut, la taille est de 120x100 
# note : plus la taille est grande et plus la durée de création de l'icon est longue
. ~/bin/makeIcon.sh -W 120 -H 100 -f ~/.fonts/DS-DIGI.TTF

{
for((x=0;x<=100;x+=5))
do
makeIcon -p ${x} -l "Traitement à ${x} %" -t "${x}/100"
sleep 0.5
done
read -n1
rm -f "${resultat}"
} | zenity --notification --listen

La font utilisée est disponible ici
Au passage, le nom de l'icone est indiquée dans la variable "resultat" et n'est volontairement pas supprimée

enjoy....

PS : La génération du png s'effectue grace à imagemagick. A ce propos, je remercie Anthony pour son aide...

Dernière modification par Totor (Le 17/01/2011, à 16:02)


-- Lucid Lynx --

Hors ligne

#2 Le 30/01/2011, à 13:04

Zakhar

Re : Barre de progression avec Zenity

Superbe ça !

Et merci d'avoir lu le code de Zenity car la documentation manque cruellement de détails.
Je me demandais comment on pouvait faire en sorte de changer l'icone très moche qui s'affiche lorsqu'on fait une notification...

Et donc tu donnes la réponse, on fait

zenity --notification --listen

--listen n'est même pas mentionné dans la documentation en ligne !
Il est juste mentionné dans le man, et si on fait :

$ zenity --help-notification
Utilisation :
  zenity [OPTION...]

Options de l'icône de notification
  --notification                              Affiche une notification
  --text=TEXTE                                Définit le texte de notification
  --listen                                    Écoute les commandes issues de stdin

Seulement, on lit bien "ecoute les commandes issues de stdin", mais lesdites commandes ne sont pas décrites !..

Donc de ta découverte du code, on pourrait rajouter :

Commandes :
icon:path_of_the_icon  # Chemin de l'icône à afficher
tooltip:text_of_tooltip  # Texte de l'infobulle

Merci, je vais faire mumuse avec ça !

D'autres "commandes" intéressantes ?

P.S.: question subsidiaire... que devient Zenity avec la 10.10 puisque exit Gnome ?...

Dernière modification par Zakhar (Le 30/01/2011, à 13:04)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 14/03/2011, à 14:56

Totor

Re : Barre de progression avec Zenity

Salut,

Désolé, je n'avais pas vu ta demande. Oui, il y a d'autres options.
- message (pour afficher via libnotify)
- visible

code source


-- Lucid Lynx --

Hors ligne