Mercurial > wow > askmrrobot
comparison ui/AmrUiFrame.lua @ 57:01b63b8ed811 v21
total rewrite to version 21
author | yellowfive |
---|---|
date | Fri, 05 Jun 2015 11:05:15 -0700 |
parents | |
children | cf2b6b9a8337 |
comparison
equal
deleted
inserted
replaced
56:75431c084aa0 | 57:01b63b8ed811 |
---|---|
1 --[[----------------------------------------------------------------------------- | |
2 AmrUiFrame container | |
3 -------------------------------------------------------------------------------]] | |
4 local Type, Version = "AmrUiFrame", 1 | |
5 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) | |
6 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end | |
7 | |
8 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true) | |
9 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot") | |
10 | |
11 -- Lua APIs | |
12 local pairs, assert, type = pairs, assert, type | |
13 local wipe = table.wipe | |
14 | |
15 -- WoW APIs | |
16 local PlaySound = PlaySound | |
17 local CreateFrame, UIParent = CreateFrame, UIParent | |
18 | |
19 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | |
20 -- List them here for Mikk's FindGlobals script | |
21 -- GLOBALS: CLOSE | |
22 | |
23 -- width of the frame border | |
24 local _borderWidth = 1 | |
25 | |
26 | |
27 --[[----------------------------------------------------------------------------- | |
28 Scripts | |
29 -------------------------------------------------------------------------------]] | |
30 local function buttonOnClick(frame) | |
31 PlaySound("gsTitleOptionExit") | |
32 frame.obj:Hide() | |
33 end | |
34 | |
35 local function frameOnClose(frame) | |
36 frame.obj:Fire("OnClose") | |
37 end | |
38 | |
39 local function frameOnMouseDown(frame) | |
40 AceGUI:ClearFocus() | |
41 end | |
42 | |
43 local function titleOnMouseDown(frame) | |
44 frame.obj:StartMove() | |
45 end | |
46 | |
47 local function titleOnMouseUp(frame) | |
48 frame.obj:EndMove() | |
49 end | |
50 | |
51 --[[----------------------------------------------------------------------------- | |
52 Methods | |
53 -------------------------------------------------------------------------------]] | |
54 local methods = { | |
55 ["OnAcquire"] = function(self) | |
56 self:SetAutoAdjustHeight(false) | |
57 self.frame:SetParent(UIParent) | |
58 self.frame:SetFrameStrata("FULLSCREEN_DIALOG") | |
59 self:ApplyStatus() | |
60 self:Show() | |
61 end, | |
62 | |
63 ["OnRelease"] = function(self) | |
64 self.status = nil | |
65 wipe(self.localstatus) | |
66 end, | |
67 | |
68 ["Hide"] = function(self) | |
69 self.frame:Hide() | |
70 end, | |
71 | |
72 ["Show"] = function(self) | |
73 self.frame:Show() | |
74 end, | |
75 | |
76 -- called to set an external table to store status in | |
77 ["SetStatusTable"] = function(self, status) | |
78 assert(type(status) == "table") | |
79 self.status = status | |
80 self:ApplyStatus() | |
81 end, | |
82 | |
83 ["ApplyStatus"] = function(self) | |
84 local status = self.status or self.localstatus | |
85 local frame = self.frame | |
86 frame:ClearAllPoints() | |
87 if status.top and status.left then | |
88 frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top) | |
89 frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0) | |
90 else | |
91 frame:SetPoint("CENTER") | |
92 end | |
93 end, | |
94 | |
95 -- color is an object with R, G, B | |
96 ["SetBackgroundColor"] = function(self, color) | |
97 self.bg:SetTexture(color.R, color.G, color.B, 1) | |
98 end, | |
99 | |
100 ["SetBorderColor"] = function(self, color) | |
101 self.border:SetTexture(color.R, color.G, color.B, 1) | |
102 end, | |
103 | |
104 ["Raise"] = function(self) | |
105 self.frame:Raise() | |
106 end, | |
107 | |
108 ["StartMove"] = function(self) | |
109 self.frame:StartMoving() | |
110 AceGUI:ClearFocus() | |
111 end, | |
112 | |
113 ["EndMove"] = function(self) | |
114 self.frame:StopMovingOrSizing() | |
115 local status = self.status or self.localstatus | |
116 status.top = self.frame:GetTop() | |
117 status.left = self.frame:GetLeft() | |
118 end, | |
119 | |
120 ["OnWidthSet"] = function(self, width) | |
121 local content = self.content | |
122 content.width = width | |
123 end, | |
124 | |
125 ["OnHeightSet"] = function(self, height) | |
126 local content = self.content | |
127 content.height = height | |
128 end | |
129 } | |
130 | |
131 --[[----------------------------------------------------------------------------- | |
132 Constructor | |
133 -------------------------------------------------------------------------------]] | |
134 local function Constructor() | |
135 local num = AceGUI:GetNextWidgetNum(Type) | |
136 local frame = CreateFrame("Frame", "AmrUiFrame" .. num, UIParent) | |
137 frame:Hide() | |
138 | |
139 -- make escape key close this window | |
140 table.insert(UISpecialFrames, frame:GetName()) | |
141 | |
142 frame:EnableMouse(true) | |
143 frame:SetMovable(true) | |
144 frame:SetResizable(false) | |
145 frame:SetFrameStrata("FULLSCREEN_DIALOG") | |
146 frame:SetToplevel(true) | |
147 frame:SetScript("OnHide", frameOnClose) | |
148 frame:SetScript("OnMouseDown", frameOnMouseDown) | |
149 | |
150 Amr.DropShadow(frame) | |
151 | |
152 local border = frame:CreateTexture(nil, "BACKGROUND", nil, 1) | |
153 border:SetAllPoints(true) | |
154 | |
155 local bg = frame:CreateTexture(nil, "BORDER") | |
156 bg:SetPoint("TOPLEFT", frame, "TOPLEFT", _borderWidth, -_borderWidth) | |
157 bg:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -_borderWidth, _borderWidth) | |
158 | |
159 local btnClose = CreateFrame("Button", nil, frame) | |
160 btnClose:SetNormalFontObject(Amr.CreateFont("Bold", 16, Amr.Colors.White)) | |
161 btnClose:SetText("x") | |
162 btnClose:SetWidth(22) | |
163 btnClose:SetHeight(22) | |
164 btnClose:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -4, -4) | |
165 btnClose:SetScript("OnClick", buttonOnClick) | |
166 | |
167 local lbl = btnClose:GetFontString() | |
168 lbl:ClearAllPoints() | |
169 lbl:SetPoint("TOP", btnClose, "TOP", -1, -2) | |
170 | |
171 -- style the button similar to AmrUiButton | |
172 Amr.DropShadow(btnClose) | |
173 | |
174 local tex = Amr.CreateTexture(btnClose, Amr.Colors.Red) | |
175 tex:SetAllPoints(true) | |
176 btnClose:SetNormalTexture(tex) | |
177 | |
178 tex = Amr.CreateTexture(btnClose, Amr.Colors.Red) | |
179 tex:SetPoint("TOPLEFT", btnClose, "TOPLEFT", 1, -1) | |
180 tex:SetPoint("BOTTOMRIGHT", btnClose, "BOTTOMRIGHT", 1, -1) | |
181 btnClose:SetPushedTexture(tex) | |
182 | |
183 tex = Amr.CreateTexture(btnClose, Amr.Colors.White, 0.1) | |
184 tex:SetAllPoints(true) | |
185 btnClose:SetHighlightTexture(tex) | |
186 | |
187 -- title | |
188 local titleFrame = CreateFrame("Frame", nil, frame) | |
189 titleFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 0) | |
190 titleFrame:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 0, -40) | |
191 titleFrame:EnableMouse(true) | |
192 titleFrame:SetScript("OnMouseDown", titleOnMouseDown) | |
193 titleFrame:SetScript("OnMouseUp", titleOnMouseUp) | |
194 | |
195 --Container Support | |
196 local content = CreateFrame("Frame", nil, frame) | |
197 content:SetPoint("TOPLEFT", titleFrame, "BOTTOMLEFT", 20, 0) | |
198 content:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -20, 20) | |
199 | |
200 local widget = { | |
201 localstatus = {}, | |
202 border = border, | |
203 bg = bg, | |
204 content = content, | |
205 frame = frame, | |
206 type = Type | |
207 } | |
208 for method, func in pairs(methods) do | |
209 widget[method] = func | |
210 end | |
211 btnClose.obj, titleFrame.obj = widget, widget | |
212 | |
213 return AceGUI:RegisterAsContainer(widget) | |
214 end | |
215 | |
216 AceGUI:RegisterWidgetType(Type, Constructor, Version) |