comparison gui.lua @ 37:cd745a18d7c7

Mostly code cosmetic tweaks. Split up EOI and History dropdown tables. Draw attention to realm names in popups, as they don't have to match the currently-played realm.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Sat, 10 Dec 2011 01:04:16 +0000
parents f62d582c5c52
children 8f7ec6ccf5e3
comparison
equal deleted inserted replaced
36:f62d582c5c52 37:cd745a18d7c7
56 local _tabtexts, _taborder -- filled out in gui block scope 56 local _tabtexts, _taborder -- filled out in gui block scope
57 57
58 -- Working around this bug: 58 -- Working around this bug:
59 -- http://forums.wowace.com/showpost.php?p=295202&postcount=31 59 -- http://forums.wowace.com/showpost.php?p=295202&postcount=31
60 do 60 do
61 local function FixFrameLevel (level, ...) 61 local function fix_frame_level (level, ...)
62 for i = 1, select("#", ...) do 62 for i = 1, select("#", ...) do
63 local button = select(i, ...) 63 local button = select(i, ...)
64 button:SetFrameLevel(level) 64 button:SetFrameLevel(level)
65 end 65 end
66 end 66 end
67 67
68 local function FixMenuFrameLevels() 68 local function fix_menu_frame_levels()
69 local f = DropDownList1 69 local f = _G.DropDownList1
70 local i = 1 70 local i = 1
71 while f do 71 while f do
72 FixFrameLevel (f:GetFrameLevel() + 2, f:GetChildren()) 72 fix_frame_level (f:GetFrameLevel() + 2, f:GetChildren())
73 i = i + 1 73 i = i + 1
74 f = _G["DropDownList"..i] 74 f = _G["DropDownList"..i]
75 end 75 end
76 end 76 end
77 77
78 -- To fix Blizzard's bug caused by the new "self:SetFrameLevel(2);" 78 -- To fix Blizzard's bug caused by the new "self:SetFrameLevel(2);"
79 hooksecurefunc("UIDropDownMenu_CreateFrames", FixMenuFrameLevels) 79 hooksecurefunc("UIDropDownMenu_CreateFrames", fix_menu_frame_levels)
80 end 80 end
81 81
82 82
83 ------ Behind the scenes routines 83 ------ Behind the scenes routines
84 -- Text generation 84 -- Text generation
324 324
325 end 325 end
326 326
327 327
328 ------ Main GUI Window 328 ------ Main GUI Window
329 -- Lots of shared data here, kept in a large local scope. For readability, 329 local _d -- display when it's open, eoiST when it's not
330 -- indentation of the scope as a whole is kicked left a notch.
331 do
332 local _d
333 local function setstatus(txt) _d:SetStatusText(txt) end 330 local function setstatus(txt) _d:SetStatusText(txt) end
334 local function statusy_OnLeave() setstatus("") end 331 local function statusy_OnLeave() setstatus("") end
335 local tabgroup_tabs 332 local tabgroup_tabs
336 333
337 --[[ 334 --[[
370 tabs_OnGroupSelected[v] = tabs_generated_text_OGS 367 tabs_OnGroupSelected[v] = tabs_generated_text_OGS
371 end 368 end
372 end 369 end
373 end 370 end
374 371
375 -- Tab 1: Events Of Interest 372 --[[
376 -- This actually takes up quite a bit of the file. 373 Dropdown menu handling
374 ]]
375 -- forward decls
377 local eoi_editcell 376 local eoi_editcell
377
378 local dropdownfuncs
379 do
380 local ddf_mt = {
381 __index = {
382 -- more stuff should be moved into this table
383 [CLOSE] = function() CloseDropDownMenus() end,
384 }
385 }
386 dropdownfuncs = function(t)
387 return setmetatable(t, ddf_mt)
388 end
389 end
378 390
379 local function dropdownmenu_handler (ddbutton, subfunc, arg) 391 local function dropdownmenu_handler (ddbutton, subfunc, arg)
380 local i = _d and _d.GetUserData and _d:GetUserData("DD loot index") 392 local i = _d and _d.GetUserData and _d:GetUserData("DD loot index")
381 if i then 393 if i then
382 subfunc(i,arg) 394 subfunc(i,arg)
412 end 424 end
413 return initial 425 return initial
414 end 426 end
415 427
416 local dropdownmenuframe = CreateFrame("Frame", "OuroLootDropDownMenu", nil, "UIDropDownMenuTemplate") 428 local dropdownmenuframe = CreateFrame("Frame", "OuroLootDropDownMenu", nil, "UIDropDownMenuTemplate")
417 local dropdownfuncs 429
418 dropdownfuncs = { 430
419 [CLOSE] = function() CloseDropDownMenus() end, 431 -- Tab 1: Events Of Interest
420 432 -- This actually takes up quite a bit of the file.
433 local eoi_dropdownfuncs
434 eoi_dropdownfuncs = dropdownfuncs{
421 df_INSERT = function(rowi,text) 435 df_INSERT = function(rowi,text)
422 local which = (text == 'loot') and "OUROL_EOI_INSERT_LOOT" or "OUROL_EOI_INSERT" 436 local which = (text == 'loot') and "OUROL_EOI_INSERT_LOOT" or "OUROL_EOI_INSERT"
423 local dialog = StaticPopup_Show(which,text) 437 local dialog = StaticPopup_Show(which,text)
424 dialog.editBox:SetScript("OnTextChanged",StaticPopup_EditBoxOnTextChanged) 438 dialog.editBox:SetScript("OnTextChanged",StaticPopup_EditBoxOnTextChanged)
425 dialog.data = {rowindex=rowi, display=_d, kind=text} 439 dialog.data = {rowindex=rowi, display=_d, kind=text}
432 if gone.kind == 'loot' and IsShiftKeyDown() then 446 if gone.kind == 'loot' and IsShiftKeyDown() then
433 addon:_delHistoryEntry (rowi, gone) 447 addon:_delHistoryEntry (rowi, gone)
434 end 448 end
435 end, 449 end,
436 450
437 ["Delete this history event"] = function(rowi)
438 --local gone = tremove(g_loot,rowi)
439 --addon:Print("Removed %s.",
440 --gone.itemlink or gone.bosskill or gone.startday.text)
441 end,
442
443 ["Delete remaining entries for this day"] = function(rowi,kind) 451 ["Delete remaining entries for this day"] = function(rowi,kind)
444 -- if kind is boss, also need to stop at new timestamp 452 -- if kind is boss, also need to stop at new timestamp
445 local fencepost = addon._find_timeboss_fencepost (kind, rowi) 453 local fencepost = addon._find_timeboss_fencepost (kind, rowi)
446 local count = fencepost and (fencepost-rowi) or (#g_loot-rowi+1) 454 local count = fencepost and (fencepost-rowi) or (#g_loot-rowi+1)
447 repeat 455 repeat
448 dropdownfuncs.df_DELETE(rowi) 456 eoi_dropdownfuncs.df_DELETE(rowi)
449 count = count - 1 457 count = count - 1
450 until count < 1 458 until count < 1
451 end, 459 end,
452 460
453 ["Rebroadcast this loot entry"] = function(rowi) 461 ["Rebroadcast this loot entry"] = function(rowi)
510 dialog.data = {index=rowi, display=_d} 518 dialog.data = {index=rowi, display=_d}
511 end, 519 end,
512 } 520 }
513 -- Would be better to move the %arg to this list rather than below, but 521 -- Would be better to move the %arg to this list rather than below, but
514 -- that's a lot of extra effort that doesn't buy much in return. 522 -- that's a lot of extra effort that doesn't buy much in return.
515 dropdownfuncs["Delete this loot event"] = dropdownfuncs.df_DELETE 523 eoi_dropdownfuncs["Delete this loot event"] = eoi_dropdownfuncs.df_DELETE
516 dropdownfuncs["Delete this boss event"] = dropdownfuncs.df_DELETE 524 eoi_dropdownfuncs["Delete this boss event"] = eoi_dropdownfuncs.df_DELETE
517 dropdownfuncs["Insert new loot entry"] = dropdownfuncs.df_INSERT 525 eoi_dropdownfuncs["Insert new loot entry"] = eoi_dropdownfuncs.df_INSERT
518 dropdownfuncs["Insert new boss kill event"] = dropdownfuncs.df_INSERT 526 eoi_dropdownfuncs["Insert new boss kill event"] = eoi_dropdownfuncs.df_INSERT
519 dropdownfuncs["Mark as disenchanted"] = dropdownfuncs["Mark as normal"] 527 eoi_dropdownfuncs["Mark as disenchanted"] = eoi_dropdownfuncs["Mark as normal"]
520 dropdownfuncs["Mark as guild vault"] = dropdownfuncs["Mark as normal"] 528 eoi_dropdownfuncs["Mark as guild vault"] = eoi_dropdownfuncs["Mark as normal"]
521 dropdownfuncs["Mark as offspec"] = dropdownfuncs["Mark as normal"] 529 eoi_dropdownfuncs["Mark as offspec"] = eoi_dropdownfuncs["Mark as normal"]
522 dropdownfuncs["Delete remaining entries for this boss"] = dropdownfuncs["Delete remaining entries for this day"] 530 eoi_dropdownfuncs["Delete remaining entries for this boss"] =
523 dropdownfuncs["Rebroadcast this day"] = dropdownfuncs["Rebroadcast this boss"] 531 eoi_dropdownfuncs["Delete remaining entries for this day"]
532 eoi_dropdownfuncs["Rebroadcast this day"] = eoi_dropdownfuncs["Rebroadcast this boss"]
524 local eoi_time_dropdown = gen_easymenu_table( 533 local eoi_time_dropdown = gen_easymenu_table(
525 {{ 534 {{
526 -- this is the dropdown title, text filled in on the fly 535 -- this is the dropdown title, text filled in on the fly
527 isTitle = true, 536 isTitle = true,
528 notClickable = true, 537 notClickable = true,
532 "Rebroadcast this day%time|Broadcasts everything from here down until a new day.", 541 "Rebroadcast this day%time|Broadcasts everything from here down until a new day.",
533 "Delete remaining entries for this day%time|Erases everything from here down until a new day.", 542 "Delete remaining entries for this day%time|Erases everything from here down until a new day.",
534 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.", 543 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
535 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.", 544 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
536 CLOSE 545 CLOSE
537 }, dropdownfuncs) 546 }, eoi_dropdownfuncs)
538 local eoi_loot_dropdown = gen_easymenu_table( 547 local eoi_loot_dropdown = gen_easymenu_table(
539 {{ 548 {{
540 -- this is the dropdown title, text filled in on the fly 549 -- this is the dropdown title, text filled in on the fly
541 notClickable = true, 550 notClickable = true,
542 notCheckable = true, 551 notCheckable = true,
553 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.", 562 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
554 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.", 563 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
555 "Edit note|Same as double-clicking in the notes column.", 564 "Edit note|Same as double-clicking in the notes column.",
556 "--", 565 "--",
557 CLOSE 566 CLOSE
558 }, dropdownfuncs) 567 }, eoi_dropdownfuncs)
559 local eoi_player_dropdown = gen_easymenu_table( 568 local eoi_player_dropdown = gen_easymenu_table(
560 { 569 {
561 { 570 {
562 -- this is the dropdown title, text filled in on the fly 571 -- this is the dropdown title, text filled in on the fly
563 isTitle = true, 572 isTitle = true,
573 }, 582 },
574 }, 583 },
575 { 584 {
576 "Show only this player", 585 "Show only this player",
577 CLOSE 586 CLOSE
578 }, dropdownfuncs) 587 }, eoi_dropdownfuncs)
579 local eoi_boss_dropdown = gen_easymenu_table( 588 local eoi_boss_dropdown = gen_easymenu_table(
580 {{ 589 {{
581 -- this is the dropdown title, text filled in on the fly 590 -- this is the dropdown title, text filled in on the fly
582 isTitle = true, 591 isTitle = true,
583 notClickable = true, 592 notClickable = true,
590 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.", 599 "Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day.",
591 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.", 600 "Insert new loot entry%loot|Inserts new loot above this one, prompting you for information.",
592 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.", 601 "Insert new boss kill event%boss|Inserts new event above this one, prompting you for information.",
593 "--", 602 "--",
594 CLOSE 603 CLOSE
595 }, dropdownfuncs) 604 }, eoi_dropdownfuncs)
596 local hist_dropdown = gen_easymenu_table(
597 {{
598 -- this is the dropdown title, text filled in on the fly
599 notClickable = true,
600 notCheckable = true,
601 }},
602 {
603 "Delete this history event|Permanent, no going back!",
604 --"Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day",
605 "--",
606 CLOSE
607 }, dropdownfuncs)
608 605
609 --[[ quoted verbatim from lib-st docs: 606 --[[ quoted verbatim from lib-st docs:
610 rowFrame This is the UI Frame table for the row. 607 rowFrame This is the UI Frame table for the row.
611 cellFrame This is the UI Frame table for the cell in the row. 608 cellFrame This is the UI Frame table for the cell in the row.
612 data This is the data table supplied to the scrolling table (in case you lost it :) ) 609 data This is the data table supplied to the scrolling table (in case you lost it :) )
706 for i = 1, #raiders do 703 for i = 1, #raiders do
707 local name = raiders[i] 704 local name = raiders[i]
708 raiders[i] = { 705 raiders[i] = {
709 text = name, 706 text = name,
710 func = dropdownmenu_handler, 707 func = dropdownmenu_handler,
711 arg1 = dropdownfuncs.df_REASSIGN, 708 arg1 = eoi_dropdownfuncs.df_REASSIGN,
712 arg2 = name, 709 arg2 = name,
713 notCheckable = true, 710 notCheckable = true,
714 } 711 }
715 end 712 end
716 eoi_player_dropdown[2].menuList = 713 eoi_player_dropdown[2].menuList =
717 gen_easymenu_table (raiders, {"Enter name...",CLOSE}, dropdownfuncs) 714 gen_easymenu_table (raiders, {"Enter name...",CLOSE}, eoi_dropdownfuncs)
718 if e.disposition == 'shard' or e.disposition == 'gvault' then 715 if e.disposition == 'shard' or e.disposition == 'gvault' then
719 eoi_player_dropdown[2].disabled = true 716 eoi_player_dropdown[2].disabled = true
720 eoi_player_dropdown[2].tooltipTitle = "Cannot Reassign" 717 eoi_player_dropdown[2].tooltipTitle = "Cannot Reassign"
721 eoi_player_dropdown[2].tooltipText = "You must first mark this item as 'normal' or 'offspec' before reassignment." 718 eoi_player_dropdown[2].tooltipText = "You must first mark this item as 'normal' or 'offspec' before reassignment."
722 else 719 else
1001 end 998 end
1002 -- ...and call it. 999 -- ...and call it.
1003 return tabs_OnGroupSelected["eoi"](ocontainer,specials) 1000 return tabs_OnGroupSelected["eoi"](ocontainer,specials)
1004 end 1001 end
1005 1002
1003
1006 -- Tab 2/3 (generated text) 1004 -- Tab 2/3 (generated text)
1007 function tabs_generated_text_OGS (container, specials, text_kind) 1005 function tabs_generated_text_OGS (container, specials, text_kind)
1008 container:SetLayout("Fill") 1006 container:SetLayout("Fill")
1009 local box = GUI:Create("MultiLineEditBox") 1007 local box = GUI:Create("MultiLineEditBox")
1010 box:SetFullWidth(true) 1008 box:SetFullWidth(true)
1052 end) 1050 end)
1053 specials:AddChild(w) 1051 specials:AddChild(w)
1054 _populate_text_specials (box, specials, mkbutton, text_kind) 1052 _populate_text_specials (box, specials, mkbutton, text_kind)
1055 end 1053 end
1056 1054
1055
1057 -- Tab 4: History 1056 -- Tab 4: History
1058 -- Much of the implementation here follows a similar desgin for the first 1057 -- Much of the implementation here follows a similar desgin for the first
1059 -- tab's handling of ST objects. We will even reuse its controlling tables 1058 -- tab's handling of ST objects. We will even reuse its controlling tables
1060 -- when feasible. 1059 -- when feasible.
1061 do 1060 local histST, hist_dropdownfuncs
1062 local histST 1061
1063 local hist_st_cols = { 1062 hist_dropdownfuncs = dropdownfuncs{
1064 { -- col 1 1063 ["Delete this loot history"] = function(rowi)
1065 name = "Player", 1064 --local gone = tremove(g_loot,rowi)
1066 width = 130, 1065 --addon:Print("Removed %s.",
1067 DoCellUpdate = eoi_st_col2_DoCellUpdate, 1066 --gone.itemlink or gone.bosskill or gone.startday.text)
1068 }, 1067 end,
1069 { -- col 2 1068 }
1070 name = "Most Recent Loot", 1069 local hist_dropdown = gen_easymenu_table(
1071 width = 250, 1070 {{
1072 DoCellUpdate = hist_st_col2_DoCellUpdate, 1071 -- this is the dropdown title, text filled in on the fly
1073 }, 1072 notClickable = true,
1074 { -- col 3 1073 notCheckable = true,
1075 name = "When", 1074 }},
1076 width = 250, 1075 {
1077 DoCellUpdate = hist_st_col3_DoCellUpdate, 1076 "Delete this loot history|Permanent, no going back!",
1078 defaultsort = "asc", 1077 --"Delete remaining entries for this boss%boss|Erases everything from here down until a new boss/day",
1079 sort = "asc", 1078 "--",
1080 sortnext = 1, 1079 CLOSE
1081 }, 1080 }, hist_dropdownfuncs)
1081
1082 local hist_st_cols = {
1083 { -- col 1
1084 name = "Player",
1085 width = 130,
1086 DoCellUpdate = eoi_st_col2_DoCellUpdate,
1087 },
1088 { -- col 2
1089 name = "Most Recent Loot",
1090 width = 250,
1091 DoCellUpdate = hist_st_col2_DoCellUpdate,
1092 },
1093 { -- col 3
1094 name = "When",
1095 width = 250,
1096 DoCellUpdate = hist_st_col3_DoCellUpdate,
1097 defaultsort = "asc",
1098 sort = "asc",
1099 sortnext = 1,
1100 },
1101 }
1102
1103 local hist_normal_status =
1104 [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]]
1105 local hist_name_status =
1106 [[Right-click on any row to return to normal history display.]]
1107
1108 local history_filter_by_recent = function (st, e)
1109 if e.kind ~= 'history' then return true end
1110 return e.cols[2].OLi == 1
1111 end
1112
1113 local history_filter_who
1114 local history_filter_by_name = function (st, e)
1115 if e.kind ~= 'history' then return true end
1116 return e.OLwho == history_filter_who
1117 end
1118
1119 -- Loot column
1120 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
1121 print("col2 DCU", realrow)
1122 end
1123
1124 -- Formatted timestamp column
1125 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...)
1126 print("col3 DCU", realrow)
1127 if not fShow then
1128 cellFrame.text:SetText("")
1129 return
1130 end
1131
1132 local d = data[realrow]
1133 local cell = d.cols[column]
1134
1135 cellFrame.text:SetText(cell.value)
1136 cellFrame.text:SetTextColor(1,1,1,1)
1137
1138 --if d.kind ~= 'loot' then
1139 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[d.kind])
1140 --else
1141 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
1142 --end
1143 end
1144
1145 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
1146 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
1147 local h = data[realrow]
1148 local kind = h.kind
1149
1150 if history_filter_who and button == "RightButton" then -- now filtering and wanting not to
1151 history_filter_who = nil
1152 stable:SetFilter(history_filter_by_recent)
1153 setstatus(hist_normal_status)
1154 elseif (not history_filter_who) and button == "LeftButton" then -- not filtering and wanting to
1155 history_filter_who = h.OLwho
1156 stable:SetFilter(history_filter_by_name)
1157 setstatus(hist_name_status)
1158 end
1159
1160 return true -- do not do anything further
1161 end
1162
1163 --[[
1164 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
1165 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
1166 local h = data[realrow]
1167 local kind = h.kind
1168
1169 return true -- do not do anything further
1170 end]]
1171
1172 -- Tab 4: History (implementation)
1173 tabs_OnGroupSelected["hist"] = function(container,specials)
1174 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight)
1175 _d:SetUserData("histST",histST)
1176 if addon.author_debug then
1177 _G.OLHST = histST
1178 end
1179
1180 if not eoi_st_otherrow_bgcolortable_default then
1181 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank()
1182 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key)
1183 return eoi_st_otherrow_bgcolortable_default
1184 end})
1185 end
1186
1187 addon:_build_history_names()
1188 addon:_fill_out_hist_data(1)
1189 histST:SetData(addon.history.st)
1190 histST:RegisterEvents{
1191 OnEnter = eoi_st_OnEnter,
1192 OnLeave = eoi_st_OnLeave,
1193 OnClick = hist_st_OnClick,
1194 --OnDoubleClick = hist_st_OnDoubleClick,
1082 } 1195 }
1083 1196 local oldrefresh = histST.Refresh
1084 local hist_normal_status = [[Click on a row to view all history for that player only. (Click column headers to re-sort.)]] 1197 histST.Refresh = function (self, opt_index)
1085 local hist_name_status = [[Right-click on any row to return to normal history display.]] 1198 addon:_fill_out_hist_data(opt_index)
1086 1199 return oldrefresh(self)
1087 local history_filter_by_recent = function (st, e) 1200 end
1088 if e.kind ~= 'history' then return true end 1201 histST.OuroLoot_Refresh = function (self, opt_index)
1089 return e.cols[2].OLi == 1 1202 addon:_fill_out_hist_data(opt_index)
1090 end 1203 self:SortData() -- calls hooked refresh
1091 1204 end
1092 local history_filter_who 1205
1093 local history_filter_by_name = function (st, e) 1206 histST:SetFilter(history_filter_by_recent)
1094 if e.kind ~= 'history' then return true end 1207
1095 return e.OLwho == history_filter_who 1208 -- Zaps history for the given realm, or the current (current-playing
1096 end 1209 -- realm, not currently-displayed realm) one if not specified.
1097 1210 local function reset_current_realm (opt_realmname)
1098 -- Loot column 1211 local r = assert(opt_realmname or GetRealmName())
1099 local function hist_st_col2_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...) 1212 -- new .history table:
1100 print("col2 DCU", realrow) 1213 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
1101 end 1214 addon.history = addon.history_all[r]
1102 1215 addon.hist_clean = nil
1103 -- Formatted timestamp column 1216 -- new .history.st table:
1104 local function hist_st_col3_DoCellUpdate (rowFrame, cellFrame, data, cols, row, realrow, column, fShow, stable, ...) 1217 histST:OuroLoot_Refresh()
1105 print("col3 DCU", realrow) 1218 histST:SetData(addon.history.st)
1106 if not fShow then 1219 end
1107 cellFrame.text:SetText("")
1108 return
1109 end
1110
1111 local d = data[realrow]
1112 local cell = d.cols[column]
1113
1114 cellFrame.text:SetText(cell.value)
1115 cellFrame.text:SetTextColor(1,1,1,1)
1116
1117 --if d.kind ~= 'loot' then
1118 stable:SetHighLightColor (rowFrame, eoi_st_otherrow_bgcolortable[d.kind])
1119 --else
1120 -- table:SetHighLightColor (rowFrame, table:GetDefaultHighlightBlank())
1121 --end
1122 end
1123
1124 local function hist_st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
1125 if (row == nil) or (realrow == nil) then return false end -- click column header, do default resorting
1126 local h = data[realrow]
1127 local kind = h.kind
1128
1129 if history_filter_who and button == "RightButton" then -- now filtering and wanting not to
1130 history_filter_who = nil
1131 stable:SetFilter(history_filter_by_recent)
1132 setstatus(hist_normal_status)
1133 elseif (not history_filter_who) and button == "LeftButton" then -- not filtering and wanting to
1134 history_filter_who = h.OLwho
1135 stable:SetFilter(history_filter_by_name)
1136 setstatus(hist_name_status)
1137 end
1138
1139 return true -- do not do anything further
1140 end
1141
1142 --[[
1143 local function hist_st_OnDoubleClick (rowFrame, cellFrame, data, cols, row, realrow, column, stable, button, ...)
1144 if (row == nil) or (realrow == nil) then return true end -- they clicked on column header, suppress reordering
1145 local h = data[realrow]
1146 local kind = h.kind
1147
1148 return true -- do not do anything further
1149 end]]
1150 1220
1151 tabs_OnGroupSelected["hist"] = function(container,specials) 1221 tabs_OnGroupSelected["hist"] = function(container,specials)
1152 histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight) 1222 local st_widget = GUI:Create("lib-st")
1153 _d:SetUserData("histST",histST) 1223 -- don't need _d:GetUserData("histST") here, as it's already a local
1154 if addon.author_debug then 1224 histST:OuroLoot_Refresh()
1155 _G.OLHST = histST 1225 st_widget:WrapST(histST)
1156 end 1226 st_widget.head_offset = 15
1157 1227 st_widget.tail_offset = 0
1158 if not eoi_st_otherrow_bgcolortable_default then 1228 container:SetLayout("Fill")
1159 eoi_st_otherrow_bgcolortable_default = histST:GetDefaultHighlightBlank() 1229 container:AddChild(st_widget)
1160 setmetatable(eoi_st_otherrow_bgcolortable, {__index = function (bg, key) 1230 setstatus(hist_normal_status)
1161 return eoi_st_otherrow_bgcolortable_default 1231
1162 end}) 1232 local b
1163 end 1233 do
1164 1234 local realms,current = {},1
1165 addon:_build_history_names() 1235 for realmname,histtable in pairs(addon.history_all) do
1166 addon:_fill_out_hist_data(1) 1236 if type(histtable) == 'table' then
1167 histST:SetData(addon.history.st) 1237 tinsert(realms,realmname)
1168 histST:RegisterEvents{ 1238 if addon.history == histtable then current = #realms end
1169 OnEnter = eoi_st_OnEnter,
1170 OnLeave = eoi_st_OnLeave,
1171 OnClick = hist_st_OnClick,
1172 --OnDoubleClick = hist_st_OnDoubleClick,
1173 }
1174 local oldrefresh = histST.Refresh
1175 histST.Refresh = function (self, opt_index)
1176 addon:_fill_out_hist_data(opt_index)
1177 return oldrefresh(self)
1178 end
1179 histST.OuroLoot_Refresh = function (self, opt_index)
1180 addon:_fill_out_hist_data(opt_index)
1181 self:SortData() -- calls hooked refresh
1182 end
1183
1184 histST:SetFilter(history_filter_by_recent)
1185
1186 -- Zaps history for the given realm, or the current (current-playing
1187 -- realm, not currently-displayed realm) one if not specified.
1188 local function reset_current_realm (opt_realmname)
1189 local r = assert(opt_realmname or GetRealmName())
1190 -- new .history table:
1191 addon.history_all[r] = addon:_prep_new_history_category (nil, r)
1192 addon.history = addon.history_all[r]
1193 addon.hist_clean = nil
1194 -- new .history.st table:
1195 histST:OuroLoot_Refresh()
1196 histST:SetData(addon.history.st)
1197 end
1198
1199 tabs_OnGroupSelected["hist"] = function(container,specials)
1200 local st_widget = GUI:Create("lib-st")
1201 -- don't need _d:GetUserData("histST") here, as it's already a local
1202 histST:OuroLoot_Refresh()
1203 st_widget:WrapST(histST)
1204 st_widget.head_offset = 15
1205 st_widget.tail_offset = 0
1206 container:SetLayout("Fill")
1207 container:AddChild(st_widget)
1208 setstatus(hist_normal_status)
1209
1210 local b
1211 do
1212 local realms,current = {},1
1213 for realmname,histtable in pairs(addon.history_all) do
1214 if type(histtable) == 'table' then
1215 tinsert(realms,realmname)
1216 if addon.history == histtable then current = #realms end
1217 end
1218 end 1239 end
1219 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
1220 b:SetFullWidth(true)
1221 b:SetLabel() -- required even when empty, see ace3 ticket #234
1222 b:SetList(realms)
1223 b:SetValue(current)
1224 b:SetCallback("OnValueChanged", function(_dd,event,choice)
1225 local r = realms[choice]
1226 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
1227 addon.hist_clean = nil
1228 histST:OuroLoot_Refresh()
1229 histST:SetData(addon.history.st)
1230 -- Reset filters to normal
1231 history_filter_who = nil
1232 histST:SetFilter(history_filter_by_recent)
1233 setstatus(hist_normal_status)
1234 return addon:redisplay()
1235 end)
1236 specials:AddChild(b)
1237 end 1240 end
1238 1241 b = mkbutton("Dropdown", nil, "", [[Which realm to display]])
1239 --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
1240
1241 b = mkbutton("Regenerate",
1242 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
1243 b:SetFullWidth(true) 1242 b:SetFullWidth(true)
1244 b:SetDisabled (#addon.history == 0) 1243 b:SetLabel() -- required even when empty, see ace3 ticket #234
1245 b:SetCallback("OnClick", function(_b) 1244 b:SetList(realms)
1246 addon:rewrite_history (addon.history.realm) 1245 b:SetValue(current)
1246 b:SetCallback("OnValueChanged", function(_dd,event,choice)
1247 local r = realms[choice]
1248 addon.history = addon:_prep_new_history_category (addon.history_all[r], r)
1249 addon.hist_clean = nil
1247 histST:OuroLoot_Refresh() 1250 histST:OuroLoot_Refresh()
1248 histST:SetData(addon.history.st) 1251 histST:SetData(addon.history.st)
1249 addon:Print("%s history has been regenerated.", addon.history.realm) 1252 -- Reset filters to normal
1253 history_filter_who = nil
1254 histST:SetFilter(history_filter_by_recent)
1255 setstatus(hist_normal_status)
1250 return addon:redisplay() 1256 return addon:redisplay()
1251 end) 1257 end)
1252 specials:AddChild(b) 1258 specials:AddChild(b)
1253 1259 end
1254 b = mkbutton('hist_clear', "Clear Realm History", 1260
1255 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]]) 1261 --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]]
1256 b:SetFullWidth(true) 1262
1257 b:SetCallback("OnClick", function (_b) 1263 b = mkbutton("Regenerate",
1258 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm) 1264 [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]])
1259 dialog.data = addon 1265 b:SetFullWidth(true)
1260 dialog.data2 = function(_addon) 1266 b:SetDisabled (#addon.history == 0)
1261 reset_current_realm(_addon.history.realm) 1267 b:SetCallback("OnClick", function(_b)
1262 end 1268 local dialog = StaticPopup_Show("OUROL_HIST_REGEN", addon.history.realm)
1263 end) 1269 dialog.data = addon
1264 specials:AddChild(b) 1270 dialog.data2 = function(_addon)
1265 1271 _addon:rewrite_history (_addon.history.realm)
1266 b = mkbutton('hist_clear_all', "Clear All History", 1272 histST:OuroLoot_Refresh()
1267 [[|cffff1010Erases absolutely all> history entries from ALL realms.]]) 1273 histST:SetData(_addon.history.st)
1268 b:SetFullWidth(true) 1274 end
1269 b:SetCallback("OnClick", function (_b) 1275 end)
1270 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms") 1276 specials:AddChild(b)
1271 dialog.data = addon 1277
1272 dialog.data2 = function(_addon) 1278 b = mkbutton('hist_clear', "Clear Realm History",
1273 _addon.history_all = {} 1279 [[|cffff1010Erases absolutely all> history entries from the displayed realm.]])
1274 reset_current_realm() 1280 b:SetFullWidth(true)
1275 end 1281 b:SetCallback("OnClick", function (_b)
1276 end) 1282 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", addon.history.realm)
1277 specials:AddChild(b) 1283 dialog.data = addon
1278 1284 dialog.data2 = function(_addon)
1279 b = mkbutton('hist_clear_old', "Clear Older", 1285 reset_current_realm(_addon.history.realm)
1280 [[Preserves only the latest loot entry for each player on the displayed realm, removing all earlier ones.]]) 1286 end
1281 b:SetFullWidth(true) 1287 end)
1282 b:SetCallback("OnClick", function (_b) 1288 specials:AddChild(b)
1283 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", addon.history.realm) 1289
1284 dialog.data = addon 1290 b = mkbutton('hist_clear_all', "Clear All History",
1285 dialog.data2 = function(_addon) 1291 [[|cffff1010Erases absolutely all> history entries from ALL realms.]])
1286 _addon:preen_history(_addon.history.realm) 1292 b:SetFullWidth(true)
1287 _addon.hist_clean = nil 1293 b:SetCallback("OnClick", function (_b)
1288 histST:OuroLoot_Refresh() 1294 local dialog = StaticPopup_Show("OUROL_HIST_CLEAR", "ALL realms")
1289 end 1295 dialog.data = addon
1290 end) 1296 dialog.data2 = function(_addon)
1291 specials:AddChild(b) 1297 _addon.history_all = {}
1292 end 1298 reset_current_realm()
1293 return tabs_OnGroupSelected["hist"](container,specials) 1299 end
1294 end 1300 end)
1295 end 1301 specials:AddChild(b)
1302
1303 b = mkbutton('hist_clear_old', "Clear Older",
1304 [[Preserves only the latest loot entry for each player on the displayed realm, removing all earlier ones.]])
1305 b:SetFullWidth(true)
1306 b:SetCallback("OnClick", function (_b)
1307 local dialog = StaticPopup_Show("OUROL_HIST_PREEN", addon.history.realm)
1308 dialog.data = addon
1309 dialog.data2 = function(_addon)
1310 _addon:preen_history(_addon.history.realm)
1311 _addon.hist_clean = nil
1312 histST:OuroLoot_Refresh()
1313 end
1314 end)
1315 specials:AddChild(b)
1316 end
1317 return tabs_OnGroupSelected["hist"](container,specials)
1318 end
1319
1296 1320
1297 -- Tab 5: Help (content in verbage.lua) 1321 -- Tab 5: Help (content in verbage.lua)
1298 do 1322 do
1299 local tabs_help_OnGroupSelected_func = function (treeg,event,category) 1323 local tabs_help_OnGroupSelected_func = function (treeg,event,category)
1300 treeg:ReleaseChildren() 1324 treeg:ReleaseChildren()
1341 else 1365 else
1342 left:SelectByValue("basic") 1366 left:SelectByValue("basic")
1343 end 1367 end
1344 end 1368 end
1345 end 1369 end
1370
1346 1371
1347 -- Tab 6: Options / Advanced 1372 -- Tab 6: Options / Advanced
1348 do 1373 do
1349 local function mkoption (opt, label, width, desc, opt_func) 1374 local function mkoption (opt, label, width, desc, opt_func)
1350 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc) 1375 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc)
1989 -- Essentially a re-click on the current tab (if the current tab were clickable). 2014 -- Essentially a re-click on the current tab (if the current tab were clickable).
1990 function addon:redisplay () 2015 function addon:redisplay ()
1991 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args)) 2016 tabs_OnGroupSelected_func (unpack(tabs_OnGroupSelected_func_args))
1992 end 2017 end
1993 2018
1994 end -- local 'do' scope
1995
1996 2019
1997 ------ Popup dialogs 2020 ------ Popup dialogs
1998 -- Callback for each Next/Accept stage of inserting a new loot row via dropdown 2021 -- Callback for each Next/Accept stage of inserting a new loot row via dropdown
1999 local function eoi_st_insert_OnAccept_boss (dialog, data) 2022 local function eoi_st_insert_OnAccept_boss (dialog, data)
2000 if data.all_done then 2023 if data.all_done then
2100 OnAccept = function (dialog, addon) 2123 OnAccept = function (dialog, addon)
2101 addon:Clear(--[[verbose_p=]]true) 2124 addon:Clear(--[[verbose_p=]]true)
2102 end, 2125 end,
2103 } 2126 }
2104 2127
2128 StaticPopupDialogs["OUROL_HIST_REGEN"] = flib.StaticPopup{
2129 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
2130 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r, and generate it anew from current loot?",
2131 button1 = YES,
2132 button2 = NO,
2133 OnAccept = function (dialog, addon, data2)
2134 data2(addon)
2135 addon:Print("%s history has been regenerated.", addon.history.realm)
2136 addon:redisplay()
2137 end,
2138 }
2139
2105 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{ 2140 StaticPopupDialogs["OUROL_HIST_CLEAR"] = flib.StaticPopup{
2106 text = "Erase all history entries from %s?", 2141 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
2142 text = "Erase all history entries from " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
2107 button1 = YES, 2143 button1 = YES,
2108 button2 = NO, 2144 button2 = NO,
2109 OnAccept = function (dialog, addon, data2) 2145 OnAccept = function (dialog, addon, data2)
2110 data2(addon) 2146 data2(addon)
2111 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!") 2147 addon:Print("Stimpy, you eeediot, you've pushed the history erase button!")
2112 addon:redisplay() 2148 addon:redisplay()
2113 end, 2149 end,
2114 } 2150 }
2115 2151
2116 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{ 2152 StaticPopupDialogs["OUROL_HIST_PREEN"] = flib.StaticPopup{
2117 text = "Erase all but the latest entry for players on %s?", 2153 -- Concatenate this once at load time. There is no ITEM_QUALITY_LEGENDARY constant.
2154 text = "Erase all but the latest entry for players on " .. ITEM_QUALITY_COLORS[5].hex .. "%s|r?",
2118 button1 = YES, 2155 button1 = YES,
2119 button2 = NO, 2156 button2 = NO,
2120 OnAccept = function (dialog, addon, data2) 2157 OnAccept = function (dialog, addon, data2)
2121 data2(addon) 2158 data2(addon)
2122 addon:Print("All loot prior to the most recent entries has been erased.") 2159 addon:Print("All loot prior to the most recent entries has been erased.")