From 41bf23d6cc58c229e5e966a98c1b2c9cd06e95f7 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 1 Jun 2007 03:01:45 -0400 Subject: [PATCH] git-gui: Display tooltips in blame viewer When the mouse is over a particular line and we have blame data for that line, but its not the active commit, we should show the user information about that commit like who the author was and what the subject (first line) was. Signed-off-by: Shawn O. Pearce --- lib/blame.tcl | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 125 insertions(+), 1 deletion(-) diff --git a/lib/blame.tcl b/lib/blame.tcl index 33596cd..fef28a3 100644 --- a/lib/blame.tcl +++ b/lib/blame.tcl @@ -31,6 +31,11 @@ field r_orig_line ; # original line number field r_final_line ; # final line number field r_line_count ; # lines in this region +field tooltip_wm {} ; # Current tooltip toplevel, if open +field tooltip_timer {} ; # Current timer event for our tooltip +field tooltip_commit {} ; # Commit in tooltip +field tooltip_text {} ; # Text in current tooltip + variable active_color #98e1a0 variable group_colors { #cbcbcb @@ -159,8 +164,16 @@ constructor new {i_commit i_path} { $w_line \ $w_file \ ] yview $w.out.sby] - bind $i "[cb _click $i @%x,%y]; focus $i" + bind $i " + [cb _hide_tooltip] + [cb _click $i @%x,%y] + focus $i + " + bind $i [cb _show_tooltip $i @%x,%y] + bind $i [cb _hide_tooltip] + bind $i [cb _hide_tooltip] bind_button3 $i " + [cb _hide_tooltip] set cursorX %x set cursorY %y set cursorW %W @@ -447,6 +460,10 @@ $msg" set highlight_line $lno set highlight_commit $cmit + + if {$highlight_commit eq $tooltip_commit} { + _hide_tooltip $this + } } method _copycommit {} { @@ -461,4 +478,111 @@ method _copycommit {} { } } +method _show_tooltip {cur_w pos} { + set lno [lindex [split [$cur_w index $pos] .] 0] + if {[catch {set cmit $line_commit($lno)}]} { + _hide_tooltip $this + return + } + + if {$cmit eq $highlight_commit} { + _hide_tooltip $this + return + } + + if {$cmit eq $tooltip_commit} { + _position_tooltip $this + } elseif {$tooltip_wm ne {}} { + _open_tooltip $this $cur_w + } elseif {$tooltip_timer eq {}} { + set tooltip_timer [after 1000 [cb _open_tooltip $cur_w]] + } +} + +method _open_tooltip {cur_w} { + set tooltip_timer {} + set pos_x [winfo pointerx $cur_w] + set pos_y [winfo pointery $cur_w] + if {[winfo containing $pos_x $pos_y] ne $cur_w} { + _hide_tooltip $this + return + } + + set pos @[join [list \ + [expr {$pos_x - [winfo rootx $cur_w]}] \ + [expr {$pos_y - [winfo rooty $cur_w]}]] ,] + set lno [lindex [split [$cur_w index $pos] .] 0] + set cmit $line_commit($lno) + + set author_name {} + set author_email {} + set author_time {} + catch {set author_name $header($cmit,author)} + catch {set author_email $header($cmit,author-mail)} + catch {set author_time [clock format \ + $header($cmit,author-time) \ + -format {%Y-%m-%d %H:%M:%S} + ]} + + set committer_name {} + set committer_email {} + set committer_time {} + catch {set committer_name $header($cmit,committer)} + catch {set committer_email $header($cmit,committer-mail)} + catch {set committer_time [clock format \ + $header($cmit,committer-time) \ + -format {%Y-%m-%d %H:%M:%S} + ]} + + set summary {} + catch {set summary $header($cmit,summary)} + + set tooltip_commit $cmit + set tooltip_text "commit $cmit +$author_name $author_email $author_time +$summary" + + if {$tooltip_wm ne "$cur_w.tooltip"} { + _hide_tooltip $this + + set tooltip_wm [toplevel $cur_w.tooltip -borderwidth 1] + wm overrideredirect $tooltip_wm 1 + wm transient $tooltip_wm [winfo toplevel $cur_w] + pack [label $tooltip_wm.label \ + -background lightyellow \ + -foreground black \ + -textvariable @tooltip_text \ + -justify left] + } + _position_tooltip $this +} + +method _position_tooltip {} { + set req_w [winfo reqwidth $tooltip_wm.label] + set req_h [winfo reqheight $tooltip_wm.label] + set pos_x [expr {[winfo pointerx .] + 5}] + set pos_y [expr {[winfo pointery .] + 10}] + + set g "${req_w}x${req_h}" + if {$pos_x >= 0} {append g +} + append g $pos_x + if {$pos_y >= 0} {append g +} + append g $pos_y + + wm geometry $tooltip_wm $g + raise $tooltip_wm +} + +method _hide_tooltip {} { + if {$tooltip_wm ne {}} { + destroy $tooltip_wm + set tooltip_wm {} + set tooltip_commit {} + } + if {$tooltip_timer ne {}} { + after cancel $tooltip_timer + set tooltip_timer {} + } +} + } -- 2.11.4.GIT