I implemented my own Model for a list of users that are present in a channel.That works fine if the model is filled an the data is read, what does not work is live updates, if something new is added, it shows up only after a resize event.
bool UserModel::insertUser( QString channelId, QSharedPointer<RocketChatUser> user )
{
auto values = userMap.values( channelId );
int index = values.count();
auto qIndex = QModelIndex();
if ( channelId == current ) {
beginInsertRows( qIndex, index, index );
}
userMap.insert( channelId, user );
if ( channelId == current ) {
endInsertRows();
}
}
class UserModel: public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString currentChannel READ getCurrent WRITE setCurrent NOTIFY currentChannelChanged)
enum UserRoles {
UserName = Qt::UserRole + 1,
UserId
};
public:
UserModel( QObject *parent = 0 );
int rowCount( const QModelIndex &parent = QModelIndex() ) const;
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const;
bool insertUser(QString,QSharedPointer<RocketChatUser>);
QString getCurrent() const;
void setCurrent(const QString &value);
void onCurrentChannelChanged(const QString &newText);
protected:
QHash<int, QByteArray> roleNames() const;
QSet<QString> duplicateCheck;
QMultiMap<QString, QSharedPointer<RocketChatUser>> userMap;
QString current;
signals:
void currentChannelChanged(const QString &newText);
};
Current channel exists to store all users in the multimap whose key is the id of the channel and to return only those who belong to the channel for performance reasons.
It is created this way:
UserModel userModel;
context->setContextProperty("userModel",&userModel);
And QML look like this:
Drawer {
z: 9
width: Math.min(window.width, window.height) / 3 * 2
height: window.height
edge: Qt.LeftEdge
ListView {
anchors.fill: parent
spacing: 1
header: ToolBar {
Text {
text: qsTr("Users in channel")
anchors.centerIn: parent
}
width: parent.width - 1
}
id: userListView
model: userModel
delegate: RowLayout {
width: parent.width
Button {
anchors.fill: parent
text: model.username
}
/*BusyIndicator{
id: loadingUserIndicator
anchors.centerIn: parent
}*/
}
Component.onCompleted: {
userModel.currentChannel = channelView.currentChannel
}
}
}