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"