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;
45 int rc = pc1.style().compare(pc2.style());
48 rc = pc1.applicationStyleSheet().compare(pc2.applicationStyleSheet());
51 return pc1.deviceSkin().compare(pc2.deviceSkin());
64 const QDesignerFormWindowInterface *formWindow,
73
74
81 QSizeF sizeHint(Qt::SizeHint which,
const QSizeF & constraint = QSizeF() )
const override;
85 ZoomProxyWidget(parent, wFlags)
91 if (
const QWidget *w = widget())
92 return QSizeF(w->size());
93 return ZoomProxyWidget::sizeHint(which, constraint);
103 Qt::WindowFlags wFlags = {})
const override;
132 void slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep);
133 void slotPopupMenu();
149 const QSize m_screenSize;
150 Direction m_direction;
152 QAction *m_directionUpAction;
153 QAction *m_directionLeftAction;
154 QAction *m_directionRightAction;
155 QAction *m_closeAction;
162 m_directionUpAction(
nullptr),
163 m_directionLeftAction(
nullptr),
164 m_directionRightAction(
nullptr),
165 m_closeAction(
nullptr)
167 connect(
this, &PreviewDeviceSkin::skinKeyPressEvent,
168 this, &PreviewDeviceSkin::slotSkinKeyPressEvent);
169 connect(
this, &PreviewDeviceSkin::skinKeyReleaseEvent,
170 this, &PreviewDeviceSkin::slotSkinKeyReleaseEvent);
171 connect(
this, &PreviewDeviceSkin::popupMenu,
this, &PreviewDeviceSkin::slotPopupMenu);
176 formWidget->setFixedSize(m_screenSize);
177 formWidget->setParent(
this, Qt::SubWindow);
178 formWidget->setAutoFillBackground(
true);
182void PreviewDeviceSkin::slotSkinKeyPressEvent(
int code,
const QString& text,
bool autorep)
184 if (
QWidget *focusWidget = QApplication::focusWidget()) {
185 QKeyEvent e(QEvent::KeyPress, code, {}, text, autorep);
186 QApplication::sendEvent(focusWidget, &e);
190void PreviewDeviceSkin::slotSkinKeyReleaseEvent(
int code,
const QString& text,
bool autorep)
192 if (
QWidget *focusWidget = QApplication::focusWidget()) {
193 QKeyEvent e(QEvent::KeyRelease, code, {}, text, autorep);
194 QApplication::sendEvent(focusWidget, &e);
202 int actionValue,
int currentState,
203 QActionGroup *ag, QObject *parent)
205 QAction *a =
new QAction(label, parent);
206 a->setData(actionValue);
207 a->setCheckable(
true);
208 if (actionValue == currentState)
218 if (!m_directionUpAction) {
219 QActionGroup *directionGroup =
new QActionGroup(
this);
220 connect(directionGroup, &QActionGroup::triggered,
this, &PreviewDeviceSkin::slotDirection);
221 directionGroup->setExclusive(
true);
222 m_directionUpAction = createCheckableActionIntData(tr(
"&Portrait"), DirectionUp, m_direction, directionGroup,
this);
224 m_directionLeftAction = createCheckableActionIntData(tr(
"Landscape (&CCW)"), DirectionLeft, m_direction, directionGroup,
this);
226 m_directionRightAction = createCheckableActionIntData(tr(
"&Landscape (CW)"), DirectionRight, m_direction, directionGroup,
this);
227 m_closeAction =
new QAction(tr(
"&Close"),
this);
228 connect(m_closeAction, &QAction::triggered, parentWidget(), &QWidget::close);
230 menu.addAction(m_directionUpAction);
231 menu.addAction(m_directionLeftAction);
232 menu.addAction(m_directionRightAction);
235 menu.addAction(m_closeAction);
236 menu.exec(QCursor::pos());
241 const Direction newDirection =
static_cast<Direction>(a->data().toInt());
242 if (m_direction == newDirection)
244 const Qt::Orientation newOrientation = newDirection == DirectionUp ? Qt::Vertical : Qt::Horizontal;
245 const Qt::Orientation oldOrientation = m_direction == DirectionUp ? Qt::Vertical : Qt::Horizontal;
246 m_direction = newDirection;
247 QApplication::setOverrideCursor(Qt::WaitCursor);
248 if (oldOrientation != newOrientation) {
249 QSize size = screenSize();
250 if (newOrientation == Qt::Horizontal)
254 setTransform(skinTransform());
255 QApplication::restoreOverrideCursor();
260 view()->setFixedSize(size);
265 QTransform newTransform;
266 switch (m_direction) {
270 newTransform.rotate(270.0);
273 newTransform.rotate(90.0);
299
300
323 ZoomMenu *m_zoomMenu;
324 QAction *m_zoomSubMenuAction;
325 ZoomWidget *m_zoomWidget;
330 m_zoomMenu(
new ZoomMenu(
this)),
331 m_zoomSubMenuAction(
nullptr),
332 m_zoomWidget(
new DesignerZoomWidget)
334 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::setZoomPercent);
335 connect(m_zoomMenu, &ZoomMenu::zoomChanged,
this, &ZoomablePreviewDeviceSkin::zoomPercentChanged);
336 m_zoomWidget->setZoomContextMenuEnabled(
false);
337 m_zoomWidget->setWidgetZoomContextMenuEnabled(
false);
338 m_zoomWidget->resize(screenSize());
339 m_zoomWidget->setParent(
this, Qt::SubWindow);
340 m_zoomWidget->setAutoFillBackground(
true);
341 setView(m_zoomWidget);
346 return qreal(percent) / 100.0;
349static inline QSize
scaleSize(
int zoomPercent,
const QSize &size)
351 return zoomPercent == 100 ? size : (QSizeF(size) * zoomFactor(zoomPercent)).toSize();
356 m_zoomWidget->setWidget(formWidget);
357 m_zoomWidget->resize(scaleSize(zoomPercent(), screenSize()));
362 return m_zoomWidget->zoom();
371 if (m_zoomMenu->zoom() != zp)
372 m_zoomMenu->setZoom(zp);
374 QApplication::setOverrideCursor(Qt::WaitCursor);
375 m_zoomWidget->setZoom(zp);
376 setTransform(skinTransform());
377 QApplication::restoreOverrideCursor();
382 if (!m_zoomSubMenuAction) {
383 m_zoomSubMenuAction =
new QAction(tr(
"&Zoom"),
this);
384 QMenu *zoomSubMenu =
new QMenu;
385 m_zoomSubMenuAction->setMenu(zoomSubMenu);
386 m_zoomMenu->addActions(zoomSubMenu);
388 menu->addAction(m_zoomSubMenuAction);
389 menu->addSeparator();
395 QTransform rc = PreviewDeviceSkin::skinTransform();
398 const qreal factor = zoomFactor(zp);
399 rc.scale(factor, factor);
406 m_zoomWidget->resize(scaleSize(zoomPercent(), size));
591 if (QDockWidget *dock = qobject_cast<QDockWidget *>(w)) {
593 const QSize size = w->size();
594 w->setWindowModality(Qt::NonModal);
595 dock->setFeatures(dock->features() & ~(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable));
596 dock->setAllowedAreas(Qt::LeftDockWidgetArea);
597 QMainWindow *mw =
new QMainWindow;
598 const QMargins cm = mw->contentsMargins();
599 mw->addDockWidget(Qt::LeftDockWidgetArea, dock);
600 mw->resize(size + QSize(cm.left() + cm.right(), cm.top() + cm.bottom()));
609 const QDesignerSharedSettings settings(core);
610 if (settings.isCustomPreviewConfigurationEnabled())
611 pc = settings.customPreviewConfiguration();
612 if (!style.isEmpty())
809 if (
iw ==
nullptr ||
iw ==
w) {
900#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)
QDESIGNER_SHARED_EXPORT bool operator==(const PreviewConfiguration &pc1, const PreviewConfiguration &pc2)
static constexpr auto styleKey
QDESIGNER_SHARED_EXPORT bool operator!=(const PreviewConfiguration &pc1, const PreviewConfiguration &pc2)
static QWidget * fakeContainer(QWidget *w)
QDESIGNER_SHARED_EXPORT bool operator<(const PreviewConfiguration &pc1, const PreviewConfiguration &pc2)
static QSize scaleSize(int zoomPercent, const QSize &size)
static int compare(const qdesigner_internal::PreviewConfiguration &pc1, const qdesigner_internal::PreviewConfiguration &pc2)
#define QDESIGNER_SHARED_EXPORT
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