comparison gui.lua @ 57:81d5449621f8

Fix some sloppy indentation. Correct handling of delayed-load plugins registering multiple tabs in arbitrary order. Add option to not display tabs for disabled plugins (would normally allow enabling of them).
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Tue, 17 Apr 2012 04:57:06 +0000
parents fcc0d0ff5832
children 59718ec80610
comparison
equal deleted inserted replaced
56:fcc0d0ff5832 57:81d5449621f8
93 93
94 94
95 ------ Behind the scenes routines 95 ------ Behind the scenes routines
96 -- Text generation 96 -- Text generation
97 do 97 do
98 local next_insertion_position = 2 -- position in _taborder
99 local text_gen_funcs, specials_gen_funcs = {}, {} 98 local text_gen_funcs, specials_gen_funcs = {}, {}
100 local accumulator = {} 99 local accumulator = {}
101 100
102 -- Can do clever things by passing other halting points as zero 101 -- Can do clever things by passing other halting points as zero
103 function addon:zero_printed_fenceposts(zero) 102 function addon:zero_printed_fenceposts(zero)
114 function addon:register_text_generator (text_type, title, description, generator, opt_specgen) 113 function addon:register_text_generator (text_type, title, description, generator, opt_specgen)
115 if type(generator) ~= 'function' then 114 if type(generator) ~= 'function' then
116 error(("Generator for text type '%s' must be a function!"):format(text_type)) 115 error(("Generator for text type '%s' must be a function!"):format(text_type))
117 end 116 end
118 _tabtexts[text_type] = { title=title, desc=description } 117 _tabtexts[text_type] = { title=title, desc=description }
119 tinsert (_taborder, next_insertion_position, text_type) 118 self:tabposition_insert (text_type)
120 next_insertion_position = next_insertion_position + 1
121 text_gen_funcs[text_type] = generator 119 text_gen_funcs[text_type] = generator
122 specials_gen_funcs[text_type] = opt_specgen 120 specials_gen_funcs[text_type] = opt_specgen
123 dirty_tabs = true 121 dirty_tabs = true
124 end 122 end
125 123
157 -- LOD tab has been clicked on. 155 -- LOD tab has been clicked on.
158 local function _handle_LOD (tabs_container,specials,tabtitle) 156 local function _handle_LOD (tabs_container,specials,tabtitle)
159 -- "tabtitle" here is the name in _taborder, not the colorized string 157 -- "tabtitle" here is the name in _taborder, not the colorized string
160 local what = _tabtexts[tabtitle] 158 local what = _tabtexts[tabtitle]
161 local addon_index = what.LOD 159 local addon_index = what.LOD
162 local loaded_at = what.loaded_at
163 local real_nip = next_insertion_position
164 local function LOAD() 160 local function LOAD()
165 _tabtexts[tabtitle] = nil 161 _tabtexts[tabtitle] = nil
166 tremove (_taborder, loaded_at) 162 addon:tabposition_remove_and_remember (tabtitle)
167 next_insertion_position = loaded_at
168 local saved_next_insertion_position = loaded_at
169 local loaded, whynot = LoadAddOn(addon_index) 163 local loaded, whynot = LoadAddOn(addon_index)
164 local tabdelta = addon:tabposition_restore()
170 if loaded then 165 if loaded then
171 addon:Print("%s loaded. %d |4tab:tabs; added.", tabtitle, 166 addon:Print("%s loaded, %d |4tab:tabs; added.", tabtitle, tabdelta)
172 next_insertion_position - saved_next_insertion_position)
173 else 167 else
174 what.disabled = true 168 what.disabled = true
175 _tabtexts[tabtitle] = what -- restore this for mouseovers 169 _tabtexts[tabtitle] = what -- restore this for mouseovers
176 addon:Print("%s could not load (game client reason was '%s').", tabtitle, whynot) 170 addon:Print("%s could not load (game client reason was '%s').", tabtitle, whynot)
177 DisableAddOn(addon_index) 171 DisableAddOn(addon_index)
178 end 172 end
179 next_insertion_position = real_nip
180 dirty_tabs = true 173 dirty_tabs = true
181 return addon:OpenMainDisplayToTab(tabtitle) or addon:BuildMainDisplay() 174 return addon:OpenMainDisplayToTab(tabtitle) or addon:BuildMainDisplay()
182 end 175 end
183 addon.display:Hide() 176 addon.display:Hide()
184 if what.LOD_enabled then 177 if what.LOD_enabled then
185 -- totally loadable, go for it 178 -- totally loadable, go for it
186 LOAD() 179 LOAD()
187 else 180 else
188 -- was disabled at addons menu 181 -- was disabled at addons menu
189 StaticPopupDialogs["OUROL_LOD_DISABLED"] = flib.StaticPopup{ 182 StaticPopupDialogs["OUROL_LOD_DISABLED"] = flib.StaticPopup{
190 text = tabtitle.." was disabled at the character loading screen. Do you want to enable it?", 183 text = tabtitle.." was disabled at the character selection screen. Do you want to enable it?",
191 button1 = YES, 184 button1 = YES,
192 button2 = NO, 185 button2 = NO,
193 OnAccept = function() 186 OnAccept = function()
194 EnableAddOn(addon_index) 187 EnableAddOn(addon_index)
195 LOAD() 188 LOAD()
209 -- already been called, we flag the dirty bit and let the main building 202 -- already been called, we flag the dirty bit and let the main building
210 -- routine handle it like any other plugin. 203 -- routine handle it like any other plugin.
211 function addon:_gui_add_LOD_tab (tabtitle, folder, addon_index, enabled_p, why_not) 204 function addon:_gui_add_LOD_tab (tabtitle, folder, addon_index, enabled_p, why_not)
212 _tabtexts[tabtitle] = { 205 _tabtexts[tabtitle] = {
213 title = ("|cffff0000(%s)|r"):format(tabtitle), 206 title = ("|cffff0000(%s)|r"):format(tabtitle),
214 desc = ("'|cffff0000%s|r' is not loaded yet. Click the tab to load it now."):format(folder), 207 desc = ("Plugin '|cffff0000%s|r' is not loaded yet. Click the tab to load it now."):format(folder),
215 LOD = addon_index, 208 LOD = addon_index,
216 LOD_enabled = enabled_p, 209 LOD_enabled = enabled_p,
217 LOD_why_not = why_not, 210 LOD_why_not = why_not,
218 loaded_at = next_insertion_position,
219 } 211 }
220 tabs_OnGroupSelected[tabtitle] = _handle_LOD 212 tabs_OnGroupSelected[tabtitle] = _handle_LOD
221 tinsert (_taborder, next_insertion_position, tabtitle) 213 self:tabposition_insert (tabtitle)
222 next_insertion_position = next_insertion_position + 1
223 dirty_tabs = true 214 dirty_tabs = true
224 end 215 end
225 end 216 end
226 217
227 --[[ 218 --[[
415 local tabgroup_tabs 406 local tabgroup_tabs
416 407
417 --[[ 408 --[[
418 Controls for the tabs on the left side of the main display. 409 Controls for the tabs on the left side of the main display.
419 ]] 410 ]]
411
412 -- The _tabtexts and _taborder tables have distressingly wide visibility.
413 -- They are used to build the tabgroup_tabs array fed to TabGroup, and for the
414 -- official source of mouseover tab titles, etc. Not completely encapsulated
415 -- because we need to reach in and fiddle too often to be worth it.
420 _tabtexts = { 416 _tabtexts = {
421 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]}, 417 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]},
422 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]}, 418 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]},
423 ["help"] = {title=[[Help]], desc=[[Instructions, reminders, and tips for non-obvious features]]}, 419 ["help"] = {title=[[Help]], desc=[[Instructions, reminders, and tips for non-obvious features]]},
424 ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]}, 420 ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]},
426 } 422 }
427 --if addon.author_debug then 423 --if addon.author_debug then
428 _taborder = { "eoi", "hist", "help", "opt" } 424 _taborder = { "eoi", "hist", "help", "opt" }
429 --else _taborder = { "eoi", "help", "opt" } end 425 --else _taborder = { "eoi", "help", "opt" } end
430 426
427 do
428 local next_insertion_position = 2 -- position in _taborder
429 local removed, saved_offset
430
431 function addon:tabposition_insert (tabcode)
432 tinsert (_taborder, next_insertion_position, tabcode)
433 next_insertion_position = next_insertion_position + 1
434 end
435
436 -- These two functions are push/pop pairs, sort of. The first removes
437 -- a tab and prepares to insert more tab(s) in its place. The second
438 -- returns the "next tab goes here" marker back to the proper end. (And
439 -- doing all 3 adjustments below at once is amazingly hard to read.)
440 function addon:tabposition_remove_and_remember (tabcode)
441 assert(not removed) -- enforce stack-ish discipline
442 for i = 2, #_taborder do
443 if _taborder[i] == tabcode then
444 tremove (_taborder, i)
445 saved_offset = next_insertion_position - i - 1
446 removed, next_insertion_position = i, i
447 return
448 end
449 end
450 error(("'%s' not used as a tab-text code"):format(tabcode))
451 end
452 function addon:tabposition_restore()
453 assert(removed)
454 local count = next_insertion_position - removed
455 next_insertion_position = next_insertion_position + saved_offset
456 removed, saved_offset = nil, nil
457 return count
458 end
459 end
460
461
462 -- Done at startup, and whenever we've changed the population of tabs.
431 function addon:gui_init (loot_pointer) 463 function addon:gui_init (loot_pointer)
432 g_loot = loot_pointer 464 g_loot = loot_pointer
433 g_generated = nil 465 g_generated = nil
434 tabgroup_tabs = {} 466 tabgroup_tabs = {}
435 window_title = "Ouro Loot " .. self.revision 467 window_title = "Ouro Loot " .. self.revision
1688 -- cutesy abbrevs 1720 -- cutesy abbrevs
1689 w = mkoption('snarky_boss', "Use snarky boss names", 0.49, 1721 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
1690 [[Irreverent replacement names for boss events.]]) 1722 [[Irreverent replacement names for boss events.]])
1691 grp:AddChild(w) 1723 grp:AddChild(w)
1692 1724
1725 -- LOD plugins in all cases
1726 w = mkoption('display_disabled_LODs', "Include disabled plugins", 0.49,
1727 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]])
1728 grp:AddChild(w)
1729
1693 -- possible keybindings 1730 -- possible keybindings
1694 do 1731 do
1695 local pair = GUI:Create("SimpleGroup") 1732 local pair = GUI:Create("SimpleGroup")
1696 pair:SetLayout("Flow") 1733 pair:SetLayout("Flow")
1697 pair:SetRelativeWidth(0.95) 1734 pair:SetRelativeWidth(0.95)