tkgoodstuff/tcl/tabnotebook.tcl

158 lines
4.8 KiB
Tcl
Raw Permalink Normal View History

# 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
}
}