KWin
Loading...
Searching...
No Matches
previewbutton.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5*/
6#include "previewbutton.h"
7#include "previewbridge.h"
8#include "previewclient.h"
9#include "previewsettings.h"
10
11#include <KDecoration2/Decoration>
12
13#include <QPainter>
14
15namespace KDecoration2
16{
17
18namespace Preview
19{
20
22 : QQuickPaintedItem(parent)
23{
24}
25
27
29{
30 setType(KDecoration2::DecorationButtonType(type));
31}
32
33void PreviewButtonItem::setType(KDecoration2::DecorationButtonType type)
34{
35 if (m_type == type) {
36 return;
37 }
38 m_type = type;
39 Q_EMIT typeChanged();
40}
41
42KDecoration2::DecorationButtonType PreviewButtonItem::type() const
43{
44 return m_type;
45}
46
48{
49 return m_bridge.data();
50}
51
53{
54 if (m_bridge == bridge) {
55 return;
56 }
57 m_bridge = bridge;
58 Q_EMIT bridgeChanged();
59}
60
62{
63 return m_settings.data();
64}
65
67{
68 if (m_settings == settings) {
69 return;
70 }
71 m_settings = settings;
72 Q_EMIT settingsChanged();
73}
74
76{
77 return int(m_type);
78}
79
81{
82 QQuickPaintedItem::componentComplete();
83 createButton();
84}
85
86void PreviewButtonItem::createButton()
87{
88 if (m_type == KDecoration2::DecorationButtonType::Custom || m_decoration || !m_settings || !m_bridge) {
89 return;
90 }
91 m_decoration = m_bridge->createDecoration(this);
92 if (!m_decoration) {
93 return;
94 }
95 auto client = m_bridge->lastCreatedClient();
96 client->setMinimizable(true);
97 client->setMaximizable(true);
98 client->setActive(false);
99 client->setProvidesContextHelp(true);
100 m_decoration->setSettings(m_settings->settings());
101 m_decoration->init();
102 m_button = m_bridge->createButton(m_decoration, m_type);
103 connect(this, &PreviewButtonItem::widthChanged, this, &PreviewButtonItem::syncGeometry);
104 connect(this, &PreviewButtonItem::heightChanged, this, &PreviewButtonItem::syncGeometry);
105 syncGeometry();
106}
107
108void PreviewButtonItem::syncGeometry()
109{
110 if (!m_button) {
111 return;
112 }
113 m_button->setGeometry(QRect(0, 0, width(), height()));
114}
115
116void PreviewButtonItem::paint(QPainter *painter)
117{
118 if (!m_button) {
119 return;
120 }
121
122 const QRect rect(0, 0, width(), height());
123 if (type() == KDecoration2::DecorationButtonType::Spacer) {
124 static const QIcon icon = QIcon::fromTheme(QStringLiteral("distribute-horizontal"));
125 icon.paint(painter, rect);
126 } else {
127 m_button->paint(painter, rect);
128 }
129
130 painter->setCompositionMode(QPainter::CompositionMode_SourceAtop);
131 painter->fillRect(rect, m_color);
132}
133
134void PreviewButtonItem::setColor(const QColor &color)
135{
136 m_color = color;
137 m_color.setAlpha(127);
138 update();
139}
140
141}
142}
143
144#include "moc_previewbutton.cpp"
PreviewButtonItem(QQuickItem *parent=nullptr)
KDecoration2::Preview::Settings * settings
void setBridge(PreviewBridge *bridge)
void paint(QPainter *painter) override
void setType(KDecoration2::DecorationButtonType type)
KDecoration2::Preview::PreviewBridge * bridge