some window moving

master
Eduardo Bart 12 years ago
parent 08a88e3842
commit 46df3c7dbe

@ -3,7 +3,6 @@ High priority TODO in order (before first public disclose)
restore map moving restore map moving
multiline text edit multiline text edit
fix auto repeats events
remove UIGame remove UIGame
move windows, navigate in containers move windows, navigate in containers
complete miniwindow (close, minimize, resize, move) complete miniwindow (close, minimize, resize, move)
@ -11,9 +10,7 @@ create and bind all game functions/events
let windows stay open while playing let windows stay open while playing
combat controls combat controls
player status icons (poison, etc) player status icons (poison, etc)
modules managment interface
load modules from zip files load modules from zip files
addons folder
display exit box when exiting from game display exit box when exiting from game
scrollbar and scrollable widgets scrollbar and scrollable widgets
@ -25,6 +22,7 @@ review directories loading search
load modules from zip packages load modules from zip packages
create a class for reading binary files create a class for reading binary files
rework lua/c++ logger rework lua/c++ logger
replace autoload-antencedence with load-before/load-after
== Graphics == Graphics
use CoordsBuffer in font use CoordsBuffer in font

@ -1 +1 @@
You can plance any personal addons here. This folder work exactly as modules folder, however is intended to place only addons here.

@ -15,6 +15,7 @@ end
function About.terminate() function About.terminate()
aboutButton:destroy() aboutButton:destroy()
aboutButton = nil aboutButton = nil
About = nil
end end
function About.openWebpage() function About.openWebpage()

@ -15,4 +15,4 @@ Module
About.init() About.init()
onUnload: | onUnload: |
About.terminate() About.terminate()

@ -12,7 +12,7 @@ MainWindow
text-align: center text-align: center
text: |- text: |-
OTClient OTClient
Version 0.2.0 Version 0.4.0
Created by edubart Created by edubart
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top anchors.top: parent.top

@ -12,6 +12,7 @@ end
function Background.terminate() function Background.terminate()
background:destroy() background:destroy()
background = nil background = nil
Background = nil
end end
function Background.hide() function Background.hide()

@ -12,4 +12,3 @@ Module
onUnload: | onUnload: |
Background.terminate() Background.terminate()

@ -9,4 +9,3 @@ Panel
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
margin-top: 1 margin-top: 1
focusable: false focusable: false

@ -63,6 +63,7 @@ function CharacterList.terminate()
loadBox:destroy() loadBox:destroy()
loadBox = nil loadBox = nil
end end
CharacterList = nil
end end
function CharacterList.create(characters, premDays) function CharacterList.create(characters, premDays)

@ -66,4 +66,4 @@ MainWindow
width: 64 width: 64
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
@onClick: CharacterList.destroy() @onClick: CharacterList.destroy()

@ -97,6 +97,7 @@ function EnterGame.terminate()
enterGameButton = nil enterGameButton = nil
motdButton:destroy() motdButton:destroy()
motdButton = nil motdButton = nil
EnterGame = nil
end end
function EnterGame.show() function EnterGame.show()
@ -144,4 +145,3 @@ end
function EnterGame.displayMotd() function EnterGame.displayMotd()
displayInfoBox('Message of the day', motdMessage) displayInfoBox('Message of the day', motdMessage)
end end

@ -14,5 +14,3 @@ Module
onUnload: | onUnload: |
EnterGame.terminate() EnterGame.terminate()
CharacterList.terminate() CharacterList.terminate()

@ -34,4 +34,5 @@ function Client.terminate()
Settings.set('window-size', g_window.getUnmaximizedSize()) Settings.set('window-size', g_window.getUnmaximizedSize())
Settings.set('window-pos', g_window.getUnmaximizedPos()) Settings.set('window-pos', g_window.getUnmaximizedPos())
Settings.set('window-maximized', g_window.isMaximized()) Settings.set('window-maximized', g_window.isMaximized())
Client = nil
end end

@ -27,6 +27,7 @@ function ModuleManager.terminate()
moduleManagerButton:destroy() moduleManagerButton:destroy()
moduleManagerButton = nil moduleManagerButton = nil
moduleList = nil moduleList = nil
ModuleManager = nil
end end
function ModuleManager.hide() function ModuleManager.hide()
@ -37,7 +38,6 @@ function ModuleManager.show()
moduleManagerWindow:show() moduleManagerWindow:show()
moduleManagerWindow:focus() moduleManagerWindow:focus()
moduleManagerWindow:raise() moduleManagerWindow:raise()
end end
function ModuleManager.toggle() function ModuleManager.toggle()

@ -34,6 +34,7 @@ function Options.terminate()
optionsWindow = nil optionsWindow = nil
optionsButton:destroy() optionsButton:destroy()
optionsButton = nil optionsButton = nil
Options = nil
end end
function Options.toggle() function Options.toggle()

@ -137,6 +137,7 @@ function Terminal.terminate()
terminalWidget:destroy() terminalWidget:destroy()
terminalWidget = nil terminalWidget = nil
commandEnv = nil commandEnv = nil
Terminal = nil
end end
function Terminal.toggle() function Terminal.toggle()

@ -39,6 +39,8 @@ function TopMenu.terminate()
disconnect(Game, { onLogin = TopMenu.showGameButtons, disconnect(Game, { onLogin = TopMenu.showGameButtons,
onLogout = TopMenu.hideGameButtons }) onLogout = TopMenu.hideGameButtons })
TopMenu = nil
end end
function TopMenu.addButton(id, description, icon, callback, right) function TopMenu.addButton(id, description, icon, callback, right)

@ -1,4 +1,4 @@
function scheduleEvent(func, delay) function scheduleEvent(callback, delay)
local event = g_dispatcher.scheduleEvent(callback, delay) local event = g_dispatcher.scheduleEvent(callback, delay)
-- must hold a reference to the callback, otherwise it would be collected -- must hold a reference to the callback, otherwise it would be collected

@ -1 +1 @@
Color = {} Color = {}

@ -1 +1 @@
Point = {} Point = {}

@ -1 +1 @@
Rect = {} Rect = {}

@ -1 +1 @@
Size = {} Size = {}

@ -2,4 +2,4 @@ Item < UIItem
size: 34 34 size: 34 34
image-source: /core_styles/images/item.png image-source: /core_styles/images/item.png
font: verdana-11px-rounded font: verdana-11px-rounded
border-color: white border-color: white

@ -10,8 +10,7 @@ TopPanel < Panel
image-source: /core_styles/images/top_panel.png image-source: /core_styles/images/top_panel.png
image-repeated: true image-repeated: true
InterfacePanel < Panel InterfacePanel < UIMiniWindowContainer
focusable: false
image-source: /core_styles/images/interface_panel.png image-source: /core_styles/images/interface_panel.png
image-border: 4 image-border: 4

@ -18,7 +18,7 @@ Window < UIWindow
MainWindow < Window MainWindow < Window
anchors.centerIn: parent anchors.centerIn: parent
MiniWindow < UIWindow MiniWindow < UIMiniWindow
font: verdana-11px-antialised font: verdana-11px-antialised
//icon: /core_styles/icons/login.png //icon: /core_styles/icons/login.png
icon-rect: 4 4 16 16 icon-rect: 4 4 16 16

@ -19,12 +19,12 @@ Module
dofile 'uitabbar' dofile 'uitabbar'
dofile 'uipopupmenu' dofile 'uipopupmenu'
dofile 'uiwindow' dofile 'uiwindow'
dofile 'uiminiwindow'
dofile 'uiminiwindowcontainer'
dofile 'uiitem' dofile 'uiitem'
dofile 'uimessagebox' dofile 'uimessagebox'
dofile 'tooltip' dofile 'tooltip'
--dofile 'messagebox/messagebox'
ToolTip.init() ToolTip.init()
onUnload: | onUnload: |

@ -12,7 +12,7 @@ function UIItem:onDragEnter(mousePos)
return true return true
end end
function UIItem:onDragLeave(widget, mousePos) function UIItem:onDragLeave(droppedWidget, mousePos)
if self:isVirtual() then return false end if self:isVirtual() then return false end
if not self.parsed then if not self.parsed then
@ -53,8 +53,9 @@ end
function UIItem:onHoverChange(hovered) function UIItem:onHoverChange(hovered)
if self:isVirtual() then return end if self:isVirtual() then return end
if g_ui.getDraggingWidget() and self ~= g_ui.getDraggingWidget() then local dragginWidget = g_ui.getDraggingWidget()
if hovered then if dragginWidget and self ~= dragginWidget then
if dragginWidget:getClassName() == 'UIItem' and not dragginWidget:isVirtual() and hovered then
self:setBorderWidth(1) self:setBorderWidth(1)
else else
self:setBorderWidth(0) self:setBorderWidth(0)

@ -0,0 +1,30 @@
UIMiniWindow = extends(UIWindow)
function UIMiniWindow.create()
local miniwindow = UIMiniWindow.internalCreate()
return miniwindow
end
function UIMiniWindow:onMousePress(mousePos, mouseButton)
local parent = self:getParent()
if parent:getClassName() ~= 'UIMiniWindowContainer' then
self:raise()
end
end
function UIMiniWindow:onDragEnter(mousePos)
local parent = self:getParent()
if parent:getClassName() == 'UIMiniWindowContainer' then
local containerParent = parent:getParent()
parent:removeChild(self)
containerParent:addChild(self)
end
local oldPos = self:getPosition()
self.movingReference = { x = mousePos.x - oldPos.x, y = mousePos.y - oldPos.y }
self:setPosition(oldPos)
end
function UIMiniWindow:onDragLeave(droppedWidget, mousePos)
-- TODO: drop on other interfaces
end

@ -0,0 +1,12 @@
UIMiniWindowContainer = extends(UIWidget)
function UIMiniWindowContainer.create()
local container = UIMiniWindowContainer.internalCreate()
container:setFocusable(false)
container:setPhantom(true)
return container
end
function UIMiniWindowContainer:getClassName()
return 'UIMiniWindowContainer'
end

@ -3,6 +3,7 @@ UIWindow = extends(UIWidget)
function UIWindow.create() function UIWindow.create()
local window = UIWindow.internalCreate() local window = UIWindow.internalCreate()
window:setTextAlign(AlignTopCenter) window:setTextAlign(AlignTopCenter)
window:setDragable(true)
return window return window
end end
@ -20,6 +21,17 @@ function UIWindow:onMousePress(mousePos, mouseButton)
end end
function UIWindow:onGeometryChange(oldRect, newRect) function UIWindow:onDragEnter(mousePos)
self:breakAnchors()
self.movingReference = { x = mousePos.x - self:getX(), y = mousePos.y - self:getY() }
end
function UIWindow:onDragLeave(droppedWidget, mousePos)
-- TODO: auto detect and reconnect anchors
end
function UIWindow:onDragMove(mousePos, mouseMoved)
local pos = { x = mousePos.x - self.movingReference.x, y = mousePos.y - self.movingReference.y }
self:setPosition(pos)
self:bindRectToParent()
end end

@ -1,6 +0,0 @@
Module
name: game_miniwindow
description: Manage game miniwindow
author: OTClient team
website: https://github.com/edubart/otclient
onLoad:

@ -103,6 +103,8 @@ void Application::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIWidget>("setChecked", &UIWidget::setChecked); g_lua.bindClassMemberFunction<UIWidget>("setChecked", &UIWidget::setChecked);
g_lua.bindClassMemberFunction<UIWidget>("setFocusable", &UIWidget::setFocusable); g_lua.bindClassMemberFunction<UIWidget>("setFocusable", &UIWidget::setFocusable);
g_lua.bindClassMemberFunction<UIWidget>("setPhantom", &UIWidget::setPhantom); g_lua.bindClassMemberFunction<UIWidget>("setPhantom", &UIWidget::setPhantom);
g_lua.bindClassMemberFunction<UIWidget>("setDragging", &UIWidget::setDragging);
g_lua.bindClassMemberFunction<UIWidget>("setDragable", &UIWidget::setDragable);
g_lua.bindClassMemberFunction<UIWidget>("setFixedSize", &UIWidget::setFixedSize); g_lua.bindClassMemberFunction<UIWidget>("setFixedSize", &UIWidget::setFixedSize);
g_lua.bindClassMemberFunction<UIWidget>("setLastFocusReason", &UIWidget::setLastFocusReason); g_lua.bindClassMemberFunction<UIWidget>("setLastFocusReason", &UIWidget::setLastFocusReason);
g_lua.bindClassMemberFunction<UIWidget>("setAutoRepeatDelay", &UIWidget::setAutoRepeatDelay); g_lua.bindClassMemberFunction<UIWidget>("setAutoRepeatDelay", &UIWidget::setAutoRepeatDelay);
@ -120,6 +122,7 @@ void Application::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIWidget>("getChildByIndex", &UIWidget::getChildByIndex); g_lua.bindClassMemberFunction<UIWidget>("getChildByIndex", &UIWidget::getChildByIndex);
g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildById", &UIWidget::recursiveGetChildById); g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildById", &UIWidget::recursiveGetChildById);
g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildByPos", &UIWidget::recursiveGetChildByPos); g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildByPos", &UIWidget::recursiveGetChildByPos);
g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildrenByPos", &UIWidget::recursiveGetChildrenByPos);
g_lua.bindClassMemberFunction<UIWidget>("backwardsGetWidgetById", &UIWidget::backwardsGetWidgetById); g_lua.bindClassMemberFunction<UIWidget>("backwardsGetWidgetById", &UIWidget::backwardsGetWidgetById);
g_lua.bindClassMemberFunction<UIWidget>("asUIWidget", &UIWidget::asUIWidget); g_lua.bindClassMemberFunction<UIWidget>("asUIWidget", &UIWidget::asUIWidget);
g_lua.bindClassMemberFunction<UIWidget>("resize", &UIWidget::resize); g_lua.bindClassMemberFunction<UIWidget>("resize", &UIWidget::resize);
@ -145,6 +148,8 @@ void Application::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIWidget>("isExplicitlyVisible", &UIWidget::isExplicitlyVisible); g_lua.bindClassMemberFunction<UIWidget>("isExplicitlyVisible", &UIWidget::isExplicitlyVisible);
g_lua.bindClassMemberFunction<UIWidget>("isFocusable", &UIWidget::isFocusable); g_lua.bindClassMemberFunction<UIWidget>("isFocusable", &UIWidget::isFocusable);
g_lua.bindClassMemberFunction<UIWidget>("isPhantom", &UIWidget::isPhantom); g_lua.bindClassMemberFunction<UIWidget>("isPhantom", &UIWidget::isPhantom);
g_lua.bindClassMemberFunction<UIWidget>("isDragable", &UIWidget::isDragable);
g_lua.bindClassMemberFunction<UIWidget>("isDragging", &UIWidget::isDragging);
g_lua.bindClassMemberFunction<UIWidget>("isFixedSize", &UIWidget::isFixedSize); g_lua.bindClassMemberFunction<UIWidget>("isFixedSize", &UIWidget::isFixedSize);
g_lua.bindClassMemberFunction<UIWidget>("isDestroyed", &UIWidget::isDestroyed); g_lua.bindClassMemberFunction<UIWidget>("isDestroyed", &UIWidget::isDestroyed);
g_lua.bindClassMemberFunction<UIWidget>("hasChildren", &UIWidget::hasChildren); g_lua.bindClassMemberFunction<UIWidget>("hasChildren", &UIWidget::hasChildren);
@ -186,7 +191,15 @@ void Application::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIWidget>("setIconSize", &UIWidget::setIconSize); g_lua.bindClassMemberFunction<UIWidget>("setIconSize", &UIWidget::setIconSize);
g_lua.bindClassMemberFunction<UIWidget>("setIconRect", &UIWidget::setIconRect); g_lua.bindClassMemberFunction<UIWidget>("setIconRect", &UIWidget::setIconRect);
g_lua.bindClassMemberFunction<UIWidget>("setBorderWidth", &UIWidget::setBorderWidth); g_lua.bindClassMemberFunction<UIWidget>("setBorderWidth", &UIWidget::setBorderWidth);
g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthTop", &UIWidget::setBorderWidthTop);
g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthRight", &UIWidget::setBorderWidthRight);
g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthBottom", &UIWidget::setBorderWidthBottom);
g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthLeft", &UIWidget::setBorderWidthLeft);
g_lua.bindClassMemberFunction<UIWidget>("setBorderColor", &UIWidget::setBorderColor); g_lua.bindClassMemberFunction<UIWidget>("setBorderColor", &UIWidget::setBorderColor);
g_lua.bindClassMemberFunction<UIWidget>("setBorderColorTop", &UIWidget::setBorderColorTop);
g_lua.bindClassMemberFunction<UIWidget>("setBorderColorRight", &UIWidget::setBorderColorRight);
g_lua.bindClassMemberFunction<UIWidget>("setBorderColorBottom", &UIWidget::setBorderColorBottom);
g_lua.bindClassMemberFunction<UIWidget>("setBorderColorLeft", &UIWidget::setBorderColorLeft);
g_lua.bindClassMemberFunction<UIWidget>("setMargin", &UIWidget::setMargin); g_lua.bindClassMemberFunction<UIWidget>("setMargin", &UIWidget::setMargin);
g_lua.bindClassMemberFunction<UIWidget>("setMarginHorizontal", &UIWidget::setMarginHorizontal); g_lua.bindClassMemberFunction<UIWidget>("setMarginHorizontal", &UIWidget::setMarginHorizontal);
g_lua.bindClassMemberFunction<UIWidget>("setMarginVertical", &UIWidget::setMarginVertical); g_lua.bindClassMemberFunction<UIWidget>("setMarginVertical", &UIWidget::setMarginVertical);

@ -50,6 +50,12 @@ void LuaInterface::init()
registerClass<LuaObject>(); registerClass<LuaObject>();
bindClassMemberFunction<LuaObject>("getUseCount", &LuaObject::getUseCount); bindClassMemberFunction<LuaObject>("getUseCount", &LuaObject::getUseCount);
bindClassMemberFunction<LuaObject>("getClassName", &LuaObject::getClassName); bindClassMemberFunction<LuaObject>("getClassName", &LuaObject::getClassName);
registerClassMemberFunction<LuaObject>("getFieldsTable", (LuaCppFunction) ([](LuaInterface* lua) {
LuaObjectPtr obj = g_lua.popObject();
obj->luaGetFieldsTable();
return 1;
}));
} }
void LuaInterface::terminate() void LuaInterface::terminate()

@ -65,6 +65,14 @@ void LuaObject::luaGetField(const std::string& key)
} }
} }
void LuaObject::luaGetFieldsTable()
{
if(m_fieldsTableRef != -1)
g_lua.getRef(m_fieldsTableRef);
else
g_lua.pushNil();
}
int LuaObject::getUseCount() int LuaObject::getUseCount()
{ {
return shared_from_this().use_count() - 1; return shared_from_this().use_count() - 1;

@ -57,6 +57,9 @@ public:
/// Gets a field from this lua object, the result is pushed onto the stack /// Gets a field from this lua object, the result is pushed onto the stack
void luaGetField(const std::string& key); void luaGetField(const std::string& key);
/// Gets the table containing all stored fields of this lua object, the result is pushed onto the stack
void luaGetFieldsTable();
/// Returns the number of references of this object /// Returns the number of references of this object
/// @note each userdata of this object on lua counts as a reference /// @note each userdata of this object on lua counts as a reference
int getUseCount(); int getUseCount();

@ -79,6 +79,22 @@ void UIManager::inputEvent(const InputEvent& event)
break; break;
case Fw::MouseReleaseInputEvent: case Fw::MouseReleaseInputEvent:
m_mouseReceiver->propagateOnMouseRelease(event.mousePos, event.mouseButton); m_mouseReceiver->propagateOnMouseRelease(event.mousePos, event.mouseButton);
if(m_draggingWidget && event.mouseButton == Fw::MouseLeftButton) {
auto clickedChildren = m_rootWidget->recursiveGetChildrenByPos(event.mousePos);
UIWidgetPtr droppedWidget;
for(const UIWidgetPtr& child : clickedChildren) {
if(child != m_draggingWidget) {
droppedWidget = child;
break;
}
}
if(droppedWidget)
droppedWidget->onDrop(m_draggingWidget, event.mousePos);
m_draggingWidget->onDragLeave(droppedWidget, event.mousePos);
m_draggingWidget->setDragging(false);
m_draggingWidget = nullptr;
}
break; break;
case Fw::MouseMoveInputEvent: case Fw::MouseMoveInputEvent:
m_mouseReceiver->updateState(Fw::HoverState); m_mouseReceiver->updateState(Fw::HoverState);

@ -743,12 +743,6 @@ void UIWidget::setPhantom(bool phantom)
void UIWidget::setDragging(bool dragging) void UIWidget::setDragging(bool dragging)
{ {
if(dragging) {
g_ui.setDraggingWidget(asUIWidget());
} else {
if(g_ui.getDraggingWidget() == asUIWidget())
g_ui.setDraggingWidget(nullptr);
}
m_dragging = dragging; m_dragging = dragging;
} }
@ -898,6 +892,22 @@ UIWidgetPtr UIWidget::recursiveGetChildByPos(const Point& childPos)
return nullptr; return nullptr;
} }
UIWidgetList UIWidget::recursiveGetChildrenByPos(const Point& childPos)
{
UIWidgetList children;
for(auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
const UIWidgetPtr& child = (*it);
if(child->isExplicitlyVisible() && child->containsPoint(childPos)) {
UIWidgetList subChildren = child->recursiveGetChildrenByPos(childPos);
if(!subChildren.empty())
children.insert(children.end(), subChildren.begin(), subChildren.end());
else if(!child->isPhantom())
children.push_back(child);
}
}
return children;
}
UIWidgetPtr UIWidget::backwardsGetWidgetById(const std::string& id) UIWidgetPtr UIWidget::backwardsGetWidgetById(const std::string& id)
{ {
UIWidgetPtr widget = getChildById(id); UIWidgetPtr widget = getChildById(id);
@ -1141,6 +1151,11 @@ void UIWidget::onDragLeave(UIWidgetPtr droppedWidget, const Point& mousePos)
callLuaField("onDragLeave", droppedWidget, mousePos); callLuaField("onDragLeave", droppedWidget, mousePos);
} }
bool UIWidget::onDragMove(const Point& mousePos, const Point& mouseMoved)
{
return callLuaField("onDragMove", mousePos, mouseMoved);
}
void UIWidget::onDrop(UIWidgetPtr draggedWidget, const Point& mousePos) void UIWidget::onDrop(UIWidgetPtr draggedWidget, const Point& mousePos)
{ {
callLuaField("onDrop", draggedWidget, mousePos); callLuaField("onDrop", draggedWidget, mousePos);
@ -1184,13 +1199,6 @@ bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
if(isPressed() && getRect().contains(mousePos)) if(isPressed() && getRect().contains(mousePos))
onClick(mousePos); onClick(mousePos);
UIWidgetPtr draggedWidget = g_ui.getDraggingWidget();
if(draggedWidget && button == Fw::MouseLeftButton && (containsPoint(mousePos) || asUIWidget() == g_ui.getRootWidget())) {
onDrop(draggedWidget, mousePos);
draggedWidget->onDragLeave(asUIWidget(), mousePos);
draggedWidget->setDragging(false);
}
return callLuaField<bool>("onMouseRelease", mousePos, button); return callLuaField<bool>("onMouseRelease", mousePos, button);
} }
@ -1202,6 +1210,11 @@ bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved)
onDragEnter(mousePos - mouseMoved); onDragEnter(mousePos - mouseMoved);
} }
if(m_dragging) {
if(onDragMove(mousePos, mouseMoved))
return true;
}
return callLuaField<bool>("onMouseMove", mousePos, mouseMoved); return callLuaField<bool>("onMouseMove", mousePos, mouseMoved);
} }
@ -1354,7 +1367,7 @@ bool UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton bu
UIWidgetList children; UIWidgetList children;
for(const UIWidgetPtr& child : m_children) { for(const UIWidgetPtr& child : m_children) {
// events on hidden or disabled widgets are discarded // events on hidden or disabled widgets are discarded
if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) if((!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) && (!child->isPressed() && button == Fw::MouseLeftButton))
continue; continue;
// mouse release events go to all children // mouse release events go to all children

@ -140,6 +140,7 @@ public:
UIWidgetPtr getChildByIndex(int index); UIWidgetPtr getChildByIndex(int index);
UIWidgetPtr recursiveGetChildById(const std::string& id); UIWidgetPtr recursiveGetChildById(const std::string& id);
UIWidgetPtr recursiveGetChildByPos(const Point& childPos); UIWidgetPtr recursiveGetChildByPos(const Point& childPos);
UIWidgetList recursiveGetChildrenByPos(const Point& childPos);
UIWidgetPtr backwardsGetWidgetById(const std::string& id); UIWidgetPtr backwardsGetWidgetById(const std::string& id);
UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); } UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); }
@ -175,6 +176,7 @@ protected:
virtual void onHoverChange(bool hovered); virtual void onHoverChange(bool hovered);
virtual void onDragEnter(const Point& mousePos); virtual void onDragEnter(const Point& mousePos);
virtual void onDragLeave(UIWidgetPtr droppedWidget, const Point& mousePos); virtual void onDragLeave(UIWidgetPtr droppedWidget, const Point& mousePos);
virtual bool onDragMove(const Point& mousePos, const Point& mouseMoved);
virtual void onDrop(UIWidgetPtr draggedWidget, const Point& mousePos); virtual void onDrop(UIWidgetPtr draggedWidget, const Point& mousePos);
virtual bool onKeyText(const std::string& keyText); virtual bool onKeyText(const std::string& keyText);
virtual bool onKeyDown(uchar keyCode, int keyboardModifiers); virtual bool onKeyDown(uchar keyCode, int keyboardModifiers);

@ -229,14 +229,16 @@ void OTClient::registerLuaFunctions()
g_lua.bindClassStaticFunction<UIItem>("create", []{ return UIItemPtr(new UIItem); }); g_lua.bindClassStaticFunction<UIItem>("create", []{ return UIItemPtr(new UIItem); });
g_lua.bindClassMemberFunction<UIItem>("setItemId", &UIItem::setItemId); g_lua.bindClassMemberFunction<UIItem>("setItemId", &UIItem::setItemId);
g_lua.bindClassMemberFunction<UIItem>("setItemCount", &UIItem::setItemCount); g_lua.bindClassMemberFunction<UIItem>("setItemCount", &UIItem::setItemCount);
g_lua.bindClassMemberFunction<UIItem>("setItemSubType", &UIItem::setItemSubType);
g_lua.bindClassMemberFunction<UIItem>("setItem", &UIItem::setItem); g_lua.bindClassMemberFunction<UIItem>("setItem", &UIItem::setItem);
g_lua.bindClassMemberFunction<UIItem>("setVirtual", &UIItem::setVirtual); g_lua.bindClassMemberFunction<UIItem>("setVirtual", &UIItem::setVirtual);
g_lua.bindClassMemberFunction<UIItem>("clearItem", &UIItem::clearItem);
g_lua.bindClassMemberFunction<UIItem>("getItemId", &UIItem::getItemId); g_lua.bindClassMemberFunction<UIItem>("getItemId", &UIItem::getItemId);
g_lua.bindClassMemberFunction<UIItem>("getItemCount", &UIItem::getItemCount); g_lua.bindClassMemberFunction<UIItem>("getItemCount", &UIItem::getItemCount);
g_lua.bindClassMemberFunction<UIItem>("getItemSubType", &UIItem::getItemSubType);
g_lua.bindClassMemberFunction<UIItem>("getItem", &UIItem::getItem); g_lua.bindClassMemberFunction<UIItem>("getItem", &UIItem::getItem);
g_lua.bindClassMemberFunction<UIItem>("isVirtual", &UIItem::isVirtual); g_lua.bindClassMemberFunction<UIItem>("isVirtual", &UIItem::isVirtual);
g_lua.registerClass<UICreature, UIWidget>(); g_lua.registerClass<UICreature, UIWidget>();
g_lua.bindClassStaticFunction<UICreature>("create", []{ return UICreaturePtr(new UICreature); } ); g_lua.bindClassStaticFunction<UICreature>("create", []{ return UICreaturePtr(new UICreature); } );
g_lua.bindClassMemberFunction<UICreature>("getCreature", &UICreature::getCreature); g_lua.bindClassMemberFunction<UICreature>("getCreature", &UICreature::getCreature);

@ -44,6 +44,7 @@ void OTClient::init(const std::vector<std::string>& args)
// client modules 100-499 // client modules 100-499
g_modules.autoLoadModules(499); g_modules.autoLoadModules(499);
g_modules.ensureModuleLoaded("client_main"); g_modules.ensureModuleLoaded("client_main");
g_modules.ensureModuleLoaded("client_tibiafiles");
// game modules 500-999 // game modules 500-999
g_modules.autoLoadModules(999); g_modules.autoLoadModules(999);
g_modules.ensureModuleLoaded("game"); g_modules.ensureModuleLoaded("game");

@ -54,7 +54,7 @@ void UIItem::draw()
void UIItem::setItemId(int id) void UIItem::setItemId(int id)
{ {
if(!m_item) if(!m_item && id != 0)
m_item = Item::create(id); m_item = Item::create(id);
else { else {
// remove item // remove item

Loading…
Cancel
Save