[affichage] Ajout d'une fonction de style dédiée pour dialog

This commit is contained in:
Pierre-Elliott Bécue 2014-05-08 22:42:11 +02:00
parent 9085bc35e8
commit b26e329e83

View file

@ -1,5 +1,36 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Vrac d'outils pour avoir un affichage sympathique.
# Auteur : Pierre-Elliott Bécue <becue@crans.org>
# Licence : GPLv3
#
# Contenu :
# ---------
#
# Décorateur :
# static_var(name, val), un décorateur pour créer une variable
# statique dans une fonction
#
# Fonctions :
# getTerminalSize(), une fonction qui récupère le couple
# largeur, hauteur du terminal courant.
# cap_text(text, length), un raccourci pour couper un texte
# trop long en mettant …
# format_percent(percent), un raccourci qui fait en sorte
# qu'un pourcentage prenne toujours autant de caractères
# en ajoutant des espaces (c'est pour les prints dynamiques)
# rojv(percent, seuils, couls), une méthode qui affiche une couleur
# pour un pourcentage en fonction de la valeur de celui-ci, des
# seuils définis, et des couleurs disponibles.
# style(texte, what), une méthode qui applique un ensemble de styles
# contenus dans what au texte texte.
# dialogStyle(texte, what), pareil, mais dans dialog
# prettyDoin(what, status), une méthode qui affiche des messages "service"-
# like, en mettant le status en fonction de l'accomplissement de la tâche.
#
# Classes :
# Animation, une classe générant les animations type "progress bar".
import sys
import os
@ -7,6 +38,7 @@ import fcntl
import termios
import struct
import functools
import time
def static_var(name, val):
"""Decorator setting static variable
@ -53,10 +85,10 @@ def getTerminalSize():
return int(cr[1]), int(cr[0])
def cap_text(text, length):
"""Cap text length to length
"""Cap text length to length-1
"""
if len(text) > length:
if len(text) >= length:
return text[0:length-1] + ""
else:
return text
@ -105,7 +137,7 @@ class Animation(object):
"""
def __init__(self, texte, nb_cycles=0, couleur=True, kikoo=True):
def __init__(self, texte, nb_cycles=0, couleur=True, kikoo=True, timer=True):
"""__init__
"""
@ -114,6 +146,8 @@ class Animation(object):
self.kikoo = kikoo
self.step = 0
self.couleur = couleur
self.timer = timer
self.beginTime = 0
def kikoo(self, kikoo):
"""Switch pour la valeur kikoo"""
@ -123,6 +157,8 @@ class Animation(object):
"""Effectue une étape dans l'affichage
"""
if self.step == 0 and self.timer:
self.beginTime = time.time()
cols, _ = getTerminalSize()
if not self.nb_cycles > 0:
@ -136,8 +172,8 @@ class Animation(object):
percent = "%s %%" % (format_percent(percent),)
sys.stdout.write("\r%s : %s" % (cap_text(self.texte, cols - 10), percent))
else:
# La kikoo bar est une barre de la forme [###### ]
# Nombre de #
# La kikoo bar est une barre de la forme [======> ]
# Nombre de =
amount = percent/4
# On remplit le reste avec des espaces.
if self.couleur:
@ -155,6 +191,10 @@ class Animation(object):
format_percent(percent))
sys.stdout.write("\r%s %s" % (cap_text(self.texte, cols - 45),
kikoo_print))
if self.timer:
self.elapsedTime = time.time() - self.beginTime
sys.stdout.write(" (temps écoulé : %ds)" % (self.elapsedTime))
sys.stdout.flush()
self.step += 1
@ -190,8 +230,6 @@ def style(texte, what=[]):
"""
if isinstance(what, str):
what = [what]
# Pour l'éventuelle coloration du fond.
add = 0
if not what:
return texte
@ -235,6 +273,31 @@ OK = style('Ok', 'vert')
WARNING = style('Warning', 'jaune')
ERREUR = style('Erreur', 'rouge')
def dialogStyle(texte, what):
"""Fournit du texte coloré pour dialog.
Séparé volontairement de style pour une meilleure
utilisation.
"""
if isinstance(what, str):
what = [what]
dialog_styles = {
'rouge': 1,
'vert': 2,
'jaune': 3,
'bleu': 4,
'violet': 5,
'cyan': 6,
'gris': 0,
'gras': 'b' }
for elem in what:
texte = "\Z%s%s\Zn" % (dialog_styles[elem], texte)
return texte
def prettyDoin(what, status):
"""Affiche une opération en cours et met son statut à jour