Posted to tcl by egavilan at Tue Feb 19 14:53:50 GMT 2008view raw
- #######################################################
- # we get three tabs, two created at start and the third a second later. Note the diferences
- # of reqheight of each one
- package require Tk
- ttk::setTheme clam
- proc instance.add { {title ""} } {
- global state
- set tabid $state(NB).[format tab%04d $state(ID)]
- set pw [ttk::panedwindow $tabid -orient vertical]
- # add the upper text
- set fup [ttk::frame $pw.up -padding 2]
- set txt [text.add $fup]
- bind $fup <Configure> "puts \"$fup: \[winfo reqheight $fup\]\""
- # the lower text
- set fdown [ttk::frame $pw.down -padding 2]
- #set peer [text.add $fdown $txt]
- # we want the lower pane to be hidden
- #grid propagate $fdown 0
- bind $fdown <Configure> "puts \"$fdown: \[winfo reqheight $fdown\]\""
- # in the case of resize, the upper pane should take all the space
- puts "adding $tabid"
- $pw add $fup -weight 1
- $pw add $fdown -weight 0
- # set the title
- if {$title eq ""} {set title "Untitled-$state(ID)"}
- # finally, add the tab to the notebook
- $state(NB) add $tabid -text $title
- bind $tabid <Configure> "puts \"$tabid: \[winfo reqheight $tabid\]\""
- # init the keys in the array which gather all the data
- # in this tab
- set state($tabid.txt) $txt
- set state($tabid.filename) {}
- incr state(ID)
- #######################################################
- # if we force the new tab to show, it exposes a {bug|race condition}?
- #######################################################
- $state(NB) select $tabid
- #######################################################
- # bug workaround
- event generate $state(NB) <Expose>
- }
- proc text.add { parent {peerof {}} } {
- set vs [ttk::scrollbar $parent.vs -orient vertical]
- set hs [ttk::scrollbar $parent.hs -orient horizontal]
- if {$peerof eq ""} {
- set t [text $parent.txt \
- -yscrollcommand [list $vs set] \
- -xscrollcommand [list $hs set]]
- } else {
- set t [$peerof peer create $parent.txt \
- -yscrollcommand [list $vs set] \
- -xscrollcommand [list $hs set]]
- }
- $vs configure -command [list $t yview]
- $hs configure -command [list $t xview]
- grid $t $vs -sticky news
- grid $hs -sticky news
- grid columnconfigure $parent 0 -weight 1
- grid rowconfigure $parent 0 -weight 1
- bind $t <Configure> "puts \"$t: \[winfo reqheight $t\]\""
- return $t
- }
- proc instance.delete {} {
- global state
- set tabid [$state(NB) select]
- # release the data associated with this tab
- array unset state $tabid.*
- # finally, destroy the tab
- destroy $tabid
- }
- proc build.gui {} {
- global state
- set state(NB) [ttk::notebook .nb]
- grid $state(NB) -sticky news
- grid rowconfigure . 0 -weight 1
- grid columnconfigure . 0 -weight 1
- option add *Text.background white
- option add *Text.highlightThickness 0
- option add *Text.borderWidth 1
- option add *Text.selectBorderWidth 0
- }
- proc init {} {
- global state
- set state(ID) 0
- }
- ############################################################
- # App initialization
- init
- build.gui
- after 1000 instance.add
- instance.add
- instance.add
- ###########################################################
- # Some general bindings
- event add <<New>> <Control-N> <Control-n>
- event add <<Close>> <Control-W> <Control-w>
- bind . <<New>> {instance.add}
- bind . <<Close>> {instance.delete}
Comments
Posted by jenglish at Tue Feb 19 15:59:45 GMT 2008 [text] [code]
Cause of the problem: (a) the ttk::panedwindow ignores geometry requests from mapped children; (b) geometry propagation happens at idle-time; but (c) Tk_MapWindow() works immediately. Solution: add [update idletasks] before [$nb select ...] on the newly-created tab. This will allow geometry propagation to finish before mapping the tab.