Updated 2014-01-24 19:28:14 by Jorge

EKB This is a simple sliding panel widget (implemented as a Snit widget).

Here's what the output looks like with three stacked sliding panel widgets. First, with all panes closed:

Then with one of them open:

Here's the code, with the three-panel sample at the end. This is NOL - the "no obligation license".
    package require snit
    
    image create photo slidepane_uparrow -data {
       R0lGODlhDwAQAIMAAPwCBARCZKze7IzK3ITC1Hy6zHSuzGSmxFyevAAAAAAA
       AAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAPABAAAAQ1EMhJq70428A1
       CEIYZOBgDuMmEGybTmAhG3Pxgkau7yN4/MDgj4MoGo/GHmfJXHqe0KjHHgEA
       If5oQ3JlYXRlZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2
       ZWxDb3IgMTk5NywxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KaHR0cDov
       L3d3dy5kZXZlbGNvci5jb20AOw==
    }
    
    image create photo slidepane_downarrow -data {
       R0lGODlhDwAQAIMAAPwCBARCZKza5Kze7JzO3JTG1IS61HyyzGyivEyOtESG
       rDx+pCxynCRqlBxejAAAACH5BAEAAAAALAAAAAAPABAAAAQ8EMhJq704axu6
       /x4QCAMpnARRGAfSJXAsx4Go3Hiu1FKw/EAgbxJgGI+MISXQaDqSmYBjqryE
       Ntis1h4BACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41
       DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4N
       Cmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs=
    }
    
    snit::widget slidepane {
        hulltype frame
        
        option -text ""
        option -font {Helvetica 8 italic}
        option -relief flat
        option -bd 0
        option -barrelief groove
        option -barlocation top
        
        variable closebutton
        variable openbutton
        variable buttonpath
        variable panestate
        variable panepath
        
        constructor {args} {
            $self configurelist $args
    
            frame $win.bar -relief $options(-barrelief)  -bd 2
            pack $win.bar -side $options(-barlocation) -fill x
            label $win.bar.l -text $options(-text) -font $options(-font)
            pack $win.bar.l -side left -fill x
            set panepath [frame $win.main -bd $options(-bd) -relief $options(-relief)]
            pack $win.main -fill both
            
            if {$options(-barlocation) == "top"} {
                set closebutton slidepane_uparrow
                set openbutton slidepane_downarrow
            } else {
                set closebutton slidepane_downarrow
                set openbutton slidepane_uparrow
            }
            set buttonpath [button $win.bar.b -image $closebutton -command [mymethod toggle]\
                -relief flat]
            set panestate visible
            pack $buttonpath -side right
            
        }
        
        method toggle {} {
            if {$panestate == "visible"} {
                pack forget $panepath
                $buttonpath config -image $openbutton
                set panestate hidden
            } else {
                pack $panepath -fill both
                $buttonpath config -image $closebutton
                set panestate visible
            }
        }
        
        method pane {} {
            return $panepath
        }
    }
    
    ## An example
    wm geometry . 50x200
    slidepane .pane1 -text "Top"
    label [.pane1 pane].l -text "Hi, there!"
    pack [.pane1 pane].l -side left
    pack .pane1 -side top -fill both
    
    slidepane .pane2 -text "Middle"
    checkbutton [.pane2 pane].c -text "Is it true?"
    pack [.pane2 pane].c -side top -anchor w
    button [.pane2 pane].b -text "OK"
    pack [.pane2 pane].b -side top
    pack .pane2 -side top -fill both
    
    slidepane .pane3 -text "Bottom"
    label [.pane3 pane].l -text "Peep bo!"
    pack [.pane3 pane].l -side left
    pack .pane3 -side top -fill both

Good!! -- ming

See also: wrapframe