8#include <texteditfindwidget_p.h>
10#include <QtWidgets/qapplication.h>
11#if QT_CONFIG(clipboard)
12#include <QtGui/qclipboard.h>
14#include <QtWidgets/qdialogbuttonbox.h>
15#include <QtWidgets/qfiledialog.h>
16#include <QtWidgets/qmessagebox.h>
17#include <QtWidgets/qpushbutton.h>
18#include <QtWidgets/qtextedit.h>
19#include <QtWidgets/qtoolbar.h>
20#include <QtWidgets/qboxlayout.h>
22#include <QtGui/qaction.h>
23#include <QtGui/qevent.h>
24#include <QtGui/qfontdatabase.h>
25#include <QtGui/qfontmetrics.h>
26#include <QtGui/qicon.h>
28#include <QtCore/qdebug.h>
29#include <QtCore/qdir.h>
30#include <QtCore/qmimedatabase.h>
31#include <QtCore/qtemporaryfile.h>
35using namespace Qt::StringLiterals;
37namespace qdesigner_internal {
48CodeDialog::CodeDialogPrivate::CodeDialogPrivate()
49 : m_textEdit(
new QTextEdit)
50 , m_findWidget(
new TextEditFindWidget)
57 m_impl(
new CodeDialogPrivate)
59 QVBoxLayout *vBoxLayout =
new QVBoxLayout;
62 QToolBar *toolBar =
new QToolBar;
64 const QIcon saveIcon = createIconSet(QIcon::ThemeIcon::DocumentSave,
66 QAction *saveAction = toolBar->addAction(saveIcon, tr(
"Save..."));
67 connect(saveAction, &QAction::triggered,
this, &CodeDialog::slotSaveAs);
69#if QT_CONFIG(clipboard)
70 const QIcon copyIcon = createIconSet(QIcon::ThemeIcon::EditCopy,
72 QAction *copyAction = toolBar->addAction(copyIcon, tr(
"Copy All"));
73 connect(copyAction, &QAction::triggered,
this, &CodeDialog::copyAll);
76 toolBar->addAction(m_impl->m_findWidget->createFindAction(toolBar));
78 vBoxLayout->addWidget(toolBar);
81 m_impl->m_textEdit->setReadOnly(
true);
82 const auto font = QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont);
83 const int editorWidth = QFontMetrics(font,
this).averageCharWidth() * 100;
84 m_impl->m_textEdit->setFont(font);
85 m_impl->m_textEdit->setMinimumSize(QSize(
86 qMax(editorWidth, m_impl->m_findWidget->minimumSize().width()),
88 vBoxLayout->addWidget(m_impl->m_textEdit);
91 m_impl->m_findWidget->setTextEdit(m_impl->m_textEdit);
92 vBoxLayout->addWidget(m_impl->m_findWidget);
95 QDialogButtonBox *buttonBox =
new QDialogButtonBox(QDialogButtonBox::Close);
96 connect(buttonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject);
99 QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close);
100 closeButton->setAutoDefault(
false);
101 vBoxLayout->addWidget(buttonBox);
103 setLayout(vBoxLayout);
106CodeDialog::~CodeDialog()
111void CodeDialog::setCode(
const QString &code)
113 m_impl->m_textEdit->setPlainText(code);
116QString CodeDialog::code()
const
118 return m_impl->m_textEdit->toPlainText();
121void CodeDialog::setFormFileName(
const QString &f)
123 m_impl->m_formFileName = f;
126QString CodeDialog::formFileName()
const
128 return m_impl->m_formFileName;
131void CodeDialog::setMimeType(
const QString &m)
133 m_impl->m_mimeType = m;
136bool CodeDialog::generateCode(
const QDesignerFormWindowInterface *fw,
137 UicLanguage language,
139 QString *errorMessage)
143 QString tempPattern = QDir::tempPath();
144 if (!tempPattern.endsWith(QDir::separator()))
145 tempPattern += QDir::separator();
146 const QString fileName = fw->fileName();
147 if (fileName.isEmpty()) {
148 tempPattern +=
"designer"_L1;
150 tempPattern += QFileInfo(fileName).baseName();
152 tempPattern +=
"XXXXXX.ui"_L1;
154 QTemporaryFile tempFormFile(tempPattern);
156 tempFormFile.setAutoRemove(
true);
157 if (!tempFormFile.open()) {
158 *errorMessage = tr(
"A temporary form file could not be created in %1.").arg(QDir::tempPath());
161 const QString tempFormFileName = tempFormFile.fileName();
162 tempFormFile.write(fw->contents().toUtf8());
163 if (!tempFormFile.flush()) {
164 *errorMessage = tr(
"The temporary form file %1 could not be written.").arg(tempFormFileName);
167 tempFormFile.close();
170 if (!runUIC(tempFormFileName, language, rc, *errorMessage))
172 *code = QString::fromUtf8(rc);
176bool CodeDialog::showCodeDialog(
const QDesignerFormWindowInterface *fw,
177 UicLanguage language,
179 QString *errorMessage)
182 if (!generateCode(fw, language, &code, errorMessage))
185 auto dialog =
new CodeDialog(parent);
186 dialog->setModal(
false);
187 dialog->setAttribute(Qt::WA_DeleteOnClose);
188 dialog->setCode(code);
189 dialog->setFormFileName(fw->fileName());
190 QLatin1StringView languageName;
192 case UicLanguage::Cpp:
193 languageName =
"C++"_L1;
194 dialog->setMimeType(u"text/x-chdr"_s);
196 case UicLanguage::Python:
197 languageName =
"Python"_L1;
198 dialog->setMimeType(u"text/x-python"_s);
201 dialog->setWindowTitle(tr(
"%1 - [%2 Code]").
202 arg(fw->mainContainer()->windowTitle(), languageName));
207void CodeDialog::slotSaveAs()
210 QMimeDatabase mimeDb;
211 const QString suffix = mimeDb.mimeTypeForName(m_impl->m_mimeType).preferredSuffix();
214 QFileDialog fileDialog(
this, tr(
"Save Code"));
215 fileDialog.setMimeTypeFilters(QStringList(m_impl->m_mimeType));
216 fileDialog.setAcceptMode(QFileDialog::AcceptSave);
217 fileDialog.setDefaultSuffix(suffix);
218 const QString uiFile = formFileName();
219 if (!uiFile.isEmpty()) {
220 QFileInfo uiFi(uiFile);
221 fileDialog.setDirectory(uiFi.absolutePath());
222 fileDialog.selectFile(
"ui_"_L1 + uiFi.baseName()
227 if (fileDialog.exec() != QDialog::Accepted)
229 const QString fileName = fileDialog.selectedFiles().constFirst();
231 QFile file(fileName);
232 if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) {
233 warning(tr(
"The file %1 could not be opened: %2")
234 .arg(fileName, file.errorString()));
237 file.write(code().toUtf8());
239 warning(tr(
"The file %1 could not be written: %2")
240 .arg(fileName, file.errorString()));
248void CodeDialog::warning(
const QString &msg)
250 QMessageBox::warning(
251 this, tr(
"%1 - Error").arg(windowTitle()),
252 msg, QMessageBox::Close);
255#if QT_CONFIG(clipboard)
256void CodeDialog::copyAll()
258 QApplication::clipboard()->setText(code());
A search bar that is commonly added below the searchable text.
Combined button and popup list for selecting options.
TextEditFindWidget * m_findWidget