mirror of
https://github.com/edubart/otclient.git
synced 2025-10-14 19:44:54 +02:00
some window moving
This commit is contained in:
@@ -103,6 +103,8 @@ void Application::registerLuaFunctions()
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setChecked", &UIWidget::setChecked);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setFocusable", &UIWidget::setFocusable);
|
||||
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>("setLastFocusReason", &UIWidget::setLastFocusReason);
|
||||
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>("recursiveGetChildById", &UIWidget::recursiveGetChildById);
|
||||
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>("asUIWidget", &UIWidget::asUIWidget);
|
||||
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>("isFocusable", &UIWidget::isFocusable);
|
||||
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>("isDestroyed", &UIWidget::isDestroyed);
|
||||
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>("setIconRect", &UIWidget::setIconRect);
|
||||
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>("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>("setMarginHorizontal", &UIWidget::setMarginHorizontal);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setMarginVertical", &UIWidget::setMarginVertical);
|
||||
|
@@ -50,6 +50,12 @@ void LuaInterface::init()
|
||||
registerClass<LuaObject>();
|
||||
bindClassMemberFunction<LuaObject>("getUseCount", &LuaObject::getUseCount);
|
||||
bindClassMemberFunction<LuaObject>("getClassName", &LuaObject::getClassName);
|
||||
|
||||
registerClassMemberFunction<LuaObject>("getFieldsTable", (LuaCppFunction) ([](LuaInterface* lua) {
|
||||
LuaObjectPtr obj = g_lua.popObject();
|
||||
obj->luaGetFieldsTable();
|
||||
return 1;
|
||||
}));
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
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
|
||||
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
|
||||
/// @note each userdata of this object on lua counts as a reference
|
||||
int getUseCount();
|
||||
|
@@ -79,6 +79,22 @@ void UIManager::inputEvent(const InputEvent& event)
|
||||
break;
|
||||
case Fw::MouseReleaseInputEvent:
|
||||
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;
|
||||
case Fw::MouseMoveInputEvent:
|
||||
m_mouseReceiver->updateState(Fw::HoverState);
|
||||
|
@@ -743,12 +743,6 @@ void UIWidget::setPhantom(bool phantom)
|
||||
|
||||
void UIWidget::setDragging(bool dragging)
|
||||
{
|
||||
if(dragging) {
|
||||
g_ui.setDraggingWidget(asUIWidget());
|
||||
} else {
|
||||
if(g_ui.getDraggingWidget() == asUIWidget())
|
||||
g_ui.setDraggingWidget(nullptr);
|
||||
}
|
||||
m_dragging = dragging;
|
||||
}
|
||||
|
||||
@@ -898,6 +892,22 @@ UIWidgetPtr UIWidget::recursiveGetChildByPos(const Point& childPos)
|
||||
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 widget = getChildById(id);
|
||||
@@ -1141,6 +1151,11 @@ void UIWidget::onDragLeave(UIWidgetPtr droppedWidget, const Point& 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)
|
||||
{
|
||||
callLuaField("onDrop", draggedWidget, mousePos);
|
||||
@@ -1184,13 +1199,6 @@ bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
|
||||
if(isPressed() && getRect().contains(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);
|
||||
}
|
||||
|
||||
@@ -1202,6 +1210,11 @@ bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved)
|
||||
onDragEnter(mousePos - mouseMoved);
|
||||
}
|
||||
|
||||
if(m_dragging) {
|
||||
if(onDragMove(mousePos, mouseMoved))
|
||||
return true;
|
||||
}
|
||||
|
||||
return callLuaField<bool>("onMouseMove", mousePos, mouseMoved);
|
||||
}
|
||||
|
||||
@@ -1354,7 +1367,7 @@ bool UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton bu
|
||||
UIWidgetList children;
|
||||
for(const UIWidgetPtr& child : m_children) {
|
||||
// events on hidden or disabled widgets are discarded
|
||||
if(!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
|
||||
if((!child->isExplicitlyEnabled() || !child->isExplicitlyVisible()) && (!child->isPressed() && button == Fw::MouseLeftButton))
|
||||
continue;
|
||||
|
||||
// mouse release events go to all children
|
||||
|
@@ -140,6 +140,7 @@ public:
|
||||
UIWidgetPtr getChildByIndex(int index);
|
||||
UIWidgetPtr recursiveGetChildById(const std::string& id);
|
||||
UIWidgetPtr recursiveGetChildByPos(const Point& childPos);
|
||||
UIWidgetList recursiveGetChildrenByPos(const Point& childPos);
|
||||
UIWidgetPtr backwardsGetWidgetById(const std::string& id);
|
||||
|
||||
UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); }
|
||||
@@ -175,6 +176,7 @@ protected:
|
||||
virtual void onHoverChange(bool hovered);
|
||||
virtual void onDragEnter(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 bool onKeyText(const std::string& keyText);
|
||||
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.bindClassMemberFunction<UIItem>("setItemId", &UIItem::setItemId);
|
||||
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>("setVirtual", &UIItem::setVirtual);
|
||||
g_lua.bindClassMemberFunction<UIItem>("clearItem", &UIItem::clearItem);
|
||||
g_lua.bindClassMemberFunction<UIItem>("getItemId", &UIItem::getItemId);
|
||||
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>("isVirtual", &UIItem::isVirtual);
|
||||
|
||||
|
||||
g_lua.registerClass<UICreature, UIWidget>();
|
||||
g_lua.bindClassStaticFunction<UICreature>("create", []{ return UICreaturePtr(new UICreature); } );
|
||||
g_lua.bindClassMemberFunction<UICreature>("getCreature", &UICreature::getCreature);
|
||||
|
@@ -44,6 +44,7 @@ void OTClient::init(const std::vector<std::string>& args)
|
||||
// client modules 100-499
|
||||
g_modules.autoLoadModules(499);
|
||||
g_modules.ensureModuleLoaded("client_main");
|
||||
g_modules.ensureModuleLoaded("client_tibiafiles");
|
||||
// game modules 500-999
|
||||
g_modules.autoLoadModules(999);
|
||||
g_modules.ensureModuleLoaded("game");
|
||||
|
@@ -54,7 +54,7 @@ void UIItem::draw()
|
||||
|
||||
void UIItem::setItemId(int id)
|
||||
{
|
||||
if(!m_item)
|
||||
if(!m_item && id != 0)
|
||||
m_item = Item::create(id);
|
||||
else {
|
||||
// remove item
|
||||
|
Reference in New Issue
Block a user