Skip to content

Commit

Permalink
✨ Added MUCH MORE options to the interface options menu
Browse files Browse the repository at this point in the history
AssisrMatheus committed Sep 25, 2019
1 parent c42a03e commit 5e23e62
Showing 26 changed files with 1,441 additions and 30 deletions.
2 changes: 1 addition & 1 deletion bindings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Bindings>
<Binding name="TC_TOGGLE_FRAME" description="TodoChecklister binidings" header="TC_HEADER">
<Binding name="TC_TOGGLE_FRAME" description="TodoChecklister bindings" header="TC_HEADER" category="ADDONS">
GLOBAL_TodoChecklisterFrameToggle()
</Binding>
</Bindings>
10 changes: 9 additions & 1 deletion pkgmeta.yaml
Original file line number Diff line number Diff line change
@@ -3,4 +3,12 @@ ignore: # Files and directories beginning with a dot (such as .git) are automati
- button.png
- demo.gif
- icon.png
- README.md
- README.md

externals:
src/libs/LibStub:
url: https://repos.wowace.com/wow/libstub/trunk
tag: latest
src/libs/LibDBIcon-1.0:
url: https://repos.wowace.com/wow/libdbicon-1-0/trunk/LibDBIcon-1.0
tag: latest
44 changes: 36 additions & 8 deletions src/components/TodoChecklister.lua
Original file line number Diff line number Diff line change
@@ -234,14 +234,23 @@ function TodoChecklisterFrame:PaintItem(frame, todoItem, index)

if (en) then
-- Set the final string to:
finalString =
table.concat {
finalString, -- Current final string
remainingString:sub(1, en), -- Current string until now
"(",
GetItemCount(remainingString), -- Amount from bag
") "
}
local count = GetItemCount(remainingString, self.displayBankOnLinked, self.displayChargesOnLinked)
if (count and count > 0) then
finalString =
table.concat {
finalString, -- Current final string
remainingString:sub(1, en), -- Current string until now
"(",
count,
")"
}
else
finalString =
table.concat {
finalString, -- Current final string
remainingString:sub(1, en) -- Current string until now
}
end

-- Remove the current linked item from the remaining string to continue the process
remainingString = remainingString:sub(en + 1)
@@ -460,6 +469,7 @@ function TodoChecklisterFrame:Defaults()
self.frame:SetPoint("BOTTOMRIGHT", "$parent", "BOTTOMRIGHT", -120, 30)
self.frame:SetScale(1)
self.frame:SetAlpha(1)
self.memoizationId = 0

Settings:Defaults()
self:LoadCFG()
@@ -475,6 +485,7 @@ function TodoChecklisterFrame:LoadCFG()
self.frame.KeepFocus:Hide()
end

self.memoizationId = self.memoizationId + 1
self.frame.KeepFocus:SetChecked(Settings:KeepFocus())

if (not Settings:KeepFocus()) then
@@ -487,11 +498,14 @@ function TodoChecklisterFrame:LoadCFG()

-- Set up scroll bar
self.frame.ScrollFrame.update = function()
self.memoizationId = self.memoizationId + 1
self:OnUpdate()
end
HybridScrollFrame_CreateButtons(self.frame.ScrollFrame, "TodoItemTemplate")

self.displayLinked = Settings:DisplayLinked()
self.displayBankOnLinked = Settings:DisplayBankOnLinked()
self.displayChargesOnLinked = Settings:DisplayChargesOnLinked()

self:OnUpdate()
end
@@ -621,3 +635,17 @@ end
function ToggleFocusLoad(frame)
frame:SetChecked(Settings:KeepFocus())
end

function OnEnter(frame)
-- if (Settings:OpacityOnHover()) then
-- frame:SetAlpha(Settings:OpacityOnHover())
-- end
end

function OnLeave(frame)
-- if (Settings:Opacity()) then
-- frame:SetAlpha(Settings:Opacity())
-- else
-- frame:SetAlpha(1)
-- end
end
6 changes: 6 additions & 0 deletions src/components/TodoChecklister.xml
Original file line number Diff line number Diff line change
@@ -193,6 +193,12 @@
<OnSizeChanged>
OnSizeChanged(self)
</OnSizeChanged>
<OnEnter>
OnEnter(self)
</OnEnter>
<OnLeave>
OnLeave(self)
</OnLeave>
</Scripts>

<Anchors>
40 changes: 40 additions & 0 deletions src/config/interfaceOptions.lua
Original file line number Diff line number Diff line change
@@ -11,6 +11,8 @@ local addonName = select(1, ...)
local Constants = TodoAddon.Constants
---@class Settings
local Settings = TodoAddon.Settings
---@class MinimapIcon
local MinimapIcon = TodoAddon.MinimapIcon

--------------------------------------
-- Declarations
@@ -29,6 +31,7 @@ function InterfaceOptions:Defaults()
-- This will also call Settings:Defaults
TodoAddon.TodoChecklisterFrame:Defaults()
self:LoadCFG()
TodoAddon.MinimapIcon:LoadCFG()
end

---
@@ -45,8 +48,19 @@ function InterfaceOptions:LoadCFG()
self.frame.SettingsContainer.Opacity.Value:SetText(string.format("%d%s", Settings:Opacity() * 100, "%"))
end

if (Settings:OpacityOnHover()) then
self.frame.SettingsContainer.OpacityOnHover:SetValue(Settings:OpacityOnHover())
self.frame.SettingsContainer.OpacityOnHover.Value:SetText(
string.format("%d%s", Settings:OpacityOnHover() * 100, "%")
)
end

self.frame.SettingsContainer.FanfareCheck:SetChecked(Settings:PlayFanfare())
self.frame.SettingsContainer.LinkedCounterCheckButton:SetChecked(Settings:DisplayLinked())
self.frame.SettingsContainer.MuteChatCheckButton:SetChecked(Settings:ChatMuted())
self.frame.SettingsContainer.ToggleMapButton:SetChecked(Settings:DisplayMinimapIcon())
self.frame.SettingsContainer.DisplayBankOnLinked:SetChecked(Settings:DisplayBankOnLinked())
self.frame.SettingsContainer.DisplayChargesOnLinked:SetChecked(Settings:DisplayChargesOnLinked())
end

if (TodoAddon.TodoChecklisterFrame) then
@@ -136,3 +150,29 @@ function DisplayLinkedCountClick(frame)
Settings:SetDisplayLinked(frame:GetChecked())
InterfaceOptions:LoadCFG()
end

function ToggleMapClick(frame)
Settings:SetDisplayMinimapIcon(frame:GetChecked())
TodoAddon.MinimapIcon:LoadCFG()
end

function MuteChatClick(frame)
Settings:SetChatMuted(frame:GetChecked())
end

function OpacityOnHoverValueChanged(frame)
if (InterfaceOptions.frame) then
Settings:SetOpacityOnHover(frame:GetValue())
InterfaceOptions:LoadCFG()
end
end

function DisplayBankClick(frame)
Settings:SetDisplayBankOnLinked(frame:GetChecked())
InterfaceOptions:LoadCFG()
end

function DisplayChargesClick(frame)
Settings:SetDisplayChargesOnLinked(frame:GetChecked())
InterfaceOptions:LoadCFG()
end
187 changes: 181 additions & 6 deletions src/config/interfaceOptions.xml
Original file line number Diff line number Diff line change
@@ -103,6 +103,105 @@
</Layers>
</CheckButton>

<CheckButton parentKey="LinkedCounterCheckButton" name="$parentLinkedCounterCheckButton" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

<Scripts>
<OnLoad>
self.Text:SetText("Display linked items amount from bag");
</OnLoad>
<OnClick>
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
DisplayLinkedCountClick(self)
</OnClick>
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentFocusCheckButton" relativePoint="LEFT">
<Offset>
<AbsDimension y="-39" />
</Offset>
</Anchor>
</Anchors>

<Layers>
<Layer level="OVERLAY">
<FontString name="$parentText" parentKey="Text" inherits="GameFontWhite" justifyH="LEFT">
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="Right">
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>

<CheckButton parentKey="ToggleMapButton" name="$parentToggleMapButton" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

<Scripts>
<OnLoad>
self.Text:SetText("Display minimap icon");
</OnLoad>
<OnClick>
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
ToggleMapClick(self)
</OnClick>
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentKeepFocusCheckButton" relativePoint="LEFT">
<Offset>
<AbsDimension y="-40"/>
</Offset>
</Anchor>
</Anchors>

<Layers>
<Layer level="OVERLAY">
<FontString name="$parentText" parentKey="Text" inherits="GameFontWhite" justifyH="LEFT">
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="Right">
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>

<CheckButton parentKey="MuteChatCheckButton" name="$parentMuteChatCheckButton" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

<Scripts>
<OnLoad>
self.Text:SetText("Mute all chat messages");
</OnLoad>
<OnClick>
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
MuteChatClick(self)
</OnClick>
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentLinkedCounterCheckButton" relativePoint="LEFT">
<Offset>
<AbsDimension y="-39" />
</Offset>
</Anchor>
</Anchors>

<Layers>
<Layer level="OVERLAY">
<FontString name="$parentText" parentKey="Text" inherits="GameFontWhite" justifyH="LEFT">
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="Right">
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>

<CheckButton parentKey="FanfareCheck" name="$parentFanfareCheck" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

@@ -117,7 +216,7 @@
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentKeepFocusCheckButton" relativePoint="LEFT">
<Anchor point="LEFT" relativeTo="$parentToggleMapButton" relativePoint="LEFT">
<Offset>
<AbsDimension y="-40"/>
</Offset>
@@ -136,21 +235,21 @@
</Layers>
</CheckButton>

<CheckButton parentKey="LinkedCounterCheckButton" name="$parentLinkedCounterCheckButton" inherits="UICheckButtonTemplate">
<CheckButton parentKey="DisplayBankOnLinked" name="$parentMuteDisplayBankOnLinked" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

<Scripts>
<OnLoad>
self.Text:SetText("Display linked items amount from bag");
self.Text:SetText("Count from bank on linked items");
</OnLoad>
<OnClick>
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
DisplayLinkedCountClick(self)
DisplayBankClick(self)
</OnClick>
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentFocusCheckButton" relativePoint="LEFT">
<Anchor point="LEFT" relativeTo="$parentMuteChatCheckButton" relativePoint="LEFT">
<Offset>
<AbsDimension y="-39" />
</Offset>
@@ -169,9 +268,42 @@
</Layers>
</CheckButton>

<CheckButton parentKey="DisplayChargesOnLinked" name="$parentDisplayChargesOnLinked" inherits="UICheckButtonTemplate">
<Size x="28" y="28"/>

<Scripts>
<OnLoad>
self.Text:SetText("Count charges on linked items");
</OnLoad>
<OnClick>
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
DisplayChargesClick(self)
</OnClick>
</Scripts>

<Anchors>
<Anchor point="LEFT" relativeTo="$parentFanfareCheck" relativePoint="LEFT">
<Offset>
<AbsDimension y="-40"/>
</Offset>
</Anchor>
</Anchors>

<Layers>
<Layer level="OVERLAY">
<FontString name="$parentText" parentKey="Text" inherits="GameFontWhite" justifyH="LEFT">
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="Right">
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>

<Slider parentKey="Opacity" name="$parentOpacity" inherits="OptionsSliderTemplate" minValue="0" maxValue="1" valueStep="0.01" defaultValue="1">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="$parentLinkedCounterCheckButton" relativePoint="BOTTOMLEFT">
<Anchor point="TOPLEFT" relativeTo="$parentMuteDisplayBankOnLinked" relativePoint="BOTTOMLEFT">
<Offset x="10" y="-40"/>
</Anchor>
</Anchors>
@@ -212,6 +344,49 @@
</Scripts>
</Slider>

<Slider parentKey="OpacityOnHover" name="$parentOpacityOnHover" inherits="OptionsSliderTemplate" minValue="0" maxValue="1" valueStep="0.01" defaultValue="1" hidden="true">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="$parentDisplayChargesOnLinked" relativePoint="BOTTOMLEFT">
<Offset x="10" y="-40"/>
</Anchor>
</Anchors>

<Layers>
<Layer level="ARTWORK">
<FontString name="$parentText" inherits="GameFontNormalSmall" text="Opacity when hovered">
<Anchors>
<Anchor point="TOP" relativeTo="$parent">
<Offset>
<AbsDimension x="0" y="11"/>
</Offset>
</Anchor>
</Anchors>
</FontString>

<FontString parentKey="Value" name="$parentValue" inherits="GameFontHighlight">
<Anchors>
<Anchor point="BOTTOM" relativeTo="$parent">
<Offset>
<AbsDimension x="0" y="-15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>

<Scripts>
<OnLoad>
self.Low:SetText("0%")
self.High:SetText("100%")
</OnLoad>
<OnValueChanged>
OpacityOnHoverValueChanged(self)
self.Value:SetText(string.format("%d%s", self:GetValue() * 100, "%"))
</OnValueChanged>
</Scripts>
</Slider>

<!-- Footer github url -->
<Button parentKey="Obs" name="$parentObs" hidden="false">
<Size x="300" y="15"/>
2 changes: 1 addition & 1 deletion src/init.lua
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ local MinimapIcon = TodoAddon.MinimapIcon
-- Init keybindings
--------------------------------------
BINDING_HEADER_TC_HEADER = addonName
BINDING_NAME_TC_TOGGLE_FRAME = "Toggle log visibility"
BINDING_NAME_TC_TOGGLE_FRAME = "Toggle window"

-- Export the method TodoChecklisterFrame:Toggle to a global function
-- so that it can be called from a keybind
1 change: 1 addition & 0 deletions src/init.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Include file="utils\libs.xml"/>
<Include file="utils\utils.xml"/>
<Include file="config\config.xml"/>
<Include file="model\model.xml"/>
212 changes: 212 additions & 0 deletions src/libs/LibDBIcon-1.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 7
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

if not CallbackHandler then return end -- No upgrade needed

local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}

-- Lua APIs
local tconcat = table.concat
local assert, error, loadstring = assert, error, loadstring
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
local next, select, pairs, type, tostring = next, select, pairs, type, tostring

-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler

local xpcall = xpcall

local function errorhandler(err)
return geterrorhandler()(err)
end

local function Dispatch(handlers, ...)
local index, method = next(handlers)
if not method then return end
repeat
xpcall(method, errorhandler, ...)
index, method = next(handlers, index)
until not method
end

--------------------------------------------------------------------------
-- CallbackHandler:New
--
-- target - target object to embed public APIs in
-- RegisterName - name of the callback registration API, default "RegisterCallback"
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.

function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)

RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
UnregisterAllName = "UnregisterAllCallbacks"
end

-- we declare all objects and exported APIs inside this closure to quickly gain access
-- to e.g. function names, the "target" parameter, etc


-- Create the registry object
local events = setmetatable({}, meta)
local registry = { recurse=0, events=events }

-- registry:Fire() - fires the given event/message into the registry
function registry:Fire(eventname, ...)
if not rawget(events, eventname) or not next(events[eventname]) then return end
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1

Dispatch(events[eventname], eventname, ...)

registry.recurse = oldrecurse

if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for self,func in pairs(callbacks) do
events[eventname][self] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
registry.OnUsed(registry, target, eventname)
first = nil
end
end
end
registry.insertQueue = nil
end
end

-- Registration of a callback, handles:
-- self["method"], leads to self["method"](self, ...)
-- self with function ref, leads to functionref(...)
-- "addonId" (instead of self) with function ref, leads to functionref(...)
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
if type(eventname) ~= "string" then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
end

method = method or eventname

local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.

if type(method) ~= "string" and type(method) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
end

local regfunc

if type(method) == "string" then
-- self["method"] calling style
if type(self) ~= "table" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
elseif type(self[method]) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
end

if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) self[method](self,arg,...) end
else
regfunc = function(...) self[method](self,...) end
end
else
-- function ref with self=object or self="addonId" or self=thread
if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
end

if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) method(arg,...) end
else
regfunc = method
end
end


if events[eventname][self] or registry.recurse<1 then
-- if registry.recurse<1 then
-- we're overwriting an existing entry, or not currently recursing. just set it.
events[eventname][self] = regfunc
-- fire OnUsed callback?
if registry.OnUsed and first then
registry.OnUsed(registry, target, eventname)
end
else
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self] = regfunc
end
end

-- Unregister a callback
target[UnregisterName] = function(self, eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
end
if type(eventname) ~= "string" then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
end
if rawget(events, eventname) and events[eventname][self] then
events[eventname][self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(events[eventname]) then
registry.OnUnused(registry, target, eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
registry.insertQueue[eventname][self] = nil
end
end

-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
if UnregisterAllName then
target[UnregisterAllName] = function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
end
if select("#",...)==1 and ...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
end


for i=1,select("#",...) do
local self = select(i,...)
if registry.insertQueue then
for eventname, callbacks in pairs(registry.insertQueue) do
if callbacks[self] then
callbacks[self] = nil
end
end
end
for eventname, callbacks in pairs(events) do
if callbacks[self] then
callbacks[self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(callbacks) then
registry.OnUnused(registry, target, eventname)
end
end
end
end
end
end

return registry
end


-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
-- try to upgrade old implicit embeds since the system is selfcontained and
-- relies on closures to work.

12 changes: 12 additions & 0 deletions src/libs/LibDBIcon-1.0/LibDBIcon-1.0.toc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## Interface: 80200
## LoadOnDemand: 1
## Title: Lib: DataBrokerIcon-1.0
## Notes: Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays.
## Author: Funkydude
## X-Category: Library
## X-License: GPLv2 or later
## X-Credits: Rabbit, copystring

embeds.xml
LibDBIcon-1.0\lib.xml

470 changes: 470 additions & 0 deletions src/libs/LibDBIcon-1.0/LibDBIcon-1.0/LibDBIcon-1.0.lua

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions src/libs/LibDBIcon-1.0/LibDBIcon-1.0/lib.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">

<Script file="LibDBIcon-1.0.lua"/>

</Ui>

90 changes: 90 additions & 0 deletions src/libs/LibDBIcon-1.0/LibDataBroker-1.1/LibDataBroker-1.1.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

assert(LibStub, "LibDataBroker-1.1 requires LibStub")
assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")

local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4)
if not lib then return end
oldminor = oldminor or 0


lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks

if oldminor < 2 then
lib.domt = {
__metatable = "access denied",
__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
}
end

if oldminor < 3 then
lib.domt.__newindex = function(self, key, value)
if not attributestorage[self] then attributestorage[self] = {} end
if attributestorage[self][key] == value then return end
attributestorage[self][key] = value
local name = namestorage[self]
if not name then return end
callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
end
end

if oldminor < 2 then
function lib:NewDataObject(name, dataobj)
if self.proxystorage[name] then return end

if dataobj then
assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
self.attributestorage[dataobj] = {}
for i,v in pairs(dataobj) do
self.attributestorage[dataobj][i] = v
dataobj[i] = nil
end
end
dataobj = setmetatable(dataobj or {}, self.domt)
self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
return dataobj
end
end

if oldminor < 1 then
function lib:DataObjectIterator()
return pairs(self.proxystorage)
end

function lib:GetDataObjectByName(dataobjectname)
return self.proxystorage[dataobjectname]
end

function lib:GetNameByDataObject(dataobject)
return self.namestorage[dataobject]
end
end

if oldminor < 4 then
local next = pairs(attributestorage)
function lib:pairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return next, attributestorage[dataobj], nil
end

local ipairs_iter = ipairs(attributestorage)
function lib:ipairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return ipairs_iter, attributestorage[dataobj], 0
end
end
51 changes: 51 additions & 0 deletions src/libs/LibDBIcon-1.0/LibStub/LibStub.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]

-- Check to see is this version of the stub is obsolete
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR

-- LibStub:NewLibrary(major, minor)
-- major (string) - the major version of the library
-- minor (string or number ) - the minor version of the library
--
-- returns nil if a newer or same version of the lib is already present
-- returns empty library object or old library object if upgrade is needed
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")

local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end

-- LibStub:GetLibrary(major, [silent])
-- major (string) - the major version of the library
-- silent (boolean) - if true, library is optional, silently return nil if its not found
--
-- throws an error if the library can not be found (except silent is set)
-- returns the library object if found
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end

-- LibStub:IterateLibraries()
--
-- Returns an iterator for the currently registered libraries
function LibStub:IterateLibraries()
return pairs(self.libs)
end

setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
9 changes: 9 additions & 0 deletions src/libs/LibDBIcon-1.0/embeds.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">

<Script file="LibStub\LibStub.lua"/>
<Script file="CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
<Script file="LibDataBroker-1.1\LibDataBroker-1.1.lua"/>

</Ui>

14 changes: 14 additions & 0 deletions src/libs/LibStub/Changelog-LibStub-1.0.2-70000.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
------------------------------------------------------------------------
r106 | kaelten | 2016-08-18 04:06:06 +0000 (Thu, 18 Aug 2016) | 1 line
Changed paths:
A /tags/1.0.2-70000 (from /trunk:105)

Tagging as 1.0.2-70000
------------------------------------------------------------------------
r105 | kaelten | 2016-08-18 04:00:27 +0000 (Thu, 18 Aug 2016) | 2 lines
Changed paths:
M /trunk/LibStub.toc

Updating ToC for Legion.

------------------------------------------------------------------------
51 changes: 51 additions & 0 deletions src/libs/LibStub/LibStub.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/libstub/ for more info
-- LibStub is hereby placed in the Public Domain
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]

-- Check to see is this version of the stub is obsolete
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR

-- LibStub:NewLibrary(major, minor)
-- major (string) - the major version of the library
-- minor (string or number ) - the minor version of the library
--
-- returns nil if a newer or same version of the lib is already present
-- returns empty library object or old library object if upgrade is needed
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")

local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end

-- LibStub:GetLibrary(major, [silent])
-- major (string) - the major version of the library
-- silent (boolean) - if true, library is optional, silently return nil if its not found
--
-- throws an error if the library can not be found (except silent is set)
-- returns the library object if found
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end

-- LibStub:IterateLibraries()
--
-- Returns an iterator for the currently registered libraries
function LibStub:IterateLibraries()
return pairs(self.libs)
end

setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
13 changes: 13 additions & 0 deletions src/libs/LibStub/LibStub.toc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Interface: 70000
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://www.wowace.com/addons/libstub/
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0.2-70000
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline

LibStub.lua
41 changes: 41 additions & 0 deletions src/libs/LibStub/tests/test.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
debugstack = debug.traceback
strmatch = string.match

loadfile("../LibStub.lua")()

local lib, oldMinor = LibStub:NewLibrary("Pants", 1) -- make a new thingy
assert(lib) -- should return the library table
assert(not oldMinor) -- should not return the old minor, since it didn't exist

-- the following is to create data and then be able to check if the same data exists after the fact
function lib:MyMethod()
end
local MyMethod = lib.MyMethod
lib.MyTable = {}
local MyTable = lib.MyTable

local newLib, newOldMinor = LibStub:NewLibrary("Pants", 1) -- try to register a library with the same version, should silently fail
assert(not newLib) -- should not return since out of date

local newLib, newOldMinor = LibStub:NewLibrary("Pants", 0) -- try to register a library with a previous, should silently fail
assert(not newLib) -- should not return since out of date

local newLib, newOldMinor = LibStub:NewLibrary("Pants", 2) -- register a new version
assert(newLib) -- library table
assert(rawequal(newLib, lib)) -- should be the same reference as the previous
assert(newOldMinor == 1) -- should return the minor version of the previous version

assert(rawequal(lib.MyMethod, MyMethod)) -- verify that values were saved
assert(rawequal(lib.MyTable, MyTable)) -- verify that values were saved

local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 3 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib) -- library table
assert(newOldMinor == 2) -- previous version was 2

local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 4 and please ignore 15 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib)
assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string)

local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
assert(newLib)
assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
27 changes: 27 additions & 0 deletions src/libs/LibStub/tests/test2.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
debugstack = debug.traceback
strmatch = string.match

loadfile("../LibStub.lua")()

for major, library in LibStub:IterateLibraries() do
-- check that MyLib doesn't exist yet, by iterating through all the libraries
assert(major ~= "MyLib")
end

assert(not LibStub:GetLibrary("MyLib", true)) -- check that MyLib doesn't exist yet by direct checking
assert(not pcall(LibStub.GetLibrary, LibStub, "MyLib")) -- don't silently fail, thus it should raise an error.
local lib = LibStub:NewLibrary("MyLib", 1) -- create the lib
assert(lib) -- check it exists
assert(rawequal(LibStub:GetLibrary("MyLib"), lib)) -- verify that :GetLibrary("MyLib") properly equals the lib reference

assert(LibStub:NewLibrary("MyLib", 2)) -- create a new version

local count=0
for major, library in LibStub:IterateLibraries() do
-- check that MyLib exists somewhere in the libraries, by iterating through all the libraries
if major == "MyLib" then -- we found it!
count = count +1
assert(rawequal(library, lib)) -- verify that the references are equal
end
end
assert(count == 1) -- verify that we actually found it, and only once
14 changes: 14 additions & 0 deletions src/libs/LibStub/tests/test3.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
debugstack = debug.traceback
strmatch = string.match

loadfile("../LibStub.lua")()

local proxy = newproxy() -- non-string

assert(not pcall(LibStub.NewLibrary, LibStub, proxy, 1)) -- should error, proxy is not a string, it's userdata
local success, ret = pcall(LibStub.GetLibrary, proxy, true)
assert(not success or not ret) -- either error because proxy is not a string or because it's not actually registered.

assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.

assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
41 changes: 41 additions & 0 deletions src/libs/LibStub/tests/test4.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
debugstack = debug.traceback
strmatch = string.match

loadfile("../LibStub.lua")()


-- Pretend like loaded libstub is old and doesn't have :IterateLibraries
assert(LibStub.minor)
LibStub.minor = LibStub.minor - 0.0001
LibStub.IterateLibraries = nil

loadfile("../LibStub.lua")()

assert(type(LibStub.IterateLibraries)=="function")


-- Now pretend that we're the same version -- :IterateLibraries should NOT be re-created
LibStub.IterateLibraries = 123

loadfile("../LibStub.lua")()

assert(LibStub.IterateLibraries == 123)


-- Now pretend that a newer version is loaded -- :IterateLibraries should NOT be re-created
LibStub.minor = LibStub.minor + 0.0001

loadfile("../LibStub.lua")()

assert(LibStub.IterateLibraries == 123)


-- Again with a huge number
LibStub.minor = LibStub.minor + 1234567890

loadfile("../LibStub.lua")()

assert(LibStub.IterateLibraries == 123)


print("OK")
7 changes: 7 additions & 0 deletions src/libs/libs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibStub\LibStub.lua"/>
<Include file="LibDBIcon-1.0\embeds.xml"/>
<Include file="LibDBIcon-1.0\lib.xml"/>
</Ui>
76 changes: 74 additions & 2 deletions src/model/settings.lua
Original file line number Diff line number Diff line change
@@ -55,7 +55,7 @@ function Settings:Opacity()
return TodoChecklisterSettingsDB.windowOpacity
end

---@param isKeepFocusShown boolean @Sets the alpha value of 0 to 1 for the window opacity
---@param opacity number @Sets the alpha value of 0 to 1 for the window opacity
function Settings:SetOpacity(opacity)
TodoChecklisterSettingsDB.windowOpacity = opacity
end
@@ -80,6 +80,56 @@ function Settings:SetDisplayLinked(displayLinked)
TodoChecklisterSettingsDB.displayLinked = displayLinked
end

---@return boolean @Whether or not to display the icon on minimap
function Settings:DisplayMinimapIcon()
return TodoChecklisterSettingsDB.displayMinimapIcon
end

---@param displayMinimapIcon boolean @Whether or not to display the icon on minimap
function Settings:SetDisplayMinimapIcon(displayMinimapIcon)
TodoChecklisterSettingsDB.displayMinimapIcon = displayMinimapIcon
end

---@return boolean @Whether or not to display chat messages
function Settings:ChatMuted()
return TodoChecklisterSettingsDB.chatMuted
end

---@param displayLinked boolean @Sets whether or not to display chat messages
function Settings:SetChatMuted(chatMuted)
TodoChecklisterSettingsDB.chatMuted = chatMuted
end

---@return number @The alpha value of 0 to 1 for the window opacity when hovering the mouse
function Settings:OpacityOnHover()
return TodoChecklisterSettingsDB.windowOpacityOnHover
end

---@param opacity number @Sets the alpha value of 0 to 1 for the window opacity when hovering the mouse
function Settings:SetOpacityOnHover(opacity)
TodoChecklisterSettingsDB.windowOpacityOnHover = opacity
end

---@return boolean @Whether or not should count bank items on linked items
function Settings:DisplayBankOnLinked()
return TodoChecklisterSettingsDB.displayBankOnLinked
end

---@param displayBankOnLinked boolean @Whether or not should count bank items on linked items
function Settings:SetDisplayBankOnLinked(displayBankOnLinked)
TodoChecklisterSettingsDB.displayBankOnLinked = displayBankOnLinked
end

---@return boolean @Whether or not should count charges on linked items
function Settings:DisplayChargesOnLinked()
return TodoChecklisterSettingsDB.displayChargesOnLinked
end

---@param displayChargesOnLinked boolean @Sets whether or not should count charges on linked items
function Settings:SetDisplayChargesOnLinked(displayChargesOnLinked)
TodoChecklisterSettingsDB.displayChargesOnLinked = displayChargesOnLinked
end

--------------------------------------
-- Lifecycle Events
--------------------------------------
@@ -95,7 +145,12 @@ function Settings:Defaults()
isKeepFocusShown = true,
windowOpacity = 1,
playFanfare = true,
displayLinked = true
displayLinked = true,
displayMinimapIcon = true,
chatMuted = false,
windowOpacityOnHover = 1,
displayBankOnLinked = true,
displayChargesOnLinked = true
}
)
end
@@ -113,6 +168,11 @@ function Settings:Init()
---@field public windowOpacity number|nil @The alpha value of 0 to 1 for the window opacity
---@field public playFanfare boolean|nil @Whether or not a fanfare sound should be played
---@field public displayLinked boolean|nil @Whether or not to display linked items count from bag
---@field public displayMinimapIcon boolean|nil @Whether or not to display the icon on minimap
---@field public chatMuted boolean|nil @Whether or not to display chat messages
---@field public windowOpacityOnHover number|nil @The alpha value of 0 to 1 for the window opacity when hovering the mouse
---@field public displayBankOnLinked number|nil @Whether or not should count bank items on linked items
---@field public displayChargesOnLinked number|nil @Whether or not should count charges on linked items
TodoChecklisterSettingsDB = {}
self:Defaults()
end
@@ -132,4 +192,16 @@ function Settings:Init()
if (TodoChecklisterSettingsDB.displayLinked == nil) then
self:SetDisplayLinked(true)
end

if (TodoChecklisterSettingsDB.displayMinimapIcon == nil) then
self:SetDisplayMinimapIcon(true)
end

if (TodoChecklisterSettingsDB.displayChargesOnLinked == nil) then
self:SetDisplayBankOnLinked(true)
end

if (TodoChecklisterSettingsDB.displayChargesOnLinked == nil) then
self:SetDisplayChargesOnLinked(true)
end
end
14 changes: 11 additions & 3 deletions src/modules/chat.lua
Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@ local Utils = TodoAddon.Utils
local TodoChecklisterFrame = TodoAddon.TodoChecklisterFrame
---@class InterfaceOptions
local InterfaceOptions = TodoAddon.InterfaceOptions
---@class Settings
local Settings = TodoAddon.Settings

--------------------------------------
-- Declarations
@@ -32,6 +34,10 @@ Chat.commands = {
TodoChecklisterFrame:Toggle()
end,
["add"] = function(...)
if (TodoChecklisterFrame.selectedItem and TodoChecklisterFrame.selectedItem > 0) then
TodoChecklisterFrame:ClearSelected()
TodoChecklisterFrame:OnUpdate()
end
TodoChecklisterFrame:AddItem(strjoin(" ", ...))
end,
["rmv"] = function(indexToRemove)
@@ -71,9 +77,11 @@ Chat.commands = {
-- Chat functions
--------------------------------------
function Chat:Print(...)
local hex = select(4, Utils:GetThemeColor())
local prefix = string.format("|cff%s%s|r", hex:upper(), addonName)
DEFAULT_CHAT_FRAME:AddMessage(string.join(" ", prefix, ...))
if (not Settings:ChatMuted()) then
local hex = select(4, Utils:GetThemeColor())
local prefix = string.format("|cff%s%s|r", hex:upper(), addonName)
DEFAULT_CHAT_FRAME:AddMessage(string.join(" ", prefix, ...))
end
end

--------------------------------------
30 changes: 22 additions & 8 deletions src/modules/minimapIcon.lua
Original file line number Diff line number Diff line change
@@ -8,6 +8,8 @@ local addonName = select(1, ...)

---@class TodoChecklisterFrame
local TodoChecklisterFrame = TodoAddon.TodoChecklisterFrame
---@class Settings
local Settings = TodoAddon.Settings

--------------------------------------
-- Declarations
@@ -17,19 +19,30 @@ TodoAddon.MinimapIcon = {}
---@class MinimapIcon
local MinimapIcon = TodoAddon.MinimapIcon

---
---The SavedVariable where the map settings are stored into
---@class TodoMapIcon
local DB = TodoChecklisterMapIcon

--------------------------------------
-- Lifecycle Events
--------------------------------------
---
---Load required configuration for this class
function MinimapIcon:LoadCFG()
if LibStub("LibDBIcon-1.0", true) then
local icon = LibStub("LibDBIcon-1.0")
if (Settings:DisplayMinimapIcon()) then
icon:Show(addonName)
else
icon:Hide(addonName)
end
end
end

---
---Initializes the minimap icon if the user can have it
function MinimapIcon:Init()
if type(DB) ~= "table" then
DB = {hide = false}
if type(TodoChecklisterMapIcon) ~= "table" then
---
---The SavedVariable where the map settings are stored into
---@class TodoMapIcon
TodoChecklisterMapIcon = {hide = false}
end

if LibStub("LibDBIcon-1.0", true) then
@@ -50,6 +63,7 @@ function MinimapIcon:Init()
}
)

LibStub("LibDBIcon-1.0"):Register(addonName, minimapIconLDB, DB)
LibStub("LibDBIcon-1.0"):Register(addonName, minimapIconLDB, TodoChecklisterMapIcon)
self:LoadCFG()
end
end

0 comments on commit 5e23e62

Please sign in to comment.