kde-extraapps/yakuake/app/skin.cpp
2015-04-07 01:46:47 +00:00

241 lines
9.9 KiB
C++

/*
Copyright (C) 2008 by Eike Hein <hein@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License or (at your option) version 3 or any later version
accepted by the membership of KDE e.V. (or its successor appro-
ved by the membership of KDE e.V.), which shall act as a proxy
defined in Section 14 of version 3 of the license.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
*/
#include "skin.h"
#include <KConfig>
#include <KConfigGroup>
#include <KIcon>
#include <KGlobalSettings>
#include <KStandardDirs>
#include <QFileInfo>
Skin::Skin()
{
m_borderWidth = 0;
}
Skin::~Skin()
{
}
bool Skin::load(const QString& name, bool kns)
{
QString dir = kns ? "kns_skins/" : "skins/";
QString titlePath = KStandardDirs::locate("appdata", dir + name + "/title.skin");
QString tabPath = KStandardDirs::locate("appdata", dir + name + "/tabs.skin");
if (!QFile::exists(titlePath) || !QFile::exists(tabPath))
return false;
connect(KGlobalSettings::self(), SIGNAL(iconChanged(int)), this, SLOT(systemIconsChanged(int)),
Qt::UniqueConnection);
QString titleDir(QFileInfo(titlePath).absolutePath());
QString tabDir(QFileInfo(tabPath).absolutePath());
KConfig titleConfig(titlePath, KConfig::SimpleConfig);
KConfig tabConfig(tabPath, KConfig::SimpleConfig);
KConfigGroup border = titleConfig.group("Border");
m_borderColor = QColor(border.readEntry("red", 0),
border.readEntry("green", 0),
border.readEntry("blue", 0));
m_borderWidth = border.readEntry("width", 1);
KConfigGroup titleBarBackground = titleConfig.group("Background");
m_titleBarBackgroundImage.load(titleDir + titleBarBackground.readEntry("back_image", ""));
m_titleBarLeftCornerImage.load(titleDir + titleBarBackground.readEntry("left_corner", ""));
m_titleBarRightCornerImage.load(titleDir + titleBarBackground.readEntry("right_corner", ""));
KConfigGroup titleBarFocusButton = titleConfig.group("FocusButton");
m_titleBarFocusButtonPosition.setX(titleBarFocusButton.readEntry("x", 0));
m_titleBarFocusButtonPosition.setY(titleBarFocusButton.readEntry("y", 0));
m_titleBarFocusButtonStyleSheet = buttonStyleSheet(titleDir + titleBarFocusButton.readEntry("up_image", ""),
titleDir + titleBarFocusButton.readEntry("over_image", ""),
titleDir + titleBarFocusButton.readEntry("down_image", ""));
KConfigGroup titleBarMenuButton = titleConfig.group("ConfigButton");
m_titleBarMenuButtonPosition.setX(titleBarMenuButton.readEntry("x", 0));
m_titleBarMenuButtonPosition.setY(titleBarMenuButton.readEntry("y", 0));
m_titleBarMenuButtonStyleSheet = buttonStyleSheet(titleDir + titleBarMenuButton.readEntry("up_image", ""),
titleDir + titleBarMenuButton.readEntry("over_image", ""),
titleDir + titleBarMenuButton.readEntry("down_image", ""));
KConfigGroup titleBarQuitButton = titleConfig.group("QuitButton");
m_titleBarQuitButtonPosition.setX(titleBarQuitButton.readEntry("x", 0));
m_titleBarQuitButtonPosition.setY(titleBarQuitButton.readEntry("y", 0));
m_titleBarQuitButtonStyleSheet = buttonStyleSheet(titleDir + titleBarQuitButton.readEntry("up_image", ""),
titleDir + titleBarQuitButton.readEntry("over_image", ""),
titleDir + titleBarQuitButton.readEntry("down_image", ""));
KConfigGroup titleBarText = titleConfig.group("Text");
m_titleBarText = titleBarText.readEntry("text", "");
m_titleBarTextPosition.setX(titleBarText.readEntry("x", 0));
m_titleBarTextPosition.setY(titleBarText.readEntry("y", 0));
m_titleBarTextColor = QColor(titleBarText.readEntry("red", 0),
titleBarText.readEntry("green", 0),
titleBarText.readEntry("blue", 0));
m_titleBarTextBold = titleBarText.readEntry("bold", true);
KConfigGroup tabBar = tabConfig.group("Tabs");
m_tabBarPosition.setX(tabBar.readEntry("x", 0));
m_tabBarPosition.setY(tabBar.readEntry("y", 0));
m_tabBarTextColor = QColor(tabBar.readEntry("red", 0),
tabBar.readEntry("green", 0),
tabBar.readEntry("blue", 0));
m_tabBarSeparatorImage.load(tabDir + tabBar.readEntry("separator_image", ""));
m_tabBarUnselectedBackgroundImage.load(tabDir + tabBar.readEntry("unselected_background", ""));
m_tabBarSelectedBackgroundImage.load(tabDir + tabBar.readEntry("selected_background", ""));
m_tabBarSelectedLeftCornerImage.load(tabDir + tabBar.readEntry("selected_left_corner", ""));
m_tabBarSelectedRightCornerImage.load(tabDir + tabBar.readEntry("selected_right_corner", ""));
m_tabBarPreventClosingImage.load(tabDir + tabBar.readEntry("prevent_closing_image", ""));
m_tabBarPreventClosingImagePosition.setX(tabBar.readEntry("prevent_closing_image_x", 0));
m_tabBarPreventClosingImagePosition.setY(tabBar.readEntry("prevent_closing_image_y", 0));
KConfigGroup tabBarBackground = tabConfig.group("Background");
m_tabBarBackgroundImage.load(tabDir + tabBarBackground.readEntry("back_image", ""));
m_tabBarLeftCornerImage.load(tabDir + tabBarBackground.readEntry("left_corner", ""));
m_tabBarRightCornerImage.load(tabDir + tabBarBackground.readEntry("right_corner", ""));
KConfigGroup tabBarNewTabButton = tabConfig.group("PlusButton");
m_tabBarNewTabButtonPosition.setX(tabBarNewTabButton.readEntry("x", 0));
m_tabBarNewTabButtonPosition.setY(tabBarNewTabButton.readEntry("y", 0));
m_tabBarNewTabButtonStyleSheet = buttonStyleSheet(tabDir + tabBarNewTabButton.readEntry("up_image", ""),
tabDir + tabBarNewTabButton.readEntry("over_image", ""),
tabDir + tabBarNewTabButton.readEntry("down_image", ""));
KConfigGroup tabBarCloseTabButton = tabConfig.group("MinusButton");
m_tabBarCloseTabButtonPosition.setX(tabBarCloseTabButton.readEntry("x", 0));
m_tabBarCloseTabButtonPosition.setY(tabBarCloseTabButton.readEntry("y", 0));
m_tabBarCloseTabButtonStyleSheet = buttonStyleSheet(tabDir + tabBarCloseTabButton.readEntry("up_image", ""),
tabDir + tabBarCloseTabButton.readEntry("over_image", ""),
tabDir + tabBarCloseTabButton.readEntry("down_image", ""));
if (m_tabBarPreventClosingImage.isNull())
updateTabBarPreventClosingImageCache();
return true;
}
const QString Skin::buttonStyleSheet(const QString& up, const QString& over, const QString& down)
{
QString styleSheet;
QString borderBit("border: none;");
QPixmap buttonImage(up);
QString w(QString::number(buttonImage.width()));
QString h(QString::number(buttonImage.height()));
QString sizeBit("min-width:" + w + "; min-height:" + h + "; max-width:" + w + "; max-height:" + h + ';');
styleSheet.append("KPushButton {" + borderBit + "image:url(" + up + ");" + sizeBit + '}');
styleSheet.append("KPushButton::hover {" + borderBit + "image:url(" + over + ");" + sizeBit + '}');
styleSheet.append("KPushButton::pressed {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("KPushButton::checked {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("KPushButton::open {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("KPushButton::menu-indicator { left: " + w + " }");
styleSheet.append("QToolButton {" + borderBit + "image:url(" + up + ");" + sizeBit + '}');
styleSheet.append("QToolButton::hover {" + borderBit + "image:url(" + over + ");" + sizeBit + '}');
styleSheet.append("QToolButton::pressed {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("QToolButton::checked {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("QToolButton::open {" + borderBit + "image:url(" + down + ");" + sizeBit + '}');
styleSheet.append("QToolButton::menu-indicator { left: " + w + " }");
return styleSheet;
}
const QPixmap Skin::tabBarPreventClosingImage()
{
if (m_tabBarPreventClosingImage.isNull())
return m_tabBarPreventClosingImageCached;
return m_tabBarPreventClosingImage;
}
void Skin::updateTabBarPreventClosingImageCache()
{
// Get the target image size from the tabBar height, acquired from
// background image, minus (2 * y position) of the lock icon.
int m_IconSize = m_tabBarBackgroundImage.height() -
(2 * m_tabBarPreventClosingImagePosition.y());
// Get the system lock icon in a generous size.
m_tabBarPreventClosingImageCached = KIcon("object-locked.png").pixmap(48, 48);
// Resize the image if it's too tall.
if (m_IconSize < m_tabBarPreventClosingImageCached.height())
{
m_tabBarPreventClosingImageCached =
m_tabBarPreventClosingImageCached.scaled(m_IconSize,
m_IconSize, Qt::KeepAspectRatio,
Qt::SmoothTransformation);
}
}
void Skin::systemIconsChanged(int group)
{
Q_UNUSED(group);
if (m_tabBarPreventClosingImage.isNull())
{
updateTabBarPreventClosingImageCache();
emit iconChanged();
}
}