diff options
author | fvogel <fvogelnew1@free.fr> | 2022-03-07 21:57:22 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2022-03-07 21:57:22 (GMT) |
commit | 073080595902ccbf4873b9258c1885b3ee641a96 (patch) | |
tree | b2201ea0d24a1e6cca9fce27b201ea5790984290 | |
parent | bbcad39d045031d99788b54b4334d511b14acb3a (diff) | |
download | tk-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.n | 3 | ||||
-rw-r--r-- | doc/ttk_treeview.n | 3 | ||||
-rw-r--r-- | generic/ttk/ttkTreeview.c | 22 | ||||
-rw-r--r-- | tests/ttk/treeview.test | 13 |
4 files changed, 21 insertions, 20 deletions
@@ -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 |