[kwindecoration] Add a PreviewButtonItem to the declarative plugin
Allows to create a DecorationButton and renders a preview for it. Very basic, doesn't forward mouse events, etc.
This commit is contained in:
parent
8dd0a8163f
commit
062d071fc5
8 changed files with 285 additions and 2 deletions
|
@ -1,4 +1,5 @@
|
||||||
set(plugin_SRCS
|
set(plugin_SRCS
|
||||||
|
previewbutton.cpp
|
||||||
previewbridge.cpp
|
previewbridge.cpp
|
||||||
previewclient.cpp
|
previewclient.cpp
|
||||||
previewitem.cpp
|
previewitem.cpp
|
||||||
|
@ -13,6 +14,7 @@ target_link_libraries(kdecorationprivatedeclarative
|
||||||
Qt5::Quick
|
Qt5::Quick
|
||||||
KF5::CoreAddons
|
KF5::CoreAddons
|
||||||
KF5::ConfigWidgets
|
KF5::ConfigWidgets
|
||||||
|
KF5::I18n
|
||||||
KF5::Service
|
KF5::Service
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
|
#include "previewbutton.h"
|
||||||
#include "previewbridge.h"
|
#include "previewbridge.h"
|
||||||
#include "previewclient.h"
|
#include "previewclient.h"
|
||||||
#include "previewitem.h"
|
#include "previewitem.h"
|
||||||
|
@ -39,6 +40,8 @@ void Plugin::registerTypes(const char *uri)
|
||||||
qmlRegisterType<KDecoration2::Preview::PreviewBridge>(uri, 1, 0, "Bridge");
|
qmlRegisterType<KDecoration2::Preview::PreviewBridge>(uri, 1, 0, "Bridge");
|
||||||
qmlRegisterType<KDecoration2::Preview::Settings>(uri, 1, 0, "Settings");
|
qmlRegisterType<KDecoration2::Preview::Settings>(uri, 1, 0, "Settings");
|
||||||
qmlRegisterType<KDecoration2::Preview::PreviewItem>(uri, 1, 0, "Decoration");
|
qmlRegisterType<KDecoration2::Preview::PreviewItem>(uri, 1, 0, "Decoration");
|
||||||
|
qmlRegisterType<KDecoration2::Preview::PreviewButtonItem>(uri, 1, 0, "Button");
|
||||||
|
qmlRegisterType<KDecoration2::Preview::ButtonsModel>(uri, 1, 0, "ButtonsModel");
|
||||||
qmlRegisterType<KDecoration2::Preview::PreviewClient>();
|
qmlRegisterType<KDecoration2::Preview::PreviewClient>();
|
||||||
qmlRegisterType<KDecoration2::Decoration>();
|
qmlRegisterType<KDecoration2::Decoration>();
|
||||||
qmlRegisterType<KDecoration2::DecorationShadow>();
|
qmlRegisterType<KDecoration2::DecorationShadow>();
|
||||||
|
|
|
@ -161,5 +161,13 @@ Decoration *PreviewBridge::createDecoration(QObject *parent)
|
||||||
return m_factory->create<KDecoration2::Decoration>(parent, QVariantList({args}));
|
return m_factory->create<KDecoration2::Decoration>(parent, QVariantList({args}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DecorationButton *PreviewBridge::createButton(KDecoration2::Decoration *decoration, KDecoration2::DecorationButtonType type, QObject *parent)
|
||||||
|
{
|
||||||
|
if (!m_valid) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return m_factory->create<KDecoration2::DecorationButton>(QStringLiteral("button"), parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)}));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#define KDECOARTIONS_PREVIEW_BRIDGE_H
|
#define KDECOARTIONS_PREVIEW_BRIDGE_H
|
||||||
|
|
||||||
#include <KDecoration2/Private/DecorationBridge>
|
#include <KDecoration2/Private/DecorationBridge>
|
||||||
|
#include <KDecoration2/DecorationButton>
|
||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
@ -66,6 +67,7 @@ public:
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
|
|
||||||
KDecoration2::Decoration *createDecoration(QObject *parent = nullptr);
|
KDecoration2::Decoration *createDecoration(QObject *parent = nullptr);
|
||||||
|
KDecoration2::DecorationButton *createButton(KDecoration2::Decoration *decoration, KDecoration2::DecorationButtonType type, QObject *parent = nullptr);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void pluginChanged();
|
void pluginChanged();
|
||||||
|
|
139
kcmkwin/kwindecoration/declarative-plugin/previewbutton.cpp
Normal file
139
kcmkwin/kwindecoration/declarative-plugin/previewbutton.cpp
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of
|
||||||
|
* the License or (at your option) version 3 or any later version
|
||||||
|
* accepted by the membership of KDE e.V. (or its successor approved
|
||||||
|
* by the membership of KDE e.V.), which shall act as a proxy
|
||||||
|
* defined in Section 14 of version 3 of the license.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "previewbutton.h"
|
||||||
|
#include "previewbridge.h"
|
||||||
|
#include "previewclient.h"
|
||||||
|
#include "previewsettings.h"
|
||||||
|
|
||||||
|
#include <KDecoration2/Decoration>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
namespace KDecoration2
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace Preview
|
||||||
|
{
|
||||||
|
|
||||||
|
PreviewButtonItem::PreviewButtonItem(QQuickItem* parent)
|
||||||
|
: QQuickPaintedItem(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PreviewButtonItem::~PreviewButtonItem() = default;
|
||||||
|
|
||||||
|
void PreviewButtonItem::setType(int type)
|
||||||
|
{
|
||||||
|
setType(KDecoration2::DecorationButtonType(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::setType(KDecoration2::DecorationButtonType type)
|
||||||
|
{
|
||||||
|
if (m_type == type) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_type = type;
|
||||||
|
emit typeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
KDecoration2::DecorationButtonType PreviewButtonItem::type() const
|
||||||
|
{
|
||||||
|
return m_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
PreviewBridge *PreviewButtonItem::bridge() const
|
||||||
|
{
|
||||||
|
return m_bridge.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::setBridge(PreviewBridge *bridge)
|
||||||
|
{
|
||||||
|
if (m_bridge == bridge) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_bridge = bridge;
|
||||||
|
emit bridgeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings *PreviewButtonItem::settings() const
|
||||||
|
{
|
||||||
|
return m_settings.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::setSettings(Settings *settings)
|
||||||
|
{
|
||||||
|
if (m_settings == settings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_settings = settings;
|
||||||
|
emit settingsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
int PreviewButtonItem::typeAsInt() const
|
||||||
|
{
|
||||||
|
return int(m_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::componentComplete()
|
||||||
|
{
|
||||||
|
QQuickPaintedItem::componentComplete();
|
||||||
|
createButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::createButton()
|
||||||
|
{
|
||||||
|
if (m_type == KDecoration2::DecorationButtonType::Custom || m_decoration || !m_settings || !m_bridge) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_decoration = m_bridge->createDecoration(this);
|
||||||
|
if (!m_decoration) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto client = m_bridge->lastCreatedClient();
|
||||||
|
client->setMinimizable(true);
|
||||||
|
client->setMaximizable(true);
|
||||||
|
client->setActive(false);
|
||||||
|
m_decoration->setSettings(m_settings->settings());
|
||||||
|
m_decoration->init();
|
||||||
|
m_button = m_bridge->createButton(m_decoration, m_type);
|
||||||
|
connect(this, &PreviewButtonItem::widthChanged, this, &PreviewButtonItem::syncGeometry);
|
||||||
|
connect(this, &PreviewButtonItem::heightChanged, this, &PreviewButtonItem::syncGeometry);
|
||||||
|
syncGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::syncGeometry()
|
||||||
|
{
|
||||||
|
if (!m_button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_button->setGeometry(QRect(0, 0, width(), height()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewButtonItem::paint(QPainter *painter)
|
||||||
|
{
|
||||||
|
Q_UNUSED(painter)
|
||||||
|
if (!m_button) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_button->paint(painter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
81
kcmkwin/kwindecoration/declarative-plugin/previewbutton.h
Normal file
81
kcmkwin/kwindecoration/declarative-plugin/previewbutton.h
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of
|
||||||
|
* the License or (at your option) version 3 or any later version
|
||||||
|
* accepted by the membership of KDE e.V. (or its successor approved
|
||||||
|
* by the membership of KDE e.V.), which shall act as a proxy
|
||||||
|
* defined in Section 14 of version 3 of the license.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef KDECOARTIONS_PREVIEW_BUTTON_ITEM_H
|
||||||
|
#define KDECOARTIONS_PREVIEW_BUTTON_ITEM_H
|
||||||
|
|
||||||
|
#include <QQuickPaintedItem>
|
||||||
|
#include <QPointer>
|
||||||
|
#include <KDecoration2/DecorationButton>
|
||||||
|
|
||||||
|
namespace KDecoration2
|
||||||
|
{
|
||||||
|
class Decoration;
|
||||||
|
|
||||||
|
namespace Preview
|
||||||
|
{
|
||||||
|
class PreviewBridge;
|
||||||
|
class Settings;
|
||||||
|
|
||||||
|
class PreviewButtonItem : public QQuickPaintedItem
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(KDecoration2::Preview::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
|
||||||
|
Q_PROPERTY(KDecoration2::Preview::Settings *settings READ settings WRITE setSettings NOTIFY settingsChanged)
|
||||||
|
Q_PROPERTY(int type READ typeAsInt WRITE setType NOTIFY typeChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PreviewButtonItem(QQuickItem *parent = nullptr);
|
||||||
|
virtual ~PreviewButtonItem();
|
||||||
|
void paint(QPainter *painter) override;
|
||||||
|
|
||||||
|
PreviewBridge *bridge() const;
|
||||||
|
void setBridge(PreviewBridge *bridge);
|
||||||
|
|
||||||
|
Settings *settings() const;
|
||||||
|
void setSettings(Settings *settings);
|
||||||
|
|
||||||
|
KDecoration2::DecorationButtonType type() const;
|
||||||
|
int typeAsInt() const;
|
||||||
|
void setType(KDecoration2::DecorationButtonType type);
|
||||||
|
void setType(int type);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void bridgeChanged();
|
||||||
|
void typeChanged();
|
||||||
|
void settingsChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void componentComplete() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void createButton();
|
||||||
|
void syncGeometry();
|
||||||
|
QPointer<KDecoration2::Preview::PreviewBridge> m_bridge;
|
||||||
|
QPointer<KDecoration2::Preview::Settings> m_settings;
|
||||||
|
KDecoration2::Decoration *m_decoration = nullptr;
|
||||||
|
KDecoration2::DecorationButton *m_button = nullptr;
|
||||||
|
KDecoration2::DecorationButtonType m_type = KDecoration2::DecorationButtonType::Custom;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Preview
|
||||||
|
} // KDecoration2
|
||||||
|
|
||||||
|
#endif
|
|
@ -20,6 +20,8 @@
|
||||||
#include "previewsettings.h"
|
#include "previewsettings.h"
|
||||||
#include "previewbridge.h"
|
#include "previewbridge.h"
|
||||||
|
|
||||||
|
#include <KLocalizedString>
|
||||||
|
|
||||||
#include <QFontDatabase>
|
#include <QFontDatabase>
|
||||||
|
|
||||||
namespace KDecoration2
|
namespace KDecoration2
|
||||||
|
@ -34,6 +36,22 @@ ButtonsModel::ButtonsModel(const QList< DecorationButtonType > &buttons, QObject
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ButtonsModel::ButtonsModel(QObject* parent)
|
||||||
|
: ButtonsModel(QList<DecorationButtonType>({
|
||||||
|
DecorationButtonType::Menu,
|
||||||
|
DecorationButtonType::ApplicationMenu,
|
||||||
|
DecorationButtonType::OnAllDesktops,
|
||||||
|
DecorationButtonType::Minimize,
|
||||||
|
DecorationButtonType::Maximize,
|
||||||
|
DecorationButtonType::Close,
|
||||||
|
DecorationButtonType::QuickHelp,
|
||||||
|
DecorationButtonType::Shade,
|
||||||
|
DecorationButtonType::KeepBelow,
|
||||||
|
DecorationButtonType::KeepAbove
|
||||||
|
}), parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
ButtonsModel::~ButtonsModel() = default;
|
ButtonsModel::~ButtonsModel() = default;
|
||||||
|
|
||||||
int ButtonsModel::rowCount(const QModelIndex &parent) const
|
int ButtonsModel::rowCount(const QModelIndex &parent) const
|
||||||
|
@ -44,6 +62,34 @@ int ButtonsModel::rowCount(const QModelIndex &parent) const
|
||||||
return m_buttons.count();
|
return m_buttons.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QString buttonToName(DecorationButtonType type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case DecorationButtonType::Menu:
|
||||||
|
return i18n("Menu");
|
||||||
|
case DecorationButtonType::ApplicationMenu:
|
||||||
|
return i18n("Application menu");
|
||||||
|
case DecorationButtonType::OnAllDesktops:
|
||||||
|
return i18n("On all desktops");
|
||||||
|
case DecorationButtonType::Minimize:
|
||||||
|
return i18n("Minimize");
|
||||||
|
case DecorationButtonType::Maximize:
|
||||||
|
return i18n("Maximize");
|
||||||
|
case DecorationButtonType::Close:
|
||||||
|
return i18n("Close");
|
||||||
|
case DecorationButtonType::QuickHelp:
|
||||||
|
return i18n("Quick help");
|
||||||
|
case DecorationButtonType::Shade:
|
||||||
|
return i18n("Shade");
|
||||||
|
case DecorationButtonType::KeepBelow:
|
||||||
|
return i18n("Keep below");
|
||||||
|
case DecorationButtonType::KeepAbove:
|
||||||
|
return i18n("Keep above");
|
||||||
|
default:
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QVariant ButtonsModel::data(const QModelIndex &index, int role) const
|
QVariant ButtonsModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
if (!index.isValid() ||
|
if (!index.isValid() ||
|
||||||
|
@ -54,9 +100,9 @@ QVariant ButtonsModel::data(const QModelIndex &index, int role) const
|
||||||
}
|
}
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
return QVariant::fromValue(m_buttons.at(index.row()));
|
return buttonToName(m_buttons.at(index.row()));
|
||||||
case Qt::UserRole:
|
case Qt::UserRole:
|
||||||
return QVariant::fromValue(m_buttons.at(index.row()));
|
return QVariant::fromValue(int(m_buttons.at(index.row())));
|
||||||
}
|
}
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
@ -65,6 +111,7 @@ QHash< int, QByteArray > ButtonsModel::roleNames() const
|
||||||
{
|
{
|
||||||
QHash<int, QByteArray> roles;
|
QHash<int, QByteArray> roles;
|
||||||
roles.insert(Qt::DisplayRole, QByteArrayLiteral("display"));
|
roles.insert(Qt::DisplayRole, QByteArrayLiteral("display"));
|
||||||
|
roles.insert(Qt::UserRole, QByteArrayLiteral("button"));
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ class ButtonsModel : public QAbstractListModel
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit ButtonsModel(const QList< DecorationButtonType > &buttons, QObject *parent = 0);
|
explicit ButtonsModel(const QList< DecorationButtonType > &buttons, QObject *parent = 0);
|
||||||
|
explicit ButtonsModel(QObject *parent = nullptr);
|
||||||
virtual ~ButtonsModel();
|
virtual ~ButtonsModel();
|
||||||
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
|
||||||
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||||
|
|
Loading…
Reference in a new issue