summaryrefslogtreecommitdiffstats
path: root/library/treectrl.tcl
diff options
context:
space:
mode:
authortreectrl <treectrl>2004-08-09 02:42:44 (GMT)
committertreectrl <treectrl>2004-08-09 02:42:44 (GMT)
commit61765e24585619292b8cf7ffabf1c7b5acabf7e1 (patch)
tree5b3ce37438f2cc0fd2083e7cc7a4976b52d9aa16 /library/treectrl.tcl
parentcc8fdb24041c17091a601bac7d6747c4b1519e8f (diff)
downloadtktreectrl-61765e24585619292b8cf7ffabf1c7b5acabf7e1.zip
tktreectrl-61765e24585619292b8cf7ffabf1c7b5acabf7e1.tar.gz
tktreectrl-61765e24585619292b8cf7ffabf1c7b5acabf7e1.tar.bz2
Clear Priv(prev) after tracking a selection to avoid error in TreeCtrl::Cancel.
Rewrite TreeCtrl::Motion to generate a single <Selection> event.
Diffstat (limited to 'library/treectrl.tcl')
-rw-r--r--library/treectrl.tcl49
1 files changed, 49 insertions, 0 deletions
diff --git a/library/treectrl.tcl b/library/treectrl.tcl
index 96d4f57..1f7b98d 100644
--- a/library/treectrl.tcl
+++ b/library/treectrl.tcl
@@ -440,6 +440,7 @@ proc ::TreeCtrl::Release1 {w x y} {
normal {
AutoScanCancel $w
$w activate [$w index [list nearest $x $y]]
+set Priv(prev) ""
}
resize {
if {[$w cget -columnproxy] ne ""} {
@@ -537,6 +538,54 @@ proc ::TreeCtrl::Motion {w el} {
}
}
+# Different version that uses single "selection modify" call
+proc ::TreeCtrl::Motion {w el} {
+ variable Priv
+ if {$el eq $Priv(prev)} {
+ return
+ }
+ switch [$w cget -selectmode] {
+ browse {
+ $w selection modify $el all
+ set Priv(prev) $el
+ }
+ extended {
+ set i $Priv(prev)
+ set select {}
+ set deselect {}
+ if {$i eq ""} {
+ set i $el
+ lappend select $el
+ set hack [$w compare $el == anchor]
+ }
+ if {[$w selection includes anchor] || $hack} {
+ set deselect [concat $deselect [$w range $i $el]]
+ set select [concat $select [$w range anchor $el]]
+ } else {
+ set deselect [concat $deselect [$w range $i $el]]
+ set deselect [concat $deselect [$w range anchor $el]]
+ }
+ if {![info exists Priv(selection)]} {
+ set Priv(selection) [$w selection get]
+ }
+ while {[$w compare $i < $el] && [$w compare $i < anchor]} {
+ if {[lsearch $Priv(selection) $i] >= 0} {
+ lappend select $i
+ }
+ set i [$w index "$i next visible"]
+ }
+ while {[$w compare $i > $el] && [$w compare $i > anchor]} {
+ if {[lsearch $Priv(selection) $i] >= 0} {
+ lappend select $i
+ }
+ set i [$w index "$i prev visible"]
+ }
+ set Priv(prev) $el
+ $w selection modify $select $deselect
+ }
+ }
+}
+
# ::TreeCtrl::BeginExtend --
#
# This procedure is typically invoked on shift-button-1 presses. It