annotate main.lua @ 3:001b15e07b87

Poke the localizer.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Sat, 12 Feb 2011 19:09:57 +0000
parents 78ff21480511
children e66407f67848
rev   line source
farmbuyer@1 1 local nametag, addon = ...
farmbuyer@3 2 local L = LibStub("AceLocale-3.0"):GetLocale(nametag)
farmbuyer@1 3
farmbuyer@1 4 addon.defaults = {
farmbuyer@1 5 profile = {
farmbuyer@1 6 enable = true,
farmbuyer@1 7 guildcontrol = true,
farmbuyer@1 8 },
farmbuyer@1 9 }
farmbuyer@1 10
farmbuyer@1 11
farmbuyer@1 12 addon.options = {
farmbuyer@1 13 name = "",
farmbuyer@1 14 type = 'group',
farmbuyer@1 15 childGroups = 'tab',
farmbuyer@1 16 handler = addon, -- functions listed as strings called as addon:func
farmbuyer@1 17 get = "GetOption",
farmbuyer@1 18 set = "SetOption",
farmbuyer@1 19 args = {
farmbuyer@1 20 general = {
farmbuyer@3 21 name = GENERAL,
farmbuyer@3 22 desc = L["General options"],
farmbuyer@1 23 type = 'group',
farmbuyer@1 24 order = 10,
farmbuyer@1 25 args = {
farmbuyer@1 26 version = {
farmbuyer@1 27 --name = filled in during OnInit
farmbuyer@1 28 type = 'description',
farmbuyer@1 29 fontSize = "large",
farmbuyer@1 30 cmdHidden = true,
farmbuyer@1 31 width = 'full',
farmbuyer@1 32 order = 1,
farmbuyer@1 33 },
farmbuyer@1 34 enable = {
farmbuyer@3 35 name = ENABLE,
farmbuyer@3 36 desc = L["Use this addon"],
farmbuyer@1 37 type = 'toggle',
farmbuyer@1 38 arg = "ToggleEnable",
farmbuyer@1 39 order = 5,
farmbuyer@1 40 },
farmbuyer@1 41 guildcontrol = {
farmbuyer@3 42 name = L["Guild Control for non-GMs"],
farmbuyer@3 43 desc = L["Make the grayed-out Guild Control button activate this addon instead."],
farmbuyer@1 44 type = 'toggle',
farmbuyer@1 45 order = 10,
farmbuyer@1 46 },
farmbuyer@1 47 break1 = {
farmbuyer@1 48 name = '',
farmbuyer@1 49 type = 'description',
farmbuyer@1 50 cmdHidden = true,
farmbuyer@1 51 width = 'full',
farmbuyer@1 52 order = 14,
farmbuyer@1 53 },
farmbuyer@1 54 popup = {
farmbuyer@1 55 name = "/wrdw",
farmbuyer@3 56 desc = L["Toggle WRDW window"],
farmbuyer@1 57 type = 'execute',
farmbuyer@1 58 func = function()
farmbuyer@1 59 InterfaceOptionsFrameCancel:Click()
farmbuyer@1 60 HideUIPanel(GameMenuFrame)
farmbuyer@1 61 addon:BuildWindow()
farmbuyer@1 62 end,
farmbuyer@1 63 order = 15,
farmbuyer@1 64 },
farmbuyer@1 65 },
farmbuyer@1 66 },
farmbuyer@1 67 --profiles = filled in OnInit
farmbuyer@1 68 },
farmbuyer@1 69 }
farmbuyer@1 70
farmbuyer@1 71
farmbuyer@1 72 -----------------------------------------------------------------------------
farmbuyer@1 73 -- other locals
farmbuyer@1 74 local AceGUI = LibStub("AceGUI-3.0")
farmbuyer@1 75 local st_rowheight = 25
farmbuyer@1 76 local st_displayed_rows = 15 --math.floor(366/st_rowheight)
farmbuyer@1 77 local sidetabs
farmbuyer@1 78 local incomplete
farmbuyer@1 79
farmbuyer@1 80 -- Remove children widgets without explicitly Release()'ing them.
farmbuyer@1 81 local function DisownChildren (container)
farmbuyer@1 82 for i,v in ipairs(container.children) do
farmbuyer@1 83 container.children[i] = nil
farmbuyer@1 84 v.frame:Hide()
farmbuyer@1 85 v.frame:ClearAllPoints()
farmbuyer@1 86 end
farmbuyer@1 87 end
farmbuyer@1 88
farmbuyer@1 89
farmbuyer@1 90 -----------------------------------------------------------------------------
farmbuyer@1 91 addon = LibStub("AceAddon-3.0"):NewAddon(addon, nametag,
farmbuyer@1 92 "AceConsole-3.0", "AceEvent-3.0")
farmbuyer@1 93
farmbuyer@1 94 -- Thanks to jerry for the nifty arg idea.
farmbuyer@1 95 function addon:SetOption (info, value)
farmbuyer@1 96 local name = info[#info]
farmbuyer@1 97 self.db.profile[name] = value
farmbuyer@1 98 local arg = info.arg
farmbuyer@1 99 if arg then self[arg](self) end
farmbuyer@1 100 end
farmbuyer@1 101
farmbuyer@1 102 function addon:GetOption (info)
farmbuyer@1 103 local name = info[#info]
farmbuyer@1 104 return self.db.profile[name]
farmbuyer@1 105 end
farmbuyer@1 106
farmbuyer@1 107 function addon:OnInitialize()
farmbuyer@1 108 self.db = LibStub("AceDB-3.0"):New("wrdwDB", self.defaults, --[[Default=]]true)
farmbuyer@1 109
farmbuyer@1 110 local AceDBOptions = LibStub("AceDBOptions-3.0", true)
farmbuyer@1 111 if AceDBOptions then
farmbuyer@1 112 self.options.args.profiles = AceDBOptions:GetOptionsTable(self.db)
farmbuyer@1 113 self.options.args.profiles.order = 200
farmbuyer@1 114 end
farmbuyer@1 115
farmbuyer@1 116 self.options.args.general.args.version.name =
farmbuyer@1 117 "|cff30adffVersion " .. (GetAddOnMetadata(nametag, "Version") or "?") .. "|r"
farmbuyer@1 118 LibStub("AceConfig-3.0"):RegisterOptionsTable(nametag, self.options)
farmbuyer@1 119 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions(nametag, "WhichRankDoesWhat")
farmbuyer@1 120 --self.optionsFrame.okay = function() pattern_editing_safe = false end
farmbuyer@1 121 --self.optionsFrame.refresh = self.optionsFrame.okay
farmbuyer@1 122 --self.optionsFrame.cancel = self.optionsFrame.okay
farmbuyer@1 123
farmbuyer@1 124 self:SetEnabledState(self.db.profile.enable)
farmbuyer@1 125 self.OnInitialize = nil
farmbuyer@1 126 end
farmbuyer@1 127
farmbuyer@1 128
farmbuyer@1 129 function addon:OnEnable()
farmbuyer@1 130 self:RegisterEvent("GUILD_RANKS_UPDATE")
farmbuyer@1 131 self:RegisterChatCommand("wrdw", "OnChatCommand")
farmbuyer@1 132
farmbuyer@1 133 if (not IsGuildLeader()) and self.db.profile.guildcontrol then
farmbuyer@1 134 local function onclick() addon:BuildWindow() end
farmbuyer@1 135 local function onenter(this) GameTooltip_AddNewbieTip(this, GUILDCONTROL, 1.0, 1.0, 1.0, "/wrdw", 1) end
farmbuyer@1 136 GuildFrame_LoadUI()
farmbuyer@1 137 hooksecurefunc("GuildFrame_CheckPermissions", function()
farmbuyer@1 138 GuildControlButton:Enable()
farmbuyer@1 139 GuildControlButton:SetScript("OnClick", onclick)
farmbuyer@1 140 GuildControlButton:SetScript("OnEnter", onenter)
farmbuyer@1 141 end)
farmbuyer@1 142 end
farmbuyer@1 143 end
farmbuyer@1 144
farmbuyer@1 145 function addon:OnDisable()
farmbuyer@3 146 self:Print(L["You will need to relog or /reload to fully disable this addon."])
farmbuyer@1 147 end
farmbuyer@1 148
farmbuyer@1 149 function addon:ToggleEnable()
farmbuyer@1 150 if self.db.profile.enable then
farmbuyer@1 151 self:Enable()
farmbuyer@1 152 else
farmbuyer@1 153 self:Disable()
farmbuyer@1 154 end
farmbuyer@1 155 end
farmbuyer@1 156
farmbuyer@1 157 function addon:OnChatCommand (input)
farmbuyer@1 158 if not input or input:trim() == "" then
farmbuyer@1 159 if self.display and self.display:IsShown() then
farmbuyer@1 160 self.display:Hide()
farmbuyer@1 161 else
farmbuyer@1 162 self:BuildWindow()
farmbuyer@1 163 end
farmbuyer@1 164 else
farmbuyer@1 165 --LibStub("AceConfigCmd-3.0").HandleCommand(self, "wrdw", nametag, input)
farmbuyer@1 166 LibStub("AceConfigDialog-3.0"):Open(nametag)
farmbuyer@1 167 end
farmbuyer@1 168 end
farmbuyer@1 169
farmbuyer@1 170
farmbuyer@1 171 -- Something somewhere has changed, redo the cache
farmbuyer@3 172 do
farmbuyer@3 173 local text = '|cffff1010' .. L["Guild flags have changed!"] .. '|r' ..
farmbuyer@3 174 L["You must close and reopen this window to display the changes."]
farmbuyer@3 175 function addon:GUILD_RANKS_UPDATE()
farmbuyer@3 176 self.perms = nil
farmbuyer@3 177 if (not incomplete) and self.display and self.display:IsVisible() then
farmbuyer@3 178 self.display:SetStatusText(text)
farmbuyer@3 179 end
farmbuyer@1 180 end
farmbuyer@1 181 end
farmbuyer@1 182
farmbuyer@1 183
farmbuyer@1 184 function addon:BuildPerms()
farmbuyer@1 185 assert(UIParentLoadAddOn("Blizzard_GuildControlUI"))
farmbuyer@2 186 local check = "|TInterface\\Buttons\\UI-CheckBox-Check:"..(st_rowheight+5).."|t"
farmbuyer@1 187
farmbuyer@1 188 -- http://www.wowace.com/addons/lib-st/pages/set-data/minimal-dataset-format/
farmbuyer@1 189 local p,v = {}, {}
farmbuyer@1 190 for r = 1, GuildControlGetNumRanks() do
farmbuyer@1 191 GuildControlSetRank(r)
farmbuyer@1 192
farmbuyer@1 193 -- permissions
farmbuyer@1 194 local flags = { GuildControlGetRankFlags() }
farmbuyer@1 195 local row = { GuildControlGetRankName(r) }
farmbuyer@1 196 for c = 1, NUM_RANK_FLAGS do if c ~= 14 then
farmbuyer@1 197 local newcol = #row + 1
farmbuyer@1 198 if c == 15 or c == 16 then
farmbuyer@1 199 local val = GetGuildBankWithdrawGoldLimit()
farmbuyer@1 200 row[newcol] = flags[c] and ((val == -1) and check or val) or ""
farmbuyer@1 201 else
farmbuyer@1 202 row[newcol] = flags[c] and check or ""
farmbuyer@1 203 end
farmbuyer@1 204 end end
farmbuyer@1 205 p[r] = row
farmbuyer@1 206
farmbuyer@1 207 -- guild vault
farmbuyer@1 208 local banktabs = {}
farmbuyer@1 209 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 210 -- isViewable, canDeposit, editText, numWithdrawals
farmbuyer@1 211 banktabs[t] = { row[1], GetGuildBankTabPermissions(t) }
farmbuyer@1 212 banktabs[t][2] = banktabs[t][2] and check or ""
farmbuyer@1 213 banktabs[t][3] = banktabs[t][3] and check or ""
farmbuyer@1 214 banktabs[t][4] = banktabs[t][4] and check or ""
farmbuyer@1 215 local withdraw = banktabs[t][5]
farmbuyer@1 216 banktabs[t][5] = (withdraw == -1) and check or (withdraw == 0) and "" or withdraw
farmbuyer@1 217 end
farmbuyer@1 218 v[r] = banktabs
farmbuyer@1 219 end
farmbuyer@1 220 self.perms = p
farmbuyer@1 221 -- This one needs to be turned inside-out to match the data requirements
farmbuyer@1 222 self.vault = {}
farmbuyer@1 223 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 224 self.vault[t] = {}
farmbuyer@1 225 for r = 1, #v do
farmbuyer@1 226 self.vault[t][r] = v[r][t]
farmbuyer@1 227 end
farmbuyer@1 228 end
farmbuyer@1 229 end
farmbuyer@1 230
farmbuyer@1 231
farmbuyer@1 232 local function setstatus(txt) addon.display:SetStatusText(txt) end
farmbuyer@1 233
farmbuyer@1 234 local make_sidetab
farmbuyer@1 235 do
farmbuyer@1 236 local lastclicked
farmbuyer@1 237 local function OnClick (thistab)
farmbuyer@1 238 if thistab == lastclicked then return end
farmbuyer@1 239 for i = 1, #sidetabs do
farmbuyer@1 240 sidetabs[i]:SetChecked(false)
farmbuyer@1 241 end
farmbuyer@1 242 thistab:SetChecked(true) -- should be redundant, but just in case
farmbuyer@1 243 lastclicked = thistab
farmbuyer@1 244 if thistab.callback then
farmbuyer@1 245 thistab:callback(thistab:GetID())
farmbuyer@1 246 end
farmbuyer@1 247 end
farmbuyer@1 248
farmbuyer@1 249 -- Some magic numbers here wrt the index
farmbuyer@1 250 function make_sidetab (index, callback)
farmbuyer@1 251 if not sidetabs then
farmbuyer@1 252 sidetabs = {}
farmbuyer@1 253 end
farmbuyer@1 254
farmbuyer@1 255 local tab = CreateFrame("CheckButton", "WRDWTab"..index, addon.display.frame, "SpellBookSkillLineTabTemplate", index)
farmbuyer@1 256 if index > 1 then
farmbuyer@1 257 tab:SetPoint("TOPLEFT", sidetabs[index-1], "BOTTOMLEFT", 0, -17)
farmbuyer@1 258 else
farmbuyer@1 259 tab:SetNormalTexture("Interface\\SpellBook\\GuildSpellbooktabBG")
farmbuyer@1 260 tab.TabardEmblem:Show()
farmbuyer@1 261 tab.TabardIconFrame:Show()
farmbuyer@1 262 SetLargeGuildTabardTextures("player", tab.TabardEmblem, tab:GetNormalTexture(), tab.TabardIconFrame)
farmbuyer@1 263 tab:SetPoint("TOPLEFT", addon.display.frame, "TOPRIGHT", 0, -17)
farmbuyer@1 264 end
farmbuyer@1 265 tab:SetScript("OnClick", OnClick)
farmbuyer@1 266 --tab:SetChecked(false) -- is default
farmbuyer@1 267 tab:Show()
farmbuyer@1 268 tab.callback = callback
farmbuyer@1 269 sidetabs[index] = tab
farmbuyer@1 270 return tab
farmbuyer@1 271 end
farmbuyer@1 272
farmbuyer@1 273 function addon:BuildVaultTabs()
farmbuyer@1 274 incomplete = nil
farmbuyer@1 275 local offset = 1 -- number of tabs already made
farmbuyer@1 276 local function pick_a_tab (tab, id)
farmbuyer@1 277 DisownChildren(self.display)
farmbuyer@1 278 self.display:AddChild(self.vault_sts[id-offset])
farmbuyer@1 279 end
farmbuyer@1 280 for t = 1, GetNumGuildBankTabs() do
farmbuyer@1 281 local name, icon = GetGuildBankTabInfo(t)
farmbuyer@1 282 incomplete = incomplete or icon == [[Interface\Icons\INV_Misc_QuestionMark]]
farmbuyer@1 283 local tab = make_sidetab(t+offset, pick_a_tab)
farmbuyer@1 284 tab:SetNormalTexture(icon)
farmbuyer@1 285 tab.tooltip = name
farmbuyer@1 286 end
farmbuyer@1 287 if incomplete then
farmbuyer@3 288 setstatus(L["Guild vault information is incomplete. Be closer to a vault, and give it some time. You may need to relog and/or open the guild roster/vault to force a client update."])
farmbuyer@1 289 end
farmbuyer@1 290 end
farmbuyer@1 291 end
farmbuyer@1 292
farmbuyer@1 293
farmbuyer@1 294 local function st_OnEnter (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 295 if (row == nil) or (realrow == nil) then -- mouseover column header
farmbuyer@1 296 setstatus(cellFrame:GetText():gsub('\n',' '))
farmbuyer@1 297 return true
farmbuyer@1 298 end
farmbuyer@1 299 return false -- continue with default highlighting behavior
farmbuyer@1 300 end
farmbuyer@1 301 local function st_OnLeave (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 302 setstatus("")
farmbuyer@1 303 return false -- continue with default un-highlighting behavior
farmbuyer@1 304 end
farmbuyer@1 305 local function st_OnClick (rowFrame, cellFrame, data, cols, row, realrow, column, sttable, button, ...)
farmbuyer@1 306 if (row == nil) or (realrow == nil) then return true end -- click column header, suppress reordering
farmbuyer@1 307 -- more here?
farmbuyer@1 308 return true -- do not do anything further
farmbuyer@1 309 end
farmbuyer@1 310
farmbuyer@1 311
farmbuyer@1 312 function addon:BuildMainST (permissions, parent_frame)
farmbuyer@1 313 -- if this language uses a trailing colon, strip it
farmbuyer@1 314 local tmp = GUILDCONTROL_RANKLABEL:gsub(":$","")
farmbuyer@1 315 local cols = {{
farmbuyer@1 316 name = tmp,
farmbuyer@1 317 width = 10 * #tmp,
farmbuyer@1 318 }}
farmbuyer@1 319 for i = 1, NUM_RANK_FLAGS do if i ~= 14 then
farmbuyer@1 320 table.insert(cols,{
farmbuyer@1 321 name = _G['GUILDCONTROL_OPTION'..i],
farmbuyer@1 322 width = 62,
farmbuyer@1 323 })
farmbuyer@1 324 end end
farmbuyer@1 325
farmbuyer@1 326 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
farmbuyer@1 327 ST:Hide()
farmbuyer@1 328
farmbuyer@1 329 ST:SetData(permissions, --[[minimal format=]]true)
farmbuyer@1 330 ST:RegisterEvents{
farmbuyer@1 331 OnEnter = st_OnEnter,
farmbuyer@1 332 OnLeave = st_OnLeave,
farmbuyer@1 333 OnClick = st_OnClick,
farmbuyer@1 334 OnDoubleClick = st_OnClick,
farmbuyer@1 335 }
farmbuyer@1 336
farmbuyer@1 337 return ST
farmbuyer@1 338 end
farmbuyer@1 339
farmbuyer@1 340 function addon:BuildVaultSTs (permissions, parent_frame)
farmbuyer@1 341 self.vault_sts = {}
farmbuyer@1 342 local cols = {
farmbuyer@1 343 self.main_st.st.cols[1],
farmbuyer@1 344 { name = GUILDCONTROL_VIEW_TAB, width = 80 },
farmbuyer@1 345 { name = GUILDCONTROL_DEPOSIT_ITEMS, width = 80 },
farmbuyer@1 346 { name = GUILDCONTROL_UPDATE_TEXT, width = 80 },
farmbuyer@1 347 { name = GUILDCONTROL_WITHDRAW_ITEMS, width = 150 },
farmbuyer@1 348 }
farmbuyer@1 349
farmbuyer@1 350 for tab = 1, #permissions do
farmbuyer@1 351 local ST = LibStub("ScrollingTable"):CreateST (cols, st_displayed_rows, st_rowheight, nil, parent_frame)
farmbuyer@1 352 ST:Hide()
farmbuyer@1 353 ST:SetData(permissions[tab], --[[minimal format=]]true)
farmbuyer@1 354 ST:RegisterEvents{
farmbuyer@1 355 OnEnter = st_OnEnter,
farmbuyer@1 356 OnLeave = st_OnLeave,
farmbuyer@1 357 OnClick = st_OnClick,
farmbuyer@1 358 OnDoubleClick = st_OnClick,
farmbuyer@1 359 }
farmbuyer@1 360 self.vault_sts[tab] = ST
farmbuyer@1 361 end
farmbuyer@1 362 end
farmbuyer@1 363
farmbuyer@1 364
farmbuyer@1 365 function addon:BuildWindow()
farmbuyer@1 366 local need_tabs
farmbuyer@1 367 if self.display then
farmbuyer@1 368 self.display:Hide()
farmbuyer@1 369 else
farmbuyer@1 370 self.display = AceGUI:Create("Frame")
farmbuyer@1 371 self.display:SetTitle("Which Rank Does What")
farmbuyer@1 372 self.display:SetLayout("Fill")
farmbuyer@1 373 self.display:SetStatusTable{
farmbuyer@1 374 width = 1225,
farmbuyer@1 375 height = 500,
farmbuyer@1 376 }
farmbuyer@1 377 self.display:ApplyStatus()
farmbuyer@1 378 self.display:SetCallback("OnClose", function(_d)
farmbuyer@1 379 if incomplete or (not self.perms) then
farmbuyer@1 380 -- stuff changed while open
farmbuyer@1 381 self.perms = nil
farmbuyer@1 382 self.display = nil
farmbuyer@1 383 sidetabs = nil
farmbuyer@1 384 AceGUI:Release(_d)
farmbuyer@1 385 end
farmbuyer@1 386 end)
farmbuyer@1 387 if self.display.EnableResize then
farmbuyer@1 388 self.display:EnableResize(false)
farmbuyer@1 389 end
farmbuyer@1 390 need_tabs = true
farmbuyer@1 391 end
farmbuyer@1 392
farmbuyer@1 393 if not self.perms then
farmbuyer@1 394 need_tabs = true
farmbuyer@1 395 self:BuildPerms() -- creates self.perms and self.vault
farmbuyer@1 396 DisownChildren(self.display)
farmbuyer@1 397 -- Could be new rows, fewer rows, changed tickboxes... ugh, trying to
farmbuyer@1 398 -- update the scrolltable is a pain. Throw it out and start over.
farmbuyer@1 399 if self.main_st and self.main_st.st then
farmbuyer@1 400 self.main_st:Release()
farmbuyer@1 401 end
farmbuyer@1 402 if self.vault_sts then for i = 1, #self.vault_sts do
farmbuyer@1 403 if self.vault_sts[i] and self.vault_sts[i].st then
farmbuyer@1 404 self.vault_sts[i]:Release()
farmbuyer@1 405 end
farmbuyer@1 406 end end
farmbuyer@1 407 self.main_st = nil
farmbuyer@1 408 self.vault_sts = nil
farmbuyer@1 409 end
farmbuyer@1 410 if not self.main_st then
farmbuyer@1 411 local st = self:BuildMainST (self.perms, self.display.content)
farmbuyer@1 412 self.main_st = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@1 413 self.main_st.head_offset = 20
farmbuyer@1 414 --st_widget.tail_offset = 5
farmbuyer@1 415 self.display:AddChild(self.main_st)
farmbuyer@1 416
farmbuyer@1 417 self:BuildVaultSTs (self.vault, self.display.content)
farmbuyer@1 418 for i,st in ipairs(self.vault_sts) do
farmbuyer@1 419 self.vault_sts[i] = AceGUI:Create("lib-st"):WrapST(st)
farmbuyer@1 420 self.vault_sts[i].head_offset = 20
farmbuyer@1 421 end
farmbuyer@1 422 end
farmbuyer@1 423
farmbuyer@1 424 if need_tabs or incomplete then
farmbuyer@1 425 local maintab = make_sidetab(1, function (this, id)
farmbuyer@1 426 DisownChildren(self.display)
farmbuyer@1 427 self.display:AddChild(self.main_st)
farmbuyer@1 428 end)
farmbuyer@1 429 maintab.tooltip = [[Rank permissions]]
farmbuyer@1 430 maintab:SetChecked(true)
farmbuyer@1 431 self:BuildVaultTabs()
farmbuyer@1 432 end
farmbuyer@1 433
farmbuyer@1 434 self.display:Show()
farmbuyer@1 435 return self.display
farmbuyer@1 436 end
farmbuyer@1 437
farmbuyer@1 438 -- vim:noet