Files
pfUI-DQB/gui.lua
T
2026-09-04 11:29:15 +01:00

856 lines
20 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
--------------------------------------------------------
-- CUSTOM OPACITY SLIDER
--------------------------------------------------------
--
-- pfUI's CreateConfig does not provide a slider widget.
-- We create the normal pfUI configuration row first
-- and replace its EditBox with our own Slider.
--
-- This is the same working slider implementation
-- already used by DQB.
--------------------------------------------------------
local function CreateOpacitySlider(caption, category, config)
----------------------------------------------------
-- Create the normal pfUI config row.
----------------------------------------------------
local frame = CreateConfig(
nil,
caption,
category,
config,
"text"
)
if not frame then
return
end
----------------------------------------------------
-- Hide the normal text input.
----------------------------------------------------
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)
----------------------------------------------------
-- Thumb texture
----------------------------------------------------
if pfUI.media and pfUI.media["img:col"] then
slider:SetThumbTexture(
pfUI.media["img:col"]
)
end
----------------------------------------------------
-- Position slider.
----------------------------------------------------
slider:SetPoint(
"RIGHT",
frame,
"RIGHT",
-38,
0
)
----------------------------------------------------
-- Try to 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
----------------------------------------------------
-- 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
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 unnecessary 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 that 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 support.
----------------------------------------------------
slider:EnableMouseWheel(true)
slider:SetScript(
"OnMouseWheel",
function()
local current = this:GetValue()
local step = 0.05
if arg1 > 0 then
current = current + step
else
current = current - step
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
--------------------------------------------------------
-- DEPENDENCY HELPERS
--------------------------------------------------------
local function SetFrameEnabled(frame, enabled)
if not frame then
return
end
----------------------------------------------------
-- Main input.
----------------------------------------------------
if frame.input then
if enabled then
frame.input:Enable()
else
frame.input:Disable()
end
end
----------------------------------------------------
-- Color picker.
----------------------------------------------------
if frame.color then
if enabled then
frame.color:Enable()
else
frame.color:Disable()
end
end
----------------------------------------------------
-- Button.
----------------------------------------------------
if frame.button then
if enabled then
frame.button:Enable()
else
frame.button:Disable()
end
end
----------------------------------------------------
-- Caption.
----------------------------------------------------
if frame.caption then
if enabled then
frame.caption:SetTextColor(
1, 1, 1, 1
)
else
frame.caption:SetTextColor(
0.5, 0.5, 0.5, 1
)
end
end
----------------------------------------------------
-- Slider value.
----------------------------------------------------
if frame.value then
if enabled then
frame.value:SetTextColor(
1, 1, 1, 1
)
else
frame.value:SetTextColor(
0.5, 0.5, 0.5, 1
)
end
end
end
--------------------------------------------------------
-- Find the main clickable input of a config frame.
--------------------------------------------------------
local function GetConfigInput(frame)
if not frame then
return nil
end
if frame.input then
return frame.input
end
if frame.color then
return frame.color
end
if frame.button then
return frame.button
end
return nil
end
--------------------------------------------------------
-- Reset PFUI STYLE
--------------------------------------------------------
local function ResetPFUIStyle(module)
if not module then
return
end
----------------------------------------------------
-- Get current pfUI global alpha.
----------------------------------------------------
local value = nil
if pfUI_config
and pfUI_config.global
and pfUI_config.global.background_alpha ~= nil then
value = tostring(
pfUI_config.global.background_alpha
)
end
if not value then
value = "0.75"
end
----------------------------------------------------
-- Save.
----------------------------------------------------
module.pfui_background_alpha = value
----------------------------------------------------
-- Notify DQB / pfUI.
----------------------------------------------------
if pfUI.events
and pfUI.events.TriggerEvent then
pfUI.events:TriggerEvent(
"config:changed",
module,
"pfui_background_alpha"
)
else
pfUI.gui.settingChanged = true
end
end
--------------------------------------------------------
-- RESET CUSTOM STYLE
--------------------------------------------------------
local function ResetCustomStyle(module)
if not module then
return
end
if not module.custom then
module.custom = {}
end
local custom = module.custom
----------------------------------------------------
-- 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
----------------------------------------------------
-- Title color
----------------------------------------------------
custom.title_color =
"1,0.82,0,1"
----------------------------------------------------
-- Text color
----------------------------------------------------
custom.text_color =
"1,1,1,1"
----------------------------------------------------
-- Notify.
----------------------------------------------------
if pfUI.events
and pfUI.events.TriggerEvent then
pfUI.events:TriggerEvent(
"config:changed",
custom,
"remove_parchment"
)
pfUI.events:TriggerEvent(
"config:changed",
custom,
"background_color"
)
pfUI.events:TriggerEvent(
"config:changed",
custom,
"background_alpha"
)
pfUI.events:TriggerEvent(
"config:changed",
custom,
"font"
)
pfUI.events:TriggerEvent(
"config:changed",
custom,
"title_color"
)
pfUI.events:TriggerEvent(
"config:changed",
custom,
"text_color"
)
else
pfUI.gui.settingChanged = true
end
end
--------------------------------------------------------
-- UPDATE MODULE DEPENDENCIES
--------------------------------------------------------
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"
----------------------------------------------------
-- PFUI STYLE
----------------------------------------------------
SetFrameEnabled(
refs.pfuiAlpha,
usePFUI
)
SetFrameEnabled(
refs.resetPFUI,
usePFUI
)
----------------------------------------------------
-- CUSTOM STYLE
----------------------------------------------------
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,
CreateConfig
)
local refs = {
custom = {}
}
----------------------------------------------------
-- USE PFUI STYLE
----------------------------------------------------
refs.usePFUI = CreateConfig(
nil,
"Use pfUI Style",
module,
"use_pfui_style",
"checkbox"
)
----------------------------------------------------
-- PFUI BACKGROUND OPACITY
----------------------------------------------------
refs.pfuiAlpha = CreateOpacitySlider(
"pfUI Background Opacity",
module,
"pfui_background_alpha"
)
----------------------------------------------------
-- RESET PFUI DEFAULT
----------------------------------------------------
refs.resetPFUI = CreateConfig(
nil,
"Reset to pfUI Default",
module,
"reset_pfui",
"button",
function()
ResetPFUIStyle(module)
if refs.pfuiAlpha
and refs.pfuiAlpha.input then
local value =
tonumber(
module.pfui_background_alpha
)
if value then
refs.pfuiAlpha.input:SetValue(
value
)
end
end
end
)
----------------------------------------------------
-- USE CUSTOM STYLE
----------------------------------------------------
refs.useCustom = CreateConfig(
nil,
"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"
)
------