1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "plugindialog.h"
6
7#include "framework/lifecycle/lifecycle.h"
8#include "framework/lifecycle/pluginmanager.h"
9#include "framework/lifecycle/pluginmetaobject.h"
10#include "framework/lifecycle/pluginview.h"
11
12#include <QHBoxLayout>
13#include <QVBoxLayout>
14#include <QDialog>
15#include <QPushButton>
16#include <QLabel>
17#include <QDialogButtonBox>
18#include <QDesktopServices>
19
20static bool isRestartRequired = false;
21
22PluginDialog::PluginDialog(QWidget *parent)
23 : QDialog(parent),
24 view(new dpf::PluginView(this))
25{
26 resize(1000, 600);
27 setWindowTitle(tr("Installed Plugins"));
28
29 auto vLayout = new QVBoxLayout(this);
30 auto detailLayout = new QHBoxLayout;
31 detailLayout->addWidget(view);
32
33 closeButton = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this);
34 closeButton->button(QDialogButtonBox::Close)->setText(tr("Close"));
35 closeButton->setEnabled(true);
36
37 restratRequired = new QLabel(tr(" Restart required."), this);
38 if (!isRestartRequired)
39 restratRequired->setVisible(false);
40
41 auto buttonLayout = new QHBoxLayout;
42 buttonLayout->addSpacing(10);
43 buttonLayout->addWidget(restratRequired);
44 buttonLayout->addStretch(5);
45 buttonLayout->addWidget(closeButton);
46
47 detailView = new DetailsView();
48 detailLayout->addWidget(detailView);
49 slotCurrentPluginActived();
50
51 vLayout->addLayout(detailLayout);
52 vLayout->addLayout(buttonLayout);
53
54 QObject::connect(view, &dpf::PluginView::currentPluginActived, this, &PluginDialog::slotCurrentPluginActived);
55 QObject::connect(view, &dpf::PluginView::pluginSettingChanged,
56 this, &PluginDialog::updateRestartRequired);
57 QObject::connect(closeButton->button(QDialogButtonBox::Close), &QPushButton::clicked,
58 [this] { closeDialog() ;});
59}
60
61void PluginDialog::slotCurrentPluginActived()
62{
63 dpf::PluginMetaObjectPointer plugin = view->currentPlugin();
64 detailView->update(plugin);
65}
66
67void PluginDialog::updateRestartRequired()
68{
69 isRestartRequired = true;
70 restratRequired->setVisible(true);
71}
72
73void PluginDialog::closeDialog()
74{
75 dpf::LifeCycle::getPluginManagerInstance()->writeSettings();
76 accept();
77}
78
79DetailsView::DetailsView(QWidget *parent)
80 : QWidget(parent)
81{
82 gridLayout = new QGridLayout(this);
83 gridLayout->setContentsMargins(2, 2, 2, 2);
84
85 nameLabel = new QLabel(tr("Name:"), this);
86 nameLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
87 name = new QLabel(this);
88 name->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
89 gridLayout->addWidget(nameLabel, 0, 0, 1, 1);
90 gridLayout->addWidget(name, 0, 1, 1, 1);
91
92 versionLabel = new QLabel(tr("Version:"), this);
93 versionLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
94 version = new QLabel(this);
95 version->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
96 gridLayout->addWidget(versionLabel, 1, 0, 1, 1);
97 gridLayout->addWidget(version, 1, 1, 1, 1);
98
99 compatVersionLabel = new QLabel(tr("Compatibility version:"), this);
100 compatVersionLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
101 compatVersion = new QLabel(this);
102 compatVersion->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
103 gridLayout->addWidget(compatVersionLabel, 2, 0, 1, 1);
104 gridLayout->addWidget(compatVersion, 2, 1, 1, 1);
105
106 vendorLabel = new QLabel(tr("Vendor:"), this);
107 vendorLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
108 vendor = new QLabel(this);
109 vendor->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
110 gridLayout->addWidget(vendorLabel, 3, 0, 1, 1);
111 gridLayout->addWidget(vendor, 3, 1, 1, 1);
112
113 copyrightLabel = new QLabel(tr("Copyright:"), this);
114 copyrightLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
115 copyright = new QLabel(this);
116 copyright->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
117 gridLayout->addWidget(copyrightLabel, 4, 0, 1, 1);
118 gridLayout->addWidget(copyright, 4, 1, 1, 1);
119
120 categoryLabel = new QLabel(tr("Category:"), this);
121 categoryLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
122 category = new QLabel(this);
123 category->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
124 gridLayout->addWidget(categoryLabel, 5, 0, 1, 1);
125 gridLayout->addWidget(category, 5, 1, 1, 1);
126
127 urlLabel = new QLabel(tr("URL:"), this);
128 urlLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
129 urlLink = new QLabel(this);
130 urlLink->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
131 gridLayout->addWidget(urlLabel, 6, 0, 1, 1);
132 gridLayout->addWidget(urlLink, 6, 1, 1, 1);
133
134 vboxLayout_1 = new QVBoxLayout();
135 licenseLabel = new QLabel(tr("License:"), this);
136 licenseLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
137 vboxLayout_1->addWidget(licenseLabel);
138 spacerItem_1 = new QSpacerItem(17, 13, QSizePolicy::Minimum, QSizePolicy::Expanding);
139 vboxLayout_1->addItem(spacerItem_1);
140 license = new QTextEdit(this);
141 license->setReadOnly(true);
142 gridLayout->addLayout(vboxLayout_1, 7, 0, 1, 1);
143 gridLayout->addWidget(license, 7, 1, 1, 1);
144
145 vboxLayout_2 = new QVBoxLayout();
146 descriptionLabel = new QLabel(tr("Description:"), this);
147 descriptionLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
148 vboxLayout_2->addWidget(descriptionLabel);
149 spacerItem_2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
150 vboxLayout_2->addItem(spacerItem_2);
151 description = new QTextEdit(this);
152 description->setReadOnly(true);
153 gridLayout->addLayout(vboxLayout_2, 8, 0, 1, 1);
154 gridLayout->addWidget(description, 8, 1, 1, 1);
155
156 vboxLayout_3 = new QVBoxLayout();
157 dependenciesLabel = new QLabel(tr("Dependencies:"), this);
158 dependenciesLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse);
159 vboxLayout_3->addWidget(dependenciesLabel);
160 spacerItem_3 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
161 vboxLayout_3->addItem(spacerItem_3);
162 dependencies = new QListWidget(this);
163 gridLayout->addLayout(vboxLayout_3, 9, 0, 1, 1);
164 gridLayout->addWidget(dependencies, 9, 1, 1, 1);
165}
166
167void DetailsView::update(dpf::PluginMetaObjectPointer plugin)
168{
169 name->setText(plugin->name());
170 version->setText(plugin->version());
171 compatVersion->setText(plugin->compatVersion());
172 vendor->setText(plugin->vendor());
173 category->setText(plugin->category());
174 const QString link = QString::fromLatin1("<a href=\"%1\">%1</a>").arg(plugin->urlLink());
175 urlLink->setText(link);
176 copyright->setText(plugin->copyright());
177 description->setText(plugin->description());
178 QString licenseText;
179 for (QString &text : plugin->license()) {
180 licenseText += text.simplified();
181 licenseText += "\n\n";
182 }
183 license->setText(licenseText.trimmed());
184 QStringList dependsList;
185 dependencies->clear();
186 for (dpf::PluginDepend depend : plugin->depends()) {
187 dependsList << depend.toString();
188 }
189 dependencies->addItems(dependsList);
190
191 connect(urlLink, &QLabel::linkActivated, [=](){
192 QDesktopServices::openUrl(QUrl(plugin->urlLink()));
193 });
194}
195