summaryrefslogtreecommitdiff
path: root/ext/tk/sample/tkballoonhelp.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ext/tk/sample/tkballoonhelp.rb')
-rw-r--r--ext/tk/sample/tkballoonhelp.rb99
1 files changed, 99 insertions, 0 deletions
diff --git a/ext/tk/sample/tkballoonhelp.rb b/ext/tk/sample/tkballoonhelp.rb
new file mode 100644
index 0000000000..312e376a07
--- /dev/null
+++ b/ext/tk/sample/tkballoonhelp.rb
@@ -0,0 +1,99 @@
+#
+# tkballoonhelp.rb : simple balloon help widget
+# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
+#
+# Add a balloon help to a widget.
+# This widget has only poor featureas. If you need more useful features,
+# please try to use the Tix extension of Tcl/Tk under Ruby/Tk.
+#
+# The interval time to display a balloon help is defined 'interval' option
+# (default is 1000ms).
+#
+require 'tk'
+
+class TkBalloonHelp<TkLabel
+ def _balloon_binding(interval)
+ @timer = TkAfter.new(interval, 1, proc{show})
+ def @timer.interval(val)
+ @sleep_time = val
+ end
+ @bindtag = TkBindTag.new
+ @bindtag.bind('Enter', proc{@timer.start})
+ @bindtag.bind('Motion', proc{@timer.restart; erase})
+ @bindtag.bind('Any-ButtonPress', proc{@timer.restart; erase})
+ @bindtag.bind('Leave', proc{@timer.stop; erase})
+ tags = @parent.bindtags
+ idx = tags.index(@parent)
+ tags[idx,0] = @bindtag
+ @parent.bindtags(tags)
+ end
+ private :_balloon_binding
+
+ def initialize(parent=nil, keys={})
+ @parent = parent
+
+ @frame = TkToplevel.new(@parent)
+ @frame.withdraw
+ @frame.overrideredirect(true)
+ @frame.transient(TkWinfo.toplevel(@parent))
+ @epath = @frame.path
+
+ keys = {} unless keys
+
+ @interval = keys.delete('interval'){1000}
+ _balloon_binding(@interval)
+
+ @label = TkLabel.new(@frame, 'background'=>'bisque').pack
+ @label.configure(_symbolkey2str(keys)) unless keys.empty?
+ @path = @label
+ end
+
+ def epath
+ @epath
+ end
+
+ def interval(val)
+ if val
+ @timer.interval(val)
+ else
+ @interval
+ end
+ end
+
+ def show
+ x = TkWinfo.pointerx(@parent)
+ y = TkWinfo.pointery(@parent)
+ @frame.geometry("+#{x+1}+#{y+1}")
+ @frame.deiconify
+ @frame.raise
+
+ @org_cursor = @parent['cursor']
+ @parent.cursor('crosshair')
+ end
+
+ def erase
+ @parent.cursor(@org_cursor)
+ @frame.withdraw
+ end
+
+ def destroy
+ @frame.destroy
+ end
+end
+
+################################################
+# test
+################################################
+if __FILE__ == $0
+ TkButton.new('text'=>'This button has a balloon help') {|b|
+ pack('fill'=>'x')
+ TkBalloonHelp.new(b, 'text'=>' Message ')
+ }
+ TkButton.new('text'=>'This button has another balloon help') {|b|
+ pack('fill'=>'x')
+ TkBalloonHelp.new(b, 'text'=>'configured message',
+ 'interval'=>500, 'font'=>'courier',
+ 'background'=>'gray', 'foreground'=>'red')
+ }
+ Tk.mainloop
+end