mirror of
				https://github.com/ErikasKontenis/SabrehavenServer.git
				synced 2025-10-31 03:56:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			517 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			517 lines
		
	
	
		
			14 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
 | |
|   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
 | 
