From 0a3991aeb6da32676897f57ef624eb54026a3895 Mon Sep 17 00:00:00 2001 From: Alexander Sedov <alex0player@gmail.com> Date: Sat, 24 Jan 2015 02:26:19 +0300 Subject: [PATCH] Loads of easy changes #1 --- game/engines/default/engine/ui/Base.lua | 1 + game/engines/default/engine/ui/Button.lua | 12 ++++---- game/engines/default/engine/ui/Checkbox.lua | 22 +++++++------- game/engines/default/engine/ui/Dialog.lua | 14 +++------ game/engines/default/engine/ui/Textbox.lua | 33 ++++++++------------- 5 files changed, 33 insertions(+), 49 deletions(-) diff --git a/game/engines/default/engine/ui/Base.lua b/game/engines/default/engine/ui/Base.lua index 8d03d9ebb1..d2e85dcb4d 100644 --- a/game/engines/default/engine/ui/Base.lua +++ b/game/engines/default/engine/ui/Base.lua @@ -122,6 +122,7 @@ end function _M:drawFontLine(font, text, width) -- always draw with white, outputting texture can have it changed local cached = table.getTable(fcache, font, font:getStyle()) if cached[text] then return cached[text] end + width = width or font:size(text) local tex = font:draw(text, width, 255, 255, 255, true)[1] local r = {t = tex._tex, w=tex.w, h=tex.h, tw=tex._tex_w, th=tex._tex_h} cached[text] = r diff --git a/game/engines/default/engine/ui/Button.lua b/game/engines/default/engine/ui/Button.lua index 11b7daa687..a2a66debb8 100644 --- a/game/engines/default/engine/ui/Button.lua +++ b/game/engines/default/engine/ui/Button.lua @@ -52,9 +52,7 @@ function _M:generate() if self.force_w then w = self.force_w end self.w, self.h = w - frame_ox1 + frame_ox2, h - frame_oy1 + frame_oy2 - local s = core.display.newSurface(w, h) - s:drawColorStringBlended(self.font, self.text, 0, 0, 255, 255, 255, true) - self.tex = {s:glTexture()} + self.tex = self:drawFontLine(self.font, self.text, w) self.font:setStyle("normal") -- Add UI controls @@ -94,8 +92,8 @@ function _M:display(x, y, nb_keyframes, ox, oy) else self:drawFrame(self.frame_sel, x, y) end - if self.text_shadow then self.tex[1]:toScreenFull(x-frame_ox1+1, y-frame_oy1+1, self.rw, self.rh, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end - self.tex[1]:toScreenFull(x-frame_ox1, y-frame_oy1, self.rw, self.rh, self.tex[2], self.tex[3]) + if self.text_shadow then self:textureToScreen(self.tex, x-frame_ox1+1, y-frame_oy1+1, 0, 0, 0, self.text_shadow) end + self:textureToScreen(self.tex, x-frame_ox1, y-frame_oy1) else if self.glow then local v = self.glow + (1 - self.glow) * (1 + math.cos(core.game.getTime() / 300)) / 2 @@ -109,7 +107,7 @@ function _M:display(x, y, nb_keyframes, ox, oy) self.focus_decay = self.focus_decay - nb_keyframes if self.focus_decay <= 0 then self.focus_decay = nil end end - if self.text_shadow then self.tex[1]:toScreenFull(x-frame_ox1+1, y-frame_oy1+1, self.rw, self.rh, self.tex[2], self.tex[3], 0, 0, 0, self.alpha_unfocus * self.text_shadow) end - self.tex[1]:toScreenFull(x-frame_ox1, y-frame_oy1, self.rw, self.rh, self.tex[2], self.tex[3], 1, 1, 1, self.alpha_unfocus) + if self.text_shadow then self:textureToScreen(self.tex, x-frame_ox1+1, y-frame_oy1+1, 0, 0, 0, self.alpha_unfocus * self.text_shadow) end + self:textureToScreen(self.tex, x-frame_ox1, y-frame_oy1, 1, 1, 1, self.alpha_unfocus) end end diff --git a/game/engines/default/engine/ui/Checkbox.lua b/game/engines/default/engine/ui/Checkbox.lua index ea27fe5a60..8efcf1e938 100644 --- a/game/engines/default/engine/ui/Checkbox.lua +++ b/game/engines/default/engine/ui/Checkbox.lua @@ -43,12 +43,10 @@ function _M:generate() self.tick = self:getUITexture("ui/checkbox-ok.png") -- Draw UI - self.title_w, self.title_h = self.font:size(self.title) - self.w, self.h = self.title_w + self.check.w, math.max(self.font_h, self.check.h) + self.tex = self:drawFontLine(self.font, self.title) + self.w, self.h = self.tex.w + self.check.w, math.max(self.font_h, self.check.h) + - local s = core.display.newSurface(self.title_w, self.title_h) - s:drawColorStringBlended(self.font, self.title, 0, 0, 255, 255, 255, true) - self.tex = {s:glTexture()} -- Add UI controls self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event) @@ -70,8 +68,8 @@ end function _M:display(x, y, nb_keyframes) if self.check_first then - if self.text_shadow then self.tex[1]:toScreenFull(x+1 + self.check.w, y+1 + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end - self.tex[1]:toScreenFull(x + self.check.w, y + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3]) + if self.text_shadow then self:textureToScreen(self.tex, x+1 + self.check.w, y+1 + (self.h - self.tex.h) / 2, 0, 0, 0, self.text_shadow) end + self:textureToScreen(self.tex, x + self.check.w, y + (self.h - self.tex.h) / 2) if self.focused then self.check.t:toScreenFull(x, y, self.check.w, self.check.h, self.check.tw, self.check.th) else @@ -81,15 +79,15 @@ function _M:display(x, y, nb_keyframes) self.tick.t:toScreenFull(x, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th) end else - if self.text_shadow then self.tex[1]:toScreenFull(x+1, y+1 + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end - self.tex[1]:toScreenFull(x, y + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3]) + if self.text_shadow then self.tex[1]:toScreenFull(x+1, y+1 + (self.h - self.tex.h) / 2, self.tex.w, self.tex.h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end + self.tex[1]:toScreenFull(x, y + (self.h - self.tex.h) / 2, self.tex.w, self.tex.h, self.tex[2], self.tex[3]) if self.focused then - self.check.t:toScreenFull(x + self.title_w, y, self.check.w, self.check.h, self.check.tw, self.check.th) + self.check.t:toScreenFull(x + self.tex.w, y, self.check.w, self.check.h, self.check.tw, self.check.th) else - self.check.t:toScreenFull(x + self.title_w, y, self.check.w, self.check.h, self.check.tw, self.check.th) + self.check.t:toScreenFull(x + self.tex.w, y, self.check.w, self.check.h, self.check.tw, self.check.th) end if self.checked then - self.tick.t:toScreenFull(x + self.title_w, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th) + self.tick.t:toScreenFull(x + self.tex.w, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th) end end end diff --git a/game/engines/default/engine/ui/Dialog.lua b/game/engines/default/engine/ui/Dialog.lua index a72ef1974d..9362e9f991 100644 --- a/game/engines/default/engine/ui/Dialog.lua +++ b/game/engines/default/engine/ui/Dialog.lua @@ -356,14 +356,8 @@ function _M:updateTitle(title) local title = title if type(title)=="function" then title = title() end self.font_bold:setStyle("bold") - local tw, th = self.font_bold:size(title) - local s = core.display.newSurface(tw, th) - s:erase(0, 0, 0, 0) - s:drawColorStringBlended(self.font_bold, title, 0, 0, self.color.r, self.color.g, self.color.b, true) + self.title_tex = self:drawFontLine(self.font_bold, title) self.font_bold:setStyle("normal") - self.title_tex = {s:glTexture()} - self.title_tex.w = tw - self.title_tex.h = th end function _M:loadUI(t) @@ -743,12 +737,12 @@ function _M:toScreen(x, y, nb_keyframes) if shader then shader:use(true) shader:uniOutlineSize(self.shadow_power, self.shadow_power) - shader:uniTextSize(self.title_tex[2], self.title_tex[3]) + shader:uniTextSize(self.title_tex.tw, self.title_tex.th) else - self.title_tex[1]:toScreenFull(x + (self.w - self.title_tex.w) / 2 + 3 + self.frame.title_x, y + 3 + self.frame.title_y, self.title_tex.w, self.title_tex.h, self.title_tex[2], self.title_tex[3], 0, 0, 0, 0.5) + self:textureToScreen(self.title_tex, x + (self.w - self.title_tex.w) / 2 + 3 + self.frame.title_x, y + 3 + self.frame.title_y, 0, 0, 0, 0.5) end end - self.title_tex[1]:toScreenFull(x + (self.w - self.title_tex.w) / 2 + self.frame.title_x, y + self.frame.title_y, self.title_tex.w, self.title_tex.h, self.title_tex[2], self.title_tex[3]) + self:textureToScreen(self.title_tex, x + (self.w - self.title_tex.w) / 2 + self.frame.title_x, y + self.frame.title_y) if self.title_shadow and shader then shader:use(false) end end diff --git a/game/engines/default/engine/ui/Textbox.lua b/game/engines/default/engine/ui/Textbox.lua index b7fcd09482..0619aff6c6 100644 --- a/game/engines/default/engine/ui/Textbox.lua +++ b/game/engines/default/engine/ui/Textbox.lua @@ -71,15 +71,10 @@ function _M:generate() self.text_y = (h - fh) / 2 self.cursor_y = (h - self.texcursor.h) / 2 self.max_display = math.floor(fw / self.font_mono_w) - self.text_surf = core.display.newSurface(fw, fh) - self.text_tex, self.text_tex_w, self.text_tex_h = self.text_surf:glTexture() self:updateText() if title_w > 0 then - local s = core.display.newSurface(title_w, h) - s:erase(0, 0, 0, 0) - s:drawColorStringBlended(self.font, self.title, 0, (h - fh) / 2, 255, 255, 255, true) - self.tex, self.tex_w, self.tex_h = s:glTexture() + self.tex = self:drawFontLine(self.font, self.title, title_w) end -- Add UI controls @@ -162,28 +157,26 @@ end function _M:updateText() if not self.tmp[1] then self.tmp = {} end self.text = table.concat(self.tmp) - local text = "" - for i = self.scroll, self.scroll + self.max_display - 1 do - if not self.tmp[i] then break end - if not self.hide then text = text .. self.tmp[i] - else text = text .. "*" end - end + local text + local b, e = self.scroll, math.min(self.scroll + self.max_display - 1, #self.tmp) + if not self.hide then text = table.concat(self.tmp, nil, b, e) + else text = string.rep("*", e - b + 1) end + + self.text_tex = self:drawFontLine(self.font_mono, text, self.fw) - self.text_surf:erase(0, 0, 0, 0) - self.text_surf:drawStringBlended(self.font_mono, text, 0, 0, 255, 255, 255, true) - self.text_surf:updateTexture(self.text_tex) if self.on_change and self.old_text ~= self.text then self.on_change(self.text) end self.old_text = self.text end function _M:display(x, y, nb_keyframes) + local text_x, text_y = self.text_x, self.text_y if self.tex then - if self.text_shadow then self.tex:toScreenFull(x+1, y+1, self.title_w, self.h, self.tex_w, self.tex_h, 0, 0, 0, self.text_shadow) end - self.tex:toScreenFull(x, y, self.title_w, self.h, self.tex_w, self.tex_h) + if self.text_shadow then self:textureToScreen(self.tex, x+1, y+text_y+1, 0, 0, 0, self.text_shadow) end + self:textureToScreen(self.tex, x, y+text_y) end if self.focused then self:drawFrame(self.frame_sel, x + self.title_w, y) - self.texcursor.t:toScreenFull(x + self.text_x + (self.cursor-self.scroll) * self.font_mono_w - (self.texcursor.w / 2), y + self.cursor_y, self.texcursor.w, self.texcursor.h, self.texcursor.tw, self.texcursor.th) + self:textureToScreen(self.texcursor, x + self.text_x + (self.cursor-self.scroll) * self.font_mono_w - (self.texcursor.w / 2), y + self.cursor_y) else self:drawFrame(self.frame, x + self.title_w, y) if self.focus_decay then @@ -192,6 +185,6 @@ function _M:display(x, y, nb_keyframes) if self.focus_decay <= 0 then self.focus_decay = nil end end end - if self.text_shadow then self.text_tex:toScreenFull(x+1 + self.text_x, y+1 + self.text_y, self.fw, self.fh, self.text_tex_w, self.text_tex_h, 0, 0, 0, self.text_shadow) end - self.text_tex:toScreenFull(x + self.text_x, y + self.text_y, self.fw, self.fh, self.text_tex_w, self.text_tex_h) + if self.text_shadow then self:textureToScreen(self.text_tex, x+1 + self.text_x, y+1 + self.text_y, 0, 0, 0, self.text_shadow) end + self:textureToScreen(self.text_tex, x+1 + self.text_x, y+1 + self.text_y) end -- GitLab