Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
formwindowsettings.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5#include "ui_formwindowsettings.h"
6
7#include <formwindowbase_p.h>
8#include <grid_p.h>
9
10#include <QtWidgets/qstyle.h>
11
12#include <QtCore/qcompare.h>
13#include <QtCore/qregularexpression.h>
14#include <QtCore/qdebug.h>
15
16#include <algorithm>
17
18QT_BEGIN_NAMESPACE
19
20using namespace Qt::StringLiterals;
21
22namespace qdesigner_internal {
23
24// Data structure containing form dialog data providing comparison
26 void fromFormWindow(FormWindowBase* fw);
27 void applyToFormWindow(FormWindowBase* fw) const;
28
32
36
38
40
42
43 bool hasFormGrid{false};
44 Grid grid;
47
48 friend bool comparesEqual(const FormWindowData &lhs,
49 const FormWindowData &rhs) noexcept;
51};
52
53QDebug operator<<(QDebug str, const FormWindowData &d)
54{
55 str.nospace() << "LayoutDefault=" << d.layoutDefaultEnabled << ',' << d.defaultMargin
56 << ',' << d.defaultSpacing << " LayoutFunctions=" << d.layoutFunctionsEnabled << ','
57 << d.marginFunction << ',' << d.spacingFunction << " PixFunction="
58 << d.pixFunction << " Author=" << d.author << " Hints=" << d.includeHints
59 << " Grid=" << d.hasFormGrid << d.grid.deltaX() << d.grid.deltaY()
60 << " ID-based translations" << d.idBasedTranslations
61 << " Connect slots by name" << d.connectSlotsByName
62 << '\n';
63 return str;
64}
65
66bool comparesEqual(const FormWindowData &lhs, const FormWindowData &rhs) noexcept
67{
72 lhs.marginFunction == rhs.marginFunction &&
73 lhs.spacingFunction == rhs.spacingFunction &&
74 lhs.pixFunction == rhs.pixFunction &&
75 lhs.author == rhs.author &&
76 lhs.includeHints == rhs.includeHints &&
77 lhs.hasFormGrid == rhs.hasFormGrid &&
78 lhs.grid == rhs.grid &&
81}
82
83void FormWindowData::fromFormWindow(FormWindowBase* fw)
84{
85 defaultMargin = defaultSpacing = INT_MIN;
86 fw->layoutDefault(&defaultMargin, &defaultSpacing);
87
88 auto container = fw->formContainer();
89 QStyle *style = container->style();
90 layoutDefaultEnabled = defaultMargin != INT_MIN || defaultSpacing != INT_MIN;
91 if (defaultMargin == INT_MIN)
92 defaultMargin = style->pixelMetric(QStyle::PM_LayoutLeftMargin, nullptr, container);
93 if (defaultSpacing == INT_MIN)
94 defaultSpacing = style->pixelMetric(QStyle::PM_LayoutHorizontalSpacing, nullptr);
95
96
97 marginFunction.clear();
98 spacingFunction.clear();
99 fw->layoutFunction(&marginFunction, &spacingFunction);
100 layoutFunctionsEnabled = !marginFunction.isEmpty() || !spacingFunction.isEmpty();
101
102 pixFunction = fw->pixmapFunction();
103
104 author = fw->author();
105
106 includeHints = fw->includeHints();
107 includeHints.removeAll(QString());
108
109 hasFormGrid = fw->hasFormGrid();
110 grid = hasFormGrid ? fw->designerGrid() : FormWindowBase::defaultDesignerGrid();
111 idBasedTranslations = fw->useIdBasedTranslations();
112 connectSlotsByName = fw->connectSlotsByName();
113}
114
115void FormWindowData::applyToFormWindow(FormWindowBase* fw) const
116{
117 fw->setAuthor(author);
118 fw->setPixmapFunction(pixFunction);
119
121 fw->setLayoutDefault(defaultMargin, defaultSpacing);
122 } else {
123 fw->setLayoutDefault(INT_MIN, INT_MIN);
124 }
125
127 fw->setLayoutFunction(marginFunction, spacingFunction);
128 } else {
129 fw->setLayoutFunction(QString(), QString());
130 }
131
132 fw->setIncludeHints(includeHints);
133
134 const bool hadFormGrid = fw->hasFormGrid();
135 fw->setHasFormGrid(hasFormGrid);
136 if (hasFormGrid || hadFormGrid != hasFormGrid)
137 fw->setDesignerGrid(hasFormGrid ? grid : FormWindowBase::defaultDesignerGrid());
138 fw->setUseIdBasedTranslations(idBasedTranslations);
139 fw->setConnectSlotsByName(connectSlotsByName);
140}
141
142// -------------------------- FormWindowSettings
143
144FormWindowSettings::FormWindowSettings(QDesignerFormWindowInterface *parent) :
145 QDialog(parent),
146 m_ui(new QT_PREPEND_NAMESPACE(Ui)::FormWindowSettings),
147 m_formWindow(qobject_cast<FormWindowBase*>(parent)),
148 m_oldData(new FormWindowData)
149{
150 Q_ASSERT(m_formWindow);
151
152 m_ui->setupUi(this);
153 m_ui->gridPanel->setCheckable(true);
154 m_ui->gridPanel->setResetButtonVisible(false);
155
156 QString deviceProfileName = m_formWindow->deviceProfileName();
157 if (deviceProfileName.isEmpty())
158 deviceProfileName = tr("None");
159 m_ui->deviceProfileLabel->setText(tr("Device Profile: %1").arg(deviceProfileName));
160
161 m_oldData->fromFormWindow(m_formWindow);
162 setData(*m_oldData);
163}
164
166{
167 delete m_oldData;
168 delete m_ui;
169}
170
172{
174 rc.author = m_ui->authorLineEdit->text();
175
176 if (m_ui->pixmapFunctionGroupBox->isChecked()) {
177 rc.pixFunction = m_ui->pixmapFunctionLineEdit->text();
178 } else {
179 rc.pixFunction.clear();
180 }
181
182 rc.layoutDefaultEnabled = m_ui->layoutDefaultGroupBox->isChecked();
183 rc.defaultMargin = m_ui->defaultMarginSpinBox->value();
184 rc.defaultSpacing = m_ui->defaultSpacingSpinBox->value();
185
186 rc.layoutFunctionsEnabled = m_ui->layoutFunctionGroupBox->isChecked();
187 rc.marginFunction = m_ui->marginFunctionLineEdit->text();
188 rc.spacingFunction = m_ui->spacingFunctionLineEdit->text();
189
190 const QString hints = m_ui->includeHintsTextEdit->toPlainText();
191 if (!hints.isEmpty()) {
192 rc.includeHints = hints.split(u'\n');
193 // Purge out any lines consisting of blanks only
194 const QRegularExpression blankLine(u"^\\s*$"_s);
195 Q_ASSERT(blankLine.isValid());
196 rc.includeHints.erase(std::remove_if(rc.includeHints.begin(), rc.includeHints.end(),
197 [blankLine](const QString &hint){ return blankLine.match(hint).hasMatch(); }),
198 rc.includeHints.end());
199 }
200
201 rc.hasFormGrid = m_ui->gridPanel->isChecked();
202 rc.grid = m_ui->gridPanel->grid();
203 rc.idBasedTranslations = m_ui->idBasedTranslationsCheckBox->isChecked();
204 rc.connectSlotsByName = m_ui->connectSlotsByNameCheckBox->isChecked();
205 return rc;
206}
207
208void FormWindowSettings::setData(const FormWindowData &data)
209{
210 m_ui->layoutDefaultGroupBox->setChecked(data.layoutDefaultEnabled);
211 m_ui->defaultMarginSpinBox->setValue(data.defaultMargin);
212 m_ui->defaultSpacingSpinBox->setValue(data.defaultSpacing);
213
214 m_ui->layoutFunctionGroupBox->setChecked(data.layoutFunctionsEnabled);
215 m_ui->marginFunctionLineEdit->setText(data.marginFunction);
216 m_ui->spacingFunctionLineEdit->setText(data.spacingFunction);
217
218 m_ui->pixmapFunctionLineEdit->setText(data.pixFunction);
219 m_ui->pixmapFunctionGroupBox->setChecked(!data.pixFunction.isEmpty());
220
221 m_ui->authorLineEdit->setText(data.author);
222
223 if (data.includeHints.isEmpty()) {
224 m_ui->includeHintsTextEdit->clear();
225 } else {
226 m_ui->includeHintsTextEdit->setText(data.includeHints.join(u'\n'));
227 }
228
229 m_ui->gridPanel->setChecked(data.hasFormGrid);
230 m_ui->gridPanel->setGrid(data.grid);
231 m_ui->idBasedTranslationsCheckBox->setChecked(data.idBasedTranslations);
232 m_ui->connectSlotsByNameCheckBox->setChecked(data.connectSlotsByName);
233}
234
236{
237 // Anything changed? -> Apply and set dirty
238 const FormWindowData newData = data();
239 if (newData != *m_oldData) {
240 newData.applyToFormWindow(m_formWindow);
241 m_formWindow->setDirty(true);
242 }
243
244 QDialog::accept();
245}
246}
247QT_END_NAMESPACE
void accept() override
Hides the modal dialog and sets the result code to Accepted.
Auxiliary methods to store/retrieve settings.
QDebug operator<<(QDebug str, const FormWindowData &d)
void applyToFormWindow(FormWindowBase *fw) const
void fromFormWindow(FormWindowBase *fw)
friend bool comparesEqual(const FormWindowData &lhs, const FormWindowData &rhs) noexcept