diff --git a/modules/client_skins/skins/default.lua b/modules/client_skins/skins/default.lua index 163307cc..29eeb69c 100644 --- a/modules/client_skins/skins/default.lua +++ b/modules/client_skins/skins/default.lua @@ -28,7 +28,8 @@ local skin = { 'splitters.otui', 'miniwindow.otui', 'items.otui', - 'creatures.otui' + 'creatures.otui', + 'tables.otui' }, particles = { diff --git a/modules/client_skins/skins/default/styles/tables.otui b/modules/client_skins/skins/default/styles/tables.otui new file mode 100644 index 00000000..e1b3207e --- /dev/null +++ b/modules/client_skins/skins/default/styles/tables.otui @@ -0,0 +1,9 @@ +Table < UITable + layout: verticalBox + +TableRow < UIScrollArea + layout: horizontalBox + height: 10 + +TableColumn < UIScrollArea + width: 30 diff --git a/modules/corelib/ui/uitable.lua b/modules/corelib/ui/uitable.lua new file mode 100644 index 00000000..af640326 --- /dev/null +++ b/modules/corelib/ui/uitable.lua @@ -0,0 +1,86 @@ +-- @docclass +UITable = extends(UIScrollArea) + +function UITable.create() + local table = UITable.internalCreate() + table.rows = {} + table.rows.columns = {} + table.rowStyle = {} + table.columStyle = {} + return table +end + +function UITable:destroy() + for k,row in pairs(self.rows) do + row.onClick = nil + end + self.rows = {} +end + +function UITable:onStyleApply(styleName, styleNode) + UIScrollArea.onStyleApply(self, styleName, styleNode) + for name, value in pairs(styleNode) do + if name == 'column-style' then + addEvent(function() + self:setRowStyle(self:getParent():getChildById(value)) + end) + elseif name == 'row-style' then + addEvent(function() + self:setRowStyle(self:getParent():getChildById(value)) + end) + end + end +end + +function UITable:addRow(columns, rowStyle, columStyle) + local row = g_ui.createWidget(rowStyle, self) + row.columns = {} + + for k, data in pairs(columns) do + local col = g_ui.createWidget(columStyle, row) + col:setText(data) + table.insert(row.columns, col) + end + row.onClick = function(row) self:selectRow(row) end + table.insert(self.rows, row) + return row +end + +function UITable:removeRow(row) + if self.selectedRow == row then + self:selectRow(nil) + end + row.onClick = nil + table.removevalue(self.rows, row) +end + +function UITable:selectRow(selectedRow) + if selectedRow == self.selectedRow then return end + + local previousSelectedRow = self.selectedRow + self.selectedRow = selectedRow + + if previousSelectedRow then + previousSelectedRow:setChecked(false) + end + + if selectedRow then + selectedRow:setChecked(true) + end + + signalcall(self.onSelectionChange, self, selectedRow, previousSelectedRow) +end + +function UITable:setRowStyle(style) + self.rowStyle = style + for k, row in pairs(self.rows) do + row:setStyle(style) + end +end + +function UITable:setColumnStyle(style) + self.columStyle = style + for k, col in pairs(self.rows.columns) do + col:setStyle(style) + end +end \ No newline at end of file diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index c28b729d..33dffef6 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -62,15 +62,15 @@ local function initMarketItems() -- populate all market items marketItems = {} local types = g_things.findThingTypeByAttr(ThingAttrMarket) - for idx = 1, #types do - local t = types[idx] + for i = 1, #types do + local t = types[i] local newItem = Item.create(t:getId()) if newItem then local item = { ptr = newItem, marketData = t:getMarketData() } - table.insert(marketItems, item) + marketItems[#marketItems+1] = item end end end @@ -92,7 +92,8 @@ local function updateItemsWidget() end radioItemSet = UIRadioGroup.create() - for _, item in pairs(currentItems) do + for i = 1, #currentItems do + local item = currentItems[i] local itemBox = g_ui.createWidget('MarketItemBox', itemsPanel) local itemWidget = itemBox:getChildById('item') @@ -108,7 +109,8 @@ end local function loadDepotItems(depotItems) information.depotItems = {} - for _, data in pairs(depotItems) do + for i = 1, #depotItems do + local data = depotItems[i] local item = Item.create(data[1]) if not item then break @@ -229,8 +231,9 @@ function Market.loadMarketItems(_category) end currentItems = {} - for _, item in pairs(marketItems) do + for i = 1, #marketItems do -- filter items here + local item = marketItems[i] local category = item.marketData.category if category == _category or _category == MarketCategory[0] then table.insert(currentItems, item) @@ -244,20 +247,32 @@ function Market.updateOffers(offers) marketOffers[MarketAction.Buy] = {} marketOffers[MarketAction.Sell] = {} - local buyOfferList = marketWindow:recursiveGetChildById('buyingList') - buyOfferList:destroyChildren() + local buyOfferTable = marketWindow:recursiveGetChildById('buyingTable') + buyOfferTable:destroyChildren() - local sellOfferList = marketWindow:recursiveGetChildById('sellingList') - sellOfferList:destroyChildren() + local sellOfferTable = marketWindow:recursiveGetChildById('sellingTable') + sellOfferTable:destroyChildren() for k, offer in pairs(offers) do if offer and offer:getAction() == MarketAction.Buy then - local label = g_ui.createWidget('OfferListLabel', buyOfferList) - label:setText(offer:getPlayer()..' '..offer:getAmount()..' '..(offer:getPrice()*offer:getAmount())..' '..offer:getPrice()..' '..offer:getTimeStamp()) + local data = { + offer:getPlayer(), + offer:getAmount(), + offer:getPrice()*offer:getAmount(), + offer:getPrice(), + offer:getTimeStamp() + } + local row = buyOfferTable:addRow(data, 'OfferTableRow', 'OfferTableColumn') table.insert(marketOffers[MarketAction.Buy], offer) else - local label = g_ui.createWidget('OfferListLabel', sellOfferList) - label:setText(offer:getPlayer()..' '..offer:getAmount()..' '..(offer:getPrice()*offer:getAmount())..' '..offer:getPrice()..' '..offer:getTimeStamp()) + local data = { + offer:getPlayer(), + offer:getAmount(), + offer:getPrice()*offer:getAmount(), + offer:getPrice(), + offer:getTimeStamp() + } + local row = sellOfferTable:addRow(data, 'OfferTableRow', 'OfferTableColumn') table.insert(marketOffers[MarketAction.Sell], offer) end end diff --git a/modules/game_market/ui/marketoffers/itemoffers.otui b/modules/game_market/ui/marketoffers/itemoffers.otui index 94f143d3..9606f1ab 100644 --- a/modules/game_market/ui/marketoffers/itemoffers.otui +++ b/modules/game_market/ui/marketoffers/itemoffers.otui @@ -1,14 +1,22 @@ -OfferListLabel < Label +OfferTableRow < TableRow font: verdana-11px-monochrome background-color: alpha text-offset: 2 0 focusable: true color: #cccccc + height: 25 $focus: background-color: #294f6d color: #ffffff +OfferTableColumn < TableColumn + font: verdana-11px-monochrome + background-color: alpha + text-offset: 2 0 + color: #cccccc + width: 80 + Panel background-color: #22283399 margin: 1 @@ -28,8 +36,8 @@ Panel margin-top: 44 margin-left: 6 - TextList - id: sellingList + Table + id: sellingTable anchors.top: prev.bottom anchors.left: prev.left anchors.right: parent.right @@ -39,10 +47,13 @@ Panel margin-right: 6 padding: 1 focusable: false - vertical-scrollbar: sellingListScrollBar + background-color: #222833 + border-width: 1 + border-color: #191f27 + vertical-scrollbar: sellingTableScrollBar VerticalScrollBar - id: sellingListScrollBar + id: sellingTableScrollBar anchors.top: prev.top anchors.bottom: prev.bottom anchors.right: prev.right @@ -65,8 +76,8 @@ Panel margin-top: 9 margin-left: 6 - TextList - id: buyingList + Table + id: buyingTable anchors.top: prev.bottom anchors.left: prev.left anchors.right: parent.right @@ -76,10 +87,13 @@ Panel height: 120 padding: 1 focusable: false - vertical-scrollbar: buyingListScrollBar + background-color: #222833 + border-width: 1 + border-color: #191f27 + vertical-scrollbar: buyingTableScrollBar VerticalScrollBar - id: buyingListScrollBar + id: buyingTableScrollBar anchors.top: prev.top anchors.bottom: prev.bottom anchors.right: prev.right diff --git a/modules/game_outfit/outfit.lua b/modules/game_outfit/outfit.lua index 02273045..96de56ae 100644 --- a/modules/game_outfit/outfit.lua +++ b/modules/game_outfit/outfit.lua @@ -111,9 +111,10 @@ local function updateOutfit() end outfit.addons = 0 - for k, addon in pairs(prevAddons) do - if addon and addons[k].widget:isEnabled() then - addons[k].widget:setChecked(true) + for i = 1, #prevAddons do + local addon = prevAddons[i] + if addon and addons[i].widget:isEnabled() then + addons[i].widget:setChecked(true) end end @@ -185,7 +186,7 @@ function Outfit.create(creatureOutfit, outfitList, creatureMount, mountList) [3] = {widget = outfitWindow:getChildById('addon3'), value = 4} } - for k, addon in pairs(addons) do + for _, addon in pairs(addons) do addon.widget.onCheckChange = function(self) onAddonCheckChange(self, addon.value) end end @@ -216,7 +217,7 @@ function Outfit.create(creatureOutfit, outfitList, creatureMount, mountList) colorBox:setChecked(true) end colorBox.onCheckChange = onColorCheckChange - table.insert(colorBoxes, colorBox) + colorBoxes[#colorBoxes+1] = colorBox end end @@ -260,10 +261,10 @@ function Outfit.randomize() outfitWindow:getChildById('detail') } - for k, section in pairs(outfitTemplate) do - section:setChecked(true) + for i = 1, #outfitTemplate do + outfitTemplate[i]:setChecked(true) colorBoxes[math.random(1, #colorBoxes)]:setChecked(true) - section:setChecked(false) + outfitTemplate[i]:setChecked(false) end outfitTemplate[1]:setChecked(true) end