qmlfrontend/players_model.h
changeset 15047 773beead236f
parent 10753 e56db5d988ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmlfrontend/players_model.h	Fri May 24 23:39:51 2019 +0200
@@ -0,0 +1,83 @@
+#ifndef PLAYERSLISTMODEL_H
+#define PLAYERSLISTMODEL_H
+
+#include <QAbstractListModel>
+#include <QFont>
+#include <QHash>
+#include <QIcon>
+#include <QModelIndex>
+#include <QSet>
+
+class PlayersListModel : public QAbstractListModel {
+  Q_OBJECT
+
+ public:
+  enum StateFlag {
+    Ready = Qt::UserRole,
+    ServerAdmin = Qt::UserRole + 1,
+    RoomAdmin = Qt::UserRole + 2,
+    Registered = Qt::UserRole + 3,
+    Friend = Qt::UserRole + 4,
+    Ignore = Qt::UserRole + 5,
+    InGame = Qt::UserRole + 6,
+    InRoom = Qt::UserRole + 7,
+    Contributor = Qt::UserRole + 8
+    // if you add a role that will affect the player icon,
+    // then also add it to the flags Qlist in updateIcon()!
+  };
+
+  enum SpecialRoles {
+    SortRole = Qt::UserRole + 100,
+    RoomFilterRole = Qt::UserRole + 101
+  };
+
+  explicit PlayersListModel(QObject *parent = 0);
+
+  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+
+  QVariant data(const QModelIndex &index, int role) const override;
+  bool setData(const QModelIndex &index, const QVariant &value,
+               int role = Qt::DisplayRole) override;
+
+  void setFlag(const QString &nickname, StateFlag flagType, bool isSet);
+  bool isFlagSet(const QString &nickname, StateFlag flagType);
+
+  bool insertRows(int row, int count,
+                  const QModelIndex &parent = QModelIndex()) override;
+  bool removeRows(int row, int count,
+                  const QModelIndex &parent = QModelIndex()) override;
+
+  QModelIndex nicknameIndex(const QString &nickname);
+
+ public slots:
+  void addPlayer(const QString &nickname, bool notify);
+  void removePlayer(const QString &nickname, const QString &msg = QString());
+  void playerJoinedRoom(const QString &nickname, bool notify);
+  void playerLeftRoom(const QString &nickname);
+  void resetRoomFlags();
+  void setNickname(const QString &nickname);
+
+ signals:
+  void nickAdded(const QString &nick, bool notifyNick);
+  void nickRemoved(const QString &nick);
+  void nickAddedLobby(const QString &nick, bool notifyNick);
+  void nickRemovedLobby(const QString &nick, const QString &message);
+
+ private:
+  QHash<quint32, QIcon> &m_icons();
+  using DataEntry = QHash<int, QVariant>;
+  QList<DataEntry> m_data;
+  QSet<QString> m_friendsSet, m_ignoredSet;
+  QString m_nickname;
+  QFont m_fontInRoom;
+
+  void updateIcon(const QModelIndex &index);
+  void updateSortData(const QModelIndex &index);
+  void loadSet(QSet<QString> &set, const QString &fileName);
+  void saveSet(const QSet<QString> &set, const QString &fileName);
+  void checkFriendIgnore(const QModelIndex &mi);
+  bool isFriend(const QString &nickname);
+  bool isIgnored(const QString &nickname);
+};
+
+#endif  // PLAYERSLISTMODEL_H