-- name = "Meta widget" -- type = "widget" -- author = "Andrey Gavrilov" -- version = "1.0" local widgets = { "text [TEXT]", "battery", "notes [NUM]", "exchange [NUM] [FROM] [TO]", "worldclock [TIME_ZONE]", "calendar [NUM]", "bitcoin", "traffic", "alarm", "tasks [NUM]", "memory", "storage", "weather [NUM]", "notify [NUM]", "screen", "dialogs [NUM]", "player", "health", "space [NUM]" } table.sort(widgets) function on_resume() if not metawidget then if not files:read("metawidget") then metawidget = {"text Metawidget"} redraw() return end end metawidget = load("return " .. files:read("metawidget"))() ui:build(metawidget) end function on_settings() dialog_id = "settings" ui:show_radio_dialog("Select action", {"Add widget", "Remove widget", "Move widget", "Edit widget", "Edit metawidget"}) end function on_dialog_action(res) if dialog_id == "settings" then if res == 1 then dialog_id = "add" ui:show_radio_dialog("Add widget", widgets) elseif res == 2 then dialog_id = "remove" ui:show_radio_dialog("Remove widget", metawidget) elseif res == 3 then dialog_id = "move" ui:show_radio_dialog("Move widget", metawidget) elseif res == 4 then dialog_id = "edit" ui:show_radio_dialog("Edit widget", metawidget) elseif res == 5 then dialog_id = "metaedit" ui:show_rich_editor({text = "{\n\"" .. table.concat(metawidget, "\",\n\"") .. "\",\n}", new = true}) else dialog_id = "" end elseif dialog_id == "add" then dialog_id = "" if res ~= -1 then add_widget(res) end elseif dialog_id == "remove" then dialog_id = "" if res ~= -1 then remove_widget(res) end elseif dialog_id == "move" then if res == -1 then dialog_id = "" else dialog_id = "move_line" pos = res ui:show_radio_dialog("Remove widget", {"Up", "Down"}) end elseif dialog_id == "edit" then if res == -1 then dialog_id = "" else dialog_id = "edit_line" pos = res ui:show_edit_dialog("Edit widget", "", metawidget[res]) end elseif dialog_id == "metaedit" then dialog_id = "" if res ~= -1 then metawidget = load("return " .. res.text)() redraw() end elseif dialog_id == "add_line" then dialog_id = "" if (res ~= -1) and (res ~= "") then table.insert(metawidget, res) redraw() end elseif dialog_id == "move_line" then dialog_id = "" if res ~= -1 then move_widget(res) end elseif dialog_id == "edit_line" then dialog_id = "" if res ~= -1 then if res == "" then remove_widget(pos) else metawidget[pos] = res redraw() end end else return end end function add_widget(res) local lines = widgets[res]:split(" ") local line = lines[1] if line == widgets[res] then table.insert(metawidget, line) redraw() else dialog_id = "add_line" ui:show_edit_dialog("Enter parameters" .. widgets[res]:replace(line, ""), widgets[res], line .. " ") end end function remove_widget(res) table.remove(metawidget, res) redraw() end function move_widget(res) if res == 1 then if pos == 1 then return else local line = metawidget[pos] metawidget[pos] = metawidget[pos - 1] metawidget[pos - 1] = line end else if pos == #metawidget then return else local line = metawidget[pos] metawidget[pos] = metawidget[pos + 1] metawidget[pos + 1] = line end end redraw() end function redraw() files:write("metawidget", "{\n\"" .. table.concat(metawidget, "\",\n\"") .. "\",\n}") on_resume() end