158 lines
4.8 KiB
Tcl
158 lines
4.8 KiB
Tcl
|
# Each page: {"Tab title" wname} (empty wname if changecallback handles it)
|
||
|
|
||
|
set TKG(switches,TabNB) {
|
||
|
{pages {}}
|
||
|
{startpage 0}
|
||
|
{width 20c}
|
||
|
{height 15c}
|
||
|
{relief flat}
|
||
|
{borderwidth 0}
|
||
|
{tabpady 2}
|
||
|
{tabpadx 4}
|
||
|
{headroom 10}
|
||
|
{outlinethickness 2}
|
||
|
{slantrun 8}
|
||
|
{overlap -8}
|
||
|
{changecallback {}}
|
||
|
{font tkgbigbold}
|
||
|
{background {$TKG(background)}}
|
||
|
{foreground {$TKG(foreground)}}
|
||
|
{disabledbackground {$TKG(background)}}
|
||
|
{disabledforeground {$TKG(disabledforeground)}}
|
||
|
{field {$TKG(background)}}
|
||
|
}
|
||
|
|
||
|
proc TabNB {w args} {
|
||
|
global TKG
|
||
|
# get arguments
|
||
|
TKGParseArgs TabNB$w $args $TKG(switches,TabNB)
|
||
|
TKGSetSwitchDefaults TabNB$w $TKG(switches,TabNB)
|
||
|
upvar \#0 TabNB$w P
|
||
|
# make overall frame
|
||
|
set width [winfo pixels . $P(width)]
|
||
|
frame $w -width $P(width) -height $P(height) \
|
||
|
-relief $P(relief) -borderwidth $P(borderwidth) \
|
||
|
-background $P(field)
|
||
|
# get text height for tab labels
|
||
|
label $w.dummy -font $P(font) -text Gg \
|
||
|
-highlightthickness 0 -borderwidth 0 \
|
||
|
-padx $P(tabpadx) -pady $P(tabpady)
|
||
|
set labelheight [winfo reqheight $w.dummy]
|
||
|
destroy $w.dummy
|
||
|
|
||
|
set ytop [expr $P(borderwidth) + $P(headroom)]
|
||
|
set ybottom [expr $ytop + $labelheight + 2*$P(outlinethickness)]
|
||
|
set polygonbottom [expr $ybottom + $P(outlinethickness)/2]
|
||
|
set linebottom [expr $ybottom - ($P(outlinethickness) +1)/2]
|
||
|
set tabwinwidth [expr $width - 2*$P(borderwidth)]
|
||
|
|
||
|
set canvas $w.tabcanvas
|
||
|
canvas $w.tabcanvas -width $tabwinwidth -height $ybottom \
|
||
|
-borderwidth 0 -highlightthickness 0 \
|
||
|
-background $P(field)
|
||
|
|
||
|
# Draw the tabs
|
||
|
set leftx 5
|
||
|
for {set i 0} {$i < [llength $P(pages)]} {incr i} {
|
||
|
set tabname [lindex [lindex $P(pages) $i] 0]
|
||
|
set label $canvas.lab$i
|
||
|
label $label \
|
||
|
-font $P(font) \
|
||
|
-text [lindex [lindex $P(pages) $i] 0] \
|
||
|
-highlightthickness 0 -borderwidth 0 \
|
||
|
-foreground $P(disabledforeground) \
|
||
|
-background $P(disabledbackground) \
|
||
|
-padx $P(tabpadx) -pady $P(tabpady)
|
||
|
set lwidth [winfo reqwidth $label]
|
||
|
set x $leftx
|
||
|
$canvas create line 0 $linebottom $leftx $linebottom \
|
||
|
-fill $P(foreground) -tags tab$i -width $P(outlinethickness)
|
||
|
$canvas create polygon \
|
||
|
$x $polygonbottom \
|
||
|
[incr x $P(slantrun)] $ytop \
|
||
|
[incr x $lwidth] $ytop \
|
||
|
[incr x $P(slantrun)] $polygonbottom \
|
||
|
-width $P(outlinethickness) \
|
||
|
-outline $P(disabledforeground) \
|
||
|
-fill $P(disabledbackground) \
|
||
|
-tags tab$i
|
||
|
$canvas create line $x $linebottom [expr $tabwinwidth - 1] $linebottom \
|
||
|
-fill $P(foreground) -tags tab$i -width $P(outlinethickness)
|
||
|
$canvas create window \
|
||
|
[expr $leftx + $P(slantrun)] \
|
||
|
[expr $ytop + $P(outlinethickness)] \
|
||
|
-window $label \
|
||
|
-anchor nw \
|
||
|
-tags tab$i
|
||
|
$canvas bind tab$i <1> "TabNBGotoPage $w $i"
|
||
|
bind $label <1> "TabNBGotoPage $w $i"
|
||
|
set leftx [expr $x + $P(overlap)]
|
||
|
# Lower tab so that the pages will appear to be stacked in order
|
||
|
$w.tabcanvas lower tab$i
|
||
|
}
|
||
|
|
||
|
place $canvas -in $w -anchor nw -x 0 -y 0
|
||
|
|
||
|
frame $w.page \
|
||
|
-width [expr $width - 2*$P(borderwidth)] \
|
||
|
-height [expr [winfo pixels . $P(height)] - $ybottom \
|
||
|
+ $P(outlinethickness) - 2*$P(borderwidth)] \
|
||
|
-takefocus 0 \
|
||
|
-highlightthickness $P(outlinethickness) \
|
||
|
-highlightbackground $P(foreground)
|
||
|
grid propagate $w.page 0
|
||
|
place $w.page -in $w -anchor nw \
|
||
|
-x 0 -y [expr $ybottom - $P(outlinethickness)]
|
||
|
catch {unset P(current)}
|
||
|
TabNBGotoPage $w $P(startpage)
|
||
|
return $w
|
||
|
}
|
||
|
|
||
|
proc TabNBGotoPage {w pagenum} {
|
||
|
upvar \#0 TabNB$w P
|
||
|
# change colors on tabs
|
||
|
if [info exists P(current)] {
|
||
|
$w.tabcanvas itemconfigure [expr 2 + 4*$P(current)] \
|
||
|
-outline $P(disabledforeground) \
|
||
|
-fill $P(disabledbackground)
|
||
|
$w.tabcanvas.lab$P(current) configure \
|
||
|
-foreground $P(disabledforeground) \
|
||
|
-background $P(disabledbackground)
|
||
|
}
|
||
|
set tabitem [expr 2 + 4*$pagenum]
|
||
|
$w.tabcanvas itemconfigure $tabitem \
|
||
|
-outline $P(foreground) \
|
||
|
-fill $P(background)
|
||
|
$w.tabcanvas raise tab$pagenum
|
||
|
$w.tabcanvas.lab$pagenum configure \
|
||
|
-foreground $P(foreground) \
|
||
|
-background $P(background)
|
||
|
|
||
|
# Callback (which might put widgets in $w.page)
|
||
|
if ![Empty $P(changecallback)] {
|
||
|
eval $P(changecallback) $w $pagenum
|
||
|
}
|
||
|
|
||
|
# grid new window if defined.
|
||
|
set pagew [lindex [lindex $P(pages) $pagenum] 1]
|
||
|
if {![Empty $pagew] && [winfo exists $pagew]} {
|
||
|
place $pagew -in $w.frame -anchor nw \
|
||
|
-x $P(outlinethickness) -y $P(outlinethickness)
|
||
|
}
|
||
|
|
||
|
raise $w.tabcanvas
|
||
|
set P(current) $pagenum
|
||
|
}
|
||
|
|
||
|
proc TabNBTest {} {
|
||
|
uplevel \#0 {
|
||
|
catch "unset TabNB.tnb.n"
|
||
|
catch "destroy .tnb.n"
|
||
|
source /home/markcrim/TKGsrc/tcl/tabnotebook.tcl
|
||
|
if ![winfo exists .tnb] {toplevel .tnb}
|
||
|
TabNB .tnb.n -pages {{{One page} {}} {Another {}} {{Still Another} {}}}
|
||
|
grid .tnb.n
|
||
|
raise .tnb
|
||
|
}
|
||
|
}
|