1 | // SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. |
2 | // |
3 | // SPDX-License-Identifier: GPL-3.0-or-later |
4 | |
5 | #include "kitsmanagerwidget.h" |
6 | #include "services/option/toolchaindata.h" |
7 | #include "common/util/custompaths.h" |
8 | #include "common/toolchain/toolchain.h" |
9 | |
10 | #include <QDebug> |
11 | #include <QDir> |
12 | #include <QtCore/QVariant> |
13 | #include <QtWidgets/QApplication> |
14 | #include <QtWidgets/QComboBox> |
15 | #include <QtWidgets/QGridLayout> |
16 | #include <QtWidgets/QHBoxLayout> |
17 | #include <QtWidgets/QLabel> |
18 | #include <QtWidgets/QLineEdit> |
19 | #include <QtWidgets/QListView> |
20 | #include <QtWidgets/QPushButton> |
21 | #include <QtWidgets/QScrollArea> |
22 | #include <QtWidgets/QTabWidget> |
23 | #include <QtWidgets/QVBoxLayout> |
24 | #include <QtWidgets/QWidget> |
25 | #include <QStringListModel> |
26 | #include <QAbstractItemView> |
27 | #include <QListWidget> |
28 | #include <QJsonObject> |
29 | |
30 | class KitsManagerWidgetPrivate |
31 | { |
32 | friend class KitsManagerWidget; |
33 | QListWidget *listWidget = nullptr; |
34 | QLineEdit *nameEidt = nullptr; |
35 | QComboBox *cbCXXComplier = nullptr; |
36 | QComboBox *cbCMake = nullptr; |
37 | QComboBox *cbCComplier = nullptr; |
38 | QComboBox *cbDebugger = nullptr; |
39 | QLabel *labelGeneratorExpression = nullptr; |
40 | |
41 | QSharedPointer<ToolChainData> toolChainData; |
42 | }; |
43 | |
44 | KitsManagerWidget::KitsManagerWidget(QWidget *parent) |
45 | : PageWidget(parent) |
46 | , d(new KitsManagerWidgetPrivate) |
47 | { |
48 | d->toolChainData.reset(new ToolChainData()); |
49 | QString retMsg; |
50 | bool ret = d->toolChainData->readToolChainData(retMsg); |
51 | if (ret) { |
52 | qInfo() << retMsg; |
53 | } |
54 | |
55 | setupUi(); |
56 | updateUi(); |
57 | } |
58 | |
59 | KitsManagerWidget::~KitsManagerWidget() |
60 | { |
61 | if (d) { |
62 | delete d; |
63 | } |
64 | } |
65 | |
66 | void KitsManagerWidget::setupUi() |
67 | { |
68 | auto centerLayout = new QGridLayout(); |
69 | centerLayout->setSpacing(6); |
70 | centerLayout->setContentsMargins(0, 0, 11, 0); |
71 | |
72 | // List tree. |
73 | d->listWidget = new QListWidget(); |
74 | d->listWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); |
75 | d->listWidget->addItem("Desktop" ); |
76 | |
77 | auto detailGridLayout = new QGridLayout(); |
78 | detailGridLayout->setSpacing(6); |
79 | d->cbCXXComplier = new QComboBox(); |
80 | |
81 | d->nameEidt = new QLineEdit(); |
82 | d->nameEidt->setText(tr("Desktop" )); |
83 | d->nameEidt->setEnabled(false); |
84 | |
85 | d->cbCMake = new QComboBox(); |
86 | |
87 | auto labelCMake = new QLabel(); |
88 | labelCMake->setText(tr("CMake Tool:" )); |
89 | |
90 | d->cbCComplier = new QComboBox(); |
91 | |
92 | d->cbDebugger = new QComboBox(); |
93 | |
94 | auto labelGenerator = new QLabel(); |
95 | labelGenerator->setText(tr("CMake generator:CodeBlocks - Unix Makefiles" )); |
96 | |
97 | auto labelDebugger = new QLabel(); |
98 | labelDebugger->setText(tr("Debugger:" )); |
99 | |
100 | d->labelGeneratorExpression = new QLabel(); |
101 | d->labelGeneratorExpression->setText(QString()); |
102 | |
103 | auto Name = new QLabel(); |
104 | Name->setText(tr("Name:" )); |
105 | |
106 | auto labelCCompiler = new QLabel(); |
107 | labelCCompiler->setText("C Compiler:" ); |
108 | |
109 | auto labelCXXCompiler = new QLabel(); |
110 | labelCXXCompiler->setText("C++ Compiler:" ); |
111 | |
112 | QFrame* separator = new QFrame(); |
113 | separator->setFrameShape(QFrame::HLine); |
114 | separator->setFrameShadow(QFrame::Sunken); |
115 | |
116 | centerLayout->addWidget(d->listWidget, 0, 0, 25, 1); |
117 | centerLayout->addWidget(Name, 1, 1, 1, 1); |
118 | centerLayout->addWidget(d->nameEidt, 1, 2, 1, 1); |
119 | centerLayout->addWidget(separator, 3, 1, 1, 2); |
120 | centerLayout->addWidget(labelCCompiler, 5, 1, 1, 1); |
121 | centerLayout->addWidget(d->cbCComplier, 5, 2, 1, 1); |
122 | centerLayout->addWidget(labelCXXCompiler, 7, 1, 1, 1); |
123 | centerLayout->addWidget(d->cbCXXComplier, 7, 2, 1, 1); |
124 | centerLayout->addWidget(labelDebugger, 9, 1, 1, 1); |
125 | centerLayout->addWidget(d->cbDebugger, 9, 2, 1, 1); |
126 | centerLayout->addWidget(labelCMake, 11, 1, 1, 1); |
127 | centerLayout->addWidget(d->cbCMake, 11, 2, 1, 1); |
128 | centerLayout->addWidget(labelGenerator, 13, 1, 1, 2); |
129 | |
130 | setLayout(centerLayout); |
131 | } |
132 | |
133 | void KitsManagerWidget::updateUi() |
134 | { |
135 | const ToolChainData::ToolChains &data = d->toolChainData->getToolChanins(); |
136 | |
137 | // Update compiler combox. |
138 | auto updateComplier = [](QComboBox *cb, ToolChainData::Params ¶ms) { |
139 | int i = 0; |
140 | for (auto p : params) { |
141 | QString text = p.name + "(" + p.path + ")" ; |
142 | cb->insertItem(i, text); |
143 | cb->setItemData(i, QVariant::fromValue(p), Qt::UserRole + 1); |
144 | i++; |
145 | } |
146 | }; |
147 | |
148 | ToolChainData::Params cParams = data.value(kCCompilers); |
149 | updateComplier(d->cbCComplier, cParams); |
150 | |
151 | ToolChainData::Params cxxParams = data.value(kCXXCompilers); |
152 | updateComplier(d->cbCXXComplier, cxxParams); |
153 | |
154 | // Update Debugger combox. |
155 | ToolChainData::Params debugger = data.value(kCCXXDebuggers); |
156 | updateComplier(d->cbDebugger, debugger); |
157 | |
158 | // Update CMake combox. |
159 | ToolChainData::Params cmake = data.value(kCCXXBuildSystems); |
160 | updateComplier(d->cbCMake, cmake); |
161 | } |
162 | |
163 | bool KitsManagerWidget::getControlValue(QMap<QString, QVariant> &map) |
164 | { |
165 | KitConfig config; |
166 | config.name = d->nameEidt->text(); |
167 | |
168 | auto comboBoxValue = [](QComboBox *cb) { |
169 | int index = cb->currentIndex(); |
170 | if (index > -1) { |
171 | return qvariant_cast<ToolChainData::ToolChainParam>(cb->itemData(index, Qt::UserRole + 1)); |
172 | } else { |
173 | return ToolChainData::ToolChainParam(); |
174 | } |
175 | }; |
176 | |
177 | config.ccompiler = comboBoxValue(d->cbCComplier); |
178 | config.cppcompiler = comboBoxValue(d->cbCXXComplier); |
179 | config.debugger = comboBoxValue(d->cbDebugger); |
180 | config.cmake = comboBoxValue(d->cbCMake); |
181 | config.cmakeGenerator = d->labelGeneratorExpression->text(); |
182 | |
183 | dataToMap(config, map); |
184 | |
185 | return true; |
186 | } |
187 | |
188 | void KitsManagerWidget::setControlValue(const QMap<QString, QVariant> &map) |
189 | { |
190 | KitConfig config; |
191 | mapToData(map, config); |
192 | |
193 | auto updateComplier = [](QComboBox *cb, ToolChainData::ToolChainParam ¶ms) { |
194 | for (int i = 0; i < cb->count(); i++) { |
195 | ToolChainData::ToolChainParam data = qvariant_cast<ToolChainData::ToolChainParam>(cb->itemData(i, Qt::UserRole + 1)); |
196 | if (data.name == params.name && data.path == params.path) { |
197 | cb->setCurrentIndex(i); |
198 | return; |
199 | } |
200 | } |
201 | }; |
202 | |
203 | updateComplier(d->cbCComplier, config.ccompiler); |
204 | updateComplier(d->cbCXXComplier, config.cppcompiler); |
205 | updateComplier(d->cbDebugger, config.debugger); |
206 | updateComplier(d->cbCMake, config.cmake); |
207 | |
208 | //d->labelGeneratorExpression->setText(config.cmakeGenerator); |
209 | } |
210 | |
211 | bool KitsManagerWidget::dataToMap(const KitConfig &config, QMap<QString, QVariant> &map) |
212 | { |
213 | auto updateComplier = [](QMap<QString, QVariant> &map, const QString key, const ToolChainData::ToolChainParam ¶ms) { |
214 | QMap<QString, QVariant> version; |
215 | version.insert("name" , params.name); |
216 | version.insert("path" , params.path); |
217 | map.insert(key, version); |
218 | }; |
219 | |
220 | updateComplier(map, "ccompiler" , config.ccompiler); |
221 | updateComplier(map, "cppcompiler" , config.cppcompiler); |
222 | updateComplier(map, "debugger" , config.debugger); |
223 | updateComplier(map, "cmake" , config.cmake); |
224 | |
225 | map.insert("name" , config.name); |
226 | map.insert("cmakeGenerator" , config.cmakeGenerator); |
227 | |
228 | return true; |
229 | } |
230 | |
231 | bool KitsManagerWidget::mapToData(const QMap<QString, QVariant> &map, KitConfig &config) |
232 | { |
233 | auto updateComplier = [](const QMap<QString, QVariant> &map, const QString key, ToolChainData::ToolChainParam ¶ms) { |
234 | QMap<QString, QVariant> version = map.value(key).toMap(); |
235 | params.name = version.value("name" ).toString(); |
236 | params.path = version.value("path" ).toString(); |
237 | }; |
238 | |
239 | updateComplier(map, "ccompiler" , config.ccompiler); |
240 | updateComplier(map, "cppcompiler" , config.cppcompiler); |
241 | updateComplier(map, "debugger" , config.debugger); |
242 | updateComplier(map, "cmake" , config.cmake); |
243 | |
244 | config.name = map.value("name" ).toString(); |
245 | config.cmakeGenerator = map.value("cmakeGenerator" ).toString(); |
246 | |
247 | return true; |
248 | } |
249 | |
250 | void KitsManagerWidget::setUserConfig(const QMap<QString, QVariant> &map) |
251 | { |
252 | setControlValue(map); |
253 | } |
254 | |
255 | void KitsManagerWidget::getUserConfig(QMap<QString, QVariant> &map) |
256 | { |
257 | getControlValue(map); |
258 | } |
259 | |