|
|
- -- Basic gui stuff by forum user "spk77": https://forum.cockos.com/showthread.php?t=161557
- ----------------
- -- Menu class --
- ----------------
-
- -- To create a new menu instance, call this function like this:
- -- menu_name = Menu("menu_name")
- local Menu =
- class(
- function(menu, id)
- menu.id = id
- menu.items = {} -- Menu items are collected to this table
- menu.items_str = ""
- menu.curr_item_pos = 1
- end
- )
-
- ------------------
- -- Menu methods --
- ------------------
-
- --[[
- -- True if menu item label starts with "prefix"
- function Menu:label_starts_with(label, prefix)
- return string.sub(label, 1, string.len(prefix)) == prefix
- end
- --]]
-
-
- -- Returns "menu item table" (or false if "id" not found)
- function Menu:get_item_from_id(id)
- for i=1, #self.items do
- if self.items[i].id == id then
- return self.items[i]
- end
- end
- return false
- end
-
-
- -- Updates "menu item type" variables (_has_submenu, _last_item_in_submenu etc.)
- function Menu:update_item(item_table)
- local t = item_table
- t._has_submenu = false
- t._last_item_in_submenu = false
- t.id = self.curr_item_pos
-
- if string.sub(t.label, 1, 1) == ">" or
- string.sub(t.label, 1, 2) == "<>" or
- string.sub(t.label, 1, 2) == "><" then
- t._has_submenu = true
- t.id = -1
- self.curr_item_pos = self.curr_item_pos - 1
- --end
- elseif string.sub(t.label, 1, 1) == "<" then
- t._has_submenu = false
- t._last_item_in_submenu = true
- end
- --t.id = self.curr_item_pos
- self.curr_item_pos = self.curr_item_pos + 1
- end
-
-
- -- Returns the created table and table index in "menu_obj.items"
- function Menu:add_item(...)
- local t = ... or {}
- self.items[#self.items+1] = t -- add new menu item at the end of menu
-
- -- Parse arguments
- for i,v in pairs(t) do
- --msg(i .. " = " .. tostring(v))
- if i == "label" then
- t.label = v
- elseif i == "selected" then
- t.selected = v
- elseif i == "active" then
- t.active = v
- elseif i == "toggleable" then
- t.toggleable = v
- elseif i == "command" then
- t.command = v
- end
- end
-
- -- Default values for menu items
- -- (Edit these)
- if t.label == nil or t.label == "" then
- t.label = tostring(#self.items) -- if label is nil or "" -> label is set to "table index in menu_obj.items"
- end
-
- if t.selected == nil then
- t.selected = false -- edit
- end
-
- if t.active == nil then
- t.active = true -- edit
- end
-
- if t.toggleable == nil then
- t.toggleable = false -- edit
- end
-
- return t, #self.items
- end
-
-
- -- Get menu item table at index
- function Menu:get_item(index)
- if self.items[index] == nil then
- return false
- end
- return self.items[index]
- end
-
-
- -- Show menu at mx, my
- function Menu:show(mx, my)
- gfx.x = mx
- gfx.y = my
-
- -- Check which items has a function to call when a menu is about to be shown
- for i=1, #self.items do
- if self.items[i].on_menu_show ~= nil then
- self.items[i].on_menu_show()
- end
- -- Update item
- self:update_item(self.items[i])
- end
-
- -- Convert menu item tables to string
- self.items_str = self:table_to_string() or ""
- self.val = gfx.showmenu(self.items_str)
- if self.val > 0 then
- self:update(self.val)
- end
- self.curr_item_pos = 1 -- set "menu item position counter" back to the initial value
- end
-
-
- function Menu:update(menu_item_index)
- -- check which "menu item id" matches with "menu_item_index"
- for i=1, #self.items do
- if self.items[i].id == menu_item_index then
- menu_item_index = i
- break
- end
- end
- local i = menu_item_index
- -- if menu item is "toggleable" then toggle "selected" state
- if self.items[i].toggleable then
- self.items[i].selected = not self.items[i].selected
- end
- -- if menu item has a "command" (function), then call that function
- if self.items[i].command ~= nil then
- self.items[i].command()
- end
- end
-
-
- -- Convert "Menu_obj.items" to string
- function Menu:table_to_string()
- if self.items == nil then
- return
- end
- self.items_str = ""
-
- for i=1, #self.items do
- local temp_str = ""
- local menu_item = self.items[i]
- if menu_item.selected then
- temp_str = "!"
- end
-
- if not menu_item.active then
- temp_str = temp_str .. "#"
- end
-
- if menu_item.label ~= "" then
- temp_str = temp_str .. menu_item.label .. "|"
- end
-
- self.items_str = self.items_str .. temp_str
- end
-
- return self.items_str
- end
-
- --END of Menu class----------------------------------------------------
-
- return Menu
-
|