improvements to docking system

This commit is contained in:
teverse 2019-06-27 16:33:55 +01:00
parent f4218db73b
commit 2e903a223c
3 changed files with 87 additions and 24 deletions

View File

@ -5,6 +5,8 @@ controller.dockDictionary = {}
controller.bottomDock = {}
controller.rightDock = {}
local luaHelpers = require("tevgit:create/helpers.lua")
-- direction: up, down, left or right
local function renderHelper(parent, direction, pos)
local frame = controller.ui.create("guiFrame", parent, {
@ -51,7 +53,12 @@ controller.renderDockLocationHelpers = function()
if #controller.bottomDock == 0 then
renderHelper(helpers, "down", guiCoord(0.5, -20, 0.9, -20))
else
for i,v in pairs(controller.bottomDock) do
renderHelper(helpers, "down", guiCoord(0, v.absolutePosition.y + 20, 0.9, -20))
if i == #controller.bottomDock then
renderHelper(helpers, "down", guiCoord(0, v.absolutePosition.y + v.absoluteSize.y - 40, 0.9, -20))
end
end
end
if #controller.rightDock == 0 then
@ -73,37 +80,55 @@ controller.undockWindow = function(window)
controller.dockDictionary[window] = nil
if dockDic then
if dockDic == 0 then
local foundi = 0
for i,v in pairs(controller.bottomDock) do
if v == window then
table.remove(controller.bottomDock, i)
controller.bottomDock[i] = nil
foundi = i
local scale = 1
elseif i > foundi then
controller.bottomDock[i-1] = v
controller.bottomDock[i] = nil
end
end
local scale = 1
if #controller.rightDock > 0 then
scale = 0.8
end
for i,v in pairs(controller.bottomDock) do
for i,v in pairs(controller.bottomDock) do
engine.tween:begin(v, 0.1, {
size = guiCoord(scale*(1/#controller.bottomDock), 0, 0.2, 0),
position = guiCoord(scale*((i-1) * (1/#controller.bottomDock)), 0, 0.8, 0)
}, "inOutQuad")
end
return
end
end
elseif dockDic == 1 then
local foundi = 0
for i,v in pairs(controller.rightDock) do
if v == window then
table.remove(controller.rightDock, i)
for i,v in pairs(controller.rightDock) do
controller.rightDock[i] = nil
foundi = i
elseif i > foundi then
controller.rightDock[i-1] = v
controller.rightDock[i] = nil
end
end
for i,v in pairs(controller.rightDock) do
engine.tween:begin(v, 0.1, {
size = guiCoord(0.2, 0, 1/#controller.rightDock, i == 1 and -83 or 0),
position = guiCoord(0.8,0,(i-1) * (1/#controller.rightDock), i == 1 and 83 or 0)
}, "inOutQuad")
end
return
end
end
end
end
end
@ -112,7 +137,23 @@ controller.dockWindow = function(window, dock, pos)
controller.undockWindow(window)
if dock == controller.bottomDock then
controller.dockDictionary[window] = 0
table.insert(controller.bottomDock, window)
--table.insert(controller.bottomDock, window)
local newIndex = (pos and pos or 0 / (1/#controller.bottomDock+1)) + 1
if newIndex ~= math.floor(newIndex) then
newIndex = #controller.bottomDock + 1
end
if pos and #controller.bottomDock > 0 and newIndex <= #controller.bottomDock then
for i = #controller.bottomDock, 1, -1 do
if i >= newIndex then
controller.bottomDock[i+1] = controller.bottomDock[i]
end
if i == newIndex then
controller.bottomDock[i] = window
end
end
else
controller.bottomDock[#controller.bottomDock+1] = window
end
local scale = 1
if #controller.rightDock > 0 then
@ -127,7 +168,24 @@ controller.dockWindow = function(window, dock, pos)
end
elseif dock == controller.rightDock then
controller.dockDictionary[window] = 1
table.insert(controller.rightDock, window)
--table.insert(controller.rightDock, window)
local newIndex = (pos and pos or 0 / (1/#controller.rightDock+1)) + 1
if newIndex ~= math.floor(newIndex) then
newIndex = #controller.rightDock + 1
end
if pos and #controller.rightDock > 0 and newIndex <= #controller.rightDock then
for i = #controller.rightDock, 1, -1 do
if i >= newIndex then
controller.rightDock[i+1] = controller.rightDock[i]
end
if i == newIndex then
controller.rightDock[i] = window
end
end
else
controller.rightDock[#controller.rightDock+1] = window
end
for i,v in pairs(controller.rightDock) do
engine.tween:begin(v, 0.1, {
size = guiCoord(0.2, 0, 1/#controller.rightDock, i == 1 and -83 or 0),
@ -143,6 +201,8 @@ controller.beginWindowDrag = function(window)
controller.undockWindow(window)
local offset = window.absolutePosition - engine.input.mousePosition
local startAlpha = window.alpha
local startZ = window.zIndex
window.zIndex = 99
window.alpha = startAlpha*0.5;
local helpers = controller.renderDockLocationHelpers()
@ -154,13 +214,14 @@ controller.beginWindowDrag = function(window)
local newpos = engine.input.mousePosition + offset
window.position = guiCoord(0, newpos.x, 0, newpos.y)
if engine.input.mousePosition.y >= engine.input.screenSize.y * 0.75 then
helpers.outline.size = guiCoord(1, 0, 0.2, 0)
helpers.outline.position = guiCoord(0, 0, 0.8, 0)
if engine.input.mousePosition.y >= engine.input.screenSize.y * 0.75 and
engine.input.mousePosition.x < engine.input.screenSize.x * 0.75 then
helpers.outline.size = guiCoord(1/(#controller.bottomDock+1), 0, 0.2, 0)
helpers.outline.position = guiCoord(luaHelpers.roundToMultiple(engine.input.mousePosition.x/engine.input.screenSize.x, 1/(#controller.bottomDock+1)), 0, 0.8, 0)
helpers.outline.visible = true
elseif engine.input.mousePosition.x >= engine.input.screenSize.x * 0.75 then
helpers.outline.size = guiCoord(0.2, 0, 1, 0)
helpers.outline.position = guiCoord(0.8, 0, 0, 0)
helpers.outline.size = guiCoord(0.2, 0, 1/(#controller.rightDock+1), 0)
helpers.outline.position = guiCoord(0.8, 0, luaHelpers.roundToMultiple(engine.input.mousePosition.y/engine.input.screenSize.y, 1/(#controller.rightDock+1)), 0)
helpers.outline.visible = true
else
helpers.outline.visible = false
@ -169,13 +230,15 @@ controller.beginWindowDrag = function(window)
wait()
end
helpers:destroy()
if engine.input.mousePosition.y >= engine.input.screenSize.y * 0.75 then
controller.dockWindow(window, controller.bottomDock)
if engine.input.mousePosition.y >= engine.input.screenSize.y * 0.75 and
engine.input.mousePosition.x < engine.input.screenSize.x * 0.75 then
controller.dockWindow(window, controller.bottomDock, luaHelpers.roundToMultiple(engine.input.mousePosition.x/engine.input.screenSize.x, 1/(#controller.bottomDock+1)))
elseif engine.input.mousePosition.x >= engine.input.screenSize.x * 0.75 then
controller.dockWindow(window, controller.rightDock)
controller.dockWindow(window, controller.rightDock, luaHelpers.roundToMultiple(engine.input.mousePosition.y/engine.input.screenSize.y, 1/(#controller.rightDock+1)))
end
window.alpha = startAlpha
window.zIndex = startZ
end
return controller

View File

@ -19,6 +19,7 @@ function controller.createUI(workshop)
controller.window = uiController.createWindow(workshop.interface, guiCoord(1, -300, 1, -400), guiCoord(0, 250, 0, 400), "Properties")
controller.window.visible = true
controller.window2 = uiController.createWindow(workshop.interface, guiCoord(0.3, -300, 1, -400), guiCoord(0, 250, 0, 250), "Test Window")
dockController.dockWindow(controller.window, dockController.rightDock)

View File

@ -1,7 +1,5 @@
local controller = {}
local toolSettings = require("tevgit:create/controllers/toolSettings.lua")
function controller.roundToMultiple(number, multiple)
if multiple == 0 then
return number
@ -17,6 +15,7 @@ function controller.roundVectorToMultiple(vec, multiple)
end
function controller.roundVectorWithToolSettings(vec)
local toolSettings = require("tevgit:create/controllers/toolSettings.lua")
local multiple = toolSettings.gridStep
vec.x = toolSettings.axis[1][2] and controller.roundToMultiple(vec.x, multiple) or vec.x
vec.y = toolSettings.axis[2][2] and controller.roundToMultiple(vec.y, multiple) or vec.y