import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 import DelegateUI 1.0 import "../MyGlobals" 1.0 import QmlTool 1.0 import "../Component" 1.0 Item { anchors.fill: parent anchors.leftMargin: 1 ListModel { id: pluginModel } Component.onCompleted: { GlobalVars.tab_shop = this; initServerPluginList(); initAccServerList(); } //监听全局变量的变化 这里需要监听 因为在本页会产生刷新数据 Connections { target: GlobalVars //插件市场的全部插件 function onServerPluginexMapChanged(){initServerPluginList();} function onAccServerListChanged(){initAccServerList();} } //构造数据 function initServerPluginList(){ //全局数据插件列表存在 if(GlobalVars.serverPluginexMap){ var Data = GlobalVars.serverPluginexMap; // 遍历对象的属性 for (var key in Data) { var obj = Data[key] pluginModel.append(obj); } gv.model = pluginModel; } } function initAccServerList(){ //全局数据服务器列表存在 if(GlobalVars.accServerList){ server_select.model = []; var arrbuf = []; for(var i = 0; i < GlobalVars.accServerList.length;i++){ var obj = GlobalVars.accServerList[i]; var buf = { label : obj.serverIp, value : i } arrbuf.push(buf); } server_select.model = arrbuf; } } //插件详情页面的窗口 property var pluginInfoWidow: null //搜索插件的模式 property int searchMode: 0 Rectangle{ id:search_rect anchors.top : parent.top anchors.left: parent.left anchors.right: parent.right anchors.leftMargin: 15 anchors.rightMargin: 26 height: 80 color:"transparent" radius: 8 border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 DelIconText { id:server_label anchors.left: parent.left anchors.leftMargin: 10 anchors.top: parent.top anchors.topMargin: 14 text:"选择要安装插件的服务器:" font { pixelSize: 14 family: DelTheme.Primary.fontPrimaryFamily } } DelSelect { id:server_select anchors.left: server_label.right anchors.leftMargin: 10 anchors.top: parent.top anchors.topMargin: 10 width: 250 height: 30 tooltipVisible: true onCurrentIndexChanged: { GlobalVars.selectServer = currentIndex } } Row { anchors.top: server_label.bottom anchors.topMargin: 15 anchors.left: server_label.left spacing: 48 ButtonGroup { id: radioGroup } DelRadio { text: qsTr("索引插件名") ButtonGroup.group: radioGroup checked:true onCheckedChanged: {searchMode = 0} DelIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top iconSize: 24 iconSource: DelIcon.ReadOutlined } } DelRadio { text: qsTr("索引作者名") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 1} DelIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 iconSource: DelIcon.TeamOutlined } } DelRadio { text: qsTr("索引描述内容") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 2} DelIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 iconSource: DelIcon.ProfileOutlined } } } DelAutoComplete { anchors.right: search_rect.right anchors.rightMargin: 10 anchors.verticalCenter: search_rect.verticalCenter width: 370 height: 40 tooltipVisible: true placeholderText: qsTr("输入插件名以查找插件") selectByMouse: true clearIconSource: DelIcon.CloseSquareFilled onSearch: function(input) { if (!input) { options = []; } else { if(GlobalVars.serverPluginexMap){ var Data = GlobalVars.serverPluginexMap; var SearchBuf = []; // 遍历对象的属性 for (var key in Data) { var obj = Data[key]; //搜索插件名 if(searchMode === 0){ if(obj.ProjectName.indexOf(input) !== -1)SearchBuf.push({label: obj.ProjectName + "\t作者: " + obj.ProjectAuthor, index:key}); } //搜索作者 else if(searchMode === 1){ if(obj.ProjectAuthor.indexOf(input) !== -1)SearchBuf.push({label: obj.ProjectName + "\t作者: " + obj.ProjectAuthor, index:key}); } //搜索描述 else if(searchMode === 2){ if(obj.ProjectDescribe.indexOf(input) !== -1)SearchBuf.push({label: obj.ProjectName + "\t作者: " + obj.ProjectAuthor, index:key}); } } options = SearchBuf; } else{ options = []; } } } onSelect:function(select){ // if (!pluginInfoWidow) { // // 创建新窗口 // var component = Qt.createComponent("Window_PluginInfo_Goods.qml"); // pluginInfoWidow = component.createObject(parent); // pluginInfoWidow.init(select.index) // // 绑定关闭时自动销毁 // pluginInfoWidow.closing.connect(function() { // pluginInfoWidow.destroy() // pluginInfoWidow = null // 关键:释放引用 // }) // } // pluginInfoWidow.y = GlobalVars.main_Window.y + 85 // pluginInfoWidow.show() // pluginInfoWidow.raise() // 把窗口提到最前面 // clearInput() } } } GridView { id: gv anchors.top: search_rect.bottom anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom anchors.margins: 4 cellWidth: 420 cellHeight: 300 clip: true delegate:Item { // 每个格子的容器 width: gv.cellWidth height: gv.cellHeight Card { id:card anchors.centerIn: parent // 在格子容器中居中 width: parent.width - 24 // 改用相对尺寸 height: parent.height - 24 isDarkMode: DelTheme.isDark onClicked:function(){ if (!pluginInfoWidow) { // 创建新窗口 var component = Qt.createComponent("Window_ExPluginInfo_Goods.qml"); pluginInfoWidow = component.createObject(parent); pluginInfoWidow.init(model.ProjectName) // 绑定关闭时自动销毁 pluginInfoWidow.closing.connect(function() { pluginInfoWidow.destroy() pluginInfoWidow = null // 关键:释放引用 }) } pluginInfoWidow.y = GlobalVars.main_Window.y + 85 pluginInfoWidow.show() pluginInfoWidow.raise() // 把窗口提到最前面 } content: ColumnLayout { width: parent.width height: parent.height spacing: 4 Rectangle{ id:title_row Layout.fillWidth: true height: 30 color:"transparent" Text { id:title text: model.ProjectName font { pixelSize: 24 family: DelTheme.Primary.fontPrimaryFamily bold: true } color: DelTheme.Primary.colorTextBase elide: Text.ElideRight } Text { id:author anchors.top: title_row.top anchors.topMargin: 4 anchors.right: title_row.right anchors.rightMargin: 10 text: "作者:" + model.ProjectAuthor font { pixelSize: 16 family: DelTheme.Primary.fontPrimaryFamily bold: true } color: DelTheme.Primary.colorTextBase elide: Text.ElideRight } } Text { Layout.fillWidth: true text: model.ProjectDescribe wrapMode: Text.WordWrap maximumLineCount: 2 font { pixelSize: 14 family: DelTheme.Primary.fontPrimaryFamily } color: DelTheme.Primary.colorTextSecondary elide: Text.ElideRight } Item { Layout.fillWidth: true Layout.fillHeight: true height:300 DelRectangle { id: imageContainer anchors.fill: parent radius: 6 color: "transparent" clip: true Image { id: card_image asynchronous: true // 异步加载不阻塞UI cache: true // 启用内存缓存 anchors.fill: parent //source: "qrc:/image/moren.png" source: GlobalVars.server_url + "/rindro/getimg/" + model.ProjectName + "/0" fillMode: Image.PreserveAspectCrop } layer.enabled: true layer.effect: OpacityMask { maskSource: Rectangle { width: imageContainer.width height: imageContainer.height radius: imageContainer.radius } } } } } } } } }