Files
pfUI-DQB/gui.lua
T
2026-09-05 12:51:02 +01:00

1261 lines
30 KiB
Lua

------------------------------------------------------------
-- pfUI-DQB
-- gui.lua
--
-- Registers DQB configuration inside pfUI's GUI.
------------------------------------------------------------
local DQB = pfUI and pfUI.dqb
if not DQB then
return
end
------------------------------------------------------------
-- Create DQB configuration menu
------------------------------------------------------------
function DQB:CreateGUI()
--------------------------------------------------------
-- Make sure pfUI GUI is available
--------------------------------------------------------
if not pfUI.gui then
return
end
--------------------------------------------------------
-- Make sure our configuration exists
--------------------------------------------------------
if self.InitializeConfig then
self:InitializeConfig()
end
if not pfUI_config or not pfUI_config.dqb then
return
end
--------------------------------------------------------
-- pfUI GUI helpers
--------------------------------------------------------
local CreateConfig = pfUI.gui.CreateConfig
local CreateGUIEntry = pfUI.gui.CreateGUIEntry
if not CreateConfig or not CreateGUIEntry then
return
end
--------------------------------------------------------
-- Set text enabled / disabled appearance
--------------------------------------------------------
local function SetTextEnabled(text, enabled)
if not text then
return
end
if enabled then
text:SetTextColor(
1, 1, 1, 1
)
else
text:SetTextColor(
0.5, 0.5, 0.5, 1
)
end
end
--------------------------------------------------------
-- Enable / disable configuration row
--
-- Different pfUI controls use different objects:
--
-- checkbox / button:
-- Enable() / Disable()
--
-- slider:
-- EnableMouse()
--
-- color:
-- EnableMouse() or Enable()/Disable()
--
--------------------------------------------------------
local function SetFrameEnabled(frame, enabled)
if not frame then
return
end
----------------------------------------------------
-- Main input
----------------------------------------------------
if frame.input then
local input = frame.input
if type(input.Enable) == "function"
and type(input.Disable) == "function" then
if enabled then
input:Enable()
else
input:Disable()
end
elseif type(input.EnableMouse) == "function" then
input:EnableMouse(enabled)
end
end
----------------------------------------------------
-- Color picker
----------------------------------------------------
if frame.color then
local color = frame.color
if type(color.Enable) == "function"
and type(color.Disable) == "function" then
if enabled then
color:Enable()
else
color:Disable()
end
elseif type(color.EnableMouse) == "function" then
color:EnableMouse(enabled)
end
end
----------------------------------------------------
-- Button
----------------------------------------------------
if frame.button then
local button = frame.button
if type(button.Enable) == "function"
and type(button.Disable) == "function" then
if enabled then
button:Enable()
else
button:Disable()
end
elseif type(button.EnableMouse) == "function" then
button:EnableMouse(enabled)
end
end
----------------------------------------------------
-- Grey out the complete row
----------------------------------------------------
if frame.SetAlpha then
if enabled then
frame:SetAlpha(1)
else
frame:SetAlpha(0.5)
end
end
----------------------------------------------------
-- Caption
----------------------------------------------------
SetTextEnabled(
frame.caption,
enabled
)
----------------------------------------------------
-- Slider value
----------------------------------------------------
SetTextEnabled(
frame.value,
enabled
)
end
--------------------------------------------------------
-- Create opacity slider
--
-- pfUI CreateConfig does not provide the slider we need,
-- so we create the normal configuration row and replace
-- its text input with a real Slider.
--------------------------------------------------------
local function CreateOpacitySlider(
caption,
category,
config
)
----------------------------------------------------
-- Create normal pfUI row
----------------------------------------------------
local frame = CreateConfig(
nil,
caption,
category,
config,
"text"
)
if not frame then
return nil
end
----------------------------------------------------
-- Hide normal EditBox
----------------------------------------------------
if frame.input then
frame.input:Hide()
end
----------------------------------------------------
-- Create slider
----------------------------------------------------
local slider = CreateFrame(
"Slider",
nil,
frame
)
slider:SetWidth(180)
slider:SetHeight(10)
slider:SetOrientation(
"HORIZONTAL"
)
slider:SetMinMaxValues(
0,
1
)
----------------------------------------------------
-- Slider thumb
----------------------------------------------------
if pfUI.media
and pfUI.media["img:col"] then
slider:SetThumbTexture(
pfUI.media["img:col"]
)
end
----------------------------------------------------
-- Slider position
----------------------------------------------------
slider:SetPoint(
"RIGHT",
frame,
"RIGHT",
-38,
0
)
----------------------------------------------------
-- Apply pfUI slider skin
----------------------------------------------------
if pfUI.api
and pfUI.api.SkinSlider then
local thumb =
slider:GetThumbTexture()
if thumb then
pfUI.api.SkinSlider(slider)
end
end
----------------------------------------------------
-- Get current value
----------------------------------------------------
local value =
tonumber(category[config])
if not value then
value = 0.75
end
if value < 0 then
value = 0
elseif value > 1 then
value = 1
end
----------------------------------------------------
-- Set initial slider value
----------------------------------------------------
slider:SetValue(value)
----------------------------------------------------
-- Value text
----------------------------------------------------
local valueText =
frame:CreateFontString(
nil,
"OVERLAY"
)
valueText:SetFont(
pfUI.font_default,
pfUI_config.global.font_size - 1,
"OUTLINE"
)
valueText:SetJustifyH(
"RIGHT"
)
valueText:SetWidth(34)
valueText:SetPoint(
"RIGHT",
frame,
"RIGHT",
0,
0
)
valueText:SetText(
math.floor(value * 100 + 0.5)
.. "%"
)
----------------------------------------------------
-- Slider value changed
----------------------------------------------------
slider:SetScript(
"OnValueChanged",
function()
local raw =
this:GetValue()
------------------------------------------------
-- Round to 5%
------------------------------------------------
local newValue =
math.floor(
raw * 20 + 0.5
) / 20
if newValue < 0 then
newValue = 0
elseif newValue > 1 then
newValue = 1
end
------------------------------------------------
-- Prevent recursion
------------------------------------------------
if math.abs(
raw - newValue
) > 0.001 then
this:SetValue(
newValue
)
return
end
------------------------------------------------
-- Save value
------------------------------------------------
category[config] =
string.format(
"%.2f",
newValue
)
------------------------------------------------
-- Update visible percentage
------------------------------------------------
if valueText then
valueText:SetText(
math.floor(
newValue * 100 + 0.5
)
.. "%"
)
end
------------------------------------------------
-- Tell pfUI configuration changed
------------------------------------------------
if pfUI.events
and pfUI.events.TriggerEvent then
pfUI.events:TriggerEvent(
"config:changed",
category,
config
)
else
pfUI.gui.settingChanged = true
end
end
)
----------------------------------------------------
-- Mouse wheel
----------------------------------------------------
slider:EnableMouseWheel(
true
)
slider:SetScript(
"OnMouseWheel",
function()
local current =
this:GetValue()
if arg1 > 0 then
current =
current + 0.05
else
current =
current - 0.05
end
if current < 0 then
current = 0
elseif current > 1 then
current = 1
end
this:SetValue(
current
)
end
)
----------------------------------------------------
-- Store references
----------------------------------------------------
frame.input = slider
frame.value = valueText
return frame
end
--------------------------------------------------------
-- Reset pfUI style
--------------------------------------------------------
local function ResetPFUIStyle(
module,
refs
)
if not module then
return
end
local value = nil
----------------------------------------------------
-- Get pfUI global background alpha
----------------------------------------------------
if pfUI_config
and pfUI_config.global
and pfUI_config.global.background_alpha
~= nil then
value =
tostring(
pfUI_config.global.background_alpha
)
end
----------------------------------------------------
-- Fallback
----------------------------------------------------
if not value then
value = "0.75"
end
----------------------------------------------------
-- Save
----------------------------------------------------
module.pfui_background_alpha =
value
----------------------------------------------------
-- Update slider
----------------------------------------------------
if refs
and refs.pfuiAlpha
and refs.pfuiAlpha.input then
local number =
tonumber(value)
if number then
refs.pfuiAlpha.input:SetValue(
number
)
end
end
----------------------------------------------------
-- Mark configuration changed
----------------------------------------------------
if pfUI.gui then
pfUI.gui.settingChanged = true
end
end
--------------------------------------------------------
-- Reset custom values
--------------------------------------------------------
local function ResetCustomStyle(
module,
refs
)
if not module then
return
end
if not module.custom then
module.custom = {}
end
local custom =
module.custom
----------------------------------------------------
-- Remove parchment
----------------------------------------------------
custom.remove_parchment =
"1"
----------------------------------------------------
-- Background color
----------------------------------------------------
if pfUI_config
and pfUI_config.global
and pfUI_config.global.background_color then
custom.background_color =
pfUI_config.global.background_color
else
custom.background_color =
"0,0,0,1"
end
----------------------------------------------------
-- Background opacity
----------------------------------------------------
if pfUI_config
and pfUI_config.global
and pfUI_config.global.background_alpha
~= nil then
custom.background_alpha =
tostring(
pfUI_config.global.background_alpha
)
else
custom.background_alpha =
"0.75"
end
----------------------------------------------------
-- Font
----------------------------------------------------
if pfUI.font_default then
custom.font =
pfUI.font_default
elseif pfUI_config
and pfUI_config.global
and pfUI_config.global.font_default then
custom.font =
pfUI_config.global.font_default
else
custom.font =
"Interface\\AddOns\\pfUI\\fonts\\Myriad-Pro.ttf"
end
----------------------------------------------------
-- DQB visual defaults
----------------------------------------------------
custom.title_color =
"1,0.82,0,1"
custom.text_color =
"1,1,1,1"
----------------------------------------------------
-- Update custom opacity slider
----------------------------------------------------
if refs
and refs.custom
and refs.custom.backgroundAlpha
and refs.custom.backgroundAlpha.input then
local number =
tonumber(
custom.background_alpha
)
if number then
refs.custom.backgroundAlpha.input:SetValue(
number
)
end
end
----------------------------------------------------
-- Mark configuration changed
----------------------------------------------------
if pfUI.gui then
pfUI.gui.settingChanged = true
end
end
--------------------------------------------------------
-- Update module state
--------------------------------------------------------
local function UpdateModuleState(
module,
refs
)
if not module
or not refs then
return
end
----------------------------------------------------
-- Current state
----------------------------------------------------
local usePFUI =
module.use_pfui_style == "1"
local useCustom =
module.use_custom_style == "1"
----------------------------------------------------
-- Style selectors
--
-- The currently selected style remains usable.
-- The other selector is disabled and greyed out.
----------------------------------------------------
SetFrameEnabled(
refs.usePFUI,
not useCustom
)
SetFrameEnabled(
refs.useCustom,
not usePFUI
)
----------------------------------------------------
-- pfUI Style block
----------------------------------------------------
SetFrameEnabled(
refs.pfuiAlpha,
usePFUI
)
SetFrameEnabled(
refs.resetPFUI,
usePFUI
)
----------------------------------------------------
-- Custom Style block
----------------------------------------------------
SetFrameEnabled(
refs.custom.parchment,
useCustom
)
SetFrameEnabled(
refs.custom.backgroundColor,
useCustom
)
SetFrameEnabled(
refs.custom.backgroundAlpha,
useCustom
)
SetFrameEnabled(
refs.custom.font,
useCustom
)
SetFrameEnabled(
refs.custom.titleColor,
useCustom
)
SetFrameEnabled(
refs.custom.textColor,
useCustom
)
SetFrameEnabled(
refs.custom.reset,
useCustom
)
end
--------------------------------------------------------
-- Create one module configuration
--------------------------------------------------------
local function CreateModuleConfig(
module
)
local refs = {
custom = {}
}
----------------------------------------------------
-- Repair invalid old state
--
-- If both styles were saved as enabled by the
-- previous broken version, keep pfUI and disable
-- Custom.
----------------------------------------------------
if module.use_pfui_style == "1"
and module.use_custom_style == "1" then
module.use_custom_style =
"0"
end
----------------------------------------------------
-- USE PFUI STYLE
----------------------------------------------------
refs.usePFUI = CreateConfig(
function()
if module.use_pfui_style == "1" then
------------------------------------------------
-- Disable Custom
------------------------------------------------
module.use_custom_style =
"0"
------------------------------------------------
-- Update checkbox visually
------------------------------------------------
if refs.useCustom
and refs.useCustom.input then
refs.useCustom.input:SetChecked(
false
)
end
end
------------------------------------------------
-- Refresh GUI state
------------------------------------------------
UpdateModuleState(
module,
refs
)
end,
"Use pfUI Style",
module,
"use_pfui_style",
"checkbox"
)
----------------------------------------------------
-- PFUI BACKGROUND OPACITY
----------------------------------------------------
refs.pfuiAlpha =
CreateOpacitySlider(
"pfUI Background Opacity",
module,
"pfui_background_alpha"
)
----------------------------------------------------
-- RESET TO PFUI DEFAULT
----------------------------------------------------
refs.resetPFUI = CreateConfig(
nil,
"Reset to pfUI Default",
module,
"reset_pfui",
"button",
function()
ResetPFUIStyle(
module,
refs
)
end
)
----------------------------------------------------
-- USE CUSTOM STYLE
----------------------------------------------------
refs.useCustom = CreateConfig(
function()
if module.use_custom_style == "1" then
------------------------------------------------
-- Disable pfUI
------------------------------------------------
module.use_pfui_style =
"0"
------------------------------------------------
-- Update checkbox visually
------------------------------------------------
if refs.usePFUI
and refs.usePFUI.input then
refs.usePFUI.input:SetChecked(
false
)
end
end
------------------------------------------------
-- Refresh GUI state
------------------------------------------------
UpdateModuleState(
module,
refs
)
end,
"Use Custom Style",
module,
"use_custom_style",
"checkbox"
)
----------------------------------------------------
-- CUSTOM:
-- Remove Blizzard Parchment Texture
----------------------------------------------------
refs.custom.parchment =
CreateConfig(
nil,
"Remove Blizzard Parchment Texture",
module.custom,
"remove_parchment",
"checkbox"
)
----------------------------------------------------
-- CUSTOM:
-- Background Color
----------------------------------------------------
refs.custom.backgroundColor =
CreateConfig(
nil,
"Background Color",
module.custom,
"background_color",
"color"
)
----------------------------------------------------
-- CUSTOM:
-- Background Opacity
----------------------------------------------------
refs.custom.backgroundAlpha =
CreateOpacitySlider(
"Background Opacity",
module.custom,
"background_alpha"
)
----------------------------------------------------
-- CUSTOM:
-- Fonts
----------------------------------------------------
refs.custom.font =
CreateConfig(
nil,
"Fonts",
module.custom,
"font",
"dropdown",
pfUI.gui.dropdowns.fonts
)
----------------------------------------------------
-- CUSTOM:
-- Title Color
----------------------------------------------------
refs.custom.titleColor =
CreateConfig(
nil,
"Title Color",
module.custom,
"title_color",
"color"
)
----------------------------------------------------
-- CUSTOM:
-- Text Color
----------------------------------------------------
refs.custom.textColor =
CreateConfig(
nil,
"Text Color",
module.custom,
"text_color",
"color"
)
----------------------------------------------------
-- RESET CUSTOM VALUES
----------------------------------------------------
refs.custom.reset =
CreateConfig(
nil,
"Reset Custom Values",
module.custom,
"reset",
"button",
function()
ResetCustomStyle(
module,
refs
)
end
)
----------------------------------------------------
-- Initial state
----------------------------------------------------
UpdateModuleState(
module,
refs
)
end
--------------------------------------------------------
-- GENERAL
--------------------------------------------------------
CreateGUIEntry(
"DQB",
"General",
function()
CreateConfig(
nil,
"Enable DQB",
pfUI_config.dqb.general,
"enable",
"checkbox"
)
end
)
--------------------------------------------------------
-- QUEST & GOSSIP
--------------------------------------------------------
CreateGUIEntry(
"DQB",
"Quest & Gossip",
function()
CreateModuleConfig(
pfUI_config.dqb.questgossip
)
end
)
--------------------------------------------------------
-- QUEST LOG
--------------------------------------------------------
CreateGUIEntry(
"DQB",
"Quest Log",
function()
CreateModuleConfig(
pfUI_config.dqb.questlog
)
end
)
--------------------------------------------------------
-- BOOKS
--------------------------------------------------------
CreateGUIEntry(
"DQB",
"Books",
function()
CreateModuleConfig(
pfUI_config.dqb.books
)
end
)
end
------------------------------------------------------------
-- Compatibility with core.lua
------------------------------------------------------------
function DQB:InitializeGUI()
self:CreateGUI()
end
------------------------------------------------------------
-- Initialize GUI after pfUI has loaded
------------------------------------------------------------
local event =
CreateFrame("Frame")
event:RegisterEvent(
"ADDON_LOADED"
)
event:SetScript(
"OnEvent",
function()
if arg1 == "pfUI" then
if DQB.InitializeConfig then
DQB:InitializeConfig()
end
if DQB.CreateGUI then
DQB:CreateGUI()
end
event:UnregisterEvent(
"ADDON_LOADED"
)
end
end
)