Newer
Older
#include "channelmodel.h"
ChannelModel::ChannelModel()
{
// connect(&timer,&QTimer::timeout,this,&ChannelModel::sortChanged);
}
int ChannelModel::rowCount(const QModelIndex &parent) const
{
int count =channelList.count();
return count;
}
QVariant ChannelModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
if(channelList.isEmpty() || row > channelList.count()){
return QVariant();
}
auto currentChannel = channelList.at(row);
if(role == name){
return currentChannel->getName();
}
if(role == roomId){
return currentChannel->getRoomId();
}
if(role == lastMessageText){
auto channel = channelList.at(row);
auto message = channel->getYoungestMessage();
if(message.isNull())
return "";
if(message->getMessageType() == "file" || message->getMessageType() == "image" || message->getMessageType() == "audio")
return tr("file upload");
return message->getMessageString();
}
if(role == channelType){
return currentChannel->getType();
}
if(role == unreadMessages){
return currentChannel->getUnreadMessages();
}
if(role == readonly){
return currentChannel->getReadOnly() || currentChannel->getArchived();
}
if(role == archived){
return currentChannel->getArchived();
}
bool ChannelModel::addChannel(const QSharedPointer<RocketChatChannel> &channel)
{
if(!channel.isNull() &&channel->getRoomId() != "" && !duplicateCheck.contains(channel->getRoomId())){
connect(channel.data(),&RocketChatChannel::messageAdded,this,&ChannelModel::onNewerMessage, Qt::UniqueConnection);
connect(channel.data(),&RocketChatChannel::unreadMessagesChanged,this,&ChannelModel::onUnreadMessageChanged, Qt::UniqueConnection);
duplicateCheck.insert(channel->getRoomId());
int pos = channelList.findPosition(channel);
emit beginInsertRows(QModelIndex(), pos,pos);
channelList.insertSort(channel);
emit endInsertRows();
sortChanged();
return true;
}else{
return false;
}
}
QHash<int, QByteArray> ChannelModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[name] = "name";
roles[roomId] = "roomId";
roles[unreadMessages] = "unreadMessages";
roles[channelType] = "type";
roles[lastMessageText] = "lastMessageText";
roles[readonly] = "readonly";
roles[archived] = "archived";
void ChannelModel::onNewerMessage(const QString &id, qint64 timestamp)
if(current->getRoomId() == id ){
found = true;
break;
}
pos++;
}
if(found){
//emit dataChanged(index(pos),index(pos),{lastMessageText});
}
sortChanged();
}
void ChannelModel::onUnreadMessageChanged(const QString &id, int number)
if(current->getRoomId() == id ){
found = true;
break;
}
pos++;
}
emit dataChanged(index(pos),index(pos),{unreadMessages});
emit unreadMessagesChanged();
}
}
void ChannelModel::addChannelSlot(const QSharedPointer<RocketChatChannel> &channel)
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
{
addChannel(channel);
}
QString ChannelModel::getType() const
{
return type;
}
void ChannelModel::setType(const QString &value)
{
type = value;
}
void ChannelModel::sortChanged()
{
beginResetModel();
std::sort(channelList.begin(),channelList.end(),[](QSharedPointer<RocketChatChannel> channel1, QSharedPointer<RocketChatChannel> channel2){
auto youngest1 = channel1->getYoungestMessage();
auto youngest2 = channel2->getYoungestMessage();
if(!youngest1.isNull() && !youngest2.isNull()){
auto timestamp1 = youngest1->getTimestamp();
auto timestamp2 = youngest2->getTimestamp();
return timestamp2 < timestamp1;
}else if(youngest1.isNull() && !youngest2.isNull()){
return false;
}else if(youngest2.isNull() && !youngest1.isNull()){
return true;
}else{
return false;
}
});
endResetModel();
emit countChanged();
}
void ChannelModel::clear()
{
channelList.clear();