Mercurial > wow > worldplan
comparison FilterBar.lua @ 36:21bcff08b0f4
WorldPlan:
- Quest pins are now placed on the flight map. Their visibility rules will mirror the filter options from the world map.
- Filter controls polish:
- First click negates other reward type filters. Subsequent clicks will then toggle individual reward types until the filters are reset via Right-click.
- Adheres to the Blizzard CVars added in patch 7.1
- Numerous optimizations to how data and visual updates are handled; should see an even better load time, and snappier world map interaction.
ClassPlan:
- The 'Available Missions' list is now recorded. It can be reviewed by clicking on the mission list heading.
- Information filtering by character and realm.
| author | Nenue |
|---|---|
| date | Fri, 04 Nov 2016 01:40:39 -0400 |
| parents | be4db60219ca |
| children | 589c444d4837 |
comparison
equal
deleted
inserted
replaced
| 35:26dfa661daa7 | 36:21bcff08b0f4 |
|---|---|
| 38 [40279] = {npc = 99035, name = 'Durian Strongfruit'} | 38 [40279] = {npc = 99035, name = 'Durian Strongfruit'} |
| 39 } | 39 } |
| 40 local familiars_id = 9696 | 40 local familiars_id = 9696 |
| 41 | 41 |
| 42 local DEFAULT_FILTER_LAYOUT = { | 42 local DEFAULT_FILTER_LAYOUT = { |
| 43 PinSize = 22, | 43 iconWidth = 24, |
| 44 Border = 3, | 44 borderWidth = 3, |
| 45 TrackingBorder = 2, | 45 highlightWidth = 2, |
| 46 TagSize = 12, | 46 TagSize = 12, |
| 47 TimeleftStage = 3, | 47 TimeleftStage = 3, |
| 48 showNumber = true, | 48 showNumber = true, |
| 49 numberFontObject = 'WorldPlanNumberFontThin' | 49 numberFontObject = 'WorldPlanNumberFontThin' |
| 50 } | 50 } |
| 159 local blocks = self.buttons | 159 local blocks = self.buttons |
| 160 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton | 160 local relativeFrame = WorldMapFrame.UIElementsFrame.TrackingOptionsButton |
| 161 local numHeaders = 0 | 161 local numHeaders = 0 |
| 162 print('|cFF00FF88'..self:GetName()..':Update()|r', 'currentMap=',WorldPlan.currentMapID) | 162 print('|cFF00FF88'..self:GetName()..':Update()|r', 'currentMap=',WorldPlan.currentMapID) |
| 163 | 163 |
| 164 | 164 local layout = DEFAULT_FILTER_LAYOUT |
| 165 local borderWidth = layout.iconWidth + (layout.borderWidth * 2) | |
| 166 local highlightWidth = borderWidth + (layout.highlightWidth * 2) | |
| 165 local quests = WorldPlanQuests.QuestsByZone[WorldPlan.currentMapID] or WorldPlanQuests.QuestsByID | 167 local quests = WorldPlanQuests.QuestsByZone[WorldPlan.currentMapID] or WorldPlanQuests.QuestsByID |
| 166 local foundQuests = questResults[1] | 168 local foundQuests = questResults[1] |
| 167 for index, info in ipairs(self.filterList) do | 169 for index, info in ipairs(self.filterList) do |
| 168 local numQuests = 0 | 170 local numQuests = 0 |
| 169 local resultIndex = numHeaders + 1 | 171 local resultIndex = numHeaders + 1 |
| 184 if numQuests >= 1 then | 186 if numQuests >= 1 then |
| 185 numHeaders = numHeaders + 1 | 187 numHeaders = numHeaders + 1 |
| 186 local button = blocks[numHeaders] | 188 local button = blocks[numHeaders] |
| 187 if not blocks[numHeaders] then | 189 if not blocks[numHeaders] then |
| 188 button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin') | 190 button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin') |
| 189 | 191 button:SetSize(borderWidth, borderWidth) |
| 190 button:SetSize(24,24) | 192 |
| 191 button.icon:ClearAllPoints() | 193 button.icon:SetSize(layout.iconWidth, layout.iconWidth) |
| 192 button.icon:SetAllPoints(button) | 194 button.RewardBorder:SetSize(borderWidth, borderWidth) |
| 193 | 195 button.HighlightBorder:SetSize(highlightWidth, highlightWidth) |
| 194 button.iconBorder:SetPoint('TOPLEFT', button, 'TOPLEFT', -2, 2) | 196 button.RewardBorder:SetMask(filterMask) |
| 195 button.iconBorder:SetPoint('BOTTOMRIGHT', button, 'BOTTOMRIGHT', 2, -2) | 197 button.RewardBorder:SetDesaturated(true) |
| 196 button.iconBorder:SetMask(filterMask) | 198 |
| 197 button.iconBorder:SetTexture(filterFill) | 199 button.HighlightBorder:Hide() |
| 198 button.iconBorder:SetDesaturated(true) | |
| 199 | |
| 200 button.supertrackBorder:Hide() | |
| 201 blocks[numHeaders] = button | 200 blocks[numHeaders] = button |
| 202 end | 201 end |
| 203 | 202 |
| 204 button.info = info | 203 button.info = info |
| 205 button.questList = questResults[resultIndex] | 204 button.questList = questResults[resultIndex] |
| 206 button:SetID(index) | 205 button:SetID(index) |
| 207 button.spacing = ((info.filterKey ~= relativeFrame.filterKey) and 10) or 0 | 206 button.spacing = ((relativeFrame.cVar and (not info.cVar)) or (relativeFrame.filterKey ~= info.filterKey)) and 5 or 0 |
| 208 button.relativeFrame = relativeFrame | 207 button.relativeFrame = relativeFrame |
| 209 button:Refresh((numHeaders == 1), numQuests) | 208 button:Refresh((numHeaders == 1), numQuests) |
| 210 button:Show() | 209 button:Show() |
| 211 relativeFrame = button | 210 relativeFrame = button |
| 212 end | 211 end |
| 231 | 230 |
| 232 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF'} | 231 local rgbWhite = {r = 1, g= 1, b= 1, hex = '|cFFFFFFFF'} |
| 233 function WorldPlanFilterPinMixin:OnEnter() | 232 function WorldPlanFilterPinMixin:OnEnter() |
| 234 if self.questList and #self.questList >= 1 then | 233 if self.questList and #self.questList >= 1 then |
| 235 GameTooltip:SetOwner(self, 'ANCHOR_LEFT') | 234 GameTooltip:SetOwner(self, 'ANCHOR_LEFT') |
| 236 GameTooltip_ClearInsertedFrames(GameTooltip) | |
| 237 GameTooltip:AddLine(self.info.label) | 235 GameTooltip:AddLine(self.info.label) |
| 238 for index, pin in ipairs(self.questList) do | 236 for index, pin in ipairs(self.questList) do |
| 239 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite | 237 local colorInfo = (pin.quality and ITEM_QUALITY_COLORS[pin.quality]) or rgbWhite |
| 240 GameTooltip:AddLine(pin.title ..(pin.cheevos and " |cFFFFFF00!|R" or ''), colorInfo.r, colorInfo.g, colorInfo.b) | 238 GameTooltip:AddLine('|T'.. tostring(pin.itemTexture)..':16:16|t ' .. pin.title ..(pin.cheevos and " |cFFFFFF00!|R" or ''), colorInfo.r, colorInfo.g, colorInfo.b) |
| 241 GameTooltip:AddTexture(pin.itemTexture) | 239 end |
| 242 local cLine = GameTooltip:NumLines() - 1 | 240 GameTooltip:Show() |
| 243 --print(cLine, _G['GameTooltipTexture'..cLine]:GetTexture()) | |
| 244 if type(pin.itemTexture) == 'number' then | |
| 245 --- voodoo workaround for IDs getting coerced to string | |
| 246 _G['GameTooltipTexture'..cLine]:Show() | |
| 247 _G['GameTooltipTexture'..cLine]:SetTexture(pin.itemTexture) | |
| 248 end | |
| 249 GameTooltip:Show() | |
| 250 end | |
| 251 end | 241 end |
| 252 end | 242 end |
| 253 | 243 |
| 254 function WorldPlanFilterPinMixin:OnLeave() | 244 function WorldPlanFilterPinMixin:OnLeave() |
| 255 if GameTooltip:IsOwned(self) then | 245 if GameTooltip:IsOwned(self) then |
| 277 self.itemTexture = self.texture | 267 self.itemTexture = self.texture |
| 278 | 268 |
| 279 if isFirst then | 269 if isFirst then |
| 280 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) | 270 self:SetPoint('TOP', self.relativeFrame, 'BOTTOM', 0, -5) |
| 281 else | 271 else |
| 282 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(3 + (self.spacing or 0))) | 272 self:SetPoint('TOPRIGHT', self.relativeFrame, 'BOTTOMRIGHT', 0, -(self.spacing or 0)) |
| 283 end | 273 end |
| 284 print('anchor to', self.relativeFrame:GetName(), info.mask) | 274 print('anchor to', self.relativeFrame:GetName(), info.mask) |
| 285 | 275 |
| 286 local r, g, b, a = 1,1,1,1 | 276 local r, g, b, a = 1,1,1,1 |
| 287 local desaturated = false | 277 local desaturated = false |
| 288 if self.cVar then | 278 if self.cVar then |
| 289 self.iconBorder:SetVertexColor(1, 1, 1, 1) | 279 self.RewardBorder:SetVertexColor(1, 1, 1, 1) |
| 290 if GetCVarBool(self.cVar) then | 280 if GetCVarBool(self.cVar) then |
| 291 self.icon:SetVertexColor(1,1,1,1) | 281 self.icon:SetVertexColor(1,1,1,1) |
| 292 self:SetAlpha(1) | 282 self:SetAlpha(1) |
| 293 else | 283 else |
| 294 self.icon:SetVertexColor(.5, .5, .5, 1) | 284 self.icon:SetVertexColor(.5, .5, .5, 1) |
| 296 end | 286 end |
| 297 else | 287 else |
| 298 self:SetAlpha(1) | 288 self:SetAlpha(1) |
| 299 if WorldPlan.UsedFilters[self.filterKey] then | 289 if WorldPlan.UsedFilters[self.filterKey] then |
| 300 if WorldPlan.UsedFilters[self.filterKey] == self.filterValue then | 290 if WorldPlan.UsedFilters[self.filterKey] == self.filterValue then |
| 301 self.iconBorder:SetVertexColor(0, 1, 0) | 291 self.RewardBorder:SetVertexColor(0, 1, 0) |
| 302 else | 292 else |
| 303 self.iconBorder:SetVertexColor(1, 0, 0) | 293 self.RewardBorder:SetVertexColor(1, 0, 0) |
| 304 end | 294 end |
| 305 else | 295 else |
| 306 self.iconBorder:SetVertexColor(1, 1, 1, 1) | 296 if self.filterKey == 'worldQuestType' then |
| 297 self.RewardBorder:SetVertexColor(0, 1, 1) | |
| 298 elseif self.filterKey == 'factionID' then | |
| 299 self.RewardBorder:SetVertexColor(1, 1, 0) | |
| 300 else | |
| 301 | |
| 302 self.RewardBorder:SetVertexColor(0.5, 0.5, 0.5) | |
| 303 end | |
| 304 | |
| 307 end | 305 end |
| 308 end | 306 end |
| 309 | 307 |
| 310 --self:UpdateSize() | 308 --self:UpdateSize() |
| 311 end | 309 end |
| 313 function WorldPlanFilterPinMixin:OnLoad() | 311 function WorldPlanFilterPinMixin:OnLoad() |
| 314 self:RegisterForClicks('AnyUp') | 312 self:RegisterForClicks('AnyUp') |
| 315 self:SetFrameStrata('HIGH') | 313 self:SetFrameStrata('HIGH') |
| 316 self:SetFrameLevel(151) | 314 self:SetFrameLevel(151) |
| 317 self:SetScript('OnUpdate', nil) | 315 self:SetScript('OnUpdate', nil) |
| 316 WorldPlanPOIMixin.OnLoad(self) | |
| 318 end | 317 end |
| 319 | 318 |
| 320 function WorldPlanFilterPinMixin:OnUpdate () | 319 function WorldPlanFilterPinMixin:OnUpdate () |
| 321 end | 320 end |
| 322 | 321 |
| 327 end | 326 end |
| 328 end | 327 end |
| 329 | 328 |
| 330 -- shift-click: reset filter | 329 -- shift-click: reset filter |
| 331 -- click: rotate through include(1), exclude(-1), ignore(nil) | 330 -- click: rotate through include(1), exclude(-1), ignore(nil) |
| 331 local filtered_report = {} | |
| 332 function WorldPlanFilterPinMixin:OnClick (button) | 332 function WorldPlanFilterPinMixin:OnClick (button) |
| 333 | 333 |
| 334 print('|cFF00FF88'..self:GetName()..':OnClick()|r', filterKey, filterValue, operation) | 334 print('|cFF00FF88'..self:GetName()..':OnClick()|r', filterKey, filterValue, operation) |
| 335 local filterKey = self.filterKey | 335 local filterKey = self.filterKey |
| 336 local filterValue = self.filterValue | 336 local filterValue = self.filterValue |
| 337 | 337 local cVar = self.cVar |
| 338 | 338 local parent = self:GetParent() |
| 339 local operation = opPrefix | 339 local operation = opPrefix |
| 340 | 340 local setDirty = false |
| 341 | 341 |
| 342 if not filterKey then | 342 local resetMode = (button == 'RightButton') |
| 343 wipe(filtered_report) | |
| 344 if not (filterKey or cVar) then | |
| 343 wipe(WorldPlan.UsedFilters) | 345 wipe(WorldPlan.UsedFilters) |
| 344 for i, info in ipairs(DEFAULT_FILTER_LIST) do | 346 for i, info in ipairs(DEFAULT_FILTER_LIST) do |
| 345 if info.cVar then | 347 if info.cVar then |
| 348 if GetCVar(info.cVar) ~= 1 then | |
| 349 tinsert(filtered_report, '|cFF888888'.. tostring(info.label) ..'|r') | |
| 350 end | |
| 346 SetCVar(info.cVar, 1) | 351 SetCVar(info.cVar, 1) |
| 347 end | 352 end |
| 348 end | 353 end |
| 349 | 354 |
| 350 elseif self.cVar then | 355 elseif cVar then |
| 356 WorldPlan:print('Toggling cvar filter:', cVar) | |
| 357 if (not parent.isDirty) or resetMode then | |
| 351 for i, info in ipairs(DEFAULT_FILTER_LIST) do | 358 for i, info in ipairs(DEFAULT_FILTER_LIST) do |
| 352 if info.cVar then | 359 if info.cVar then |
| 353 if (info.cVar ~= self.cVar) and (button == 'LeftButton') then | 360 local value = GetCVar(info.cVar) |
| 354 SetCVar(info.cVar, 0) | 361 if resetMode then |
| 362 value = 1 | |
| 363 parent.isDirty = nil | |
| 355 else | 364 else |
| 356 SetCVar(info.cVar, 1) | 365 |
| 366 if (cVar ~= info.cVar) then | |
| 367 value = 0 | |
| 368 else | |
| 369 value = 1 | |
| 370 end | |
| 371 setDirty = true | |
| 372 | |
| 357 end | 373 end |
| 374 SetCVar(info.cVar, value) | |
| 358 end | 375 end |
| 359 end | 376 end |
| 377 if setDirty then | |
| 378 parent.isDirty = true | |
| 379 end | |
| 380 else | |
| 381 SetCVar(cVar, (GetCVarBool(cVar) and 0) or 1) | |
| 382 end | |
| 360 else | 383 else |
| 361 local setInclude = (button == 'LeftButton') | |
| 362 local flushValue | 384 local flushValue |
| 363 print('') | 385 print('') |
| 364 if WorldPlan.UsedFilters[filterKey] == filterValue then | 386 if WorldPlan.UsedFilters[filterKey] == filterValue then |
| 365 WorldPlan.UsedFilters[filterKey] = nil | 387 WorldPlan.UsedFilters[filterKey] = nil |
| 388 tinsert(filtered_report, '|cFFFF0000'.. tostring(filterKey) ..'|r') | |
| 366 else | 389 else |
| 367 WorldPlan.UsedFilters[filterKey] = filterValue | 390 WorldPlan.UsedFilters[filterKey] = filterValue |
| 368 end | 391 tinsert(filtered_report, '|cFF00FF00'.. tostring(filterKey) ..'|r') |
| 369 end | 392 end |
| 393 end | |
| 394 WorldPlan:print('Changed:', table.concat(filtered_report, ', ')) | |
| 370 WorldPlan:Refresh(true) | 395 WorldPlan:Refresh(true) |
| 371 end | 396 end |
