summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2022-03-07 21:57:22 (GMT)
committerfvogel <fvogelnew1@free.fr>2022-03-07 21:57:22 (GMT)
commit073080595902ccbf4873b9258c1885b3ee641a96 (patch)
treeb2201ea0d24a1e6cca9fce27b201ea5790984290
parentbbcad39d045031d99788b54b4334d511b14acb3a (diff)
downloadtk-073080595902ccbf4873b9258c1885b3ee641a96.zip
tk-073080595902ccbf4873b9258c1885b3ee641a96.tar.gz
tk-073080595902ccbf4873b9258c1885b3ee641a96.tar.bz2
Fix issue with <<TreeviewSelect>> event as described in [2a6c62afd9] in the comment dated 2022-05-07. This commit is for 8.6 and was backported from pspjuth's patch [040f5aa0].
-rw-r--r--doc/text.n3
-rw-r--r--doc/ttk_treeview.n3
-rw-r--r--generic/ttk/ttkTreeview.c22
-rw-r--r--tests/ttk/treeview.test13
4 files changed, 21 insertions, 20 deletions
diff --git a/doc/text.n b/doc/text.n
index c41c6ac..e4bc64d 100644
--- a/doc/text.n
+++ b/doc/text.n
@@ -847,6 +847,9 @@ characters in the text.
.IP [4]
Whenever the \fBsel\fR tag range changes a virtual event \fB<<Selection>>\fR
is generated.
+It might also be generated when selection is affected but not actually changed.
+Further, multiple selection changes could happen before events can be processed
+leading to multiple events with the same visible selection.
.PP
The \fBsel\fR tag is automatically defined when a text widget is created, and
it may not be deleted with the
diff --git a/doc/ttk_treeview.n b/doc/ttk_treeview.n
index 2deb5b5..8494dad 100644
--- a/doc/ttk_treeview.n
+++ b/doc/ttk_treeview.n
@@ -472,6 +472,9 @@ Again, \fBcolumn #0 always refers to the tree column\fR.
The treeview widget generates the following virtual events.
.IP <<TreeviewSelect>>
Generated whenever the selection changes.
+It might also be generated when selection is affected but not actually changed.
+Further, multiple selection changes could happen before events can be processed
+leading to multiple events with the same visible selection.
.IP <<TreeviewOpen>>
Generated just before setting the focus item to \fB\-open true\fR.
.IP <<TreeviewClose>>
diff --git a/generic/ttk/ttkTreeview.c b/generic/ttk/ttkTreeview.c
index 7fd1442..1bb0482 100644
--- a/generic/ttk/ttkTreeview.c
+++ b/generic/ttk/ttkTreeview.c
@@ -2985,30 +2985,16 @@ static int TreeviewSelectionCommand(
switch (selop)
{
case SELECTION_SET:
+ /* Clear */
for (item=tv->tree.root; item; item=NextPreorder(item)) {
- int inSetList = 0;
-
- for (i=0; items[i]; ++i) {
- if (item == items[i]) {
- inSetList = 1;
- if (!(item->state & TTK_STATE_SELECTED)) {
- /* Item newly selected */
- selChange = 1;
- }
- break;
- }
- }
- if (!inSetList && (item->state & TTK_STATE_SELECTED)) {
- /* Item newly deselected */
+ if (item->state & TTK_STATE_SELECTED) {
+ item->state &= ~TTK_STATE_SELECTED;
selChange = 1;
}
- if (selChange) break;
- }
- for (item=tv->tree.root; item; item=NextPreorder(item)) {
- item->state &= ~TTK_STATE_SELECTED;
}
for (i=0; items[i]; ++i) {
items[i]->state |= TTK_STATE_SELECTED;
+ selChange = 1;
}
break;
case SELECTION_ADD:
diff --git a/tests/ttk/treeview.test b/tests/ttk/treeview.test
index 3ecbddc..6a1964b 100644
--- a/tests/ttk/treeview.test
+++ b/tests/ttk/treeview.test
@@ -490,8 +490,9 @@ test treeview-8.8 "<<TreeviewSelect>> when setting the selection" -body {
set val 2
.tv selection set myItem1 ; # <<TreeviewSelect>> triggers
update
+ # Current implementation generates an event for this case
set val 3
- .tv selection set myItem1 ; # no <<TreeviewSelect>> (already selected)
+ .tv selection set myItem1 ; # (already selected)
update
set val 4
.tv selection set {myItem1 myItem2} ; # <<TreeviewSelect>> triggers
@@ -500,7 +501,9 @@ test treeview-8.8 "<<TreeviewSelect>> when setting the selection" -body {
.tv selection set {myItem2} ; # <<TreeviewSelect>> triggers
update
set res
-} -result {2 4 5}
+} -cleanup {
+ bind .tv <<TreeviewSelect>> {}
+} -result {2 3 4 5}
test treeview-8.9 "<<TreeviewSelect>> when removing items from the selection" -body {
.tv delete [.tv children {}]
@@ -519,6 +522,8 @@ test treeview-8.9 "<<TreeviewSelect>> when removing items from the selection" -b
.tv selection remove myItem1 ; # no <<TreeviewSelect>> (selection unchanged)
update
set res
+} -cleanup {
+ bind .tv <<TreeviewSelect>> {}
} -result {2}
test treeview-8.10 "<<TreeviewSelect>> when adding items in the selection" -body {
@@ -539,6 +544,8 @@ test treeview-8.10 "<<TreeviewSelect>> when adding items in the selection" -body
.tv selection add myItem3 ; # <<TreeviewSelect>> triggers
update
set res
+} -cleanup {
+ bind .tv <<TreeviewSelect>> {}
} -result {1 3}
test treeview-8.11 "<<TreeviewSelect>> when toggling" -body {
@@ -562,6 +569,8 @@ test treeview-8.11 "<<TreeviewSelect>> when toggling" -body {
.tv selection toggle {myItem3 myItem2} ; # <<TreeviewSelect>> triggers
update
set res
+} -cleanup {
+ bind .tv <<TreeviewSelect>> {}
} -result {2 3 4}
### NEED: more tests for see/yview/scrolling