* Mördercommit ;-)
[project/luci.git] / core / src / menu.lua
diff --git a/core/src/menu.lua b/core/src/menu.lua
new file mode 100644 (file)
index 0000000..5724b2c
--- /dev/null
@@ -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