some window moving

This commit is contained in:
Eduardo Bart 2012-02-06 22:41:53 -02:00
parent 08a88e3842
commit 46df3c7dbe
43 changed files with 165 additions and 51 deletions

4
TODO
View File

@ -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

View File

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

View File

@ -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()

View File

@ -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

View File

@ -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()

View File

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

View File

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

View File

@ -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)

View File

@ -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

View File

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

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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: |

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

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

View File

@ -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);

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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");

View File

@ -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