зеркало из https://github.com/microsoft/git.git
git-gui: Disable native platform text selection in "lists"
Sometimes we use a Tk text widget as though it were a listbox. This happens typically when we want to show an icon to the left of the text label or just when a text widget is generally a better choice then the native listbox widget. In these cases if we want the user to have control over the selection we implement our own "in_sel" tag that shows the selected region and we perform our own selection management in the background via keybindings and mouse bindings. In such uses we don't want the user to be able to activate the native platform selection by dragging their mouse through the text widget. Doing so creates a very confusing display and the user is left wondering what it may mean to have two different types of selection in the same widget. Tk doesn't allow us to delete the "sel" tag that it uses internally to manage the native selection but it will allow us to make it invisible by setting the tag to have the same display properties as unselected text. So long as we don't actually use the "sel" tag for anything in code its effectively invisible. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Родитель
55bad4f096
Коммит
3849bfba84
14
git-gui.sh
14
git-gui.sh
|
@ -481,6 +481,16 @@ proc tk_optionMenu {w varName args} {
|
||||||
return $m
|
return $m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc rmsel_tag {text} {
|
||||||
|
$text tag conf sel \
|
||||||
|
-background [$text cget -background] \
|
||||||
|
-foreground [$text cget -foreground] \
|
||||||
|
-borderwidth 0
|
||||||
|
$text tag conf in_sel -background lightgray
|
||||||
|
bind $text <Motion> break
|
||||||
|
return $text
|
||||||
|
}
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
##
|
##
|
||||||
## find git
|
## find git
|
||||||
|
@ -2151,8 +2161,8 @@ pack $ui_workdir -side left -fill both -expand 1
|
||||||
.vpane.files add .vpane.files.workdir -sticky nsew
|
.vpane.files add .vpane.files.workdir -sticky nsew
|
||||||
|
|
||||||
foreach i [list $ui_index $ui_workdir] {
|
foreach i [list $ui_index $ui_workdir] {
|
||||||
$i tag conf in_diff -background lightgray
|
rmsel_tag $i
|
||||||
$i tag conf in_sel -background lightgray
|
$i tag conf in_diff -background [$i tag cget in_sel -background]
|
||||||
}
|
}
|
||||||
unset i
|
unset i
|
||||||
|
|
||||||
|
|
|
@ -47,9 +47,7 @@ constructor new {commit {path {}}} {
|
||||||
-width 70 \
|
-width 70 \
|
||||||
-xscrollcommand [list $w.list.sbx set] \
|
-xscrollcommand [list $w.list.sbx set] \
|
||||||
-yscrollcommand [list $w.list.sby set]
|
-yscrollcommand [list $w.list.sby set]
|
||||||
$w_list tag conf in_sel \
|
rmsel_tag $w_list
|
||||||
-background [$w_list cget -foreground] \
|
|
||||||
-foreground [$w_list cget -background]
|
|
||||||
scrollbar $w.list.sbx -orient h -command [list $w_list xview]
|
scrollbar $w.list.sbx -orient h -command [list $w_list xview]
|
||||||
scrollbar $w.list.sby -orient v -command [list $w_list yview]
|
scrollbar $w.list.sby -orient v -command [list $w_list yview]
|
||||||
pack $w.list.sbx -side bottom -fill x
|
pack $w.list.sbx -side bottom -fill x
|
||||||
|
|
|
@ -62,6 +62,7 @@ constructor pick {path title a_family a_size} {
|
||||||
-width 30 \
|
-width 30 \
|
||||||
-height 10 \
|
-height 10 \
|
||||||
-yscrollcommand [list $w.inner.family.sby set]
|
-yscrollcommand [list $w.inner.family.sby set]
|
||||||
|
rmsel_tag $w_family
|
||||||
scrollbar $w.inner.family.sby -command [list $w_family yview]
|
scrollbar $w.inner.family.sby -command [list $w_family yview]
|
||||||
pack $w.inner.family.l -side top -fill x
|
pack $w.inner.family.l -side top -fill x
|
||||||
pack $w.inner.family.sby -side right -fill y
|
pack $w.inner.family.sby -side right -fill y
|
||||||
|
@ -95,6 +96,7 @@ constructor pick {path title a_family a_size} {
|
||||||
-relief sunken \
|
-relief sunken \
|
||||||
-height 3 \
|
-height 3 \
|
||||||
-width 40
|
-width 40
|
||||||
|
rmsel_tag $w_example
|
||||||
$w_example tag conf example -justify center
|
$w_example tag conf example -justify center
|
||||||
$w_example insert end [mc "This is example text.\nIf you like this text, it can be your font."] example
|
$w_example insert end [mc "This is example text.\nIf you like this text, it can be your font."] example
|
||||||
$w_example conf -state disabled
|
$w_example conf -state disabled
|
||||||
|
@ -108,11 +110,10 @@ constructor pick {path title a_family a_size} {
|
||||||
|
|
||||||
$w_family tag conf pick
|
$w_family tag conf pick
|
||||||
$w_family tag bind pick <Button-1> [cb _pick_family %x %y]\;break
|
$w_family tag bind pick <Button-1> [cb _pick_family %x %y]\;break
|
||||||
$w_family tag conf cpck -background lightgray
|
|
||||||
foreach f $all_families {
|
foreach f $all_families {
|
||||||
set sel [list pick]
|
set sel [list pick]
|
||||||
if {$f eq $f_family} {
|
if {$f eq $f_family} {
|
||||||
lappend sel cpck
|
lappend sel in_sel
|
||||||
}
|
}
|
||||||
$w_family insert end "$f\n" $sel
|
$w_family insert end "$f\n" $sel
|
||||||
}
|
}
|
||||||
|
@ -145,8 +146,8 @@ method _pick_family {x y} {
|
||||||
set i [lindex [split [$w_family index @$x,$y] .] 0]
|
set i [lindex [split [$w_family index @$x,$y] .] 0]
|
||||||
set n [lindex $all_families [expr {$i - 1}]]
|
set n [lindex $all_families [expr {$i - 1}]]
|
||||||
if {$n ne {}} {
|
if {$n ne {}} {
|
||||||
$w_family tag remove cpck 0.0 end
|
$w_family tag remove in_sel 0.0 end
|
||||||
$w_family tag add cpck $i.0 [expr {$i + 1}].0
|
$w_family tag add in_sel $i.0 [expr {$i + 1}].0
|
||||||
set f_family $n
|
set f_family $n
|
||||||
_update $this
|
_update $this
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче