summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-06-01 03:01:45 -0400
committerShawn O. Pearce <spearce@spearce.org>2007-06-06 01:26:45 -0400
commit41bf23d6cc58c229e5e966a98c1b2c9cd06e95f7 (patch)
tree36e4db14408fe2e7a161ea76e00e3c4a883f1dd2
parent37ebc93f6dddb6d73034f027873266eef1e3e774 (diff)
downloadgit-41bf23d6cc58c229e5e966a98c1b2c9cd06e95f7.tar.gz
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 <spearce@spearce.org>
-rw-r--r--lib/blame.tcl126
1 files changed, 125 insertions, 1 deletions
diff --git a/lib/blame.tcl b/lib/blame.tcl
index 33596cd892..fef28a347e 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 <Button-1> "[cb _click $i @%x,%y]; focus $i"
+ bind $i <Button-1> "
+ [cb _hide_tooltip]
+ [cb _click $i @%x,%y]
+ focus $i
+ "
+ bind $i <Any-Motion> [cb _show_tooltip $i @%x,%y]
+ bind $i <Any-Enter> [cb _hide_tooltip]
+ bind $i <Any-Leave> [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 {}
+ }
+}
+
}