diff options
Diffstat (limited to 'core/src/menu.lua')
-rw-r--r-- | core/src/menu.lua | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/core/src/menu.lua b/core/src/menu.lua new file mode 100644 index 000000000..5724b2cb9 --- /dev/null +++ b/core/src/menu.lua @@ -0,0 +1,137 @@ +--[[ +FFLuCI - Menu Builder + +Description: +Collects menu building information from controllers + +FileId: +$Id$ + +License: +Copyright 2008 Steven Barth <steven@midlink.org> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +]]-- +module("ffluci.menu", package.seeall) + +require("ffluci.fs") +require("ffluci.util") +require("ffluci.sys") + +-- Default modelpath +modelpath = ffluci.sys.libpath() .. "/model/menu/" + +-- Menu definition extra scope +scope = { + translate = function(...) return require("ffluci.i18n").translate(...) end, + loadtrans = function(...) return require("ffluci.i18n").loadc(...) end, + isfile = ffluci.fs.isfile +} + +-- Local menu database +local menu = nil + +-- The current pointer +local menuc = {} + +-- Adds a menu category to the current menu and selects it +function add(cat, controller, title, order) + order = order or 100 + if not menu[cat] then + menu[cat] = {} + end + + local entry = {} + entry[".descr"] = title + entry[".order"] = order + entry[".contr"] = controller + + menuc = entry + + local i = 0 + for k,v in ipairs(menu[cat]) do + if v[".order"] > entry[".order"] then + break + end + i = k + end + table.insert(menu[cat], i+1, entry) + + return true +end + +-- Adds an action to the current menu +function act(action, title) + table.insert(menuc, {action = action, descr = title}) + return true +end + +-- Selects a menu category +function sel(cat, controller) + if not menu[cat] then + return nil + end + menuc = menu[cat] + + local stat = nil + for k,v in ipairs(menuc) do + if v[".contr"] == controller then + menuc = v + stat = true + end + end + + return stat +end + + +-- Collect all menu information provided in the model dir +function collect() + local generators = {} + + for k, menu in pairs(ffluci.fs.dir(modelpath)) do + if menu:sub(1, 1) ~= "." then + local f = loadfile(modelpath.."/"..menu) + if f then + table.insert(generators, f) + end + end + end + + return generators +end + +-- Parse the collected information +function parse(generators) + menu = {} + for i, f in pairs(generators) do + local env = ffluci.util.clone(scope) + + env.add = add + env.sel = sel + env.act = act + + setfenv(f, env) + f() + end + return menu +end + +-- Returns the menu information +function get() + if not menu then + menu = parse(collect()) + end + return menu +end
\ No newline at end of file |