File indexing completed on 2024-05-12 04:06:10
0001 /* 0002 This file is part of the KDE games library 0003 SPDX-FileCopyrightText: 2001 Andreas Beckermann <b_mann@gmx.de> 0004 SPDX-FileCopyrightText: 2007 Gael de Chalendar (aka Kleag) <kleag@free.fr> 0005 0006 SPDX-License-Identifier: LGPL-2.0-only 0007 */ 0008 0009 #include "kchatbasemodel.h" 0010 0011 // own 0012 #include <kdegamesprivate_logging.h> 0013 // KF 0014 #include <KConfig> 0015 #include <KConfigGroup> 0016 #include <KSharedConfig> 0017 // Qt 0018 #include <QFont> 0019 #include <QSharedData> 0020 0021 class KChatBaseMessagePrivate : public QSharedData 0022 { 0023 public: 0024 KChatBaseMessagePrivate() = default; 0025 0026 public: 0027 KChatBaseMessage::MessageType m_type = KChatBaseMessage::Normal; 0028 }; 0029 0030 KChatBaseMessage::KChatBaseMessage() 0031 : d(new KChatBaseMessagePrivate()) 0032 { 0033 } 0034 0035 KChatBaseMessage::KChatBaseMessage(const QString &sender, const QString &message, MessageType type) 0036 : QPair<QString, QString>(sender, message) 0037 , d(new KChatBaseMessagePrivate()) 0038 { 0039 d->m_type = type; 0040 } 0041 0042 KChatBaseMessage::KChatBaseMessage(const KChatBaseMessage &other) = default; 0043 0044 KChatBaseMessage::~KChatBaseMessage() = default; 0045 0046 KChatBaseMessage &KChatBaseMessage::operator=(const KChatBaseMessage &other) = default; 0047 0048 class KChatBaseModelPrivate 0049 { 0050 public: 0051 KChatBaseModelPrivate() = default; 0052 0053 public: 0054 bool mAcceptMessage = true; 0055 int mMaxItems = 1; 0056 0057 QList<int> mIndex2Id; 0058 0059 QFont mNameFont; 0060 QFont mMessageFont; 0061 QFont mSystemNameFont; 0062 QFont mSystemMessageFont; 0063 0064 QList<KChatBaseMessage> m_messages; 0065 }; 0066 0067 KChatBaseModel::KChatBaseModel(QObject *parent) 0068 : QAbstractListModel(parent) 0069 , d(new KChatBaseModelPrivate()) 0070 { 0071 } 0072 0073 KChatBaseModel::~KChatBaseModel() 0074 { 0075 qCDebug(KDEGAMESPRIVATE_LOG) << "KChatBaseModelPrivate: DESTRUCT (" << this << ")"; 0076 saveConfig(); 0077 } 0078 0079 void KChatBaseModel::slotClear() 0080 { 0081 clear(); 0082 } 0083 0084 void KChatBaseModel::setNameFont(const QFont &font) 0085 { 0086 d->mNameFont = font; 0087 } 0088 0089 void KChatBaseModel::setMessageFont(const QFont &font) 0090 { 0091 d->mMessageFont = font; 0092 } 0093 0094 void KChatBaseModel::setBothFont(const QFont &font) 0095 { 0096 setNameFont(font); 0097 setMessageFont(font); 0098 } 0099 0100 const QFont &KChatBaseModel::nameFont() const 0101 { 0102 return d->mNameFont; 0103 } 0104 0105 const QFont &KChatBaseModel::messageFont() const 0106 { 0107 return d->mMessageFont; 0108 } 0109 0110 void KChatBaseModel::setSystemNameFont(const QFont &font) 0111 { 0112 d->mSystemNameFont = font; 0113 } 0114 0115 void KChatBaseModel::setSystemMessageFont(const QFont &font) 0116 { 0117 d->mSystemMessageFont = font; 0118 } 0119 0120 void KChatBaseModel::setSystemBothFont(const QFont &font) 0121 { 0122 setSystemNameFont(font); 0123 setSystemMessageFont(font); 0124 } 0125 0126 const QFont &KChatBaseModel::systemNameFont() const 0127 { 0128 return d->mSystemNameFont; 0129 } 0130 0131 const QFont &KChatBaseModel::systemMessageFont() const 0132 { 0133 return d->mSystemMessageFont; 0134 } 0135 0136 void KChatBaseModel::saveConfig(KConfig *conf) 0137 { 0138 if (!conf) { 0139 conf = KSharedConfig::openConfig().data(); 0140 } 0141 KConfigGroup cg(conf, QStringLiteral("KChatBaseModelPrivate")); 0142 0143 cg.writeEntry("NameFont", nameFont()); 0144 cg.writeEntry("MessageFont", messageFont()); 0145 cg.writeEntry("SystemNameFont", systemNameFont()); 0146 cg.writeEntry("SystemMessageFont", systemMessageFont()); 0147 cg.writeEntry("MaxMessages", maxItems()); 0148 } 0149 0150 void KChatBaseModel::readConfig(KConfig *conf) 0151 { 0152 if (!conf) { 0153 conf = KSharedConfig::openConfig().data(); 0154 } 0155 KConfigGroup cg(conf, QStringLiteral("KChatBaseModelPrivate")); 0156 0157 setNameFont(cg.readEntry("NameFont", QFont())); 0158 setMessageFont(cg.readEntry("MessageFont", QFont())); 0159 setSystemNameFont(cg.readEntry("SystemNameFont", QFont())); 0160 setSystemMessageFont(cg.readEntry("SystemMessageFont", QFont())); 0161 setMaxItems(cg.readEntry("MaxMessages", -1)); 0162 } 0163 0164 void KChatBaseModel::clear() 0165 { 0166 removeRows(0, rowCount()); 0167 } 0168 0169 void KChatBaseModel::setMaxItems(int maxItems) 0170 { 0171 d->mMaxItems = maxItems; 0172 // TODO cut too many messages 0173 if (maxItems == 0) { 0174 clear(); 0175 } else if (maxItems > 0) { 0176 while (rowCount() > (int)maxItems) { 0177 removeRow(0); 0178 } 0179 } 0180 } 0181 0182 int KChatBaseModel::maxItems() const 0183 { 0184 return d->mMaxItems; 0185 } 0186 0187 QVariant KChatBaseModel::data(const QModelIndex &index, int role) const 0188 { 0189 if (!index.isValid()) 0190 return QVariant(); 0191 0192 if (role == Qt::DisplayRole) { 0193 KChatBaseMessage p = d->m_messages[index.row()]; 0194 return QVariant::fromValue(p); 0195 } 0196 return QVariant(); 0197 } 0198 0199 int KChatBaseModel::rowCount(const QModelIndex &parent) const 0200 { 0201 if (parent.isValid()) 0202 return 0; 0203 else 0204 return d->m_messages.size(); 0205 } 0206 0207 void KChatBaseModel::addMessage(const QString &fromName, const QString &text) 0208 { 0209 int row; 0210 row = d->m_messages.size(); 0211 beginInsertRows(QModelIndex(), row, row); 0212 d->m_messages.push_back(KChatBaseMessage(fromName, text)); 0213 endInsertRows(); 0214 0215 while (maxItems() > -1 && rowCount() > maxItems()) { 0216 beginRemoveRows(QModelIndex(), row, row); 0217 d->m_messages.pop_front(); 0218 endRemoveRows(); 0219 } 0220 } 0221 0222 void KChatBaseModel::addSystemMessage(const QString &fromName, const QString &text) 0223 { 0224 int row; 0225 row = d->m_messages.size(); 0226 beginInsertRows(QModelIndex(), row, row); 0227 d->m_messages.push_back(KChatBaseMessage(fromName, text, KChatBaseMessage::System)); 0228 endInsertRows(); 0229 } 0230 0231 #include "moc_kchatbasemodel.cpp"