--*********************************************************** --** ROBERT JOHNSON ** --** UI display with a question or text ** --** can display a yes/no button or ok btn ** --*********************************************************** ISNewsUpdate = ISPanelJoypad:derive("ISNewsUpdate"); local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small) --************************************************************************-- --** ISNewsUpdate:initialise --** --************************************************************************-- function ISNewsUpdate:initialise() ISPanelJoypad.initialise(self); local fontHgtMedium = getTextManager():getFontFromEnum(UIFont.Medium):getLineHeight() self.versionCombo = ISComboBox:new((self.width - 200) / 2, 16, 200, 3 + fontHgtMedium + 3, self, self.onVersionSelected) self.versionCombo.font = UIFont.Medium self.versionCombo:initialise() self.versionCombo:instantiate() self:addChild(self.versionCombo) local versions = Translator.getNewsVersions() self.versionCombo.selected = versions:size() for i=1,versions:size() do local version = versions:get(i-1) self.versionCombo:addOptionWithData(version, version) if version == getGameVersion() then self.versionCombo.selected = i end end local btnWid = 100 local btnHgt = math.max(25, FONT_HGT_SMALL + 3 * 2) local padBottom = 10 if self.yesno then self.yes = ISButton:new((self:getWidth() / 2) - btnWid - 5, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("UI_Yes"), self, ISNewsUpdate.onClick); self.yes.internal = "YES"; self.yes.anchorTop = false self.yes.anchorBottom = true self.yes:initialise(); self.yes:instantiate(); self.yes.borderColor = {r=1, g=1, b=1, a=0.1}; self:addChild(self.yes); self.no = ISButton:new((self:getWidth() / 2) + 5, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("UI_No"), self, ISNewsUpdate.onClick); self.no.internal = "NO"; self.no.anchorTop = false self.no.anchorBottom = true self.no:initialise(); self.no:instantiate(); self.no.borderColor = {r=1, g=1, b=1, a=0.1}; self:addChild(self.no); else self.ok = ISButton:new((self:getWidth() / 2) - btnWid / 2, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("UI_btn_close"), self, ISNewsUpdate.onClick); self.ok.internal = "OK"; self.ok.anchorTop = false self.ok.anchorBottom = true self.ok:initialise(); self.ok:instantiate(); self.ok.borderColor = {r=1, g=1, b=1, a=0.1}; self:addChild(self.ok); end local chatY = self.versionCombo:getBottom() + 16 self.chatText = ISRichTextPanel:new(0, chatY, self.width - 15, self.height - 60 - chatY); self.chatText.marginRight = self.chatText.marginLeft; self.chatText:initialise(); self:addChild(self.chatText); self.chatText.background = false; self.chatText.autosetheight = false; self.chatText.clip = true self.chatText:addScrollBars(); if not versions:isEmpty() then self:onVersionSelected() end end function ISNewsUpdate:onVersionSelected() local version = self.versionCombo.options[self.versionCombo.selected].data self.chatText.text = Translator.getText("News_" .. version .. "_Disclaimer") self.chatText:paginate() end function ISNewsUpdate:updateButtons() local btnHgt = 25 local padBottom = 10 if self.yesno then self.yes:setY(self:getHeight() - padBottom - btnHgt); self.no:setY(self:getHeight() - padBottom - btnHgt); else self.ok:setY(self:getHeight() - padBottom - btnHgt); end end function ISNewsUpdate:render() ISPanel.render(self); end function ISNewsUpdate:destroy() self:setVisible(false); if self.destroyOnClick then self:removeFromUIManager(); end if self.player and JoypadState.players[self.player+1] then setJoypadFocus(self.player, nil); end end function ISNewsUpdate:onClick(button) self:destroy(); if self.onclick ~= nil then self.onclick(self.target, button, self.param1, self.param2); end end function ISNewsUpdate:prerender() self:drawRect(0, 0, self.width, self.height, self.backgroundColor.a, self.backgroundColor.r, self.backgroundColor.g, self.backgroundColor.b); self:drawRectBorder(0, 0, self.width, self.height, self.borderColor.a, self.borderColor.r, self.borderColor.g, self.borderColor.b); -- self:drawTextCentre(self.text, self:getWidth() / 2, (self:getHeight() / 2) - 10, 1, 1, 1, 1, UIFont.Small); self:drawTextRight(getText("UI_NewsVersion"), self.versionCombo:getX() - 8, self.versionCombo:getY() + 3, 1, 1, 1, 1, UIFont.Medium) end function ISNewsUpdate:onMouseDown(x, y) -- ISPanelJoypad.onMouseDown(self, x, y) -- FIXME: this prevents clicks being passed to windows behind, but need to swallow clicks outside and mouse-move events as well return true end function ISNewsUpdate:onGainJoypadFocus(joypadData) ISPanelJoypad.onGainJoypadFocus(self, joypadData); if self.yesno then self:setISButtonForA(self.yes) self:setISButtonForB(self.no) self.yes.mouseOver = true; else self:setISButtonForA(self.ok) self.ok.mouseOver = true; end end function ISNewsUpdate:onJoypadDown(button) if button == Joypad.AButton then if self.yesno then if self.yes.mouseOver then self.yes.player = self.player; self.yes.onclick(self.yes.target, self.yes); else self.no.player = self.player; self.no.onclick(self.no.target, self.no); end else self.ok.onclick(self.ok.target, self.ok); end end if button == Joypad.BButton then if self.yesno then self.no.player = self.player; self.no.onclick(self.no.target, self.no); else self.ok.onclick(self.ok.target, self.ok); end end end function ISNewsUpdate:onJoypadDirRight() if self.yesno then self.no.mouseOver = true; self.yes.mouseOver = false; end end function ISNewsUpdate:onJoypadDirLeft() if self.yesno then self.no.mouseOver = false; self.yes.mouseOver = true; end end function ISNewsUpdate:update() ISPanelJoypad.update(self) -- local minHeight = self.chatText:getY() + self.chatText:getHeight() + 30 -- if self:getHeight() < minHeight then -- local dh = minHeight - self:getHeight() -- self:setHeight(minHeight) -- self:setY(self:getY() - dh / 2) -- end if self.alwaysOnTop then self:bringToTop(); end end --************************************************************************-- --** ISNewsUpdate:new --** --************************************************************************-- function ISNewsUpdate:new(x, y, width, height, yesno, target, onclick, player, param1, param2) local o = {} o = ISPanelJoypad:new(x, y, width, height); setmetatable(o, self) self.__index = self local playerObj = player and getSpecificPlayer(player) or nil o.name = nil; o.backgroundColor = {r=0, g=0, b=0, a=0.5}; o.borderColor = {r=0.4, g=0.4, b=0.4, a=1}; o.width = width; o.height = height; o.anchorLeft = true; o.anchorRight = true; o.anchorTop = true; o.anchorBottom = true; o.yesno = yesno; o.target = target; o.onclick = onclick; o.yes = nil; o.player = player; o.no = nil; o.ok = nil; o.param1 = param1; o.param2 = param2; o.destroyOnClick = false; return o; end