You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kwin-plugins/plugins/decoration/button.cpp

86 lines
3.0 KiB
C++

6 years ago
#include "button.h"
#include "decoration.h"
#include <KDecoration3/DecoratedWindow>
6 years ago
#include <QPainter>
Button::Button(KDecoration3::DecorationButtonType type,
KDecoration3::Decoration *decoration,
QObject *parent)
: KDecoration3::DecorationButton(type, decoration, parent)
6 years ago
{
auto *window = decoration ? decoration->window() : nullptr;
if (!window) {
setVisible(false);
return;
}
6 years ago
switch (type) {
case KDecoration3::DecorationButtonType::Minimize:
setVisible(window->isMinimizeable());
connect(window, &KDecoration3::DecoratedWindow::minimizeableChanged, this, &Button::setVisible);
6 years ago
break;
case KDecoration3::DecorationButtonType::Maximize:
setVisible(window->isMaximizeable());
connect(window, &KDecoration3::DecoratedWindow::maximizeableChanged, this, &Button::setVisible);
6 years ago
break;
case KDecoration3::DecorationButtonType::Close:
setVisible(window->isCloseable());
connect(window, &KDecoration3::DecoratedWindow::closeableChanged, this, &Button::setVisible);
6 years ago
break;
case KDecoration3::DecorationButtonType::Menu:
6 years ago
break;
default:
setVisible(false);
break;
}
}
KDecoration3::DecorationButton *Button::create(KDecoration3::DecorationButtonType type,
KDecoration3::Decoration *decoration,
QObject *parent)
6 years ago
{
return new Button(type, decoration, parent);
}
void Button::paint(QPainter *painter, const QRectF &repaintArea)
6 years ago
{
Q_UNUSED(repaintArea)
6 years ago
auto *decoration = qobject_cast<Cutefish::Decoration *>(this->decoration());
if (!decoration) {
6 years ago
return;
}
6 years ago
const QRectF buttonRect = geometry();
const qreal scale = decoration->devicePixelRatio();
const QRectF hoverRect = buttonRect.adjusted(2 * scale, 2 * scale, -2 * scale, -2 * scale);
const QRectF imageRect = QRectF(0, 0, 24 * scale, 24 * scale);
6 years ago
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
5 years ago
painter->setRenderHint(QPainter::SmoothPixmapTransform, false);
6 years ago
if (isHovered() || isPressed()) {
painter->setPen(Qt::NoPen);
painter->setBrush(decoration->darkMode()
? (isPressed() ? QColor(255, 255, 255, 26) : QColor(255, 255, 255, 38))
: (isPressed() ? QColor(0, 0, 0, 38) : QColor(0, 0, 0, 26)));
painter->drawRoundedRect(hoverRect, hoverRect.height() / 2, hoverRect.height() / 2);
6 years ago
}
if (type() == KDecoration3::DecorationButtonType::Menu) {
if (auto *window = decoration->window()) {
window->icon().paint(painter, buttonRect.toRect());
}
} else {
const QPixmap pixmap = decoration->buttonPixmap(type(), isChecked());
QRectF centered = imageRect;
centered.moveCenter(buttonRect.center());
if (!pixmap.isNull()) {
painter->drawPixmap(centered, pixmap, pixmap.rect());
}
6 years ago
}
painter->restore();
}