9#include <texteditfindwidget_p.h>
11#include <QtWidgets/qapplication.h>
12#if QT_CONFIG(clipboard)
13#include <QtGui/qclipboard.h>
15#include <QtWidgets/qdialogbuttonbox.h>
16#include <QtWidgets/qfiledialog.h>
17#include <QtWidgets/qmessagebox.h>
18#include <QtWidgets/qpushbutton.h>
19#include <QtWidgets/qtextedit.h>
20#include <QtWidgets/qtoolbar.h>
21#include <QtWidgets/qboxlayout.h>
23#include <QtGui/qaction.h>
24#include <QtGui/qevent.h>
25#include <QtGui/qfontdatabase.h>
26#include <QtGui/qfontmetrics.h>
27#include <QtGui/qicon.h>
29#include <QtCore/qdebug.h>
30#include <QtCore/qdir.h>
31#include <QtCore/qmimedatabase.h>
32#include <QtCore/qtemporaryfile.h>
36using namespace Qt::StringLiterals;
38namespace qdesigner_internal {
49CodeDialog::CodeDialogPrivate::CodeDialogPrivate()
50 : m_textEdit(
new QTextEdit)
51 , m_findWidget(
new TextEditFindWidget)
58 m_impl(
new CodeDialogPrivate)
60 QVBoxLayout *vBoxLayout =
new QVBoxLayout;
63 QToolBar *toolBar =
new QToolBar;
65 const QIcon saveIcon = createIconSet(QIcon::ThemeIcon::DocumentSave,
67 QAction *saveAction = toolBar->addAction(saveIcon, tr(
"Save..."));
68 connect(saveAction, &QAction::triggered,
this, &CodeDialog::slotSaveAs);
70#if QT_CONFIG(clipboard)
71 const QIcon copyIcon = createIconSet(QIcon::ThemeIcon::EditCopy,
73 QAction *copyAction = toolBar->addAction(copyIcon, tr(
"Copy All"));
74 connect(copyAction, &QAction::triggered,
this, &CodeDialog::copyAll);
77 toolBar->addAction(m_impl->m_findWidget->createFindAction(toolBar));
79 vBoxLayout->addWidget(toolBar);
82 m_impl->m_textEdit->setReadOnly(
true);
83 const auto font = QFontDatabase::systemFont(QFontDatabase::SystemFont::FixedFont);
84 const int editorWidth = QFontMetrics(font,
this).averageCharWidth() * 100;
85 m_impl->m_textEdit->setFont(font);
86 m_impl->m_textEdit->setMinimumSize(QSize(
87 qMax(editorWidth, m_impl->m_findWidget->minimumSize().width()),
89 vBoxLayout->addWidget(m_impl->m_textEdit);
92 m_impl->m_findWidget->setTextEdit(m_impl->m_textEdit);
93 vBoxLayout->addWidget(m_impl->m_findWidget);
96 QDialogButtonBox *buttonBox =
new QDialogButtonBox(QDialogButtonBox::Close);
97 connect(buttonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject);
100 QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close);
101 closeButton->setAutoDefault(
false);
102 vBoxLayout->addWidget(buttonBox);
104 setLayout(vBoxLayout);
107CodeDialog::~CodeDialog()
112void CodeDialog::setCode(
const QString &code)
114 m_impl->m_textEdit->setPlainText(code);
117QString CodeDialog::code()
const
119 return m_impl->m_textEdit->toPlainText();
122void CodeDialog::setFormFileName(
const QString &f)
124 m_impl->m_formFileName = f;
127QString CodeDialog::formFileName()
const
129 return m_impl->m_formFileName;
132void CodeDialog::setMimeType(
const QString &m)
134 m_impl->m_mimeType = m;
137bool CodeDialog::generateCode(
const QDesignerFormWindowInterface *fw,
138 UicLanguage language,
140 QString *errorMessage)
144 QString tempPattern = QDir::tempPath();
145 if (!tempPattern.endsWith(QDir::separator()))
146 tempPattern += QDir::separator();
147 const QString fileName = fw->fileName();
148 if (fileName.isEmpty()) {
149 tempPattern +=
"designer"_L1;
151 tempPattern += QFileInfo(fileName).baseName();
153 tempPattern +=
"XXXXXX.ui"_L1;
155 QTemporaryFile tempFormFile(tempPattern);
157 tempFormFile.setAutoRemove(
true);
158 if (!tempFormFile.open()) {
159 *errorMessage = tr(
"A temporary form file could not be created in %1.").arg(QDir::tempPath());
162 const QString tempFormFileName = tempFormFile.fileName();
163 tempFormFile.write(fw->contents().toUtf8());
164 if (!tempFormFile.flush()) {
165 *errorMessage = tr(
"The temporary form file %1 could not be written.").arg(tempFormFileName);
168 tempFormFile.close();
171 if (!runUIC(tempFormFileName, language, rc, *errorMessage))
173 *code = QString::fromUtf8(rc);
177bool CodeDialog::showCodeDialog(
const QDesignerFormWindowInterface *fw,
178 UicLanguage language,
180 QString *errorMessage)
183 if (!generateCode(fw, language, &code, errorMessage))
186 auto dialog =
new CodeDialog(parent);
187 dialog->setModal(
false);
188 dialog->setAttribute(Qt::WA_DeleteOnClose);
189 dialog->setCode(code);
190 dialog->setFormFileName(fw->fileName());
191 QLatin1StringView languageName;
193 case UicLanguage::Cpp:
194 languageName =
"C++"_L1;
195 dialog->setMimeType(u"text/x-chdr"_s);
197 case UicLanguage::Python:
198 languageName =
"Python"_L1;
199 dialog->setMimeType(u"text/x-python"_s);
202 dialog->setWindowTitle(tr(
"%1 - [%2 Code]").
203 arg(fw->mainContainer()->windowTitle(), languageName));
208void CodeDialog::slotSaveAs()
211 QMimeDatabase mimeDb;
212 const QString suffix = mimeDb.mimeTypeForName(m_impl->m_mimeType).preferredSuffix();
215 QFileDialog fileDialog(
this, tr(
"Save Code"));
216 fileDialog.setMimeTypeFilters(QStringList(m_impl->m_mimeType));
217 fileDialog.setAcceptMode(QFileDialog::AcceptSave);
218 fileDialog.setDefaultSuffix(suffix);
219 const QString uiFile = formFileName();
220 if (!uiFile.isEmpty()) {
221 QFileInfo uiFi(uiFile);
222 fileDialog.setDirectory(uiFi.absolutePath());
223 fileDialog.selectFile(
"ui_"_L1 + uiFi.baseName()
228 if (fileDialog.exec() != QDialog::Accepted)
230 const QString fileName = fileDialog.selectedFiles().constFirst();
232 QFile file(fileName);
233 if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) {
234 warning(tr(
"The file %1 could not be opened: %2")
235 .arg(fileName, file.errorString()));
238 file.write(code().toUtf8());
240 warning(tr(
"The file %1 could not be written: %2")
241 .arg(fileName, file.errorString()));
249void CodeDialog::warning(
const QString &msg)
251 QMessageBox::warning(
252 this, tr(
"%1 - Error").arg(windowTitle()),
253 msg, QMessageBox::Close);
256#if QT_CONFIG(clipboard)
257void CodeDialog::copyAll()
259 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