mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-10-15 06:54:54 +02:00
Resolve "Merge the best from 7.40 branch"
This commit is contained in:
516
SabrehavenOTClient/modules/corelib/ui/uiminiwindow.lua
Normal file
516
SabrehavenOTClient/modules/corelib/ui/uiminiwindow.lua
Normal file
@@ -0,0 +1,516 @@
|
||||
-- @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
|
||||
if self.forceOpen 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()
|
||||
if self.minimizeButton then
|
||||
self.minimizeButton:setOn(true)
|
||||
end
|
||||
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()
|
||||
if self.minimizeButton then
|
||||
self.minimizeButton:setOn(false)
|
||||
end
|
||||
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:lock(dontSave)
|
||||
local lockButton = self:getChildById('lockButton')
|
||||
if lockButton then
|
||||
lockButton:setOn(true)
|
||||
end
|
||||
self:setDraggable(false)
|
||||
if not dontsave then
|
||||
self:setSettings({locked = true})
|
||||
end
|
||||
|
||||
signalcall(self.onLockChange, self)
|
||||
end
|
||||
|
||||
function UIMiniWindow:unlock(dontSave)
|
||||
local lockButton = self:getChildById('lockButton')
|
||||
if lockButton then
|
||||
lockButton:setOn(false)
|
||||
end
|
||||
self:setDraggable(true)
|
||||
if not dontsave then
|
||||
self:setSettings({locked = false})
|
||||
end
|
||||
signalcall(self.onLockChange, self)
|
||||
end
|
||||
|
||||
function UIMiniWindow:setup()
|
||||
self:getChildById('closeButton').onClick =
|
||||
function()
|
||||
self:close()
|
||||
end
|
||||
if self.forceOpen then
|
||||
if self.closeButton then
|
||||
self.closeButton:hide()
|
||||
end
|
||||
end
|
||||
|
||||
if(self.minimizeButton) then
|
||||
self.minimizeButton.onClick =
|
||||
function()
|
||||
if self:isOn() then
|
||||
self:maximize()
|
||||
else
|
||||
self:minimize()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local lockButton = self:getChildById('lockButton')
|
||||
if lockButton then
|
||||
lockButton.onClick =
|
||||
function ()
|
||||
if self:isDraggable() then
|
||||
self:lock()
|
||||
else
|
||||
self:unlock()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:getChildById('miniwindowTopBar').onDoubleClick =
|
||||
function()
|
||||
if self:isOn() then
|
||||
self:maximize()
|
||||
else
|
||||
self:minimize()
|
||||
end
|
||||
end
|
||||
|
||||
local oldParent = self:getParent()
|
||||
|
||||
|
||||
local settings = {}
|
||||
if g_settings.getNodeSize('MiniWindows') < 100 then
|
||||
settings = g_settings.getNode('MiniWindows')
|
||||
end
|
||||
|
||||
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 and not self.forceOpen and not self.containerWindow then
|
||||
self:close(true)
|
||||
end
|
||||
|
||||
if selfSettings.locked then
|
||||
self:lock(true)
|
||||
end
|
||||
else
|
||||
if not self.forceOpen and self.autoOpen ~= nil and (self.autoOpen == 0 or self.autoOpen == false) and not self.containerWindow then
|
||||
self:close(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local newParent = self:getParent()
|
||||
|
||||
self.miniLoaded = true
|
||||
|
||||
if self.save then
|
||||
if oldParent and oldParent:getClassName() == 'UIMiniWindowContainer' and not self.containerWindow 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():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)
|
||||
local children = rootWidget:recursiveGetChildrenByMarginPos(mousePos)
|
||||
local dropInPanel = 0
|
||||
for i=1,#children do
|
||||
local child = children[i]
|
||||
if child:getId():contains('gameLeftPanel') or child:getId():contains('gameRightPanel') then
|
||||
dropInPanel = 1
|
||||
if self.movedWidget then
|
||||
self.setMovedChildMargin(self.movedOldMargin or 0)
|
||||
self.movedWidget = nil
|
||||
self.setMovedChildMargin = nil
|
||||
self.movedOldMargin = nil
|
||||
self.movedIndex = nil
|
||||
end
|
||||
|
||||
UIWindow:onDragLeave(self, droppedWidget, mousePos)
|
||||
self:saveParent(self:getParent())
|
||||
break
|
||||
end
|
||||
end
|
||||
if dropInPanel == 0 then
|
||||
tmpp = self
|
||||
if(modules.game_interface.getLeftPanel():isVisible()) then
|
||||
if modules.game_interface.getRootPanel():getWidth() / 2 < mousePos.x then
|
||||
addEvent(function() tmpp:setParent(modules.game_interface.getRightPanel())
|
||||
if tmpp.movedWidget then
|
||||
tmpp.setMovedChildMargin(tmpp.movedOldMargin or 0)
|
||||
tmpp.movedWidget = nil
|
||||
tmpp.setMovedChildMargin = nil
|
||||
tmpp.movedOldMargin = nil
|
||||
tmpp.movedIndex = nil
|
||||
end
|
||||
|
||||
UIWindow:onDragLeave(tmpp, droppedWidget, mousePos)
|
||||
tmpp:saveParent(tmpp:getParent())
|
||||
end)
|
||||
else
|
||||
addEvent(function() tmpp:setParent(modules.game_interface.getLeftPanel())
|
||||
if tmpp.movedWidget then
|
||||
tmpp.setMovedChildMargin(tmpp.movedOldMargin or 0)
|
||||
tmpp.movedWidget = nil
|
||||
tmpp.setMovedChildMargin = nil
|
||||
tmpp.movedOldMargin = nil
|
||||
tmpp.movedIndex = nil
|
||||
end
|
||||
|
||||
UIWindow:onDragLeave(tmpp, droppedWidget, mousePos)
|
||||
tmpp:saveParent(tmpp:getParent())
|
||||
end)
|
||||
end
|
||||
else
|
||||
addEvent(function() tmpp:setParent(modules.game_interface.getRightPanel())
|
||||
if tmpp.movedWidget then
|
||||
tmpp.setMovedChildMargin(tmpp.movedOldMargin or 0)
|
||||
tmpp.movedWidget = nil
|
||||
tmpp.setMovedChildMargin = nil
|
||||
tmpp.movedOldMargin = nil
|
||||
tmpp.movedIndex = nil
|
||||
end
|
||||
|
||||
UIWindow:onDragLeave(tmpp, droppedWidget, mousePos)
|
||||
tmpp:saveParent(tmpp:getParent())
|
||||
end)
|
||||
end
|
||||
end
|
||||
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:clearSettings()
|
||||
if not self.save then return end
|
||||
|
||||
local settings = g_settings.getNode('MiniWindows')
|
||||
if not settings then
|
||||
settings = {}
|
||||
end
|
||||
|
||||
local id = self:getId()
|
||||
settings[id] = {}
|
||||
|
||||
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
|
Reference in New Issue
Block a user