rendered paste body#!/usr/bin/wish
####################################################
# Script de réorganisation du fichier channels.conf.
# Créé le 06 novembre 2007
# par l_arsene
# commentaires à envoyer à l_arsene@hotmail.com
####################################################
# TODO:
# -Reste à implementer une gestion drag & drop
# pour eviter de cliquer 500 fois "up"
# -Ajouter un editeur de ligne pour pouvoir modifier
# une ligne manuellement
####################################################
#package require BWidget
#lecture du fichier channels.conf
global listing
if {$argc == 0} {
set fichier [tk_getOpenFile]
} else {
set fichier [lindex $argv 0]
}
set fic [open $fichier r]
while {[eof $fic] == 0} {
lappend listing [gets $fic]}
close $fic
#Mise en place GUI
wm title . "Trieuse"
wm geometry . 800x600
frame .ls
listbox .ls.lb -listvariable listing -selectmode extended
scrollbar .ls.vs -orient vertical
pack .ls.vs -side left -fill y
pack .ls.lb -side left -expand 1 -fill both
frame .but
button .but.up -text up -command {monter [lindex [.ls.lb curselection] 0]} -background grey
button .but.down -text down -command {descendre [lindex [.ls.lb curselection] 0]} -background grey
button .but.del -text Supprimer -command supprimer -background grey
button .but.edit -text Modifier -command {editeur [lindex [.ls.lb curselection] 0]} -background grey
button .but.save -text OK -command sortir -background grey
button .but.quitter -text Quitter -command quitter -background grey
button .but.sep -text Séparateur: -command {separateur [lindex [.ls.lb curselection] 0]} -background grey
entry .but.septxt -textvariable separateur
pack .but.up .but.down .but.del .but.edit .but.save .but.quitter .but.sep .but.septxt -expand 1 -side left
pack .but -side bottom
pack .ls -side bottom -expand 1 -fill both
.ls.lb configure -yscrollcommand [list .ls.vs set]
.ls.vs configure -command [list .ls.lb yview]
.ls.lb selection set 0
#début des procedures
proc deplace {position sel} {
global listing
#Tout d'abord créer une liste temporaire contenant les selectionnés
switch -regexp [lindex $sel 0] {
^\[0-9\]+ {
foreach indice [.ls.lb curselection] {
lappend selliste [lindex $listing $indice]
}
}
^: {
set selliste $sel
}
}
#ensuite on purge la liste originale des elements selectiones
foreach selectione $selliste {
set listing [lsearch -all -inline -not -exact $listing $selectione]
}
.ls.lb selection clear 0 end
if {$position != -1} {
#ensuite on ajoute la selection à l'endroit désiré
set listing [concat [lrange $listing 0 [expr $position -1]] $selliste [lrange $listing $position end]]
#enfin on reselectionne les elements precedement selectionnes
foreach selectione $selliste {
.ls.lb selection set [lsearch $listing $selectione]
}
}
colorize
.ls.lb yview [expr $position-5>0?$position-5:0]
}
proc monter {val} {
set sel [.ls.lb curselection]
deplace [expr $val-1>0?$val-1:0] $sel
}
proc descendre {val} {
set sel [.ls.lb curselection]
deplace [expr $val + 1] $sel
}
proc separateur {val} {
global separateur
if {$separateur == ""} {
tk_messageBox -message "Veuillez entrer tout d'abord un label de séparateur!!"
} else {
set sel :$separateur
deplace [expr $val] $sel
set separateur ""
}
}
proc supprimer {} {
set sel [.ls.lb curselection]
deplace -1 $sel
}
proc sortir {} {
global listing fichier
set err [catch "open {$fichier} w" fic]
while {$err != 0} {
tk_messageBox -message "Erreur d'ouverture en ecriture du fichier:\n$fic"
set dir [tk_chooseDirectory]
set err [catch "open ${dir}/channels.conf w" fic]
}
foreach ligne $listing {
puts $fic $ligne
}
close $fic
exit
}
proc inputBox {} {
return Separateur
}
proc colorize {} {
global listing
for {set i 0} {$i < [llength $listing] -1 } {incr i} {
set ligne [lindex $listing $i]
set VPID [lindex [split $ligne :] 5]
if {$VPID <= 1} {set color red} else {set color black}
if {[llength [split $ligne :]] <= 2} {set color blue}
.ls.lb itemconfigure $i -foreground $color
}
}
proc quitter {} {
if {[tk_dialog .dg "Sortie" "Etes-vous sûr de vouloir quitter sans sauver?" "" 1 Oui Non] == 0} {exit}
}
proc editeur {val} {
global listing tmp
set tmp 0
set ligne [lindex $listing $val]
toplevel .dg
wm geometry .dg 800x20
entry .dg.dg
button .dg.ok -text OK -command {incr tmp}
pack .dg.ok -side right
pack .dg.dg -side right -fill x -expand 1
.dg.dg insert 0 $ligne
vwait tmp
set listing [lreplace $listing $val $val [.dg.dg get]]
destroy .dg
colorize
}
colorize