File indexing completed on 2024-05-05 05:57:00

0001 /*
0002   SPDX-FileCopyrightText: 2008-2014 Eike Hein <hein@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "skin.h"
0008 
0009 #include <KConfig>
0010 #include <KConfigGroup>
0011 #include <KIconLoader>
0012 
0013 #include <QFileInfo>
0014 #include <QIcon>
0015 
0016 Skin::Skin()
0017 {
0018     m_borderWidth = 0;
0019 }
0020 
0021 Skin::~Skin()
0022 {
0023 }
0024 
0025 bool Skin::load(const QString &name, bool kns)
0026 {
0027     QString dir = kns ? QStringLiteral("kns_skins/") : QStringLiteral("skins/");
0028 
0029     QString titlePath = QStandardPaths::locate(QStandardPaths::AppDataLocation, dir + name + QStringLiteral("/title.skin"));
0030     QString tabPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, dir + name + QStringLiteral("/tabs.skin"));
0031 
0032     if (!QFile::exists(titlePath) || !QFile::exists(tabPath))
0033         return false;
0034 
0035     connect(KIconLoader::global(), SIGNAL(iconChanged(int)), this, SLOT(systemIconsChanged(int)), Qt::UniqueConnection);
0036 
0037     QString titleDir(QFileInfo(titlePath).absolutePath());
0038     QString tabDir(QFileInfo(tabPath).absolutePath());
0039 
0040     KConfig titleConfig(titlePath, KConfig::SimpleConfig);
0041     KConfig tabConfig(tabPath, KConfig::SimpleConfig);
0042 
0043     KConfigGroup border = titleConfig.group(QStringLiteral("Border"));
0044 
0045     m_borderColor = QColor(border.readEntry("red", 0), border.readEntry("green", 0), border.readEntry("blue", 0));
0046 
0047     m_borderWidth = border.readEntry("width", 1);
0048 
0049     KConfigGroup titleBarBackground = titleConfig.group(QStringLiteral("Background"));
0050 
0051     m_titleBarBackgroundImage.load(titleDir + titleBarBackground.readEntry("back_image", ""));
0052     m_titleBarLeftCornerImage.load(titleDir + titleBarBackground.readEntry("left_corner", ""));
0053     m_titleBarRightCornerImage.load(titleDir + titleBarBackground.readEntry("right_corner", ""));
0054 
0055     KConfigGroup titleBarFocusButton = titleConfig.group(QStringLiteral("FocusButton"));
0056 
0057     m_titleBarFocusButtonPosition.setX(titleBarFocusButton.readEntry("x", 0));
0058     m_titleBarFocusButtonPosition.setY(titleBarFocusButton.readEntry("y", 0));
0059 
0060     m_titleBarFocusButtonStyleSheet = buttonStyleSheet(titleDir + titleBarFocusButton.readEntry("up_image", ""),
0061                                                        titleDir + titleBarFocusButton.readEntry("over_image", ""),
0062                                                        titleDir + titleBarFocusButton.readEntry("down_image", ""));
0063 
0064     m_titleBarFocusButtonAnchor = titleBarFocusButton.readEntry("anchor", "") == QLatin1String("left") ? Qt::AnchorLeft : Qt::AnchorRight;
0065 
0066     KConfigGroup titleBarMenuButton = titleConfig.group(QStringLiteral("ConfigButton"));
0067 
0068     m_titleBarMenuButtonPosition.setX(titleBarMenuButton.readEntry("x", 0));
0069     m_titleBarMenuButtonPosition.setY(titleBarMenuButton.readEntry("y", 0));
0070 
0071     m_titleBarMenuButtonStyleSheet = buttonStyleSheet(titleDir + titleBarMenuButton.readEntry("up_image", ""),
0072                                                       titleDir + titleBarMenuButton.readEntry("over_image", ""),
0073                                                       titleDir + titleBarMenuButton.readEntry("down_image", ""));
0074 
0075     m_titleBarMenuButtonAnchor = titleBarMenuButton.readEntry("anchor", "") == QLatin1String("left") ? Qt::AnchorLeft : Qt::AnchorRight;
0076 
0077     KConfigGroup titleBarQuitButton = titleConfig.group(QStringLiteral("QuitButton"));
0078 
0079     m_titleBarQuitButtonPosition.setX(titleBarQuitButton.readEntry("x", 0));
0080     m_titleBarQuitButtonPosition.setY(titleBarQuitButton.readEntry("y", 0));
0081 
0082     m_titleBarQuitButtonStyleSheet = buttonStyleSheet(titleDir + titleBarQuitButton.readEntry("up_image", ""),
0083                                                       titleDir + titleBarQuitButton.readEntry("over_image", ""),
0084                                                       titleDir + titleBarQuitButton.readEntry("down_image", ""));
0085 
0086     m_titleBarQuitButtonAnchor = titleBarQuitButton.readEntry("anchor", "") == QLatin1String("left") ? Qt::AnchorLeft : Qt::AnchorRight;
0087 
0088     KConfigGroup titleBarText = titleConfig.group(QStringLiteral("Text"));
0089 
0090     m_titleBarText = titleBarText.readEntry("text", "");
0091 
0092     m_titleBarTextPosition.setX(titleBarText.readEntry("x", 0));
0093     m_titleBarTextPosition.setY(titleBarText.readEntry("y", 0));
0094 
0095     m_titleBarTextColor = QColor(titleBarText.readEntry("red", 0), titleBarText.readEntry("green", 0), titleBarText.readEntry("blue", 0));
0096 
0097     m_titleBarTextBold = titleBarText.readEntry("bold", true);
0098     m_titleBarTextCentered = titleBarText.readEntry("centered", false);
0099 
0100     KConfigGroup tabBar = tabConfig.group(QStringLiteral("Tabs"));
0101 
0102     m_tabBarPosition.setX(tabBar.readEntry("x", 0));
0103     m_tabBarPosition.setY(tabBar.readEntry("y", 0));
0104 
0105     m_tabBarTextColor = QColor(tabBar.readEntry("red", 0), tabBar.readEntry("green", 0), tabBar.readEntry("blue", 0));
0106 
0107     m_tabBarSeparatorImage.load(tabDir + tabBar.readEntry("separator_image", ""));
0108     m_tabBarUnselectedBackgroundImage.load(tabDir + tabBar.readEntry("unselected_background", ""));
0109     m_tabBarSelectedBackgroundImage.load(tabDir + tabBar.readEntry("selected_background", ""));
0110     m_tabBarUnselectedLeftCornerImage.load(tabDir + tabBar.readEntry("unselected_left_corner", ""));
0111     m_tabBarUnselectedRightCornerImage.load(tabDir + tabBar.readEntry("unselected_right_corner", ""));
0112     m_tabBarSelectedLeftCornerImage.load(tabDir + tabBar.readEntry("selected_left_corner", ""));
0113     m_tabBarSelectedRightCornerImage.load(tabDir + tabBar.readEntry("selected_right_corner", ""));
0114     m_tabBarSelectedTextBold = tabBar.readEntry("selected_text_bold", true);
0115 
0116     m_tabBarPreventClosingImage.load(tabDir + tabBar.readEntry("prevent_closing_image", ""));
0117     m_tabBarPreventClosingImagePosition.setX(tabBar.readEntry("prevent_closing_image_x", 0));
0118     m_tabBarPreventClosingImagePosition.setY(tabBar.readEntry("prevent_closing_image_y", 0));
0119 
0120     m_tabBarCompact = tabBar.readEntry("compact", false);
0121 
0122     KConfigGroup tabBarBackground = tabConfig.group(QStringLiteral("Background"));
0123 
0124     m_tabBarBackgroundImage.load(tabDir + tabBarBackground.readEntry("back_image", ""));
0125     m_tabBarLeftCornerImage.load(tabDir + tabBarBackground.readEntry("left_corner", ""));
0126     m_tabBarRightCornerImage.load(tabDir + tabBarBackground.readEntry("right_corner", ""));
0127 
0128     KConfigGroup tabBarNewTabButton = tabConfig.group(QStringLiteral("PlusButton"));
0129 
0130     m_tabBarNewTabButtonPosition.setX(tabBarNewTabButton.readEntry("x", 0));
0131     m_tabBarNewTabButtonPosition.setY(tabBarNewTabButton.readEntry("y", 0));
0132 
0133     m_tabBarNewTabButtonStyleSheet = buttonStyleSheet(tabDir + tabBarNewTabButton.readEntry("up_image", ""),
0134                                                       tabDir + tabBarNewTabButton.readEntry("over_image", ""),
0135                                                       tabDir + tabBarNewTabButton.readEntry("down_image", ""));
0136 
0137     m_tabBarNewTabButtonIsAtEndOfTabs = tabBarNewTabButton.readEntry("at_end_of_tabs", false);
0138 
0139     KConfigGroup tabBarCloseTabButton = tabConfig.group(QStringLiteral("MinusButton"));
0140 
0141     m_tabBarCloseTabButtonPosition.setX(tabBarCloseTabButton.readEntry("x", 0));
0142     m_tabBarCloseTabButtonPosition.setY(tabBarCloseTabButton.readEntry("y", 0));
0143 
0144     m_tabBarCloseTabButtonStyleSheet = buttonStyleSheet(tabDir + tabBarCloseTabButton.readEntry("up_image", ""),
0145                                                         tabDir + tabBarCloseTabButton.readEntry("over_image", ""),
0146                                                         tabDir + tabBarCloseTabButton.readEntry("down_image", ""));
0147 
0148     if (m_tabBarCompact) {
0149         if (m_tabBarNewTabButtonIsAtEndOfTabs) {
0150             m_tabBarLeft = m_tabBarPosition.x();
0151             m_tabBarPosition.setX(0);
0152         } else {
0153             if (m_tabBarNewTabButtonPosition.x() < m_tabBarPosition.x())
0154                 m_tabBarLeft = m_tabBarNewTabButtonPosition.x();
0155             else
0156                 m_tabBarLeft = m_tabBarPosition.x();
0157 
0158             m_tabBarPosition.setX(m_tabBarPosition.x() - m_tabBarLeft);
0159             m_tabBarNewTabButtonPosition.setX(m_tabBarNewTabButtonPosition.x() - m_tabBarLeft);
0160         }
0161 
0162         int closeButtonWidth = QPixmap(tabDir + tabBarCloseTabButton.readEntry("up_image", "")).width();
0163         m_tabBarRight = m_tabBarCloseTabButtonPosition.x() - closeButtonWidth;
0164         m_tabBarCloseTabButtonPosition.setX(closeButtonWidth);
0165     }
0166 
0167     if (m_tabBarPreventClosingImage.isNull())
0168         updateTabBarPreventClosingImageCache();
0169 
0170     return true;
0171 }
0172 
0173 const QString Skin::buttonStyleSheet(const QString &up, const QString &over, const QString &down)
0174 {
0175     QString styleSheet;
0176 
0177     QString borderBit(QStringLiteral("border: none;"));
0178 
0179     QPixmap buttonImage(up);
0180     QString w(QString::number(buttonImage.width()));
0181     QString h(QString::number(buttonImage.height()));
0182 
0183     QString sizeBit(QStringLiteral("min-width:") + w + QStringLiteral("; min-height:") + h + QStringLiteral("; max-width:") + w
0184                     + QStringLiteral("; max-height:") + h + QStringLiteral(";"));
0185 
0186     styleSheet.append(QStringLiteral("QPushButton {") + borderBit + QStringLiteral("image:url(") + up + QStringLiteral(");") + sizeBit + QStringLiteral("}"));
0187     styleSheet.append(QStringLiteral("QPushButton::hover {") + borderBit + QStringLiteral("image:url(") + over + QStringLiteral(");") + sizeBit
0188                       + QStringLiteral("}"));
0189     styleSheet.append(QStringLiteral("QPushButton::pressed {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0190                       + QStringLiteral("}"));
0191     styleSheet.append(QStringLiteral("QPushButton::checked {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0192                       + QStringLiteral("}"));
0193     styleSheet.append(QStringLiteral("QPushButton::open {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0194                       + QStringLiteral("}"));
0195     styleSheet.append(QStringLiteral("QPushButton::menu-indicator { left: ") + w + QStringLiteral(" }"));
0196 
0197     styleSheet.append(QStringLiteral("QToolButton {") + borderBit + QStringLiteral("image:url(") + up + QStringLiteral(");") + sizeBit + QStringLiteral("}"));
0198     styleSheet.append(QStringLiteral("QToolButton::hover {") + borderBit + QStringLiteral("image:url(") + over + QStringLiteral(");") + sizeBit
0199                       + QStringLiteral("}"));
0200     styleSheet.append(QStringLiteral("QToolButton::pressed {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0201                       + QStringLiteral("}"));
0202     styleSheet.append(QStringLiteral("QToolButton::checked {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0203                       + QStringLiteral("}"));
0204     styleSheet.append(QStringLiteral("QToolButton::open {") + borderBit + QStringLiteral("image:url(") + down + QStringLiteral(");") + sizeBit
0205                       + QStringLiteral("}"));
0206     styleSheet.append(QStringLiteral("QToolButton::menu-indicator { left: ") + w + QStringLiteral(" }"));
0207 
0208     return styleSheet;
0209 }
0210 
0211 const QPixmap Skin::tabBarPreventClosingImage()
0212 {
0213     if (m_tabBarPreventClosingImage.isNull())
0214         return m_tabBarPreventClosingImageCached;
0215 
0216     return m_tabBarPreventClosingImage;
0217 }
0218 
0219 void Skin::updateTabBarPreventClosingImageCache()
0220 {
0221     // Get the target image size from the tabBar height, acquired from
0222     // background image, minus (2 * y position) of the lock icon.
0223     int m_IconSize = m_tabBarBackgroundImage.height() - (2 * m_tabBarPreventClosingImagePosition.y());
0224 
0225     // Get the system lock icon in a generous size.
0226     m_tabBarPreventClosingImageCached = QIcon::fromTheme(QStringLiteral("object-locked.png")).pixmap(48, 48);
0227 
0228     // Resize the image if it's too tall.
0229     if (m_IconSize < m_tabBarPreventClosingImageCached.height()) {
0230         m_tabBarPreventClosingImageCached = m_tabBarPreventClosingImageCached.scaled(m_IconSize, m_IconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
0231     }
0232 }
0233 
0234 void Skin::systemIconsChanged(int group)
0235 {
0236     Q_UNUSED(group);
0237 
0238     if (m_tabBarPreventClosingImage.isNull()) {
0239         updateTabBarPreventClosingImageCache();
0240 
0241         Q_EMIT iconChanged();
0242     }
0243 }
0244 
0245 #include "moc_skin.cpp"