reformat code

This commit is contained in:
Moody Liu committed 2024-03-07 22:34:09 +00:00
1 parent 9c75774ca9
commit f521b232ca
48 files changed
+1781 -1964

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
---
BasedOnStyle: Microsoft
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AlignConsecutiveMacros: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BreakBeforeBraces: Allman
BreakBeforeTernaryOperators: false
BreakInheritanceList: BeforeComma
BreakStringLiterals: false
ColumnLimit: 170
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
Cpp11BracedListStyle: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
IncludeBlocks: Regroup
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterTemplateKeyword: false
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpacesInParentheses: false
Standard: c++17
StatementMacros: [Q_UNUSED LOG DEBUG]
# ForEachMacros: [list_foreach]
TabWidth: 4
UseTab: Never
+38 -46
View File
@@ -1,21 +1,21 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 "appletdecorationplugin.h"
@@ -24,55 +24,47 @@
#include "environment.h"
#include "padding.h"
#include "previewbridge.h"
#include "previewclient.h"
#include "previewbutton.h"
#include "previewclient.h"
#include "previewsettings.h"
#include "previewshareddecoration.h"
#include "schemesmodel.h"
#include "themeextended.h"
#include "types.h"
#include "windowsystem.h"
#include "types.h"
#include <QtQml>
#include <QQmlEngine>
#include <KDecoration2/Decoration>
namespace Decoration {
namespace Applet {
#include <QQmlEngine>
#include <QtQml>
void AppletDecorationPlugin::registerTypes(const char *uri)
{
Q_ASSERT(uri == QLatin1String("org.kde.appletdecoration"));
qmlRegisterUncreatableType<Decoration::Applet::Types>(uri, 0, 1, "Types", "Applet decoration types");
qmlRegisterUncreatableType<Types>(uri, 0, 1, "Types", "Applet decoration types");
qmlRegisterType<Decoration::Applet::AuroraeTheme>(uri, 0, 1, "AuroraeTheme");
qmlRegisterType<Decoration::Applet::BridgeItem>(uri, 0, 1, "Bridge");
qmlRegisterType<Decoration::Applet::Settings>(uri, 0, 1, "Settings");
qmlRegisterType<Decoration::Applet::PreviewButtonItem>(uri, 0, 1, "Button");
qmlRegisterType<Decoration::Applet::DecorationsModel>(uri, 0, 1, "DecorationsModel");
qmlRegisterType<Decoration::Applet::SchemesModel>(uri, 0, 1, "ColorsModel");
qmlRegisterType<Decoration::Applet::SharedDecoration>(uri, 0, 1, "SharedDecoration");
qmlRegisterType<Decoration::Applet::ExtendedTheme>(uri, 0, 1, "PlasmaThemeExtended");
qmlRegisterType<Decoration::Applet::WindowSystem>(uri, 0, 1, "WindowSystem");
qmlRegisterType<AuroraeTheme>(uri, 0, 1, "AuroraeTheme");
qmlRegisterType<BridgeItem>(uri, 0, 1, "Bridge");
qmlRegisterType<Settings>(uri, 0, 1, "Settings");
qmlRegisterType<PreviewButtonItem>(uri, 0, 1, "Button");
qmlRegisterType<DecorationsModel>(uri, 0, 1, "DecorationsModel");
qmlRegisterType<SchemesModel>(uri, 0, 1, "ColorsModel");
qmlRegisterType<SharedDecoration>(uri, 0, 1, "SharedDecoration");
qmlRegisterType<ExtendedTheme>(uri, 0, 1, "PlasmaThemeExtended");
qmlRegisterType<WindowSystem>(uri, 0, 1, "WindowSystem");
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
qmlRegisterAnonymousType<Decoration::Applet::Padding>("", 1);
qmlRegisterAnonymousType<Decoration::Applet::PreviewClient>("", 1);
qmlRegisterAnonymousType<Decoration::Applet::PreviewBridge>("", 1);
qmlRegisterAnonymousType<Padding>("", 1);
qmlRegisterAnonymousType<PreviewClient>("", 1);
qmlRegisterAnonymousType<PreviewBridge>("", 1);
qmlRegisterAnonymousType<KDecoration2::Decoration>("", 1);
#else
qmlRegisterType<Decoration::Applet::Padding>();
qmlRegisterType<Decoration::Applet::PreviewClient>();
qmlRegisterType<Decoration::Applet::PreviewBridge>();
qmlRegisterType<Padding>();
qmlRegisterType<PreviewClient>();
qmlRegisterType<PreviewBridge>();
qmlRegisterType<KDecoration2::Decoration>();
#endif
qmlRegisterSingletonType<Decoration::Applet::Environment>(uri, 0, 1, "Environment", &Decoration::Applet::Environment::instance);
}
}
qmlRegisterSingletonType<Environment>(uri, 0, 1, "Environment", &Environment::instance);
}
+18 -24
View File
@@ -1,40 +1,34 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 APPLETDECORATIONPLUGIN_H
#define APPLETDECORATIONPLUGIN_H
#include <QQmlExtensionPlugin>
namespace Decoration {
namespace Applet {
class AppletDecorationPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
public:
public:
void registerTypes(const char *uri) override;
};
}
}
#endif
+66 -56
View File
@@ -1,47 +1,40 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 "auroraetheme.h"
#include "commontools.h"
#include <KConfigGroup>
#include <KDirWatch>
#include <KSharedConfig>
#include <KSvg/Svg>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QRgb>
#include <KConfigGroup>
#include <KDirWatch>
#include <KSharedConfig>
#include <KSvg/Svg>
namespace Decoration {
namespace Applet {
static const QString s_auroraeSvgTheme = QStringLiteral("__aurorae__svg__");
static const QString s_auroraerc = QStringLiteral("auroraerc");
static int i_buttonSizeStep = 4;
AuroraeTheme::AuroraeTheme(QObject *parent) :
QObject(parent)
AuroraeTheme::AuroraeTheme(QObject *parent) : QObject(parent)
{
const auto auroraerc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + s_auroraerc;
@@ -59,13 +52,13 @@ AuroraeTheme::~AuroraeTheme()
int AuroraeTheme::buttonWidth() const
{
int f = (int)m_buttonSize;
int f = (int) m_buttonSize;
return m_buttonWidth + ((f - 1) * i_buttonSizeStep);
}
int AuroraeTheme::buttonHeight() const
{
int f = (int)m_buttonSize;
int f = (int) m_buttonSize;
return m_buttonHeight + ((f - 1) * i_buttonSizeStep);
}
@@ -82,7 +75,7 @@ int AuroraeTheme::duration() const
float AuroraeTheme::buttonRatio() const
{
return ((float)m_buttonWidth / (float)m_buttonHeight);
return ((float) m_buttonWidth / (float) m_buttonHeight);
}
QString AuroraeTheme::theme() const
@@ -92,7 +85,8 @@ QString AuroraeTheme::theme() const
void AuroraeTheme::setTheme(QString theme)
{
if (m_theme == theme || theme.isEmpty()) {
if (m_theme == theme || theme.isEmpty())
{
return;
}
@@ -139,7 +133,8 @@ QString AuroraeTheme::monochromePrefix() const
void AuroraeTheme::auroraeRCChanged(const QString &filename)
{
if (!filename.endsWith(s_auroraerc)) {
if (!filename.endsWith(s_auroraerc))
{
return;
}
@@ -150,15 +145,22 @@ void AuroraeTheme::updateAurorae(const QString &themeName)
{
const QString separator("__");
const QString name = themeName.section(separator, -1, -1);
QString path = AppletDecoration::standardPath("aurorae/themes/"+name);
QString path = AppletDecoration::standardPath("aurorae/themes/" + name);
if (QFileInfo(path + "/close.svg").exists()) {
if (QFileInfo(path + "/close.svg").exists())
{
m_themeType = "svg";
} else if (QFileInfo(path + "/close.svgz").exists()) {
}
else if (QFileInfo(path + "/close.svgz").exists())
{
m_themeType = "svgz";
} else if (QFileInfo(path + "/close.png").exists()) {
}
else if (QFileInfo(path + "/close.png").exists())
{
m_themeType = "png";
} else {
}
else
{
m_themeType = "svg";
}
@@ -172,18 +174,22 @@ void AuroraeTheme::loadSettings()
{
const QString rc(m_themePath + "/" + m_themeName + "rc");
if (!QFileInfo(rc).exists()) {
if (!QFileInfo(rc).exists())
{
return;
}
const auto auroraerc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + s_auroraerc;
if (QFileInfo(auroraerc).exists()) {
if (QFileInfo(auroraerc).exists())
{
KSharedConfigPtr auroraePtr = KSharedConfig::openConfig(auroraerc);
const KConfigGroup themeGroup = KConfigGroup(auroraePtr, m_themeName);
m_buttonSize = static_cast<Types::ButtonSize>(themeGroup.readEntry("ButtonSize", (int)Types::NormalButton));
} else {
m_buttonSize = static_cast<Types::ButtonSize>(themeGroup.readEntry("ButtonSize", (int) Types::NormalButton));
}
else
{
m_buttonSize = Types::NormalButton;
}
@@ -197,12 +203,15 @@ void AuroraeTheme::loadSettings()
m_buttonHeight = layoutGroup.readEntry("ButtonHeight", 24);
m_buttonSpacing = layoutGroup.readEntry("ButtonSpacing", 2);
QString monoprefix = generalGroup.readEntry("MonochromeIconsPrefix","");
QString monoprefix = generalGroup.readEntry("MonochromeIconsPrefix", "");
if (!monoprefix.isEmpty()) {
if (!monoprefix.isEmpty())
{
m_hasMonochromeIcons = true;
m_monochromePrefix = (monoprefix == "*" ? "" : monoprefix);
} else {
}
else
{
m_hasMonochromeIcons = false;
m_monochromePrefix = "";
}
@@ -214,27 +223,31 @@ void AuroraeTheme::loadSettings()
void AuroraeTheme::parseThemeImages()
{
QString origBackgroundFilePath = m_themePath + "/decoration."+m_themeType;
QString origBackgroundFilePath = m_themePath + "/decoration." + m_themeType;
if (!QFileInfo(origBackgroundFilePath).exists()) {
if (!QFileInfo(origBackgroundFilePath).exists())
{
qDebug() << "Aurorare decoration file was not found for theme: " << m_themeName;
return;
}
KSvg::Svg *svg = new KSvg::Svg(this);
svg->setImagePath(origBackgroundFilePath);
svg->resize(50,50);
QImage img = svg->image(QSize(50,50), "decoration-top");
svg->resize(50, 50);
QImage img = svg->image(QSize(50, 50), "decoration-top");
int maxOpacity = -1;
for (int y=49; y>=0; --y) {
for (int x=0; x<50; ++x) {
for (int y = 49; y >= 0; --y)
{
for (int x = 0; x < 50; ++x)
{
QRgb pix = img.pixel(x, y);
int opacity = qAlpha(pix);
//! the equality returns better results for more aurorae themes
if (maxOpacity<=opacity) {
if (maxOpacity <= opacity)
{
maxOpacity = opacity;
m_titleBackgroundColor = QColor(qRed(pix), qGreen(pix), qBlue(pix));
}
@@ -243,6 +256,3 @@ void AuroraeTheme::parseThemeImages()
svg->deleteLater();
}
}
}
+34 -38
View File
@@ -1,34 +1,31 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 AURORAETHEME_H
#define AURORAETHEME_H
#include "types.h"
#include <QColor>
#include <QObject>
#include "types.h"
namespace Decoration {
namespace Applet {
class AuroraeTheme: public QObject
class AuroraeTheme : public QObject
{
Q_OBJECT
Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
@@ -50,9 +47,10 @@ class AuroraeTheme: public QObject
Q_PROPERTY(bool hasMonochromeIcons READ hasMonochromeIcons NOTIFY settingsChanged)
Q_PROPERTY(QString monochromePrefix READ monochromePrefix NOTIFY settingsChanged)
public:
public:
explicit AuroraeTheme(QObject *parent = nullptr);
~AuroraeTheme() override;;
~AuroraeTheme() override;
;
QString theme() const;
void setTheme(QString theme);
@@ -75,28 +73,28 @@ public:
bool hasMonochromeIcons() const;
QString monochromePrefix() const;
signals:
signals:
void settingsChanged();
void themeChanged();
private slots:
private slots:
void parseThemeImages();
void auroraeRCChanged(const QString &filename);
private:
private:
void loadSettings();
void updateAurorae(const QString &themeName);
private:
bool m_hasMonochromeIcons{false};
bool m_hasRestoreButton{false};
private:
bool m_hasMonochromeIcons{ false };
bool m_hasRestoreButton{ false };
int m_buttonHeight{24};
int m_buttonWidth{24};
int m_buttonSpacing{2};
int m_duration{0};
int m_buttonHeight{ 24 };
int m_buttonWidth{ 24 };
int m_buttonSpacing{ 2 };
int m_duration{ 0 };
Types::ButtonSize m_buttonSize{Types::NormalButton}; //Normal size
Types::ButtonSize m_buttonSize{ Types::NormalButton }; // Normal size
QString m_theme;
QString m_themeName;
@@ -108,6 +106,4 @@ private:
QColor m_titleBackgroundColor;
};
}
}
#endif
+39 -53
View File
@@ -24,15 +24,9 @@
#include "buttonsmodel.h"
#include <KLocalizedString>
#include <QFontDatabase>
namespace Decoration {
namespace Applet {
ButtonsModel::ButtonsModel(const QVector< KDecoration2::DecorationButtonType > &buttons, QObject *parent)
: QAbstractListModel(parent)
, m_buttons(buttons)
ButtonsModel::ButtonsModel(const QVector<KDecoration2::DecorationButtonType> &buttons, QObject *parent) : QAbstractListModel(parent), m_buttons(buttons)
{
}
@@ -47,8 +41,9 @@ ButtonsModel::ButtonsModel(QObject *parent)
KDecoration2::DecorationButtonType::ContextHelp,
KDecoration2::DecorationButtonType::Shade,
KDecoration2::DecorationButtonType::KeepBelow,
KDecoration2::DecorationButtonType::KeepAbove
}), parent)
KDecoration2::DecorationButtonType::KeepAbove,
}),
parent)
{
}
@@ -56,7 +51,8 @@ ButtonsModel::~ButtonsModel() = default;
int ButtonsModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
if (parent.isValid())
{
return 0;
}
@@ -65,63 +61,50 @@ int ButtonsModel::rowCount(const QModelIndex &parent) const
static QString buttonToName(KDecoration2::DecorationButtonType type)
{
switch (type) {
case KDecoration2::DecorationButtonType::Menu:
return i18n("Menu");
switch (type)
{
case KDecoration2::DecorationButtonType::Menu: return i18n("Menu");
case KDecoration2::DecorationButtonType::ApplicationMenu:
return i18n("Application menu");
case KDecoration2::DecorationButtonType::ApplicationMenu: return i18n("Application menu");
case KDecoration2::DecorationButtonType::OnAllDesktops:
return i18n("On all desktops");
case KDecoration2::DecorationButtonType::OnAllDesktops: return i18n("On all desktops");
case KDecoration2::DecorationButtonType::Minimize:
return i18n("Minimize");
case KDecoration2::DecorationButtonType::Minimize: return i18n("Minimize");
case KDecoration2::DecorationButtonType::Maximize:
return i18n("Maximize");
case KDecoration2::DecorationButtonType::Maximize: return i18n("Maximize");
case KDecoration2::DecorationButtonType::Close:
return i18n("Close");
case KDecoration2::DecorationButtonType::Close: return i18n("Close");
case KDecoration2::DecorationButtonType::ContextHelp:
return i18n("Context help");
case KDecoration2::DecorationButtonType::ContextHelp: return i18n("Context help");
case KDecoration2::DecorationButtonType::Shade:
return i18n("Shade");
case KDecoration2::DecorationButtonType::Shade: return i18n("Shade");
case KDecoration2::DecorationButtonType::KeepBelow:
return i18n("Keep below");
case KDecoration2::DecorationButtonType::KeepBelow: return i18n("Keep below");
case KDecoration2::DecorationButtonType::KeepAbove:
return i18n("Keep above");
case KDecoration2::DecorationButtonType::KeepAbove: return i18n("Keep above");
default:
return QString();
default: return QString();
}
}
QVariant ButtonsModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() ||
index.row() < 0 ||
index.row() >= m_buttons.count() ||
index.column() != 0) {
if (!index.isValid() || index.row() < 0 || index.row() >= m_buttons.count() || index.column() != 0)
{
return QVariant();
}
switch (role) {
case Qt::DisplayRole:
return buttonToName(m_buttons.at(index.row()));
switch (role)
{
case Qt::DisplayRole: return buttonToName(m_buttons.at(index.row()));
case Qt::UserRole:
return QVariant::fromValue(int(m_buttons.at(index.row())));
case Qt::UserRole: return QVariant::fromValue(int(m_buttons.at(index.row())));
}
return QVariant();
}
QHash< int, QByteArray > ButtonsModel::roleNames() const
QHash<int, QByteArray> ButtonsModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles.insert(Qt::DisplayRole, QByteArrayLiteral("display"));
@@ -131,7 +114,8 @@ QHash< int, QByteArray > ButtonsModel::roleNames() const
void ButtonsModel::remove(int row)
{
if (row < 0 || row >= m_buttons.count()) {
if (row < 0 || row >= m_buttons.count())
{
return;
}
@@ -142,7 +126,8 @@ void ButtonsModel::remove(int row)
void ButtonsModel::down(int index)
{
if (m_buttons.count() < 2 || index == m_buttons.count() - 1) {
if (m_buttons.count() < 2 || index == m_buttons.count() - 1)
{
return;
}
@@ -153,7 +138,8 @@ void ButtonsModel::down(int index)
void ButtonsModel::up(int index)
{
if (m_buttons.count() < 2 || index == 0) {
if (m_buttons.count() < 2 || index == 0)
{
return;
}
@@ -178,24 +164,24 @@ void ButtonsModel::add(int index, int type)
void ButtonsModel::move(int sourceIndex, int targetIndex)
{
if (sourceIndex == qMax(0, targetIndex)) {
if (sourceIndex == qMax(0, targetIndex))
{
return;
}
/* When moving an item down, the destination index needs to be incremented
by one, as explained in the documentation:
http://doc.qt.nokia.com/qabstractitemmodel.html#beginMoveRows */
if (targetIndex > sourceIndex) {
if (targetIndex > sourceIndex)
{
// Row will be moved down
beginMoveRows(QModelIndex(), sourceIndex, sourceIndex, QModelIndex(), targetIndex + 1);
} else {
}
else
{
beginMoveRows(QModelIndex(), sourceIndex, sourceIndex, QModelIndex(), qMax(0, targetIndex));
}
m_buttons.move(sourceIndex, qMax(0, targetIndex));
endMoveRows();
}
}
}
+7 -13
View File
@@ -27,23 +27,21 @@
#include <KDecoration2/DecorationButton>
#include <QAbstractListModel>
namespace Decoration {
namespace Applet {
class PreviewBridge;
class ButtonsModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit ButtonsModel(const QVector< KDecoration2::DecorationButtonType > &buttons, QObject *parent = 0);
public:
explicit ButtonsModel(const QVector<KDecoration2::DecorationButtonType> &buttons, QObject *parent = 0);
explicit ButtonsModel(QObject *parent = nullptr);
virtual ~ButtonsModel();
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash< int, QByteArray > roleNames() const override;
QHash<int, QByteArray> roleNames() const override;
QVector< KDecoration2::DecorationButtonType > buttons() const {
QVector<KDecoration2::DecorationButtonType> buttons() const
{
return m_buttons;
}
@@ -55,12 +53,8 @@ public:
void add(KDecoration2::DecorationButtonType type);
Q_INVOKABLE void add(int index, int type);
private:
QVector< KDecoration2::DecorationButtonType > m_buttons;
private:
QVector<KDecoration2::DecorationButtonType> m_buttons;
};
}
}
#endif
+27 -19
View File
@@ -20,35 +20,40 @@
#include "commontools.h"
// Qt
#include <QFileInfo>
#include <QStandardPaths>
namespace AppletDecoration {
QString standardPath(QString subPath, bool localfirst)
{
QStringList paths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
if (localfirst) {
for (const auto &pt : paths) {
QString ptF = pt + "/" +subPath;
if (QFileInfo(ptF).exists()) {
if (localfirst)
{
for (const auto &pt : paths)
{
QString ptF = pt + "/" + subPath;
if (QFileInfo(ptF).exists())
{
return ptF;
}
}
} else {
for (int i=paths.count()-1; i>=0; i--) {
QString ptF = paths[i] + "/" +subPath;
if (QFileInfo(ptF).exists()) {
}
else
{
for (int i = paths.count() - 1; i >= 0; i--)
{
QString ptF = paths[i] + "/" + subPath;
if (QFileInfo(ptF).exists())
{
return ptF;
}
}
}
//! in any case that above fails
if (QFileInfo("/usr/share/"+subPath).exists()) {
return "/usr/share/"+subPath;
if (QFileInfo("/usr/share/" + subPath).exists())
{
return "/usr/share/" + subPath;
}
return "";
@@ -58,12 +63,16 @@ QStringList standardPaths(bool localfirst)
{
QStringList paths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
if (localfirst) {
if (localfirst)
{
return paths;
} else {
}
else
{
QStringList reversed;
for (int i=paths.count()-1; i>=0; i--) {
for (int i = paths.count() - 1; i >= 0; i--)
{
reversed << paths[i];
}
@@ -77,11 +86,10 @@ QStringList standardPathsFor(QString subPath, bool localfirst)
QString separator = subPath.startsWith("/") ? "" : "/";
for (int i=0; i<paths.count(); ++i) {
for (int i = 0; i < paths.count(); ++i)
{
paths[i] = paths[i] + separator + subPath;
}
return paths;
}
}
-3
View File
@@ -21,12 +21,9 @@
#include <QString>
#include <QStringList>
namespace AppletDecoration {
//! returns the standard path found that contains the subPath
//! local paths have higher priority by default
QString standardPath(QString subPath, bool localFirst = true);
QStringList standardPaths(bool localfirst = true);
QStringList standardPathsFor(QString subPath, bool localfirst = true);
}
+31 -44
View File
@@ -22,24 +22,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "decorationpalette.h"
#include <KColorScheme>
#include <KConfigGroup>
#include <KSharedConfig>
#include <KColorScheme>
#include <QDebug>
#include <QPalette>
#include <QFileInfo>
#include <QPalette>
#include <QStandardPaths>
namespace Decoration {
namespace Applet {
DecorationPalette::DecorationPalette(const QString &colorScheme)
: m_colorScheme(QFileInfo(colorScheme).isAbsolute()
? colorScheme
: QStandardPaths::locate(QStandardPaths::GenericConfigLocation, colorScheme))
: m_colorScheme(QFileInfo(colorScheme).isAbsolute() ? colorScheme : QStandardPaths::locate(QStandardPaths::GenericConfigLocation, colorScheme))
{
if (m_colorScheme.isEmpty() && colorScheme == QStringLiteral("kdeglobals")) {
if (m_colorScheme.isEmpty() && colorScheme == QStringLiteral("kdeglobals"))
{
// kdeglobals doesn't exist so create it. This is needed to monitor it using QFileSystemWatcher.
auto config = KSharedConfig::openConfig(colorScheme, KConfig::SimpleConfig);
KConfigGroup wmConfig(config, QStringLiteral("WM"));
@@ -50,7 +45,9 @@ DecorationPalette::DecorationPalette(const QString &colorScheme)
}
m_watcher.addPath(m_colorScheme);
connect(&m_watcher, &QFileSystemWatcher::fileChanged, [this]() {
connect(&m_watcher, &QFileSystemWatcher::fileChanged,
[this]()
{
m_watcher.addPath(m_colorScheme);
update();
emit changed();
@@ -66,51 +63,44 @@ bool DecorationPalette::isValid() const
QColor DecorationPalette::color(KDecoration2::ColorGroup group, KDecoration2::ColorRole role) const
{
using KDecoration2::ColorRole;
using KDecoration2::ColorGroup;
using KDecoration2::ColorRole;
switch (role) {
switch (role)
{
case ColorRole::Frame:
switch (group) {
case ColorGroup::Active:
return m_activeFrameColor;
switch (group)
{
case ColorGroup::Active: return m_activeFrameColor;
case ColorGroup::Inactive:
return m_inactiveFrameColor;
case ColorGroup::Inactive: return m_inactiveFrameColor;
default:
return QColor();
default: return QColor();
}
case ColorRole::TitleBar:
switch (group) {
case ColorGroup::Active:
return m_activeTitleBarColor;
switch (group)
{
case ColorGroup::Active: return m_activeTitleBarColor;
case ColorGroup::Inactive:
return m_inactiveTitleBarColor;
case ColorGroup::Inactive: return m_inactiveTitleBarColor;
default:
return QColor();
default: return QColor();
}
case ColorRole::Foreground:
switch (group) {
case ColorGroup::Active:
return m_activeForegroundColor;
switch (group)
{
case ColorGroup::Active: return m_activeForegroundColor;
case ColorGroup::Inactive:
return m_inactiveForegroundColor;
case ColorGroup::Inactive: return m_inactiveForegroundColor;
case ColorGroup::Warning:
return m_warningForegroundColor;
case ColorGroup::Warning: return m_warningForegroundColor;
default:
return QColor();
default: return QColor();
}
default:
return QColor();
default: return QColor();
}
}
@@ -124,7 +114,8 @@ void DecorationPalette::update()
auto config = KSharedConfig::openConfig(m_colorScheme, KConfig::SimpleConfig);
KConfigGroup wmConfig(config, QStringLiteral("WM"));
if (!wmConfig.exists() && !m_colorScheme.endsWith(QStringLiteral("/kdeglobals"))) {
if (!wmConfig.exists() && !m_colorScheme.endsWith(QStringLiteral("/kdeglobals")))
{
qDebug() << "Invalid color scheme" << m_colorScheme << "lacks WM group";
return;
}
@@ -137,7 +128,7 @@ void DecorationPalette::update()
m_inactiveTitleBarColor = wmConfig.readEntry("inactiveBackground", m_inactiveFrameColor);
m_activeForegroundColor = wmConfig.readEntry("activeForeground", m_palette.color(QPalette::Active, QPalette::HighlightedText));
#if QT_VERSION >= QT_VERSION_CHECK(5,13,0)
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
m_inactiveForegroundColor = wmConfig.readEntry("inactiveForeground", m_activeForegroundColor.darker());
#else
m_inactiveForegroundColor = wmConfig.readEntry("inactiveForeground", m_activeForegroundColor.dark());
@@ -145,8 +136,4 @@ void DecorationPalette::update()
KConfigGroup windowColorsConfig(config, QStringLiteral("Colors:Window"));
m_warningForegroundColor = windowColorsConfig.readEntry("ForegroundNegative", QColor(237, 21, 2));
}
}
}
+4 -9
View File
@@ -27,13 +27,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QFileSystemWatcher>
#include <QPalette>
namespace Decoration {
namespace Applet {
class DecorationPalette : public QObject
{
Q_OBJECT
public:
public:
DecorationPalette(const QString &colorScheme);
bool isValid() const;
@@ -41,9 +38,10 @@ public:
QColor color(KDecoration2::ColorGroup group, KDecoration2::ColorRole role) const;
QPalette palette() const;
Q_SIGNALS:
Q_SIGNALS:
void changed();
private:
private:
void update();
QString m_colorScheme;
@@ -62,7 +60,4 @@ private:
QColor m_warningForegroundColor;
};
}
}
#endif
+61 -74
View File
@@ -22,26 +22,19 @@
*/
#include "decorationsmodel.h"
// KDecoration2
#include <KConfigGroup>
#include <KDecoration2/Decoration>
#include <KDecoration2/DecorationSettings>
#include <KDecoration2/DecorationThemeProvider>
// KDE
#include <KDirWatch>
#include <KSharedConfig>
#include <Plasma/PluginLoader>
#include <KPluginFactory>
#include <KSharedConfig>
#include <KConfigGroup>
// Qt
#include <Plasma/PluginLoader>
#include <QDebug>
#include <QDir>
#include <iostream>
namespace Decoration {
namespace Applet {
static const QString s_defaultPlugin = QStringLiteral("org.kde.breeze");
static const QString s_defaultTheme;
static const QString s_auroraePlugin = QStringLiteral("org.kde.kwin.aurorae");
@@ -50,14 +43,12 @@ static const QString s_auroraeSvgTheme = QStringLiteral("__aurorae__svg__");
static const QString s_kwinrc = QStringLiteral("kwinrc");
static const QString s_pluginName = QStringLiteral("org.kde.kdecoration2");
DecorationsModel::DecorationsModel(QObject *parent)
: QAbstractListModel(parent)
DecorationsModel::DecorationsModel(QObject *parent) : QAbstractListModel(parent)
{
init();
loadCurrents();
const auto kwinRc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
QLatin1Char('/') + s_kwinrc;
const auto kwinRc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + s_kwinrc;
KDirWatch::self()->addFile(kwinRc);
@@ -79,7 +70,8 @@ QString DecorationsModel::currentPlugin() const
void DecorationsModel::setCurrentPlugin(QString plugin)
{
if (m_currentPlugin == plugin) {
if (m_currentPlugin == plugin)
{
return;
}
@@ -94,7 +86,8 @@ QString DecorationsModel::currentTheme() const
void DecorationsModel::setCurrentTheme(QString theme)
{
if (m_currentTheme == theme) {
if (m_currentTheme == theme)
{
return;
}
@@ -104,7 +97,8 @@ void DecorationsModel::setCurrentTheme(QString theme)
int DecorationsModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
if (parent.isValid())
{
return 0;
}
@@ -113,41 +107,36 @@ int DecorationsModel::rowCount(const QModelIndex &parent) const
QVariant DecorationsModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= int(m_plugins.size())) {
if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= int(m_plugins.size()))
{
return QVariant();
}
const Data &d = m_plugins.at(index.row());
switch (role) {
case Qt::DisplayRole:
return d.visibleName;
switch (role)
{
case Qt::DisplayRole: return d.visibleName;
case Qt::UserRole +4:
return d.pluginName;
case Qt::UserRole + 4: return d.pluginName;
case Qt::UserRole +5:
return d.themeName;
case Qt::UserRole + 5: return d.themeName;
case Qt::UserRole +6:
return d.isAuroraeTheme;
case Qt::UserRole + 6: return d.isAuroraeTheme;
case Qt::UserRole +7:
return d.configuration;
case Qt::UserRole + 7: return d.configuration;
}
return QVariant();
}
QHash< int, QByteArray > DecorationsModel::roleNames() const
QHash<int, QByteArray> DecorationsModel::roleNames() const
{
QHash<int, QByteArray> roles({
{Qt::DisplayRole, QByteArrayLiteral("display")},
{Qt::UserRole + 4, QByteArrayLiteral("plugin")},
{Qt::UserRole + 5, QByteArrayLiteral("theme")},
{Qt::UserRole + 6, QByteArrayLiteral("isAuroraeTheme")},
{Qt::UserRole + 7, QByteArrayLiteral("configureable")}
});
QHash<int, QByteArray> roles({ { Qt::DisplayRole, QByteArrayLiteral("display") },
{ Qt::UserRole + 4, QByteArrayLiteral("plugin") },
{ Qt::UserRole + 5, QByteArrayLiteral("theme") },
{ Qt::UserRole + 6, QByteArrayLiteral("isAuroraeTheme") },
{ Qt::UserRole + 7, QByteArrayLiteral("configureable") } });
return roles;
}
@@ -155,7 +144,8 @@ static bool isThemeEngine(const QVariantMap &decoSettingsMap)
{
auto it = decoSettingsMap.find(QStringLiteral("themes"));
if (it == decoSettingsMap.end()) {
if (it == decoSettingsMap.end())
{
return false;
}
@@ -166,7 +156,8 @@ static bool isConfigureable(const QVariantMap &decoSettingsMap)
{
auto it = decoSettingsMap.find(QStringLiteral("kcmodule"));
if (it == decoSettingsMap.end()) {
if (it == decoSettingsMap.end())
{
return false;
}
@@ -177,7 +168,8 @@ static QString themeListKeyword(const QVariantMap &decoSettingsMap)
{
auto it = decoSettingsMap.find(QStringLiteral("themeListKeyword"));
if (it == decoSettingsMap.end()) {
if (it == decoSettingsMap.end())
{
return QString();
}
@@ -188,7 +180,8 @@ static QString findKNewStuff(const QVariantMap &decoSettingsMap)
{
auto it = decoSettingsMap.find(QStringLiteral("KNewStuff"));
if (it == decoSettingsMap.end()) {
if (it == decoSettingsMap.end())
{
return QString();
}
@@ -200,18 +193,22 @@ void DecorationsModel::init()
beginResetModel();
m_plugins.clear();
const auto plugins = KPluginMetaData::findPlugins(s_pluginName);
for (const auto &info : plugins) {
for (const auto &info : plugins)
{
const auto decoSettingsMap = info.rawData().value("org.kde.kdecoration2").toObject().toVariantMap();
bool config = false;
const QString &kns = findKNewStuff(decoSettingsMap);
if (!kns.isEmpty() && !m_knsProvides.contains(kns)) {
if (!kns.isEmpty() && !m_knsProvides.contains(kns))
{
m_knsProvides.insert(kns, info.name().isEmpty() ? info.pluginId() : info.name());
}
if (isThemeEngine(decoSettingsMap)) {
if (isThemeEngine(decoSettingsMap))
{
const QString keyword = themeListKeyword(decoSettingsMap);
if (keyword.isNull()) {
if (keyword.isNull())
{
// We cannot list the themes
continue;
}
@@ -254,11 +251,11 @@ void DecorationsModel::loadCurrents()
const QString plugin = config.readEntry("library", s_defaultPlugin);
const QString theme = config.readEntry("theme", s_defaultTheme);
bool exists{false};
bool isAur{isAurorae(plugin,theme)};
bool exists{ false };
bool isAur{ isAurorae(plugin, theme) };
if ((!isAur && pluginExists(plugin))
|| (isAur && decorationExists(plugin, theme))) {
if ((!isAur && pluginExists(plugin)) || (isAur && decorationExists(plugin, theme)))
{
exists = true;
}
@@ -268,7 +265,8 @@ void DecorationsModel::loadCurrents()
void DecorationsModel::kwinChanged(const QString &filename)
{
if (!filename.endsWith(s_kwinrc)) {
if (!filename.endsWith(s_kwinrc))
{
return;
}
@@ -277,12 +275,10 @@ void DecorationsModel::kwinChanged(const QString &filename)
bool DecorationsModel::isAurorae(const QString &plugin, const QString &theme)
{
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(),
[plugin, theme](const Data & d) {
return d.pluginName == plugin && d.themeName == theme;
});
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(), [plugin, theme](const Data &d) { return d.pluginName == plugin && d.themeName == theme; });
if (it == m_plugins.cend()) {
if (it == m_plugins.cend())
{
return false;
}
@@ -291,12 +287,10 @@ bool DecorationsModel::isAurorae(const QString &plugin, const QString &theme)
bool DecorationsModel::decorationExists(const QString &plugin, const QString &theme)
{
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(),
[plugin, theme](const Data & d) {
return d.pluginName == plugin && d.themeName == theme;
});
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(), [plugin, theme](const Data &d) { return d.pluginName == plugin && d.themeName == theme; });
if (it == m_plugins.cend()) {
if (it == m_plugins.cend())
{
return false;
}
@@ -305,12 +299,10 @@ bool DecorationsModel::decorationExists(const QString &plugin, const QString &th
bool DecorationsModel::pluginExists(const QString &plugin)
{
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(),
[plugin](const Data & d) {
return d.pluginName == plugin;
});
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(), [plugin](const Data &d) { return d.pluginName == plugin; });
if (it == m_plugins.cend()) {
if (it == m_plugins.cend())
{
return false;
}
@@ -319,19 +311,14 @@ bool DecorationsModel::pluginExists(const QString &plugin)
QModelIndex DecorationsModel::findDecoration(const QString &pluginName, const QString &themeName) const
{
auto it = std::find_if(m_plugins.cbegin(), m_plugins.cend(),
[pluginName, themeName](const Data & d) {
return d.pluginName == pluginName && d.themeName == themeName;
}
);
auto it =
std::find_if(m_plugins.cbegin(), m_plugins.cend(), [pluginName, themeName](const Data &d) { return d.pluginName == pluginName && d.themeName == themeName; });
if (it == m_plugins.cend()) {
if (it == m_plugins.cend())
{
return QModelIndex();
}
const auto distance = std::distance(m_plugins.cbegin(), it);
return createIndex(distance, 0);
}
}
}
+9 -15
View File
@@ -26,9 +26,6 @@
#include <QAbstractListModel>
namespace Decoration {
namespace Applet {
class DecorationsModel : public QAbstractListModel
{
Q_OBJECT
@@ -36,17 +33,18 @@ class DecorationsModel : public QAbstractListModel
Q_PROPERTY(QString currentPlugin READ currentPlugin NOTIFY currentPluginChanged)
Q_PROPERTY(QString currentTheme READ currentTheme NOTIFY currentThemeChanged)
public:
public:
explicit DecorationsModel(QObject *parent = nullptr);
virtual ~DecorationsModel();
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash< int, QByteArray > roleNames() const override;
QHash<int, QByteArray> roleNames() const override;
QModelIndex findDecoration(const QString &pluginName, const QString &themeName = QString()) const;
QMap<QString, QString> knsProviders() const {
QMap<QString, QString> knsProviders() const
{
return m_knsProvides;
}
@@ -55,27 +53,26 @@ public:
QString currentPlugin() const;
QString currentTheme() const;
public Q_SLOTS:
public Q_SLOTS:
Q_INVOKABLE bool decorationExists(const QString &plugin, const QString &theme);
Q_INVOKABLE bool isAurorae(const QString &plugin, const QString &theme);
signals:
signals:
void countChanged();
void currentThemeChanged();
void currentPluginChanged();
private slots:
private slots:
void init();
void loadCurrents();
void kwinChanged(const QString &filename);
void setCurrentPlugin(QString plugin);
void setCurrentTheme(QString theme);
private:
private:
bool pluginExists(const QString &plugin);
private:
private:
struct Data
{
QString pluginName;
@@ -92,7 +89,4 @@ private:
QMap<QString, QString> m_knsProvides;
};
}
}
#endif
+28 -35
View File
@@ -1,36 +1,29 @@
/*
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Window Buttons Applet
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Window Buttons Applet
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 "environment.h"
// Qt
#include <QDebug>
#include <QProcess>
// Plasma
#include <plasma_version.h>
namespace Decoration {
namespace Applet {
Environment::Environment(QObject *parent)
: QObject(parent)
Environment::Environment(QObject *parent) : QObject(parent)
{
}
@@ -46,7 +39,8 @@ uint Environment::frameworksVersion() const
uint Environment::plasmaDesktopVersion()
{
if (m_plasmaDesktopVersion == -1) {
if (m_plasmaDesktopVersion == -1)
{
m_plasmaDesktopVersion = identifyPlasmaDesktopVersion();
}
@@ -68,23 +62,25 @@ uint Environment::identifyPlasmaDesktopVersion()
QStringList stringSplit = output.split(" ");
if (stringSplit.count() >= 2) {
if (stringSplit.count() >= 2)
{
qDebug() << " /////////////////////////";
QString cleanVersionString = stringSplit[1].remove("\n");
QStringList plasmaDesktopVersionParts = cleanVersionString.split(".");
if (plasmaDesktopVersionParts.count() == 3) {
if (plasmaDesktopVersionParts.count() == 3)
{
uint maj = plasmaDesktopVersionParts[0].toUInt();
uint min = plasmaDesktopVersionParts[1].toUInt();
uint rel = plasmaDesktopVersionParts[2].toUInt();
if (maj > 0) {
if (maj > 0)
{
uint desktopVersion = makeVersion(maj, min, rel);
QString message("Plasma Desktop version: " + QString::number(maj) + "."
+ QString::number(min) + "." + QString::number(rel)
+ " (" + QString::number(desktopVersion) + ")");
QString message("Plasma Desktop version: " + QString::number(maj) + "." + QString::number(min) + "." + QString::number(rel) + " (" +
QString::number(desktopVersion) + ")");
qDebug() << message;
qDebug() << " /////////////////////////";
@@ -97,6 +93,3 @@ uint Environment::identifyPlasmaDesktopVersion()
return 0;
}
}
} //end of namespace
+24 -31
View File
@@ -1,32 +1,28 @@
/*
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Window Buttons Applet
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of Window Buttons Applet
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 ENVIRONMENT_H
#define ENVIRONMENT_H
// Qt
#include <QJSEngine>
#include <QObject>
#include <QQmlEngine>
#include <QJSEngine>
namespace Decoration {
namespace Applet {
class Environment final : public QObject
{
@@ -34,7 +30,7 @@ class Environment final : public QObject
Q_PROPERTY(uint frameworksVersion READ frameworksVersion NOTIFY frameworksVersionChanged)
Q_PROPERTY(uint plasmaDesktopVersion READ plasmaDesktopVersion NOTIFY plasmaDesktopVersionChanged)
public:
public:
virtual ~Environment();
bool compositingActive() const;
@@ -52,25 +48,22 @@ public:
return new Environment;
}
public slots:
public slots:
Q_INVOKABLE uint makeVersion(uint major, uint minor, uint release) const;
signals:
signals:
void frameworksVersionChanged();
void plasmaDesktopVersionChanged();
private:
private:
explicit Environment(QObject *parent = nullptr);
void loadPlasmaDesktopVersion();
uint identifyPlasmaDesktopVersion();
private:
int m_plasmaDesktopVersion{ -1};
private:
int m_plasmaDesktopVersion{ -1 };
};
}
}
#endif // ENVIRONMENT_H
+10 -13
View File
@@ -22,11 +22,7 @@
#include "padding.h"
namespace Decoration {
namespace Applet {
Padding::Padding(QObject *parent) :
QObject(parent)
Padding::Padding(QObject *parent) : QObject(parent)
{
}
@@ -41,7 +37,8 @@ int Padding::top() const
void Padding::setTop(int top)
{
if (m_top == top) {
if (m_top == top)
{
return;
}
@@ -56,7 +53,8 @@ int Padding::left() const
void Padding::setLeft(int left)
{
if (m_left == left) {
if (m_left == left)
{
return;
}
@@ -64,14 +62,15 @@ void Padding::setLeft(int left)
emit leftChanged();
}
int Padding::bottom()const
int Padding::bottom() const
{
return m_bottom;
}
void Padding::setBottom(int bottom)
{
if (m_bottom == bottom) {
if (m_bottom == bottom)
{
return;
}
@@ -86,13 +85,11 @@ int Padding::right() const
void Padding::setRight(int right)
{
if (m_right == right) {
if (m_right == right)
{
return;
}
m_right = right;
emit rightChanged();
}
}
}
+8 -14
View File
@@ -25,9 +25,6 @@
#include <QObject>
namespace Decoration {
namespace Applet {
class Padding : public QObject
{
Q_OBJECT
@@ -37,7 +34,7 @@ class Padding : public QObject
Q_PROPERTY(int bottom READ bottom WRITE setBottom NOTIFY bottomChanged);
Q_PROPERTY(int right READ right WRITE setRight NOTIFY rightChanged);
public:
public:
explicit Padding(QObject *parent = nullptr);
virtual ~Padding();
@@ -47,26 +44,23 @@ public:
int left() const;
void setLeft(int left);
int bottom()const;
int bottom() const;
void setBottom(int bottom);
int right() const;
void setRight(int right);
signals:
signals:
void topChanged();
void leftChanged();
void bottomChanged();
void rightChanged();
private:
int m_top{0};
int m_left{0};
int m_bottom{0};
int m_right{0};
private:
int m_top{ 0 };
int m_left{ 0 };
int m_bottom{ 0 };
int m_right{ 0 };
};
}
}
#endif
+33 -37
View File
@@ -27,17 +27,15 @@
#include "previewclient.h"
#include "previewsettings.h"
#include <KCModule>
#include <KDecoration2/DecoratedClient>
#include <KDecoration2/Decoration>
#include <KCModule>
#include <KDirWatch>
#include <KPluginMetaData>
#include <KPluginFactory>
#include <QDebug>
#include <KPluginMetaData>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDebug>
#include <QDialog>
#include <QDialogButtonBox>
#include <QPushButton>
@@ -46,22 +44,14 @@
#include <kpluginfactory.h>
#include <kpluginmetadata.h>
namespace Decoration {
namespace Applet {
static const QString s_pluginName = QStringLiteral("org.kde.kdecoration2");
static const QString s_breezerc = QStringLiteral("breezerc");
PreviewBridge::PreviewBridge(QObject *parent)
: KDecoration2::DecorationBridge(parent)
, m_lastCreatedClient(nullptr)
, m_lastCreatedSettings(nullptr)
, m_valid(false)
PreviewBridge::PreviewBridge(QObject *parent) : KDecoration2::DecorationBridge(parent), m_lastCreatedClient(nullptr), m_lastCreatedSettings(nullptr), m_valid(false)
{
connect(this, &PreviewBridge::pluginChanged, this, &PreviewBridge::createFactory);
const auto breezeRc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) +
QLatin1Char('/') + s_breezerc;
const auto breezeRc = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + s_breezerc;
KDirWatch::self()->addFile(breezeRc);
@@ -97,7 +87,8 @@ void PreviewBridge::unregisterButton(PreviewButtonItem *button)
void PreviewBridge::setPlugin(const QString &plugin)
{
if (m_plugin == plugin) {
if (m_plugin == plugin)
{
return;
}
@@ -113,7 +104,8 @@ QString PreviewBridge::theme() const
void PreviewBridge::setTheme(const QString &theme)
{
if (m_theme == theme) {
if (m_theme == theme)
{
return;
}
@@ -130,7 +122,8 @@ void PreviewBridge::createFactory()
{
m_factory.clear();
if (m_plugin.isNull()) {
if (m_plugin.isNull())
{
setValid(false);
qDebug() << "Plugin not set";
return;
@@ -153,7 +146,8 @@ bool PreviewBridge::isValid() const
void PreviewBridge::setValid(bool valid)
{
if (m_valid == valid) {
if (m_valid == valid)
{
return;
}
@@ -163,32 +157,37 @@ void PreviewBridge::setValid(bool valid)
KDecoration2::Decoration *PreviewBridge::createDecoration(QObject *parent)
{
if (!m_valid) {
if (!m_valid)
{
return nullptr;
}
QVariantMap args({ {QStringLiteral("bridge"), QVariant::fromValue(this)} });
QVariantMap args({ { QStringLiteral("bridge"), QVariant::fromValue(this) } });
if (!m_theme.isNull()) {
if (!m_theme.isNull())
{
args.insert(QStringLiteral("theme"), m_theme);
}
return m_factory->create<KDecoration2::Decoration>(parent, QVariantList({args}));
return m_factory->create<KDecoration2::Decoration>(parent, QVariantList({ args }));
}
KDecoration2::DecorationButton *PreviewBridge::createButton(KDecoration2::Decoration *decoration, KDecoration2::DecorationButtonType type, QObject *parent)
{
if (!m_valid) {
if (!m_valid)
{
return nullptr;
}
auto button = m_factory->create<KDecoration2::DecorationButton>(parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)}));
auto button = m_factory->create<KDecoration2::DecorationButton>(parent, QVariantList({ QVariant::fromValue(type), QVariant::fromValue(decoration) }));
if (!button) {
if (!button)
{
// //! support decorations that have not been updated yet to KWin 5.23 decoration plugin approach
// button = m_factory->create<KDecoration2::DecorationButton>(QStringLiteral("button"), parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)}));
// if (button) {
// qWarning() << "Loading a KDecoration2::DecorationButton using the button keyword is deprecated in KWin 5.23, register the plugin without a keyword instead" << m_plugin;
// button = m_factory->create<KDecoration2::DecorationButton>(QStringLiteral("button"), parent, QVariantList({QVariant::fromValue(type),
// QVariant::fromValue(decoration)})); if (button) {
// qWarning() << "Loading a KDecoration2::DecorationButton using the button keyword is deprecated in KWin 5.23, register the plugin without a keyword
// instead" << m_plugin;
// }
qWarning() << "removed button" << (int) type << "from" << m_plugin;
@@ -199,7 +198,8 @@ KDecoration2::DecorationButton *PreviewBridge::createButton(KDecoration2::Decora
void PreviewBridge::settingsFileChanged(const QString &filename)
{
if (!filename.endsWith(s_breezerc)) {
if (!filename.endsWith(s_breezerc))
{
return;
}
@@ -208,14 +208,13 @@ void PreviewBridge::settingsFileChanged(const QString &filename)
void PreviewBridge::reconfigure()
{
if (m_lastCreatedSettings) {
if (m_lastCreatedSettings)
{
emit m_lastCreatedSettings->decorationSettings()->reconfigured();
}
}
BridgeItem::BridgeItem(QObject *parent)
: QObject(parent)
, m_bridge(new PreviewBridge())
BridgeItem::BridgeItem(QObject *parent) : QObject(parent), m_bridge(new PreviewBridge())
{
connect(m_bridge, &PreviewBridge::themeChanged, this, &BridgeItem::themeChanged);
connect(m_bridge, &PreviewBridge::pluginChanged, this, &BridgeItem::pluginChanged);
@@ -226,6 +225,3 @@ BridgeItem::~BridgeItem()
{
m_bridge->deleteLater();
}
}
}
+27 -27
View File
@@ -24,17 +24,13 @@
#ifndef KDECORATIONS_PREVIEW_BRIDGE_H
#define KDECORATIONS_PREVIEW_BRIDGE_H
#include <KDecoration2/Private/DecorationBridge>
#include <KDecoration2/DecorationButton>
#include <KDecoration2/Private/DecorationBridge>
#include <QList>
#include <QPointer>
class KPluginFactory;
namespace Decoration {
namespace Applet {
class PreviewButtonItem;
class PreviewClient;
class PreviewSettings;
@@ -46,16 +42,18 @@ class PreviewBridge : public KDecoration2::DecorationBridge
Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
public:
public:
explicit PreviewBridge(QObject *parent = nullptr);
virtual ~PreviewBridge();
std::unique_ptr<KDecoration2::DecoratedClientPrivate> createClient(KDecoration2::DecoratedClient *client, KDecoration2::Decoration *decoration) override;
std::unique_ptr<KDecoration2::DecorationSettingsPrivate> settings(KDecoration2::DecorationSettings *parent) override;
PreviewClient *lastCreatedClient() {
PreviewClient *lastCreatedClient()
{
return m_lastCreatedClient;
}
PreviewSettings *lastCreatedSettings() {
PreviewSettings *lastCreatedSettings()
{
return m_lastCreatedSettings;
}
@@ -71,18 +69,18 @@ public:
KDecoration2::Decoration *createDecoration(QObject *parent = nullptr);
KDecoration2::DecorationButton *createButton(KDecoration2::Decoration *decoration, KDecoration2::DecorationButtonType type, QObject *parent = nullptr);
public Q_SLOTS:
public Q_SLOTS:
void reconfigure();
Q_SIGNALS:
Q_SIGNALS:
void pluginChanged();
void themeChanged();
void validChanged();
private slots:
private slots:
void settingsFileChanged(const QString &filename);
private:
private:
void createFactory();
void setValid(bool valid);
PreviewClient *m_lastCreatedClient;
@@ -100,45 +98,47 @@ class BridgeItem : public QObject
Q_PROPERTY(QString plugin READ plugin WRITE setPlugin NOTIFY pluginChanged)
Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged)
Q_PROPERTY(bool valid READ isValid NOTIFY validChanged)
Q_PROPERTY(Decoration::Applet::PreviewBridge *bridge READ bridge CONSTANT)
Q_PROPERTY(PreviewBridge *bridge READ bridge CONSTANT)
public:
public:
explicit BridgeItem(QObject *parent = nullptr);
virtual ~BridgeItem();
void setPlugin(const QString &plugin) {
void setPlugin(const QString &plugin)
{
m_bridge->setPlugin(plugin);
}
QString plugin() const {
QString plugin() const
{
return m_bridge->plugin();
}
void setTheme(const QString &theme) {
void setTheme(const QString &theme)
{
m_bridge->setTheme(theme);
}
QString theme() const {
QString theme() const
{
return m_bridge->theme();
}
bool isValid() const {
bool isValid() const
{
return m_bridge->isValid();
}
PreviewBridge *bridge() const {
PreviewBridge *bridge() const
{
return m_bridge;
}
Q_SIGNALS:
Q_SIGNALS:
void pluginChanged();
void themeChanged();
void validChanged();
private:
private:
PreviewBridge *m_bridge;
};
}
}
Q_DECLARE_METATYPE(Decoration::Applet::PreviewBridge *)
Q_DECLARE_METATYPE(PreviewBridge *)
#endif
+115 -90
View File
@@ -29,20 +29,13 @@
#include "previewsettings.h"
#include "previewshareddecoration.h"
#include <KDecoration2/Decoration>
#include <KDecoration2/DecoratedClient>
#include <KDecoration2/Decoration>
#include <QDebug>
#include <QEvent>
#include <QPainter>
namespace Decoration {
namespace Applet {
PreviewButtonItem::PreviewButtonItem(QQuickItem *parent)
: QQuickPaintedItem(parent),
m_scheme("kdeglobals"),
m_padding(new Padding(this))
PreviewButtonItem::PreviewButtonItem(QQuickItem *parent) : QQuickPaintedItem(parent), m_scheme("kdeglobals"), m_padding(new Padding(this))
{
setAcceptHoverEvents(true);
setFiltersChildMouseEvents(true);
@@ -71,11 +64,13 @@ PreviewButtonItem::PreviewButtonItem(QQuickItem *parent)
PreviewButtonItem::~PreviewButtonItem()
{
if (m_bridge) {
if (m_bridge)
{
m_bridge->unregisterButton(this);
}
if (m_button) {
if (m_button)
{
m_button->deleteLater();
}
}
@@ -87,13 +82,15 @@ bool PreviewButtonItem::isActive() const
void PreviewButtonItem::setIsActive(bool active)
{
if (m_isActive == active) {
if (m_isActive == active)
{
return;
}
m_isActive = active;
if (m_client) {
if (m_client)
{
m_client->setActive(m_isActive);
}
@@ -107,18 +104,23 @@ bool PreviewButtonItem::isMaximized() const
void PreviewButtonItem::setIsMaximized(bool maximized)
{
if (m_isMaximized == maximized) {
if (m_isMaximized == maximized)
{
return;
}
m_isMaximized = maximized;
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::Maximize) {
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::Maximize)
{
if (m_isMaximized) {
if (m_isMaximized)
{
m_client->setMaximizedVertically(true);
m_client->setMaximizedHorizontally(true);
} else {
}
else
{
m_client->setMaximizedVertically(false);
m_client->setMaximizedHorizontally(false);
}
@@ -134,16 +136,21 @@ bool PreviewButtonItem::isOnAllDesktops() const
void PreviewButtonItem::setIsOnAllDesktops(bool onalldesktops)
{
if (m_isOnAllDesktops == onalldesktops) {
if (m_isOnAllDesktops == onalldesktops)
{
return;
}
m_isOnAllDesktops = onalldesktops;
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::OnAllDesktops) {
if (m_isOnAllDesktops) {
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::OnAllDesktops)
{
if (m_isOnAllDesktops)
{
m_client->setDesktop(-1);
} else {
}
else
{
m_client->setDesktop(1);
}
}
@@ -158,16 +165,21 @@ bool PreviewButtonItem::isKeepAbove() const
void PreviewButtonItem::setIsKeepAbove(bool keepabove)
{
if (m_isKeepAbove == keepabove){
if (m_isKeepAbove == keepabove)
{
return;
}
m_isKeepAbove = keepabove;
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::KeepAbove) {
if (m_isKeepAbove){
if (m_client && m_button && m_type == KDecoration2::DecorationButtonType::KeepAbove)
{
if (m_isKeepAbove)
{
m_client->setKeepAbove(true);
} else {
}
else
{
m_client->setKeepAbove(false);
}
}
@@ -192,7 +204,8 @@ void PreviewButtonItem::setType(int type)
void PreviewButtonItem::setType(KDecoration2::DecorationButtonType type)
{
if (m_type == type) {
if (m_type == type)
{
return;
}
@@ -207,13 +220,15 @@ QString PreviewButtonItem::scheme() const
void PreviewButtonItem::setScheme(QString scheme)
{
if (m_scheme == scheme) {
if (m_scheme == scheme)
{
return;
}
m_scheme = scheme.isEmpty() ? "kdeglobals" : scheme;
if (m_client) {
if (m_client)
{
m_client->setColorScheme(m_scheme);
qDebug() << "buttons scheme update to:" << m_scheme;
}
@@ -228,17 +243,20 @@ PreviewBridge *PreviewButtonItem::bridge() const
void PreviewButtonItem::setBridge(PreviewBridge *bridge)
{
if (m_bridge == bridge) {
if (m_bridge == bridge)
{
return;
}
if (m_bridge) {
if (m_bridge)
{
m_bridge->unregisterButton(this);
}
m_bridge = bridge;
if (m_bridge) {
if (m_bridge)
{
m_bridge->registerButton(this);
}
@@ -257,7 +275,8 @@ int PreviewButtonItem::localX() const
void PreviewButtonItem::setLocalX(int x)
{
if (m_localX == x) {
if (m_localX == x)
{
return;
}
@@ -273,7 +292,8 @@ int PreviewButtonItem::localY() const
void PreviewButtonItem::setLocalY(int y)
{
if (m_localY == y) {
if (m_localY == y)
{
return;
}
@@ -284,7 +304,8 @@ void PreviewButtonItem::setLocalY(int y)
KDecoration2::Decoration *PreviewButtonItem::decoration() const
{
if (!m_sharedDecoration) {
if (!m_sharedDecoration)
{
return nullptr;
}
@@ -298,13 +319,14 @@ SharedDecoration *PreviewButtonItem::sharedDecoration() const
void PreviewButtonItem::setSharedDecoration(SharedDecoration *sharedDecoration)
{
if (m_sharedDecoration == sharedDecoration) {
if (m_sharedDecoration == sharedDecoration)
{
return;
}
m_sharedDecoration = sharedDecoration;
connect(m_sharedDecoration, &Decoration::Applet::SharedDecoration::decorationChanged, this, &Decoration::Applet::PreviewButtonItem::createButton);
connect(m_sharedDecoration, &SharedDecoration::decorationChanged, this, &PreviewButtonItem::createButton);
emit sharedDecorationChanged();
}
@@ -317,13 +339,15 @@ void PreviewButtonItem::componentComplete()
void PreviewButtonItem::createButton()
{
if (m_type == KDecoration2::DecorationButtonType::Custom || !m_sharedDecoration || !m_sharedDecoration->decoration() || !m_bridge) {
if (m_type == KDecoration2::DecorationButtonType::Custom || !m_sharedDecoration || !m_sharedDecoration->decoration() || !m_bridge)
{
return;
}
m_client = m_bridge->lastCreatedClient();
if (!m_client) {
if (!m_client)
{
return;
}
@@ -333,31 +357,40 @@ void PreviewButtonItem::createButton()
m_client->setActive(m_isActive);
m_client->setColorScheme(m_scheme);
if (m_isOnAllDesktops) {
if (m_isOnAllDesktops)
{
m_client->setDesktop(-1);
} else {
}
else
{
m_client->setDesktop(1);
}
if (m_isMaximized) {
if (m_isMaximized)
{
m_client->setMaximizedVertically(true);
m_client->setMaximizedHorizontally(true);
} else {
}
else
{
m_client->setMaximizedVertically(false);
m_client->setMaximizedHorizontally(false);
}
if (m_button) {
if (m_button)
{
m_button->deleteLater();
}
m_button = m_bridge->createButton(m_sharedDecoration->decoration(), m_type, this);
if (!m_button) {
if (!m_button)
{
return;
}
if (!m_lastAppliedDecoration.isNull()) {
if (!m_lastAppliedDecoration.isNull())
{
disconnect(m_lastAppliedDecoration.data(), &KDecoration2::Decoration::damaged, this, &PreviewButtonItem::onDecorationDamaged);
}
@@ -385,7 +418,8 @@ void PreviewButtonItem::syncInternalGeometry()
m_fullGeometry = QRect(0, 0, width(), height());
m_visualGeometry = QRect(m_localX + m_padding->left(), m_localY + m_padding->top(), iWidth, iHeight);
if (!m_button) {
if (!m_button)
{
return;
}
@@ -394,23 +428,28 @@ void PreviewButtonItem::syncInternalGeometry()
void PreviewButtonItem::onButtonDamaged()
{
if (m_sharedDecoration && m_sharedDecoration->decoration()) {
if (m_sharedDecoration && m_sharedDecoration->decoration())
{
emit m_sharedDecoration->decoration()->damaged(m_visualGeometry);
} else {
}
else
{
update();
}
}
void PreviewButtonItem::onDecorationDamaged(const QRegion &region)
{
if (region.intersects(m_visualGeometry)) {
if (region.intersects(m_visualGeometry))
{
update();
}
}
void PreviewButtonItem::paint(QPainter *painter)
{
if (!m_button) {
if (!m_button)
{
return;
}
@@ -421,7 +460,8 @@ void PreviewButtonItem::paint(QPainter *painter)
void PreviewButtonItem::mouseDoubleClickEvent(QMouseEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
@@ -430,72 +470,63 @@ void PreviewButtonItem::mouseDoubleClickEvent(QMouseEvent *event)
void PreviewButtonItem::mousePressEvent(QMouseEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
QMouseEvent e(event->type(),
m_visualGeometry.center(),
event->button(),
event->buttons(),
event->modifiers());
QMouseEvent e(event->type(), m_visualGeometry.center(), event->button(), event->buttons(), event->modifiers());
QCoreApplication::instance()->sendEvent(m_button, &e);
}
void PreviewButtonItem::mouseReleaseEvent(QMouseEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
bool inItem {m_fullGeometry.contains(event->position().x(), event->position().y())};
bool inItem{ m_fullGeometry.contains(event->position().x(), event->position().y()) };
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
QMouseEvent e(event->type(),
inItem ? m_visualGeometry.center() : QPoint(-5, -5),
event->button(),
event->buttons(),
event->modifiers());
QMouseEvent e(event->type(), inItem ? m_visualGeometry.center() : QPoint(-5, -5), event->button(), event->buttons(), event->modifiers());
QCoreApplication::instance()->sendEvent(m_button, event);
if (inItem) {
if (inItem)
{
emit clicked();
}
}
void PreviewButtonItem::mouseMoveEvent(QMouseEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
QMouseEvent e(event->type(),
m_visualGeometry.center(),
event->button(),
event->buttons(),
event->modifiers());
QMouseEvent e(event->type(), m_visualGeometry.center(), event->button(), event->buttons(), event->modifiers());
QCoreApplication::instance()->sendEvent(m_button, &e);
}
void PreviewButtonItem::hoverEnterEvent(QHoverEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
QHoverEvent e(event->type(),
m_visualGeometry.center(),
QPoint(m_visualGeometry.x() + event->position().x(), m_visualGeometry.y() + event->position().y()),
QHoverEvent e(event->type(), m_visualGeometry.center(), QPoint(m_visualGeometry.x() + event->position().x(), m_visualGeometry.y() + event->position().y()),
event->modifiers());
QCoreApplication::instance()->sendEvent(m_button, &e);
@@ -503,31 +534,30 @@ void PreviewButtonItem::hoverEnterEvent(QHoverEvent *event)
void PreviewButtonItem::hoverLeaveEvent(QHoverEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
QHoverEvent e(event->type(),
QPoint(-5, -5),
m_visualGeometry.center(),
event->modifiers());
QHoverEvent e(event->type(), QPoint(-5, -5), m_visualGeometry.center(), event->modifiers());
QCoreApplication::instance()->sendEvent(m_button, &e);
}
void PreviewButtonItem::hoverMoveEvent(QHoverEvent *event)
{
if (!m_button) {
if (!m_button)
{
return;
}
QPoint newPos (qBound((double)m_visualGeometry.left(), m_visualGeometry.left() + event->position().x(), (double)m_visualGeometry.right()),
qBound((double)m_visualGeometry.top(), m_visualGeometry.top() + event->position().x(), (double)m_visualGeometry.bottom()));
QPoint newPos(qBound((double) m_visualGeometry.left(), m_visualGeometry.left() + event->position().x(), (double) m_visualGeometry.right()),
qBound((double) m_visualGeometry.top(), m_visualGeometry.top() + event->position().x(), (double) m_visualGeometry.bottom()));
QPoint oldPos (qBound((double)m_visualGeometry.left(), m_visualGeometry.left() + event->oldPosF().x(), (double)m_visualGeometry.right()),
qBound((double)m_visualGeometry.top(), m_visualGeometry.top() + event->oldPosF().x(), (double)m_visualGeometry.bottom()));
QPoint oldPos(qBound((double) m_visualGeometry.left(), m_visualGeometry.left() + event->oldPosF().x(), (double) m_visualGeometry.right()),
qBound((double) m_visualGeometry.top(), m_visualGeometry.top() + event->oldPosF().x(), (double) m_visualGeometry.bottom()));
//! this a workaround in order to send proper coordinates
//! that confirm the button visual coordinates
@@ -536,12 +566,7 @@ void PreviewButtonItem::hoverMoveEvent(QHoverEvent *event)
QCoreApplication::instance()->sendEvent(m_button, &e);
}
void PreviewButtonItem::focusOutEvent(QFocusEvent *event)
{
QCoreApplication::instance()->sendEvent(m_button, event);
}
} // namespace Applet
} // namespace Decoration
+19 -29
View File
@@ -25,17 +25,11 @@
#define KDECORATIONS_PREVIEW_BUTTON_ITEM_H
#include "previewshareddecoration.h"
#include <QMargins>
#include <QQuickPaintedItem>
#include <QPointer>
#include <KDecoration2/DecorationButton>
namespace KDecoration2 {
class Decoration;
}
namespace Decoration {
namespace Applet {
#include <QMargins>
#include <QPointer>
#include <QQuickPaintedItem>
class Padding;
class PreviewBridge;
@@ -44,8 +38,8 @@ class PreviewClient;
class PreviewButtonItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(Decoration::Applet::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(Decoration::Applet::SharedDecoration *sharedDecoration READ sharedDecoration WRITE setSharedDecoration NOTIFY sharedDecorationChanged)
Q_PROPERTY(PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(SharedDecoration *sharedDecoration READ sharedDecoration WRITE setSharedDecoration NOTIFY sharedDecorationChanged)
Q_PROPERTY(bool isActive READ isActive WRITE setIsActive NOTIFY isActiveChanged);
Q_PROPERTY(bool isMaximized READ isMaximized WRITE setIsMaximized NOTIFY isMaximizedChanged)
@@ -58,9 +52,9 @@ class PreviewButtonItem : public QQuickPaintedItem
Q_PROPERTY(int type READ typeAsInt WRITE setType NOTIFY typeChanged)
Q_PROPERTY(QString scheme READ scheme WRITE setScheme NOTIFY schemeChanged)
Q_PROPERTY(Decoration::Applet::Padding *padding READ padding NOTIFY paddingChanged)
Q_PROPERTY(Padding *padding READ padding NOTIFY paddingChanged)
public:
public:
explicit PreviewButtonItem(QQuickItem *parent = nullptr);
virtual ~PreviewButtonItem();
void paint(QPainter *painter) override;
@@ -103,7 +97,7 @@ public:
QRect visualGeometry() const;
Q_SIGNALS:
Q_SIGNALS:
void bridgeChanged();
void isActiveChanged();
void isMaximizedChanged();
@@ -118,7 +112,7 @@ Q_SIGNALS:
void clicked();
protected:
protected:
void mouseDoubleClickEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
@@ -130,27 +124,26 @@ protected:
void componentComplete() override;
private Q_SLOTS:
private Q_SLOTS:
void createButton();
void syncInternalGeometry();
void onButtonDamaged();
void onDecorationDamaged(const QRegion &region);
private:
QPointer<Decoration::Applet::PreviewBridge> m_bridge;
QPointer<Decoration::Applet::PreviewClient> m_client;
QPointer<Decoration::Applet::SharedDecoration> m_sharedDecoration;
private:
QPointer<PreviewBridge> m_bridge;
QPointer<PreviewClient> m_client;
QPointer<SharedDecoration> m_sharedDecoration;
QPointer<KDecoration2::Decoration> m_lastAppliedDecoration;
KDecoration2::DecorationButton *m_button = nullptr;
KDecoration2::DecorationButtonType m_type = KDecoration2::DecorationButtonType::Custom;
bool m_isActive{true};
bool m_isMaximized{false};
bool m_isOnAllDesktops{false};
bool m_isKeepAbove{false};
bool m_isActive{ true };
bool m_isMaximized{ false };
bool m_isOnAllDesktops{ false };
bool m_isKeepAbove{ false };
int m_localX;
int m_localY;
@@ -163,7 +156,4 @@ private:
Padding *m_padding;
};
} // namespace Applet
} // namespace Decoration
#endif
+57 -81
View File
@@ -22,44 +22,22 @@
*/
#include "previewclient.h"
#include <KDecoration2/Decoration>
#include <KDecoration2/DecoratedClient>
#include <QDebug>
#include <KDecoration2/DecoratedClient>
#include <KDecoration2/Decoration>
#include <QCoreApplication>
#include <QDebug>
#include <QEvent>
#include <QModelIndex>
namespace Decoration {
namespace Applet {
PreviewClient::PreviewClient(KDecoration2::DecoratedClient *c, KDecoration2::Decoration *decoration)
: QObject(decoration)
, ApplicationMenuEnabledDecoratedClientPrivate(c, decoration)
, m_icon(QIcon::fromTheme(QStringLiteral("start-here-kde")))
, m_iconName(m_icon.name())
: QObject(decoration), ApplicationMenuEnabledDecoratedClientPrivate(c, decoration), m_icon(QIcon::fromTheme(QStringLiteral("start-here-kde"))),
m_iconName(m_icon.name())
// , m_palette(new KWin::Decoration::DecorationPalette(QStringLiteral("kdeglobals")))
, m_active(true)
, m_closeable(true)
, m_keepBelow(false)
, m_keepAbove(false)
, m_maximizable(true)
, m_maximizedHorizontally(false)
, m_maximizedVertically(false)
, m_minimizable(true)
, m_modal(false)
, m_movable(true)
, m_resizable(true)
, m_shadeable(true)
, m_shaded(false)
, m_providesContextHelp(false)
, m_desktop(1)
, m_width(0)
, m_height(0)
, m_bordersTopEdge(false)
, m_bordersLeftEdge(false)
, m_bordersRightEdge(false)
, m_bordersBottomEdge(false)
,
m_active(true), m_closeable(true), m_keepBelow(false), m_keepAbove(false), m_maximizable(true), m_maximizedHorizontally(false), m_maximizedVertically(false),
m_minimizable(true), m_modal(false), m_movable(true), m_resizable(true), m_shadeable(true), m_shaded(false), m_providesContextHelp(false), m_desktop(1), m_width(0),
m_height(0), m_bordersTopEdge(false), m_bordersLeftEdge(false), m_bordersRightEdge(false), m_bordersBottomEdge(false)
{
connect(this, &PreviewClient::captionChanged, c, &KDecoration2::DecoratedClient::captionChanged);
connect(this, &PreviewClient::activeChanged, c, &KDecoration2::DecoratedClient::activeChanged);
@@ -84,33 +62,19 @@ PreviewClient::PreviewClient(KDecoration2::DecoratedClient *c, KDecoration2::Dec
connect(this, &PreviewClient::iconChanged, c, &KDecoration2::DecoratedClient::iconChanged);
connect(this, &PreviewClient::paletteChanged, c, &KDecoration2::DecoratedClient::paletteChanged);
// connect(this, &PreviewClient::, c, &DecoratedClient::);
connect(this, &PreviewClient::maximizedVerticallyChanged, this,
[this]() {
emit maximizedChanged(isMaximized());
}
);
connect(this, &PreviewClient::maximizedHorizontallyChanged, this,
[this]() {
emit maximizedChanged(isMaximized());
}
);
connect(this, &PreviewClient::maximizedVerticallyChanged, this, [this]() { emit maximizedChanged(isMaximized()); });
connect(this, &PreviewClient::maximizedHorizontallyChanged, this, [this]() { emit maximizedChanged(isMaximized()); });
connect(this, &PreviewClient::iconNameChanged, this,
[this]() {
[this]()
{
m_icon = QIcon::fromTheme(m_iconName);
emit iconChanged(m_icon);
}
);
connect(this, &PreviewClient::desktopChanged, this,
[this](int) {
emit onAllDesktopsChanged(isOnAllDesktops());
}
);
});
connect(this, &PreviewClient::desktopChanged, this, [this](int) { emit onAllDesktopsChanged(isOnAllDesktops()); });
/* connect(m_palette, &KWin::Decoration::DecorationPalette::changed, [this]() {
emit paletteChanged(m_palette->palette());
});*/
auto emitEdgesChanged = [this, c]() {
c->adjacentScreenEdgesChanged(adjacentScreenEdges());
};
auto emitEdgesChanged = [this, c]() { c->adjacentScreenEdgesChanged(adjacentScreenEdges()); };
connect(this, &PreviewClient::bordersTopEdgeChanged, this, emitEdgesChanged);
connect(this, &PreviewClient::bordersLeftEdgeChanged, this, emitEdgesChanged);
connect(this, &PreviewClient::bordersRightEdgeChanged, this, emitEdgesChanged);
@@ -156,11 +120,13 @@ int PreviewClient::desktop() const
void PreviewClient::setDesktop(int desktop)
{
if (desktop == 0) {
if (desktop == 0)
{
desktop = 1;
}
if (m_desktop == desktop) {
if (m_desktop == desktop)
{
return;
}
@@ -280,17 +246,19 @@ QColor PreviewClient::color(KDecoration2::ColorGroup group, KDecoration2::ColorR
void PreviewClient::setColorScheme(QString scheme)
{
if (m_colorScheme == scheme && !m_colorScheme.isEmpty()) {
if (m_colorScheme == scheme && !m_colorScheme.isEmpty())
{
return;
}
m_colorScheme = scheme;
if (m_palette) {
if (m_palette)
{
m_palette->deleteLater();
}
m_palette = new Decoration::Applet::DecorationPalette(scheme);
m_palette = new DecorationPalette(scheme);
emit paletteChanged(m_palette->palette());
}
@@ -299,19 +267,23 @@ Qt::Edges PreviewClient::adjacentScreenEdges() const
{
Qt::Edges edges;
if (m_bordersBottomEdge) {
if (m_bordersBottomEdge)
{
edges |= Qt::BottomEdge;
}
if (m_bordersLeftEdge) {
if (m_bordersLeftEdge)
{
edges |= Qt::LeftEdge;
}
if (m_bordersRightEdge) {
if (m_bordersRightEdge)
{
edges |= Qt::RightEdge;
}
if (m_bordersTopEdge) {
if (m_bordersTopEdge)
{
edges |= Qt::TopEdge;
}
@@ -350,7 +322,8 @@ bool PreviewClient::bordersTopEdge() const
void PreviewClient::setBordersBottomEdge(bool enabled)
{
if (m_bordersBottomEdge == enabled) {
if (m_bordersBottomEdge == enabled)
{
return;
}
@@ -360,7 +333,8 @@ void PreviewClient::setBordersBottomEdge(bool enabled)
void PreviewClient::setBordersLeftEdge(bool enabled)
{
if (m_bordersLeftEdge == enabled) {
if (m_bordersLeftEdge == enabled)
{
return;
}
@@ -370,7 +344,8 @@ void PreviewClient::setBordersLeftEdge(bool enabled)
void PreviewClient::setBordersRightEdge(bool enabled)
{
if (m_bordersRightEdge == enabled) {
if (m_bordersRightEdge == enabled)
{
return;
}
@@ -380,7 +355,8 @@ void PreviewClient::setBordersRightEdge(bool enabled)
void PreviewClient::setBordersTopEdge(bool enabled)
{
if (m_bordersTopEdge == enabled) {
if (m_bordersTopEdge == enabled)
{
return;
}
@@ -388,28 +364,26 @@ void PreviewClient::setBordersTopEdge(bool enabled)
emit bordersTopEdgeChanged(enabled);
}
#if KDECORATION2_VERSION_MAJOR > 5 || KDECORATION2_VERSION_MINOR >= 13
void PreviewClient::requestShowToolTip(const QString &text)
{
Q_UNUSED(text)
//qDebug() << "tooltip show requested with text:" << text;
// qDebug() << "tooltip show requested with text:" << text;
}
void PreviewClient::requestHideToolTip()
{
//qDebug() << "tooltip hide requested";
// qDebug() << "tooltip hide requested";
}
#endif
#if KDECORATION2_VERSION_MAJOR > 5 || KDECORATION2_VERSION_MINOR >= 18
QSize PreviewClient::size() const
{
return {m_width, m_height};
return { m_width, m_height };
}
#endif
#if KDECORATION2_VERSION_MAJOR <= 5 && KDECORATION2_VERSION_MINOR <= 20
void PreviewClient::requestShowWindowMenu()
{
@@ -422,7 +396,6 @@ void PreviewClient::requestShowWindowMenu(const QRect &rect)
}
#endif
void PreviewClient::requestClose()
{
emit closeRequested();
@@ -435,13 +408,18 @@ void PreviewClient::requestContextHelp()
void PreviewClient::requestToggleMaximization(Qt::MouseButtons buttons)
{
if (buttons.testFlag(Qt::LeftButton)) {
if (buttons.testFlag(Qt::LeftButton))
{
const bool set = !isMaximized();
setMaximizedHorizontally(set);
setMaximizedVertically(set);
} else if (buttons.testFlag(Qt::RightButton)) {
}
else if (buttons.testFlag(Qt::RightButton))
{
setMaximizedHorizontally(!isMaximizedHorizontally());
} else if (buttons.testFlag(Qt::MiddleButton)) {
}
else if (buttons.testFlag(Qt::MiddleButton))
{
setMaximizedVertically(!isMaximizedVertically());
}
}
@@ -484,13 +462,14 @@ void PreviewClient::requestToggleShade()
#define SETTER(type, name, variable) \
void PreviewClient::name(type variable) \
{ \
if (m_##variable == variable) { \
{ \
if (m_##variable == variable) \
{ \
return; \
} \
} \
m_##variable = variable; \
emit variable##Changed(m_##variable); \
}
}
#define SETTER2(name, variable) SETTER(bool, name, variable)
@@ -516,6 +495,3 @@ SETTER2(setProvidesContextHelp, providesContextHelp)
#undef SETTER2
#undef SETTER
} // namespace Applet
} // namespace Decoration
+8 -13
View File
@@ -26,19 +26,17 @@
#include "decorationpalette.h"
#include <config-decoration.h>
#include <KDecoration2/Private/DecoratedClientPrivate>
#include <QObject>
#include <QPalette>
#include <config-decoration.h>
#include <kdecoration2/decoration.h>
class QAbstractItemModel;
namespace Decoration {
namespace Applet {
class PreviewClient : public QObject, public KDecoration2::ApplicationMenuEnabledDecoratedClientPrivate
class PreviewClient
: public QObject
, public KDecoration2::ApplicationMenuEnabledDecoratedClientPrivate
{
Q_OBJECT
Q_PROPERTY(KDecoration2::Decoration *decoration READ decoration CONSTANT)
@@ -68,7 +66,7 @@ class PreviewClient : public QObject, public KDecoration2::ApplicationMenuEnable
Q_PROPERTY(bool bordersLeftEdge READ bordersLeftEdge WRITE setBordersLeftEdge NOTIFY bordersLeftEdgeChanged)
Q_PROPERTY(bool bordersRightEdge READ bordersRightEdge WRITE setBordersRightEdge NOTIFY bordersRightEdgeChanged)
Q_PROPERTY(bool bordersBottomEdge READ bordersBottomEdge WRITE setBordersBottomEdge NOTIFY bordersBottomEdgeChanged)
public:
public:
explicit PreviewClient(KDecoration2::DecoratedClient *client, KDecoration2::Decoration *decoration);
virtual ~PreviewClient();
@@ -166,7 +164,7 @@ public:
void setBordersRightEdge(bool enabled);
void setBordersBottomEdge(bool enabled);
Q_SIGNALS:
Q_SIGNALS:
void captionChanged(const QString &);
void iconChanged(const QIcon &);
void iconNameChanged(const QString &);
@@ -200,12 +198,12 @@ Q_SIGNALS:
void minimizeRequested();
void closeRequested();
private:
private:
QString m_caption;
QIcon m_icon;
QString m_iconName;
QString m_colorScheme;
Decoration::Applet::DecorationPalette *m_palette{nullptr};
DecorationPalette *m_palette{ nullptr };
bool m_active;
bool m_closeable;
bool m_keepBelow;
@@ -229,7 +227,4 @@ private:
bool m_bordersBottomEdge;
};
} // namespace Applet
} // namespace Decoration
#endif
+56 -68
View File
@@ -22,19 +22,15 @@
*/
#include "previewsettings.h"
#include "previewbridge.h"
#include "buttonsmodel.h"
#include "previewbridge.h"
#include <KLocalizedString>
#include <QFontDatabase>
#include <memory>
namespace Decoration {
namespace Applet {
BorderSizesModel::BorderSizesModel(QObject *parent)
: QAbstractListModel(parent)
BorderSizesModel::BorderSizesModel(QObject *parent) : QAbstractListModel(parent)
{
}
@@ -42,11 +38,13 @@ BorderSizesModel::~BorderSizesModel() = default;
QVariant BorderSizesModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= m_borders.count() || index.column() != 0) {
if (!index.isValid() || index.row() < 0 || index.row() >= m_borders.count() || index.column() != 0)
{
return QVariant();
}
if (role != Qt::DisplayRole && role != Qt::UserRole) {
if (role != Qt::DisplayRole && role != Qt::UserRole)
{
return QVariant();
}
@@ -55,14 +53,15 @@ QVariant BorderSizesModel::data(const QModelIndex &index, int role) const
int BorderSizesModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
if (parent.isValid())
{
return 0;
}
return m_borders.count();
}
QHash< int, QByteArray > BorderSizesModel::roleNames() const
QHash<int, QByteArray> BorderSizesModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles.insert(Qt::DisplayRole, QByteArrayLiteral("display"));
@@ -70,50 +69,31 @@ QHash< int, QByteArray > BorderSizesModel::roleNames() const
}
PreviewSettings::PreviewSettings(KDecoration2::DecorationSettings *parent)
: QObject()
, KDecoration2::DecorationSettingsPrivate(parent)
, m_alphaChannelSupported(true)
, m_onAllDesktopsAvailable(true)
, m_closeOnDoubleClick(false)
, m_leftButtons(new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({
KDecoration2::DecorationButtonType::Minimize,
KDecoration2::DecorationButtonType::Close,
KDecoration2::DecorationButtonType::Menu,
KDecoration2::DecorationButtonType::ApplicationMenu,
KDecoration2::DecorationButtonType::OnAllDesktops
}), this))
, m_rightButtons(new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({
KDecoration2::DecorationButtonType::ContextHelp,
KDecoration2::DecorationButtonType::Minimize,
KDecoration2::DecorationButtonType::Maximize,
KDecoration2::DecorationButtonType::Close
}), this))
, m_availableButtons(new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({
KDecoration2::DecorationButtonType::Menu,
KDecoration2::DecorationButtonType::ApplicationMenu,
KDecoration2::DecorationButtonType::OnAllDesktops,
KDecoration2::DecorationButtonType::Minimize,
KDecoration2::DecorationButtonType::Maximize,
KDecoration2::DecorationButtonType::Close,
KDecoration2::DecorationButtonType::ContextHelp,
KDecoration2::DecorationButtonType::Shade,
KDecoration2::DecorationButtonType::KeepBelow,
KDecoration2::DecorationButtonType::KeepAbove
}), this))
, m_borderSizes(new BorderSizesModel(this))
, m_borderSize(int(KDecoration2::BorderSize::Normal))
, m_font(QFontDatabase::systemFont(QFontDatabase::TitleFont))
: QObject(), KDecoration2::DecorationSettingsPrivate(parent), m_alphaChannelSupported(true), m_onAllDesktopsAvailable(true), m_closeOnDoubleClick(false),
m_leftButtons(
new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({ KDecoration2::DecorationButtonType::Minimize, KDecoration2::DecorationButtonType::Close,
KDecoration2::DecorationButtonType::Menu, KDecoration2::DecorationButtonType::ApplicationMenu,
KDecoration2::DecorationButtonType::OnAllDesktops }),
this)),
m_rightButtons(
new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({ KDecoration2::DecorationButtonType::ContextHelp, KDecoration2::DecorationButtonType::Minimize,
KDecoration2::DecorationButtonType::Maximize, KDecoration2::DecorationButtonType::Close }),
this)),
m_availableButtons(
new ButtonsModel(QVector<KDecoration2::DecorationButtonType>({ KDecoration2::DecorationButtonType::Menu, KDecoration2::DecorationButtonType::ApplicationMenu,
KDecoration2::DecorationButtonType::OnAllDesktops, KDecoration2::DecorationButtonType::Minimize,
KDecoration2::DecorationButtonType::Maximize, KDecoration2::DecorationButtonType::Close,
KDecoration2::DecorationButtonType::ContextHelp, KDecoration2::DecorationButtonType::Shade,
KDecoration2::DecorationButtonType::KeepBelow, KDecoration2::DecorationButtonType::KeepAbove }),
this)),
m_borderSizes(new BorderSizesModel(this)), m_borderSize(int(KDecoration2::BorderSize::Normal)), m_font(QFontDatabase::systemFont(QFontDatabase::TitleFont))
{
connect(this, &PreviewSettings::alphaChannelSupportedChanged, parent, &KDecoration2::DecorationSettings::alphaChannelSupportedChanged);
connect(this, &PreviewSettings::onAllDesktopsAvailableChanged, parent, &KDecoration2::DecorationSettings::onAllDesktopsAvailableChanged);
connect(this, &PreviewSettings::closeOnDoubleClickOnMenuChanged, parent, &KDecoration2::DecorationSettings::closeOnDoubleClickOnMenuChanged);
connect(this, &PreviewSettings::fontChanged, parent, &KDecoration2::DecorationSettings::fontChanged);
auto updateLeft = [this, parent]() {
parent->decorationButtonsLeftChanged(decorationButtonsLeft());
};
auto updateRight = [this, parent]() {
parent->decorationButtonsRightChanged(decorationButtonsRight());
};
auto updateLeft = [this, parent]() { parent->decorationButtonsLeftChanged(decorationButtonsLeft()); };
auto updateRight = [this, parent]() { parent->decorationButtonsRightChanged(decorationButtonsRight()); };
connect(m_leftButtons, &QAbstractItemModel::rowsRemoved, this, updateLeft);
connect(m_leftButtons, &QAbstractItemModel::rowsMoved, this, updateLeft);
connect(m_leftButtons, &QAbstractItemModel::rowsInserted, this, updateLeft);
@@ -151,7 +131,8 @@ bool PreviewSettings::isOnAllDesktopsAvailable() const
void PreviewSettings::setAlphaChannelSupported(bool supported)
{
if (m_alphaChannelSupported == supported) {
if (m_alphaChannelSupported == supported)
{
return;
}
@@ -161,7 +142,8 @@ void PreviewSettings::setAlphaChannelSupported(bool supported)
void PreviewSettings::setOnAllDesktopsAvailable(bool available)
{
if (m_onAllDesktopsAvailable == available) {
if (m_onAllDesktopsAvailable == available)
{
return;
}
@@ -171,7 +153,8 @@ void PreviewSettings::setOnAllDesktopsAvailable(bool available)
void PreviewSettings::setCloseOnDoubleClickOnMenu(bool enabled)
{
if (m_closeOnDoubleClick == enabled) {
if (m_closeOnDoubleClick == enabled)
{
return;
}
@@ -179,12 +162,12 @@ void PreviewSettings::setCloseOnDoubleClickOnMenu(bool enabled)
emit closeOnDoubleClickOnMenuChanged(enabled);
}
QVector< KDecoration2::DecorationButtonType > PreviewSettings::decorationButtonsLeft() const
QVector<KDecoration2::DecorationButtonType> PreviewSettings::decorationButtonsLeft() const
{
return m_leftButtons->buttons();
}
QVector< KDecoration2::DecorationButtonType > PreviewSettings::decorationButtonsRight() const
QVector<KDecoration2::DecorationButtonType> PreviewSettings::decorationButtonsRight() const
{
return m_rightButtons->buttons();
}
@@ -193,7 +176,8 @@ void PreviewSettings::addButtonToLeft(int row)
{
QModelIndex index = m_availableButtons->index(row);
if (!index.isValid()) {
if (!index.isValid())
{
return;
}
@@ -204,7 +188,8 @@ void PreviewSettings::addButtonToRight(int row)
{
QModelIndex index = m_availableButtons->index(row);
if (!index.isValid()) {
if (!index.isValid())
{
return;
}
@@ -213,7 +198,8 @@ void PreviewSettings::addButtonToRight(int row)
void PreviewSettings::setBorderSizesIndex(int index)
{
if (m_borderSize == index) {
if (m_borderSize == index)
{
return;
}
@@ -229,7 +215,8 @@ KDecoration2::BorderSize PreviewSettings::borderSize() const
void PreviewSettings::setFont(const QFont &font)
{
if (m_font == font) {
if (m_font == font)
{
return;
}
@@ -237,8 +224,7 @@ void PreviewSettings::setFont(const QFont &font)
emit fontChanged(m_font);
}
Settings::Settings(QObject *parent)
: QObject(parent)
Settings::Settings(QObject *parent) : QObject(parent)
{
connect(this, &Settings::bridgeChanged, this, &Settings::createSettings);
}
@@ -247,7 +233,8 @@ Settings::~Settings() = default;
void Settings::setBridge(PreviewBridge *bridge)
{
if (m_bridge == bridge) {
if (m_bridge == bridge)
{
return;
}
@@ -262,9 +249,12 @@ PreviewBridge *Settings::bridge() const
void Settings::createSettings()
{
if (m_bridge.isNull()) {
if (m_bridge.isNull())
{
m_settings.reset();
} else {
}
else
{
m_settings = std::make_shared<KDecoration2::DecorationSettings>(m_bridge.data());
m_previewSettings = m_bridge->lastCreatedSettings();
m_previewSettings->setBorderSizesIndex(m_borderSize);
@@ -286,13 +276,11 @@ KDecoration2::DecorationSettings *Settings::settingsPointer() const
void Settings::setBorderSizesIndex(int index)
{
if (m_borderSize == index) {
if (m_borderSize == index)
{
return;
}
m_borderSize = index;
emit borderSizesIndexChanged(m_borderSize);
}
}
}
+32 -41
View File
@@ -24,46 +24,35 @@
#ifndef KDECOARTIONS_PREVIEW_SETTINGS_H
#define KDECOARTIONS_PREVIEW_SETTINGS_H
#include <KDecoration2/Private/DecorationSettingsPrivate>
#include <KDecoration2/DecorationSettings>
#include <QObject>
#include <KDecoration2/Private/DecorationSettingsPrivate>
#include <QAbstractListModel>
#include <QObject>
#include <QPointer>
namespace KDecoration2 {
class DecorationSettings;
}
namespace Decoration {
namespace Applet {
class ButtonsModel;
class PreviewBridge;
class BorderSizesModel : public QAbstractListModel
{
Q_OBJECT
public:
public:
explicit BorderSizesModel(QObject *parent = 0);
virtual ~BorderSizesModel();
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash< int, QByteArray > roleNames() const override;
private:
QList<KDecoration2::BorderSize> m_borders = QList<KDecoration2::BorderSize>({
KDecoration2::BorderSize::None,
KDecoration2::BorderSize::NoSides,
KDecoration2::BorderSize::Tiny,
KDecoration2::BorderSize::Normal,
KDecoration2::BorderSize::Large,
KDecoration2::BorderSize::VeryLarge,
KDecoration2::BorderSize::Huge,
KDecoration2::BorderSize::VeryHuge,
KDecoration2::BorderSize::Oversized
});
QHash<int, QByteArray> roleNames() const override;
private:
QList<KDecoration2::BorderSize> m_borders =
QList<KDecoration2::BorderSize>({ KDecoration2::BorderSize::None, KDecoration2::BorderSize::NoSides, KDecoration2::BorderSize::Tiny,
KDecoration2::BorderSize::Normal, KDecoration2::BorderSize::Large, KDecoration2::BorderSize::VeryLarge,
KDecoration2::BorderSize::Huge, KDecoration2::BorderSize::VeryHuge, KDecoration2::BorderSize::Oversized });
};
class PreviewSettings : public QObject, public KDecoration2::DecorationSettingsPrivate
class PreviewSettings
: public QObject
, public KDecoration2::DecorationSettingsPrivate
{
Q_OBJECT
Q_PROPERTY(bool onAllDesktopsAvailable READ isOnAllDesktopsAvailable WRITE setOnAllDesktopsAvailable NOTIFY onAllDesktopsAvailableChanged)
@@ -75,12 +64,13 @@ class PreviewSettings : public QObject, public KDecoration2::DecorationSettingsP
Q_PROPERTY(QAbstractItemModel *borderSizesModel READ borderSizesModel CONSTANT)
Q_PROPERTY(int borderSizesIndex READ borderSizesIndex WRITE setBorderSizesIndex NOTIFY borderSizesIndexChanged)
Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)
public:
public:
explicit PreviewSettings(KDecoration2::DecorationSettings *parent);
virtual ~PreviewSettings();
bool isAlphaChannelSupported() const override;
bool isOnAllDesktopsAvailable() const override;
bool isCloseOnDoubleClickOnMenu() const override {
bool isCloseOnDoubleClickOnMenu() const override
{
return m_closeOnDoubleClick;
}
KDecoration2::BorderSize borderSize() const override;
@@ -92,34 +82,37 @@ public:
QAbstractItemModel *leftButtonsModel() const;
QAbstractItemModel *rightButtonsModel() const;
QAbstractItemModel *availableButtonsModel() const;
QAbstractItemModel *borderSizesModel() const {
QAbstractItemModel *borderSizesModel() const
{
return m_borderSizes;
}
QVector< KDecoration2::DecorationButtonType > decorationButtonsLeft() const override;
QVector< KDecoration2::DecorationButtonType > decorationButtonsRight() const override;
QVector<KDecoration2::DecorationButtonType> decorationButtonsLeft() const override;
QVector<KDecoration2::DecorationButtonType> decorationButtonsRight() const override;
Q_INVOKABLE void addButtonToLeft(int row);
Q_INVOKABLE void addButtonToRight(int row);
int borderSizesIndex() const {
int borderSizesIndex() const
{
return m_borderSize;
}
void setBorderSizesIndex(int index);
QFont font() const override{
QFont font() const override
{
return m_font;
}
void setFont(const QFont &font);
Q_SIGNALS:
Q_SIGNALS:
void onAllDesktopsAvailableChanged(bool);
void alphaChannelSupportedChanged(bool);
void closeOnDoubleClickOnMenuChanged(bool);
void borderSizesIndexChanged(int);
void fontChanged(const QFont &);
private:
private:
bool m_alphaChannelSupported;
bool m_onAllDesktopsAvailable;
bool m_closeOnDoubleClick;
@@ -134,10 +127,10 @@ private:
class Settings : public QObject
{
Q_OBJECT
Q_PROPERTY(Decoration::Applet::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(KDecoration2::DecorationSettings *settings READ settingsPointer NOTIFY settingsChanged)
Q_PROPERTY(int borderSizesIndex READ borderSizesIndex WRITE setBorderSizesIndex NOTIFY borderSizesIndexChanged)
public:
public:
explicit Settings(QObject *parent = nullptr);
virtual ~Settings();
@@ -146,17 +139,18 @@ public:
std::shared_ptr<KDecoration2::DecorationSettings> settings() const;
KDecoration2::DecorationSettings *settingsPointer() const;
int borderSizesIndex() const {
int borderSizesIndex() const
{
return m_borderSize;
}
void setBorderSizesIndex(int index);
Q_SIGNALS:
Q_SIGNALS:
void bridgeChanged();
void settingsChanged();
void borderSizesIndexChanged(int);
private:
private:
void createSettings();
QPointer<PreviewBridge> m_bridge;
std::shared_ptr<KDecoration2::DecorationSettings> m_settings;
@@ -164,7 +158,4 @@ private:
int m_borderSize = 3;
};
}
}
#endif
+23 -21
View File
@@ -28,14 +28,10 @@
#include <KDecoration2/Decoration>
namespace Decoration {
namespace Applet {
SharedDecoration::SharedDecoration(QObject *parent) :
QObject(parent)
SharedDecoration::SharedDecoration(QObject *parent) : QObject(parent)
{
connect(this, &Decoration::Applet::SharedDecoration::bridgeChanged, this, &Decoration::Applet::SharedDecoration::createDecoration);
connect(this, &Decoration::Applet::SharedDecoration::settingsChanged, this, &Decoration::Applet::SharedDecoration::applySettings);
connect(this, &SharedDecoration::bridgeChanged, this, &SharedDecoration::createDecoration);
connect(this, &SharedDecoration::settingsChanged, this, &SharedDecoration::applySettings);
}
SharedDecoration::~SharedDecoration()
@@ -49,17 +45,19 @@ PreviewBridge *SharedDecoration::bridge() const
void SharedDecoration::setBridge(PreviewBridge *bridge)
{
if (m_bridge == bridge) {
if (m_bridge == bridge)
{
return;
}
if (m_bridge) {
connect(m_bridge, &Decoration::Applet::PreviewBridge::validChanged, this, &Decoration::Applet::SharedDecoration::createDecoration);
if (m_bridge)
{
connect(m_bridge, &PreviewBridge::validChanged, this, &SharedDecoration::createDecoration);
}
m_bridge = bridge;
connect(m_bridge, &Decoration::Applet::PreviewBridge::validChanged, this, &Decoration::Applet::SharedDecoration::createDecoration);
connect(m_bridge, &PreviewBridge::validChanged, this, &SharedDecoration::createDecoration);
emit bridgeChanged();
}
@@ -76,7 +74,8 @@ Settings *SharedDecoration::settings() const
void SharedDecoration::setSettings(Settings *settings)
{
if (m_settings == settings) {
if (m_settings == settings)
{
return;
}
@@ -89,7 +88,8 @@ void SharedDecoration::setSettings(Settings *settings)
void SharedDecoration::applySettings()
{
if (!m_decoration || !m_settings) {
if (!m_decoration || !m_settings)
{
return;
}
@@ -99,21 +99,25 @@ void SharedDecoration::applySettings()
void SharedDecoration::createDecoration()
{
if (!m_bridge || !m_settings) {
if (!m_bridge || !m_settings)
{
return;
}
bool newDecoration = (m_bridge->plugin() != m_lastPlugin || m_bridge->theme() != m_lastTheme);
if (m_decoration && newDecoration) {
if (m_decoration && newDecoration)
{
m_decoration->deleteLater();
}
if (newDecoration) {
if (newDecoration)
{
m_decoration = m_bridge->createDecoration(this);
}
if (m_decoration) {
if (m_decoration)
{
m_decoration->setSettings(m_settings->settings());
m_decoration->init();
m_decoration->setObjectName("applet-window-buttons");
@@ -127,10 +131,8 @@ void SharedDecoration::createDecoration()
void SharedDecoration::initDecoration()
{
if (m_decoration) {
if (m_decoration)
{
m_decoration->init();
}
}
}
}
+10 -21
View File
@@ -23,18 +23,10 @@
#ifndef PREVIEWSHAREDDECORATION_H
#define PREVIEWSHAREDDECORATION_H
#include <QObject>
#include "previewbridge.h"
#include "previewsettings.h"
namespace KDecoration2 {
class Decoration;
}
namespace Decoration {
namespace Applet {
#include <QObject>
class PreviewBridge;
class PreviewButton;
@@ -43,10 +35,10 @@ class Settings;
class SharedDecoration : public QObject
{
Q_OBJECT
Q_PROPERTY(Decoration::Applet::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(Decoration::Applet::Settings *settings READ settings WRITE setSettings NOTIFY settingsChanged)
Q_PROPERTY(PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged)
Q_PROPERTY(Settings *settings READ settings WRITE setSettings NOTIFY settingsChanged)
public:
public:
explicit SharedDecoration(QObject *parent = nullptr);
virtual ~SharedDecoration();
@@ -60,27 +52,24 @@ public:
void initDecoration();
public Q_SLOTS:
public Q_SLOTS:
Q_INVOKABLE void createDecoration();
Q_SIGNALS:
Q_SIGNALS:
void bridgeChanged();
void decorationChanged();
void settingsChanged();
private Q_SLOTS:
private Q_SLOTS:
void applySettings();
private:
QPointer<Decoration::Applet::PreviewBridge> m_bridge;
private:
QPointer<PreviewBridge> m_bridge;
QPointer<KDecoration2::Decoration> m_decoration;
QPointer<Decoration::Applet::Settings> m_settings;
QPointer<Settings> m_settings;
QString m_lastPlugin;
QString m_lastTheme;
};
}
}
#endif
+31 -27
View File
@@ -20,29 +20,24 @@
#include "schemecolors.h"
#include <config-decoration.h>
#include "commontools.h"
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <KConfigGroup>
#include <KDirWatch>
#include <KSharedConfig>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <config-decoration.h>
using namespace Qt::StringLiterals;
namespace Decoration {
namespace Applet {
SchemeColors::SchemeColors(QObject *parent, QString scheme, bool plasmaTheme) :
QObject(parent),
m_basedOnPlasmaTheme(plasmaTheme)
SchemeColors::SchemeColors(QObject *parent, QString scheme, bool plasmaTheme) : QObject(parent), m_basedOnPlasmaTheme(plasmaTheme)
{
QString pSchemeFile = possibleSchemeFile(scheme);
if (QFileInfo(pSchemeFile).exists()) {
if (QFileInfo(pSchemeFile).exists())
{
setSchemeFile(pSchemeFile);
m_schemeName = schemeName(pSchemeFile);
@@ -142,7 +137,8 @@ QString SchemeColors::SchemeColors::schemeFile() const
void SchemeColors::setSchemeFile(QString file)
{
if (m_schemeFile == file) {
if (m_schemeFile == file)
{
return;
}
@@ -152,16 +148,19 @@ void SchemeColors::setSchemeFile(QString file)
QString SchemeColors::possibleSchemeFile(QString scheme)
{
if (scheme.startsWith("/") && scheme.endsWith("colors") && QFileInfo(scheme).exists()) {
if (scheme.startsWith("/") && scheme.endsWith("colors") && QFileInfo(scheme).exists())
{
return scheme;
}
QString tempScheme = scheme;
if (scheme == "kdeglobals") {
if (scheme == "kdeglobals")
{
QString settingsFile = QDir::homePath() + "/.config/kdeglobals";
if (QFileInfo(settingsFile).exists()) {
if (QFileInfo(settingsFile).exists())
{
KSharedConfigPtr filePtr = KSharedConfig::openConfig(settingsFile);
KConfigGroup generalGroup = KConfigGroup(filePtr, u"General"_qs);
#if KDECORATION2_VERSION_MAJOR > 5 || KDECORATION2_VERSION_MINOR >= 21
@@ -180,7 +179,8 @@ QString SchemeColors::possibleSchemeFile(QString scheme)
QString SchemeColors::schemeName(QString originalFile)
{
if (!(originalFile.startsWith("/") && originalFile.endsWith("colors") && QFileInfo(originalFile).exists())) {
if (!(originalFile.startsWith("/") && originalFile.endsWith("colors") && QFileInfo(originalFile).exists()))
{
return "";
}
@@ -188,11 +188,13 @@ QString SchemeColors::schemeName(QString originalFile)
int lastSlash = originalFile.lastIndexOf("/");
if (lastSlash >= 0) {
if (lastSlash >= 0)
{
fileNameNoExt.remove(0, lastSlash + 1);
}
if (fileNameNoExt.endsWith(".colors")) {
if (fileNameNoExt.endsWith(".colors"))
{
fileNameNoExt.remove(".colors");
}
@@ -204,7 +206,8 @@ QString SchemeColors::schemeName(QString originalFile)
void SchemeColors::updateScheme()
{
if (m_schemeFile.isEmpty() || !QFileInfo(m_schemeFile).exists()) {
if (m_schemeFile.isEmpty() || !QFileInfo(m_schemeFile).exists())
{
return;
}
@@ -212,15 +215,18 @@ void SchemeColors::updateScheme()
KConfigGroup wmGroup = KConfigGroup(filePtr, u"WM"_qs);
KConfigGroup selGroup = KConfigGroup(filePtr, u"Colors:Selection"_qs);
KConfigGroup viewGroup = KConfigGroup(filePtr, u"Colors:View"_qs);
//KConfigGroup windowGroup = KConfigGroup(filePtr, "Colors:Window");
// KConfigGroup windowGroup = KConfigGroup(filePtr, "Colors:Window");
KConfigGroup buttonGroup = KConfigGroup(filePtr, u"Colors:Button"_qs);
if (!m_basedOnPlasmaTheme) {
if (!m_basedOnPlasmaTheme)
{
m_activeBackgroundColor = wmGroup.readEntry("activeBackground", QColor());
m_activeTextColor = wmGroup.readEntry("activeForeground", QColor());
m_inactiveBackgroundColor = wmGroup.readEntry("inactiveBackground", QColor());
m_inactiveTextColor = wmGroup.readEntry("inactiveForeground", QColor());
} else {
}
else
{
m_activeBackgroundColor = viewGroup.readEntry("BackgroundNormal", QColor());
m_activeTextColor = viewGroup.readEntry("ForegroundNormal", QColor());
m_inactiveBackgroundColor = viewGroup.readEntry("BackgroundAlternate", QColor());
@@ -231,7 +237,8 @@ void SchemeColors::updateScheme()
m_highlightedTextColor = selGroup.readEntry("ForegroundNormal", QColor());
m_positiveColor = selGroup.readEntry("ForegroundPositive", QColor());
m_neutralText = selGroup.readEntry("ForegroundNeutral", QColor());;
m_neutralText = selGroup.readEntry("ForegroundNeutral", QColor());
;
m_negativeText = selGroup.readEntry("ForegroundNegative", QColor());
m_buttonTextColor = buttonGroup.readEntry("ForegroundNormal", QColor());
@@ -241,6 +248,3 @@ void SchemeColors::updateScheme()
emit colorsChanged();
}
}
}
+7 -13
View File
@@ -21,13 +21,10 @@
#ifndef SCHEMECOLORS_H
#define SCHEMECOLORS_H
#include <QObject>
#include <QColor>
#include <QObject>
namespace Decoration {
namespace Applet {
class SchemeColors: public QObject
class SchemeColors : public QObject
{
Q_OBJECT
Q_PROPERTY(QString schemeFile READ schemeFile NOTIFY schemeFileChanged)
@@ -48,7 +45,7 @@ class SchemeColors: public QObject
Q_PROPERTY(QColor buttonHoverColor READ buttonHoverColor NOTIFY colorsChanged)
Q_PROPERTY(QColor buttonFocusColor READ buttonFocusColor NOTIFY colorsChanged)
public:
public:
SchemeColors(QObject *parent, QString scheme, bool plasmaTheme = false);
~SchemeColors() override;
@@ -75,15 +72,15 @@ public:
static QString possibleSchemeFile(QString scheme);
static QString schemeName(QString originalFile);
signals:
signals:
void colorsChanged();
void schemeFileChanged();
public slots:
public slots:
void updateScheme();
private:
bool m_basedOnPlasmaTheme{false};
private:
bool m_basedOnPlasmaTheme{ false };
QString m_schemeName;
QString m_schemeFile;
@@ -106,7 +103,4 @@ private:
QColor m_buttonFocusColor;
};
}
}
#endif
+55 -43
View File
@@ -26,11 +26,7 @@
#include <QDebug>
#include <QDir>
namespace Decoration {
namespace Applet {
SchemesModel::SchemesModel(QObject *parent)
: QAbstractListModel(parent)
SchemesModel::SchemesModel(QObject *parent) : QAbstractListModel(parent)
{
initSchemes();
}
@@ -42,36 +38,42 @@ SchemesModel::~SchemesModel()
QVariant SchemesModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= m_schemes.count()) {
if (!index.isValid() || index.column() != 0 || index.row() < 0 || index.row() >= m_schemes.count())
{
return QVariant();
}
const SchemeColors *d = m_schemes[index.row()];
switch (role) {
switch (role)
{
case Qt::DisplayRole:
if (index.row() == 0) {
if (index.row() == 0)
{
return "Current";
} else if (index.row() == 1) {
}
else if (index.row() == 1)
{
return "Plasma Theme";
}
return d->schemeName();
case Qt::UserRole + 4:
if (index.row() == 0) {
if (index.row() == 0)
{
return "kdeglobals";
} else if (index.row() == 1) {
}
else if (index.row() == 1)
{
return "_plasmatheme_";
}
return d->schemeFile();
case Qt::UserRole + 5:
return d->backgroundColor();
case Qt::UserRole + 5: return d->backgroundColor();
case Qt::UserRole + 6:
return d->textColor();
case Qt::UserRole + 6: return d->textColor();
}
return QVariant();
@@ -79,32 +81,33 @@ QVariant SchemesModel::data(const QModelIndex &index, int role) const
int SchemesModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
if (parent.isValid())
{
return 0;
}
return m_schemes.count();
}
QHash< int, QByteArray > SchemesModel::roleNames() const
QHash<int, QByteArray> SchemesModel::roleNames() const
{
QHash<int, QByteArray> roles({
{Qt::DisplayRole, QByteArrayLiteral("display")},
{Qt::UserRole + 4, QByteArrayLiteral("file")},
{Qt::UserRole + 5, QByteArrayLiteral("backgroundColor")},
{Qt::UserRole + 6, QByteArrayLiteral("textColor")}
});
QHash<int, QByteArray> roles({ { Qt::DisplayRole, QByteArrayLiteral("display") },
{ Qt::UserRole + 4, QByteArrayLiteral("file") },
{ Qt::UserRole + 5, QByteArrayLiteral("backgroundColor") },
{ Qt::UserRole + 6, QByteArrayLiteral("textColor") } });
return roles;
}
QColor SchemesModel::backgroundOf(const int &index) const
{
if (index == 0) {
if (index == 0)
{
auto ind = indexOf(m_defaultSchemeFile);
return ind>=0 ? m_schemes[ind]->backgroundColor() : QColor("transparent");
return ind >= 0 ? m_schemes[ind]->backgroundColor() : QColor("transparent");
}
if (index>0 && index<m_schemes.count()) {
if (index > 0 && index < m_schemes.count())
{
return m_schemes[index]->backgroundColor();
}
@@ -115,7 +118,7 @@ QString SchemesModel::defaultSchemeFile() const
{
auto ind = indexOf(m_defaultSchemeFile);
return ind>=0 ? m_schemes[ind]->schemeFile() : QString();
return ind >= 0 ? m_schemes[ind]->schemeFile() : QString();
}
void SchemesModel::initSchemes()
@@ -131,12 +134,17 @@ void SchemesModel::initSchemes()
QStringList registeredSchemes;
for(auto path : standardPaths) {
for (auto path : standardPaths)
{
QDir directory(path);
QStringList tempSchemes = directory.entryList(QStringList() << "*.colors" << "*.COLORS", QDir::Files);
QStringList tempSchemes = directory.entryList(QStringList() << "*.colors"
<< "*.COLORS",
QDir::Files);
foreach (QString filename, tempSchemes) {
if (!registeredSchemes.contains(filename)) {
foreach (QString filename, tempSchemes)
{
if (!registeredSchemes.contains(filename))
{
QString fullPath = path + "/" + filename;
insertSchemeInList(fullPath);
registeredSchemes << filename;
@@ -149,20 +157,23 @@ void SchemesModel::insertSchemeInList(QString file)
{
SchemeColors *tempScheme = new SchemeColors(this, file);
int atPos{0};
int atPos{ 0 };
for (int i = 0; i < m_schemes.count(); i++) {
for (int i = 0; i < m_schemes.count(); i++)
{
SchemeColors *s = m_schemes[i];
int result = QString::compare(tempScheme->schemeName(), s->schemeName(), Qt::CaseInsensitive);
if (result < 0) {
if (result < 0)
{
atPos = i;
break;
} else {
}
else
{
atPos = i + 1;
}
}
m_schemes.insert(atPos, tempScheme);
@@ -170,24 +181,25 @@ void SchemesModel::insertSchemeInList(QString file)
int SchemesModel::indexOf(QString file) const
{
if (file.isEmpty() || file == "kdeglobals") {
if (file.isEmpty() || file == "kdeglobals")
{
return 0;
}
if (file == "_plasmatheme_") {
if (file == "_plasmatheme_")
{
return 1;
}
for (int i = 0; i < m_schemes.count(); i++) {
for (int i = 0; i < m_schemes.count(); i++)
{
SchemeColors *s = m_schemes[i];
if (s->schemeFile() == file) {
if (s->schemeFile() == file)
{
return i;
}
}
return -1;
}
}
}
+6 -12
View File
@@ -23,39 +23,33 @@
#include <QAbstractListModel>
namespace Decoration {
namespace Applet {
class SchemeColors;
class SchemesModel : public QAbstractListModel
{
Q_OBJECT
public:
public:
explicit SchemesModel(QObject *parent = nullptr);
virtual ~SchemesModel();
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QHash< int, QByteArray > roleNames() const override;
QHash<int, QByteArray> roleNames() const override;
Q_INVOKABLE int indexOf(QString file) const;
Q_INVOKABLE QColor backgroundOf(const int &index) const;
Q_INVOKABLE QString defaultSchemeFile() const;
private slots:
private slots:
void initSchemes();
private:
private:
void insertSchemeInList(QString file);
private:
private:
QString m_defaultSchemeFile;
QList<Decoration::Applet::SchemeColors *> m_schemes;
QList<SchemeColors *> m_schemes;
};
}
}
#endif
+34 -28
View File
@@ -20,26 +20,18 @@
#include "themeextended.h"
// local
#include "commontools.h"
#include "schemecolors.h"
// Qt
#include <KConfigGroup>
#include <KDirWatch>
#include <KSharedConfig>
#include <QDebug>
#include <QDir>
// KDE
#include <KDirWatch>
#include <KConfigGroup>
#include <KSharedConfig>
#define DEFAULTCOLORSCHEME "default.colors"
namespace Decoration {
namespace Applet {
ExtendedTheme::ExtendedTheme(QObject *parent) :
QObject(parent)
ExtendedTheme::ExtendedTheme(QObject *parent) : QObject(parent)
{
load();
@@ -64,7 +56,8 @@ QObject *ExtendedTheme::colors() const
void ExtendedTheme::setOriginalSchemeFile(const QString &file)
{
if (m_originalSchemePath == file) {
if (m_originalSchemePath == file)
{
return;
}
@@ -84,7 +77,8 @@ void ExtendedTheme::setOriginalSchemeFile(const QString &file)
void ExtendedTheme::updateDefaultScheme()
{
QString defaultFilePath = m_extendedThemeDir.path() + "/" + DEFAULTCOLORSCHEME;
if (QFileInfo(defaultFilePath).exists()) {
if (QFileInfo(defaultFilePath).exists())
{
QFile(defaultFilePath).remove();
}
@@ -93,7 +87,8 @@ void ExtendedTheme::updateDefaultScheme()
updateDefaultSchemeValues();
if (m_colorsScheme) {
if (m_colorsScheme)
{
disconnect(m_colorsScheme, &SchemeColors::colorsChanged, this, &ExtendedTheme::themeChanged);
m_colorsScheme->deleteLater();
}
@@ -112,7 +107,8 @@ void ExtendedTheme::updateDefaultSchemeValues()
KSharedConfigPtr originalPtr = KSharedConfig::openConfig(m_originalSchemePath);
KSharedConfigPtr defaultPtr = KSharedConfig::openConfig(m_colorsSchemePath);
if (originalPtr && defaultPtr) {
if (originalPtr && defaultPtr)
{
KConfigGroup normalWindowGroup(originalPtr, u"Colors:Window"_qs);
KConfigGroup defaultWMGroup(defaultPtr, u"WM"_qs);
@@ -127,9 +123,12 @@ void ExtendedTheme::loadThemePaths()
{
m_themePath = AppletDecoration::standardPath("plasma/desktoptheme/" + m_theme.themeName());
if (QDir(m_themePath+"/widgets").exists()) {
if (QDir(m_themePath + "/widgets").exists())
{
m_themeWidgetsPath = m_themePath + "/widgets";
} else {
}
else
{
m_themeWidgetsPath = AppletDecoration::standardPath("plasma/desktoptheme/default/widgets");
}
@@ -138,30 +137,40 @@ void ExtendedTheme::loadThemePaths()
qDebug() << "Window Buttons : theme widgets path ::: " << m_themeWidgetsPath;
//! clear kde connections
for (auto &c : m_kdeConnections) {
for (auto &c : m_kdeConnections)
{
disconnect(c);
}
//! assign color schemes
QString themeColorScheme = m_themePath + "/colors";
if (QFileInfo(themeColorScheme).exists()) {
if (QFileInfo(themeColorScheme).exists())
{
setOriginalSchemeFile(themeColorScheme);
} else {
}
else
{
//! when plasma theme uses the kde colors
//! we track when kde color scheme is changing
QString kdeSettingsFile = QDir::homePath() + "/.config/kdeglobals";
KDirWatch::self()->addFile(kdeSettingsFile);
m_kdeConnections[0] = connect(KDirWatch::self(), &KDirWatch::dirty, this, [ &, kdeSettingsFile](const QString & path) {
if (path == kdeSettingsFile) {
m_kdeConnections[0] = connect(KDirWatch::self(), &KDirWatch::dirty, this,
[&, kdeSettingsFile](const QString &path)
{
if (path == kdeSettingsFile)
{
this->setOriginalSchemeFile(SchemeColors::possibleSchemeFile("kdeglobals"));
}
});
m_kdeConnections[1] = connect(KDirWatch::self(), &KDirWatch::created, this, [ &, kdeSettingsFile](const QString & path) {
if (path == kdeSettingsFile) {
m_kdeConnections[1] = connect(KDirWatch::self(), &KDirWatch::created, this,
[&, kdeSettingsFile](const QString &path)
{
if (path == kdeSettingsFile)
{
this->setOriginalSchemeFile(SchemeColors::possibleSchemeFile("kdeglobals"));
}
});
@@ -169,6 +178,3 @@ void ExtendedTheme::loadThemePaths()
setOriginalSchemeFile(SchemeColors::possibleSchemeFile("kdeglobals"));
}
}
}
}
+12 -28
View File
@@ -21,55 +21,42 @@
#ifndef PLASMAEXTENDEDTHEME_H
#define PLASMAEXTENDEDTHEME_H
// C++
#include <array>
#include "schemecolors.h"
// Qt
#include <QObject>
#include <QTemporaryDir>
// KDE
#include <KConfigGroup>
#include <KSharedConfig>
// Plasma
#include <KSvg/FrameSvg>
#include <Plasma/Theme>
#include <QObject>
#include <QTemporaryDir>
#include <array>
namespace Decoration {
namespace Applet {
class SchemeColors;
}
}
namespace Decoration {
namespace Applet {
class ExtendedTheme: public QObject
class ExtendedTheme : public QObject
{
Q_OBJECT
Q_PROPERTY(QObject *colors READ colors NOTIFY colorsChanged)
public:
public:
ExtendedTheme(QObject *parent = nullptr);
~ExtendedTheme() override;;
~ExtendedTheme() override;
;
QObject *colors() const;
void load();
signals:
signals:
void colorsChanged();
void themeChanged();
private:
private:
void loadThemePaths();
void setOriginalSchemeFile(const QString &file);
void updateDefaultScheme();
void updateDefaultSchemeValues();
private:
private:
QString m_themePath;
QString m_themeWidgetsPath;
QString m_colorsSchemePath;
@@ -81,10 +68,7 @@ private:
KConfigGroup m_themeGroup;
Plasma::Theme m_theme;
SchemeColors *m_colorsScheme{nullptr};
SchemeColors *m_colorsScheme{ nullptr };
};
}
}
#endif
+17 -17
View File
@@ -1,20 +1,20 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 "types.h"
+20 -27
View File
@@ -1,39 +1,36 @@
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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/>.
*/
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
* This file is part of the libappletdecoration library
*
* Latte-Dock 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) any later version.
*
* Latte-Dock 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 TYPES_H
#define TYPES_H
#include <QObject>
#include <QMetaEnum>
#include <QMetaType>
namespace Decoration {
namespace Applet {
#include <QObject>
class Types
{
Q_GADGET
public:
public:
Types() = delete;
~Types() {};
~Types(){};
enum ButtonType
{
@@ -96,10 +93,6 @@ public:
Latte
};
Q_ENUM(ContainmentType)
};
}
}
#endif
+5 -11
View File
@@ -23,12 +23,7 @@
#include <QProcess>
#include <QtDBus/QtDBus>
namespace Decoration {
namespace Applet {
WindowSystem::WindowSystem(QObject *parent)
: QObject(parent)
WindowSystem::WindowSystem(QObject *parent) : QObject(parent)
{
}
@@ -48,7 +43,8 @@ bool WindowSystem::kwin_disabledMaximizedBorders() const
void WindowSystem::setDisabledMaximizedBorders(bool disable)
{
if (kwin_disabledMaximizedBorders() == disable) {
if (kwin_disabledMaximizedBorders() == disable)
{
return;
}
@@ -61,10 +57,8 @@ void WindowSystem::setDisabledMaximizedBorders(bool disable)
QDBusInterface iface("org.kde.KWin", "/KWin", "", QDBusConnection::sessionBus());
if (iface.isValid()) {
if (iface.isValid())
{
iface.call("reconfigure");
}
}
}
}
+3 -10
View File
@@ -23,25 +23,18 @@
#include <QObject>
namespace Decoration {
namespace Applet {
class WindowSystem : public QObject
{
Q_OBJECT
public:
public:
explicit WindowSystem(QObject *parent = nullptr);
virtual ~WindowSystem();
public Q_SLOTS:
public Q_SLOTS:
Q_INVOKABLE void setDisabledMaximizedBorders(bool disable);
private:
private:
bool kwin_disabledMaximizedBorders() const;
};
}
}
#endif
+3 -3
View File
@@ -43,7 +43,7 @@ function addButton(preparedArray, buttonType) {
buttonType: AppletDecoration.Types.Custom,
windowOperation: -1
});
} else if (buttonType === AppletDecoration.Types.KeepAbove){
} else if (buttonType === AppletDecoration.Types.KeepAbove) {
preparedArray.push({
buttonType: AppletDecoration.Types.KeepAbove,
windowOperation: AppletDecoration.Types.ToggleKeepAbove
@@ -52,7 +52,7 @@ function addButton(preparedArray, buttonType) {
}
function indexOfSplitter(listModel) {
for (var i=0; i<listModel.count; ++i) {
for (var i = 0; i < listModel.count; ++i) {
var item = listModel.get(i);
if (item.buttonType === AppletDecoration.Types.Custom) {
@@ -66,7 +66,7 @@ function indexOfSplitter(listModel) {
function initializeControlButtonsModel(buttons, toArray, toListModel, stopOnSeparator) {
toArray.length = 0;
for (var i=0; i < buttons.length; ++i) {
for (var i = 0; i < buttons.length; ++i) {
var type = Number(buttons[i]);
if (type === AppletDecoration.Types.Custom && stopOnSeparator) {
+1 -1
View File
@@ -18,7 +18,6 @@
*/
import QtQuick 2.0
import org.kde.plasma.configuration 2.0
ConfigModel {
@@ -27,4 +26,5 @@ ConfigModel {
icon: "preferences-desktop-display-color"
source: "config/ConfigGeneral.qml"
}
}
+10 -11
View File
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/>
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="General">
<entry name="useCurrentDecoration" type="Bool">
@@ -27,9 +26,9 @@
</entry>
<entry name="visibility" type="Enum">
<choices>
<choice name="AlwaysVisible"/>
<choice name="ActiveWindow"/>
<choice name="ActiveMaximizedWindow"/>
<choice name="AlwaysVisible" />
<choice name="ActiveWindow" />
<choice name="ActiveMaximizedWindow" />
</choices>
<label>when the applet will be visible</label>
<default>0</default>
@@ -44,8 +43,8 @@
</entry>
<entry name="hiddenState" type="Enum">
<choices>
<choice name="SlideOut"/>
<choice name="EmptySpace"/>
<choice name="SlideOut" />
<choice name="EmptySpace" />
</choices>
<label>when the applet should be hidden how it should behave</label>
<default>0</default>
@@ -84,9 +83,9 @@
</entry>
<entry name="containmentType" type="Enum">
<choices>
<choice name="Loading"/>
<choice name="Plasma"/>
<choice name="Latte"/>
<choice name="Loading" />
<choice name="Plasma" />
<choice name="Latte" />
</choices>
<label>it helps to enable/disable options that are specific to plasma or Latte panels</label>
<default>0</default>
+6 -10
View File
@@ -21,27 +21,23 @@ import QtQuick
Item {
id: latteWindowsTracker
property bool filterByScreen: true
property bool filterByScreen: true
readonly property bool existsWindowActive: selectedTracker.lastActiveWindow.isValid && !lastActiveTaskItem.isMinimized && lastActiveTaskItem.isActive
readonly property bool existsWindowShown: selectedTracker.lastActiveWindow.isValid && !lastActiveTaskItem.isMinimized
readonly property QtObject selectedTracker: filterByScreen ? latteBridge.windowsTracker.currentScreen : latteBridge.windowsTracker.allScreens
readonly property Item lastActiveTaskItem: Item {
readonly property Item
lastActiveTaskItem: Item {
readonly property string title: selectedTracker.lastActiveWindow.display
readonly property bool isMinimized: selectedTracker.lastActiveWindow.isMinimized
readonly property bool isMaximized: selectedTracker.lastActiveWindow.isMaximized
readonly property bool isActive: selectedTracker.lastActiveWindow.isActive
readonly property bool isOnAllDesktops: selectedTracker.lastActiveWindow.isOnAllDesktops
readonly property bool isKeepAbove: selectedTracker.lastActiveWindow.isKeepAbove
readonly property bool isClosable: selectedTracker.lastActiveWindow.hasOwnProperty("isClosable") ? selectedTracker.lastActiveWindow.isClosable : true
readonly property bool isMinimizable: selectedTracker.lastActiveWindow.hasOwnProperty("isMinimizable") ? selectedTracker.lastActiveWindow.isMinimizable : true
readonly property bool isMaximizable: selectedTracker.lastActiveWindow.hasOwnProperty("isMaximizable") ? selectedTracker.lastActiveWindow.isMaximizable : true
readonly property bool isVirtualDesktopsChangeable: selectedTracker.lastActiveWindow.hasOwnProperty("isVirtualDesktopsChangeable") ?
selectedTracker.lastActiveWindow.isVirtualDesktopsChangeable : true
readonly property bool isVirtualDesktopsChangeable: selectedTracker.lastActiveWindow.hasOwnProperty("isVirtualDesktopsChangeable") ? selectedTracker.lastActiveWindow.isVirtualDesktopsChangeable : true
readonly property int winId: selectedTracker.lastActiveWindow.hasOwnProperty("winId") ? selectedTracker.lastActiveWindow.winId : -1
}
@@ -61,8 +57,8 @@ Item {
selectedTracker.lastActiveWindow.requestToggleIsOnAllDesktops();
}
function toggleKeepAbove(){
function toggleKeepAbove() {
selectedTracker.lastActiveWindow.requestToggleKeepAbove();
}
}
}
+51 -49
View File
@@ -17,22 +17,50 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import QtQml.Models 2.2
import org.kde.plasma.plasmoid 2.0
import QtQuick 2.7
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.plasmoid 2.0
import org.kde.taskmanager 0.1 as TaskManager
Item {
id: plasmaTasksItem
property bool filterByScreen: true
property bool filterByScreen: true
readonly property bool existsWindowActive: lastActiveTaskItem && tasksRepeater.count > 0 && (root.perScreenActive || lastActiveTaskItem.isActive)
readonly property bool existsWindowShown: lastActiveTaskItem && tasksRepeater.count > 0 && !lastActiveTaskItem.isMinimized
property Item lastActiveTaskItem: null
function toggleMaximized() {
if (lastActiveTaskItem)
lastActiveTaskItem.toggleMaximized();
}
function toggleMinimized() {
if (lastActiveTaskItem)
lastActiveTaskItem.toggleMinimized();
}
function toggleClose() {
if (lastActiveTaskItem)
lastActiveTaskItem.toggleClose();
}
function togglePinToAllDesktops() {
if (lastActiveTaskItem)
lastActiveTaskItem.togglePinToAllDesktops();
}
function toggleKeepAbove() {
if (lastActiveTaskItem)
lastActiveTaskItem.toggleKeepAbove();
}
// To get current activity name
TaskManager.ActivityInfo {
id: activityInfo
@@ -45,48 +73,38 @@ Item {
TaskManager.TasksModel {
id: tasksModel
sortMode: TaskManager.TasksModel.SortVirtualDesktop
groupMode: TaskManager.TasksModel.GroupDisabled
screenGeometry: root.screenGeometry
activity: activityInfo.currentActivity
virtualDesktop: virtualDesktopInfo.currentDesktop
filterByScreen: plasmaTasksItem.filterByScreen
filterByVirtualDesktop: true
filterByActivity: true
}
Repeater{
Repeater {
id: tasksRepeater
model:DelegateModel {
model: DelegateModel {
model: tasksModel
delegate: Item{
delegate: Item {
id: task
readonly property string title: display
readonly property bool isMinimized: IsMinimized === true ? true : false
readonly property bool isMaximized: IsMaximized === true ? true : false
readonly property bool isActive: IsActive === true ? true : false
readonly property bool isOnAllDesktops: IsOnAllVirtualDesktops === true ? true : false
readonly property bool isKeepAbove: IsKeepAbove === true ? true : false
readonly property bool isClosable: IsClosable === true ? true : false
readonly property bool isMinimizable: IsMinimizable === true ? true : false
readonly property bool isMaximizable: IsMaximizable === true ? true : false
readonly property bool isVirtualDesktopsChangeable: IsVirtualDesktopsChangeable === true ? true : false
onIsActiveChanged: {
if (isActive) {
plasmaTasksItem.lastActiveTaskItem = task;
}
}
Component.onDestruction: {
if (plasmaTasksItem.lastActiveTaskItem === task) {
plasmaTasksItem.lastActiveTaskItem = null;
}
}
function modelIndex(){
function modelIndex() {
return tasksModel.makeModelIndex(index);
}
@@ -106,40 +124,24 @@ Item {
tasksModel.requestVirtualDesktops(modelIndex(), 0);
}
function toggleKeepAbove(){
function toggleKeepAbove() {
tasksModel.requestToggleKeepAbove(modelIndex());
}
onIsActiveChanged: {
if (isActive)
plasmaTasksItem.lastActiveTaskItem = task;
}
Component.onDestruction: {
if (plasmaTasksItem.lastActiveTaskItem === task)
plasmaTasksItem.lastActiveTaskItem = null;
}
}
function toggleMaximized() {
if (lastActiveTaskItem) {
lastActiveTaskItem.toggleMaximized();
}
}
function toggleMinimized() {
if (lastActiveTaskItem) {
lastActiveTaskItem.toggleMinimized();
}
}
function toggleClose() {
if (lastActiveTaskItem) {
lastActiveTaskItem.toggleClose();
}
}
function togglePinToAllDesktops() {
if (lastActiveTaskItem) {
lastActiveTaskItem.togglePinToAllDesktops();
}
}
function toggleKeepAbove(){
if (lastActiveTaskItem) {
lastActiveTaskItem.toggleKeepAbove();
}
}
}
+25 -18
View File
@@ -25,58 +25,58 @@ ComboBox {
id: combobox
Connections {
target: popup
function onClosed() {
root.forceActiveFocus();
}
target: popup
}
delegate: MouseArea{
delegate: MouseArea {
width: combobox.width
height: combobox.height
hoverEnabled: true
onClicked: {
combobox.currentIndex = index;
selectedScheme = model.file;
combobox.popup.close();
}
Rectangle{
id:delegateBackground
Rectangle {
id: delegateBackground
readonly property color selectedColor: Qt.rgba(palette.highlight.r, palette.highlight.g, palette.highlight.b, 0.5)
anchors.fill: parent
color: {
if (containsMouse) {
if (containsMouse)
return palette.highlight;
}
if (combobox.currentIndex === index) {
if (combobox.currentIndex === index)
return selectedColor;
}
return "transparent";
}
readonly property color selectedColor: Qt.rgba(palette.highlight.r, palette.highlight.g, palette.highlight.b, 0.5);
RowLayout{
RowLayout {
id: delegateRow
height: parent.height
Item{
Item {
Layout.leftMargin: 2
width: 1.25 * label.height
height: label.height
opacity: ((file == "kdeglobals") || (file == "_plasmatheme_")) ? 0 : 1
Rectangle{
Rectangle {
width: height
height: 0.75 * label.height
color: backgroundColor
border.width: 1
border.color: containsMouse || (combobox.currentIndex === index) ? palette.highlightedText : palette.text
Rectangle{
Rectangle {
anchors.horizontalCenter: parent.right
anchors.verticalCenter: parent.bottom
width: parent.width
@@ -85,15 +85,22 @@ ComboBox {
border.width: parent.border.width
border.color: parent.border.color
}
}
}
Label{
}
Label {
id: label
text: display
color: containsMouse ? palette.highlightedText : palette.text
}
}
}
}
}
+121 -97
View File
@@ -20,16 +20,15 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components as PlasmaComponents
import org.kde.kitemmodels
import org.kde.kirigami as Kirigami
import org.kde.appletdecoration as AppletDecoration
import org.kde.kirigami as Kirigami
import org.kde.kitemmodels
import org.kde.plasma.components as PlasmaComponents
import org.kde.plasma.core as PlasmaCore
Item {
///END Decoration Items
id: root
property alias cfg_useCurrentDecoration: root.useCurrent
@@ -48,7 +47,6 @@ Item {
property alias cfg_lengthFirstMargin: lengthFirstSpn.value
property alias cfg_lengthLastMargin: lengthLastSpn.value
property alias cfg_lengthMarginsLock: lockItem.locked
property var cfg_buttonSizePercentageDefault
property var cfg_buttonsDefault
property var cfg_containmentType
@@ -70,7 +68,6 @@ Item {
property var cfg_useDecorationMetricsDefault
property var cfg_visibilityDefault
property var title
// used as bridge to communicate properly between configuration and ui
property bool useCurrent
property int hiddenState
@@ -79,41 +76,41 @@ Item {
property string selectedScheme
property string selectedTheme
property string currentButtons
// used from the ui
readonly property bool selectedDecorationExists: decorations.decorationExists(root.selectedPlugin, root.selectedTheme)
readonly property real centerFactor: 0.3
readonly property int minimumWidth: 220
property string currentPlugin: root.useCurrent || !selectedDecorationExists ? decorations.currentPlugin : root.selectedPlugin
property string currentTheme: root.useCurrent || !selectedDecorationExists ? decorations.currentTheme : root.selectedTheme
///START Decoration Items
AppletDecoration.Bridge {
id: bridgeItem
plugin: currentPlugin
theme: currentTheme
}
AppletDecoration.Settings {
id: settingsItem
bridge: bridgeItem.bridge
borderSizesIndex: 0
}
AppletDecoration.SharedDecoration {
id: sharedDecorationItem
bridge: bridgeItem.bridge
settings: settingsItem
}
AppletDecoration.AuroraeTheme {
id: auroraeThemeEngine
theme: isEnabled ? currentTheme : ""
readonly property bool isEnabled: decorations.isAurorae(root.currentPlugin, root.currentTheme)
theme: isEnabled ? currentTheme : ""
}
AppletDecoration.DecorationsModel {
@@ -137,34 +134,36 @@ Item {
// sort decorations based on display name
KSortFilterProxyModel {
id: sortedDecorations
sourceModel: decorations
sortRoleName: 'display'
sortOrder: Qt.AscendingOrder
}
///END Decoration Items
ColumnLayout {
id:mainColumn
id: mainColumn
spacing: Kirigami.Units.largeSpacing
Layout.fillWidth: true
RowLayout{
RowLayout {
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: i18n("Decoration:")
horizontalAlignment: Text.AlignRight
}
DecorationsComboBox{
DecorationsComboBox {
id: decorationCmb
Layout.minimumWidth: 180
Layout.preferredWidth: 0.2 * root.width
Layout.maximumWidth: 300
}
}
RowLayout{
RowLayout {
visible: !auroraeThemeEngine.isEnabled
Label {
@@ -173,55 +172,54 @@ Item {
horizontalAlignment: Text.AlignRight
}
ColorsComboBox{
id:colorsCmbBox
ColorsComboBox {
id: colorsCmbBox
Layout.minimumWidth: 250
Layout.preferredWidth: 0.3 * root.width
Layout.maximumWidth: 380
model: colorsModel
textRole: "display"
Component.onCompleted: {
currentIndex = colorsModel.indexOf(plasmoid.configuration.selectedScheme);
}
}
}
GridLayout{
GridLayout {
columns: 2
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: i18n("Buttons:")
horizontalAlignment: Text.AlignRight
}
OrderableListView{
OrderableListView {
id: activeButtons
readonly property color schemesBackgroundColor: plasmaThemeExtended.isActive ? plasmaThemeExtended.colors.backgroundColor : colorsModel.backgroundOf(colorsCmbBox.currentIndex)
itemWidth: 38
itemHeight: 38
buttonsStr: root.currentButtons
orientation: ListView.Horizontal
color: !auroraeThemeEngine.isEnabled ? schemesBackgroundColor : auroraeThemeEngine.titleBackgroundColor
buttonSize: buttonSizeSpn.value
buttonsFirstMargin: lengthFirstSpn.value
buttonsLastMargin: lengthLastSpn.value
buttonsSpacing: spacingSpn.value
readonly property color schemesBackgroundColor: plasmaThemeExtended.isActive ?
plasmaThemeExtended.colors.backgroundColor :
colorsModel.backgroundOf(colorsCmbBox.currentIndex)
}
}
GridLayout{
}
GridLayout {
columns: 2
rows: 4
flow: GridLayout.TopToBottom
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
Layout.rowSpan: 4
Layout.alignment: Qt.AlignTop | Qt.AlignRight
@@ -236,58 +234,65 @@ Item {
Column {
id: column
RadioButton{
RadioButton {
id: alwaysVisibleBtn
text: i18n("Always visible")
checked: root.visibility === AppletDecoration.Types.AlwaysVisible
onCheckedChanged: {
if (checked) {
if (checked)
root.visibility = AppletDecoration.Types.AlwaysVisible;
}
}
}
RadioButton{
RadioButton {
id: activeWindowBtn
text: i18n("Active window is present")
checked: root.visibility === AppletDecoration.Types.ActiveWindow
onCheckedChanged: {
if (checked) {
if (checked)
root.visibility = AppletDecoration.Types.ActiveWindow;
}
}
}
RadioButton{
RadioButton {
id: activeMaximizedBtn
text: plasmoid.configuration.containmentType === AppletDecoration.Types.Latte ?
i18n("Last active window is maximized") : i18n("Active window is maximized")
text: plasmoid.configuration.containmentType === AppletDecoration.Types.Latte ? i18n("Last active window is maximized") : i18n("Active window is maximized")
checked: root.visibility === AppletDecoration.Types.ActiveMaximizedWindow
onCheckedChanged: {
if (checked) {
if (checked)
root.visibility = AppletDecoration.Types.ActiveMaximizedWindow;
}
}
}
RadioButton{
RadioButton {
id: shownWindowBtn
text: i18n("At least one window is shown")
checked: root.visibility === AppletDecoration.Types.ShownWindowExists
onCheckedChanged: {
if (checked) {
if (checked)
root.visibility = AppletDecoration.Types.ShownWindowExists;
}
}
}
}
}
GridLayout{
}
}
GridLayout {
columns: 2
rows: 2
flow: GridLayout.TopToBottom
enabled: root.visibility !== AppletDecoration.Types.AlwaysVisible
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
Layout.rowSpan: 2
Layout.alignment: Qt.AlignTop | Qt.AlignRight
@@ -302,40 +307,47 @@ Item {
Column {
id: column2
RadioButton{
RadioButton {
id: slideOutBtn
text: i18n("Slide out animation")
checked: root.hiddenState === AppletDecoration.Types.SlideOut
onCheckedChanged: {
if (checked) {
if (checked)
root.hiddenState = AppletDecoration.Types.SlideOut;
}
}
}
RadioButton{
id: emptySpaceBtn
text: i18n("Preserve as empty space")
checked: root.hiddenState === AppletDecoration.Types.EmptySpace
onCheckedChanged: {
if (checked) {
root.hiddenState = AppletDecoration.Types.EmptySpace;
}
}
}
}
}
GridLayout{
Label{
RadioButton {
id: emptySpaceBtn
text: i18n("Preserve as empty space")
checked: root.hiddenState === AppletDecoration.Types.EmptySpace
onCheckedChanged: {
if (checked)
root.hiddenState = AppletDecoration.Types.EmptySpace;
}
}
}
}
GridLayout {
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: i18n("Filters:")
horizontalAlignment: Text.AlignRight
}
CheckBox{
CheckBox {
id: byScreenChk
text: i18n("Show only for windows in current screen")
}
}
GridLayout {
@@ -347,46 +359,51 @@ Item {
CheckBox {
id: stickyChk
text: i18n("Enabled")
}
}
GridLayout{
GridLayout {
columns: 2
rows: 2
flow: GridLayout.TopToBottom
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
Layout.alignment: Qt.AlignTop | Qt.AlignRight
Layout.rowSpan: 2
text: i18n("Appearance:")
horizontalAlignment: Text.AlignRight
}
CheckBox{
CheckBox {
id: inactiveChk
text: i18n("Draw buttons inactive state when needed")
}
}
ColumnLayout{
ColumnLayout {
id: visualSettings
GridLayout{
GridLayout {
id: visualSettingsGroup1
columns: 2
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: i18n("Metrics:")
horizontalAlignment: Text.AlignRight
visible: auroraeThemeEngine.isEnabled
}
CheckBox{
CheckBox {
id: decorationMetricsChk
text: i18n("Use from decoration if any are found")
visible: auroraeThemeEngine.isEnabled
}
@@ -400,6 +417,7 @@ Item {
SpinBox {
id: buttonSizeSpn
from: 40
to: 100
// suffix: " %"
@@ -415,49 +433,50 @@ Item {
SpinBox {
id: spacingSpn
from: 0
to: 24
// suffix: " " + i18nc("pixels","px.")
enabled: !(auroraeThemeEngine.isEnabled && decorationMetricsChk.checked)
}
}
GridLayout{
GridLayout {
id: visualSettingsGroup2
property int lockerHeight: firstLengthLbl.height + rowSpacing / 2
columns: 3
rows: 2
flow: GridLayout.TopToBottom
columnSpacing: visualSettingsGroup1.columnSpacing
rowSpacing: visualSettingsGroup1.rowSpacing
property int lockerHeight: firstLengthLbl.height + rowSpacing/2
Label{
Label {
id: firstLengthLbl
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: plasmoid.configuration.formFactor===PlasmaCore.Types.Horizontal ?
i18n("Left margin:") : i18n("Top margin:")
text: plasmoid.configuration.formFactor === PlasmaCore.Types.Horizontal ? i18n("Left margin:") : i18n("Top margin:")
horizontalAlignment: Text.AlignRight
}
Label{
Label {
Layout.minimumWidth: Math.max(centerFactor * root.width, minimumWidth)
text: plasmoid.configuration.formFactor===PlasmaCore.Types.Horizontal ?
i18n("Right margin:") : i18n("Bottom margin:")
text: plasmoid.configuration.formFactor === PlasmaCore.Types.Horizontal ? i18n("Right margin:") : i18n("Bottom margin:")
horizontalAlignment: Text.AlignRight
enabled: !lockItem.locked
}
SpinBox{
id: lengthFirstSpn
from: 0
to: 24
SpinBox {
// suffix: " " + i18nc("pixels","px.")
id: lengthFirstSpn
property int lastValue: -1
from: 0
to: 24
onValueChanged: {
if (lockItem.locked) {
var step = value - lastValue > 0 ? 1 : -1;
@@ -465,22 +484,23 @@ Item {
lengthLastSpn.value = lengthLastSpn.value + step;
}
}
Component.onCompleted: {
lastValue = plasmoid.configuration.lengthFirstMargin;
}
}
SpinBox{
SpinBox {
id: lengthLastSpn
from: 0
to: 24
// suffix: " " + i18nc("pixels","px.")
enabled: !lockItem.locked
}
LockItem{
LockItem {
id: lockItem
Layout.minimumWidth: 40
Layout.maximumWidth: 40
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
@@ -489,7 +509,11 @@ Item {
Layout.topMargin: firstLengthLbl.height / 2
Layout.rowSpan: 2
}
}
}
}
}
@@ -24,34 +24,36 @@ import org.kde.kirigami as Kirigami
ComboBox {
id: combobox
model: sortedDecorations
textRole: "display"
valueRole: "plugin"
Connections{
target: popup
function onClosed() {
root.forceActiveFocus();
}
}
onActivated: {
var index = combobox.currentIndex;
if (index === -1) {
return;
}
if (index === -1)
return ;
console.log(currentTheme, combobox.currentText, combobox.currentValue)
console.log(currentTheme, combobox.currentText, combobox.currentValue);
root.useCurrent = false;
root.selectedPlugin = combobox.currentValue;
root.selectedTheme = combobox.currentText;
}
Component.onCompleted: {
combobox.currentIndex = combobox.find(root.currentTheme);
}
Connections {
function onClosed() {
root.forceActiveFocus();
}
target: popup
}
delegate: MouseArea {
height: combobox.height
width: combobox.width
hoverEnabled: true
onClicked: {
combobox.currentIndex = index;
root.useCurrent = false;
@@ -62,32 +64,32 @@ ComboBox {
Rectangle {
id: delegateBackground
readonly property color selectedColor: Qt.rgba(palette.highlight.r, palette.highlight.g, palette.highlight.b, 0.5)
anchors.fill: parent
color: {
if (containsMouse) {
if (containsMouse)
return palette.highlight;
}
if (combobox.currentIndex === index) {
if (combobox.currentIndex === index)
return selectedColor;
}
return "transparent";
}
readonly property color selectedColor: Qt.rgba(palette.highlight.r, palette.highlight.g, palette.highlight.b, 0.5);
Label{
Label {
id: label
anchors.left: parent.left
anchors.leftMargin: Kirigami.Units.smallSpacing
anchors.verticalCenter: parent.verticalCenter
text: display + " (" + plugin + ")"
color: containsMouse ? palette.highlightedText : palette.text
}
}
}
Component.onCompleted: {
combobox.currentIndex = combobox.find(root.currentTheme);
}
}
+12 -12
View File
@@ -20,32 +20,31 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
Item{
Item {
id: main
property bool locked: true
readonly property int verticalSubHeight: height - (button.height/2)
readonly property int verticalSubHeight: height - (button.height / 2)
SystemPalette {
id: palette
}
ColumnLayout{
ColumnLayout {
id: column
spacing: 0
opacity: locked ? 1 : 0.5
Rectangle{
Rectangle {
id: subRectTop
Layout.minimumWidth: button.width/2 + Layout.minimumHeight/2
Layout.minimumWidth: button.width / 2 + Layout.minimumHeight / 2
Layout.minimumHeight: 3
Layout.maximumWidth: Layout.minimumWidth
Layout.maximumHeight: Layout.minimumHeight
color: palette.text
}
@@ -60,6 +59,7 @@ Item{
Kirigami.Icon {
id: button
width: 24
height: 24
source: locked ? "lock" : "unlock"
@@ -74,19 +74,19 @@ Item{
color: palette.text
}
Rectangle{
Rectangle {
Layout.minimumWidth: subRectTop.Layout.minimumWidth
Layout.minimumHeight: subRectTop.Layout.minimumHeight
Layout.maximumWidth: Layout.minimumWidth
Layout.maximumHeight: Layout.minimumHeight
color: palette.text
}
}
MouseArea{
MouseArea {
anchors.fill: column
onClicked: locked = !locked;
onClicked: locked = !locked
}
}
+215 -233
View File
@@ -1,3 +1,4 @@
import "../../code/tools.js" as ModelTools
/*
* Copyright 2018 Michail Vourlakos <mvourlakos@gmail.com>
*
@@ -17,120 +18,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Layouts
import org.kde.appletdecoration 0.1 as AppletDecoration
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.appletdecoration 0.1 as AppletDecoration
import "../../code/tools.js" as ModelTools
Rectangle {
id: listContent
radius: 4
anchors.margins: margin
signal coordinatesChanged();
property int orientation
property double itemWidth
property double itemHeight
property int buttonSize: 100
property int buttonsFirstMargin: 0
property int buttonsLastMargin: 0
property int buttonsSpacing: 0
Layout.minimumWidth: width
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumWidth: Layout.maximumWidth
Layout.minimumHeight: height
Layout.preferredHeight: Layout.minimumHeight
Layout.maximumHeight: Layout.maximumHeight
property string buttonsStr
width: listView.childrenRect.width + 2 * margin//(itemWidth+listView.spacing) * (orientation == ListView.Vertical ? 1 : controlButtonsModel.count) + 2 * margin
height: listView.childrenRect.height + 2 * margin //(itemHeight+listView.spacing) * (orientation == ListView.Horizontal ? 1 : controlButtonsModel.count)
signal modelOrderChanged()
property var tasksPreparedArray: []
readonly property int margin: 0
readonly property double iconHeight: itemHeight*(buttonSize/100) - margin * 2
readonly property string appliedScheme: {
if (selectedScheme === "_plasmatheme_") {
return plasmaThemeExtended.colors.schemeFile;
} else if (selectedScheme === "kdeglobals") {
return colorsModel.defaultSchemeFile();
}
return selectedScheme;
}
Component.onCompleted: {
initButtons();
coordinatesChanged();
}
function initButtons() {
if (!buttonsRecreator.running){
buttonsRecreator.start();
}
}
function initializeControlButtonsModel() {
sharedDecorationItem.createDecoration();
var buttonsList = buttonsStr.split('|');
ModelTools.initializeControlButtonsModel(buttonsList,tasksPreparedArray, controlButtonsModel, false);
listView.splitterIndex = ModelTools.indexOfSplitter(controlButtonsModel);
coordinatesTimer.start();
}
function buttonsListStr() {
var str = "";
for (var i=0; i<controlButtonsModel.count; ++i) {
str = str + String(controlButtonsModel.get(i).buttonType);
if (i!==controlButtonsModel.count-1) {
str = str+"|";
}
}
return str;
}
function triggerUpdateFromPlasma() {
if (plasmaThemeExtended.isActive) {
listContent.initButtons();
}
}
Connections{
target: root
function onCurrentPluginChanged() {
listContent.initButtons();
}
}
Connections {
target: plasmaThemeExtended
function onThemeChanged() {
triggerUpdateFromPlasma();
}
}
ListModel {
id: controlButtonsModel
}
/*Rectangle{
anchors.fill: parent
color: "transparent"
@@ -138,46 +31,144 @@ Rectangle {
border.width: 1
}*/
id: listContent
property int orientation
property double itemWidth
property double itemHeight
property int buttonSize: 100
property int buttonsFirstMargin: 0
property int buttonsLastMargin: 0
property int buttonsSpacing: 0
property string buttonsStr
property var tasksPreparedArray: []
readonly property int margin: 0
readonly property double iconHeight: itemHeight * (buttonSize / 100) - margin * 2
readonly property string appliedScheme: {
if (selectedScheme === "_plasmatheme_")
return plasmaThemeExtended.colors.schemeFile;
else if (selectedScheme === "kdeglobals")
return colorsModel.defaultSchemeFile();
return selectedScheme;
}
signal coordinatesChanged()
signal modelOrderChanged()
function initButtons() {
if (!buttonsRecreator.running)
buttonsRecreator.start();
}
function initializeControlButtonsModel() {
sharedDecorationItem.createDecoration();
var buttonsList = buttonsStr.split('|');
ModelTools.initializeControlButtonsModel(buttonsList, tasksPreparedArray, controlButtonsModel, false);
listView.splitterIndex = ModelTools.indexOfSplitter(controlButtonsModel);
coordinatesTimer.start();
}
function buttonsListStr() {
var str = "";
for (var i = 0; i < controlButtonsModel.count; ++i) {
str = str + String(controlButtonsModel.get(i).buttonType);
if (i !== controlButtonsModel.count - 1)
str = str + "|";
}
return str;
}
function triggerUpdateFromPlasma() {
if (plasmaThemeExtended.isActive)
listContent.initButtons();
}
radius: 4
anchors.margins: margin
Layout.minimumWidth: width
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumWidth: Layout.maximumWidth
Layout.minimumHeight: height
Layout.preferredHeight: Layout.minimumHeight
Layout.maximumHeight: Layout.maximumHeight
width: listView.childrenRect.width + 2 * margin //(itemWidth+listView.spacing) * (orientation == ListView.Vertical ? 1 : controlButtonsModel.count) + 2 * margin
height: listView.childrenRect.height + 2 * margin //(itemHeight+listView.spacing) * (orientation == ListView.Horizontal ? 1 : controlButtonsModel.count)
Component.onCompleted: {
initButtons();
coordinatesChanged();
}
Connections {
function onCurrentPluginChanged() {
listContent.initButtons();
}
target: root
}
Connections {
function onThemeChanged() {
triggerUpdateFromPlasma();
}
target: plasmaThemeExtended
}
ListModel {
id: controlButtonsModel
}
SystemPalette {
id: palette
}
ListView {
id: listView
property int splitterIndex: -1
width: childrenRect.width
height: itemHeight
model: controlButtonsModel
orientation: listContent.orientation
delegate: auroraeThemeEngine.isEnabled ? auroraeButtonComponent : pluginButtonComponent
currentIndex: loc.initIndex
property int splitterIndex: -1
onWidthChanged: coordinatesTimer.start()
moveDisplaced: Transition {
NumberAnimation { properties: "x"; duration: 150; easing.type: Easing.Linear }
NumberAnimation {
properties: "x"
duration: 150
easing.type: Easing.Linear
}
}
move: Transition {
NumberAnimation { properties: "x"; duration: 75; easing.type: Easing.Linear }
NumberAnimation {
properties: "x"
duration: 75
easing.type: Easing.Linear
}
}
onWidthChanged: coordinatesTimer.start();
}
MouseArea {
id: loc
anchors.fill: parent
pressAndHoldInterval: 200
cursorShape: Qt.DragMoveCursor
property int initButton: -1 // Original button in model
property int initIndex: -1 // Original position in model
property int index: listView.indexAt(mouseX, mouseY) // Item underneath cursor
readonly property bool buttonIsDragged: initButton !== -1 || initIndex !== -1
readonly property bool buttonIsDragged: initButton!==-1 || initIndex !==-1
anchors.fill: parent
pressAndHoldInterval: 200
cursorShape: Qt.DragMoveCursor
onPressAndHold: {
initIndex = listView.indexAt(mouseX, mouseY);
initButton = controlButtonsModel.get(initIndex).buttonType;
@@ -186,9 +177,8 @@ Rectangle {
initIndex = -1;
initButton = -1;
}
onPositionChanged: {
if (containsPress && initIndex !== -1 &&index !== -1 && index !== initIndex) {
if (containsPress && initIndex !== -1 && index !== -1 && index !== initIndex) {
controlButtonsModel.move(initIndex, index, 1);
initIndex = index;
root.currentButtons = buttonsListStr();
@@ -200,59 +190,41 @@ Rectangle {
///START Components
Component {
id: pluginButtonComponent
Rectangle{
Rectangle {
id: decorationButton
readonly property bool isVisibleButton: index >= 0 && index < listView.splitterIndex
readonly property bool isFirstVisibleButton: index === 0 && listView.splitterIndex > 0
readonly property bool isLastVisibleButton: index>=0 && index===listView.splitterIndex-1
readonly property bool isButtonSplitter: index>=0 && index===listView.splitterIndex
y: (itemHeight - iconHeight) / 2
width: isButtonSplitter && !loc.buttonIsDragged ? Math.min(listContent.iconHeight/2, 6 + buttonsLastMargin) :
listContent.iconHeight + leftMargin + rightMargin
height: listContent.iconHeight + 2 * listContent.margin
color: {
if (listView.currentIndex === index) {
if (index !== listView.splitterIndex) {
return palette.highlight;
} else {
return "#25ff0000";
}
}
return "transparent";
}
readonly property bool isLastVisibleButton: index >= 0 && index === listView.splitterIndex - 1
readonly property bool isButtonSplitter: index >= 0 && index === listView.splitterIndex
property int leftMargin: 0
property int rightMargin: 0
Behavior on leftMargin {
NumberAnimation {
duration: 50
easing.type: Easing.Linear
}
}
Behavior on rightMargin {
NumberAnimation {
duration: 50
easing.type: Easing.Linear
y: (itemHeight - iconHeight) / 2
width: isButtonSplitter && !loc.buttonIsDragged ? Math.min(listContent.iconHeight / 2, 6 + buttonsLastMargin) : listContent.iconHeight + leftMargin + rightMargin
height: listContent.iconHeight + 2 * listContent.margin
color: {
if (listView.currentIndex === index) {
if (index !== listView.splitterIndex)
return palette.highlight;
else
return "#25ff0000";
}
return "transparent";
}
Binding {
target: decorationButton
property: "leftMargin"
value: {
if (loc.buttonIsDragged) {
if (loc.buttonIsDragged)
return buttonsSpacing / 2;
}
if (isFirstVisibleButton) {
if (isFirstVisibleButton)
return buttonsFirstMargin;
} else if (isVisibleButton) {
else if (isVisibleButton)
return buttonsSpacing;
}
return listContent.margin;
}
}
@@ -261,38 +233,18 @@ Rectangle {
target: decorationButton
property: "rightMargin"
value: {
if (loc.buttonIsDragged) {
if (loc.buttonIsDragged)
return buttonsSpacing / 2;
}
if (isLastVisibleButton) {
if (isLastVisibleButton)
return buttonsLastMargin;
}
return listContent.margin;
}
}
AppletDecoration.Button {
id: cButton
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: parent.leftMargin
opacity: listView.splitterIndex !==-1 && listView.splitterIndex<index ? 0.4 : 1
width: isButtonSplitter ? parent.width : listContent.iconHeight
height: isButtonSplitter ? parent.height : listContent.iconHeight
bridge: bridgeItem.bridge
sharedDecoration: sharedDecorationItem
type: buttonType
isOnAllDesktops: false
isMaximized: false
scheme: appliedScheme
visible: buttonType !== AppletDecoration.Types.Custom
function updateCoordinates() {
var translated = cButton.mapToItem(listView, 0, 0);
@@ -300,15 +252,31 @@ Rectangle {
cButton.localY = translated.y;
}
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: parent.leftMargin
opacity: listView.splitterIndex !== -1 && listView.splitterIndex < index ? 0.4 : 1
width: isButtonSplitter ? parent.width : listContent.iconHeight
height: isButtonSplitter ? parent.height : listContent.iconHeight
bridge: bridgeItem.bridge
sharedDecoration: sharedDecorationItem
type: buttonType
isOnAllDesktops: false
isMaximized: false
scheme: appliedScheme
visible: buttonType !== AppletDecoration.Types.Custom
Connections {
target: listContent
function onCoordinatesChanged() {
cButton.updateCoordinates();
}
}
target: listContent
}
Rectangle{
}
Rectangle {
height: parent.height - listContent.margin
width: 4
border.width: 1
@@ -318,41 +286,13 @@ Rectangle {
visible: buttonType === AppletDecoration.Types.Custom
opacity: 0.75
}
}
}
Component {
id: auroraeButtonComponent
Rectangle{
id: auroraeButton
readonly property bool isVisibleButton: index >= 0 && index < listView.splitterIndex
readonly property bool isFirstVisibleButton: index === 0 && listView.splitterIndex > 0
readonly property bool isLastVisibleButton: index>=0 && index===listView.splitterIndex-1
readonly property bool isButtonSplitter: index>=0 && index===listView.splitterIndex
y: (itemHeight - iconHeight) / 2
width: isButtonSplitter && !loc.buttonIsDragged ? Math.min(listContent.iconHeight/2, 6 + buttonsLastMargin) :
auroraeThemeEngine.buttonRatio * listContent.iconHeight + leftMargin + rightMargin
height: listContent.iconHeight + 2 * listContent.margin
color: {
if (listView.currentIndex === index) {
if (index !== listView.splitterIndex) {
return palette.highlight;
} else {
return "#25ff0000";
}
}
return "transparent";
}
property int leftMargin: 0
property int rightMargin: 0
Behavior on leftMargin {
NumberAnimation {
duration: 50
easing.type: Easing.Linear
}
}
Behavior on rightMargin {
@@ -360,22 +300,50 @@ Rectangle {
duration: 50
easing.type: Easing.Linear
}
}
}
}
Component {
id: auroraeButtonComponent
Rectangle {
id: auroraeButton
readonly property bool isVisibleButton: index >= 0 && index < listView.splitterIndex
readonly property bool isFirstVisibleButton: index === 0 && listView.splitterIndex > 0
readonly property bool isLastVisibleButton: index >= 0 && index === listView.splitterIndex - 1
readonly property bool isButtonSplitter: index >= 0 && index === listView.splitterIndex
property int leftMargin: 0
property int rightMargin: 0
y: (itemHeight - iconHeight) / 2
width: isButtonSplitter && !loc.buttonIsDragged ? Math.min(listContent.iconHeight / 2, 6 + buttonsLastMargin) : auroraeThemeEngine.buttonRatio * listContent.iconHeight + leftMargin + rightMargin
height: listContent.iconHeight + 2 * listContent.margin
color: {
if (listView.currentIndex === index) {
if (index !== listView.splitterIndex)
return palette.highlight;
else
return "#25ff0000";
}
return "transparent";
}
Binding {
target: auroraeButton
property: "leftMargin"
value: {
if (loc.buttonIsDragged) {
if (loc.buttonIsDragged)
return buttonsSpacing / 2;
}
if (isFirstVisibleButton) {
if (isFirstVisibleButton)
return buttonsFirstMargin;
} else if (isVisibleButton) {
else if (isVisibleButton)
return buttonsSpacing;
}
return listContent.margin;
}
}
@@ -384,13 +352,11 @@ Rectangle {
target: auroraeButton
property: "rightMargin"
value: {
if (loc.buttonIsDragged) {
if (loc.buttonIsDragged)
return buttonsSpacing / 2;
}
if (isLastVisibleButton) {
if (isLastVisibleButton)
return buttonsLastMargin;
}
return listContent.margin;
}
@@ -400,21 +366,17 @@ Rectangle {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: parent.leftMargin
opacity: listView.splitterIndex !==-1 && listView.splitterIndex<index ? 0.4 : 1
opacity: listView.splitterIndex !== -1 && listView.splitterIndex < index ? 0.4 : 1
width: auroraeThemeEngine.buttonRatio * height
height: listContent.iconHeight
isOnAllDesktops: false
isMaximized: false
buttonType: model.buttonType
auroraeTheme: auroraeThemeEngine
visible: buttonType !== AppletDecoration.Types.Custom
}
Rectangle{
Rectangle {
anchors.left: parent.left
height: parent.height
width: 4
@@ -424,14 +386,33 @@ Rectangle {
visible: buttonType === AppletDecoration.Types.Custom
opacity: 0.75
}
Behavior on leftMargin {
NumberAnimation {
duration: 50
easing.type: Easing.Linear
}
}
Behavior on rightMargin {
NumberAnimation {
duration: 50
easing.type: Easing.Linear
}
}
}
}
///END Components
//! this timer is used in order to not call too many times the recreation
//! of buttons with no reason.
Timer{
Timer {
id: buttonsRecreator
interval: 200
onTriggered: {
initializeControlButtonsModel();
@@ -440,12 +421,13 @@ Rectangle {
//! this timer is used in order to call the relative coordinates updater at the end
//! of the buttons moving
Timer{
Timer {
id: coordinatesTimer
interval: 350
onTriggered: {
listContent.coordinatesChanged();
}
}
}
}
+289 -376
View File
@@ -17,203 +17,128 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import "../code/tools.js" as ModelTools
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.plasmoid
import org.kde.plasma.core as PlasmaCore
import org.kde.appletdecoration as AppletDecoration
import "../code/tools.js" as ModelTools
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.plasmoid
PlasmoidItem {
// END visual properties
// START window properties
// END Window properties
// END decoration properties
// current Latte v0.9 API
//END Latte based properties
//!
///START Visual Items
//add new supported buttons if they dont exist in the configuration
id: root
clip: true
Layout.fillHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? true : false
Layout.fillWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? false : true
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? animatedMinimumWidth : -1
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : animatedMinimumHeight
Layout.preferredHeight: Layout.minimumHeight
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumHeight: Layout.minimumHeight
Layout.maximumWidth: Layout.minimumWidth
preferredRepresentation: fullRepresentation
Plasmoid.onFormFactorChanged: plasmoid.configuration.formFactor = plasmoid.formFactor;
property int animatedMinimumWidth: minimumWidth
property int animatedMinimumHeight: minimumHeight
property int screen: plasmoid.containment.screen
readonly property bool inEditMode: latteInEditMode || plasmoid.userConfiguring
readonly property bool mustHide: {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode) {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode)
return false;
}
if (visibility === AppletDecoration.Types.ActiveWindow && !existsWindowActive) {
if (visibility === AppletDecoration.Types.ActiveWindow && !existsWindowActive)
return true;
}
if (visibility === AppletDecoration.Types.ActiveMaximizedWindow
&& (!isLastActiveWindowMaximized || (inPlasmaPanel && !existsWindowActive))) {
if (visibility === AppletDecoration.Types.ActiveMaximizedWindow && (!isLastActiveWindowMaximized || (inPlasmaPanel && !existsWindowActive)))
return true;
}
if (visibility === AppletDecoration.Types.ShownWindowExists && !existsWindowShown) {
if (visibility === AppletDecoration.Types.ShownWindowExists && !existsWindowShown)
return true;
}
return false;
}
readonly property bool selectedDecorationExists: decorations.decorationExists(plasmoid.configuration.selectedPlugin, plasmoid.configuration.selectedTheme)
readonly property bool slideAnimationEnabled: ( (visibility !== AppletDecoration.Types.AlwaysVisible)
&& (plasmoid.configuration.hiddenState === AppletDecoration.Types.SlideOut) )
readonly property bool slideAnimationEnabled: ((visibility !== AppletDecoration.Types.AlwaysVisible) && (plasmoid.configuration.hiddenState === AppletDecoration.Types.SlideOut))
readonly property bool isEmptySpaceEnabled: plasmoid.configuration.hiddenState === AppletDecoration.Types.EmptySpace
readonly property int containmentType: plasmoid.configuration.containmentType
readonly property int visibility: plasmoid.configuration.visibility
readonly property bool perScreenActive: plasmoid.configuration.perScreenActive
readonly property int minimumWidth: {
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal) {
if (mustHide && !isEmptySpaceEnabled && slideAnimationEnabled && !plasmoid.userConfiguring && !latteInEditMode){
if (mustHide && !isEmptySpaceEnabled && slideAnimationEnabled && !plasmoid.userConfiguring && !latteInEditMode)
return 0;
}
}
}
return plasmoid.formFactor === PlasmaCore.Types.Horizontal ? buttonsArea.width : -1;
}
readonly property int minimumHeight: {
if (plasmoid.formFactor === PlasmaCore.Types.Vertical) {
if (mustHide && !isEmptySpaceEnabled && slideAnimationEnabled && !plasmoid.userConfiguring && !latteInEditMode){
if (mustHide && !isEmptySpaceEnabled && slideAnimationEnabled && !plasmoid.userConfiguring && !latteInEditMode)
return 0;
}
}
return plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : buttonsArea.height
}
return plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : buttonsArea.height;
}
readonly property string buttonsStr: plasmoid.configuration.buttons
Plasmoid.status: {
if (mustHide && !isEmptySpaceEnabled) {
if ((plasmoid.formFactor === PlasmaCore.Types.Horizontal && animatedMinimumWidth === 0)
|| (plasmoid.formFactor === PlasmaCore.Types.Vertical && animatedMinimumHeight === 0)) {
return PlasmaCore.Types.HiddenStatus;
}
}
return PlasmaCore.Types.ActiveStatus;
}
// START visual properties
property bool inactiveStateEnabled: inEditMode ? false : plasmoid.configuration.inactiveStateEnabled
property int thickPadding: {
if (auroraeThemeEngine.isEnabled && plasmoid.configuration.useDecorationMetrics) {
return plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
((root.height - auroraeThemeEngine.buttonHeight) / 2) - 1 :
((root.width - auroraeThemeEngine.buttonHeight) / 2) - 1;
}
if (auroraeThemeEngine.isEnabled && plasmoid.configuration.useDecorationMetrics)
return plasmoid.formFactor === PlasmaCore.Types.Horizontal ? ((root.height - auroraeThemeEngine.buttonHeight) / 2) - 1 : ((root.width - auroraeThemeEngine.buttonHeight) / 2) - 1;
//! Latte padding
if (inLatte) {
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal) {
return (root.height - (latteBridge.iconSize * (plasmoid.configuration.buttonSizePercentage/100))) / 2;
} else {
return (root.width - (latteBridge.iconSize * (plasmoid.configuration.buttonSizePercentage/100))) / 2;
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal)
return (root.height - (latteBridge.iconSize * (plasmoid.configuration.buttonSizePercentage / 100))) / 2;
else
return (root.width - (latteBridge.iconSize * (plasmoid.configuration.buttonSizePercentage / 100))) / 2;
}
}
//! Plasma panels code
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal) {
return (root.height - (root.height * (plasmoid.configuration.buttonSizePercentage/100))) / 2;
} else {
return (root.width - (root.width * (plasmoid.configuration.buttonSizePercentage/100))) / 2;
if (plasmoid.formFactor === PlasmaCore.Types.Horizontal)
return (root.height - (root.height * (plasmoid.configuration.buttonSizePercentage / 100))) / 2;
else
return (root.width - (root.width * (plasmoid.configuration.buttonSizePercentage / 100))) / 2;
}
}
property int lengthFirstMargin: plasmoid.configuration.lengthFirstMargin
property int lengthLastMargin: plasmoid.configuration.lengthLastMargin
property int lengthFirstPadding: Math.min(lengthFirstMargin, lengthMidPadding)
property int lengthMidPadding: spacing / 2
property int lengthLastPadding: Math.min(lengthLastMargin, lengthMidPadding)
property int spacing: {
if (auroraeThemeEngine.isEnabled && plasmoid.configuration.useDecorationMetrics) {
if (auroraeThemeEngine.isEnabled && plasmoid.configuration.useDecorationMetrics)
return auroraeThemeEngine.buttonSpacing;
}
return plasmoid.configuration.spacing;
}
// END visual properties
// START window properties
//! make sure that on startup it will always be shown
readonly property bool existsWindowActive: (windowInfoLoader.item && windowInfoLoader.item.existsWindowActive)
|| containmentIdentifierTimer.running
readonly property bool existsWindowShown: (windowInfoLoader.item && windowInfoLoader.item.existsWindowShown)
|| containmentIdentifierTimer.running
readonly property bool existsWindowActive: (windowInfoLoader.item && windowInfoLoader.item.existsWindowActive) || containmentIdentifierTimer.running
readonly property bool existsWindowShown: (windowInfoLoader.item && windowInfoLoader.item.existsWindowShown) || containmentIdentifierTimer.running
readonly property bool isLastActiveWindowPinned: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isOnAllDesktops
readonly property bool isLastActiveWindowMaximized: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isMaximized
readonly property bool isLastActiveWindowKeepAbove: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isKeepAbove
readonly property bool isLastActiveWindowClosable: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isClosable
readonly property bool isLastActiveWindowMaximizable: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isMaximizable
readonly property bool isLastActiveWindowMinimizable: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isMinimizable
readonly property bool isLastActiveWindowVirtualDesktopsChangeable: lastActiveTaskItem && existsWindowShown && lastActiveTaskItem.isVirtualDesktopsChangeable
property bool hasDesktopsButton: false
property bool hasMaximizedButton: false
property bool hasKeepAboveButton: false
readonly property bool inPlasmaPanel: latteBridge === null
readonly property bool inLatte: latteBridge !== null
readonly property Item lastActiveTaskItem: windowInfoLoader.item.lastActiveTaskItem
// END Window properties
// START decoration properties
property string currentPlugin: plasmoid.configuration.useCurrentDecoration || !selectedDecorationExists ?
decorations.currentPlugin : plasmoid.configuration.selectedPlugin
property string currentTheme: plasmoid.configuration.useCurrentDecoration || !selectedDecorationExists ?
decorations.currentTheme : plasmoid.configuration.selectedTheme
property string currentPlugin: plasmoid.configuration.useCurrentDecoration || !selectedDecorationExists ? decorations.currentPlugin : plasmoid.configuration.selectedPlugin
property string currentTheme: plasmoid.configuration.useCurrentDecoration || !selectedDecorationExists ? decorations.currentTheme : plasmoid.configuration.selectedTheme
property string currentScheme: {
if (plasmaThemeExtended.isActive) {
if (plasmaThemeExtended.isActive)
return plasmaThemeExtended.colors.schemeFile;
}
if (enforceLattePalette && plasmoid.configuration.selectedScheme === "kdeglobals") {
if (enforceLattePalette && plasmoid.configuration.selectedScheme === "kdeglobals")
return latteBridge.palette.scheme;
}
return plasmoid.configuration.selectedScheme === "kdeglobals" ?
colorsModel.defaultSchemeFile() :
plasmoid.configuration.selectedScheme
return plasmoid.configuration.selectedScheme === "kdeglobals" ? colorsModel.defaultSchemeFile() : plasmoid.configuration.selectedScheme;
}
// END decoration properties
//BEGIN Latte Dock Communicator
property QtObject latteBridge: null // current Latte v0.9 API
onLatteBridgeChanged: {
if (latteBridge) {
plasmoid.configuration.containmentType = AppletDecoration.Types.Latte;
latteBridge.actions.setProperty(plasmoid.id, "latteSideColoringEnabled", false);
latteBridge.actions.setProperty(plasmoid.id, "windowsTrackingEnabled", true);
}
}
property QtObject latteBridge: null
//END Latte Dock Communicator
//BEGIN Latte based properties
//! This applet is a special case and thus the latteBridge.applyPalette is not used.
@@ -221,50 +146,96 @@ PlasmoidItem {
//! even when Latte informs the applets that need to use the default plasma theme.
readonly property bool enforceLattePalette: latteBridge && latteBridge.palette
readonly property bool latteInEditMode: latteBridge && latteBridge.inEditMode
property var tasksPreparedArray: []
//END Latte based properties
///functions
function initButtons() {
if (!buttonsRecreator.running)
buttonsRecreator.start();
//START Behaviors
Behavior on animatedMinimumWidth {
enabled: slideAnimationEnabled && plasmoid.formFactor===PlasmaCore.Types.Horizontal
NumberAnimation {
duration: 250
easing.type: Easing.InCubic
}
}
Behavior on animatedMinimumHeight {
enabled: slideAnimationEnabled && plasmoid.formFactor===PlasmaCore.Types.Vertical
NumberAnimation {
duration: 250
easing.type: Easing.InCubic
}
}
//END Behaviors
onButtonsStrChanged: initButtons();
Connections {
target: bridgeItem
onPluginChanged: initButtons();
function initializeControlButtonsModel() {
console.log("recreating buttons");
sharedDecorationItem.createDecoration();
var buttonsList = buttonsStr.split('|');
ModelTools.initializeControlButtonsModel(buttonsList, tasksPreparedArray, controlButtonsModel, true);
}
Connections {
target: buttonsRepeater
onCountChanged: discoverButtons();
function discoverButtons() {
var hasMax = false;
var hasPin = false;
var hasKeepAbove = false;
for (var i = 0; i < tasksPreparedArray.length; ++i) {
if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.Maximize)
hasMax = true;
else if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.OnAllDesktops)
hasPin = true;
else if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.KeepAbove)
hasKeepAbove = true;
}
hasMaximizedButton = hasMax;
hasDesktopsButton = hasPin;
hasKeepAboveButton = hasKeepAbove;
}
function performActiveWindowAction(windowOperation) {
if (windowOperation === AppletDecoration.Types.ActionClose)
windowInfoLoader.item.toggleClose();
else if (windowOperation === AppletDecoration.Types.ToggleMaximize)
windowInfoLoader.item.toggleMaximized();
else if (windowOperation === AppletDecoration.Types.ToggleMinimize)
windowInfoLoader.item.toggleMinimized();
else if (windowOperation === AppletDecoration.Types.TogglePinToAllDesktops)
windowInfoLoader.item.togglePinToAllDesktops();
else if (windowOperation === AppletDecoration.Types.ToggleKeepAbove)
windowInfoLoader.item.toggleKeepAbove();
}
clip: true
Layout.fillHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? true : false
Layout.fillWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? false : true
Layout.minimumWidth: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? animatedMinimumWidth : -1
Layout.minimumHeight: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? -1 : animatedMinimumHeight
Layout.preferredHeight: Layout.minimumHeight
Layout.preferredWidth: Layout.minimumWidth
Layout.maximumHeight: Layout.minimumHeight
Layout.maximumWidth: Layout.minimumWidth
preferredRepresentation: fullRepresentation
Plasmoid.onFormFactorChanged: plasmoid.configuration.formFactor = plasmoid.formFactor
Plasmoid.status: {
if (mustHide && !isEmptySpaceEnabled) {
if ((plasmoid.formFactor === PlasmaCore.Types.Horizontal && animatedMinimumWidth === 0) || (plasmoid.formFactor === PlasmaCore.Types.Vertical && animatedMinimumHeight === 0))
return PlasmaCore.Types.HiddenStatus;
}
return PlasmaCore.Types.ActiveStatus;
}
onLatteBridgeChanged: {
if (latteBridge) {
plasmoid.configuration.containmentType = AppletDecoration.Types.Latte;
latteBridge.actions.setProperty(plasmoid.id, "latteSideColoringEnabled", false);
latteBridge.actions.setProperty(plasmoid.id, "windowsTrackingEnabled", true);
}
}
onButtonsStrChanged: initButtons()
Component.onCompleted: {
if (plasmoid.configuration.buttons.indexOf("9") === -1) {
//add new supported buttons if they dont exist in the configuration
if (plasmoid.configuration.buttons.indexOf("9") === -1)
plasmoid.configuration.buttons = plasmoid.configuration.buttons.concat("|9");
}
initButtons();
containmentIdentifierTimer.start();
}
property var tasksPreparedArray: []
Connections {
target: bridgeItem
onPluginChanged: initButtons()
}
Connections {
target: buttonsRepeater
onCountChanged: discoverButtons()
}
ListModel {
id: controlButtonsModel
@@ -273,43 +244,47 @@ PlasmoidItem {
//!
Loader {
id: windowInfoLoader
sourceComponent: latteBridge
&& latteBridge.windowsTracker
&& latteBridge.windowsTracker.currentScreen.lastActiveWindow
&& latteBridge.windowsTracker.allScreens.lastActiveWindow ? latteTrackerComponent : plasmaTasksModel
Component{
sourceComponent: latteBridge && latteBridge.windowsTracker && latteBridge.windowsTracker.currentScreen.lastActiveWindow && latteBridge.windowsTracker.allScreens.lastActiveWindow ? latteTrackerComponent : plasmaTasksModel
Component {
id: latteTrackerComponent
LatteWindowsTracker{
LatteWindowsTracker {
filterByScreen: plasmoid.configuration.filterByScreen
}
}
Component{
Component {
id: plasmaTasksModel
PlasmaTasksModel{
PlasmaTasksModel {
filterByScreen: plasmoid.configuration.filterByScreen
}
}
}
//!
}
}
///Decoration Items
AppletDecoration.Bridge {
id: bridgeItem
plugin: currentPlugin
theme: currentTheme
}
AppletDecoration.Settings {
id: settingsItem
bridge: bridgeItem.bridge
borderSizesIndex: 0 // Normal
}
AppletDecoration.SharedDecoration {
id: sharedDecorationItem
bridge: bridgeItem.bridge
settings: settingsItem
}
@@ -330,86 +305,18 @@ PlasmoidItem {
AppletDecoration.AuroraeTheme {
id: auroraeThemeEngine
theme: isEnabled ? currentTheme : ""
readonly property bool isEnabled: decorations.isAurorae(currentPlugin, currentTheme);
readonly property bool isEnabled: decorations.isAurorae(currentPlugin, currentTheme)
theme: isEnabled ? currentTheme : ""
}
AppletDecoration.WindowSystem {
id: windowSystem
}
///functions
function initButtons() {
if (!buttonsRecreator.running){
buttonsRecreator.start();
}
}
function initializeControlButtonsModel() {
console.log("recreating buttons");
sharedDecorationItem.createDecoration();
var buttonsList = buttonsStr.split('|');
ModelTools.initializeControlButtonsModel(buttonsList, tasksPreparedArray, controlButtonsModel, true);
}
function discoverButtons() {
var hasMax = false;
var hasPin = false;
var hasKeepAbove = false;
for (var i=0; i<tasksPreparedArray.length; ++i) {
if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.Maximize) {
hasMax = true;
} else if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.OnAllDesktops) {
hasPin = true;
} else if (tasksPreparedArray[i].buttonType === AppletDecoration.Types.KeepAbove) {
hasKeepAbove = true;
}
}
hasMaximizedButton = hasMax;
hasDesktopsButton = hasPin;
hasKeepAboveButton = hasKeepAbove;
}
function performActiveWindowAction(windowOperation) {
if (windowOperation === AppletDecoration.Types.ActionClose) {
windowInfoLoader.item.toggleClose();
} else if (windowOperation === AppletDecoration.Types.ToggleMaximize) {
windowInfoLoader.item.toggleMaximized();
} else if (windowOperation === AppletDecoration.Types.ToggleMinimize) {
windowInfoLoader.item.toggleMinimized();
} else if (windowOperation === AppletDecoration.Types.TogglePinToAllDesktops) {
windowInfoLoader.item.togglePinToAllDesktops();
} else if (windowOperation === AppletDecoration.Types.ToggleKeepAbove){
windowInfoLoader.item.toggleKeepAbove();
}
}
///START Visual Items
Grid {
id: buttonsArea
rowSpacing: 0
columnSpacing: 0
rows: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? 1 : 0
columns: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? 0 : 1
readonly property int buttonThickness: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
root.height - 2 * thickPadding :
root.width - 2 * thickPadding
opacity: mustHide
&& !inEditMode
&& (!root.slideAnimationEnabled /*when buttons are not sliding out*/
|| (root.slideAnimationEnabled && plasmoid.status === PlasmaCore.Types.HiddenStatus/*wait for slide-out animation*/)) ? 0 : 1
visible: opacity === 0 ? false : true
//when buttons are not sliding out
/* Behavior on opacity {
enabled: isEmptySpaceEnabled
NumberAnimation {
@@ -418,98 +325,30 @@ PlasmoidItem {
}
}*/
id: buttonsArea
readonly property int buttonThickness: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? root.height - 2 * thickPadding : root.width - 2 * thickPadding
rowSpacing: 0
columnSpacing: 0
rows: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? 1 : 0
columns: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? 0 : 1
opacity: mustHide && !inEditMode && (!root.slideAnimationEnabled || (root.slideAnimationEnabled && plasmoid.status === PlasmaCore.Types.HiddenStatus)) ? 0 : 1 //wait for slide-out animation
visible: opacity === 0 ? false : true
Repeater {
id: buttonsRepeater
model: controlButtonsModel
delegate: auroraeThemeEngine.isEnabled ? auroraeButton : pluginButton
}
}
Component {
id: pluginButton
AppletDecoration.Button {
id: cButton
width: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
buttonsArea.buttonThickness + padding.left + padding.right :
buttonsArea.buttonThickness + 2 * thickPadding
height: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
buttonsArea.buttonThickness + 2 * thickPadding :
buttonsArea.buttonThickness + padding.top + padding.bottom
bridge: bridgeItem.bridge
sharedDecoration: sharedDecorationItem
scheme: root.currentScheme
type: buttonType
isActive: {
//! FIXME-TEST PERIOD: Disabled because it shows an error from c++ theme when its value is changed
//! and breaks in some cases the buttons coloring through the schemeFile
if (root.inactiveStateEnabled && !root.existsWindowActive){
return false;
}
return true;
}
isOnAllDesktops: root.isLastActiveWindowPinned
isMaximized: root.isLastActiveWindowMaximized
isKeepAbove: root.isLastActiveWindowKeepAbove
localX: x
localY: y
opacity: isVisible ? 1 : 0
visible: (isVisible && !root.isEmptySpaceEnabled) || root.isEmptySpaceEnabled
readonly property bool isVisible: {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode) {
return true;
}
if (type === AppletDecoration.Types.Close) {
return root.isLastActiveWindowClosable;
} else if (type === AppletDecoration.Types.Maximize) {
return root.isLastActiveWindowMaximizable;
} else if (type === AppletDecoration.Types.Minimize) {
return root.isLastActiveWindowMinimizable;
} else if (type === AppletDecoration.Types.OnAllDesktops) {
return root.isLastActiveWindowVirtualDesktopsChangeable;
}
return true;
}
readonly property int firstPadding: {
if (index === 0) {
//! first button
return lengthFirstMargin;
} else {
return lengthMidPadding;
}
}
readonly property int lastPadding: {
if (index>=0 && index === buttonsRepeater.count - 1) {
//! last button
return lengthLastMargin;
} else {
return lengthMidPadding;
}
}
padding{
left: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? firstPadding : thickPadding
right: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? lastPadding : thickPadding
top: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : firstPadding
bottom: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : lastPadding
}
onClicked: {
root.performActiveWindowAction(windowOperation);
}
/*Rectangle{
anchors.fill: parent
color: "transparent"
@@ -527,87 +366,78 @@ PlasmoidItem {
border.width: 1
border.color: "blue"
}*/
}
}
Component {
id: auroraeButton
AppletDecoration.AuroraeButton {
id: aButton
width: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
auroraeTheme.buttonRatio*buttonsArea.buttonThickness + leftPadding + rightPadding :
buttonsArea.buttonThickness + 2 * thickPadding
height: plasmoid.formFactor === PlasmaCore.Types.Horizontal ?
buttonsArea.buttonThickness + 2 * thickPadding :
buttonsArea.buttonThickness + topPadding + bottomPadding
readonly property int firstPadding: {
if (index === 0) {
//! first button
return lengthFirstMargin;
} else {
return lengthMidPadding;
}
}
readonly property int lastPadding: {
if (index>=0 && index === buttonsRepeater.count - 1) {
//! last button
return lengthLastMargin;
} else {
id: cButton
readonly property bool isVisible: {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode)
return true;
if (type === AppletDecoration.Types.Close)
return root.isLastActiveWindowClosable;
else if (type === AppletDecoration.Types.Maximize)
return root.isLastActiveWindowMaximizable;
else if (type === AppletDecoration.Types.Minimize)
return root.isLastActiveWindowMinimizable;
else if (type === AppletDecoration.Types.OnAllDesktops)
return root.isLastActiveWindowVirtualDesktopsChangeable;
return true;
}
readonly property int firstPadding: {
if (index === 0)
return lengthFirstMargin;
else
return lengthMidPadding;
}
readonly property int lastPadding: {
if (index >= 0 && index === buttonsRepeater.count - 1)
return lengthLastMargin;
else
return lengthMidPadding;
}
leftPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? firstPadding : thickPadding
rightPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? lastPadding : thickPadding
topPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : firstPadding
bottomPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : lastPadding
width: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? buttonsArea.buttonThickness + padding.left + padding.right : buttonsArea.buttonThickness + 2 * thickPadding
height: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? buttonsArea.buttonThickness + 2 * thickPadding : buttonsArea.buttonThickness + padding.top + padding.bottom
bridge: bridgeItem.bridge
sharedDecoration: sharedDecorationItem
scheme: root.currentScheme
type: buttonType
isActive: {
//! FIXME-TEST PERIOD: Disabled because it shows an error from c++ theme when its value is changed
//! and breaks in some cases the buttons coloring through the schemeFile
if (root.inactiveStateEnabled && !root.existsWindowActive){
if (root.inactiveStateEnabled && !root.existsWindowActive)
return false;
}
return true;
}
isOnAllDesktops: root.isLastActiveWindowPinned
isMaximized: root.isLastActiveWindowMaximized
isKeepAbove: root.isLastActiveWindowKeepAbove
buttonType: model.buttonType
auroraeTheme: auroraeThemeEngine
monochromeIconsEnabled: latteBridge && latteBridge.applyPalette && auroraeThemeEngine.hasMonochromeIcons
monochromeIconsColor: latteBridge ? latteBridge.palette.textColor : "transparent"
localX: x
localY: y
opacity: isVisible ? 1 : 0
visible: (isVisible && !root.isEmptySpaceEnabled) || root.isEmptySpaceEnabled
readonly property bool isVisible: {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode) {
return true;
}
if (buttonType === AppletDecoration.Types.Close) {
return root.isLastActiveWindowClosable;
} else if (buttonType === AppletDecoration.Types.Maximize) {
return root.isLastActiveWindowMaximizable;
} else if (buttonType === AppletDecoration.Types.Minimize) {
return root.isLastActiveWindowMinimizable;
} else if (buttonType === AppletDecoration.Types.OnAllDesktops) {
return root.isLastActiveWindowVirtualDesktopsChangeable;
}
return true;
}
onClicked: {
root.performActiveWindowAction(windowOperation);
}
padding {
left: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? firstPadding : thickPadding
right: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? lastPadding : thickPadding
top: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : firstPadding
bottom: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : lastPadding
}
}
}
Component {
id: auroraeButton
AppletDecoration.AuroraeButton {
/* Rectangle{
anchors.fill: parent
color: "transparent"
@@ -625,31 +455,114 @@ PlasmoidItem {
border.width: 1
border.color: "blue"
} */
//! first button
//! last button
id: aButton
readonly property int firstPadding: {
if (index === 0)
return lengthFirstMargin;
else
return lengthMidPadding;
}
readonly property int lastPadding: {
if (index >= 0 && index === buttonsRepeater.count - 1)
return lengthLastMargin;
else
return lengthMidPadding;
}
readonly property bool isVisible: {
if (visibility === AppletDecoration.Types.AlwaysVisible || inEditMode)
return true;
if (buttonType === AppletDecoration.Types.Close)
return root.isLastActiveWindowClosable;
else if (buttonType === AppletDecoration.Types.Maximize)
return root.isLastActiveWindowMaximizable;
else if (buttonType === AppletDecoration.Types.Minimize)
return root.isLastActiveWindowMinimizable;
else if (buttonType === AppletDecoration.Types.OnAllDesktops)
return root.isLastActiveWindowVirtualDesktopsChangeable;
return true;
}
width: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? auroraeTheme.buttonRatio * buttonsArea.buttonThickness + leftPadding + rightPadding : buttonsArea.buttonThickness + 2 * thickPadding
height: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? buttonsArea.buttonThickness + 2 * thickPadding : buttonsArea.buttonThickness + topPadding + bottomPadding
leftPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? firstPadding : thickPadding
rightPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? lastPadding : thickPadding
topPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : firstPadding
bottomPadding: plasmoid.formFactor === PlasmaCore.Types.Horizontal ? thickPadding : lastPadding
isActive: {
//! FIXME-TEST PERIOD: Disabled because it shows an error from c++ theme when its value is changed
//! and breaks in some cases the buttons coloring through the schemeFile
if (root.inactiveStateEnabled && !root.existsWindowActive)
return false;
return true;
}
isOnAllDesktops: root.isLastActiveWindowPinned
isMaximized: root.isLastActiveWindowMaximized
isKeepAbove: root.isLastActiveWindowKeepAbove
buttonType: model.buttonType
auroraeTheme: auroraeThemeEngine
monochromeIconsEnabled: latteBridge && latteBridge.applyPalette && auroraeThemeEngine.hasMonochromeIcons
monochromeIconsColor: latteBridge ? latteBridge.palette.textColor : "transparent"
opacity: isVisible ? 1 : 0
visible: (isVisible && !root.isEmptySpaceEnabled) || root.isEmptySpaceEnabled
onClicked: {
root.performActiveWindowAction(windowOperation);
}
}
}
///END Visual Items
//! this timer is used in order to not call too many times the recreation
//! of buttons with no reason.
Timer{
Timer {
id: buttonsRecreator
interval: 200
onTriggered: initializeControlButtonsModel();
onTriggered: initializeControlButtonsModel()
}
//! this timer is used in order to identify in which containment the applet is in
//! it should be called only the first time an applet is created and loaded because
//! afterwards the applet has no way to move between different processes such
//! as Plasma and Latte
Timer{
Timer {
id: containmentIdentifierTimer
interval: 5000
onTriggered: {
if (latteBridge) {
if (latteBridge)
plasmoid.configuration.containmentType = AppletDecoration.Types.Latte;
} else {
else
plasmoid.configuration.containmentType = AppletDecoration.Types.Plasma;
}
}
//START Behaviors
Behavior on animatedMinimumWidth {
enabled: slideAnimationEnabled && plasmoid.formFactor === PlasmaCore.Types.Horizontal
NumberAnimation {
duration: 250
easing.type: Easing.InCubic
}
}
Behavior on animatedMinimumHeight {
enabled: slideAnimationEnabled && plasmoid.formFactor === PlasmaCore.Types.Vertical
NumberAnimation {
duration: 250
easing.type: Easing.InCubic
}
}
//END Behaviors
}