2008-07-15 - [Stu]
<
>
A quick slide show program based on the idea in [Runnable Images].
<
>
<
>
How to use:
======
Usage:
$ ./qss.tcl
Quick Slide Show
usage: qss.tcl [-o outfile] image ...
no images given
$ ./qss.tcl -?
Quick Slide Show
usage: qss.tcl [-o outfile] image ...
View images:
$ ./qss.tcl *.gif
Create and view a slide show:
$ ./qss.tcl -o myslideshow *.gif
$ chmod u+x myslideshow
$ ./myslideshow
Output is program!
Usage:
$ ./myslideshow -?
Quick Slide Show
usage: myslideshow [-o outfile] image ...
View some other images:
./myslideshow images/*.gif
Create and view another slide show:
./myslideshow -o anotherslideshow images/*.ppm
$ chmod u+x anotherslideshow
$ ./anotherslideshow
$ ./anotherslideshow -o bobslideshow bob/images/dobbshead.gif bob/images/*.ppm
$ chmod u+x bobslideshow
$ ./bobslideshow
$ ./bobslideshow -?
Quick Slide Show
usage: bobslideshow [-o outfile] image ...
And so on ...
======
The code!
======
#! /bin/sh
# \
exec tclsh8.5 "$0" ${1+"$@"}
# Quick Slide Show
# Stuart Cassoff
# July 2008
namespace eval qss {
variable cfg
set cfg(currImage) -1
set cfg(maxImage) -1
}
proc qss::adjustGUI {} {
variable cfg
$cfg(bp) configure -state [expr {$cfg(currImage) > 0 ? "active" : "disabled"}]
$cfg(bn) configure -state [expr {$cfg(currImage) < $cfg(maxImage) ? "active" : "disabled"}]
$cfg(txtLabel) configure -text "[expr {$cfg(currImage) + 1}] of [expr {$cfg(maxImage) + 1}]"
}
proc qss::prev {} {
variable cfg
$cfg(imgLabel) configure -image im[incr cfg(currImage) -1]
adjustGUI
}
proc qss::next {} {
variable cfg
$cfg(imgLabel) configure -image im[incr cfg(currImage)]
adjustGUI
}
proc qss::setupGUI {} {
variable cfg
grid [set cfg(bp) [button .bp -text < -command [namespace current]::prev]] -sticky w
grid ^ [set cfg(bn) [button .bn -text > -command [namespace current]::next]] -sticky w
grid ^ ^ [set cfg(txtLabel) [label .lt]] -sticky w
grid [set cfg(imgLabel) [label .li]] -columnspan 3
grid columnconfigure . 2 -weight 1
bind . exit
bind . exit
}
proc qss::addImage {data} {
variable cfg
image create photo im[incr cfg(maxImage)] -data $data
}
proc qss::go {} {
variable cfg
setupGUI
if {$cfg(maxImage) > -1} {
set cfg(currImage) 0
$cfg(imgLabel) configure -image im$cfg(currImage)
}
adjustGUI
}
proc readFile {fn {bin 1}} {
set f [open $fn]
if {$bin} {
fconfigure $f -translation binary
} else {
fconfigure $f -eofchar \x1a
}
return [read $f][close $f]
}
proc loadImagesFromFiles {toload} {
variable cfg
foreach fn $toload {
::qss::addImage [readFile $fn]
}
}
proc loadImagesFromMe {sizes} {
set f [open $::argv0]
fconfigure $f -eofchar \x1a
read $f
seek $f 1 current
fconfigure $f -translation binary
foreach size $sizes {
set d [read $f $size]
::qss::addImage $d
}
close $f
}
proc makeQss {outfile images} {
set licmd "set sizes { "
foreach img $images {
append licmd [file size $img] " "
}
append licmd "}"
set final [string map [list "set sizes {}" $licmd] [readFile $::argv0 0]]
set f [open $outfile w]
puts $f $final
fconfigure $f -translation binary
puts -nonewline $f \x1a
foreach img $images {
set fimg [open $img]
fconfigure $fimg -translation binary
fcopy $fimg $f
close $fimg
}
close $f
}
proc ciao {msg {code 1}} {
puts stderr "Quick Slide Show"
puts stderr "usage: [file tail $::argv0] \[-o outfile\] image ..."
if {$msg ne ""} {
puts stderr $msg
}
exit $code
}
proc go {} {
upvar ::argv argv
set sizes {}
if {[llength $sizes] == 0 && [llength $argv] == 0} {
ciao "no images given"
}
if {[lindex $argv 0] eq "-?"} {
ciao "" 0
}
if {[lindex $argv 0] eq "-o"} {
if {[llength $argv] < 2} {
ciao "outfile not given"
}
if {[llength $argv] < 3} {
ciao "no images given"
}
makeQss [lindex $argv 1] [lrange $argv 2 end]
exit 0
}
package require Tk
if {[llength $argv] > 0} {
loadImagesFromFiles $argv
} else {
loadImagesFromMe $sizes
}
::qss::go
}
go
# EOF
======
----
!!!!!!
%| Images Tk Embedding | [Category Scripted Document] |%
!!!!!!