12#include <deviceskin_p.h>
14#include <QtDesigner/abstractformeditor.h>
15#include <QtDesigner/abstractformwindow.h>
16#include <QtDesigner/abstractformwindowmanager.h>
17#include <QtDesigner/abstractsettings.h>
19#include <QtWidgets/qapplication.h>
20#include <QtWidgets/qboxlayout.h>
21#include <QtWidgets/qdialog.h>
22#include <QtWidgets/qdockwidget.h>
23#include <QtWidgets/qmainwindow.h>
24#include <QtWidgets/qmenu.h>
26#include <QtGui/qaction.h>
27#include <QtGui/qactiongroup.h>
28#include <QtGui/qcursor.h>
29#include <QtGui/qevent.h>
30#include <QtGui/qpixmap.h>
31#include <QtGui/qscreen.h>
32#include <QtGui/qtransform.h>
34#include <QtCore/qdebug.h>
35#include <QtCore/qlist.h>
36#include <QtCore/qmap.h>
37#include <QtCore/qpointer.h>
38#include <QtCore/qshareddata.h>
42using namespace Qt::StringLiterals;
47 int rc = pc1.style().compare(pc2.style());
50 rc = pc1.applicationStyleSheet().compare(pc2.applicationStyleSheet());
53 return pc1.deviceSkin().compare(pc2.deviceSkin());
66 const QDesignerFormWindowInterface *formWindow,
75
76
83 QSizeF sizeHint(Qt::SizeHint which,
const QSizeF & constraint = QSizeF() )
const override;
87 ZoomProxyWidget(parent, wFlags)
93 if (
const QWidget *w = widget())
94 return QSizeF(w->size());
95 return ZoomProxyWidget::sizeHint(which, constraint);
105 Qt::WindowFlags wFlags = {})
const override;
134 void slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep);
135 void slotPopupMenu();
151 const QSize m_screenSize;
152 Direction m_direction;
154 QAction *m_directionUpAction;
155 QAction *m_directionLeftAction;
156 QAction *m_directionRightAction;
157 QAction *m_closeAction;
164 m_directionUpAction(
nullptr),
165 m_directionLeftAction(
nullptr),
166 m_directionRightAction(
nullptr),
167 m_closeAction(
nullptr)
169 connect(
this, &PreviewDeviceSkin::skinKeyPressEvent,
170 this, &PreviewDeviceSkin::slotSkinKeyPressEvent);
171 connect(
this, &PreviewDeviceSkin::skinKeyReleaseEvent,
172 this, &PreviewDeviceSkin::slotSkinKeyReleaseEvent);
173 connect(
this, &PreviewDeviceSkin::popupMenu,
this, &
PreviewDeviceSkin::slotPopupMenu);
178 formWidget->setFixedSize(m_screenSize);
179 formWidget->setParent(
this, Qt::SubWindow);
180 formWidget->setAutoFillBackground(
true);
184void PreviewDeviceSkin::slotSkinKeyPressEvent(
int code,
const QString& text,
bool autorep)
186 if (
QWidget *focusWidget = QApplication::focusWidget()) {
187 QKeyEvent e(QEvent::KeyPress, code, {}, text, autorep);
188 QApplication::sendEvent(focusWidget, &e);
192void PreviewDeviceSkin::slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep)
194 if (
QWidget *focusWidget = QApplication::focusWidget()) {
195 QKeyEvent e(QEvent::KeyRelease, code, {}, text, autorep);
196 QApplication::sendEvent(focusWidget, &e);
204 int actionValue,
int currentState,
205 QActionGroup *ag, QObject *parent)
207 QAction *a =
new QAction(label, parent);
208 a->setData(actionValue);
209 a->setCheckable(
true);
210 if (actionValue == currentState)
220 if (!m_directionUpAction) {
221 QActionGroup *directionGroup =
new QActionGroup(
this);
222 connect(directionGroup, &QActionGroup::triggered,
this, &PreviewDeviceSkin::slotDirection);
223 directionGroup->setExclusive(
true);
224 m_directionUpAction = createCheckableActionIntData(tr(
"&Portrait"), DirectionUp, m_direction, directionGroup,
this);
226 m_directionLeftAction = createCheckableActionIntData(tr(
"Landscape (&CCW)"), DirectionLeft, m_direction, directionGroup,
this);
228 m_directionRightAction = createCheckableActionIntData(tr(
"&Landscape (CW)"), DirectionRight, m_direction, directionGroup,
this);
229 m_closeAction =
new QAction(tr(
"&Close"),
this);
230 connect(m_closeAction, &QAction::triggered, parentWidget(), &QWidget::close);
232 menu.addAction(m_directionUpAction);
233 menu.addAction(m_directionLeftAction);
234 menu.addAction(m_directionRightAction);
237 menu.addAction(m_closeAction);
238 menu.exec(QCursor::pos());
262 view()->setFixedSize(size);
267 QTransform newTransform;
268 switch (m_direction) {
272 newTransform.rotate(270.0);
275 newTransform.rotate(90.0);
296 return lhs.m_style == rhs.m_style
297 && lhs.m_applicationStyleSheet == rhs.m_applicationStyleSheet
298 && lhs.m_deviceSkin == rhs.m_deviceSkin;
302 const PreviewConfiguration &rhs)
noexcept
304 const auto *lhsd = lhs.m_d.constData();
305 const auto *rhsd = rhs.m_d.constData();
306 return lhsd == rhsd || comparesEqual(*lhsd, *rhsd);
310 const PreviewConfiguration &rhs)
noexcept
313 return Qt::compareThreeWay(val, 0);
324
325
348 ZoomMenu *m_zoomMenu;
349 QAction *m_zoomSubMenuAction;
350 ZoomWidget *m_zoomWidget;
355 m_zoomMenu(
new ZoomMenu(
this)),
356 m_zoomSubMenuAction(
nullptr),
357 m_zoomWidget(
new DesignerZoomWidget)
359 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::setZoomPercent);
360 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::zoomPercentChanged);
361 m_zoomWidget->setZoomContextMenuEnabled(
false);
362 m_zoomWidget->setWidgetZoomContextMenuEnabled(
false);
363 m_zoomWidget->resize(screenSize());
364 m_zoomWidget->setParent(
this, Qt::SubWindow);
365 m_zoomWidget->setAutoFillBackground(
true);
371 return qreal(percent) / 100.0;
374static inline QSize
scaleSize(
int zoomPercent,
const QSize &size)
376 return zoomPercent == 100 ? size : (QSizeF(size) * zoomFactor(zoomPercent)).toSize();
381 m_zoomWidget->setWidget(formWidget);
382 m_zoomWidget->resize(scaleSize(zoomPercent(), screenSize()));
387 return m_zoomWidget->zoom();
396 if (m_zoomMenu->zoom() != zp)
397 m_zoomMenu->setZoom(zp);
399 QApplication::setOverrideCursor(Qt::WaitCursor);
400 m_zoomWidget->setZoom(zp);
401 setTransform(skinTransform());
402 QApplication::restoreOverrideCursor();
407 if (!m_zoomSubMenuAction) {
408 m_zoomSubMenuAction =
new QAction(tr(
"&Zoom"),
this);
409 QMenu *zoomSubMenu =
new QMenu;
410 m_zoomSubMenuAction->setMenu(zoomSubMenu);
411 m_zoomMenu->addActions(zoomSubMenu);
413 menu->addAction(m_zoomSubMenuAction);
414 menu->addSeparator();
420 QTransform rc = PreviewDeviceSkin::skinTransform();
423 const qreal factor = zoomFactor(zp);
424 rc.scale(factor, factor);
431 m_zoomWidget->resize(scaleSize(zoomPercent(), size));
600 if (QDockWidget *dock = qobject_cast<QDockWidget *>(w)) {
602 const QSize size = w->size();
603 w->setWindowModality(Qt::NonModal);
604 dock->setFeatures(dock->features() & ~(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable));
605 dock->setAllowedAreas(Qt::LeftDockWidgetArea);
606 QMainWindow *mw =
new QMainWindow;
607 const QMargins cm = mw->contentsMargins();
608 mw->addDockWidget(Qt::LeftDockWidgetArea, dock);
609 mw->resize(size + QSize(cm.left() + cm.right(), cm.top() + cm.bottom()));
618 const QDesignerSharedSettings settings(core);
619 if (settings.isCustomPreviewConfigurationEnabled())
620 pc = settings.customPreviewConfiguration();
621 if (!style.isEmpty())
818 if (
iw ==
nullptr ||
iw ==
w) {
909#include "previewmanager.moc"
QString m_applicationStyleSheet
PreviewConfigurationData(const QString &style, const QString &applicationStyleSheet, const QString &deviceSkin)
PreviewConfigurationData()=default
virtual void populateContextMenu(QMenu *)
virtual void setPreview(QWidget *w)
virtual void fitWidget(const QSize &size)
virtual QTransform skinTransform() const
PreviewDeviceSkin(const DeviceSkinParameters ¶meters, QWidget *parent)
PreviewManagerPrivate(PreviewManager::PreviewMode mode)
QPointer< QWidget > m_activePreview
QDesignerFormEditorInterface * m_core
PreviewDataList m_previews
QMap< QString, DeviceSkinParameters > m_deviceSkinConfigCache
void setPreview(QWidget *w) override
void populateContextMenu(QMenu *m) override
QTransform skinTransform() const override
void fitWidget(const QSize &size) override
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static PreviewConfiguration configurationFromSettings(QDesignerFormEditorInterface *core, const QString &style)
static constexpr auto skinKey
static constexpr auto appStyleSheetKey
static qreal zoomFactor(int percent)
static QAction * createCheckableActionIntData(const QString &label, int actionValue, int currentState, QActionGroup *ag, QObject *parent)
Qt::strong_ordering compareThreeWay(const PreviewConfiguration &lhs, const PreviewConfiguration &rhs) noexcept
static constexpr auto styleKey
static QWidget * fakeContainer(QWidget *w)
static QSize scaleSize(int zoomPercent, const QSize &size)
static bool comparesEqual(const PreviewConfigurationData &lhs, const PreviewConfigurationData &rhs) noexcept
bool comparesEqual(const PreviewConfiguration &lhs, const PreviewConfiguration &rhs) noexcept
static int compare(const qdesigner_internal::PreviewConfiguration &pc1, const qdesigner_internal::PreviewConfiguration &pc2) noexcept
PreviewData(const QPointer< QWidget > &widget, const QDesignerFormWindowInterface *formWindow, const qdesigner_internal::PreviewConfiguration &pc)
const QDesignerFormWindowInterface * m_formWindow
QPointer< QWidget > m_widget
qdesigner_internal::PreviewConfiguration m_configuration