mirror of
https://github.com/edubart/otclient.git
synced 2025-04-30 01:29:21 +02:00

Change type of checking whether window have on drop possibility. Reason: Previously this parameter was checking by class name, so it blocking creating similar objects to miniwindow or inheritance from miniwindow object without changing sources. So it block creating modules with new UI objects working with miniwindowcontainer.
387 lines
10 KiB
Lua
387 lines
10 KiB
Lua
-- @docclass
|
|
UIMiniWindow = extends(UIWindow, "UIMiniWindow")
|
|
|
|
function UIMiniWindow.create()
|
|
local miniwindow = UIMiniWindow.internalCreate()
|
|
miniwindow.UIMiniWindowContainer = true
|
|
return miniwindow
|
|
end
|
|
|
|
function UIMiniWindow:open(dontSave)
|
|
self:setVisible(true)
|
|
|
|
if not dontSave then
|
|
self:setSettings({closed = false})
|
|
end
|
|
|
|
signalcall(self.onOpen, self)
|
|
end
|
|
|
|
function UIMiniWindow:close(dontSave)
|
|
if not self:isExplicitlyVisible() then return end
|
|
self:setVisible(false)
|
|
|
|
if not dontSave then
|
|
self:setSettings({closed = true})
|
|
end
|
|
|
|
signalcall(self.onClose, self)
|
|
end
|
|
|
|
function UIMiniWindow:minimize(dontSave)
|
|
self:setOn(true)
|
|
self:getChildById('contentsPanel'):hide()
|
|
self:getChildById('miniwindowScrollBar'):hide()
|
|
self:getChildById('bottomResizeBorder'):hide()
|
|
self:getChildById('minimizeButton'):setOn(true)
|
|
self.maximizedHeight = self:getHeight()
|
|
self:setHeight(self.minimizedHeight)
|
|
|
|
if not dontSave then
|
|
self:setSettings({minimized = true})
|
|
end
|
|
|
|
signalcall(self.onMinimize, self)
|
|
end
|
|
|
|
function UIMiniWindow:maximize(dontSave)
|
|
self:setOn(false)
|
|
self:getChildById('contentsPanel'):show()
|
|
self:getChildById('miniwindowScrollBar'):show()
|
|
self:getChildById('bottomResizeBorder'):show()
|
|
self:getChildById('minimizeButton'):setOn(false)
|
|
self:setHeight(self:getSettings('height') or self.maximizedHeight)
|
|
|
|
if not dontSave then
|
|
self:setSettings({minimized = false})
|
|
end
|
|
|
|
local parent = self:getParent()
|
|
if parent and parent:getClassName() == 'UIMiniWindowContainer' then
|
|
parent:fitAll(self)
|
|
end
|
|
|
|
signalcall(self.onMaximize, self)
|
|
end
|
|
|
|
function UIMiniWindow:setup()
|
|
self:getChildById('closeButton').onClick =
|
|
function()
|
|
self:close()
|
|
end
|
|
|
|
self:getChildById('minimizeButton').onClick =
|
|
function()
|
|
if self:isOn() then
|
|
self:maximize()
|
|
else
|
|
self:minimize()
|
|
end
|
|
end
|
|
|
|
self:getChildById('miniwindowTopBar').onDoubleClick =
|
|
function()
|
|
if self:isOn() then
|
|
self:maximize()
|
|
else
|
|
self:minimize()
|
|
end
|
|
end
|
|
|
|
local oldParent = self:getParent()
|
|
|
|
local settings = g_settings.getNode('MiniWindows')
|
|
if settings then
|
|
local selfSettings = settings[self:getId()]
|
|
if selfSettings then
|
|
if selfSettings.parentId then
|
|
local parent = rootWidget:recursiveGetChildById(selfSettings.parentId)
|
|
if parent then
|
|
if parent:getClassName() == 'UIMiniWindowContainer' and selfSettings.index and parent:isOn() then
|
|
self.miniIndex = selfSettings.index
|
|
parent:scheduleInsert(self, selfSettings.index)
|
|
elseif selfSettings.position then
|
|
self:setParent(parent, true)
|
|
self:setPosition(topoint(selfSettings.position))
|
|
end
|
|
end
|
|
end
|
|
|
|
if selfSettings.minimized then
|
|
self:minimize(true)
|
|
else
|
|
if selfSettings.height and self:isResizeable() then
|
|
self:setHeight(selfSettings.height)
|
|
elseif selfSettings.height and not self:isResizeable() then
|
|
self:eraseSettings({height = true})
|
|
end
|
|
end
|
|
|
|
if selfSettings.closed then
|
|
self:close(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
local newParent = self:getParent()
|
|
|
|
self.miniLoaded = true
|
|
|
|
if self.save then
|
|
if oldParent and oldParent:getClassName() == 'UIMiniWindowContainer' then
|
|
addEvent(function() oldParent:order() end)
|
|
end
|
|
if newParent and newParent:getClassName() == 'UIMiniWindowContainer' and newParent ~= oldParent then
|
|
addEvent(function() newParent:order() end)
|
|
end
|
|
end
|
|
|
|
self:fitOnParent()
|
|
end
|
|
|
|
function UIMiniWindow:onVisibilityChange(visible)
|
|
self:fitOnParent()
|
|
end
|
|
|
|
function UIMiniWindow:onDragEnter(mousePos)
|
|
local parent = self:getParent()
|
|
if not parent then return false end
|
|
|
|
if parent:getClassName() == 'UIMiniWindowContainer' then
|
|
local containerParent = parent:getParent()
|
|
parent:removeChild(self)
|
|
containerParent:addChild(self)
|
|
parent:saveChildren()
|
|
end
|
|
|
|
local oldPos = self:getPosition()
|
|
self.movingReference = { x = mousePos.x - oldPos.x, y = mousePos.y - oldPos.y }
|
|
self:setPosition(oldPos)
|
|
self.free = true
|
|
return true
|
|
end
|
|
|
|
function UIMiniWindow:onDragLeave(droppedWidget, mousePos)
|
|
if self.movedWidget then
|
|
self.setMovedChildMargin(self.movedOldMargin or 0)
|
|
self.movedWidget = nil
|
|
self.setMovedChildMargin = nil
|
|
self.movedOldMargin = nil
|
|
self.movedIndex = nil
|
|
end
|
|
|
|
self:saveParent(self:getParent())
|
|
end
|
|
|
|
function UIMiniWindow:onDragMove(mousePos, mouseMoved)
|
|
local oldMousePosY = mousePos.y - mouseMoved.y
|
|
local children = rootWidget:recursiveGetChildrenByMarginPos(mousePos)
|
|
local overAnyWidget = false
|
|
for i=1,#children do
|
|
local child = children[i]
|
|
if child:getParent():getClassName() == 'UIMiniWindowContainer' then
|
|
overAnyWidget = true
|
|
|
|
local childCenterY = child:getY() + child:getHeight() / 2
|
|
if child == self.movedWidget and mousePos.y < childCenterY and oldMousePosY < childCenterY then
|
|
break
|
|
end
|
|
|
|
if self.movedWidget then
|
|
self.setMovedChildMargin(self.movedOldMargin or 0)
|
|
self.setMovedChildMargin = nil
|
|
end
|
|
|
|
if mousePos.y < childCenterY then
|
|
self.movedOldMargin = child:getMarginTop()
|
|
self.setMovedChildMargin = function(v) child:setMarginTop(v) end
|
|
self.movedIndex = 0
|
|
else
|
|
self.movedOldMargin = child:getMarginBottom()
|
|
self.setMovedChildMargin = function(v) child:setMarginBottom(v) end
|
|
self.movedIndex = 1
|
|
end
|
|
|
|
self.movedWidget = child
|
|
self.setMovedChildMargin(self:getHeight())
|
|
break
|
|
end
|
|
end
|
|
|
|
if not overAnyWidget and self.movedWidget then
|
|
self.setMovedChildMargin(self.movedOldMargin or 0)
|
|
self.movedWidget = nil
|
|
end
|
|
|
|
return UIWindow.onDragMove(self, mousePos, mouseMoved)
|
|
end
|
|
|
|
function UIMiniWindow:onMousePress()
|
|
local parent = self:getParent()
|
|
if not parent then return false end
|
|
if parent:getClassName() ~= 'UIMiniWindowContainer' then
|
|
self:raise()
|
|
return true
|
|
end
|
|
end
|
|
|
|
function UIMiniWindow:onFocusChange(focused)
|
|
if not focused then return end
|
|
local parent = self:getParent()
|
|
if parent and parent:getClassName() ~= 'UIMiniWindowContainer' then
|
|
self:raise()
|
|
end
|
|
end
|
|
|
|
function UIMiniWindow:onHeightChange(height)
|
|
if not self:isOn() then
|
|
self:setSettings({height = height})
|
|
end
|
|
self:fitOnParent()
|
|
end
|
|
|
|
function UIMiniWindow:getSettings(name)
|
|
if not self.save then return nil end
|
|
local settings = g_settings.getNode('MiniWindows')
|
|
if settings then
|
|
local selfSettings = settings[self:getId()]
|
|
if selfSettings then
|
|
return selfSettings[name]
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function UIMiniWindow:setSettings(data)
|
|
if not self.save then return end
|
|
|
|
local settings = g_settings.getNode('MiniWindows')
|
|
if not settings then
|
|
settings = {}
|
|
end
|
|
|
|
local id = self:getId()
|
|
if not settings[id] then
|
|
settings[id] = {}
|
|
end
|
|
|
|
for key,value in pairs(data) do
|
|
settings[id][key] = value
|
|
end
|
|
|
|
g_settings.setNode('MiniWindows', settings)
|
|
end
|
|
|
|
function UIMiniWindow:eraseSettings(data)
|
|
if not self.save then return end
|
|
|
|
local settings = g_settings.getNode('MiniWindows')
|
|
if not settings then
|
|
settings = {}
|
|
end
|
|
|
|
local id = self:getId()
|
|
if not settings[id] then
|
|
settings[id] = {}
|
|
end
|
|
|
|
for key,value in pairs(data) do
|
|
settings[id][key] = nil
|
|
end
|
|
|
|
g_settings.setNode('MiniWindows', settings)
|
|
end
|
|
|
|
function UIMiniWindow:saveParent(parent)
|
|
local parent = self:getParent()
|
|
if parent then
|
|
if parent:getClassName() == 'UIMiniWindowContainer' then
|
|
parent:saveChildren()
|
|
else
|
|
self:saveParentPosition(parent:getId(), self:getPosition())
|
|
end
|
|
end
|
|
end
|
|
|
|
function UIMiniWindow:saveParentPosition(parentId, position)
|
|
local selfSettings = {}
|
|
selfSettings.parentId = parentId
|
|
selfSettings.position = pointtostring(position)
|
|
self:setSettings(selfSettings)
|
|
end
|
|
|
|
function UIMiniWindow:saveParentIndex(parentId, index)
|
|
local selfSettings = {}
|
|
selfSettings.parentId = parentId
|
|
selfSettings.index = index
|
|
self:setSettings(selfSettings)
|
|
self.miniIndex = index
|
|
end
|
|
|
|
function UIMiniWindow:disableResize()
|
|
self:getChildById('bottomResizeBorder'):disable()
|
|
end
|
|
|
|
function UIMiniWindow:enableResize()
|
|
self:getChildById('bottomResizeBorder'):enable()
|
|
end
|
|
|
|
function UIMiniWindow:fitOnParent()
|
|
local parent = self:getParent()
|
|
if self:isVisible() and parent and parent:getClassName() == 'UIMiniWindowContainer' then
|
|
parent:fitAll(self)
|
|
end
|
|
end
|
|
|
|
function UIMiniWindow:setParent(parent, dontsave)
|
|
UIWidget.setParent(self, parent)
|
|
if not dontsave then
|
|
self:saveParent(parent)
|
|
end
|
|
self:fitOnParent()
|
|
end
|
|
|
|
function UIMiniWindow:setHeight(height)
|
|
UIWidget.setHeight(self, height)
|
|
signalcall(self.onHeightChange, self, height)
|
|
end
|
|
|
|
function UIMiniWindow:setContentHeight(height)
|
|
local contentsPanel = self:getChildById('contentsPanel')
|
|
local minHeight = contentsPanel:getMarginTop() + contentsPanel:getMarginBottom() + contentsPanel:getPaddingTop() + contentsPanel:getPaddingBottom()
|
|
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
resizeBorder:setParentSize(minHeight + height)
|
|
end
|
|
|
|
function UIMiniWindow:setContentMinimumHeight(height)
|
|
local contentsPanel = self:getChildById('contentsPanel')
|
|
local minHeight = contentsPanel:getMarginTop() + contentsPanel:getMarginBottom() + contentsPanel:getPaddingTop() + contentsPanel:getPaddingBottom()
|
|
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
resizeBorder:setMinimum(minHeight + height)
|
|
end
|
|
|
|
function UIMiniWindow:setContentMaximumHeight(height)
|
|
local contentsPanel = self:getChildById('contentsPanel')
|
|
local minHeight = contentsPanel:getMarginTop() + contentsPanel:getMarginBottom() + contentsPanel:getPaddingTop() + contentsPanel:getPaddingBottom()
|
|
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
resizeBorder:setMaximum(minHeight + height)
|
|
end
|
|
|
|
function UIMiniWindow:getMinimumHeight()
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
return resizeBorder:getMinimum()
|
|
end
|
|
|
|
function UIMiniWindow:getMaximumHeight()
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
return resizeBorder:getMaximum()
|
|
end
|
|
|
|
function UIMiniWindow:isResizeable()
|
|
local resizeBorder = self:getChildById('bottomResizeBorder')
|
|
return resizeBorder:isExplicitlyVisible() and resizeBorder:isEnabled()
|
|
end
|