diff --git a/gui/gui.lua b/gui/gui.lua index 2a5b9aa..5f13527 100644 --- a/gui/gui.lua +++ b/gui/gui.lua @@ -77,20 +77,26 @@ function _M.GUI:_calcRelValue(x, y) return x, y end -function _M.GUI:_createGUILayer(width, height) +function _M.GUI:_createGUILayer(width, height, screenWidth, screenHeight) local layer = MOAILayer.new() local viewport = MOAIViewport.new() - viewport:setSize(width, height) + if ( screenWidth and screenHeight ) then + local shiftX = ( screenWidth - width ) / 2 + local shiftY = ( screenHeight - height ) / 2 + viewport:setSize ( shiftX, shiftY, shiftX + width, shiftY + height ) + else + viewport:setSize(width, height) + end viewport:setScale(width, height) viewport:setOffset(-1, 1) - + layer:setViewport(viewport) - - + local partition = MOAIPartition.new() layer:setPartition(partition) - + + self._partitionOrder = {} self._partition = partition self._layer = layer self._viewport = viewport @@ -115,6 +121,7 @@ function _M.GUI:_createProp(priority) prop:setLoc(0, 0) prop:setScl(1, 1) + table.insert ( self:partitionOrder ( ), prop ) self:partition():insertProp(prop) return prop @@ -128,6 +135,7 @@ end function _M.GUI:_destroyProp(prop) prop:setDeck(nil) + array.removeElement ( self:partitionOrder ( ), prop ) self:partition():removeProp(prop) end @@ -261,18 +269,36 @@ function _M.GUI:partition() return self._partition end +function _M.GUI:partitionOrder() + return self._partitionOrder +end + function _M.GUI:layer() return self._layer end +function _M.GUI:_orderedProps ( props ) + local orderedProps = {} + for i = #self:partitionOrder ( ), 1, -1 do + for k, v in pairs ( props ) do + if ( v == self:partitionOrder ( ) [ i ] ) then + table.insert ( orderedProps, v ) + end + end + end + return orderedProps +end + function _M.GUI:_calcInputOver(x, y) local inputX, inputY = self._layer:wndToWorld(x, y) local props = {self._partition:propListForPoint(inputX, inputY, 0, MOAILayer.SORT_PRIORITY_DESCENDING)} if (nil == props or #props == 0) then return nil end - for i, v in ipairs(props) do - local win = self._propToWindow[v] + local orderedProps = self:_orderedProps ( props ) + + for i, v in ipairs(orderedProps) do + local win = self._propToWindow [ v ] if (nil ~= win) then if (true == win:getVisible()) then return win @@ -702,7 +728,7 @@ function _M.GUI:shutdown() end end -function _M.GUI:init(width, height) +function _M.GUI:init(width, height, screenWidth, screenHeight) self._width = width self._height = height @@ -727,7 +753,7 @@ function _M.GUI:init(width, height) self._factory = factory.Factory(self) self._layoutParser = layoutparser.LayoutParser(self._factory) - self:_createGUILayer(width, height) + self:_createGUILayer(width, height, screenWidth, screenHeight) end return _M diff --git a/gui/layoutparser.lua b/gui/layoutparser.lua index abe6c32..8df53fd 100644 --- a/gui/layoutparser.lua +++ b/gui/layoutparser.lua @@ -587,6 +587,26 @@ function _M.LayoutParser:createFromData(data, prefix, parent, params) return roots, widgets, groups end +function _M.LayoutParser:createSortedData ( data ) + local sortedData = {} + local element = nil + + for k, v in pairs ( data ) do + element = v + element._name = k + table.insert ( sortedData, element ) + end + + function dataSort ( a, b ) + local aOrder = a.order or 0 + local bOrder = b.order or 0 + return aOrder < bOrder + end + + table.sort ( sortedData, dataSort ) + + return sortedData +end function _M.LayoutParser:createFromLayout(fileName, prefix, parent, params) local roots = {} @@ -606,9 +626,11 @@ function _M.LayoutParser:createFromLayout(fileName, prefix, parent, params) -- data.create(params) -- end - for k, v in pairs(data) do - table.insert(roots, prefix .. k) - self:_parseWidgetData(fileName, prefix, parent, k, v, widgets, nil, groups) + local sortedData = self:createSortedData ( data ) + + for k, v in pairs(sortedData) do + table.insert(roots, prefix .. v._name) + self:_parseWidgetData(fileName, prefix, parent, v._name, v, widgets, nil, groups) end return roots, widgets, groups