category.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. local S = minetest.get_translator("unified_inventory")
  2. unified_inventory.registered_categories = {}
  3. unified_inventory.registered_category_items = {}
  4. unified_inventory.category_list = {}
  5. local function char_to_sort_index(char_code)
  6. if char_code <= 32 then
  7. -- Command codes, no thanks
  8. return 0
  9. end
  10. if char_code <= 64 then
  11. -- Sorts numbers, and some punctuation, after letters
  12. return char_code
  13. end
  14. if char_code >= 158 then
  15. -- Out of sortable range
  16. return 0
  17. end
  18. if char_code > 122 then
  19. -- Avoids overlap with {, |, } and ~
  20. return char_code - 58
  21. end
  22. if char_code > 96 then
  23. -- Normalises lowercase with uppercase
  24. return char_code - 96
  25. end
  26. return char_code - 64
  27. end
  28. local function string_to_sort_index(str)
  29. local max_chars = 5
  30. local power = 100
  31. local index = 0
  32. for i=1,math.min(#str, max_chars) do
  33. index = index + (char_to_sort_index(string.byte(str, i))/(power^i))
  34. end
  35. return index
  36. end
  37. function update_category_list()
  38. local category_list = {}
  39. table.insert(category_list, {
  40. name = "all",
  41. label = S("All Items"),
  42. symbol = "ui_category_all.png",
  43. index = -2,
  44. })
  45. table.insert(category_list, {
  46. name = "uncategorized",
  47. label = S("Misc. Items"),
  48. symbol = "ui_category_none.png",
  49. index = -1,
  50. })
  51. for category, def in pairs(unified_inventory.registered_categories) do
  52. table.insert(category_list, {
  53. name = category,
  54. label = def.label or category,
  55. symbol = def.symbol,
  56. index = def.index or -- sortby defined order
  57. string_to_sort_index(category) -- or do a rudimentary alphabetical sort
  58. })
  59. end
  60. table.sort(category_list, function (a,b)
  61. return a.index < b.index
  62. end)
  63. unified_inventory.category_list = category_list
  64. end
  65. local function ensure_category_exists(category_name)
  66. if not unified_inventory.registered_categories[category_name] then
  67. unified_inventory.registered_categories[category_name] = {
  68. symbol = "unknown_item.png",
  69. label = category_name
  70. }
  71. end
  72. if not unified_inventory.registered_category_items[category_name] then
  73. unified_inventory.registered_category_items[category_name] = {}
  74. end
  75. end
  76. function unified_inventory.register_category(category_name, config)
  77. ensure_category_exists(category_name)
  78. config = config or {}
  79. if config.symbol then
  80. unified_inventory.set_category_symbol(category_name, config.symbol)
  81. end
  82. if config.label then
  83. unified_inventory.set_category_label(category_name, config.label)
  84. end
  85. if config.index then
  86. unified_inventory.set_category_index(category_name, config.index)
  87. end
  88. if config.items then
  89. unified_inventory.add_category_items(category_name, config.items)
  90. end
  91. update_category_list()
  92. end
  93. function unified_inventory.set_category_symbol(category_name, symbol)
  94. ensure_category_exists(category_name)
  95. unified_inventory.registered_categories[category_name].symbol = symbol
  96. update_category_list()
  97. end
  98. function unified_inventory.set_category_label(category_name, label)
  99. ensure_category_exists(category_name)
  100. unified_inventory.registered_categories[category_name].label = label
  101. update_category_list()
  102. end
  103. function unified_inventory.set_category_index(category_name, index)
  104. ensure_category_exists(category_name)
  105. unified_inventory.registered_categories[category_name].index = index
  106. update_category_list()
  107. end
  108. function unified_inventory.add_category_item(category_name, item)
  109. ensure_category_exists(category_name)
  110. unified_inventory.registered_category_items[category_name][item] = true
  111. end
  112. function unified_inventory.add_category_items(category_name, items)
  113. for _,item in ipairs(items) do
  114. unified_inventory.add_category_item(category_name, item)
  115. end
  116. end
  117. function unified_inventory.remove_category_item(category_name, item)
  118. unified_inventory.registered_category_items[category_name][item] = nil
  119. end
  120. function unified_inventory.remove_category(category_name)
  121. unified_inventory.registered_categories[category_name] = nil
  122. unified_inventory.registered_category_items[category_name] = nil
  123. update_category_list()
  124. end
  125. function unified_inventory.find_category(item)
  126. -- Returns the first category the item exists in
  127. -- Best for checking if an item has any category at all
  128. for category, items in pairs(unified_inventory.registered_category_items) do
  129. if items[item] then return category end
  130. end
  131. end
  132. function unified_inventory.find_categories(item)
  133. -- Returns all the categories the item exists in
  134. -- Best for listing all categories
  135. local categories = {}
  136. for category, items in pairs(unified_inventory.registered_category_items) do
  137. if items[item] then
  138. table.insert(categories, category)
  139. end
  140. end
  141. return categories
  142. end