Advertisement
Guest User

Untitled

a guest
Feb 6th, 2017
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.55 KB | None | 0 0
  1. -- this module contains only constants for input and other things like that
  2. local const      = require "lua modules/constants"
  3. local gui_helper = require "lua modules/gui_helpers"
  4. local lume       = require "lua modules/lume"
  5.  
  6. local madgui = { version = "0.0.1"}
  7. madgui.__index = madgui
  8.  
  9. function madgui.create_gui_manager(table)
  10.     return {
  11.         in_focus = {},
  12.         page_nodes = {},
  13.         cursor_node = nil,
  14.         cursor_pos = nil,
  15.         window_width  = tonumber(sys.get_config("display.width")),
  16.         window_height = tonumber(sys.get_config("display.height")),
  17.         is_fullscreen = tonumber(sys.get_config("display.fullscreen")),
  18.         mouse_sensitivity = tonumber(sys.get_config("default_settings.mouse_sensitivity"))}
  19. end
  20.  
  21. function madgui.set_cursor(manager, cursor_node)
  22.     manager.cursor_node = cursor_node
  23. end
  24.  
  25. function madgui.hide_cursor(manager)
  26.     if manager.cursor_node ~= nil then
  27.         gui.set_enabled(manager.cursor_node, false)
  28.     end
  29. end
  30.  
  31. function madgui.show_cursor(manager)
  32.     if manager.cursor_node ~= nil then
  33.         gui.set_enabled(manager.cursor_node, true)
  34.     end
  35. end
  36.  
  37. --this affects only fullscreen mouse!
  38. function madgui.set_mouse_sensitivity(manager, value)
  39.     manager.mouse_sensitivity = lume.clamp(value, 0.0, 1.0)
  40. end
  41.  
  42. function madgui.handle_manager_input(manager,action_id, action)
  43.     if manager.cursor_node ~= nil then
  44.         if manager.cursor_pos == nil then
  45.             manager.cursor_pos = gui.get_position(manager.cursor_node)
  46.         end
  47.         if manager.is_fullscreen == 1 then
  48.             manager.cursor_pos.x = lume.clamp(
  49.                 manager.cursor_pos.x + action.dx * manager.mouse_sensitivity,
  50.                 0, manager.window_width)
  51.  
  52.             manager.cursor_pos.y = lume.clamp(
  53.                 manager.cursor_pos.y + action.dy * manager.mouse_sensitivity,
  54.                 0, manager.window_height)
  55.         else
  56.             manager.cursor_pos.x = action.x
  57.             manager.cursor_pos.y = action.y
  58.         end
  59.  
  60.         gui.set_position(manager.cursor_node, manager.cursor_pos)
  61.     end
  62.  
  63.     for i = 1, #manager.page_nodes do
  64.         if gui_helper.is_node_enabled(manager.page_nodes[i].node) then
  65.             madgui.handle_page_input(manager.page_nodes[i], action_id, action)
  66.         end
  67.     end
  68. end
  69.  
  70. function madgui.add_page(manager, page_node, focus_node)
  71.     local nd, page_id =
  72.         lume.match(manager.page_nodes,
  73.                    function(pg_node)
  74.                        return pg_node.node == page_node
  75.                    end)
  76.     if page_id ~= nil then
  77.         return nil
  78.     end
  79.  
  80.     -- by default every page that have been added is disabled
  81.     gui.set_enabled(page_node, false)
  82.     local page = madgui.page(manager, page_node, focus_node)
  83.     table.insert(manager.page_nodes, page)
  84.  
  85.     return page
  86. end
  87.  
  88. function madgui.set_active_page_by_node(manager, page_node)
  89.     for i = 1, #manager.page_nodes do
  90.         gui.set_enabled(manager.page_nodes[i].node,
  91.                         manager.page_nodes[i].node == page_node)
  92.     end
  93.     madgui.show_cursor(manager)
  94. end
  95.  
  96. function madgui.hide_all_pages(manager)
  97.     for i = 1, #manager.page_nodes do
  98.         gui.set_enabled(manager.page_nodes[i].node, false)
  99.     end
  100.     madgui.hide_cursor(manager)
  101. end
  102.  
  103. --
  104. -- madgui_button
  105. --
  106. function madgui.button(manager,
  107.                        page,
  108.                        button_node,
  109.                        button_callback,
  110.                        horizontal_order,
  111.                        ignore_on_vertical,
  112.                        is_locking_to_right,
  113.                        is_locking_to_left)
  114.     gui.set_color(button_node, const.color_normal)
  115.     return {
  116.         manager             = manager,
  117.         page                = page,
  118.         node                = button_node,
  119.         callback            = button_callback,
  120.         horizontal_order    = horizontal_order,
  121.         ignore_on_vertical  = ignore_on_vertical,
  122.         clicked             = false,
  123.         is_locking_to_right = is_locking_to_right,
  124.         is_locking_to_left  = is_locking_to_left
  125.     }
  126. end
  127.  
  128. --function madgui.copy_button
  129.  
  130. function madgui.handle_button_input(button, action_id, action)
  131.     if not gui_helper.is_node_enabled(button.node) then
  132.         return
  133.     end
  134.  
  135.     if button.manager.in_focus[button.node] == nil then
  136.         button.manager.in_focus[button.node] = false
  137.     end
  138.  
  139.     if button.manager.cursor_node == nil then
  140.         return
  141.     end
  142.  
  143.     if button.manager.cursor_pos == nil then
  144.         return
  145.     end
  146.  
  147.     if gui.pick_node(button.node, button.manager.cursor_pos.x, button.manager.cursor_pos.y) then
  148.         if not button.manager.in_focus[button.node] then
  149.             button.manager.in_focus[button.node] = true
  150.             madgui.refocus_on(button.page, button.node)
  151.             gui_helper.change_node_color_smooth(button.node, const.color_focused)
  152.         end
  153.  
  154.         if (action_id == hash("touch")) then
  155.             if action.pressed then
  156.                 gui.set_color(button.node, const.color_pressed)
  157.                 gui.set_color(button.page.focus, const.color_pressed)
  158.                 gui.set_scale(button.page.focus, const.scale_pressed)
  159.                 button.clicked = true
  160.             elseif button.clicked and action.released then
  161.                 gui.set_color(button.node, const.color_focused)
  162.                 gui_helper.change_property_smooth(button.page.focus, gui.PROP_SCALE, const.scale_normal, 0.15)
  163.                 gui_helper.change_property_smooth(button.page.focus, gui.PROP_COLOR, const.color_white, 0.15)
  164.                 button.clicked = false
  165.                 button.callback()
  166.             end
  167.         end
  168.     else
  169.         if button.manager.in_focus[button.node] then
  170.             gui_helper.change_property_smooth(button.page.focus, gui.PROP_SCALE, const.scale_normal, 0.15)
  171.             gui_helper.change_property_smooth(button.page.focus, gui.PROP_COLOR, const.color_white, 0.15)
  172.  
  173.             button.manager.in_focus[button.node] = false
  174.             gui_helper.change_node_color_smooth(button.node, const.color_normal)
  175.         end
  176.     end
  177. end
  178.  
  179. --
  180. -- madgui_page
  181. --
  182. function madgui.page(manager, page_node, focus_node)
  183.     return {
  184.     manager       = manager,
  185.     node          = page_node,
  186.     focus         = focus_node,
  187.     focused       = nil,
  188.     progress_bars = {},
  189.     buttons       = {},
  190.     buttons_hor   = {},
  191.     enter_key_pressed = false,
  192.     escape_key_pressed = false,
  193.     on_escape = nil}
  194. end
  195.  
  196. function madgui.add_button(page,
  197.                            button_node,
  198.                            callback,
  199.                            horizontal_order,
  200.                            ignore_on_vertical,
  201.                            is_locking_to_right,
  202.                            is_locking_to_left)
  203.     local already_exists = false
  204.     for i = 1, #page.buttons do
  205.         if page.buttons[i].node == button_node then
  206.             already_exists = true
  207.             break
  208.         end
  209.     end
  210.  
  211.     if already_exists then
  212.         return nil
  213.     end
  214.  
  215.     local button = madgui.button(page.manager,
  216.                                  page,
  217.                                  button_node,
  218.                                  callback,
  219.                                  horizontal_order,
  220.                                  ignore_on_vertical,
  221.                                  is_locking_to_right,
  222.                                  is_locking_to_left)
  223.     table.insert(page.buttons, button)
  224.  
  225.     return button
  226. end
  227.  
  228. function madgui.add_button_range(page, locked, starting_order, ...)
  229.     local hor_order = starting_order
  230.     local end_index = select("#", ...)
  231.     for i = 1, select("#", ...) do
  232.         local array_element = select(i, ...)
  233.         madgui.add_button(page,
  234.                           array_element.button_node,
  235.                           array_element.callback,
  236.                           hor_order,
  237.                           false,
  238.                           locked,
  239.                           locked)
  240.         hor_order = hor_order + 1
  241.     end
  242. end
  243.  
  244. function madgui.add_button_row(page, starting_order, central_node, ...)
  245.     local hor_order = starting_order
  246.     local end_index = select("#", ...)
  247.     for i = 1, end_index do
  248.         local array_element = select(i, ...)
  249.         local ignore_vert = false
  250.         if i == 1 then
  251.             if central_node ~= nil then
  252.                 if central_node ~= array_element.button_node then
  253.                     ignore_vert = true
  254.                 end
  255.             end
  256.             madgui.add_button(
  257.                 page,
  258.                 array_element.button_node,
  259.                 array_element.callback,
  260.                 hor_order,
  261.                 ignore_vert,
  262.                 false,
  263.                 true)
  264.         else
  265.             ignore_vert = true
  266.             if central_node ~= nil then
  267.                 if central_node == array_element.button_node then
  268.                     ignore_vert = false
  269.                 end
  270.             end
  271.             madgui.add_button(
  272.                 page,
  273.                 array_element.button_node,
  274.                 array_element.callback,
  275.                 hor_order,
  276.                 ignore_vert,
  277.                 i == end_index,
  278.                 false)
  279.         end
  280.         hor_order = hor_order + 1
  281.     end
  282. end
  283.  
  284. function madgui.abstract_refocus(page, new_focus_node, callback)
  285.     if page.focus == nil then
  286.         return
  287.     end
  288.  
  289.     if not gui_helper.is_node_enabled(page.focus) then
  290.         return
  291.     end
  292.  
  293.     if not gui_helper.is_node_enabled(new_focus_node) then
  294.         return
  295.     end
  296.  
  297.     if (page.focused == nil) or
  298.        (page.focused ~= new_focus_node)
  299.     then
  300.         local pos = gui.get_position(new_focus_node)
  301.         local size = gui.get_size(new_focus_node)
  302.         size.x = size.x + 10
  303.         size.y = size.y + 10
  304.         callback(page.focus, size, pos)
  305.         page.focused = new_focus_node
  306.     end
  307. end
  308.  
  309. function madgui.refocus_on(page, node)
  310.     madgui.abstract_refocus(page, node,
  311.         function(node, new_size, new_position)
  312.             gui_helper.change_node_size_smooth(node, new_size)
  313.             gui_helper.change_node_position_smooth(node, new_position)
  314.         end)
  315. end
  316.  
  317. function madgui.refocus_on_immediate(page, node)
  318.     madgui.abstract_refocus(page, node,
  319.         function(node, new_size, new_position)
  320.             gui.set_size(node, new_size)
  321.             gui.set_position(node, new_position)
  322.         end)
  323. end
  324.  
  325. function madgui.add_on_escape_callback(page, callback)
  326.     page.on_escape = callback
  327. end
  328.  
  329. function madgui.handle_page_input(page, action_id, action)
  330.     local is_prev_key = action_id == const.input_left
  331.     local is_next_key = action_id == const.input_right
  332.     local is_up_key   = action_id == const.input_up
  333.     local is_down_key = action_id == const.input_down
  334.  
  335.     local is_controls = is_prev_key or is_next_key or is_up_key or is_down_key
  336.     if is_controls then
  337.         if #page.buttons_hor ~= #page.buttons then
  338.             page.buttons_hor = lume.chain(page.buttons)
  339.                 :filter(lume.lambda "a -> a.horizontal_order > -1")
  340.                 :sort(lume.lambda "a,b -> a.horizontal_order <= b.horizontal_order")
  341.                 :result()
  342.         end
  343.  
  344.         local next_focus = page.focused
  345.         if page.focused == nil then
  346.             if #page.buttons > 0 then
  347.                 next_focus = page.buttons[1].node
  348.             end
  349.         else
  350.             if (is_next_key or is_prev_key) and action.released then
  351.                 local current_button, current_id =
  352.                     lume.match(page.buttons_hor,
  353.                                function(btn)
  354.                                    return btn.node == page.focused
  355.                                end)
  356.  
  357.                 if current_id ~= nil then
  358.                     if is_next_key then
  359.                         if current_button.is_locking_to_right then
  360.                             return
  361.                         end
  362.                         local next_id = current_id + 1
  363.                         if next_id > #page.buttons_hor then
  364.                             next_id = 1
  365.                         end
  366.                         while not gui_helper.is_node_enabled(page.buttons_hor[next_id].node) do
  367.                             next_id = next_id + 1
  368.                             if next_id > #page.buttons_hor then
  369.                                 next_id = 1
  370.                             end
  371.                             if next_id == current_id then break end
  372.                         end
  373.                         next_focus = page.buttons_hor[next_id].node
  374.                     else
  375.                         if current_button.is_locking_to_left then
  376.                             return
  377.                         end
  378.                         local next_id = current_id - 1
  379.                         if next_id < 1 then
  380.                             next_id = #page.buttons_hor
  381.                         end
  382.                         while not gui_helper.is_node_enabled(page.buttons_hor[next_id].node) do
  383.                             next_id = next_id - 1
  384.                             if next_id < 1 then
  385.                                 next_id = #page.buttons_hor
  386.                             end
  387.                             if next_id == current_id then break end
  388.                         end
  389.                         next_focus = page.buttons_hor[next_id].node
  390.                     end
  391.                 end
  392.             elseif (is_down_key or is_up_key) and action.released then
  393.                 local current_button, current_id =
  394.                     lume.match(page.buttons_hor,
  395.                                function(btn)
  396.                                    return btn.node == page.focused
  397.                                end)
  398.  
  399.                 if current_id ~= nil then
  400.                     if is_down_key then
  401.                         local additional_step_needed = false
  402.                         if (current_button.ignore_on_vertical) and
  403.                            (not current_button.is_locking_to_right)
  404.                         then
  405.                             additional_step_needed = true
  406.                         end
  407.                         local next_id = current_id + 1
  408.                         if next_id > #page.buttons_hor then
  409.                             next_id = 1
  410.                         end
  411.                         while (not gui_helper.is_node_enabled(page.buttons_hor[next_id].node)) or
  412.                               page.buttons_hor[next_id].ignore_on_vertical
  413.                         do
  414.                             next_id = next_id + 1
  415.                             if next_id > #page.buttons_hor then
  416.                                 next_id = 1
  417.                             end
  418.                             if next_id == current_id then break end
  419.                         end
  420.  
  421.                         if additional_step_needed then
  422.                             additional_step_needed = false
  423.                             next_id = next_id - 1
  424.                             if next_id > #page.buttons_hor then
  425.                                 next_id = 1
  426.                             end
  427.                             while (not gui_helper.is_node_enabled(page.buttons_hor[next_id].node)) or
  428.                                   page.buttons_hor[next_id].ignore_on_vertical
  429.                             do
  430.                                 next_id = next_id + 1
  431.                                 if next_id > #page.buttons_hor then
  432.                                     next_id = 1
  433.                                 end
  434.                                 if next_id == current_id then break end
  435.                             end
  436.                         end
  437.  
  438.                         next_focus = page.buttons_hor[next_id].node
  439.                     else
  440.                         local additional_step_needed = false
  441.                         if (current_button.ignore_on_vertical) and
  442.                            (not current_button.is_locking_to_left)
  443.                         then
  444.                             additional_step_needed = true
  445.                         end
  446.                         local next_id = current_id - 1
  447.                         if next_id < 1 then
  448.                             next_id = #page.buttons_hor
  449.                         end
  450.                         while (not gui_helper.is_node_enabled(page.buttons_hor[next_id].node)) or
  451.                               page.buttons_hor[next_id].ignore_on_vertical
  452.                         do
  453.                             next_id = next_id - 1
  454.                             if next_id < 1 then
  455.                                 next_id = #page.buttons_hor
  456.                             end
  457.                             if next_id == current_id then break end
  458.                         end
  459.  
  460.                         if additional_step_needed then
  461.                             additional_step_needed = false
  462.                             next_id = next_id - 1
  463.                             if next_id < 1 then
  464.                                 next_id = #page.buttons_hor
  465.                             end
  466.                             while (not gui_helper.is_node_enabled(page.buttons_hor[next_id].node)) or
  467.                                   page.buttons_hor[next_id].ignore_on_vertical
  468.                             do
  469.                                 next_id = next_id - 1
  470.                                 if next_id < 1 then
  471.                                     next_id = #page.buttons_hor
  472.                                 end
  473.                                 if next_id == current_id then break end
  474.                             end
  475.                         end
  476.  
  477.                         next_focus = page.buttons_hor[next_id].node
  478.                     end
  479.                 end
  480.             end
  481.         end
  482.         if next_focus ~= nil then
  483.             madgui.refocus_on(page, next_focus)
  484.         end
  485.  
  486.         return
  487.     elseif (action_id == const.input_reload) and action.pressed then
  488.         page.enter_key_pressed = true
  489.         gui.set_color(page.focus, const.color_pressed)
  490.         gui.set_scale(page.focus, const.scale_pressed)
  491.     elseif (action_id == const.input_reload) and page.enter_key_pressed and action.released then
  492.         page.enter_key_pressed = false
  493.         gui_helper.change_property_smooth(page.focus, gui.PROP_SCALE, const.scale_normal, 0.15)
  494.         gui_helper.change_property_smooth(page.focus, gui.PROP_COLOR, const.color_white, 0.15)
  495.  
  496.         if page.focused == nil then
  497.             page.focused = page.buttons[1].node
  498.         end
  499.         local current_id = nil
  500.         for i = 1, #page.buttons do
  501.             if page.buttons[i].node == page.focused then
  502.                 current_id = i
  503.                 break
  504.             end
  505.         end
  506.  
  507.         if current_id ~= nil then
  508.             page.buttons[current_id].callback()
  509.         end
  510.     elseif (page.on_escape ~= nil) and
  511.            (action_id == const.input_escape) and
  512.            action.pressed
  513.     then
  514.         page.escape_key_pressed = true
  515.     elseif (page.on_escape ~= nil) and
  516.            (action_id == const.input_escape) and
  517.            page.escape_key_pressed and
  518.            action.released
  519.     then
  520.         page.on_escape()
  521.     end
  522.  
  523.     for i = 1, #page.buttons do
  524.         madgui.handle_button_input(page.buttons[i], action_id, action)
  525.     end
  526. end
  527.  
  528. function madgui.activate(page)
  529.     madgui.set_active_page_by_node(page.manager, page.node)
  530. end
  531.  
  532. function madgui.progress_bar(mask_node,
  533.                              min_value,
  534.                              initial_value,
  535.                              step)
  536.     gui_helper.slide_clipping_mask_on_alpha_immediate(mask_node, initial_value)
  537.     return {
  538.         mask_node = mask_node,
  539.         min_value = math.max(0.0, min_value),
  540.         progress  = lume.clamp(initial_value, math.max(0.0, min_value), 1.0),
  541.         step      = step
  542.     }
  543. end
  544.  
  545. function madgui.set_progress(progress_bar, value)
  546.     progress_bar.progress = lume.clamp(value, progress_bar.min_value, 1.0)
  547.     gui_helper.slide_clipping_mask_on_alpha(progress_bar.mask_node,
  548.                                             progress_bar.progress)
  549. end
  550.  
  551. function madgui.set_progress_immediate(progress_bar, value)
  552.     progress_bar.progress = lume.clamp(value, progress_bar.min_value, 1.0)
  553.     gui_helper.slide_clipping_mask_on_alpha_immediate(progress_bar.mask_node,
  554.                                                       progress_bar.progress)
  555. end
  556.  
  557. function madgui.increase_progress(progress_bar)
  558.     madgui.set_progress(progress_bar, progress_bar.progress + progress_bar.step)
  559. end
  560.  
  561. function madgui.decrease_progress(progress_bar)
  562.     madgui.set_progress(progress_bar, progress_bar.progress - progress_bar.step)
  563. end
  564.  
  565. return madgui
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement