summaryrefslogtreecommitdiffstats
path: root/library/treectrl.tcl
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-11-19 23:46:13 (GMT)
committertreectrl <treectrl>2006-11-19 23:46:13 (GMT)
commit3e741c3a46b1dcf42e468ace76dc22691c8fc4f1 (patch)
tree986d48e0c0cc4dc1408c875fed0babda0981824e /library/treectrl.tcl
parent21116d29e843fcafab6a8fb04572360ac1b327b5 (diff)
downloadtktreectrl-3e741c3a46b1dcf42e468ace76dc22691c8fc4f1.zip
tktreectrl-3e741c3a46b1dcf42e468ace76dc22691c8fc4f1.tar.gz
tktreectrl-3e741c3a46b1dcf42e468ace76dc22691c8fc4f1.tar.bz2
Dragging a column header behaviour is much improved.
Diffstat (limited to 'library/treectrl.tcl')
-rw-r--r--library/treectrl.tcl109
1 files changed, 80 insertions, 29 deletions
diff --git a/library/treectrl.tcl b/library/treectrl.tcl
index c401871..8ed4d92 100644
--- a/library/treectrl.tcl
+++ b/library/treectrl.tcl
@@ -1,4 +1,4 @@
-# RCS: @(#) $Id: treectrl.tcl,v 1.35 2006/11/19 00:49:36 treectrl Exp $
+# RCS: @(#) $Id: treectrl.tcl,v 1.36 2006/11/19 23:46:13 treectrl Exp $
bind TreeCtrl <Motion> {
TreeCtrl::CursorCheck %W %x %y
@@ -247,6 +247,73 @@ proc ::TreeCtrl::ColumnCanMoveHere {w column before} {
[$w column compare $before <= "last lock $lock next"]}]
}
+# ::TreeCtrl::ColumnDragFindBefore --
+#
+# This is called when dragging a column header. The result is 1 if the given
+# coordinates are near a column header before which the dragged column can
+# be moved.
+#
+# Arguments:
+# w The treectrl widget.
+# x Window x-coord.
+# y Window y-coord.
+# dragColumn The column being dragged.
+# indColumn_ Out: what to set -indicatorcolumn to.
+# indSide_ Out: what to set -indicatorside to.
+
+proc ::TreeCtrl::ColumnDragFindBefore {w x y dragColumn indColumn_ indSide_} {
+ upvar $indColumn_ indColumn
+ upvar $indSide_ indSide
+
+ scan [$w contentbox] "%d %d %d %d" x1 y1 x2 y2
+ set lock [$w column cget $dragColumn -lock]
+ switch -- $lock {
+ left {
+ set minX 0 ; # FIXME: plus borders
+ set maxX $x1
+ }
+ none {
+ set minX $x1
+ set maxX $x2
+ }
+ right {
+ set minX $x2
+ set maxX [winfo width $w] ; # FIXME: minus borders
+ }
+ }
+ if {$x < $minX} {
+ set x $minX
+ }
+ if {$x >= $maxX} {
+ set x [expr {$maxX - 1}]
+ }
+ set id [$w identify $x $y]
+ if {[lindex $id 0] ne "header"} {
+ return 0
+ }
+ set indColumn [lindex $id 1]
+ set before $indColumn
+ set prev [$w column id "$dragColumn prev visible"]
+ set next [$w column id "$dragColumn next visible"]
+ if {[$w column compare $indColumn == "tail"]} {
+ set indSide left
+ } elseif {$prev ne "" && [$w column compare $prev == $indColumn]} {
+ set indSide left
+ } elseif {$next ne "" && [$w column compare $next == $indColumn]} {
+ set before [$w column id "$indColumn next visible"]
+ set indSide right
+ } else {
+ scan [$w column bbox $indColumn] "%d %d %d %d" x1 y1 x2 y2
+ if {$x < $x1 + ($x2 - $x1) / 2} {
+ set indSide left
+ } else {
+ set before [$w column id "$indColumn next visible"]
+ set indSide right
+ }
+ }
+ return [ColumnCanMoveHere $w $dragColumn $before]
+}
+
# ::TreeCtrl::CursorAction --
#
# If the given point is at the left or right edge of a resizable column, the
@@ -590,34 +657,11 @@ proc ::TreeCtrl::Motion1 {w x y} {
}
if {$inside} {
$w column dragconfigure -imageoffset [expr {$x - $Priv(columnDrag,x)}]
- set id [$w identify $x $Priv(columnDrag,y)]
- if {[lindex $id 0] eq "header"} {
- set column [lindex $id 1]
- set before $column
- set prev [$w column id "$Priv(column) prev visible"]
- set next [$w column id "$Priv(column) next visible"]
- if {[$w column compare $column == "tail"]} {
- set side left
- } elseif {$prev ne "" && [$w column compare $prev == $column]} {
- set side left
- } elseif {$next ne "" && [$w column compare $next == $column]} {
- set before [$w column id "$column next visible"]
- set side right
- } else {
- scan [$w column bbox $column] "%d %d %d %d" x1 y1 x2 y2
- if {$x < $x1 + ($x2 - $x1) / 2} {
- set side left
- } else {
- set before [$w column id "$column next visible"]
- set side right
- }
- }
- if {[ColumnCanMoveHere $w $Priv(column) $before]} {
- $w column dragconfigure -indicatorcolumn $column \
- -indicatorside $side
- } else {
- $w column dragconfigure -indicatorcolumn ""
- }
+ if {[ColumnDragFindBefore $w $x $Priv(columnDrag,y) $Priv(column) indColumn indSide]} {
+ $w column dragconfigure -indicatorcolumn $indColumn \
+ -indicatorside $indSide
+ } else {
+ $w column dragconfigure -indicatorcolumn ""
}
}
if {[$w column cget $Priv(column) -lock] eq "none"} {
@@ -1057,6 +1101,13 @@ proc ::TreeCtrl::ColumnDragScrollCheck {w x y} {
if {[lindex $bbox1 0] != [lindex $bbox2 0]} {
incr Priv(columnDrag,x) [expr {[lindex $bbox2 0] - [lindex $bbox1 0]}]
$w column dragconfigure -imageoffset [expr {$x - $Priv(columnDrag,x)}]
+
+ if {[ColumnDragFindBefore $w $x $Priv(columnDrag,y) $Priv(column) indColumn indSide]} {
+ $w column dragconfigure -indicatorcolumn $indColumn \
+ -indicatorside $indSide
+ } else {
+ $w column dragconfigure -indicatorcolumn ""
+ }
}
set Priv(autoscan,afterId,$w) [after 50 [list TreeCtrl::ColumnDragScrollCheckAux $w]]
}