11#include <deviceskin_p.h>
13#include <QtDesigner/abstractformeditor.h>
14#include <QtDesigner/abstractformwindow.h>
15#include <QtDesigner/abstractformwindowmanager.h>
16#include <QtDesigner/abstractsettings.h>
18#include <QtWidgets/qapplication.h>
19#include <QtWidgets/qboxlayout.h>
20#include <QtWidgets/qdialog.h>
21#include <QtWidgets/qdockwidget.h>
22#include <QtWidgets/qmainwindow.h>
23#include <QtWidgets/qmenu.h>
25#include <QtGui/qaction.h>
26#include <QtGui/qactiongroup.h>
27#include <QtGui/qcursor.h>
28#include <QtGui/qevent.h>
29#include <QtGui/qpixmap.h>
30#include <QtGui/qscreen.h>
31#include <QtGui/qtransform.h>
33#include <QtCore/qdebug.h>
34#include <QtCore/qlist.h>
35#include <QtCore/qmap.h>
36#include <QtCore/qpointer.h>
37#include <QtCore/qshareddata.h>
41using namespace Qt::StringLiterals;
46 int rc = pc1.style().compare(pc2.style());
49 rc = pc1.applicationStyleSheet().compare(pc2.applicationStyleSheet());
52 return pc1.deviceSkin().compare(pc2.deviceSkin());
65 const QDesignerFormWindowInterface *formWindow,
74
75
82 QSizeF sizeHint(Qt::SizeHint which,
const QSizeF & constraint = QSizeF() )
const override;
86 ZoomProxyWidget(parent, wFlags)
92 if (
const QWidget *w = widget())
93 return QSizeF(w->size());
94 return ZoomProxyWidget::sizeHint(which, constraint);
104 Qt::WindowFlags wFlags = {})
const override;
133 void slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep);
134 void slotPopupMenu();
150 const QSize m_screenSize;
151 Direction m_direction;
153 QAction *m_directionUpAction;
154 QAction *m_directionLeftAction;
155 QAction *m_directionRightAction;
156 QAction *m_closeAction;
163 m_directionUpAction(
nullptr),
164 m_directionLeftAction(
nullptr),
165 m_directionRightAction(
nullptr),
166 m_closeAction(
nullptr)
168 connect(
this, &PreviewDeviceSkin::skinKeyPressEvent,
169 this, &PreviewDeviceSkin::slotSkinKeyPressEvent);
170 connect(
this, &PreviewDeviceSkin::skinKeyReleaseEvent,
171 this, &PreviewDeviceSkin::slotSkinKeyReleaseEvent);
172 connect(
this, &PreviewDeviceSkin::popupMenu,
this, &PreviewDeviceSkin::slotPopupMenu);
177 formWidget->setFixedSize(m_screenSize);
178 formWidget->setParent(
this, Qt::SubWindow);
179 formWidget->setAutoFillBackground(
true);
183void PreviewDeviceSkin::slotSkinKeyPressEvent(
int code,
const QString& text,
bool autorep)
185 if (
QWidget *focusWidget = QApplication::focusWidget()) {
186 QKeyEvent e(QEvent::KeyPress, code, {}, text, autorep);
187 QApplication::sendEvent(focusWidget, &e);
191void PreviewDeviceSkin::slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep)
193 if (
QWidget *focusWidget = QApplication::focusWidget()) {
194 QKeyEvent e(QEvent::KeyRelease, code, {}, text, autorep);
195 QApplication::sendEvent(focusWidget, &e);
203 int actionValue,
int currentState,
204 QActionGroup *ag, QObject *parent)
206 QAction *a =
new QAction(label, parent);
207 a->setData(actionValue);
208 a->setCheckable(
true);
209 if (actionValue == currentState)
219 if (!m_directionUpAction) {
220 QActionGroup *directionGroup =
new QActionGroup(
this);
221 connect(directionGroup, &QActionGroup::triggered,
this, &PreviewDeviceSkin::slotDirection);
222 directionGroup->setExclusive(
true);
223 m_directionUpAction = createCheckableActionIntData(tr(
"&Portrait"), DirectionUp, m_direction, directionGroup,
this);
225 m_directionLeftAction = createCheckableActionIntData(tr(
"Landscape (&CCW)"), DirectionLeft, m_direction, directionGroup,
this);
227 m_directionRightAction = createCheckableActionIntData(tr(
"&Landscape (CW)"), DirectionRight, m_direction, directionGroup,
this);
228 m_closeAction =
new QAction(tr(
"&Close"),
this);
229 connect(m_closeAction, &QAction::triggered, parentWidget(), &QWidget::close);
231 menu.addAction(m_directionUpAction);
232 menu.addAction(m_directionLeftAction);
233 menu.addAction(m_directionRightAction);
236 menu.addAction(m_closeAction);
237 menu.exec(QCursor::pos());
242 const Direction newDirection =
static_cast<Direction>(a->data().toInt());
243 if (m_direction == newDirection)
245 const Qt::Orientation newOrientation = newDirection == DirectionUp ? Qt::Vertical : Qt::Horizontal;
246 const Qt::Orientation oldOrientation = m_direction == DirectionUp ? Qt::Vertical : Qt::Horizontal;
247 m_direction = newDirection;
248 QApplication::setOverrideCursor(Qt::WaitCursor);
249 if (oldOrientation != newOrientation) {
250 QSize size = screenSize();
251 if (newOrientation == Qt::Horizontal)
255 setTransform(skinTransform());
256 QApplication::restoreOverrideCursor();
261 view()->setFixedSize(size);
266 QTransform newTransform;
267 switch (m_direction) {
271 newTransform.rotate(270.0);
274 newTransform.rotate(90.0);
295 return lhs.m_style == rhs.m_style
296 && lhs.m_applicationStyleSheet == rhs.m_applicationStyleSheet
297 && lhs.m_deviceSkin == rhs.m_deviceSkin;
301 const PreviewConfiguration &rhs)
noexcept
303 const auto *lhsd = lhs.m_d.constData();
304 const auto *rhsd = rhs.m_d.constData();
305 return lhsd == rhsd || comparesEqual(*lhsd, *rhsd);
309 const PreviewConfiguration &rhs)
noexcept
312 return Qt::compareThreeWay(val, 0);
323
324
347 ZoomMenu *m_zoomMenu;
348 QAction *m_zoomSubMenuAction;
349 ZoomWidget *m_zoomWidget;
354 m_zoomMenu(
new ZoomMenu(
this)),
355 m_zoomSubMenuAction(
nullptr),
356 m_zoomWidget(
new DesignerZoomWidget)
358 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::setZoomPercent);
359 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::zoomPercentChanged);
360 m_zoomWidget->setZoomContextMenuEnabled(
false);
361 m_zoomWidget->setWidgetZoomContextMenuEnabled(
false);
362 m_zoomWidget->resize(screenSize());
363 m_zoomWidget->setParent(
this, Qt::SubWindow);
364 m_zoomWidget->setAutoFillBackground(
true);
365 setView(m_zoomWidget);
370 return qreal(percent) / 100.0;
373static inline QSize
scaleSize(
int zoomPercent,
const QSize &size)
375 return zoomPercent == 100 ? size : (QSizeF(size) * zoomFactor(zoomPercent)).toSize();
380 m_zoomWidget->setWidget(formWidget);
381 m_zoomWidget->resize(scaleSize(zoomPercent(), screenSize()));
386 return m_zoomWidget->zoom();
395 if (m_zoomMenu->zoom() != zp)
396 m_zoomMenu->setZoom(zp);
398 QApplication::setOverrideCursor(Qt::WaitCursor);
399 m_zoomWidget->setZoom(zp);
400 setTransform(skinTransform());
401 QApplication::restoreOverrideCursor();
406 if (!m_zoomSubMenuAction) {
407 m_zoomSubMenuAction =
new QAction(tr(
"&Zoom"),
this);
408 QMenu *zoomSubMenu =
new QMenu;
409 m_zoomSubMenuAction->setMenu(zoomSubMenu);
410 m_zoomMenu->addActions(zoomSubMenu);
412 menu->addAction(m_zoomSubMenuAction);
413 menu->addSeparator();
419 QTransform rc = PreviewDeviceSkin::skinTransform();
422 const qreal factor = zoomFactor(zp);
423 rc.scale(factor, factor);
430 m_zoomWidget->resize(scaleSize(zoomPercent(), size));
599 if (QDockWidget *dock = qobject_cast<QDockWidget *>(w)) {
601 const QSize size = w->size();
602 w->setWindowModality(Qt::NonModal);
603 dock->setFeatures(dock->features() & ~(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable));
604 dock->setAllowedAreas(Qt::LeftDockWidgetArea);
605 QMainWindow *mw =
new QMainWindow;
606 const QMargins cm = mw->contentsMargins();
607 mw->addDockWidget(Qt::LeftDockWidgetArea, dock);
608 mw->resize(size + QSize(cm.left() + cm.right(), cm.top() + cm.bottom()));
617 const QDesignerSharedSettings settings(core);
618 if (settings.isCustomPreviewConfigurationEnabled())
619 pc = settings.customPreviewConfiguration();
620 if (!style.isEmpty())
817 if (
iw ==
nullptr ||
iw ==
w) {
908#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
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