diff --git a/game/engines/default/engine/dialogs/ShowStore.lua b/game/engines/default/engine/dialogs/ShowStore.lua index 14683f56a1b93eecd260033e18f142c0f56962dc..99f4b9b6d8e89d87e024be745671281f226ea883 100644 --- a/game/engines/default/engine/dialogs/ShowStore.lua +++ b/game/engines/default/engine/dialogs/ShowStore.lua @@ -35,7 +35,7 @@ function _M:init(title, store_inven, actor_inven, store_filter, actor_filter, ac self.actor_filter = actor_filter Dialog.init(self, title or "Store", game.w * 0.8, game.h * 0.8) - self:generateList() + self:maxH() self.c_desc = TextzoneList.new{width=self.iw, height=self.max_h*self.font_h, no_color_bleed=true} @@ -44,14 +44,16 @@ function _M:init(title, store_inven, actor_inven, store_filter, actor_filter, ac {name="Inventory", width=72, display_prop="name", sort="name"}, {name="Category", width=20, display_prop="cat", sort="cat"}, {name="Price", width=8, display_prop="cost", sort="cost"}, - }, list=self.actor_list, fct=function(item, sel) self:use(item) end, select=function(item, sel) self:select(item) end} + }, list={}, fct=function(item, sel) self:use(item) end, select=function(item, sel) self:select(item) end} self.c_store = ListColumns.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.max_h*self.font_h - 10, sortable=true, scrollbar=true, columns={ {name="", width={20,"fixed"}, display_prop="char", sort="id"}, {name="Store", width=72, display_prop="name"}, {name="Category", width=20, display_prop="cat"}, {name="Price", width=8, display_prop="cost", sort="cost"}, - }, list=self.store_list, fct=function(item) self:use(item) end, select=function(item, sel) self:select(item) end} + }, list={}, fct=function(item) self:use(item) end, select=function(item, sel) self:select(item) end} + + self:generateList() self:loadUI{ {left=0, top=0, ui=self.c_store}, @@ -93,10 +95,24 @@ function _M:use(item) if item and item.object then if self.focus_ui and self.focus_ui.ui == self.c_store then self.action("buy", item.object, item.item) - self:updateStore() +-- self:updateStore() else self.action("sell", item.object, item.item) - self:updateStore() +-- self:updateStore() + end + end +end + +function _M:maxH() + self.max_h = 0 + for item, o in ipairs(self.store_inven) do + if not self.store_filter or self.store_filter(o) then + self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font)) + end + end + for item, o in ipairs(self.actor_inven) do + if not self.actor_filter or self.actor_filter(o) then + self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font)) end end end @@ -106,12 +122,10 @@ function _M:generateList() local list = {} list.chars = {} local i = 1 - self.max_h = 0 for item, o in ipairs(self.store_inven) do if not self.store_filter or self.store_filter(o) then local char = self:makeKeyChar(i) list[#list+1] = { id=#list+1, char=char, name=o:getDisplayString()..o:getName(), color=o:getDisplayColor(), object=o, item=item, cat=o.subtype, cost=o.cost, desc=o:getDesc() } - self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font)) list.chars[char] = #list i = i + 1 end @@ -126,17 +140,12 @@ function _M:generateList() if not self.actor_filter or self.actor_filter(o) then local char = self:makeKeyChar(i) list[#list+1] = { id=#list+1, char=char, name=o:getDisplayString()..o:getName(), color=o:getDisplayColor(), object=o, item=item, cat=o.subtype, cost=o.cost, desc=o:getDesc() } - self.max_h = math.max(self.max_h, #o:getDesc():splitLines(self.iw - 10, self.font)) list.chars[char] = #list i = i + 1 end end self.actor_list = list - if self.c_inven then - self.c_inven.list = self.actor_list - self.c_store.list = self.store_list - self.c_inven:generate() - self.c_store:generate() - end + self.c_inven:setList(self.actor_list) + self.c_store:setList(self.store_list) end diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua index baa255787ac34ca77e08b0e0e11a6d8e7c25b9ae..f03d9415454237e5016e8aef4a7805bce2b5fe7e 100644 --- a/game/engines/default/engine/ui/ListColumns.lua +++ b/game/engines/default/engine/ui/ListColumns.lua @@ -60,6 +60,52 @@ function _M:init(t) Base.init(self, t) end +local ls, ls_w, ls_h = _M:getImage("ui/selection-left-sel.png") +local ms, ms_w, ms_h = _M:getImage("ui/selection-middle-sel.png") +local rs, rs_w, rs_h = _M:getImage("ui/selection-right-sel.png") +local l, l_w, l_h = _M:getImage("ui/selection-left.png") +local m, m_w, m_h = _M:getImage("ui/selection-middle.png") +local r, r_w, r_h = _M:getImage("ui/selection-right.png") + +local cls, cls_w, cls_h = _M:getImage("ui/selection-left-column-sel.png") +local cms, cms_w, cms_h = _M:getImage("ui/selection-middle-column-sel.png") +local crs, crs_w, crs_h = _M:getImage("ui/selection-right-column-sel.png") +local cl, cl_w, cl_h = _M:getImage("ui/selection-left-column.png") +local cm, cm_w, cm_h = _M:getImage("ui/selection-middle-column.png") +local cr, cr_w, cr_h = _M:getImage("ui/selection-right-column.png") + +function _M:drawItem(item) + for j, col in ipairs(self.columns) do + local fw, fh = col.fw, self.fh + + local text = tostring(util.getval(item[col.display_prop or col.sort], item)) + local color = item.color or {255,255,255} + local ss = core.display.newSurface(fw, fh) + local sus = 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, color[1], color[2], color[3], nil, fw - ls_w - rs_w) + + s:erase(0, 0, 0) + s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w) + + sus:merge(l, 0, 0) + for i = l_w, fw - r_w do sus:merge(m, i, 0) end + sus:merge(r, fw - r_w, 0) + sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w) + + item._tex = item._tex or {} + item._stex = item._stex or {} + item._sustex = item._sustex or {} + item._tex[j] = {s:glTexture()} + item._stex[j] = {ss:glTexture()} + item._sustex[j] = {sus:glTexture()} + end +end + function _M:generate() self.mouse:reset() self.key:reset() @@ -69,21 +115,6 @@ function _M:generate() self.max = #self.list self:selectColumn(1, true) - 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/selection-left.png") - local m, m_w, m_h = self:getImage("ui/selection-middle.png") - local r, r_w, r_h = self:getImage("ui/selection-right.png") - - local cls, cls_w, cls_h = self:getImage("ui/selection-left-column-sel.png") - local cms, cms_w, cms_h = self:getImage("ui/selection-middle-column-sel.png") - local crs, crs_w, crs_h = self:getImage("ui/selection-right-column-sel.png") - local cl, cl_w, cl_h = self:getImage("ui/selection-left-column.png") - local cm, cm_w, cm_h = self:getImage("ui/selection-middle-column.png") - local cr, cr_w, cr_h = self:getImage("ui/selection-right-column.png") - - local fh = ls_h self.fh = fh @@ -127,41 +158,15 @@ function _M:generate() col._tex, col._tex_w, col._tex_h = s:glTexture() col._stex = ss:glTexture() - -- Draw the list items - for i, item in ipairs(self.list) do - local text = tostring(util.getval(item[col.display_prop or col.sort], item)) - local color = item.color or {255,255,255} - local ss = core.display.newSurface(fw, fh) - local sus = 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, color[1], color[2], color[3], nil, fw - ls_w - rs_w) - - s:erase(0, 0, 0) - s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w) - - sus:merge(l, 0, 0) - for i = l_w, fw - r_w do sus:merge(m, i, 0) end - sus:merge(r, fw - r_w, 0) - sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, color[1], color[2], color[3], nil, fw - ls_w - rs_w) - - item._tex = item._tex or {} - item._stex = item._stex or {} - item._sustex = item._sustex or {} - item._tex[j] = {s:glTexture()} - item._stex[j] = {ss:glTexture()} - item._sustex[j] = {sus:glTexture()} - end - self.mouse:registerZone(colx, 0, col.width, self.fh, function(button, x, y, xrel, yrel, bx, by, event) if button == "left" and event == "button" then self:selectColumn(j) end end) colx = colx + col.width end + -- Draw the list items + for i, item in ipairs(self.list) do self:drawItem(item) end + -- Add UI controls self.mouse:registerZone(0, self.fh, self.w, self.h - (self.hide_columns and 0 or self.fh), function(button, x, y, xrel, yrel, bx, by, event) if button == "wheelup" and event == "button" then self.scroll = util.bound(self.scroll - 1, 1, self.max - self.max_display + 1) @@ -202,6 +207,17 @@ function _M:generate() self:onSelect() end +function _M:setList(list) + self.list = list + self.max = #self.list + self.sel = util.bound(self.sel, 1, self.max) + self.scroll = util.bound(self.scroll, 1, self.max) + self.scroll = util.scroll(self.sel, self.scroll, self.max_display) + self:selectColumn(1, true) + + for i, item in ipairs(self.list) do self:drawItem(item) end +end + function _M:onSelect() local item = self.list[self.sel] if not item then return end @@ -238,7 +254,6 @@ end function _M:display(x, y) local bx, by = x, y - for j = 1, #self.columns do local col = self.columns[j] local y = y