feat: 新增错误问题追踪与管理功能
- 升级程序版本至 v1.5.25 - 新增对比度文本颜色计算与垂直滚动条绘制工具函数,优化选择界面滚动显示 - 网页端新增问题记录管理页面,配套完整的表格与详情展示样式 - 实现issue记录标准化处理、实时事件推送接收与按时间倒序排序展示 - 重构原有选择界面的滚动逻辑,替换为通用滚动条绘制函数
This commit is contained in:
+68
-14
@@ -1,6 +1,6 @@
|
||||
local CURRENT_STATION_CODE = 'Ticket-Machine'
|
||||
local API_BASE = 'https://ticket.fse-media.group/api'
|
||||
local VERSION = 'v1.5.24'
|
||||
local VERSION = 'v1.5.25'
|
||||
local UPDATE_CHECK_INTERVAL = 5
|
||||
|
||||
-- ###########################
|
||||
@@ -1081,6 +1081,16 @@ local function nearestCCColor(val)
|
||||
return colors.gray
|
||||
end
|
||||
|
||||
local function contrastTextColor(bg)
|
||||
for _, c in ipairs(CC_PALETTE) do
|
||||
if c.val == bg then
|
||||
local yiq = (c.rgb[1] * 299 + c.rgb[2] * 587 + c.rgb[3] * 114) / 1000
|
||||
return yiq >= 140 and colors.black or colors.white
|
||||
end
|
||||
end
|
||||
return colors.white
|
||||
end
|
||||
|
||||
local function clear()
|
||||
termDev.setBackgroundColor(colors.black)
|
||||
termDev.clear()
|
||||
@@ -1115,6 +1125,31 @@ local function addButton(x, y, label, wBtn, hBtn, colorsPair, onClick)
|
||||
termDev.write(label)
|
||||
end
|
||||
|
||||
local function drawVerticalScrollbar(sbX, startY, endY, offset, maxOffset, step, onUp, onDown)
|
||||
addButton(sbX, startY - 1, '^', 3, 1, {colors.black, colors.white}, onUp)
|
||||
addButton(sbX, endY + 1, 'v', 3, 1, {colors.black, colors.white}, onDown)
|
||||
for py = startY, endY do
|
||||
termDev.setBackgroundColor(colors.black)
|
||||
termDev.setCursorPos(sbX, py)
|
||||
termDev.write(' ')
|
||||
termDev.setBackgroundColor(colors.gray)
|
||||
termDev.setCursorPos(sbX, py)
|
||||
termDev.write(' ')
|
||||
end
|
||||
if maxOffset <= 0 then
|
||||
return
|
||||
end
|
||||
local railH = endY - startY + 1
|
||||
local thumbH = math.max(2, math.floor((railH * railH) / (railH + maxOffset)))
|
||||
if thumbH > railH then thumbH = railH end
|
||||
local thumbY = startY + math.floor((railH - thumbH) * (offset / maxOffset))
|
||||
for py = thumbY, thumbY + thumbH - 1 do
|
||||
termDev.setBackgroundColor(colors.lightGray)
|
||||
termDev.setCursorPos(sbX, py)
|
||||
termDev.write(' ')
|
||||
end
|
||||
end
|
||||
|
||||
local function inRect(btn, px, py)
|
||||
return px >= btn.x and px <= (btn.x + btn.w - 1) and py >= btn.y and py <= (btn.y + btn.h - 1)
|
||||
end
|
||||
@@ -1381,8 +1416,12 @@ local function showSingleSegmentSelection()
|
||||
local startIdx = singleSegmentScroll * itemsPerPage + 1
|
||||
local endIdx = math.min(startIdx + itemsPerPage - 1, #singleSegments)
|
||||
|
||||
local bw = math.floor((w - 6) / 2)
|
||||
local bx1, bx2 = 2, w - bw - 1
|
||||
local sbX = w - 3
|
||||
local contentRight = sbX - 2
|
||||
local colGap = 2
|
||||
local bw = math.floor((contentRight - 1 - colGap) / 2)
|
||||
if bw < 8 then bw = 8 end
|
||||
local bx1, bx2 = 2, 2 + bw + colGap
|
||||
local by = 5
|
||||
for i = startIdx, endIdx do
|
||||
local seg = singleSegments[i]
|
||||
@@ -1391,20 +1430,27 @@ local function showSingleSegmentSelection()
|
||||
local x = colIdx == 0 and bx1 or bx2
|
||||
local y = by + rowIdx * 4
|
||||
|
||||
local label = seg.lineName .. ' cogs:' .. tostring(seg.cost)
|
||||
if #label > bw then label = label:sub(1, bw) end
|
||||
local lineColor = nearestCCColor(seg.color)
|
||||
local textColor = contrastTextColor(lineColor)
|
||||
local isSelected = (state.singleSegment == seg)
|
||||
addButton(x, y, label, bw, 3, {isSelected and colors.green or colors.blue, colors.white}, function()
|
||||
local label = seg.lineName .. ' ' .. tostring(seg.cost) .. 'c'
|
||||
if isSelected then label = '>' .. label end
|
||||
if #label > bw then label = label:sub(1, bw) end
|
||||
addButton(x, y, label, bw, 3, {lineColor, textColor}, function()
|
||||
state.singleSegment = seg
|
||||
end)
|
||||
end
|
||||
|
||||
if singleSegmentScroll > 0 then
|
||||
addButton(w-8, 2, 'UP', 6, 1, {colors.gray, colors.white}, function() singleSegmentScroll = singleSegmentScroll - 1 end)
|
||||
end
|
||||
if singleSegmentScroll < maxScroll then
|
||||
addButton(w-8, h-5, 'DN', 6, 1, {colors.gray, colors.white}, function() singleSegmentScroll = singleSegmentScroll + 1 end)
|
||||
end
|
||||
drawVerticalScrollbar(
|
||||
sbX,
|
||||
by,
|
||||
h - 6,
|
||||
singleSegmentScroll * itemsPerPage,
|
||||
maxScroll * itemsPerPage,
|
||||
itemsPerPage,
|
||||
function() singleSegmentScroll = math.max(0, singleSegmentScroll - 1) end,
|
||||
function() singleSegmentScroll = math.min(maxScroll, singleSegmentScroll + 1) end
|
||||
)
|
||||
|
||||
addCancelButton()
|
||||
addButton(2, h-3, '<-back', 8, 3, {colors.black, colors.red}, function() state.page = 'home' end)
|
||||
@@ -1801,8 +1847,16 @@ local function renderLinesSelection(title, selectedCode, backPage, nextPage, inf
|
||||
local ch = computeHeight(); local maxO = math.max(0, ch - (endY-startY+1))
|
||||
ui_scroll_offset = math.min(ui_scroll_offset, maxO)
|
||||
|
||||
addButton(sbX, startY-1, '^', 3, 1, {colors.black, colors.white}, function() ui_scroll_offset = math.max(0, ui_scroll_offset-4) end)
|
||||
addButton(sbX, endY+1, 'v', 3, 1, {colors.black, colors.white}, function() ui_scroll_offset = math.min(maxO, ui_scroll_offset+4) end)
|
||||
drawVerticalScrollbar(
|
||||
sbX,
|
||||
startY,
|
||||
endY,
|
||||
ui_scroll_offset,
|
||||
maxO,
|
||||
4,
|
||||
function() ui_scroll_offset = math.max(0, ui_scroll_offset-4) end,
|
||||
function() ui_scroll_offset = math.min(maxO, ui_scroll_offset+4) end
|
||||
)
|
||||
|
||||
local y = startY
|
||||
for _, l in ipairs(CFG.lines) do
|
||||
|
||||
Reference in New Issue
Block a user