Xiiph@0: --[[----------------------------------------------------------------------------- Xiiph@0: ColorPicker Widget Xiiph@0: -------------------------------------------------------------------------------]] Xiiph@0: local Type, Version = "ColorPicker", 20 Xiiph@0: local AceGUI = LibStub and LibStub("AceGUI-3.0", true) Xiiph@0: if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end Xiiph@0: Xiiph@0: -- Lua APIs Xiiph@0: local pairs = pairs Xiiph@0: Xiiph@0: -- WoW APIs Xiiph@0: local CreateFrame, UIParent = CreateFrame, UIParent Xiiph@0: Xiiph@0: -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded Xiiph@0: -- List them here for Mikk's FindGlobals script Xiiph@0: -- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame Xiiph@0: Xiiph@0: --[[----------------------------------------------------------------------------- Xiiph@0: Support functions Xiiph@0: -------------------------------------------------------------------------------]] Xiiph@0: local function ColorCallback(self, r, g, b, a, isAlpha) Xiiph@0: if not self.HasAlpha then Xiiph@0: a = 1 Xiiph@0: end Xiiph@0: self:SetColor(r, g, b, a) Xiiph@0: if ColorPickerFrame:IsVisible() then Xiiph@0: --colorpicker is still open Xiiph@0: self:Fire("OnValueChanged", r, g, b, a) Xiiph@0: else Xiiph@0: --colorpicker is closed, color callback is first, ignore it, Xiiph@0: --alpha callback is the final call after it closes so confirm now Xiiph@0: if isAlpha then Xiiph@0: self:Fire("OnValueConfirmed", r, g, b, a) Xiiph@0: end Xiiph@0: end Xiiph@0: end Xiiph@0: Xiiph@0: --[[----------------------------------------------------------------------------- Xiiph@0: Scripts Xiiph@0: -------------------------------------------------------------------------------]] Xiiph@0: local function Control_OnEnter(frame) Xiiph@0: frame.obj:Fire("OnEnter") Xiiph@0: end Xiiph@0: Xiiph@0: local function Control_OnLeave(frame) Xiiph@0: frame.obj:Fire("OnLeave") Xiiph@0: end Xiiph@0: Xiiph@0: local function ColorSwatch_OnClick(frame) Xiiph@0: HideUIPanel(ColorPickerFrame) Xiiph@0: local self = frame.obj Xiiph@0: if not self.disabled then Xiiph@0: ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG") Xiiph@0: Xiiph@0: ColorPickerFrame.func = function() Xiiph@0: local r, g, b = ColorPickerFrame:GetColorRGB() Xiiph@0: local a = 1 - OpacitySliderFrame:GetValue() Xiiph@0: ColorCallback(self, r, g, b, a) Xiiph@0: end Xiiph@0: Xiiph@0: ColorPickerFrame.hasOpacity = self.HasAlpha Xiiph@0: ColorPickerFrame.opacityFunc = function() Xiiph@0: local r, g, b = ColorPickerFrame:GetColorRGB() Xiiph@0: local a = 1 - OpacitySliderFrame:GetValue() Xiiph@0: ColorCallback(self, r, g, b, a, true) Xiiph@0: end Xiiph@0: Xiiph@0: local r, g, b, a = self.r, self.g, self.b, self.a Xiiph@0: if self.HasAlpha then Xiiph@0: ColorPickerFrame.opacity = 1 - (a or 0) Xiiph@0: end Xiiph@0: ColorPickerFrame:SetColorRGB(r, g, b) Xiiph@0: Xiiph@0: ColorPickerFrame.cancelFunc = function() Xiiph@0: ColorCallback(self, r, g, b, a, true) Xiiph@0: end Xiiph@0: Xiiph@0: ShowUIPanel(ColorPickerFrame) Xiiph@0: end Xiiph@0: AceGUI:ClearFocus() Xiiph@0: end Xiiph@0: Xiiph@0: --[[----------------------------------------------------------------------------- Xiiph@0: Methods Xiiph@0: -------------------------------------------------------------------------------]] Xiiph@0: local methods = { Xiiph@0: ["OnAcquire"] = function(self) Xiiph@0: self:SetHeight(24) Xiiph@0: self:SetWidth(200) Xiiph@0: self:SetHasAlpha(false) Xiiph@0: self:SetColor(0, 0, 0, 1) Xiiph@0: self:SetDisabled(nil) Xiiph@0: self:SetLabel(nil) Xiiph@0: end, Xiiph@0: Xiiph@0: -- ["OnRelease"] = nil, Xiiph@0: Xiiph@0: ["SetLabel"] = function(self, text) Xiiph@0: self.text:SetText(text) Xiiph@0: end, Xiiph@0: Xiiph@0: ["SetColor"] = function(self, r, g, b, a) Xiiph@0: self.r = r Xiiph@0: self.g = g Xiiph@0: self.b = b Xiiph@0: self.a = a or 1 Xiiph@0: self.colorSwatch:SetVertexColor(r, g, b, a) Xiiph@0: end, Xiiph@0: Xiiph@0: ["SetHasAlpha"] = function(self, HasAlpha) Xiiph@0: self.HasAlpha = HasAlpha Xiiph@0: end, Xiiph@0: Xiiph@0: ["SetDisabled"] = function(self, disabled) Xiiph@0: self.disabled = disabled Xiiph@0: if self.disabled then Xiiph@0: self.frame:Disable() Xiiph@0: self.text:SetTextColor(0.5, 0.5, 0.5) Xiiph@0: else Xiiph@0: self.frame:Enable() Xiiph@0: self.text:SetTextColor(1, 1, 1) Xiiph@0: end Xiiph@0: end Xiiph@0: } Xiiph@0: Xiiph@0: --[[----------------------------------------------------------------------------- Xiiph@0: Constructor Xiiph@0: -------------------------------------------------------------------------------]] Xiiph@0: local function Constructor() Xiiph@0: local frame = CreateFrame("Button", nil, UIParent) Xiiph@0: frame:Hide() Xiiph@0: Xiiph@0: frame:EnableMouse(true) Xiiph@0: frame:SetScript("OnEnter", Control_OnEnter) Xiiph@0: frame:SetScript("OnLeave", Control_OnLeave) Xiiph@0: frame:SetScript("OnClick", ColorSwatch_OnClick) Xiiph@0: Xiiph@0: local colorSwatch = frame:CreateTexture(nil, "OVERLAY") Xiiph@0: colorSwatch:SetWidth(19) Xiiph@0: colorSwatch:SetHeight(19) Xiiph@0: colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch") Xiiph@0: colorSwatch:SetPoint("LEFT") Xiiph@0: Xiiph@0: local texture = frame:CreateTexture(nil, "BACKGROUND") Xiiph@0: texture:SetWidth(16) Xiiph@0: texture:SetHeight(16) Xiiph@0: texture:SetTexture(1, 1, 1) Xiiph@0: texture:SetPoint("CENTER", colorSwatch) Xiiph@0: texture:Show() Xiiph@0: Xiiph@0: local checkers = frame:CreateTexture(nil, "BACKGROUND") Xiiph@0: checkers:SetWidth(14) Xiiph@0: checkers:SetHeight(14) Xiiph@0: checkers:SetTexture("Tileset\\Generic\\Checkers") Xiiph@0: checkers:SetTexCoord(.25, 0, 0.5, .25) Xiiph@0: checkers:SetDesaturated(true) Xiiph@0: checkers:SetVertexColor(1, 1, 1, 0.75) Xiiph@0: checkers:SetPoint("CENTER", colorSwatch) Xiiph@0: checkers:Show() Xiiph@0: Xiiph@0: local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight") Xiiph@0: text:SetHeight(24) Xiiph@0: text:SetJustifyH("LEFT") Xiiph@0: text:SetTextColor(1, 1, 1) Xiiph@0: text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0) Xiiph@0: text:SetPoint("RIGHT") Xiiph@0: Xiiph@0: --local highlight = frame:CreateTexture(nil, "HIGHLIGHT") Xiiph@0: --highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") Xiiph@0: --highlight:SetBlendMode("ADD") Xiiph@0: --highlight:SetAllPoints(frame) Xiiph@0: Xiiph@0: local widget = { Xiiph@0: colorSwatch = colorSwatch, Xiiph@0: text = text, Xiiph@0: frame = frame, Xiiph@0: type = Type Xiiph@0: } Xiiph@0: for method, func in pairs(methods) do Xiiph@0: widget[method] = func Xiiph@0: end Xiiph@0: Xiiph@0: return AceGUI:RegisterAsWidget(widget) Xiiph@0: end Xiiph@0: Xiiph@0: AceGUI:RegisterWidgetType(Type, Constructor, Version)