GMX_menu

A simple userscript menu manager, treats all menu items as a GMX_menu object.

بۇ قوليازمىنى بىۋاسىتە قاچىلاشقا بولمايدۇ. بۇ باشقا قوليازمىلارنىڭ ئىشلىتىشى ئۈچۈن تەمىنلەنگەن ئامبار بولۇپ، ئىشلىتىش ئۈچۈن مېتا كۆرسەتمىسىگە قىستۇرىدىغان كود: // @require https://update.greatest.deepsurf.us/scripts/473817/1240400/GMX_menu.js

  1. // ==UserScript==
  2. // @name GMX_menu
  3. // @namespace https://greatest.deepsurf.us/users/1001518
  4. // @version 0.1.1
  5. // @description A simple userscript menu manager, treats all menu items as a GMX_menu object.
  6. // @author DianaBlessU
  7. // @grant GM_registerMenuCommand
  8. // @grant GM_unregisterMenuCommand
  9. // ==/UserScript==
  10.  
  11. class GMX_Menu{
  12.  
  13. items = [];
  14. item_ids = [];
  15. auto_refresh = true;
  16.  
  17. constructor(options) {
  18. if (options) this.install(options)
  19. }
  20.  
  21. install(options){
  22. if (options){
  23. this.auto_refresh = options.autoRefresh ?? true;
  24. this.items = options.items ?? [];
  25. this.refresh();
  26. }
  27. }
  28.  
  29. uninstall(){
  30. this.items = [];
  31. this.refresh();
  32. }
  33.  
  34. refresh(){
  35. this.item_ids.forEach(id => GM_unregisterMenuCommand(id));
  36. this.item_ids = [];
  37. this.items.forEach(item => {
  38. if (item.separator){
  39. let item_str = "➖➖➖➖➖➖➖➖➖➖"
  40. this.item_ids.push(GM_registerMenuCommand(item_str))
  41. }else{
  42. let item_str = (item.checked==null) ? `${item.text}` : `${item.checked ? '✅':'🟩'} ${item.text}`
  43. this.item_ids.push(GM_registerMenuCommand(item_str, event => this.triggerSelect(item.name, event)));
  44. }
  45. })
  46. }
  47.  
  48. getItem(name){
  49. return this.items.filter(item => item.name == name)[0]
  50. }
  51.  
  52. renderSelect(name){
  53. let item = this.getItem(name);
  54. if (!item) throw new ReferenceError(`No items named '${name}'`)
  55. let refresh_needed = false;
  56. if (item.checked != null){
  57. if (item.group != null && item.checked == false){
  58. this.items.forEach(co_item => {
  59. if (co_item.group == item.group) co_item.checked = false
  60. })
  61. item.checked = true;
  62. refresh_needed = true;
  63. } else if (item.group == null) {
  64. item.checked = !item.checked;
  65. refresh_needed = true;
  66. }
  67. }
  68. if (refresh_needed && this.auto_refresh) {
  69. this.refresh();
  70. }
  71. return item.checked
  72. }
  73.  
  74. triggerSelect(name, event){
  75. let item = this.getItem(name);
  76. if (!item) throw new ReferenceError(`No items named '${name}'`)
  77. this.renderSelect(name);
  78. item.callback(event);
  79. }
  80.  
  81. setText(name, text) {
  82. let item = this.getItem(name);
  83. if (!item) throw new ReferenceError(`No items named '${name}'`)
  84. item.text = text;
  85. if (this.auto_refresh){
  86. this.refresh();
  87. }
  88. }
  89.  
  90. isChecked(name){
  91. let item = this.getItem(name);
  92. if (!item) throw new ReferenceError(`No items named '${name}'`)
  93. return item.checked;
  94. }
  95.  
  96. }
  97.  
  98. window.GMX_menu = new GMX_Menu();