Mercurial > wow > itemauditor
comparison Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua @ 0:169f5211fc7f
First public revision.
At this point ItemAuditor watches mail for auctions sold or purchased, watches for buy/sell (money and 1 item type change) and conversions/tradeskills. Milling isn't working yet because there is too much time between the first event and the last event.
| author | Asa Ayers <Asa.Ayers@Gmail.com> |
|---|---|
| date | Thu, 20 May 2010 19:22:19 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:169f5211fc7f |
|---|---|
| 1 | |
| 2 --[[ | |
| 3 --Multiline Editbox Widget, Originally by bam | |
| 4 | |
| 5 --]] | |
| 6 local AceGUI = LibStub("AceGUI-3.0") | |
| 7 | |
| 8 -- Lua APIs | |
| 9 local format, pairs, tostring = string.format, pairs, tostring | |
| 10 | |
| 11 -- WoW APIs | |
| 12 local GetCursorInfo, ClearCursor, GetSpellName = GetCursorInfo, ClearCursor, GetSpellName | |
| 13 local CreateFrame, UIParent = CreateFrame, UIParent | |
| 14 | |
| 15 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded | |
| 16 -- List them here for Mikk's FindGlobals script | |
| 17 -- GLOBALS: ChatFontNormal, ACCEPT | |
| 18 | |
| 19 local Version = 11 | |
| 20 --------------------- | |
| 21 -- Common Elements -- | |
| 22 --------------------- | |
| 23 | |
| 24 local FrameBackdrop = { | |
| 25 bgFile="Interface\\DialogFrame\\UI-DialogBox-Background", | |
| 26 edgeFile="Interface\\DialogFrame\\UI-DialogBox-Border", | |
| 27 tile = true, tileSize = 32, edgeSize = 32, | |
| 28 insets = { left = 8, right = 8, top = 8, bottom = 8 } | |
| 29 } | |
| 30 | |
| 31 local PaneBackdrop = { | |
| 32 | |
| 33 bgFile = "Interface\\ChatFrame\\ChatFrameBackground", | |
| 34 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", | |
| 35 tile = true, tileSize = 16, edgeSize = 16, | |
| 36 insets = { left = 3, right = 3, top = 5, bottom = 3 } | |
| 37 } | |
| 38 | |
| 39 local ControlBackdrop = { | |
| 40 bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", | |
| 41 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", | |
| 42 tile = true, tileSize = 16, edgeSize = 16, | |
| 43 insets = { left = 3, right = 3, top = 3, bottom = 3 } | |
| 44 } | |
| 45 | |
| 46 -------------------------- | |
| 47 -- Edit box -- | |
| 48 -------------------------- | |
| 49 --[[ | |
| 50 Events : | |
| 51 OnTextChanged | |
| 52 OnEnterPressed | |
| 53 | |
| 54 ]] | |
| 55 do | |
| 56 local Type = "MultiLineEditBox" | |
| 57 | |
| 58 local MultiLineEditBox = {} | |
| 59 | |
| 60 local function EditBox_OnEnterPressed(this) | |
| 61 local self = this.obj | |
| 62 local value = this:GetText() | |
| 63 local cancel = self:Fire("OnEnterPressed",value) | |
| 64 if not cancel then | |
| 65 self.button:Disable() | |
| 66 end | |
| 67 end | |
| 68 | |
| 69 local function Button_OnClick(this) | |
| 70 local editbox = this.obj.editbox | |
| 71 editbox:ClearFocus() | |
| 72 EditBox_OnEnterPressed(editbox) | |
| 73 end | |
| 74 | |
| 75 local function EditBox_OnReceiveDrag(this) | |
| 76 local self = this.obj | |
| 77 local type, id, info = GetCursorInfo() | |
| 78 if type == "item" then | |
| 79 self:SetText(info) | |
| 80 self:Fire("OnEnterPressed",info) | |
| 81 ClearCursor() | |
| 82 elseif type == "spell" then | |
| 83 local name, rank = GetSpellName(id, info) | |
| 84 if rank and rank:match("%d") then | |
| 85 name = name.."("..rank..")" | |
| 86 end | |
| 87 self:SetText(name) | |
| 88 self:Fire("OnEnterPressed",name) | |
| 89 ClearCursor() | |
| 90 end | |
| 91 --self.button:Disable() | |
| 92 AceGUI:ClearFocus() | |
| 93 end | |
| 94 | |
| 95 function MultiLineEditBox:OnAcquire() | |
| 96 self:SetWidth(200) | |
| 97 self:SetHeight(116) | |
| 98 self:SetNumLines(4) | |
| 99 self:SetDisabled(false) | |
| 100 self:ShowButton(true) | |
| 101 end | |
| 102 | |
| 103 function MultiLineEditBox:OnRelease() | |
| 104 self.frame:ClearAllPoints() | |
| 105 self.frame:Hide() | |
| 106 self:SetDisabled(false) | |
| 107 end | |
| 108 | |
| 109 function MultiLineEditBox:SetDisabled(disabled) | |
| 110 self.disabled = disabled | |
| 111 if disabled then | |
| 112 self.editbox:EnableMouse(false) | |
| 113 self.scrollframe:EnableMouse(false) | |
| 114 self.editbox:ClearFocus() | |
| 115 self.editbox:SetTextColor(0.5, 0.5, 0.5) | |
| 116 self.label:SetTextColor(0.5,0.5,0.5) | |
| 117 self.button:Disable() | |
| 118 else | |
| 119 self.editbox:EnableMouse(true) | |
| 120 self.scrollframe:EnableMouse(true) | |
| 121 self.editbox:SetTextColor(1, 1, 1) | |
| 122 self.label:SetTextColor(1,.82,0) | |
| 123 self.button:Enable() | |
| 124 end | |
| 125 end | |
| 126 | |
| 127 function MultiLineEditBox:SetText(text) | |
| 128 text = text or "" | |
| 129 local editbox = self.editbox | |
| 130 local oldText = editbox:GetText() | |
| 131 local dummy = format(" %s", text) | |
| 132 self.lasttext = dummy -- prevents OnTextChanged from firing | |
| 133 editbox:SetText(dummy) | |
| 134 editbox:HighlightText(0, 1) | |
| 135 self.lasttext = oldText | |
| 136 editbox:Insert("") | |
| 137 end | |
| 138 | |
| 139 function MultiLineEditBox:SetLabel(text) | |
| 140 if (text or "") == "" then | |
| 141 self.backdrop:SetPoint("TOPLEFT",self.frame,"TOPLEFT",0,0) | |
| 142 self.label:Hide() | |
| 143 self.label:SetText("") | |
| 144 else | |
| 145 self.backdrop:SetPoint("TOPLEFT",self.frame,"TOPLEFT",0,-20) | |
| 146 self.label:Show() | |
| 147 self.label:SetText(text) | |
| 148 end | |
| 149 end | |
| 150 | |
| 151 function MultiLineEditBox:SetNumLines(number) | |
| 152 number = number or 4 | |
| 153 self:SetHeight(60 + (14*number)) | |
| 154 end | |
| 155 | |
| 156 function MultiLineEditBox:GetText() | |
| 157 return self.editbox:GetText() | |
| 158 end | |
| 159 | |
| 160 function MultiLineEditBox:ShowButton(show) | |
| 161 if show then | |
| 162 self.backdrop:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,22) | |
| 163 self.button:Show() | |
| 164 else | |
| 165 self.backdrop:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0) | |
| 166 self.button:Hide() | |
| 167 end | |
| 168 end | |
| 169 | |
| 170 local function Constructor() | |
| 171 local frame = CreateFrame("Frame", nil, UIParent) | |
| 172 local backdrop = CreateFrame("Frame", nil, frame) | |
| 173 local self = {} | |
| 174 for k, v in pairs(MultiLineEditBox) do self[k] = v end | |
| 175 self.type = Type | |
| 176 self.frame = frame | |
| 177 self.backdrop = backdrop | |
| 178 frame.obj = self | |
| 179 | |
| 180 backdrop:SetBackdrop(ControlBackdrop) | |
| 181 backdrop:SetBackdropColor(0, 0, 0) | |
| 182 backdrop:SetBackdropBorderColor(0.4, 0.4, 0.4) | |
| 183 | |
| 184 backdrop:SetPoint("TOPLEFT",frame,"TOPLEFT",0, -20) | |
| 185 backdrop:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,22) | |
| 186 | |
| 187 local scrollframe = CreateFrame("ScrollFrame", format("%s@%s@%s", Type, "ScrollFrame", tostring(self)), backdrop, "UIPanelScrollFrameTemplate") | |
| 188 scrollframe:SetPoint("TOPLEFT", 5, -6) | |
| 189 scrollframe:SetPoint("BOTTOMRIGHT", -28, 6) | |
| 190 scrollframe.obj = self | |
| 191 self.scrollframe = scrollframe | |
| 192 | |
| 193 --local scrollchild = CreateFrame("Frame", nil, scrollframe) | |
| 194 --scrollframe:SetScrollChild(scrollchild) | |
| 195 --scrollchild:SetHeight(2) | |
| 196 --scrollchild:SetWidth(2) | |
| 197 | |
| 198 local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") | |
| 199 label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,-2) | |
| 200 label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,-2) | |
| 201 label:SetJustifyH("LEFT") | |
| 202 label:SetHeight(18) | |
| 203 self.label = label | |
| 204 | |
| 205 local editbox = CreateFrame("EditBox", nil, scrollframe) | |
| 206 self.editbox = editbox | |
| 207 editbox.obj = self | |
| 208 editbox:SetPoint("TOPLEFT") | |
| 209 editbox:SetPoint("BOTTOMLEFT") | |
| 210 editbox:SetHeight(50) | |
| 211 editbox:SetWidth(50) | |
| 212 editbox:SetMultiLine(true) | |
| 213 -- editbox:SetMaxLetters(7500) | |
| 214 editbox:SetTextInsets(5, 5, 3, 3) | |
| 215 editbox:EnableMouse(true) | |
| 216 editbox:SetAutoFocus(false) | |
| 217 editbox:SetFontObject(ChatFontNormal) | |
| 218 scrollframe:SetScrollChild(editbox) | |
| 219 | |
| 220 local button = CreateFrame("Button",nil,scrollframe,"UIPanelButtonTemplate") | |
| 221 button:SetWidth(80) | |
| 222 button:SetHeight(20) | |
| 223 button:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,2) | |
| 224 button:SetText(ACCEPT) | |
| 225 button:SetScript("OnClick", Button_OnClick) | |
| 226 button:SetFrameLevel(editbox:GetFrameLevel() + 1) | |
| 227 button:Disable() | |
| 228 button:Hide() | |
| 229 self.button = button | |
| 230 button.obj = self | |
| 231 | |
| 232 scrollframe:EnableMouse(true) | |
| 233 scrollframe:SetScript("OnMouseUp", function() editbox:SetFocus() end) | |
| 234 scrollframe:SetScript("OnEnter", function(this) this.obj:Fire("OnEnter") end) | |
| 235 scrollframe:SetScript("OnLeave", function(this) this.obj:Fire("OnLeave") end) | |
| 236 | |
| 237 editbox:SetScript("OnEnter", function(this) this.obj:Fire("OnEnter") end) | |
| 238 editbox:SetScript("OnLeave", function(this) this.obj:Fire("OnLeave") end) | |
| 239 | |
| 240 local function FixSize() | |
| 241 --scrollchild:SetHeight(scrollframe:GetHeight()) | |
| 242 --scrollchild:SetWidth(scrollframe:GetWidth()) | |
| 243 editbox:SetWidth(scrollframe:GetWidth()) | |
| 244 end | |
| 245 scrollframe:SetScript("OnShow", FixSize) | |
| 246 scrollframe:SetScript("OnSizeChanged", FixSize) | |
| 247 | |
| 248 editbox:SetScript("OnEscapePressed", editbox.ClearFocus) | |
| 249 editbox:SetScript("OnTextChanged", function(_, ...) | |
| 250 scrollframe:UpdateScrollChildRect() | |
| 251 local value = editbox:GetText() | |
| 252 if value ~= self.lasttext then | |
| 253 self:Fire("OnTextChanged", value) | |
| 254 self.lasttext = value | |
| 255 if not self.disabled then | |
| 256 self.button:Enable() | |
| 257 end | |
| 258 end | |
| 259 end) | |
| 260 | |
| 261 editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag) | |
| 262 editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag) | |
| 263 | |
| 264 do | |
| 265 local cursorOffset, cursorHeight | |
| 266 local idleTime | |
| 267 local function FixScroll(_, elapsed) | |
| 268 if cursorOffset and cursorHeight then | |
| 269 idleTime = 0 | |
| 270 local height = scrollframe:GetHeight() | |
| 271 local range = scrollframe:GetVerticalScrollRange() | |
| 272 local scroll = scrollframe:GetVerticalScroll() | |
| 273 local size = height + range | |
| 274 cursorOffset = -cursorOffset | |
| 275 while cursorOffset < scroll do | |
| 276 scroll = scroll - (height / 2) | |
| 277 if scroll < 0 then scroll = 0 end | |
| 278 scrollframe:SetVerticalScroll(scroll) | |
| 279 end | |
| 280 while cursorOffset + cursorHeight > scroll + height and scroll < range do | |
| 281 scroll = scroll + (height / 2) | |
| 282 if scroll > range then scroll = range end | |
| 283 scrollframe:SetVerticalScroll(scroll) | |
| 284 end | |
| 285 elseif not idleTime or idleTime > 2 then | |
| 286 frame:SetScript("OnUpdate", nil) | |
| 287 idleTime = nil | |
| 288 else | |
| 289 idleTime = idleTime + elapsed | |
| 290 end | |
| 291 cursorOffset = nil | |
| 292 end | |
| 293 editbox:SetScript("OnCursorChanged", function(_, x, y, w, h) | |
| 294 cursorOffset, cursorHeight = y, h | |
| 295 if not idleTime then | |
| 296 frame:SetScript("OnUpdate", FixScroll) | |
| 297 end | |
| 298 end) | |
| 299 end | |
| 300 | |
| 301 AceGUI:RegisterAsWidget(self) | |
| 302 return self | |
| 303 end | |
| 304 | |
| 305 AceGUI:RegisterWidgetType(Type, Constructor, Version) | |
| 306 end | |
| 307 | |
| 308 | |
| 309 |
