implement button tooltips on top menu
This commit is contained in:
parent
5988867787
commit
1b9f9bbc7d
|
@ -18,5 +18,6 @@ Module
|
||||||
require 'ui'
|
require 'ui'
|
||||||
require 'gfx'
|
require 'gfx'
|
||||||
require 'messagebox/messagebox'
|
require 'messagebox/messagebox'
|
||||||
|
require 'tooltip/tooltip'
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
ToolTip = {}
|
||||||
|
|
||||||
|
-- private variables
|
||||||
|
local currentToolTip
|
||||||
|
|
||||||
|
-- private functions
|
||||||
|
local function moveToolTip(tooltip)
|
||||||
|
local pos = getMouseCursorPos()
|
||||||
|
pos.y = pos.y + 1
|
||||||
|
local xdif = getScreenSize().width - (pos.x + tooltip:getWidth())
|
||||||
|
if xdif < 2 then
|
||||||
|
pos.x = pos.x - tooltip:getWidth() - 3
|
||||||
|
else
|
||||||
|
pos.x = pos.x + 10
|
||||||
|
end
|
||||||
|
tooltip:moveTo(pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- public functions
|
||||||
|
function ToolTip.display(text)
|
||||||
|
ToolTip.hide()
|
||||||
|
if text then
|
||||||
|
currentToolTip = UI.loadAndDisplay('/core/tooltip/tooltip.otui', UI.root)
|
||||||
|
currentToolTip.onMouseMove = moveToolTip
|
||||||
|
local label = currentToolTip:getChildById('toolTipText')
|
||||||
|
label:setText(text)
|
||||||
|
label:resizeToText()
|
||||||
|
local size = label:getSize()
|
||||||
|
size.width = size.width + 4
|
||||||
|
size.height = size.height + 4
|
||||||
|
currentToolTip:setSize(size)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ToolTip.hide()
|
||||||
|
if currentToolTip then
|
||||||
|
currentToolTip:destroy()
|
||||||
|
currentToolTip = nil
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
RectPanel
|
||||||
|
background-color: #111111bb
|
||||||
|
size: 200 200
|
||||||
|
id: toolTip
|
||||||
|
focusable: false
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: toolTipText
|
||||||
|
anchors.centerIn: parent
|
|
@ -23,7 +23,17 @@ Button < UIButton
|
||||||
color: #999999
|
color: #999999
|
||||||
background-color: #ffffff88
|
background-color: #ffffff88
|
||||||
|
|
||||||
TopButton < UIButton
|
ToolTipButton < UIButton
|
||||||
|
onHoverChange: |
|
||||||
|
function(self, hovered)
|
||||||
|
if hovered then
|
||||||
|
ToolTip.display(self:getStyle().tooltip)
|
||||||
|
else
|
||||||
|
ToolTip:hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
TopButton < ToolTipButton
|
||||||
background-color: white
|
background-color: white
|
||||||
size: 26 25
|
size: 26 25
|
||||||
text-translate: 0 0
|
text-translate: 0 0
|
||||||
|
|
|
@ -11,6 +11,7 @@ TopPanel
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
margin.top: 4
|
margin.top: 4
|
||||||
margin.left: 6
|
margin.left: 6
|
||||||
|
tooltip: Options
|
||||||
onClick: Options.create()
|
onClick: Options.create()
|
||||||
|
|
||||||
UIWidget
|
UIWidget
|
||||||
|
@ -23,6 +24,7 @@ TopPanel
|
||||||
anchors.top: prev.top
|
anchors.top: prev.top
|
||||||
anchors.left: prev.right
|
anchors.left: prev.right
|
||||||
margin.left: 6
|
margin.left: 6
|
||||||
|
tooltip: Enter game with a character
|
||||||
onClick: |
|
onClick: |
|
||||||
if Game.isOnline() then
|
if Game.isOnline() then
|
||||||
CharacterList.show()
|
CharacterList.show()
|
||||||
|
@ -41,6 +43,7 @@ TopPanel
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
margin.top: 4
|
margin.top: 4
|
||||||
margin.right: 6
|
margin.right: 6
|
||||||
|
tooltip: Logout
|
||||||
onClick: |
|
onClick: |
|
||||||
if Game.isOnline() then
|
if Game.isOnline() then
|
||||||
Game.logout(false)
|
Game.logout(false)
|
||||||
|
@ -59,6 +62,7 @@ TopPanel
|
||||||
anchors.right: prev.left
|
anchors.right: prev.left
|
||||||
margin.top: 4
|
margin.top: 4
|
||||||
margin.right: 6
|
margin.right: 6
|
||||||
|
tooltip: About OTClient
|
||||||
onClick: About.create()
|
onClick: About.create()
|
||||||
|
|
||||||
UIWidget
|
UIWidget
|
||||||
|
|
|
@ -186,6 +186,16 @@ namespace luabinder
|
||||||
Tuple>(f);
|
Tuple>(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Obj, typename Ret, typename... Args, typename... Holders>
|
||||||
|
LuaCppFunction bind_fun(const std::_Bind<std::_Mem_fn<Ret (Obj::*)(Args...) const>(Obj*, Holders...)>& f) {
|
||||||
|
typedef typename std::tuple<Args...> ArgsTuple;
|
||||||
|
typedef typename std::tuple<Holders...> HoldersTuple;
|
||||||
|
typedef typename get_holded_tuple<void, sizeof...(Holders), ArgsTuple, HoldersTuple>::type Tuple;
|
||||||
|
return bind_fun_specializer<typename remove_const_ref<Ret>::type,
|
||||||
|
decltype(f),
|
||||||
|
Tuple>(f);
|
||||||
|
}
|
||||||
|
|
||||||
/// Bind customized functions already bound by std::bind
|
/// Bind customized functions already bound by std::bind
|
||||||
template<typename Obj>
|
template<typename Obj>
|
||||||
LuaCppFunction bind_fun(const std::_Bind<std::_Mem_fn<int (Obj::*)(LuaInterface*)>(Obj*, std::_Placeholder<1>)>& f) {
|
LuaCppFunction bind_fun(const std::_Bind<std::_Mem_fn<int (Obj::*)(LuaInterface*)>(Obj*, std::_Placeholder<1>)>& f) {
|
||||||
|
|
|
@ -26,6 +26,9 @@
|
||||||
#include <framework/net/protocol.h>
|
#include <framework/net/protocol.h>
|
||||||
#include <framework/core/eventdispatcher.h>
|
#include <framework/core/eventdispatcher.h>
|
||||||
#include <framework/core/configs.h>
|
#include <framework/core/configs.h>
|
||||||
|
#include <framework/platform/platform.h>
|
||||||
|
#include <framework/otml/otml.h>
|
||||||
|
#include <framework/graphics/graphics.h>
|
||||||
|
|
||||||
void LuaInterface::registerFunctions()
|
void LuaInterface::registerFunctions()
|
||||||
{
|
{
|
||||||
|
@ -42,6 +45,10 @@ void LuaInterface::registerFunctions()
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setWidth", &UIWidget::setWidth);
|
g_lua.bindClassMemberFunction<UIWidget>("setWidth", &UIWidget::setWidth);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getHeight", &UIWidget::getHeight);
|
g_lua.bindClassMemberFunction<UIWidget>("getHeight", &UIWidget::getHeight);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setHeight", &UIWidget::setHeight);
|
g_lua.bindClassMemberFunction<UIWidget>("setHeight", &UIWidget::setHeight);
|
||||||
|
g_lua.bindClassMemberFunction<UIWidget>("getSize", &UIWidget::getSize);
|
||||||
|
g_lua.bindClassMemberFunction<UIWidget>("setSize", &UIWidget::resize);
|
||||||
|
g_lua.bindClassMemberFunction<UIWidget>("getPosition", &UIWidget::getPosition);
|
||||||
|
g_lua.bindClassMemberFunction<UIWidget>("moveTo", &UIWidget::moveTo);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getParent", &UIWidget::getParent);
|
g_lua.bindClassMemberFunction<UIWidget>("getParent", &UIWidget::getParent);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setParent", &UIWidget::setParent);
|
g_lua.bindClassMemberFunction<UIWidget>("setParent", &UIWidget::setParent);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getBackgroundColor", &UIWidget::getBackgroundColor);
|
g_lua.bindClassMemberFunction<UIWidget>("getBackgroundColor", &UIWidget::getBackgroundColor);
|
||||||
|
@ -51,6 +58,7 @@ void LuaInterface::registerFunctions()
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getOpacity", &UIWidget::getOpacity);
|
g_lua.bindClassMemberFunction<UIWidget>("getOpacity", &UIWidget::getOpacity);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setOpacity", &UIWidget::setOpacity);
|
g_lua.bindClassMemberFunction<UIWidget>("setOpacity", &UIWidget::setOpacity);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setStyle", &UIWidget::setStyle);
|
g_lua.bindClassMemberFunction<UIWidget>("setStyle", &UIWidget::setStyle);
|
||||||
|
g_lua.bindClassMemberFunction<UIWidget>("getStyle", &UIWidget::getStyle);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getMarginTop", &UIWidget::getMarginTop);
|
g_lua.bindClassMemberFunction<UIWidget>("getMarginTop", &UIWidget::getMarginTop);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("setMarginTop", &UIWidget::setMarginTop);
|
g_lua.bindClassMemberFunction<UIWidget>("setMarginTop", &UIWidget::setMarginTop);
|
||||||
g_lua.bindClassMemberFunction<UIWidget>("getMarginBottom", &UIWidget::getMarginBottom);
|
g_lua.bindClassMemberFunction<UIWidget>("getMarginBottom", &UIWidget::getMarginBottom);
|
||||||
|
@ -139,4 +147,6 @@ void LuaInterface::registerFunctions()
|
||||||
g_lua.bindGlobalFunction("getRootWidget", std::bind(&UIManager::getRootWidget, &g_ui));
|
g_lua.bindGlobalFunction("getRootWidget", std::bind(&UIManager::getRootWidget, &g_ui));
|
||||||
g_lua.bindGlobalFunction("addEvent", std::bind(&EventDispatcher::addEvent, &g_dispatcher, _1, false));
|
g_lua.bindGlobalFunction("addEvent", std::bind(&EventDispatcher::addEvent, &g_dispatcher, _1, false));
|
||||||
g_lua.bindGlobalFunction("scheduleEvent", std::bind(&EventDispatcher::scheduleEvent, &g_dispatcher, _1, _2));
|
g_lua.bindGlobalFunction("scheduleEvent", std::bind(&EventDispatcher::scheduleEvent, &g_dispatcher, _1, _2));
|
||||||
|
g_lua.bindGlobalFunction("getMouseCursorPos", std::bind(&Platform::getMouseCursorPos, &g_platform));
|
||||||
|
g_lua.bindGlobalFunction("getScreenSize", std::bind(&Graphics::getScreenSize, &g_graphics));
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,6 +199,33 @@ bool luavalue_cast(int index, Point& point)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// size
|
||||||
|
void push_luavalue(const Size& size)
|
||||||
|
{
|
||||||
|
g_lua.newTable();
|
||||||
|
g_lua.pushInteger(size.width());
|
||||||
|
g_lua.setField("width");
|
||||||
|
g_lua.pushInteger(size.height());
|
||||||
|
g_lua.setField("height");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool luavalue_cast(int index, Size& size)
|
||||||
|
{
|
||||||
|
if(g_lua.isTable(index)) {
|
||||||
|
g_lua.getField("width", index);
|
||||||
|
size.setWidth(g_lua.popInteger());
|
||||||
|
g_lua.getField("height", index);
|
||||||
|
size.setHeight(g_lua.popInteger());
|
||||||
|
return true;
|
||||||
|
} else if(g_lua.isString()) {
|
||||||
|
return Fw::cast(g_lua.toString(index), size);
|
||||||
|
} else if(g_lua.isNil()) {
|
||||||
|
size = Size();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// otml nodes
|
// otml nodes
|
||||||
void push_luavalue(const OTMLNodePtr& node)
|
void push_luavalue(const OTMLNodePtr& node)
|
||||||
{
|
{
|
||||||
|
|
|
@ -53,9 +53,6 @@ void UIButton::onStyleApply(const OTMLNodePtr& styleNode)
|
||||||
m_textTranslate = node->value<Point>();
|
m_textTranslate = node->value<Point>();
|
||||||
} else if(node->tag() == "text") {
|
} else if(node->tag() == "text") {
|
||||||
m_text = node->value();
|
m_text = node->value();
|
||||||
} else if(node->tag() == "onClick") {
|
|
||||||
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
|
||||||
luaSetField(node->tag());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ void UIVerticalLayout::update()
|
||||||
|
|
||||||
void UIVerticalLayout::addWidget(const UIWidgetPtr& widget)
|
void UIVerticalLayout::addWidget(const UIWidgetPtr& widget)
|
||||||
{
|
{
|
||||||
// needed to be correcly sorted on update
|
// needed to be correctly sorted on the following update
|
||||||
widget->setY(9999);
|
widget->setY(9999);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
|
@ -841,6 +841,11 @@ void UIWidget::onStyleApply(const OTMLNodePtr& styleNode)
|
||||||
|
|
||||||
anchorLayout->addAnchor(asUIWidget(), anchoredEdge, hookedWidgetId, hookedEdge);
|
anchorLayout->addAnchor(asUIWidget(), anchoredEdge, hookedWidgetId, hookedEdge);
|
||||||
}
|
}
|
||||||
|
} else if(node->tag() == "onClick" ||
|
||||||
|
node->tag() == "onHoverChange") {
|
||||||
|
dump << node->tag();
|
||||||
|
g_lua.loadFunction(node->value(), "@" + node->source() + "[" + node->tag() + "]");
|
||||||
|
luaSetField(node->tag());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -858,6 +863,10 @@ void UIWidget::onFocusChange(bool focused, Fw::FocusReason reason)
|
||||||
void UIWidget::onHoverChange(bool hovered)
|
void UIWidget::onHoverChange(bool hovered)
|
||||||
{
|
{
|
||||||
callLuaField("onHoverChange", hovered);
|
callLuaField("onHoverChange", hovered);
|
||||||
|
|
||||||
|
// check for new hovered elements when the current widget is removed
|
||||||
|
if(!hovered && !getParent())
|
||||||
|
g_ui.getRootWidget()->updateState(Fw::HoverState);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UIWidget::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers)
|
bool UIWidget::onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers)
|
||||||
|
|
|
@ -119,6 +119,7 @@ public:
|
||||||
int getMarginTop() const { return m_marginTop; }
|
int getMarginTop() const { return m_marginTop; }
|
||||||
int getMarginBottom() const { return m_marginBottom; }
|
int getMarginBottom() const { return m_marginBottom; }
|
||||||
Fw::FocusReason getLastFocusReason() const { return m_lastFocusReason; }
|
Fw::FocusReason getLastFocusReason() const { return m_lastFocusReason; }
|
||||||
|
OTMLNodePtr getStyle() const { return m_style; }
|
||||||
|
|
||||||
UIWidgetList getChildren() const { return m_children; }
|
UIWidgetList getChildren() const { return m_children; }
|
||||||
UIWidgetPtr getFocusedChild() const { return m_focusedChild; }
|
UIWidgetPtr getFocusedChild() const { return m_focusedChild; }
|
||||||
|
|
Loading…
Reference in New Issue