summaryrefslogtreecommitdiffhomepage
path: root/core/src/menu.lua
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/menu.lua')
-rw-r--r--core/src/menu.lua137
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