diff options
Diffstat (limited to 'Data/Libraries/GameLab/Editor/Window/SplitWindow.lua')
-rw-r--r-- | Data/Libraries/GameLab/Editor/Window/SplitWindow.lua | 80 |
1 files changed, 68 insertions, 12 deletions
diff --git a/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua b/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua index f5d410c..597e858 100644 --- a/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua +++ b/Data/Libraries/GameLab/Editor/Window/SplitWindow.lua @@ -1,32 +1,88 @@ +local Debug = GameLab.Debug +local Rect = require("GameLab.Engine.Math.Rect") + local Splitter = GameLab.Class("GameLab.Editor.Window.Internal.Splitter") -Splitter.Ctor = function(self) - self.width = 10 +Splitter.Ctor = function(self, value) + self.size = 10 + self.value = value -- [0-1] 位置 end -- 抽象的窗口,用来处理布局 local SplitWindow = GameLab.GlobalClass("GameLab.Editor.Window.SplitWindow") local ESplitMode = GameLab.GlobalEnum("GameLab.Editor.Window.ESplitMode", { - "Vertical", - "Horizontal" + "Horizontal", -- 水平划分 + "Vertical", -- 垂直划分 }) -SplitWindow.Ctor = function(self) - self.m_Splitter = {} - self.m_SplitMode = ESplitMode.Horizontal - self.m_GUIWindows = {} - self.m_Parent = nil -- 父节点也是一个split window - self.m_SubSplit = {} -- 子节点也是split windows +SplitWindow.Ctor = function(self, mode, splitter) + self.m_SplitMode = mode + self.m_Parent = nil -- 父节点是一个split window或者空 + self.m_SubSplit = {} -- 子节点也是split windows + self.m_GUIWindow = {} -- 不包含subSplit的有一个GUIWindow + self.m_Splitter = {} + self.m_ContainerWindow = nil + if splitter ~= nil and type(splitter) == "table" then + for _, v in ipairs(splitter) do + local sp = Splitter.New(v) + table.insert(self.m_Splitter, sp) + end + end end +-- 布局,设置GUIWindow的大小 SplitWindow.DoSplit = function(self, event) - + -- local position = self:GetPosition() + -- for _, sp in ipairs(self.m_SubSplit) do + -- sp:DoSplit(event) + -- end end +-- 返回在containerWindow下的像素大小和位置 +SplitWindow.GetPosition = function(self) + local position = Rect.New() + local parent = self.GetParent + if parent == nil then --最顶层的split window + position.x = 0 + position.y = 0 + position.width = self.m_ContainerWindow:GetWidth() + position.height = self.m_ContainerWindow:GetHeight() + return position + end + local parentPos = parent:GetPosition() + local index = self:GetIndexOfParent() + -- 前后的splitter + local prev = index > 1 and parent.m_Splitter[index - 1] or nil + local next = index <= #parent.m_Splitter and parent.m_Splitter[index] or nil + local offset = prev ~= nil and prev.value or 0 + local pv = offset + local nv = next ~= nil and next.value or 1 + local size = nv - pv + position:CopyFrom(parentPos) + if parent.m_SplitMode == ESplitMode.Horizontal then + position.x = position.x + offset + position.width = position.width * size + else + position.y = position.y + offset + position.height = position.height * size + end +end + -- 返回guiWnd -SplitWindow.IndexOfGUIWindow = function(self, guiWnd) +SplitWindow.GetIndexOfParent = function(self) + if self.m_Parent == nil then + return 1 + end + for i, sp in ipairs(self.m_Parent.m_SubSplit) do + if sp == self then + return i + end + end +end +SplitWindow.GetParent = function(self) + return self.m_Parent end return SplitWindow
\ No newline at end of file |