From 23bc34933b8ee3c56fd978320f177e2d1944f089 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Fri, 1 Oct 2010 16:20:07 +0000 Subject: [PATCH] list git-svn-id: http://svn.net-core.org/repos/t-engine4@1350 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engines/default/engine/ui/Dialog.lua | 9 +- game/engines/default/engine/ui/List.lua | 93 ++++++++++++------- .../default/special/mainmenu/class/TestUI.lua | 10 +- 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/game/engines/default/engine/ui/Dialog.lua b/game/engines/default/engine/ui/Dialog.lua index 2abed07472..9372ffe8e5 100644 --- a/game/engines/default/engine/ui/Dialog.lua +++ b/game/engines/default/engine/ui/Dialog.lua @@ -47,7 +47,8 @@ function _M:resize(w, h, x, y, alpha) self.w, self.h = math.floor(w), math.floor(h) self.display_x = math.floor(x or (gamew - self.w) / 2) self.display_y = math.floor(y or (gameh - self.h) / 2) - self.iw, self.ih = w - 2 * 5, h - 8 - 16 - 3 + self.ix, self.iy = 5, 22 + 3 + self.iw, self.ih = w - 2 * 5, h - 8 - 22 - 3 self:generate() end @@ -105,11 +106,11 @@ function _M:loadUI(t) for i, ui in ipairs(t) do self.uis[#self.uis+1] = ui - local ux, uy = 0, 0 + local ux, uy = self.ix, self.iy if ui.top then uy = uy + ui.top - elseif ui.bottom then uy = uy + self.h - ui.bottom - ui.ui.h end + elseif ui.bottom then uy = uy + self.ih - ui.bottom - ui.ui.h end if ui.left then ux = ux + ui.left - elseif ui.right then ux = ux + self.w - ui.right - ui.ui.w end + elseif ui.right then ux = ux + self.iw - ui.right - ui.ui.w end ui.x = ux ui.y = uy ui.ui.mouse.delegate_offset_x = ux diff --git a/game/engines/default/engine/ui/List.lua b/game/engines/default/engine/ui/List.lua index 7436ec7753..e8da5b6507 100644 --- a/game/engines/default/engine/ui/List.lua +++ b/game/engines/default/engine/ui/List.lua @@ -25,51 +25,80 @@ local Focusable = require "engine.ui.Focusable" module(..., package.seeall, class.inherit(Base, Focusable)) function _M:init(t) - self.text = assert(t.text, "no button text") - self.fct = assert(t.fct, "no button fct") + self.list = assert(t.list, "no list list") + self.w = assert(t.width, "no list width") + self.h = assert(t.height, "no list height") + self.fct = t.fct + self.display_prop = t.display_prop or "name" Base.init(self, t) end function _M:generate() - local ls, ls_w, ls_h = self:getImage("ui/button-left-sel.png") - local ms, ms_w, ms_h = self:getImage("ui/button-middle-sel.png") - local rs, rs_w, rs_h = self:getImage("ui/button-right-sel.png") - local l, l_w, l_h = self:getImage("ui/button-left.png") - local m, m_w, m_h = self:getImage("ui/button-middle.png") - local r, r_w, r_h = self:getImage("ui/button-right.png") + self.sel = 1 + self.scroll = 1 + self.max = #self.list - -- Draw UI - self.font:setStyle("bold") - local w, h = self.font:size(self.text:removeColorCodes()) - local fw, fh = w + ls_w + rs_w, ls_h - local ss = core.display.newSurface(fw, fh) - local s = core.display.newSurface(fw, fh) + local ls, ls_w, ls_h = self:getImage("ui/selection-left-sel.png") + local ms, ms_w, ms_h = self:getImage("ui/selection-middle-sel.png") + local rs, rs_w, rs_h = self:getImage("ui/selection-right-sel.png") +-- local l, l_w, l_h = self:getImage("ui/button-left.png") +-- local m, m_w, m_h = self:getImage("ui/button-middle.png") +-- local r, r_w, r_h = self:getImage("ui/button-right.png") - ss:merge(ls, 0, 0) - for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end - ss:merge(rs, fw - rs_w, 0) - ss:drawColorStringBlended(self.font, self.text, ls_w, (fh - h) / 2, 255, 255, 255) + -- Draw the list items + local fw, fh = self.w, ls_h + self.fw, self.fh = fw, fh - s:merge(l, 0, 0) - for i = l_w, fw - r_w do s:merge(m, i, 0) end - s:merge(r, fw - r_w, 0) - s:drawColorStringBlended(self.font, self.text, ls_w, (fh - h) / 2, 255, 255, 255) - self.font:setStyle("normal") + self.max_display = math.floor(self.h / fh) + + for i, item in ipairs(self.list) do + local text = item[self.display_prop] + local ss = core.display.newSurface(fw, fh) + local s = core.display.newSurface(fw, fh) + + ss:merge(ls, 0, 0) + for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end + ss:merge(rs, fw - rs_w, 0) + ss:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + + s:erase(0, 0, 0) +-- s:merge(l, 0, 0) +-- for i = l_w, fw - r_w do s:merge(m, i, 0) end +-- s:merge(r, fw - r_w, 0) + s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + + item._tex, item._tex_w, item._tex_h = s:glTexture() + item._stex = ss:glTexture() + end -- Add UI controls - self.mouse:registerZone(0, 0, fw, fh, function(button, x, y, xrel, yrel, bx, by, event) if button == "left" and event == "button" then self.fct() end end) - self.key:addBind("ACCEPT", function() self.fct() end) + self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event) + self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) + if button == "left" and event == "button" then self:onUse() end + end) + self.key:addBinds{ + ACCEPT = function() self:onUse() end, + MOVE_UP = function() self.sel = util.boundWrap(self.sel - 1, 1, self.max) self.scroll = util.scroll(self.sel, self.scroll, self.max_display) end, + MOVE_DOWN = function() self.sel = util.boundWrap(self.sel + 1, 1, self.max) self.scroll = util.scroll(self.sel, self.scroll, self.max_display) end, + } +end - self.tex, self.tex_w, self.tex_h = s:glTexture() - self.stex = ss:glTexture() - self.w, self.h = fw, fh +function _M:onUse() + local item = self.list[self.sel] + if not item then return end + if item.fct then item:fct() + else self.fct(item) end end function _M:display(x, y) - if self.focused then - self.stex:toScreenFull(x, y, self.w, self.h, self.tex_w, self.tex_h) - else - self.tex:toScreenFull(x, y, self.w, self.h, self.tex_w, self.tex_h) + for i = 1, self.max do + local item = self.list[i] + if self.sel == i then + item._stex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + else + item._tex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + end + y = y + self.fh end end diff --git a/game/engines/default/special/mainmenu/class/TestUI.lua b/game/engines/default/special/mainmenu/class/TestUI.lua index 6185cb8c7b..5a59977a30 100644 --- a/game/engines/default/special/mainmenu/class/TestUI.lua +++ b/game/engines/default/special/mainmenu/class/TestUI.lua @@ -27,6 +27,7 @@ local Tooltip = require "engine.Tooltip" local ButtonList = require "engine.ButtonList" local DownloadDialog = require "engine.dialogs.DownloadDialog" +local List = require "engine.ui.List" local Button = require "engine.ui.Button" local Dialog = require "engine.ui.Dialog" @@ -39,9 +40,16 @@ function _M:init() local b1 = Button.new{text="Ok", fct=function() print"OK" end} local b2 = Button.new{text="Cancel", fct=function() print"KO" end} + local list = List.new{width=200, height=200, list={ + {name="toto"}, + {name="tutu"}, + {name="plopzor #GOLD#Robe of the Archmage#WHITE#!"}, + {name="MOUHAHAHAHAH!"}, + }, fct=function(item) print(item.name) end} - local d = Dialog.new("plop", 400, 300) + local d = Dialog.new("Test UI", 400, 300) d:loadUI{ + {left=0, top=0, ui=list}, {left=10, bottom=10, ui=b1}, {right=10, bottom=10, ui=b2}, } -- GitLab