98bc818b0b3ed1ee84a0c2d6a02afae5d266ffdb
[wowui.git] / RaidFrameCustomizationConfig / libs / AceGUI-3.0-SharedMediaWidgets / prototypes.lua
1 -- Widget created by Yssaril
2 --[===[@debug@
3 local DataVersion = 9001 -- dev version always overwrites everything else :)
4 --@end-debug@]===]
5 --@non-debug@
6 local DataVersion = 56
7 --@end-non-debug@
8 local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion)
9
10 if not AGSMW then
11   return        -- already loaded and no upgrade necessary
12 end
13
14 local AceGUI = LibStub("AceGUI-3.0")
15 local Media = LibStub("LibSharedMedia-3.0")
16
17 AGSMW = AGSMW or {}
18
19 AceGUIWidgetLSMlists = {
20         ['font'] = Media:HashTable("font"),
21         ['sound'] = Media:HashTable("sound"),
22         ['statusbar'] = Media:HashTable("statusbar"),
23         ['border'] = Media:HashTable("border"),
24         ['background'] = Media:HashTable("background"),
25 }
26
27 do
28         local function disable(frame)
29                 frame.label:SetTextColor(.5,.5,.5)
30                 frame.text:SetTextColor(.5,.5,.5)
31                 frame.dropButton:Disable()
32                 if frame.displayButtonFont then
33                         frame.displayButtonFont:SetTextColor(.5,.5,.5)
34                         frame.displayButton:Disable()
35                 end
36         end
37
38         local function enable(frame)
39                 frame.label:SetTextColor(1,.82,0)
40                 frame.text:SetTextColor(1,1,1)
41                 frame.dropButton:Enable()
42                 if frame.displayButtonFont then
43                         frame.displayButtonFont:SetTextColor(1,1,1)
44                         frame.displayButton:Enable()
45                 end
46         end
47
48         local displayButtonBackdrop = {
49                 edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
50                 tile = true, tileSize = 16, edgeSize = 16,
51                 insets = { left = 4, right = 4, top = 4, bottom = 4 },
52         }
53
54         -- create or retrieve BaseFrame
55         function AGSMW:GetBaseFrame()
56                 local frame = CreateFrame("Frame", nil, UIParent)
57                 frame:SetHeight(44)
58                 frame:SetWidth(200)
59
60                 local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
61                         label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
62                         label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
63                         label:SetJustifyH("LEFT")
64                         label:SetHeight(18)
65                         label:SetText("")
66                 frame.label = label
67
68                 local DLeft = frame:CreateTexture(nil, "ARTWORK")
69                         DLeft:SetWidth(25)
70                         DLeft:SetHeight(64)
71                         DLeft:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -17, -21)
72                         DLeft:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
73                         DLeft:SetTexCoord(0, 0.1953125, 0, 1)
74                 frame.DLeft = DLeft
75
76                 local DRight = frame:CreateTexture(nil, "ARTWORK")
77                         DRight:SetWidth(25)
78                         DRight:SetHeight(64)
79                         DRight:SetPoint("TOP", DLeft, "TOP")
80                         DRight:SetPoint("RIGHT", frame, "RIGHT", 17, 0)
81                         DRight:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
82                         DRight:SetTexCoord(0.8046875, 1, 0, 1)
83                 frame.DRight = DRight
84
85                 local DMiddle = frame:CreateTexture(nil, "ARTWORK")
86                         DMiddle:SetHeight(64)
87                         DMiddle:SetPoint("TOP", DLeft, "TOP")
88                         DMiddle:SetPoint("LEFT", DLeft, "RIGHT")
89                         DMiddle:SetPoint("RIGHT", DRight, "LEFT")
90                         DMiddle:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
91                         DMiddle:SetTexCoord(0.1953125, 0.8046875, 0, 1)
92                 frame.DMiddle = DMiddle
93
94                 local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
95                         text:SetPoint("RIGHT",DRight,"RIGHT",-43,1)
96                         text:SetPoint("LEFT",DLeft,"LEFT",26,1)
97                         text:SetJustifyH("RIGHT")
98                         text:SetHeight(18)
99                         text:SetText("")
100                 frame.text = text
101
102                 local dropButton = CreateFrame("Button", nil, frame)
103                         dropButton:SetWidth(24)
104                         dropButton:SetHeight(24)
105                         dropButton:SetPoint("TOPRIGHT", DRight, "TOPRIGHT", -16, -18)
106                         dropButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up]])
107                         dropButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down]])
108                         dropButton:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Disabled]])
109                         dropButton:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]], "ADD")
110                 frame.dropButton = dropButton
111
112                 frame.Disable = disable
113                 frame.Enable = enable
114                 return frame
115         end
116
117         function AGSMW:GetBaseFrameWithWindow()
118                 local frame = self:GetBaseFrame()
119
120                 local displayButton = CreateFrame("Button", nil, frame)
121                         displayButton:SetHeight(42)
122                         displayButton:SetWidth(42)
123                         displayButton:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -2)
124                         displayButton:SetBackdrop(displayButtonBackdrop)
125                         displayButton:SetBackdropBorderColor(.5, .5, .5)
126                 frame.displayButton = displayButton
127
128                 frame.label:SetPoint("TOPLEFT",displayButton,"TOPRIGHT",1,2)
129
130                 frame.DLeft:SetPoint("BOTTOMLEFT", displayButton, "BOTTOMRIGHT", -17, -20)
131
132                 return frame
133         end
134
135 end
136
137 do
138
139         local sliderBackdrop = {
140                 ["bgFile"] = [[Interface\Buttons\UI-SliderBar-Background]],
141                 ["edgeFile"] = [[Interface\Buttons\UI-SliderBar-Border]],
142                 ["tile"] = true,
143                 ["edgeSize"] = 8,
144                 ["tileSize"] = 8,
145                 ["insets"] = {
146                         ["left"] = 3,
147                         ["right"] = 3,
148                         ["top"] = 3,
149                         ["bottom"] = 3,
150                 },
151         }
152         local frameBackdrop = {
153                 bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
154                 edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
155                 tile = true, tileSize = 32, edgeSize = 32,
156                 insets = { left = 11, right = 12, top = 12, bottom = 9 },
157         }
158
159         local function OnMouseWheel(self, dir)
160                 self.slider:SetValue(self.slider:GetValue()+(15*dir*-1))
161         end
162
163         local function AddFrame(self, frame)
164                 frame:SetParent(self.contentframe)
165                 frame:SetFrameStrata(self:GetFrameStrata())
166                 frame:SetFrameLevel(self:GetFrameLevel() + 100)
167
168                 if next(self.contentRepo) then
169                         frame:SetPoint("TOPLEFT", self.contentRepo[#self.contentRepo], "BOTTOMLEFT", 0, 0)
170                         frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
171                         self.contentframe:SetHeight(self.contentframe:GetHeight() + frame:GetHeight())
172                         self.contentRepo[#self.contentRepo+1] = frame
173                 else
174                         self.contentframe:SetHeight(frame:GetHeight())
175                         frame:SetPoint("TOPLEFT", self.contentframe, "TOPLEFT", 0, 0)
176                         frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
177                         self.contentRepo[1] = frame
178                 end
179
180                 if self.contentframe:GetHeight() > UIParent:GetHeight()*2/5 - 20 then
181                         self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -28, 12)
182                         self:SetHeight(UIParent:GetHeight()*2/5)
183                         self.slider:Show()
184                         self:SetScript("OnMouseWheel", OnMouseWheel)
185                         self.scrollframe:UpdateScrollChildRect()
186                         self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
187                 else
188                         self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12)
189                         self:SetHeight(self.contentframe:GetHeight()+25)
190                         self.slider:Hide()
191                         self:SetScript("OnMouseWheel", nil)
192                         self.scrollframe:UpdateScrollChildRect()
193                         self.slider:SetMinMaxValues(0, 0)
194                 end
195                 self.contentframe:SetWidth(self.scrollframe:GetWidth())
196         end
197
198         local function ClearFrames(self)
199                 for i, frame in ipairs(self.contentRepo) do
200                         frame:ReturnSelf()
201                         self.contentRepo[i] = nil
202                 end
203         end
204
205         local function slider_OnValueChanged(self, value)
206                 self.frame.scrollframe:SetVerticalScroll(value)
207         end
208
209         local DropDownCache = {}
210         function AGSMW:GetDropDownFrame()
211                 local frame
212                 if next(DropDownCache) then
213                         frame = table.remove(DropDownCache)
214                 else
215                         frame = CreateFrame("Frame", nil, UIParent)
216                                 frame:SetClampedToScreen(true)
217                                 frame:SetWidth(188)
218                                 frame:SetBackdrop(frameBackdrop)
219                                 frame:SetFrameStrata("TOOLTIP")
220                                 frame:EnableMouseWheel(true)
221
222                         local contentframe = CreateFrame("Frame", nil, frame)
223                                 contentframe:SetWidth(160)
224                                 contentframe:SetHeight(0)
225                         frame.contentframe = contentframe
226
227                         local scrollframe = CreateFrame("ScrollFrame", nil, frame)
228                                 scrollframe:SetWidth(160)
229                                 scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13)
230                                 scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 12)
231                                 scrollframe:SetScrollChild(contentframe)
232                         frame.scrollframe = scrollframe
233
234                         contentframe:SetPoint("TOPLEFT", scrollframe)
235                         contentframe:SetPoint("TOPRIGHT", scrollframe)
236
237                         local bgTex = frame:CreateTexture(nil, "ARTWORK")
238                                 bgTex:SetAllPoints(scrollframe)
239                         frame.bgTex = bgTex
240
241                         frame.AddFrame = AddFrame
242                         frame.ClearFrames = ClearFrames
243                         frame.contentRepo = {} -- store all our frames in here so we can get rid of them later
244
245                         local slider = CreateFrame("Slider", nil, scrollframe)
246                                 slider:SetOrientation("VERTICAL")
247                                 slider:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -14, -10)
248                                 slider:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 10)
249                                 slider:SetBackdrop(sliderBackdrop)
250                                 slider:SetThumbTexture([[Interface\Buttons\UI-SliderBar-Button-Vertical]])
251                                 slider:SetMinMaxValues(0, 1)
252                                 --slider:SetValueStep(1)
253                                 slider:SetWidth(12)
254                                 slider.frame = frame
255                                 slider:SetScript("OnValueChanged", slider_OnValueChanged)
256                         frame.slider = slider
257                 end
258                 frame:SetHeight(UIParent:GetHeight()*2/5)
259                 frame.slider:SetValue(0)
260                 frame:Show()
261                 return frame
262         end
263
264         function AGSMW:ReturnDropDownFrame(frame)
265                 ClearFrames(frame)
266                 frame:ClearAllPoints()
267                 frame:Hide()
268                 frame:SetBackdrop(frameBackdrop)
269                 frame.bgTex:SetTexture(nil)
270                 table.insert(DropDownCache, frame)
271                 return nil
272         end
273 end