From e740b916d3f8fa027e80482a1bf8c1093f9647e2 Mon Sep 17 00:00:00 2001 From: James Turner <zakalawe@mac.com> Date: Sat, 16 Mar 2013 12:46:13 +0000 Subject: [PATCH] Make tooltip also work for on-screen messages. Required new (in flightgear) Nasal timer to work, so make sure your fg is up-to-date. --- Nasal/canvas/tooltip.nas | 84 ++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/Nasal/canvas/tooltip.nas b/Nasal/canvas/tooltip.nas index 3a595d298..f24c7ee75 100644 --- a/Nasal/canvas/tooltip.nas +++ b/Nasal/canvas/tooltip.nas @@ -14,15 +14,17 @@ var Tooltip = { _tipId: nil, _slice: 17, _measureText: nil, - _measureBB: nil + _measureBB: nil, + _hideTimer: nil }; + m.setInt("size[0]", size[0]); m.setInt("size[1]", size[1]); m.setBool("visible", 0); - # arg = [child, listener_node, mode, is_child_event] - # setlistener(m._node, func m._propCallback(arg[0], arg[2]), 0, 2); - + m._hideTimer = maketimer(1.0, m, Tooltip._hideTimeout); + m._hideTimer.singleShot = 1; + return m; }, # Destructor @@ -192,9 +194,24 @@ var Tooltip = { me.setBool("visible", 1); }, + showMessage: func() + { + me.setInt("y", getprop('/sim/startup/ysize') * 0.2); + var screenW = getprop('/sim/startup/xsize'); + me.setInt("x", (screenW - me._width) * 0.5); + me.show(); + me._hideTimer.restart(4.0); + }, + hide: func() { - me.setBool("visible", 0); + me._hideTimer.restart(1.0); + }, + + hideNow: func() + { + me._hideTimer.stop(); + me._hideTimeout(); }, isVisible: func @@ -210,29 +227,20 @@ var Tooltip = { fadeOut: func() { me.hide(); - } + }, # private: - + _hideTimeout: func() + { + me.setBool("visible", 0); + } }; var tooltip = canvas.Tooltip.new([300, 100]); - tooltip.createCanvas(); +tooltip.createCanvas(); -var setTooltip = func(node) +var innerSetTooltip = func(node) { - var tipId = cmdarg().getNode('tooltip-id').getValue(); - if (tooltip.getTooltipId() == tipId) { - return; # nothing more to do - } - - var x = cmdarg().getNode('x').getValue(); - var y = cmdarg().getNode('y').getValue(); - - var screenHeight = getprop('/sim/startup/ysize'); - tooltip.setPosition(x, screenHeight - y); - tooltip.setTooltipId(tipId); - tooltip.setLabel(cmdarg().getNode('label').getValue()); var measure = cmdarg().getNode('measure-text'); if (measure != nil) { @@ -254,6 +262,23 @@ var setTooltip = func(node) tooltip.setProperty(nil); tooltip.setMapping(nil); } +} + +var setTooltip = func(node) +{ + var tipId = cmdarg().getNode('tooltip-id').getValue(); + if (tooltip.getTooltipId() == tipId) { + return; # nothing more to do + } + + var x = cmdarg().getNode('x').getValue(); + var y = cmdarg().getNode('y').getValue(); + + var screenHeight = getprop('/sim/startup/ysize'); + tooltip.setPosition(x, screenHeight - y); + tooltip.setTooltipId(tipId); + + innerSetTooltip(node); # don't actually show here, we do that response to tooltip-timeout # so this is just getting ready @@ -282,6 +307,23 @@ var updateHover = func(node) } +var showMessage = func(node) +{ + var msgId = node.getNode("id"); + tooltip.setTooltipId((msgId == nil) ? 'msg' : msgId.getValue()); + innerSetTooltip(node); + tooltip.showMessage(); +} + +var clearMessage = func(node) +{ + var msgId = node.getNode("id"); + if (tooltip.getTooltipId() != msgId.getValue()) return; + tooltip.hideNow(); +} + addcommand("update-hover", updateHover); addcommand("set-tooltip", setTooltip); addcommand("tooltip-timeout", showTooltip); +addcommand("show-message", showMessage); +addcommand("clear-message", clearMessage); \ No newline at end of file