Zerotorescue@62
|
1 local addon = select(2, ...);
|
Zerotorescue@62
|
2 local Widgets = addon:NewModule("Widgets");
|
Zerotorescue@62
|
3
|
Zerotorescue@62
|
4 local AceGUI = LibStub("AceGUI-3.0");
|
Zerotorescue@62
|
5
|
Zerotorescue@62
|
6 function Widgets:ItemLinkButton()
|
Zerotorescue@62
|
7 --[[
|
Zerotorescue@62
|
8 [ ItemLinkButton ]
|
Zerotorescue@62
|
9 This custom widget has to show an icon with the item link next to it.
|
Zerotorescue@62
|
10 Upon hover it must show the item tooltip.
|
Zerotorescue@62
|
11 Upon click it must execute the function provided through user data.
|
Zerotorescue@62
|
12
|
Zerotorescue@62
|
13 UserData: itemId, onClickEvent
|
Zerotorescue@62
|
14
|
Zerotorescue@62
|
15 OnEnter: tooltip show
|
Zerotorescue@62
|
16 OnLeave: tooltip hide
|
Zerotorescue@62
|
17 OnClick: UserData.onClickEvent
|
Zerotorescue@62
|
18 ]]
|
Zerotorescue@62
|
19
|
Zerotorescue@62
|
20 local widgetType = "ItemLinkButton";
|
Zerotorescue@62
|
21 local widgetVersion = 1;
|
Zerotorescue@62
|
22
|
Zerotorescue@62
|
23 local function Constructor()
|
Zerotorescue@62
|
24 local widget = AceGUI:Create("InteractiveLabel");
|
Zerotorescue@62
|
25 widget.type = widgetType;
|
Zerotorescue@62
|
26
|
Zerotorescue@62
|
27 -- We overwrite the OnAcquire as we want to set our callbacks even
|
Zerotorescue@62
|
28 -- when the widget is re-used from the widget pool
|
Zerotorescue@62
|
29 widget.originalOnAcquire = widget.OnAcquire;
|
Zerotorescue@62
|
30 widget.OnAcquire = function(self, ...)
|
Zerotorescue@62
|
31
|
Zerotorescue@62
|
32
|
Zerotorescue@62
|
33 -- We overwrite the setcallback because we don't want anything else
|
Zerotorescue@62
|
34 -- to overwrite our OnEnter, OnLeave and OnClick events
|
Zerotorescue@62
|
35 -- which would be done by the AceConfigDialog after a widget gets re-used
|
Zerotorescue@62
|
36 if not self.originalSetCallBack then
|
Zerotorescue@62
|
37 self.originalSetCallBack = self.SetCallback;
|
Zerotorescue@62
|
38 self.SetCallback = function(this, event, func, ...)
|
Zerotorescue@62
|
39 if event == "OnEnter" or event == "OnLeave" or event == "OnClick" then
|
Zerotorescue@62
|
40 -- Don't allow overwriting of these events
|
Zerotorescue@62
|
41 return;
|
Zerotorescue@62
|
42 elseif event == "CustomOnEnter" then
|
Zerotorescue@62
|
43 return this.originalSetCallBack(this, "OnEnter", func, ...);
|
Zerotorescue@62
|
44 elseif event == "CustomOnLeave" then
|
Zerotorescue@62
|
45 return this.originalSetCallBack(this, "OnLeave", func, ...);
|
Zerotorescue@62
|
46 elseif event == "CustomOnClick" then
|
Zerotorescue@62
|
47 return this.originalSetCallBack(this, "OnClick", func, ...);
|
Zerotorescue@62
|
48 else
|
Zerotorescue@62
|
49 return this.originalSetCallBack(this, event, func, ...);
|
Zerotorescue@62
|
50 end
|
Zerotorescue@62
|
51 end;
|
Zerotorescue@62
|
52 end
|
Zerotorescue@62
|
53
|
Zerotorescue@62
|
54
|
Zerotorescue@62
|
55
|
Zerotorescue@62
|
56 -- Set our own events, since we disabled the normal event-names, we'll call them our custom versions
|
Zerotorescue@62
|
57 self:SetCallback("CustomOnEnter", function(this)
|
Zerotorescue@74
|
58 local itemData = this:GetUserData("ItemData");
|
Zerotorescue@62
|
59
|
Zerotorescue@74
|
60 if itemData then
|
Zerotorescue@62
|
61 GameTooltip:SetOwner(this.frame, "ANCHOR_TOPRIGHT");
|
Zerotorescue@74
|
62 GameTooltip:SetHyperlink(("item:%d"):format(itemData.id));
|
Zerotorescue@62
|
63 GameTooltip:Show();
|
Zerotorescue@62
|
64 end
|
Zerotorescue@62
|
65 end);
|
Zerotorescue@62
|
66 self:SetCallback("CustomOnLeave", function(this)
|
Zerotorescue@62
|
67 GameTooltip:Hide();
|
Zerotorescue@62
|
68 end);
|
Zerotorescue@62
|
69 self:SetCallback("CustomOnClick", function(this, ...)
|
Zerotorescue@62
|
70 -- Below is used in child widgets to prepare for onclick
|
Zerotorescue@62
|
71 if this.OnClick then
|
Zerotorescue@62
|
72 this.OnClick(this, ...);
|
Zerotorescue@62
|
73 end
|
Zerotorescue@62
|
74
|
Zerotorescue@62
|
75 local func = this:GetUserData("exec");
|
Zerotorescue@74
|
76 local itemData = this:GetUserData("ItemData");
|
Zerotorescue@62
|
77
|
Zerotorescue@62
|
78 if func then
|
Zerotorescue@62
|
79 -- If this is a config option we will need the group id
|
Zerotorescue@62
|
80 local path = this:GetUserData("path");
|
Zerotorescue@62
|
81 local groupId = (path and path[2]) or nil;
|
Zerotorescue@62
|
82
|
Zerotorescue@74
|
83 func(groupId, itemData, ...);
|
Zerotorescue@62
|
84 end
|
Zerotorescue@62
|
85 end);
|
Zerotorescue@62
|
86
|
Zerotorescue@62
|
87
|
Zerotorescue@62
|
88
|
Zerotorescue@62
|
89 -- Then also do whatever it wanted to do
|
Zerotorescue@62
|
90 self.originalOnAcquire(self, ...);
|
Zerotorescue@62
|
91 end;
|
Zerotorescue@62
|
92
|
Zerotorescue@62
|
93 -- Remember the original SetText as this might get overwritten by the config-widget
|
Zerotorescue@62
|
94 widget.originalSetText = widget.SetText;
|
Zerotorescue@62
|
95
|
Zerotorescue@74
|
96 widget.SetItem = function(self, item)
|
Zerotorescue@74
|
97 self:SetUserData("ItemData", item);
|
Zerotorescue@62
|
98
|
Zerotorescue@62
|
99 -- Put the icon in front of it
|
Zerotorescue@74
|
100 self:SetImage(item.icon);
|
Zerotorescue@73
|
101 -- Standardize the size
|
Zerotorescue@73
|
102 self:SetImageSize(16, 16);
|
Zerotorescue@73
|
103
|
Zerotorescue@73
|
104 -- Make readable font
|
Zerotorescue@73
|
105 self:SetFontObject(GameFontHighlight);
|
Zerotorescue@73
|
106
|
Zerotorescue@73
|
107 if not item.link then
|
Zerotorescue@73
|
108 -- If no item link was cached, give it another try
|
Zerotorescue@73
|
109
|
Zerotorescue@73
|
110 local itemName, itemLink, itemRarity = GetItemInfo(item.id);
|
Zerotorescue@73
|
111
|
Zerotorescue@73
|
112 -- item is a table, so passed by reference, so updatable
|
Zerotorescue@73
|
113 item.name = itemName;
|
Zerotorescue@73
|
114 item.link = itemLink;
|
Zerotorescue@73
|
115 item.rarity = itemRarity;
|
Zerotorescue@73
|
116 end
|
Zerotorescue@73
|
117
|
Zerotorescue@73
|
118 -- We don't want to set the itemId as text, but rather the item link, so get that.
|
Zerotorescue@74
|
119 local itemLink = item.link or ("Unknown (#%d)"):format(item.id);
|
Zerotorescue@73
|
120
|
Zerotorescue@73
|
121 self:originalSetText(itemLink);
|
Zerotorescue@73
|
122 end;
|
Zerotorescue@62
|
123
|
Zerotorescue@62
|
124 return widget;
|
Zerotorescue@62
|
125 end
|
Zerotorescue@62
|
126
|
Zerotorescue@62
|
127 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion);
|
Zerotorescue@62
|
128 end
|
Zerotorescue@62
|
129
|
Zerotorescue@62
|
130 function Widgets:ConfigItemLinkButton()
|
Zerotorescue@62
|
131 -- Define out custom item link button widget
|
Zerotorescue@62
|
132 -- This will be called as if it's an input element, we overwrite some of the related functions which are called for default input fields
|
Zerotorescue@62
|
133
|
Zerotorescue@62
|
134 local widgetType = "ConfigItemLinkButton";
|
Zerotorescue@62
|
135 local widgetVersion = 1;
|
Zerotorescue@62
|
136
|
Zerotorescue@62
|
137 -- Empty function for disabling functions
|
Zerotorescue@62
|
138 local function Dummy() end
|
Zerotorescue@62
|
139
|
Zerotorescue@62
|
140 -- Makes an instance of our ItemLinkButton widget
|
Zerotorescue@62
|
141 local function GetItemLinkButton()
|
Zerotorescue@62
|
142 local widget = AceGUI:Create("ItemLinkButton");
|
Zerotorescue@62
|
143 widget.type = widgetType;
|
Zerotorescue@62
|
144
|
Zerotorescue@62
|
145 -- We can only provide custom widgets for input, select and multiselect fields
|
Zerotorescue@62
|
146 -- Input being the simplest, we use that - however, it provides two parameters: label and text. We only need one, disable the other.
|
Zerotorescue@62
|
147 widget.SetLabel = Dummy;
|
Zerotorescue@62
|
148
|
Zerotorescue@62
|
149 -- SetText is called when this button is being created and contains the itemId
|
Zerotorescue@62
|
150 -- Forward that itemId to the ItemLinkButton
|
Zerotorescue@62
|
151 widget.SetText = function(self, value, ...)
|
Zerotorescue@62
|
152 if value and tonumber(value) then
|
Zerotorescue@74
|
153 local newItemData = addon.ItemData:New(tonumber(value));
|
Zerotorescue@74
|
154
|
Zerotorescue@74
|
155 self:SetItem(newItemData);
|
Zerotorescue@62
|
156 end
|
Zerotorescue@62
|
157 end;
|
Zerotorescue@62
|
158
|
Zerotorescue@62
|
159 widget.OnClick = function(self, ...)
|
Zerotorescue@62
|
160 local option = self:GetUserData("option");
|
Zerotorescue@62
|
161
|
Zerotorescue@62
|
162 if option and option.set then
|
Zerotorescue@62
|
163 self:SetUserData("exec", option.set);
|
Zerotorescue@62
|
164 end
|
Zerotorescue@62
|
165 end;
|
Zerotorescue@62
|
166
|
Zerotorescue@62
|
167 return widget;
|
Zerotorescue@62
|
168 end
|
Zerotorescue@62
|
169
|
Zerotorescue@62
|
170 AceGUI:RegisterWidgetType(widgetType, GetItemLinkButton, widgetVersion);
|
Zerotorescue@62
|
171 end
|
Zerotorescue@62
|
172
|
Zerotorescue@62
|
173 function Widgets:InlineGroupWithButton()
|
Zerotorescue@62
|
174 -- Register InlineGroupWithButton-widget
|
Zerotorescue@62
|
175 -- This widget adds a button next to the header of an inline group
|
Zerotorescue@62
|
176 -- SetPoint doesn't seem usable within AceGUI.
|
Zerotorescue@62
|
177
|
Zerotorescue@62
|
178 local widgetType = "InlineGroupWithButton";
|
Zerotorescue@62
|
179 local widgetVersion = 1;
|
Zerotorescue@62
|
180
|
Zerotorescue@62
|
181 local function Constructor()
|
Zerotorescue@62
|
182 local widget = AceGUI:Create("InlineGroup");
|
Zerotorescue@62
|
183 widget.type = widgetType;
|
Zerotorescue@62
|
184
|
Zerotorescue@62
|
185 widget.MakeButton = function(self, buttonSettings)
|
Zerotorescue@62
|
186 if type(buttonSettings) == "table" then
|
Zerotorescue@62
|
187 if not self.btnQueue then
|
Zerotorescue@62
|
188 -- Because widgets are re-used, we don't want to recreate this button
|
Zerotorescue@62
|
189 self.btnQueue = CreateFrame("Button", nil, self.frame, "UIPanelButtonTemplate");
|
Zerotorescue@62
|
190 self.btnQueue:SetHeight(22);
|
Zerotorescue@62
|
191 self.btnQueue:SetWidth(120);
|
Zerotorescue@62
|
192 end
|
Zerotorescue@62
|
193 self.btnQueue:SetText(buttonSettings.name);
|
Zerotorescue@62
|
194 self.btnQueue:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -10, 5);
|
Zerotorescue@62
|
195
|
Zerotorescue@62
|
196 -- Triggers
|
Zerotorescue@62
|
197 self.btnQueue:SetScript("OnClick", buttonSettings.exec);
|
Zerotorescue@62
|
198
|
Zerotorescue@62
|
199 -- Tooltip
|
Zerotorescue@62
|
200 self.btnQueue.tooltipTitle = buttonSettings.name;
|
Zerotorescue@62
|
201 self.btnQueue.tooltip = buttonSettings.desc or "";
|
Zerotorescue@62
|
202 self.btnQueue:SetScript("OnEnter", ShowTooltip);
|
Zerotorescue@62
|
203 self.btnQueue:SetScript("OnLeave", HideTooltip);
|
Zerotorescue@62
|
204 else
|
Zerotorescue@62
|
205 error("settings must be a table - usage: MakeButton(table);");
|
Zerotorescue@62
|
206 end
|
Zerotorescue@62
|
207 end;
|
Zerotorescue@62
|
208
|
Zerotorescue@62
|
209 return widget;
|
Zerotorescue@62
|
210 end
|
Zerotorescue@62
|
211
|
Zerotorescue@62
|
212 AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion);
|
Zerotorescue@62
|
213 end |