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"