TG-PlatformPlus/qml/debug/logviewer/main.qml

306 lines
9.3 KiB
QML

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
// import QtQuick.Controls.
import "./app.js" as App
import "./common"
import Qt.labs.folderlistmodel
Rectangle {
id: root
property var appId: App.appId
property var plusFile: App.plusFile
property var g_user: ""
property var g_sn: "8441"
property var appPath: "/"+plusFile+"/"+appId+"/"
property var firstPath: ""
property var logDirectory: ""
property var currentLogfilePath: ""
property var currentLogResult: ""
Component.onCompleted: {
firstPath = common.firstPath()
console.info("firstPath: " + firstPath)
console.info("appPath: " + appPath)
// 初始化应用程序脚本,确保脚本已准备就绪
common.initAppScript(appId, "log_processor", "log_processor.py", plusFile)
// common.registAppQml(appId, "file_system_model", "FileSystemModel", "file_system_model.py", plusFile)
var infos = projectManager.getInfo("all")
processInfoDict(infos)
g_user = common.getCurrentUser()
currentLogfilePath = ""
currentLogResult = ""
}
function processInfoDict(dict) {
var curProId = projectManager.getCurrentProId()
console.log("curProId: " + curProId)
var projects = Object.values(dict)
projects.forEach(pro => proFilter.model.push(pro))
var currentIndex = projects.findIndex(pro => pro.id === curProId)
if (currentIndex !== -1) {
logDirectory = "file:///" + projects[currentIndex].path + "/log"
}
proFilter.currentIndex = currentIndex
}
gradient: Gradient {
GradientStop { position: 0.0; color: "#ecf3fb" }
GradientStop { position: 1.0; color: "#b7d6fb" }
orientation: Gradient.Horizontal
}
ListModel{
id: logModel
}
Rectangle {
id: bar
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: 12
anchors.leftMargin: 23
anchors.rightMargin: 23
height: 45
radius: 9
Row{
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 12
spacing: 80
Text {
text: "日志文件"
font.pixelSize: 20
color: "#000000"
font.bold: true
}
}
Row {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 15
spacing: 13
Text {
text: "选择工程"
font.pixelSize: 16
color: "#000000"
}
ComboBox {
id: proFilter
width: 150
model: []
textRole: "name"
onActivated: {
logDirectory = "file:///" + model[currentIndex].path + "/log"
logModel.clear()
}
}
ComboBox {
id: levelFilter
width: 150
model: ["DEBUG", "INFO", "WARNING", "ERROR"]
onActivated: {
updateLogDisplay()
}
}
ComboBox {
id: tagFilter
width: 150
model: ["ALL"]
onActivated: {
updateLogDisplay()
}
}
}
}
Rectangle {
id: fileSystemViewContainer
anchors.top: bar.bottom
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.leftMargin: 23
anchors.bottomMargin: 12
anchors.topMargin: 23
radius: 9
width: 350
clip: true
ListView {
id: fileSystemView
anchors.fill: parent
boundsBehavior: Flickable.StopAtBounds
ScrollBar.vertical: ScrollBar{}
anchors.margins: 5
model: FolderListModel {
id: folderModel
rootFolder: logDirectory
showDirsFirst: true
showFiles: true
folder: logDirectory // 显式设置初始路径
}
delegate: ItemDelegate {
text: model.fileName
icon.source: "resource/file.svg"
background: Rectangle {
color: fileSystemView.currentIndex == index ? "#D9D9D9" : "white"
// 代理项的其他内容...
}
onClicked: {
console.info("Clicked on: " + model.fileName)
currentLogfilePath = model.filePath
currentLogResult = log_processor.read_file(currentLogfilePath)
updateLogDisplay()
fileSystemView.currentIndex = index
}
}
}
}
function appendTagLogLine(line) {
try {
if (tagFilter.currentIndex > 0) {
if (line.tag.includes(tagFilter.currentText)) {
appendLogLine(line)
}
}
else {
appendLogLine(line)
}
} catch(e) {
console.error("Error in appendTagLogLine:", e)
}
}
function appendLogLine(line) {
try {
logModel.append({
"time": line.time,
"tag": line.tag,
"message": line.msg,
"level": line.level,
"color": line.color
})
} catch(e) {
console.error("Error in appendLogLine:", e)
}
}
function updateLogDisplay() {
try {
logModel.clear()
var allTags = new Set()
currentLogResult.split("\n").forEach(function(line) {
try {
var part = line.split("---END")[0]
if (part.length > 1) {
var item =JSON.parse(part)
item.tag.split(",").forEach(tag => allTags.add(tag))
switch (levelFilter.currentIndex) {
case 0:
appendTagLogLine(item)
break;
case 1:
if(item.level != "DEBUG")
{
appendTagLogLine(item)
}
break;
case 2:
if(item.level === "WARNING" || item.level === "ERROR")
{
appendTagLogLine(item)
}
break;
case 3:
if(item.level === "ERROR")
{
appendTagLogLine(item)
}
break;
}
}
} catch(e) {
console.error("Error processing log line:", e)
}
})
tagFilter.model = ["ALL"].concat(Array.from(allTags))
} catch(e) {
console.error("Error in updateLogDisplay:", e)
}
}
Rectangle {
anchors.top: bar.bottom
anchors.left: fileSystemViewContainer.right
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.leftMargin: 23
anchors.bottomMargin: 12
anchors.topMargin: 23
anchors.rightMargin: 23
radius: 9
clip: true
// Log display
ListView {
anchors.fill: parent
anchors.margins: 10
boundsBehavior: Flickable.StopAtBounds
model: logModel
ScrollBar.vertical: ScrollBar{}
delegate: Item {
height: 20
Row {
spacing: 5
Text {
text: "["+model.time+"]"
color: "gray"
}
Text {
text: "["+model.level+"]"
color: model.color
}
Text {
text: "["+model.tag+"]"
color: model.color
}
Text {
text: model.message
color: model.color
}
}
}
}
}
function updateFileList() {
try {
if (logDirectory) {
var files = common.getTxtFiles(logDirectory)
deviceFilter.model = ["全部日志"].concat(files.map(function(file) {
return file.substring(file.lastIndexOf('/') + 1);
}))
return files
}
return []
} catch(e) {
console.error("Error in updateFileList:", e)
return []
}
}
}