import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Dialogs 1.3 import QtMultimedia 5.15 import HuskarUI.Basic 1.0 import QmlTool 1.0 import FileTransfer 1.0 import SSHManager 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 HusWindow { id:plugininfo_goods width: 890 height: 630 visible: true title: qsTr("插件详情页") captionBar.topButtonVisible: true captionBar.winIconDelegate: Image { id: name width: 20 height: 20 source: "qrc:/image/logo.png" } //原始数据 property var p_basedata: null //商店原始数据 property var p_shopbasedata:null //插件名 property string p_name : "未定名插件" //作者名 property string p_author : "未定名作者" //版本号 property string p_version: "0.0.1" //到期时间 property string p_endTime: "null" //描述 property string p_description: "暂无描述" //售价 property int p_price: 0 //插件文件数组 property var p_filelist : [] //是否是凌众插件 property bool p_isrindro : false //图像 property string p_image:"qrc:/image/logo2.png" Component.onCompleted: { } Shortcut { sequences: ["Esc"] onActivated: close() } function init(index){ if(!GlobalVars.myServerExPluginMap)return; var Data = GlobalVars.myServerExPluginMap[index] p_basedata = Data; p_name = Data.ProjectName p_author = Data.ProjectAuthor p_version = Data.ProjectVersion p_description = Data.ProjectDescribe //如果有插件文件数组 if(Data.ProjectFiles)p_filelist = Data.ProjectFiles //如果有售价才设置售价 if(Data.ProjectPrice)p_price = Data.ProjectPrice else p_price = 0 //如果有插件的详细描述 if(Data.ProjectDetails)details.model = Data.ProjectDetails //判断是否启用 if(Data.open)plugins_check.checked = Data.open === 1 ? true : false //判断到期时间 if(Data.endTime)p_endTime = Data.endTime; // //判断是否需要更新 // if(p_shopbasedata.ProjectVersion > p_version){ // update_button.visible = true // } } function buildQuest(filename){ var downloadurl = GlobalVars.server_url + "/dps/download/" + p_name + ":"; var updir = (filename.indexOf(".json") === -1 ? ("OfficialProject/" + p_shopbasedata.ProjectName + "/") : "OfficialConfig/"); GlobalVars.downlad_quest_window.addQuest(p_shopbasedata.ProjectName + ":" + filename,[ function(quest){ //下载 quest.status = 1; FileTransfer.postDownload(downloadurl + filename, "download/" + filename,{key:p_shopbasedata.ProjectName + ":" + filename},"quest"); }, function(quest){ if(GlobalVars.accServerList){ var server = GlobalVars.accServerList[GlobalVars.selectServer].serverIp //上传 quest.status = 1; FileTransfer.postUpload("http://" + server + ":65170/api/uploadfiles", "download/" + filename, "/dp_s/" + updir,"quest"); } else{ quest.instruction = true } },function(quest){ GlobalVars.msg_control.success("文件 :" + p_shopbasedata.ProjectName + ":" + filename + " 已下载并上传至服务器!"); quest.instruction = true //配置文件是最后来的 if(filename.indexOf("Proj.ifo") !== -1){ GlobalVars.getServerPlugins(GlobalVars.sshConnectServer) close() } }]); } FileDialog { id: fileDialog title: "请选择保存路径" selectFolder: true // 选择文件而非文件夹 selectMultiple: false // 不允许多选 onAccepted: { var filePath = fileDialog.fileUrl.toString() var cleanPath = filePath.replace(/^(file:\/{2,3})/, ""); var filename = "双端插件-" + p_name + "导入包.zip"; GlobalVars.downlad_quest_window.addQuest(filename,[ function(quest){ //下载 quest.status = 1; FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download", cleanPath + "/" + filename,{projectName:p_name},"quest"); }, function(quest){ GlobalVars.msg_control.success(cleanPath + filename + "已下载完成!"); quest.instruction = true }]); } onRejected: { } } Rectangle{ id:title anchors.left: parent.left anchors.leftMargin: 10 anchors.right: parent.right anchors.rightMargin: 15 anchors.top: parent.top anchors.topMargin: 45 height:78 + headerdiv.height + description.height radius:8 border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" Image { id: logo source: "qrc:/image/logo.png" anchors.left: parent.left anchors.leftMargin: 10 anchors.top: parent.top anchors.topMargin: 15 width: 48 height: 48 } HusDivider { id:headerdiv anchors.top: logo.bottom anchors.left: parent.left anchors.leftMargin: 1 width: parent.width - 1 height: 30 } Text { id:description anchors.left: parent.left anchors.leftMargin: 10 anchors.right: parent.right anchors.rightMargin: 10 anchors.top: headerdiv.bottom text: p_description wrapMode: Text.WordWrap font { pixelSize: 14 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextBase } Text { id:pluginname anchors.left: logo.right anchors.leftMargin: 10 anchors.top: parent.top anchors.topMargin: 14 text: p_name font { pixelSize: 20 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextBase } Text { anchors.left: logo.right anchors.leftMargin: 10 anchors.top: pluginname.bottom anchors.topMargin: 2 text: "作者: " + p_author font { pixelSize: 14 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextBase } HusTag { id:version_tag anchors.left: pluginname.right anchors.leftMargin: 15 anchors.top: pluginname.top anchors.topMargin: 2 text:"Ver:" + p_version presetColor:"green" } HusTag { id:endTime_tag anchors.left: version_tag.right anchors.leftMargin: 15 anchors.top: pluginname.top anchors.topMargin: 2 text:"到期时间:" + p_endTime presetColor:"geekblue" } HusSwitch { id:plugins_check anchors.right: parent.right anchors.rightMargin: 10 anchors.top: parent.top anchors.topMargin: 15 checkedText: qsTr("开启插件") uncheckedText: qsTr("关闭插件") onCheckedChanged: { GlobalVars.setServerExPluginsEnable(GlobalVars.sshConnectServer,p_name,checked === true ? 1 : 0); } } HusButton { id:delete_button visible: true anchors.right: parent.right anchors.rightMargin: 10 anchors.top: parent.top anchors.topMargin: 45 height: 26 text: "下载插件导入包" // colorText: "#ff0000" onClicked: { fileDialog.open() } } } Rectangle{ id:content anchors.left: parent.left anchors.leftMargin: 10 anchors.right: parent.right anchors.rightMargin: 15 anchors.top: title.bottom anchors.topMargin: 10 anchors.bottom:parent.bottom anchors.bottomMargin: 10 radius:8 border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" clip: true ScrollView { anchors.fill: parent anchors.margins: 10 Column { id: contentColumn anchors.fill: parent spacing: 10 Repeater { id:details delegate: Column { // 直接使用 Column 作为根元素 width: parent.width spacing: 0 Loader { width: parent.width sourceComponent: { switch(modelData.type) { case "str": return textComponent; case "img": return imageComponent; case "mov": return videoComponent; default: return null; } } // 动态绑定组件属性 property var itemData: modelData } } } } } } // 定义组件映射 Component { id: textComponent; Text { width: parent.width - 20 text: itemData.content wrapMode: Text.Wrap font { pixelSize: 14 family: HusTheme.Primary.fontPrimaryFamily } color: HusTheme.Primary.colorTextBase } } Component { id: imageComponent; Image { source: GlobalVars.server_url + "/rindro/getimg/" + p_name + "/" + itemData.content fillMode: Image.PreserveAspectFit asynchronous: true cache: true // 动态计算宽度 width: Math.min(implicitWidth, parent.width) // 让图像靠左边显示 anchors.left: parent.left // 确保父级有明确宽度传递 property real maxWidth: parent ? parent.width : 0 // 异步加载完成后更新尺寸 onStatusChanged: { if (status === Image.Ready) { width = Math.min(implicitWidth, maxWidth) } } } } Component { id: videoComponent Item { id: videoContainer width: parent.width height: 400 // 视频播放器 Video { id: videoPlayer anchors.fill: parent anchors.bottomMargin: 15 source: itemData.content loops: MediaPlayer.Infinite autoPlay: false // 错误处理 onErrorChanged: { if (error !== MediaPlayer.NoError) { GlobalVars.msg_control.error("播放错误:", errorString); } } } // 播放控制按钮(可选) Row { anchors.top: videoPlayer.bottom anchors.topMargin: 4 anchors.horizontalCenter: parent.horizontalCenter spacing: 10 HusButton { text: videoPlayer.playbackState === MediaPlayer.PlayingState ? "暂停" : "播放" onClicked: videoPlayer.playbackState === MediaPlayer.PlayingState ? videoPlayer.pause() : videoPlayer.play() } HusButton { text: "静音" onClicked: videoPlayer.muted = !videoPlayer.muted } } } } }