--[[colorpickerData = { type = "colorpicker", name = "My Color Picker", -- or string id or function returning a string getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional) setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional) tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional) width = "full", --or "half" (optional) disabled = function() return db.someBooleanSetting end, --or boolean (optional) warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional) requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional) default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color reference = "MyAddonColorpicker" -- unique global reference to control (optional) } ]] local widgetVersion = 13 local LAM = LibStub("LibAddonMenu-2.0") if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end local wm = WINDOW_MANAGER local function UpdateDisabled(control) local disable if type(control.data.disabled) == "function" then disable = control.data.disabled() else disable = control.data.disabled end if disable then control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA()) else control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA()) end control.isDisabled = disable end local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA) if forceDefault then --if we are forcing defaults local color = LAM.util.GetDefaultValue(control.data.default) valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a control.data.setFunc(valueR, valueG, valueB, valueA) elseif valueR and valueG and valueB then control.data.setFunc(valueR, valueG, valueB, valueA or 1) --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed LAM.util.RequestRefreshIfNeeded(control) else valueR, valueG, valueB, valueA = control.data.getFunc() end control.thumb:SetColor(valueR, valueG, valueB, valueA or 1) end function LAMCreateControl.colorpicker(parent, colorpickerData, controlName) local control = LAM.util.CreateLabelAndContainerControl(parent, colorpickerData, controlName) control.color = control.container local color = control.color control.thumb = wm:CreateControl(nil, color, CT_TEXTURE) local thumb = control.thumb thumb:SetDimensions(36, 18) thumb:SetAnchor(LEFT, color, LEFT, 4, 0) color.border = wm:CreateControl(nil, color, CT_TEXTURE) local border = color.border border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds") border:SetTextureCoords(0, .625, 0, .8125) border:SetDimensions(40, 22) border:SetAnchor(CENTER, thumb, CENTER, 0, 0) local function ColorPickerCallback(r, g, b, a) control:UpdateValue(false, r, g, b, a) end control:SetHandler("OnMouseUp", function(self, btn, upInside) if self.isDisabled then return end if upInside then local r, g, b, a = colorpickerData.getFunc() COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name)) end end) if colorpickerData.warning ~= nil or colorpickerData.requiresReload then control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon") control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0) control.UpdateWarning = LAM.util.UpdateWarning control:UpdateWarning() end control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip) control.UpdateValue = UpdateValue control:UpdateValue() if colorpickerData.disabled ~= nil then control.UpdateDisabled = UpdateDisabled control:UpdateDisabled() end LAM.util.RegisterForRefreshIfNeeded(control) LAM.util.RegisterForReloadIfNeeded(control) return control end