modal windows

This commit is contained in:
kepler155c@gmail.com 2017-12-13 01:37:31 -05:00
parent 0df22efdc2
commit dd4211745e
1 changed files with 82 additions and 51 deletions

View File

@ -77,8 +77,8 @@ function Manager:init()
end) end)
singleThread('mouse_scroll', function(direction, x, y) singleThread('mouse_scroll', function(direction, x, y)
if self.target then if self.currentPage then
local event = self:pointToChild(self.target, x, y) local event = self.currentPage:pointToChild(x, y)
local directions = { local directions = {
[ -1 ] = 'up', [ -1 ] = 'up',
[ 1 ] = 'down' [ 1 ] = 'down'
@ -105,7 +105,7 @@ function Manager:init()
if self.currentPage then if self.currentPage then
if not self.currentPage.parent.device.side then if not self.currentPage.parent.device.side then
local event = self:pointToChild(self.target, x, y) local event = self.currentPage:pointToChild(x, y)
if event.element.focus and not event.element.inactive then if event.element.focus and not event.element.inactive then
self.currentPage:setFocus(event.element) self.currentPage:setFocus(event.element)
self.currentPage:sync() self.currentPage:sync()
@ -118,7 +118,7 @@ function Manager:init()
local ch = Input:translate('mouse_up', button, x, y) local ch = Input:translate('mouse_up', button, x, y)
if ch == 'control-shift-mouse_click' then -- hack if ch == 'control-shift-mouse_click' then -- hack
local event = self:pointToChild(self.target, x, y) local event = self.currentPage:pointToChild(x, y)
_ENV.multishell.openTab({ _ENV.multishell.openTab({
path = 'sys/apps/Lua.lua', path = 'sys/apps/Lua.lua',
args = { event.element }, args = { event.element },
@ -133,8 +133,8 @@ function Manager:init()
singleThread('mouse_drag', function(button, x, y) singleThread('mouse_drag', function(button, x, y)
local ch = Input:translate('mouse_drag', button, x, y) local ch = Input:translate('mouse_drag', button, x, y)
if ch and self.target then if ch and self.currentPage then
local event = self:pointToChild(self.target, x, y) local event = self.currentPage:pointToChild(x, y)
event.type = ch event.type = ch
self:inputEvent(event.element, event) self:inputEvent(event.element, event)
self.currentPage:sync() self.currentPage:sync()
@ -254,43 +254,23 @@ function Manager:inputEvent(parent, event)
end end
end end
function Manager:pointToChild(parent, x, y)
x = x + parent.offx - parent.x + 1
y = y + parent.offy - parent.y + 1
if parent.children then
for _,child in pairs(parent.children) do
if child.enabled and not child.inactive and
x >= child.x and x < child.x + child.width and
y >= child.y and y < child.y + child.height then
local c = self:pointToChild(child, x, y)
if c then
return c
end
end
end
end
return {
element = parent,
x = x,
y = y
}
end
function Manager:click(code, button, x, y) function Manager:click(code, button, x, y)
if self.target then if self.currentPage then
local target = self.target local target = self.currentPage
-- need to add offsets into this check -- need to add offsets into this check
if x < self.target.x or y < self.target.y or --[[
x > self.target.x + self.target.width - 1 or if x < target.x or y < target.y or
y > self.target.y + self.target.height - 1 then x > target.x + target.width - 1 or
y > target.y + target.height - 1 then
target:emit({ type = 'mouse_out' }) target:emit({ type = 'mouse_out' })
target = self.currentPage target = self.currentPage
end end
--]]
local clickEvent = self:pointToChild(target, x, y) local clickEvent = target:pointToChild(x, y)
if code == 'mouse_doubleclick' then if code == 'mouse_doubleclick' then
if self.doubleClickElement ~= clickEvent.element then if self.doubleClickElement ~= clickEvent.element then
@ -376,7 +356,6 @@ function Manager:setPage(pageOrName, ...)
self.currentPage.focused.focused = true self.currentPage.focused.focused = true
self.currentPage.focused:focus() self.currentPage.focused:focus()
end end
self:capture(self.currentPage)
if needSync then if needSync then
page:sync() -- first time a page has been set page:sync() -- first time a page has been set
end end
@ -395,16 +374,6 @@ function Manager:setPreviousPage()
end end
end end
function Manager:capture(child)
self.target = child
end
function Manager:release(child)
if self.target == child then
self.target = self.currentPage
end
end
function Manager:getDefaults(element, args) function Manager:getDefaults(element, args)
local defaults = Util.deepCopy(element.defaults) local defaults = Util.deepCopy(element.defaults)
if args then if args then
@ -787,6 +756,40 @@ function UI.Window:setFocus(focus)
end end
end end
function UI.Window:capture(child)
if self.parent then
self.parent:capture(child)
end
end
function UI.Window:release(child)
if self.parent then
self.parent:release(child)
end
end
function UI.Window:pointToChild(x, y)
x = x + self.offx - self.x + 1
y = y + self.offy - self.y + 1
if self.children then
for _,child in pairs(self.children) do
if child.enabled and not child.inactive and
x >= child.x and x < child.x + child.width and
y >= child.y and y < child.y + child.height then
local c = child:pointToChild(x, y)
if c then
return c
end
end
end
end
return {
element = self,
x = x,
y = y
}
end
function UI.Window:getFocusables() function UI.Window:getFocusables()
local focusable = { } local focusable = { }
@ -1109,6 +1112,7 @@ UI.Page.defaults = {
} }
function UI.Page:postInit() function UI.Page:postInit()
self.parent = self.parent or UI.defaultDevice self.parent = self.parent or UI.defaultDevice
self.__target = self
end end
function UI.Page:setParent() function UI.Page:setParent()
@ -1136,6 +1140,32 @@ function UI.Page:disable()
end end
end end
function UI.Page:capture(child)
self.__target = child
end
function UI.Page:release(child)
if self.__target == child then
self.__target = self
end
end
function UI.Page:pointToChild(x, y)
if self.__target == self then
return UI.Window.pointToChild(self, x, y)
end
x = x + self.offx - self.x + 1
y = y + self.offy - self.y + 1
return self.__target:pointToChild(x, y)
end
function UI.Page:getFocusables()
if self.__target == self or self.__target.pageType ~= 'modal' then
return UI.Window.getFocusables(self)
end
return self.__target:getFocusables()
end
function UI.Page:getFocused() function UI.Page:getFocused()
return self.focused return self.focused
end end
@ -2055,15 +2085,15 @@ function UI.DropMenu:show(x, y)
child:enable() child:enable()
end end
self:focusFirst()
self:draw() self:draw()
UI:capture(self) self:capture(self)
self:focusFirst()
end end
function UI.DropMenu:hide() function UI.DropMenu:hide()
self:disable() self:disable()
self.canvas:setVisible(false) self.canvas:setVisible(false)
UI:release(self) self:release(self)
end end
function UI.DropMenu:eventHandler(event) function UI.DropMenu:eventHandler(event)
@ -2324,6 +2354,7 @@ end
UI.SlideOut = class(UI.Window) UI.SlideOut = class(UI.Window)
UI.SlideOut.defaults = { UI.SlideOut.defaults = {
UIElement = 'SlideOut', UIElement = 'SlideOut',
pageType = 'modal',
} }
function UI.SlideOut:setParent() function UI.SlideOut:setParent()
UI.Window.setParent(self) UI.Window.setParent(self)
@ -2341,15 +2372,15 @@ function UI.SlideOut:show()
for _,child in pairs(self.children) do for _,child in pairs(self.children) do
child:enable() child:enable()
end end
self:focusFirst()
self:draw() self:draw()
UI:capture(self) self:capture(self)
self:focusFirst()
end end
function UI.SlideOut:hide() function UI.SlideOut:hide()
self:disable() self:disable()
self.canvas:setVisible(false) self.canvas:setVisible(false)
UI:release(self) self:release(self)
self:refocus() self:refocus()
end end