KWin
Loading...
Searching...
No Matches
screenpreviewwidget.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2009 Marco Martin <notmart@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
8
9#include <QPaintEvent>
10#include <QPainter>
11#include <QResizeEvent>
12
13#include <QDebug>
14#include <QMimeData>
15
16#include <KSvg/FrameSvg>
17#include <KSvg/ImageSet>
18
19#include <memory>
20
22{
23public:
25 : q(screen)
26 , ratio(1)
28 {
29 }
30
34
35 void updateRect(const QRectF &rect)
36 {
37 q->update(rect.toRect());
38 }
39
41 {
42 int bottomElements = screenGraphics->elementSize("base").height() + screenGraphics->marginSize(KSvg::FrameSvg::BottomMargin);
43 QRect bounds(QPoint(0, 0), QSize(q->width(), q->height() - bottomElements));
44
45 QSizeF monitorSize(1.0, 1.0 / ratio);
46 monitorSize.scale(bounds.size(), Qt::KeepAspectRatio);
47
48 if (monitorSize.isEmpty()) {
49 return;
50 }
51
52 const auto minFrameWidth = minimumContentWidth + screenGraphics->marginSize(KSvg::FrameSvg::LeftMargin) + screenGraphics->marginSize(KSvg::FrameSvg::RightMargin);
53 if (monitorSize.width() < minFrameWidth) {
54 monitorSize.setWidth(minFrameWidth);
55 }
56
57 monitorRect = QRect(QPoint(0, 0), monitorSize.toSize());
58 monitorRect.moveCenter(bounds.center());
59
60 screenGraphics->resizeFrame(monitorRect.size());
61
62 previewRect = screenGraphics->contentsRect().toRect();
63 previewRect.moveCenter(bounds.center());
64 }
65
67 std::unique_ptr<KSvg::ImageSet> svgImageSet;
68 KSvg::FrameSvg *screenGraphics;
69 QPixmap preview;
71 qreal ratio;
74};
75
77 : QWidget(parent)
78 , d(std::make_unique<ScreenPreviewWidgetPrivate>(this))
79{
80 d->svgImageSet = std::make_unique<KSvg::ImageSet>();
81 d->svgImageSet->setBasePath("plasma/desktoptheme");
82 d->screenGraphics = new KSvg::FrameSvg(this);
83 d->screenGraphics->setImageSet(d->svgImageSet.get());
84 d->screenGraphics->setImagePath("widgets/monitor");
85 d->updateScreenGraphics();
86}
87
89
90void ScreenPreviewWidget::setPreview(const QPixmap &preview)
91{
92 d->preview = preview;
93
94 update();
95}
96
97const QPixmap ScreenPreviewWidget::preview() const
98{
99 return d->preview;
100}
101
102void ScreenPreviewWidget::setRatio(const qreal ratio)
103{
104 d->ratio = ratio;
105 d->updateScreenGraphics();
106}
107
109{
110 return d->ratio;
111}
112
114{
115 d->minimumContentWidth = minw;
116 d->updateScreenGraphics();
117}
118
120{
121 return d->minimumContentWidth;
122}
123
125{
126 return d->previewRect;
127}
128
129KSvg::ImageSet *ScreenPreviewWidget::svgImageSet() const
130{
131 return d->svgImageSet.get();
132}
133
135{
136 d->updateScreenGraphics();
137}
138
139void ScreenPreviewWidget::paintEvent(QPaintEvent *event)
140{
141 if (d->monitorRect.size().isEmpty()) {
142 return;
143 }
144
145 QPainter painter(this);
146 QPoint standPosition(d->monitorRect.center().x() - d->screenGraphics->elementSize("base").width() / 2, d->previewRect.bottom());
147
148 d->screenGraphics->paint(&painter, QRect(standPosition, d->screenGraphics->elementSize("base").toSize()), "base");
149 d->screenGraphics->paintFrame(&painter, d->monitorRect.topLeft());
150
151 painter.save();
152 if (!d->preview.isNull()) {
153 painter.setRenderHint(QPainter::SmoothPixmapTransform);
154 painter.drawPixmap(d->previewRect, d->preview, d->preview.rect());
155 }
156 painter.restore();
157
158 d->screenGraphics->paint(&painter, d->previewRect, "glass");
159}
160
161#include "moc_screenpreviewwidget.cpp"
void setRatio(const qreal ratio)
void resizeEvent(QResizeEvent *event) override
void setMinimumContentWidth(qreal minw)
const QPixmap preview() const
~ScreenPreviewWidget() override
void paintEvent(QPaintEvent *event) override
ScreenPreviewWidget(QWidget *parent)
KSvg::ImageSet * svgImageSet() const
void setPreview(const QPixmap &preview)
std::unique_ptr< KSvg::ImageSet > svgImageSet
void updateRect(const QRectF &rect)
ScreenPreviewWidgetPrivate(ScreenPreviewWidget *screen)