Mercurial > wow > ouroloot
comparison options.lua @ 99:966d06c8d9c9
- Brought plugin handling code up to date. SVs are kept in DB namespaces
like they should have been.
- Removed/commented all datarev code, until it becomes necessary after MoP.
- Textgen special blocks for plugins do not automatically get a "reset&reload"
button anymore.
- New method to register option pages on the main tab. No sub-entry pages
supported yet. Titles and reset&reload added here instead.
| author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
|---|---|
| date | Sun, 29 Jul 2012 23:12:18 +0000 |
| parents | b5a55c69ef67 |
| children | a57133ee3c9b |
comparison
equal
deleted
inserted
replaced
| 98:b5a55c69ef67 | 99:966d06c8d9c9 |
|---|---|
| 21 -- [49426] = true, -- Emblem of Frost | 21 -- [49426] = true, -- Emblem of Frost |
| 22 } | 22 } |
| 23 | 23 |
| 24 -- Mark these as straight to guild vault: | 24 -- Mark these as straight to guild vault: |
| 25 addon.default_itemvault = { | 25 addon.default_itemvault = { |
| 26 [52078] = true, -- Chaos Orb | 26 [52078] = true, -- Chaos Orb (Cata heroics) |
| 27 [69237] = true, -- Living Ember | 27 [69237] = true, -- Living Ember (Cata Firelands) |
| 28 [71998] = true, -- Essence of Destruction | 28 [71998] = true, -- Essence of Destruction (Cata Dragon Soul) |
| 29 } | 29 } |
| 30 | 30 |
| 31 local options_tree = { | 31 local options_tree = { |
| 32 { | 32 { |
| 33 value = "pong", | 33 value = "pong", |
| 34 text = "Pongs", | 34 text = "Pongs", |
| 35 }, | 35 }, |
| 36 { | 36 { |
| 37 value = "basic", | 37 value = "basic", |
| 38 text = "Options", | 38 text = "Main Options", |
| 39 children = { | 39 children = { |
| 40 { | 40 { |
| 41 value = "filter", | 41 value = "filter", |
| 42 text = "Item Filters", | 42 text = "Item Filters", |
| 43 }, | 43 }, |
| 45 value = "profiles", | 45 value = "profiles", |
| 46 text = "Profiles", | 46 text = "Profiles", |
| 47 }, | 47 }, |
| 48 }, | 48 }, |
| 49 }, | 49 }, |
| 50 'NEW INSERTIONS HERE', -- commenting this puts them all at the bottom | |
| 50 { | 51 { |
| 51 value = "adv", | 52 value = "adv", |
| 52 text = "Advanced/Debugging", | 53 text = "Advanced/Debugging", |
| 53 }, | 54 }, |
| 54 } | 55 } |
| 62 local mkbutton = addon.gui_state_pointer.mkbutton | 63 local mkbutton = addon.gui_state_pointer.mkbutton |
| 63 local gui = addon.gui_state_pointer | 64 local gui = addon.gui_state_pointer |
| 64 local AceGUI = LibStub("AceGUI-3.0") | 65 local AceGUI = LibStub("AceGUI-3.0") |
| 65 local flib = LibStub("LibFarmbuyer") | 66 local flib = LibStub("LibFarmbuyer") |
| 66 local opts | 67 local opts |
| 68 | |
| 69 local error, assert = addon.error, addon.assert | |
| 67 | 70 |
| 68 local function mktoggle (opt, label, width, desc, opt_func) | 71 local function mktoggle (opt, label, width, desc, opt_func) |
| 69 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc) | 72 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc) |
| 70 w:SetRelativeWidth(width) | 73 w:SetRelativeWidth(width) |
| 71 w:SetType("checkbox") | 74 w:SetType("checkbox") |
| 681 --------------- | 684 --------------- |
| 682 -- Tab 6: Options | 685 -- Tab 6: Options |
| 683 do | 686 do |
| 684 local funkified = {} | 687 local funkified = {} |
| 685 for key,f in pairs(controls) do | 688 for key,f in pairs(controls) do |
| 686 -- this is how TreeGroup makes unique keys | 689 -- this is how TreeGroup makes unique keys out of nested entries |
| 687 local funkykey = key:gsub('_','\001') | 690 local funkykey = key:gsub('_','\001') |
| 688 funkified[funkykey] = { f } | 691 funkified[funkykey] = { f } |
| 689 end | 692 end |
| 690 controls = funkified | 693 controls = funkified |
| 691 end | 694 end |
| 699 for id in pairs(opts.itemfilter) do GetItemInfo(id) end | 702 for id in pairs(opts.itemfilter) do GetItemInfo(id) end |
| 700 for id in pairs(opts.itemvault) do GetItemInfo(id) end | 703 for id in pairs(opts.itemvault) do GetItemInfo(id) end |
| 701 preload = nil | 704 preload = nil |
| 702 end | 705 end |
| 703 | 706 |
| 704 -- Clicking an entry on the left tree column. | 707 local aceconfig_list = {} |
| 708 | |
| 709 -- Selecting an entry on the left tree column. | |
| 705 local opt_OnGroupSelected_func = function (treeg,event,category) | 710 local opt_OnGroupSelected_func = function (treeg,event,category) |
| 706 opts = addon.db.profile | 711 opts = addon.db.profile |
| 707 local catfuncs = controls[category] | 712 local catfuncs = controls[category] |
| 708 if not catfuncs then | 713 if not catfuncs then |
| 709 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_'))) | 714 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_'))) |
| 710 end | 715 end |
| 711 treeg:ReleaseChildren() | 716 treeg:ReleaseChildren() |
| 712 local sf = AceGUI:Create("ScrollFrame") | 717 if aceconfig_list[category] then |
| 713 sf:SetStatusTable(status_for_scroll) | 718 -- aceconfigdialog makes too many assumptions about scrolling |
| 714 sf:SetLayout("Flow") | 719 for _,func in ipairs(catfuncs) do |
| 715 -- This forces the scrolling area to be bigger than the visible area; else | 720 if func(treeg,category) then break end |
| 716 -- some of the text gets cut off without ever triggering the scrollbar. | 721 end |
| 717 sf.content:SetHeight(700) | |
| 718 for _,func in ipairs(catfuncs) do | |
| 719 if func(sf) then break end | |
| 720 end | |
| 721 treeg:AddChild(sf) | |
| 722 if treeg:GetUserData("options restore scroll") then | |
| 723 if status_for_scroll.scrollvalue then | |
| 724 sf:SetScroll(status_for_scroll.scrollvalue) | |
| 725 end | |
| 726 treeg:SetUserData("options restore scroll", false) | |
| 727 else | 722 else |
| 728 sf:SetScroll(0) | 723 local sf = AceGUI:Create("ScrollFrame") |
| 724 sf:SetStatusTable(status_for_scroll) | |
| 725 sf:SetLayout("Flow") | |
| 726 -- This forces the scrolling area to be bigger than the visible area; else | |
| 727 -- some of the text gets cut off without ever triggering the scrollbar. | |
| 728 sf.content:SetHeight(700) | |
| 729 for _,func in ipairs(catfuncs) do | |
| 730 if func(sf,category) then break end | |
| 731 end | |
| 732 treeg:AddChild(sf) | |
| 733 if treeg:GetUserData("options restore scroll") then | |
| 734 if status_for_scroll.scrollvalue then | |
| 735 sf:SetScroll(status_for_scroll.scrollvalue) | |
| 736 end | |
| 737 treeg:SetUserData("options restore scroll", false) | |
| 738 else | |
| 739 sf:SetScroll(0) | |
| 740 end | |
| 729 end | 741 end |
| 730 end | 742 end |
| 731 | 743 |
| 732 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]). | 744 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]). |
| 733 local tabs_OGS = function (container, specials) | 745 local tabs_OGS = function (container, specials) |
| 773 end | 785 end |
| 774 | 786 |
| 775 addon:register_tab_control_AT_END ("opt", [[Options]], | 787 addon:register_tab_control_AT_END ("opt", [[Options]], |
| 776 [[Options for fine-tuning behavior]], tabs_OGS) | 788 [[Options for fine-tuning behavior]], tabs_OGS) |
| 777 | 789 |
| 790 | |
| 791 --------------- | |
| 792 -- Registering new options entries | |
| 793 local insertion_index = #options_tree | |
| 794 for i = #options_tree, 1, -1 do | |
| 795 if options_tree[i] == 'NEW INSERTIONS HERE' then | |
| 796 insertion_index = i | |
| 797 break | |
| 798 end | |
| 799 end | |
| 800 if insertion_index then | |
| 801 table.remove (options_tree, insertion_index) | |
| 802 else | |
| 803 insertion_index = #options_tree + 1 | |
| 804 end | |
| 805 | |
| 806 | |
| 807 --[[ | |
| 808 PLUGIN is the module table itself. | |
| 809 PARENT is nil to register in the tree list directly. | |
| 810 TEXT is either the text to display in the tree list, or nil to use the | |
| 811 moduleName field out of PLUGIN (not :GetName()). | |
| 812 OPTIONS is either | |
| 813 I) a function to call directly | |
| 814 II) an aceconfig-style options table | |
| 815 | |
| 816 (I) Will augment options.args.name with coloring/sizing, if it exists. | |
| 817 (Set options.args.name.name before registering.) Will create it if not | |
| 818 present. | |
| 819 | |
| 820 (II) Title added unconditionally. Callback is | |
| 821 options (scrollframe_container, plugin, unique_code) | |
| 822 where UNIQUE_CODE is what's used by the TreeGroup widget in identifying | |
| 823 the "button" clicked in the lefthand tree list. | |
| 824 | |
| 825 Will append a reset button IFF an options database has been registered already. | |
| 826 ]] | |
| 827 function addon:register_options_entry (plugin, parent, text, options) | |
| 828 -- if this changes at all, fix up plugin_reset_button accordingly | |
| 829 local code = plugin:GetName() | |
| 830 --if parent | |
| 831 | |
| 832 text = text or plugin.moduleName | |
| 833 | |
| 834 local handler | |
| 835 local pdb = self.db:GetNamespace (plugin.moduleName, --[[silent=]]true) | |
| 836 if type(options) == 'table' then | |
| 837 -- AceConfig-style options table | |
| 838 aceconfig_list[code] = true | |
| 839 if not options.args.name then | |
| 840 options.args.name = { | |
| 841 name = plugin.moduleName, | |
| 842 type = 'description', | |
| 843 } | |
| 844 end | |
| 845 options.args.name.name = '|cff30adff' .. options.args.name.name .. '|r' | |
| 846 options.args.name.fontSize = 'large' | |
| 847 options.args.name.width = 'full' | |
| 848 options.args.name.cmdHidden = true | |
| 849 options.args.name.order = 1 | |
| 850 if pdb then | |
| 851 options.args.INSERTED_SPACER = { | |
| 852 name = '', | |
| 853 type = 'description', | |
| 854 cmdHidden = true, | |
| 855 width = 'full', | |
| 856 order = 9000, | |
| 857 } | |
| 858 options.args.RESET = { | |
| 859 name = "Reset", | |
| 860 desc = ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(plugin:GetName()), | |
| 861 type = 'execute', | |
| 862 func = function() | |
| 863 pdb:ResetProfile() | |
| 864 if IsShiftKeyDown() then ReloadUI() end | |
| 865 end, | |
| 866 order = 9001, | |
| 867 } | |
| 868 end | |
| 869 LibStub("AceConfig-3.0"):RegisterOptionsTable(plugin:GetName(), options) | |
| 870 handler = function (sf) | |
| 871 LibStub("AceConfigDialog-3.0"):Open (plugin:GetName(), sf) | |
| 872 end | |
| 873 | |
| 874 elseif type(options) == 'function' then | |
| 875 -- AceGUI callback | |
| 876 if pdb then | |
| 877 handler = function (sf) | |
| 878 sf:AddChildren(mktitle(text)) | |
| 879 local ret = options (sf, plugin, code) | |
| 880 local w = mkbutton("Reset", | |
| 881 ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(text)) | |
| 882 w:SetRelativeWidth(0.3) | |
| 883 w:SetCallback("OnClick", function(_w) | |
| 884 pdb:ResetProfile() | |
| 885 if IsShiftKeyDown() then ReloadUI() end | |
| 886 end) | |
| 887 sf:AddChildren(spacer(10),w) | |
| 888 return ret | |
| 889 end | |
| 890 else | |
| 891 handler = function (sf) | |
| 892 sf:AddChildren(mktitle(text)) | |
| 893 return options (sf, plugin, code) | |
| 894 end | |
| 895 end | |
| 896 | |
| 897 else | |
| 898 error(("Error: 'options' parameter for plugin '%s' is neither table nor function"):format(plugin:GetName())) | |
| 899 end | |
| 900 | |
| 901 if not controls[code] then | |
| 902 controls[code] = {} | |
| 903 end | |
| 904 table.insert (controls[code], handler) | |
| 905 | |
| 906 table.insert (options_tree, insertion_index, { | |
| 907 value = code, | |
| 908 text = text, -- maybe call markup on this? | |
| 909 }) | |
| 910 insertion_index = insertion_index + 1 | |
| 911 -- The treegroup will rescan options_tree (via RefreshTree) several times | |
| 912 -- before the player actually sees anything; no more work needs doing. | |
| 913 return -- something that can be used as 'parent' | |
| 914 end | |
| 915 | |
| 916 | |
| 778 -- vim:noet | 917 -- vim:noet |
