-
Notifications
You must be signed in to change notification settings - Fork 2
/
tkv.tcl
executable file
·178 lines (157 loc) · 4.83 KB
/
tkv.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/bin/sh
# The next line restarts using wish \
exec wish $0 ${1+"$@"}
package require msgcat
::msgcat::mcload [file join [file dirname [info script]] msgs]
catch {namespace import ::msgcat::mc}
proc mmc string {
regsub & $string {} string
return $string
}
proc mml string {
return [string first & $string]
}
#
# Make the Image format available.
#
package require Img
#
# Initialization of some global variables
#
set tkvPriv(count) 0
set tkvPriv(currentdir) [pwd]
set tkvPriv(defaultext) .gif
set tkvPriv(types) [list \
[list [mc "Image Files"] {.bmp} ] \
[list [mc "Image Files"] {.gif} ] \
[list [mc "Image Files"] {.jpeg .jpg} ] \
[list [mc "Image Files"] {.png} ] \
[list [mc "Image Files"] {.tiff .tif} ] \
[list [mc "Image Files"] {.xbm} ] \
[list [mc "Image Files"] {.xpm} ] \
[list [mc "Image Files"] {.ps .eps} ] \
[list "BMP [mc Files]" {.bmp} ] \
[list "GIF [mc Files]" {.gif} ] \
[list "JPEG [mc Files]" {.jpeg .jpg} ] \
[list "PNG [mc Files]" {.png} ] \
[list "TIFF [mc Files]" {.tiff .tif} ] \
[list "XBM [mc Files]" {.xbm} ] \
[list "XPM [mc Files]" {.xpm} ] \
[list "Postscript [mc Files]" {.ps .eps} ] \
[list "GIF [mc Files]" {} GIFF] \
[list "JPEG [mc Files]" {} JPEG] \
[list "PNG [mc Files]" {} PNGF] \
[list "TIFF [mc Files]" {} TIFF] \
[list [mc {All files}] *] \
]
proc Menu {base name} {
set menu [ConCat $base menu]
if {![winfo exists $menu]} {
menu $menu
$base configure -menu $menu
}
set accelerator [string toupper [string index $name 0]]
set text [mc "&$accelerator[string range $name 1 end]"]
set name $menu.$name
if {![winfo exists $name]} {
menu $name
$menu add cascade -label [mmc $text] -menu $name -underline [mml $text]
}
return $name
}
#
# Small proc to concatenate window pathnames
#
proc ConCat args {
regsub -all {[ \.]+} $args . args
return $args
}
#
# Create a new image window
#
proc image_window {{window {}}} {
global tkvPriv
if {![string compare $window {}]} {
set window .image$tkvPriv(count)
incr tkvPriv(count)
}
if {[winfo exists $window]} {
catch {eval destroy [winfo children $window]}
} else {
toplevel $window
}
wm title $window [mc {Viewer}]
set frame [ConCat $window frame]
label $frame -relief sunken -bg white -bd 2 -anchor nw
set w [Menu $window file]
$w configure -tearoff 0
set text [mc &Open]
$w add command -label [mmc $text] -command [list load_image $window] -underline [mml $text]
set text [mc &Save]
$w add command -label [mmc $text] -command [list save_image $window] -underline [mml $text]
$w add separator
set text [mc &Close]
$w add command -label [mmc $text] -command [list destroy $window] -underline [mml $text]
set text [mc E&xit]
$w add command -label [mmc $text] -command [list destroy .] -underline [mml $text]
set w [Menu $window images]
set w [Menu $window help]
$w configure -tearoff 0
set text [mc &About]
$w add command -label [mmc $text] -command About -underline [mml $text]
catch {wm geometry $window 200x200}
pack $frame -side top -expand y -fill both
return $frame
}
proc register_image {w name} {
set menu [Menu $w images]
set item [file tail [lindex $name 0]]
if {[llength $name] > 1} {
append item " [lindex $name 1]"
}
$menu add command -label $item -command \
[list show_image $w $name]
}
proc show_image {window name} {
[ConCat $window frame] configure -image $name
catch {wm geometry $window {}}
}
proc load_image window {
global tkvPriv
set filename [tk_getOpenFile -filetypes $tkvPriv(types) -parent \
$window -initialdir $tkvPriv(currentdir)]
if {[string compare $filename {}]} {
set imagename [list $filename]
image create photo $imagename -file $filename
register_image $window $imagename
show_image $window $imagename
set tkvPriv(currentdir) [file dirname $filename]
}
}
proc save_image window {
global tkvPriv
set img [[ConCat $window frame] cget -image]
set filename [tk_getSaveFile -filetypes $tkvPriv(types) -parent \
$window -initialdir $tkvPriv(currentdir) -defaultextension .gif \
-initialfile [file rootname [lindex $img 0]].gif]
if {[string compare $filename {}]} {
$img write $filename -format gif
set tkvPriv(currentdir) [file dirname $filename]
}
}
proc About {} {
tk_dialog .about "[mmc [mc &About]] tkv.tcl" "[mc {Tiny Image viewer}]\n[mc {written by}]\
Jan Nijtmans <nijtmans@users.sourceforge.net>" {} 0 [mc O.K.]
}
set w [lindex $argv 1]
if {![string compare $w {}]} {
set w .
}
set filename [lindex $argv 0]
image_window $w
if {[string compare $filename {}]} {
set imagename [list $filename]
image create photo $imagename -file $filename
register_image $w $imagename
show_image $w $imagename
}