contentmanager.tcl
来自「Linux下的MSN聊天程序源码」· TCL 代码 · 共 959 行 · 第 1/2 页
TCL
959 行
foreach item $items { set tree $options(-tree) lappend tree $item if { [eval contentmanager cget $tree -omnipresent] } { continue } if { [string is integer $level] && $level > 0 } { eval contentmanager show $tree -level [expr {$level - 1}] } elseif { $level == "r" } { eval contentmanager show $tree } } foreach attachment $attachments { if { [eval contentmanager cget $tree -omnipresent] } { continue } else { set tree $options(-tree) lappend tree $attachment eval contentmanager show $tree } } set options(-state) normal if { $havebinding } { $options(-widget) itemconfigure $bboxid -state normal } } method hide { args } { if { [string equal $args {}] } { set force 0 } else { set force [lindex $args 1] } set omnipresent 0 foreach item $items { set tree $options(-tree) lappend tree $item if { [eval contentmanager cget $tree -omnipresent] && !$force } { set omnipresent 1 continue } eval contentmanager hide $tree } foreach attachment $attachments { if { [eval contentmanager cget $tree -omnipresent] } { continue } else { set tree $options(-tree) lappend tree $attachment eval contentmanager hide $tree } } if { $omnipresent && !$force } { set options(-state) "partlyhidden" } else { set options(-state) "hidden" } $options(-widget) itemconfigure $bboxid -state hidden } method toggle { } { switch $options(-state) { "normal" { $self hide } "hidden" { $self show } "partlyhidden" { $self show } } } method sort { {level r} } { # Initial coords set x [expr {$xPos + $options(-ipadx)}] set y [expr {$yPos + $options(-ipady)}] set width 0 set height 0 # Which way are we sorting (horizontally or vertically) switch $options(-orient) { "horizontal" { set itempady 0 foreach item $items { set tree $options(-tree) lappend tree $item # If the item is hidden, skip it if { [string equal [eval contentmanager cget $tree -state] "hidden"] } { continue } # Sort the item if { [string is integer $level] && $level > 0 } { eval contentmanager sort $tree -level [expr {$level - 1}] } elseif { [string equal $level r] } { eval contentmanager sort $tree -level r } set itempadx [eval contentmanager cget $tree -padx] set itempady [eval contentmanager cget $tree -pady] set itemwidth [eval contentmanager width $tree] set itemheight [eval contentmanager height $tree] incr x $itempadx incr y $itempady eval contentmanager coords $tree $x $y incr x $itempadx incr y -$itempady incr x $itemwidth # Is this the tallest item so far? if { $itemheight > $height } { set height $itemheight } } set width [expr {$x - $xPos + $options(-ipadx)}] incr height [expr {(2 * $options(-ipady)) + $itempady}] $self configure -height $height $self configure -width $width # Align the items with each other $self AlignItems } "vertical" { set itempadx 0 foreach item $items { set tree $options(-tree) lappend tree $item # If the item is hidden, skip it if { [string equal [eval contentmanager cget $tree -state] "hidden"] } { continue } if { [string is integer $level] && $level > 0 } { eval contentmanager sort $tree -level [expr {$level - 1}] } elseif { [string equal $level r] } { eval contentmanager sort $tree -level r } set itempadx [eval contentmanager cget $tree -padx] set itempady [eval contentmanager cget $tree -pady] set itemwidth [eval contentmanager width $tree] set itemheight [eval contentmanager height $tree] incr x $itempadx incr y $itempady eval contentmanager coords $tree $x $y incr x -$itempadx incr y $itempady incr y $itemheight # Is this the widest item so far? if { $itemwidth > $width } { set width $itemwidth } } set height [expr {$y - $yPos + $options(-ipady)}] incr width [expr {(2 * $options(-ipadx)) + $itempadx}] $self configure -width $width $self configure -height $height # Align the elements with each other $self AlignItems } } $options(-widget) raise $bboxid } method AlignItems { } { set width $options(-width) set height $options(-height) switch $options(-orient) { "horizontal" { foreach item $items { set tree $options(-tree) lappend tree $item set valign [eval contentmanager cget $tree -valign] set h [eval contentmanager cget $tree -height] set pady [eval contentmanager cget $tree -pady] switch $valign { "center" { eval contentmanager move $tree 0 [expr {($height / 2) - ($h / 2) - $options(-ipady) - $pady}] } "middle" { eval contentmanager move $tree 0 [expr {($height / 2) - ($h / 2) - $options(-ipady) - $pady}] } "bottom" { eval contentmanager move $tree 0 [expr {$height - $h - $options(-ipady) - $pady}] } } } } "vertical" { foreach item $items { set tree $options(-tree) lappend tree $item set align [eval contentmanager cget $tree -align] set w [eval contentmanager cget $tree -width] set padx [eval contentmanager cget $tree -padx] switch $align { "center" { eval contentmanager move $tree [expr {($width / 2) - ($w / 2) - $options(-ipadx) - $padx}] 0 } "middle" { eval contentmanager move $tree [expr {($width / 2) - ($w / 2) - $options(-ipadx) - $padx}] 0 } "right" { eval contentmanager move $tree [expr {$width - $w - $options(-ipadx) - $padx}] 0 } } } } } } method PlaceAttachments { } { foreach attachment $attachments { set tree $options(-tree) lappend tree $attachment set attx [expr {$xPos + [eval contentmanager cget $tree -padx]}] set atty [expr {$yPos + [eval contentmanager cget $tree -pady]}] eval contentmanager coords $tree $attx $atty } }}snit::type element { # Parent options option -widget -configuremethod SetWidget option -tag -configuremethod SetTag option -tree # Dimension options option -align -default left option -height -default 0 -configuremethod SetHeight -cgetmethod GetHeight option -valign -default top option -width -default 0 -configuremethod SetWidth -cgetmethod GetWidth # Padding options option -padx -default 0 option -pady -default 0 option -ipadx -default 0 -configuremethod Sort option -ipady -default 0 -configuremethod Sort # State options option -omnipresent -default no option -state -default normal -configuremethod SetState # Children variables variable bboxid # Attachment variables variable attachments # Binding variables variable havebinding variable xPos variable yPos constructor { args } { set xPos 0 set yPos 0 set bboxid {} set attachments {} set havebinding 0 $self configurelist $args } destructor { catch { $options(-widget) delete $bboxid eval contentmanager unregister $options(-tree) } } method type { } { return "element" } method attach { id } { lappend attachments $id } method SetWidget { opt val } { set options(-widget) $val set bboxid [$val create rect 0 0 0 0 -fill "" -outline "" -state normal] } method SetWidth { opt val } { set options(-width) $val if { [$self GotWidget] } { $options(-widget) coords $bboxid $xPos $yPos [expr {$xPos + $val}] [expr {$yPos + $options(-height)}] } } method GetWidth { opt } { if { [string equal $options(-state) "hidden"] } { return 0 } else { return $options(-width) } } method SetHeight { opt val } { set options(-height) $val if { [$self GotWidget] } { $options(-widget) coords $bboxid $xPos $yPos [expr {$xPos + $options(-width)}] [expr {$yPos + $val}] } } method SetState { opt val } { set options(-state) $val switch $val { "partlyhidden" { $self hide } "hidden" { $self hide } "normal" { $self show } } } method GetHeight { opt } { if { [string equal $options(-state) "hidden"] } { return 0 } else { return $options(-height) } } method GotWidget { } { if { [string equal $options(-widget) ""] } { return 0 } else { return 1 } } method bind { pat cmd {mode {bbox}} } { if { [string equal $cmd {}] } { set havebinding 0 } else { set havebinding 1 } if { [$self GotWidget] } { $options(-widget) bind $options(-tag) $pat $cmd $options(-widget) bind $bboxid $pat $cmd $options(-widget) itemconfigure $bboxid -state normal } } method coords { {x {}} {y {}} } { if { [string equal $x {}] } { return "$xPos $yPos" } set xPos $x set yPos $y set tagx [expr {$x + $options(-ipadx)}] set tagy [expr {$y + $options(-ipady)}] $options(-widget) coords $options(-tag) $tagx $tagy $options(-widget) coords $bboxid $xPos $yPos [expr {$xPos + $options(-width)}] [expr {$yPos + $options(-height)}] foreach tag $attachments { $options(-widget) coords $tag $xPos $yPos } } method move { dx {dy {}} } { #if { $dx == 0 } { # if { $dy == 0 || [string equal $dy {}] } { # return # } #} if { [string equal $dy ""] } { $options(-widget) move $options(-tag) $dx $options(-widget) move $bboxid $dx incr xPos $dx } else { $options(-widget) move $options(-tag) $dx $dy $options(-widget) move $bboxid $dx $dy incr xPos $dx incr yPos $dy } $self PlaceAttachments } method show { args } { if { [$self GotWidget] } { set options(-state) "normal" $options(-widget) itemconfigure $options(-tag) -state normal if { $havebinding } { $options(-widget) itemconfigure $bboxid -state normal } foreach attachment $attachments { if { [eval contentmanager cget $tree -omnipresent] } { continue } else { set tree $options(-tree) lappend tree $attachment eval contentmanager show $tree } } } } method hide { args } { if { [$self GotWidget] } { if { !$options(-omnipresent) } { set options(-state) "hidden" $options(-widget) itemconfigure $options(-tag) -state hidden $options(-widget) itemconfigure $bboxid -state hidden } foreach attachment $attachments { if { [eval contentmanager cget $tree -omnipresent] } { continue } else { set tree $options(-tree) lappend tree $attachment eval contentmanager hide $tree } } } } method toggle { } { switch $options(-state) { "normal" { $self hide } "hidden" { $self show } } } method SetTag { opt val } { set options(-tag) $val $self sort } method Sort { {opt {}} {val {}} } { set options($opt) $val $self sort } method sort { {level {}} } { set bbox [$options(-widget) bbox $options(-tag)] $options(-widget) raise $bboxid # Catch empty items if { [string equal $bbox {}] } { $self configure -height 0 -width 0 return } set bboxwidth [expr {[lindex $bbox 2] - [lindex $bbox 0] + (2 * $options(-ipadx))}] set bboxheight [expr {[lindex $bbox 3] - [lindex $bbox 1] + (2 * $options(-ipady))}] $self configure -height $bboxheight -width $bboxwidth } method PlaceAttachments { } { foreach attachment $attachments { set tree $options(-tree) lappend tree $attachment set attx [expr {$xPos + [eval contentmanager cget $tree -padx]}] set atty [expr {$yPos + [eval contentmanager cget $tree -pady]}] eval contentmanager coords $tree $attx $atty } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?