dialog.lua 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. -- Luanti
  2. -- Copyright (C) 2014 sapier
  3. -- SPDX-License-Identifier: LGPL-2.1-or-later
  4. local function dialog_event_handler(self,event)
  5. if self.user_eventhandler == nil or
  6. self.user_eventhandler(event) == false then
  7. --close dialog on esc
  8. if event == "MenuQuit" then
  9. self:delete()
  10. return true
  11. end
  12. end
  13. end
  14. local dialog_metatable = {
  15. eventhandler = dialog_event_handler,
  16. get_formspec = function(self)
  17. if not self.hidden then return self.formspec(self.data) end
  18. end,
  19. handle_buttons = function(self,fields)
  20. if not self.hidden then return self.buttonhandler(self,fields) end
  21. end,
  22. handle_events = function(self,event)
  23. if not self.hidden then return self.eventhandler(self,event) end
  24. end,
  25. hide = function(self)
  26. if not self.hidden then
  27. self.hidden = true
  28. self.eventhandler(self, "DialogHide")
  29. end
  30. end,
  31. show = function(self)
  32. if self.hidden then
  33. self.hidden = false
  34. self.eventhandler(self, "DialogShow")
  35. end
  36. end,
  37. delete = function(self)
  38. if self.parent ~= nil then
  39. self.parent:show()
  40. end
  41. ui.delete(self)
  42. end,
  43. set_parent = function(self,parent) self.parent = parent end
  44. }
  45. dialog_metatable.__index = dialog_metatable
  46. function dialog_create(name,get_formspec,buttonhandler,eventhandler)
  47. local self = {}
  48. self.name = name
  49. self.type = "toplevel"
  50. self.hidden = true
  51. self.data = {}
  52. self.formspec = get_formspec
  53. self.buttonhandler = buttonhandler
  54. self.user_eventhandler = eventhandler
  55. setmetatable(self,dialog_metatable)
  56. ui.add(self)
  57. return self
  58. end
  59. -- "message" must already be formspec-escaped, e.g. via fgettext or
  60. -- core.formspec_escape.
  61. function messagebox(name, message)
  62. return dialog_create(name,
  63. function()
  64. return ui.get_message_formspec("", message, "ok")
  65. end,
  66. function(this, fields)
  67. if fields.ok then
  68. this:delete()
  69. return true
  70. end
  71. end,
  72. nil)
  73. end