kwin/clients/aurorae/src/decorationoptions.cpp
2014-12-16 08:27:11 +01:00

263 lines
8.6 KiB
C++

/********************************************************************
Copyright (C) 2012 Martin Gräßlin <mgraesslin@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "decorationoptions.h"
#include <KDecoration2/DecoratedClient>
#include <KDecoration2/DecorationSettings>
#include <KConfigGroup>
#include <KSharedConfig>
#include <QGuiApplication>
#include <QStyleHints>
namespace KWin
{
ColorSettings::ColorSettings(const QPalette &pal)
{
init(pal);
}
void ColorSettings::update(const QPalette &pal)
{
init(pal);
}
void ColorSettings::init(const QPalette &pal)
{
m_palette = pal;
KConfigGroup wmConfig(KSharedConfig::openConfig(QStringLiteral("kdeglobals")), QStringLiteral("WM"));
m_activeFrameColor = wmConfig.readEntry("frame", pal.color(QPalette::Active, QPalette::Background));
m_inactiveFrameColor = wmConfig.readEntry("inactiveFrame", m_activeFrameColor);
m_activeTitleBarColor = wmConfig.readEntry("activeBackground", pal.color(QPalette::Active, QPalette::Highlight));
m_inactiveTitleBarColor = wmConfig.readEntry("inactiveBackground", m_inactiveFrameColor);
m_activeTitleBarBlendColor = wmConfig.readEntry("activeBlend", m_activeTitleBarColor.dark(110));
m_inactiveTitleBarBlendColor = wmConfig.readEntry("inactiveBlend", m_inactiveTitleBarColor.dark(110));
m_activeFontColor = wmConfig.readEntry("activeForeground", pal.color(QPalette::Active, QPalette::HighlightedText));
m_inactiveFontColor = wmConfig.readEntry("inactiveForeground", m_activeFontColor.dark());
m_activeButtonColor = wmConfig.readEntry("activeTitleBtnBg", m_activeFrameColor.light(130));
m_inactiveButtonColor = wmConfig.readEntry("inactiveTitleBtnBg", m_inactiveFrameColor.light(130));
m_activeHandle = wmConfig.readEntry("handle", m_activeFrameColor);
m_inactiveHandle = wmConfig.readEntry("inactiveHandle", m_activeHandle);
}
DecorationOptions::DecorationOptions(QObject *parent)
: QObject(parent)
, m_active(true)
, m_decoration(nullptr)
, m_colors(ColorSettings(QPalette()))
{
connect(this, &DecorationOptions::decorationChanged, this, &DecorationOptions::slotActiveChanged);
connect(this, &DecorationOptions::decorationChanged, this, &DecorationOptions::colorsChanged);
connect(this, &DecorationOptions::decorationChanged, this, &DecorationOptions::fontChanged);
connect(this, &DecorationOptions::decorationChanged, this, &DecorationOptions::titleButtonsChanged);
}
DecorationOptions::~DecorationOptions()
{
}
QColor DecorationOptions::borderColor() const
{
return m_active ? m_colors.activeFrame() : m_colors.inactiveFrame();
}
QColor DecorationOptions::buttonColor() const
{
return m_active ? m_colors.activeButtonColor() : m_colors.inactiveButtonColor();
}
QColor DecorationOptions::fontColor() const
{
return m_active ? m_colors.activeFont() : m_colors.inactiveFont();
}
QColor DecorationOptions::resizeHandleColor() const
{
return m_active ? m_colors.activeHandle() : m_colors.inactiveHandle();
}
QColor DecorationOptions::titleBarBlendColor() const
{
return m_active ? m_colors.activeTitleBarBlendColor() : m_colors.inactiveTitleBarBlendColor();
}
QColor DecorationOptions::titleBarColor() const
{
return m_active ? m_colors.activeTitleBarColor() : m_colors.inactiveTitleBarColor();
}
QFont DecorationOptions::titleFont() const
{
return m_decoration ? m_decoration->settings()->font() : QFont();
}
static int decorationButton(KDecoration2::DecorationButtonType type)
{
switch (type) {
case KDecoration2::DecorationButtonType::Menu:
return DecorationOptions::DecorationButtonMenu;
case KDecoration2::DecorationButtonType::ApplicationMenu:
return DecorationOptions::DecorationButtonApplicationMenu;
case KDecoration2::DecorationButtonType::OnAllDesktops:
return DecorationOptions::DecorationButtonOnAllDesktops;
case KDecoration2::DecorationButtonType::Minimize:
return DecorationOptions::DecorationButtonMinimize;
case KDecoration2::DecorationButtonType::Maximize:
return DecorationOptions::DecorationButtonMaximizeRestore;
case KDecoration2::DecorationButtonType::Close:
return DecorationOptions::DecorationButtonClose;
case KDecoration2::DecorationButtonType::ContextHelp:
return DecorationOptions::DecorationButtonQuickHelp;
case KDecoration2::DecorationButtonType::Shade:
return DecorationOptions::DecorationButtonShade;
case KDecoration2::DecorationButtonType::KeepBelow:
return DecorationOptions::DecorationButtonKeepBelow;
case KDecoration2::DecorationButtonType::KeepAbove:
return DecorationOptions::DecorationButtonKeepAbove;
default:
return DecorationOptions::DecorationButtonNone;
}
}
QList<int> DecorationOptions::titleButtonsLeft() const
{
QList<int> ret;
if (m_decoration) {
for (auto it : m_decoration->settings()->decorationButtonsLeft()) {
ret << decorationButton(it);
}
}
return ret;
}
QList<int> DecorationOptions::titleButtonsRight() const
{
QList<int> ret;
if (m_decoration) {
for (auto it : m_decoration->settings()->decorationButtonsRight()) {
ret << decorationButton(it);
}
}
return ret;
}
KDecoration2::Decoration *DecorationOptions::decoration() const
{
return m_decoration;
}
void DecorationOptions::setDecoration(KDecoration2::Decoration *decoration)
{
if (m_decoration == decoration) {
return;
}
if (m_decoration) {
// disconnect from existing decoration
disconnect(m_decoration->client().data(), &KDecoration2::DecoratedClient::activeChanged, this, &DecorationOptions::slotActiveChanged);
auto s = m_decoration->settings();
disconnect(s.data(), &KDecoration2::DecorationSettings::fontChanged, this, &DecorationOptions::fontChanged);
disconnect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsLeftChanged, this, &DecorationOptions::titleButtonsChanged);
disconnect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsRightChanged, this, &DecorationOptions::titleButtonsChanged);
}
m_decoration = decoration;
connect(m_decoration->client().data(), &KDecoration2::DecoratedClient::activeChanged, this, &DecorationOptions::slotActiveChanged);
auto s = m_decoration->settings();
connect(s.data(), &KDecoration2::DecorationSettings::fontChanged, this, &DecorationOptions::fontChanged);
connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsLeftChanged, this, &DecorationOptions::titleButtonsChanged);
connect(s.data(), &KDecoration2::DecorationSettings::decorationButtonsRightChanged, this, &DecorationOptions::titleButtonsChanged);
emit decorationChanged();
}
void DecorationOptions::slotActiveChanged()
{
if (!m_decoration) {
return;
}
if (m_active == m_decoration->client().data()->isActive()) {
return;
}
m_active = m_decoration->client().data()->isActive();
emit colorsChanged();
emit fontChanged();
}
int DecorationOptions::mousePressAndHoldInterval() const
{
return QGuiApplication::styleHints()->mousePressAndHoldInterval();
}
Borders::Borders(QObject *parent)
: QObject(parent)
, m_left(0)
, m_right(0)
, m_top(0)
, m_bottom(0)
{
}
Borders::~Borders()
{
}
#define SETTER( methodName, name ) \
void Borders::methodName(int name) \
{ \
if (m_##name == name) { \
return; \
} \
m_##name = name; \
emit name##Changed(); \
}
SETTER(setLeft, left)
SETTER(setRight, right)
SETTER(setTop, top)
SETTER(setBottom, bottom)
#undef SETTER
void Borders::setAllBorders(int border)
{
setBorders(border);
setTitle(border);
}
void Borders::setBorders(int border)
{
setSideBorders(border);
setBottom(border);
}
void Borders::setSideBorders(int border)
{
setLeft(border);
setRight(border);
}
void Borders::setTitle(int value)
{
setTop(value);
}
Borders::operator QMargins() const
{
return QMargins(m_left, m_top, m_right, m_bottom);
}
} // namespace
#include "decorationoptions.moc"