- new log function for debug

- clear metatable for the factory
This commit is contained in:
Alexey Gulev 2019-03-27 21:30:58 +01:00
parent 5e2dc34437
commit cb82acd5da
3 changed files with 126 additions and 113 deletions

View File

@ -1,150 +1,154 @@
local data = require("druid.data") local data = require("druid.data")
local druid_input = require("druid.helper.druid_input") local druid_input = require("druid.helper.druid_input")
local settings = require("druid.settings")
local M = {} local M = {}
local log = settings.log
local _factory = {}
local STRING = "string" local STRING = "string"
--- New druid era, registering components --- New druid era, registering components
local components = { local components = {
-- basic -- basic
button = require("druid.base.button"), button = require("druid.base.button"),
android_back = require("druid.base.android_back"), android_back = require("druid.base.android_back"),
text = require("druid.base.text"), text = require("druid.base.text"),
timer = require("druid.base.timer"), timer = require("druid.base.timer"),
} }
local function register_basic_components() local function register_basic_components()
for k, v in pairs(components) do for k, v in pairs(components) do
M.register(k, v) M.register(k, v)
end end
end end
function M.register(name, module) function M.register(name, module)
-- TODO: Find better solution to creating elements? -- TODO: Find better solution to creating elements?
M["new_" .. name] = function(factory, node_name, ...) _factory["new_" .. name] = function(factory, node_name, ...)
M.create(factory, module, node_name, ...) M.create(factory, module, node_name, ...)
end end
print("[Druid]: register component", name) log("Register component", name)
end end
--- Called on_message
function M.on_message(factory, message_id, message, sender)
if message_id == data.LAYOUT_CHANGED then
if factory[data.LAYOUT_CHANGED] then
M.translate(factory)
for i, v in ipairs(factory[data.LAYOUT_CHANGED]) do
v:on_layout_updated(message)
end
end
elseif message_id == data.TRANSLATABLE then
M.translate(factory)
else
if factory[data.ON_MESSAGE] then
for i, v in ipairs(factory[data.ON_MESSAGE]) do
v:on_message(message_id, message, sender)
end
end
end
end
--- Called ON_INPUT
function M.on_input(factory, action_id, action)
if factory[data.ON_SWIPE] then
local v, result
local len = #factory[data.ON_SWIPE]
for i = 1, len do
v = factory[data.ON_SWIPE][i]
result = result or v:on_input(action_id, action)
end
if result then
return true
end
end
if factory[data.ON_INPUT] then
local v
local len = #factory[data.ON_INPUT]
for i = 1, len do
v = factory[data.ON_INPUT][i]
if action_id == v.event and v:on_input(action_id, action) then
return true
end
end
return false
end
return false
end
--- Called on_update
function M.update(factory, dt)
if factory[data.ON_UPDATE] then
for i, v in ipairs(factory[data.ON_UPDATE]) do
v:update(dt)
end
end
end
--- Create UI instance for ui elements --- Create UI instance for ui elements
-- @return instance with all ui components -- @return instance with all ui components
function M.new(self) function M.new(self)
local factory = setmetatable({}, {__index = M}) local factory = setmetatable({}, {__index = _factory})
factory.parent = self factory.parent = self
return factory return factory
end
local function input_init(factory)
if not factory.input_inited then
factory.input_inited = true
druid_input.focus()
end
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local function input_init(factory)
if not factory.input_inited then
factory.input_inited = true
druid_input.focus()
end
end
local function create(module, factory, name, ...) local function create(module, factory, name, ...)
local instance = setmetatable({}, {__index = module}) local instance = setmetatable({}, {__index = module})
instance.parent = factory instance.parent = factory
if name then if name then
if type(name) == STRING then if type(name) == STRING then
instance.name = name instance.name = name
instance.node = gui.get_node(name) instance.node = gui.get_node(name)
else else
--name already is node --name already is node
instance.name = nil instance.name = nil
instance.node = name instance.node = name
end end
end end
factory[#factory + 1] = instance factory[#factory + 1] = instance
local register_to = module.interest or {} local register_to = module.interest or {}
for i, v in ipairs(register_to) do for i, v in ipairs(register_to) do
if not factory[v] then if not factory[v] then
factory[v] = {} factory[v] = {}
end end
factory[v][#factory[v] + 1] = instance factory[v][#factory[v] + 1] = instance
if v == data.ON_INPUT then if v == data.ON_INPUT then
input_init(factory) input_init(factory)
end end
end end
return instance return instance
end end
function M.create(factory, module, name, ...) function M.create(factory, module, name, ...)
local instance = create(module, factory, name) local instance = create(module, factory, name)
if instance.init then if instance.init then
instance:init(...) instance:init(...)
end end
end
register_basic_components()
--------------------------------------------------------------------------------
--- Called on_message
function _factory.on_message(factory, message_id, message, sender)
if message_id == data.LAYOUT_CHANGED then
if factory[data.LAYOUT_CHANGED] then
M.translate(factory)
for i, v in ipairs(factory[data.LAYOUT_CHANGED]) do
v:on_layout_updated(message)
end
end
elseif message_id == data.TRANSLATABLE then
M.translate(factory)
else
if factory[data.ON_MESSAGE] then
for i, v in ipairs(factory[data.ON_MESSAGE]) do
v:on_message(message_id, message, sender)
end
end
end
end end
register_basic_components() --- Called ON_INPUT
function _factory.on_input(factory, action_id, action)
if factory[data.ON_SWIPE] then
local v, result
local len = #factory[data.ON_SWIPE]
for i = 1, len do
v = factory[data.ON_SWIPE][i]
result = result or v:on_input(action_id, action)
end
if result then
return true
end
end
if factory[data.ON_INPUT] then
local v
local len = #factory[data.ON_INPUT]
for i = 1, len do
v = factory[data.ON_INPUT][i]
if action_id == v.event and v:on_input(action_id, action) then
return true
end
end
return false
end
return false
end
--- Called on_update
function _factory.update(factory, dt)
if factory[data.ON_UPDATE] then
for i, v in ipairs(factory[data.ON_UPDATE]) do
v:update(dt)
end
end
end
return M return M

View File

@ -1,5 +1,6 @@
local M = {} local M = {}
M.is_debug = false
M.button = { M.button = {
IS_HOVER = true, IS_HOVER = true,
@ -23,5 +24,12 @@ function M.play_sound(name)
-- override to play sound with name -- override to play sound with name
end end
function M.log(...)
if M.is_debug then
print("[Druid]: ", ...)
end
end
return M return M

View File

@ -6,6 +6,8 @@ local lang = {
} }
local function setup_druid(self) local function setup_druid(self)
druid_settings.is_debug = true
druid_settings.play_sound = function(name) druid_settings.play_sound = function(name)
sound.play("sounds#" .. name) sound.play("sounds#" .. name)
end end
@ -19,7 +21,6 @@ function init(self)
setup_druid(self) setup_druid(self)
self.druid = druid.new(self) self.druid = druid.new(self)
self.druid:new_button("button_1", function() self.druid:new_button("button_1", function()
print("On button 1") print("On button 1")
end) end)