Skip to content

Commit 864b609

Browse files
committed
Port PoB2 socket position views
1 parent fa39e03 commit 864b609

5 files changed

Lines changed: 89 additions & 23 deletions

File tree

src/Classes/CompareTab.lua

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ local tradeHelpers = LoadModule("Classes/TradeHelpers")
1313
local buySimilar = LoadModule("Classes/CompareBuySimilar")
1414
local calcsHelpers = LoadModule("Classes/CompareCalcsHelpers")
1515
local buildListHelpers = LoadModule("Modules/BuildListHelpers")
16+
local itemSlotHelper = LoadModule("Modules/ItemSlotHelper")
1617
local configVisibility = LoadModule("Modules/ConfigVisibility")
1718

1819
-- Node IDs below this value are normal passive tree nodes; IDs at or above are cluster jewel nodes
@@ -3797,13 +3798,33 @@ function CompareTabClass:DrawItems(vp, compareEntry, inputEvents)
37973798
drawY = drawY + maxH + 6
37983799
else
37993800
-- === COMPACT MODE ===
3801+
local slot = self.primaryBuild.itemsTab.slots[equipSlotName]
3802+
local nodeId = slot and slot.nodeId
3803+
local shouldUnderline = not not nodeId
38003804
local pHover, cHover, b1Hover, b2Hover, b3Hover, b2X, b2Y, b2W, b2H,
38013805
rowHoverItem, rowHoverItemsTab, rowHoverX, rowHoverY, rowHoverW, rowHoverH =
38023806
tradeHelpers.drawCompactSlotRow(drawY, label, pItem, cItem,
38033807
colWidth, cursorX, cursorY, labelW,
38043808
self.primaryBuild.itemsTab, compareEntry.itemsTab, pWarn, cWarn, slotMissing,
3805-
LAYOUT.itemsCopyBtnW, LAYOUT.itemsCopyBtnH, LAYOUT.itemsBuyBtnW, LAYOUT.itemsEquipBtnW, scrollOffsetX)
3806-
3809+
LAYOUT.itemsCopyBtnW, LAYOUT.itemsCopyBtnH, LAYOUT.itemsBuyBtnW, LAYOUT.itemsEquipBtnW, scrollOffsetX,
3810+
shouldUnderline)
3811+
3812+
local labelX = (scrollOffsetX or 0) + 10
3813+
-- draw passive tree view when hovering over the label, if the slot is a jewel socket
3814+
if labelX <= cursorX and cursorX <= (labelX + labelW)
3815+
and drawY < cursorY and cursorY <= (drawY + 20) then
3816+
if nodeId then
3817+
local boxSize = 250
3818+
-- anchor bottom left to label top left, keeping in mind what our viewport was
3819+
SetViewport()
3820+
local boxX = vp.x + labelX
3821+
local boxY = (vp.y + checkboxOffset) + drawY - boxSize
3822+
itemSlotHelper.DrawViewer(self.primaryBuild.itemsTab, nodeId, boxX, boxY, boxSize,
3823+
boxSize)
3824+
-- restore viewport
3825+
SetViewport(vp.x, vp.y + checkboxOffset, vp.width, scrollViewH)
3826+
end
3827+
end
38073828
if rowHoverItem then
38083829
hoverItem = rowHoverItem
38093830
hoverItemsTab = rowHoverItemsTab

src/Classes/ItemSlotControl.lua

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ local pairs = pairs
77
local t_insert = table.insert
88
local m_min = math.min
99

10+
local itemSlotHelper = LoadModule("Modules/ItemSlotHelper")
1011
local ItemSlotClass = newClass("ItemSlotControl", "DropDownControl", function(self, anchor, x, y, itemsTab, slotName, slotLabel, nodeId)
1112
self.DropDownControl(anchor, {x, y, 310, 20}, { }, function(index, value)
1213
if self.items[index] ~= self.selItemId then
@@ -135,30 +136,15 @@ function ItemSlotClass:Draw(viewPort)
135136
self.DropDownControl:Draw(viewPort)
136137
self:DrawControls(viewPort)
137138
if not main.popups[1] and self.nodeId and (self.dropped or (self:IsMouseOver() and (self.otherDragSource or not self.itemsTab.selControl))) then
138-
SetDrawLayer(nil, 15)
139+
local width = 308
140+
local height = 280
139141
local viewerY
140142
if self.DropDownControl.dropUp and self.DropDownControl.dropped then
141143
viewerY = y + 20
142144
else
143-
viewerY = m_min(y - 300 - 5, viewPort.y + viewPort.height - 304)
145+
viewerY = m_min(y - height - 4, viewPort.y + viewPort.height - height)
144146
end
145-
local viewerX = x
146-
SetDrawColor(1, 1, 1)
147-
DrawImage(nil, viewerX, viewerY, 304, 304)
148-
local viewer = self.itemsTab.socketViewer
149-
local node = self.itemsTab.build.spec.nodes[self.nodeId]
150-
viewer.zoom = 5
151-
local scale = self.itemsTab.build.spec.tree.size / 1500
152-
viewer.zoomX = -node.x / scale
153-
viewer.zoomY = -node.y / scale
154-
SetViewport(viewerX + 2, viewerY + 2, 300, 300)
155-
viewer:Draw(self.itemsTab.build, { x = 0, y = 0, width = 300, height = 300 }, { })
156-
SetDrawLayer(nil, 30)
157-
SetDrawColor(1, 1, 1, 0.2)
158-
DrawImage(nil, 149, 0, 2, 300)
159-
DrawImage(nil, 0, 149, 300, 2)
160-
SetViewport()
161-
SetDrawLayer(nil, 0)
147+
itemSlotHelper.DrawViewer(self.itemsTab, self.nodeId, x, viewerY, width, height)
162148
end
163149
end
164150

src/Classes/TradeHelpers.lua

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ local ITEM_BOX_H = 20
443443

444444
function M.drawCompactSlotRow(drawY, slotLabel, pItem, cItem,
445445
colWidth, cursorX, cursorY, maxLabelW, primaryItemsTab, compareItemsTab, pWarn, cWarn, slotMissing,
446-
copyBtnW, copyBtnH, buyBtnW, equipBtnW, xOffset)
446+
copyBtnW, copyBtnH, buyBtnW, equipBtnW, xOffset, shouldUnderlineLabel)
447447

448448
xOffset = xOffset or 0
449449
local pName = pItem and pItem.name or "(empty)"
@@ -473,7 +473,13 @@ function M.drawCompactSlotRow(drawY, slotLabel, pItem, cItem,
473473

474474
-- Draw slot label
475475
SetDrawColor(1, 1, 1)
476-
DrawString(labelX, drawY + 2, "LEFT", 16, "VAR", "^7" .. slotLabel .. ":")
476+
local labelText = "^7" .. slotLabel .. ":"
477+
DrawString(labelX, drawY + 2, "LEFT", 16, "VAR", labelText)
478+
479+
if shouldUnderlineLabel then
480+
local labelW = DrawStringWidth(16, "VAR", labelText)
481+
DrawImage(nil, labelX, drawY + 2 + 16, labelW, 1)
482+
end
477483

478484
-- Draw primary item box
479485
local pBorderGray = pHover and 0.5 or 0.33

src/Classes/TradeQuery.lua

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
local dkjson = require "dkjson"
9+
local itemSlotHelper = LoadModule("Modules/ItemSlotHelper")
910

1011
local get_time = os.time
1112
local t_insert = table.insert
@@ -1007,6 +1008,18 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro
10071008
controls["bestButton"..row_idx].shown = function() return not self.resultTbl[row_idx] end
10081009
controls["bestButton"..row_idx].enabled = function() return self.pbLeague end
10091010
controls["bestButton"..row_idx].tooltipText = "Creates a weighted search to find the highest Stat Value items for this slot."
1011+
controls["bestButton" .. row_idx].onHover = function()
1012+
local button = controls["bestButton" .. row_idx]
1013+
local x, y = button:GetPos()
1014+
local buttonWidth, _ = button:GetSize()
1015+
local nodeId = slotTbl.nodeId
1016+
if not nodeId then return end
1017+
local boxSize = 250
1018+
-- anchor bottom to top of button
1019+
local viewerY = y - boxSize - 4
1020+
local viewerX = x - boxSize / 2 + buttonWidth / 2
1021+
itemSlotHelper.DrawViewer(self.itemsTab, nodeId, viewerX, viewerY, boxSize, boxSize)
1022+
end
10101023
local pbURL
10111024
controls["uri"..row_idx] = new("EditControl", { "TOPLEFT", controls["bestButton"..row_idx], "TOPRIGHT"}, {8, 0, 514, row_height}, nil, nil, "^%C\t\n", nil, function(buf)
10121025
local subpath = buf:match(self.hostName .. "trade/search/(.+)$") or ""

src/Modules/ItemSlotHelper.lua

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
local M = {}
2+
3+
-- Draws a small display window of a jewel socket's position. Note that this will reset the
4+
-- viewport and the draw layer.
5+
---@param nodeId integer
6+
---@param x integer
7+
---@param y integer
8+
---@param w integer
9+
---@param h integer
10+
function M.DrawViewer(itemsTab, nodeId, x, y, w, h)
11+
local node = itemsTab.build.spec.nodes[nodeId]
12+
if not node then return end
13+
SetDrawLayer(nil, 15)
14+
SetDrawColor(1, 1, 1)
15+
16+
local borderWidth = 1
17+
DrawImage(nil, x, y, w + 2 * borderWidth, h + 2 * borderWidth)
18+
19+
local viewer = itemsTab.socketViewer
20+
21+
viewer.zoom = 17
22+
23+
local viewPortSize = math.min(w, h)
24+
local scale = itemsTab.build.spec.tree.size / (viewPortSize * viewer.zoom)
25+
viewer.zoomX = -node.x / scale
26+
viewer.zoomY = -node.y / scale
27+
-- offset viewport to be inside borders
28+
SetViewport(x + borderWidth, y + borderWidth, w, h)
29+
-- draw the actual image
30+
viewer:Draw(itemsTab.build, { x = 0, y = 0, width = w, height = h }, {})
31+
SetDrawLayer(nil, 30)
32+
SetDrawColor(1, 1, 1, 0.2)
33+
-- draw crosshair
34+
DrawImage(nil, math.floor(w / 2) - 1, 0, 2, h)
35+
DrawImage(nil, 0, math.floor(h / 2) - 1, w, 2)
36+
SetViewport()
37+
SetDrawLayer(nil, 0)
38+
end
39+
40+
return M

0 commit comments

Comments
 (0)