From: Ian Jackson Date: Sat, 9 Jun 2012 18:30:46 +0000 (+0100) Subject: tooltips X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl-applet.git;a=commitdiff_plain;h=a94a9976cce1ff47d1ab38fcccc3099bab8e49d6 tooltips --- diff --git a/applet.tcl b/applet.tcl index ce25507..2bb9ac4 100644 --- a/applet.tcl +++ b/applet.tcl @@ -17,6 +17,19 @@ package require tktray # # tk::tktray widget is called .i # +# Tooltip: +# +# Caller may call +# applet::setup-tooltip ON-VISIBLE ON-INVISIBLE +# to make applet have a tooltip. +# +# ON-VISIBLE and ON-INVISIBLE will be globally eval'd +# when the tooltip becomes visible and invisible. +# +# Caller should call +# applet::tooltip-set TEXT-MAYBE-MULTILINE +# whenever they like. +# # Inner window subprocess: # # Caller that needs access to inner window should define @@ -43,8 +56,12 @@ tktray::icon .i -class example namespace eval applet { + +# used by both menus and tooltips variable posted 0 +#----- menus ----- + proc setup-button-menu {b} { bind .i.i { applet::menubuttonpressed %b %X %Y } menu .m$b -tearoff 0 @@ -73,60 +90,10 @@ proc msel {} { set posted 0 } -} - -proc innerwindow-resetup-required {why} { - variable innerwindow_after -puts "IW-EVENT $why" - if {[info exists innerwindow_after]} return - set innerwindow_after [after idle innerwindow-resetup] -} - -proc innerwindow-resetup {} { - variable innerwindow_after - unset innerwindow_after - -puts RESETUP - - innerwindow-destroying - - catch { destroy .i.i.c } - if {![winfo exists .i.i]} return - destroy [frame .i.i.make-exist] - catch { destroy .i.i.b.c } - catch { destroy .i.i.b } - frame .i.i.b - pack .i.i.b -fill both -side left -expand 1 - frame .i.i.b.c -container 1 -background orange - pack .i.i.b.c -fill both -side left -expand 1 -# - global inner_lastw inner_lasth - #set w [winfo width .i.i] -# set w [winfo width .i.i] -# set h [winfo height .i.i] - -# if {$w != $inner_lastw || $h != $inner_lasth} { -# set inner_lastw $w -# set inner_lasth $h -# innerwindow-ph-dummy configure -width $w -height 2 - innerwindow-ready -# } -} - -proc setupinnerwindow {w} { - global inner_lastw inner_lasth - set inner_lastw -2 - set inner_lasth -2 - - image create photo innerwindow-ph-dummy -width $w -height 2 - .i configure -image innerwindow-ph-dummy - - destroy [frame .i.make-exist] - destroy [frame .i.i.make-exist] - bind .i <> { innerwindow-resetup-required IconConfigure } -} +#----- tooltips ----- -namespace eval applet { +variable tooltip_on_vis {} +variable tooltip_on_invis {} proc tooltip-starttimer {state x y} { variable tooltip_after @@ -139,9 +106,11 @@ proc tooltip-starttimer {state x y} { proc tooltip-cancel {} { variable tooltip_after + variable tooltip_on_invis catch { after cancel $tooltip_after } catch { unset $tooltip_after } wm withdraw .tt + uplevel #0 $tooltip_on_invis } set tooltip_inwindow 0 @@ -158,7 +127,10 @@ proc tooltip-leave {} { tooltip-cancel } -proc setup-tooltip {} { +proc setup-tooltip {on_vis on_invis} { + foreach v {vis invis} { + variable tooltip_on_$v [set on_$v] + } bind .i { applet::tooltip-enter %s %X %Y } bind .i { applet::tooltip-leave } bind .i { @@ -179,14 +151,70 @@ proc tooltip-set {s} { } proc tooltip-show {x y} { + variable tooltip_on_vis incr x 9 incr y 9 wm geometry .tt +$x+$y wm deiconify .tt + uplevel #0 $tooltip_on_vis } } + +proc innerwindow-resetup-required {why} { + variable innerwindow_after +puts "IW-EVENT $why" + if {[info exists innerwindow_after]} return + set innerwindow_after [after idle innerwindow-resetup] +} + +proc innerwindow-resetup {} { + variable innerwindow_after + unset innerwindow_after + +puts RESETUP + + innerwindow-destroying + + catch { destroy .i.i.c } + if {![winfo exists .i.i]} return + destroy [frame .i.i.make-exist] + catch { destroy .i.i.b.c } + catch { destroy .i.i.b } + frame .i.i.b + pack .i.i.b -fill both -side left -expand 1 + frame .i.i.b.c -container 1 -background orange + pack .i.i.b.c -fill both -side left -expand 1 +# + global inner_lastw inner_lasth + #set w [winfo width .i.i] +# set w [winfo width .i.i] +# set h [winfo height .i.i] + +# if {$w != $inner_lastw || $h != $inner_lasth} { +# set inner_lastw $w +# set inner_lasth $h +# innerwindow-ph-dummy configure -width $w -height 2 + innerwindow-ready +# } +} + +proc setupinnerwindow {w} { + global inner_lastw inner_lasth + set inner_lastw -2 + set inner_lasth -2 + + image create photo innerwindow-ph-dummy -width $w -height 2 + .i configure -image innerwindow-ph-dummy + + destroy [frame .i.make-exist] + destroy [frame .i.i.make-exist] + bind .i <> { innerwindow-resetup-required IconConfigure } +} + + + proc setimage {image} { .i configure -image $image } diff --git a/example b/example index 67977a9..8c5e0c9 100755 --- a/example +++ b/example @@ -17,7 +17,7 @@ foreach b {1 3} { #setimage ims #setimage ims -applet::setup-tooltip +applet::setup-tooltip { puts VIS } { puts INVIS } applet::tooltip-set "line\nanother" fconfigure stdout -buffering line