AuctioneerSuite/Informant/InfSettings.lua
2026-04-13 17:48:13 -04:00

476 lines
15 KiB
Lua

--[[
Informant - An addon for World of Warcraft that shows pertinent information about
an item in a tooltip when you hover over the item in the game.
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: InfSettings.lua 4533 2009-11-21 03:43:55Z Hirsute $
URL: http://auctioneeraddon.com/dl/Informant/
Command handler. Assumes responsibility for allowing the user to set the
options via slash command, MyAddon etc.
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Note:
This AddOn's source code is specifically designed to work with
World of Warcraft's interpreted AddOn system.
You have an implicit license to use this AddOn with these facilities
since that is its designated purpose as per:
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
data layout:
InformantConfig = {
["profile.test4"] = {
["all"] = true,
["enable"] = true,
},
["profiles"] = {
"Default", -- [1]
"test4", -- [2]
},
["users.Foobar.Picksell"] = "test4",
["profile.Default"] = {
["miniicon.angle"] = 187,
["miniicon.distance"] = 15,
},
}
if user does not have a set profile name, they get the default profile
Usage:
def = Informant.Settings.GetDefault('TooltipShowValues')
val = Informant.Settings.GetSetting('TooltipShowValues')
Informant.Settings.SetSetting('TooltipShowValues', true );
]]
Informant_RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Informant/InfSettings.lua $", "$Rev: 4533 $")
local lib = {}
Informant.Settings = lib
local private = {}
local gui
local debugPrint
local function getUserSig()
local userSig = string.format("users.%s.%s", GetRealmName(), UnitName("player"))
return userSig
end
local function getUserProfileName()
if (not InformantConfig) then InformantConfig = {} end
local userSig = getUserSig()
return InformantConfig[userSig] or "Default"
end
local function getUserProfile()
if (not InformantConfig) then InformantConfig = {} end
local profileName = getUserProfileName()
if (not InformantConfig["profile."..profileName]) then
if profileName ~= "Default" then
profileName = "Default"
InformantConfig[getUserSig()] = "Default"
end
if profileName == "Default" then
InformantConfig["profile."..profileName] = {}
end
end
return InformantConfig["profile."..profileName]
end
local function cleanse( profile )
if (profile) then
profile = {}
end
end
-- reset all settings for the current user
function lib.RestoreDefaults()
local profile = getUserProfile()
cleanse(profile)
end
-- Default setting values
-- moved from InfMain.lua filterDefaults
local settingDefaults = {
['all'] = true,
['locale'] = 'default',
['embed'] = false,
['show-vendor'] = true,
['show-vendor-buy'] = true,
['show-vendor-sell'] = true,
['show-usage'] = true,
['show-stack'] = true,
['show-merchant'] = true,
['show-zero-merchants'] = true,
['show-quest'] = true,
['show-ilevel'] = true,
['show-link'] = false,
['auto-update'] = false,
['ModTTShow'] = false,
-- leave this option off until we have real data to test with
-- enable only for dev testing
['show-crafted'] = false,
}
local function getDefault(setting)
-- lookup the simple settings
local result = settingDefaults[setting];
-- no idea what this setting is, so log it for debugging purposes
if (result == nil) then
debugPrint("GetDefault", ENX_INFO, "Unknown key", "default requested for unknown key:" .. setting)
end
return result
end
function lib.GetDefault(setting)
local val = getDefault(setting);
return val;
end
local function setter(setting, value)
if (not InformantConfig) then InformantConfig = {} end
-- turn value into a canonical true or false
if value == 'on' then
value = true
elseif value == 'off' then
value = false
end
-- for defaults, just remove the value and it'll fall through
if (value == 'default') or (value == getDefault(setting)) then
-- Don't save default values
value = nil
end
local a,b,c = strsplit(".", setting)
if (a == "profile") then
if (setting == "profile.save") then
value = gui.elements["profile.name"]:GetText()
-- Create the new profile
InformantConfig["profile."..value] = {}
-- Set the current profile to the new profile
InformantConfig[getUserSig()] = value
-- Get the new current profile
local newProfile = getUserProfile()
-- Clean it out and then resave all data
cleanse(newProfile)
gui:Resave()
-- Add the new profile to the profiles list
local profiles = InformantConfig["profiles"]
if (not profiles) then
profiles = { "Default" }
InformantConfig["profiles"] = profiles
end
-- Check to see if it already exists
local found = false
for pos, name in ipairs(profiles) do
if (name == value) then found = true end
end
-- If not, add it and then sort it
if (not found) then
table.insert(profiles, value)
table.sort(profiles)
end
DEFAULT_CHAT_FRAME:AddMessage(_TRANS("INF_Help_ChatProfileSaved")..value)
elseif (setting == "profile.delete") then
-- User clicked the Delete button, see what the select box's value is.
value = gui.elements["profile"].value
-- If there's a profile name supplied
if (value) then
-- Clean it's profile container of values
cleanse(InformantConfig["profile."..value])
-- Delete it's profile container
InformantConfig["profile."..value] = nil
-- Find it's entry in the profiles list
local profiles = InformantConfig["profiles"]
if (profiles) then
for pos, name in ipairs(profiles) do
-- If this is it, then extract it
if (name == value and name ~= "Default") then
table.remove(profiles, pos)
end
end
end
-- If the user was using this one, then move them to Default
if (getUserProfileName() == value) then
InformantConfig[getUserSig()] = 'Default'
end
DEFAULT_CHAT_FRAME:AddMessage(_TRANS("INF_Help_ChatProfileDeleted")..value)
end
elseif (setting == "profile.default") then
-- User clicked the reset settings button
-- Get the current profile from the select box
value = gui.elements["profile"].value
-- Clean it's profile container of values
InformantConfig["profile."..value] = {}
DEFAULT_CHAT_FRAME:AddMessage(_TRANS("INF_Help_ChatProfileReset")..value)
elseif (setting == "profile") then
-- User selected a different value in the select box, get it
value = gui.elements["profile"].value
-- Change the user's current profile to this new one
InformantConfig[getUserSig()] = value
DEFAULT_CHAT_FRAME:AddMessage(_TRANS("INF_Help_ChatProfileUsing")..value)
end
-- Refresh all values to reflect current data
gui:Refresh()
else
-- Set the value for this setting in the current profile
local db = getUserProfile()
db[setting] = value
end
if (a == "sideIcon") and Informant.SideIcon then
-- not implemented yet
-- Informant.SideIcon.Update()
end
end
function lib.SetSetting(...)
setter(...)
if (gui) then
gui:Refresh()
end
end
local function getter(setting)
if (not InformantConfig) then InformantConfig = {} end
if not setting then return end
local a,b,c = strsplit(".", setting)
if (a == 'profile') then
if (b == 'profiles') then
local pList = InformantConfig["profiles"]
if (not pList) then
pList = { "Default" }
end
return pList
end
end
if (setting == 'profile') then
return getUserProfileName()
end
local db = getUserProfile()
if ( db[setting] ~= nil ) then
return db[setting]
else
return getDefault(setting)
end
end
function lib.GetSetting(setting, default)
local option = getter(setting)
if ( option ~= nil ) then
return option
else
return default
end
end
function lib.UpdateGuiConfig()
if gui then
if gui:IsVisible() then
gui:Hide()
end
gui = nil
lib.MakeGuiConfig()
end
end
function lib.MakeGuiConfig()
if gui then return end
local id, last, cont
local Configator = LibStub:GetLibrary("Configator")
gui = Configator:Create(setter, getter)
lib.Gui = gui
gui:AddCat("Informant") -- TODO - localize me!
id = gui:AddTab("General")
gui:AddControl(id, "Header", 0, _TRANS('INF_Interface_GeneralOptions'))
gui:AddControl(id, "Checkbox", 0, 1, "all", _TRANS('INF_Interface_EnableInformant') )
gui:AddTip(id, _TRANS('INF_HelpTooltip_EnableInformant'))
gui:AddControl(id, "Checkbox", 0, 1, "embed", _TRANS('INF_Interface_Embed') )
gui:AddTip(id, _TRANS('INF_HelpTooltip_Embed'))
gui:AddControl(id, "Checkbox", 0, 1, "show-vendor", _TRANS('INF_Interface_VendorToggle'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_VendorToggle'))
gui:AddControl(id, "Checkbox", 0, 1, "show-vendor-buy", _TRANS('INF_Interface_ShowVendorBuy'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowVendorBuy'))
gui:AddControl(id, "Checkbox", 0, 1, "show-vendor-sell", _TRANS('INF_Interface_ShowVendorSell'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowVendorSell'))
gui:AddControl(id, "Checkbox", 0, 1, "show-usage", _TRANS('INF_Interface_ShowUsage'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowUsage'))
gui:AddControl(id, "Checkbox", 0, 1, "show-stack", _TRANS('INF_Interface_ShowStack'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowStack'))
gui:AddControl(id, "Checkbox", 0, 1, "show-merchant", _TRANS('INF_Interface_ShowMerchant'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowMerchant'))
gui:AddControl(id, "Checkbox", 0, 1, "show-zero-merchants", _TRANS('INF_Interface_ShowZeroMerchants'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowZeroMerchants'))
gui:AddControl(id, "Checkbox", 0, 1, "show-quest", _TRANS('INF_Interface_ShowQuest'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowQuest'))
gui:AddControl(id, "Checkbox", 0, 1, "show-ilevel", _TRANS('INF_Interface_ShowIlevel'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowIlevel'))
gui:AddControl(id, "Checkbox", 0, 1, "show-link", _TRANS('INF_Interface_ShowLink'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowLink'))
gui:AddControl(id, "Checkbox", 0, 1, "show-crafted", _TRANS('INF_Interface_ShowCrafted'))
gui:AddTip(id, _TRANS('INF_HelpTooltip_ShowCrafted'))
gui:AddControl(id, "Checkbox", 0, 1, "ModTTShow", _TRANS('INF_Interface_ModTTShow'))--Only show tooltip if Alt is pressed.
gui:AddTip(id, _TRANS('INF_HelpTooltip_ModTTShow'))--This will prevent the display of Informant's extra tooltip unless Alt is pressed.
-- TODO - localize me!
gui:AddControl(id, "Checkbox", 0, 1, "auto-update", _TRANS('INF_Interface_AutoUpdate')) --"Automatically update item information at merchants"
gui:AddTip(id, _TRANS('INF_HelpTooltip_AutoUpdate')) --"Allow Informant to scan your bags and merchant inventory for updates"
-- TODO - localize me!
gui:AddHelp(id, "what is",
_TRANS('INF_Help_WhatIs'), --"What is Informant?"
_TRANS('INF_Help_WhatIsAnswer')) --"Informant provides extra information about items in tooltips, in an information window, and to other addons."
gui:AddHelp(id, "how to use information window",
_TRANS('INF_Help_HowInfoWin'), --"How do I use the Information Window?"
_TRANS('INF_Help_HowInfoWinAnswer')) --"You can bind a key to toggle the Informant information window to get more detailed information about items. To do this, you need to open game options, select \"Key Bindings\" and look for Informant: Toggle Information Window."
--Copied from ADV
id = gui:AddTab("Profiles")
gui:AddControl(id, "Header", 0, _TRANS('INF_Interface_SetupProfile')) --"Setup, Configure and Edit Profiles"
gui:AddControl(id, "Subhead", 0, _TRANS('INF_Interface_ActivateProfile')) --"Activate a current profile"
gui:AddControl(id, "Selectbox", 0, 1, "profile.profiles", "profile", "Switch to the given profile") --This string isn't shown?
gui:AddTip(id, _TRANS('INF_HelpTooltip_ActivateProfile')) --"Select the profile that you wish to use for this character"
gui:AddControl(id, "Button", 0, 1, "profile.delete", _TRANS('INF_Interface_Delete')) --"Delete"
gui:AddTip(id, _TRANS('INF_HelpTooltip_DeleteProfile')) --"Deletes the currently selected profile"
gui:AddControl(id, "Button", 0, 1, "profile.default", _TRANS('INF_Interface_DefaultProfile'))
gui:AddTip(id, _TRANS('INF_Helptooltip_DefaultProfile')) -- Reset all settings for the current profile"
gui:AddControl(id, "Subhead", 0, _TRANS('INF_Interface_CreateProfile')) --"Create or replace a profile"
gui:AddControl(id, "Text", 0, 1, "profile.name", _TRANS('INF_Interface_ProfileName')) --"New profile name:"
gui:AddTip(id, _TRANS('INF_HelpTooltip_ProfileName')) --"Enter the name of the profile that you wish to create"
gui:AddControl(id, "Button", 0, 1, "profile.save", _TRANS('INF_Interface_SaveProfile')) --"Save"
gui:AddTip(id, _TRANS('INF_HelpTooltip_ProfileSave')) --"Click this button to create or overwrite the specified profile name")
-- TODO - localize me!
-- these are stolen from EnhTT
gui:AddHelp(id, "what is",
"What is a profile?",
"A profile is used to contain a group of settings, you can use different profiles for different characters, or switch between profiles for the same character when doing different tasks."
)
gui:AddHelp(id, "how to create",
"How do I create a new profile?",
"You enter the name of the new profile that you wish to create into the text box labelled \"New profile name\", and then click the \"Save\" button. A profile may be called whatever you wish, but it should reflect the purpose of the profile so that you may more easily recall that purpose at a later date."
)
gui:AddHelp(id, "how to delete",
"How do I delete a profile?",
"To delete a profile, simply select the profile you wish to delete with the drop-down selection box and then click the Delete button."
)
gui:AddHelp(id, "why delete",
"Why would I want to delete a profile?",
"You can delete a profile when you don't want to use it anymore, or you want to create it from scratch again with default values. Deleting a profile will also affect any other characters who are using the profile."
)
end
-------------------------------------------------------------------------------
-- Prints the specified message to nLog.
--
-- syntax:
-- errorCode, message = debugPrint([message][, title][, errorCode][, level])
--
-- parameters:
-- message - (string) the error message
-- nil, no error message specified
-- title - (string) the title for the debug message
-- nil, no title specified
-- errorCode - (number) the error code
-- nil, no error code specified
-- level - (string) nLog message level
-- Any nLog.levels string is valid.
-- nil, no level specified
--
-- returns:
-- errorCode - (number) errorCode, if one is specified
-- nil, otherwise
-- message - (string) message, if one is specified
-- nil, otherwise
-------------------------------------------------------------------------------
function debugPrint(message, title, errorCode, level)
return Informant.DebugPrint(message, "InfSettings", title, errorCode, level)
end