mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 00:51:48 +08:00
add recent session message
This commit is contained in:
148
mainwidget.cpp
148
mainwidget.cpp
@ -188,7 +188,7 @@ void MainWidget::initRightWindow()
|
||||
hlayout->setContentsMargins(10, 0, 10, 0);
|
||||
titleWidget->setLayout(hlayout);
|
||||
|
||||
QLabel* sessionTitleLabel = new QLabel();
|
||||
sessionTitleLabel = new QLabel();
|
||||
sessionTitleLabel->setStyleSheet("QLabel { font-size: 22px; border-bottom: 1px solid rgb(230, 230, 230); }");
|
||||
|
||||
#if TEST_UI
|
||||
@ -298,6 +298,16 @@ void MainWidget::initSignalSlot()
|
||||
// 获取好友列表
|
||||
/////////////////////////////////////
|
||||
loadFriendList();
|
||||
|
||||
/////////////////////////////////////
|
||||
// 获取会话列表
|
||||
/////////////////////////////////////
|
||||
loadSessionList();
|
||||
|
||||
/////////////////////////////////////
|
||||
// 获取好友申请的列表
|
||||
/////////////////////////////////////
|
||||
loadApplyList();
|
||||
}
|
||||
|
||||
void MainWidget::switchTabToSession()
|
||||
@ -339,7 +349,20 @@ void MainWidget::switchTabToApply()
|
||||
//加载会话列表
|
||||
void MainWidget::loadSessionList()
|
||||
{
|
||||
//TODO
|
||||
//会判定会话是否存在本地的DataCenter中,若存在,则直接构造界面
|
||||
//若不存在则从服务器获取数据
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
if (dataCenter->getChatSessionList() != nullptr) {
|
||||
//本地内存中获取数据
|
||||
LOG() << "本地已存在会话列表数据,更新加载本地会话";
|
||||
updateChatSessionList();
|
||||
}
|
||||
else {
|
||||
// 从网路中加载数据
|
||||
LOG() << "本地会话列表数据不存在,正在从网络获取...";
|
||||
connect(dataCenter, &DataCenter::getChatSessionListDone, this, &MainWidget::updateChatSessionList, Qt::UniqueConnection);
|
||||
dataCenter->getChatSessionListAsync();
|
||||
}
|
||||
}
|
||||
|
||||
//加载好友列表
|
||||
@ -351,7 +374,7 @@ void MainWidget::loadFriendList()
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
if (dataCenter->getFriendList() != nullptr) {
|
||||
//从内存中加载数据
|
||||
LOG() << "本地已存在好友列表数据,更新加载本地列表";
|
||||
LOG() << "本地已存在好友列表数据,更新加载本地好友";
|
||||
updateFriendList();
|
||||
}
|
||||
else {
|
||||
@ -366,7 +389,21 @@ void MainWidget::loadFriendList()
|
||||
//加载申请列表
|
||||
void MainWidget::loadApplyList()
|
||||
{
|
||||
//TODO
|
||||
//好友申请列表在DataCenter中存储
|
||||
//同理首先需要判定DataCenter中是否已经有数据了,如果有,则直接加载本地数据
|
||||
//如果没有,则从服务器读取
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
if (dataCenter->getApplyList() != nullptr) {
|
||||
//从内存中加载数据
|
||||
LOG() << "本地已存在用户申请列表数据,更新加载申请列表";
|
||||
updateApplyList();
|
||||
}
|
||||
else {
|
||||
//通过网络加载数据
|
||||
LOG() << "用户申请列表数据不存在,正在从网络获取...";
|
||||
connect(dataCenter, &DataCenter::getApplyListDone, this, &MainWidget::updateApplyList, Qt::UniqueConnection);
|
||||
dataCenter->getApplyListAsync();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::updateFriendList()
|
||||
@ -389,4 +426,107 @@ void MainWidget::updateFriendList()
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::updateChatSessionList()
|
||||
{
|
||||
if (activeTab != SESSION_LIST) {
|
||||
//当前的标签页不是会话列表,不渲染任何数据到界面上
|
||||
return;
|
||||
}
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
QList<ChatSessionInfo>* chatSessionList = dataCenter->getChatSessionList();
|
||||
|
||||
sessionFriendArea->clear();
|
||||
|
||||
for (const auto& c : *chatSessionList) {
|
||||
switch (c.lastMessage.messageType)
|
||||
{
|
||||
case TEXT_TYPE:
|
||||
sessionFriendArea->addItem(SessionItemType, c.chatSessionId, c.avatar, c.chatSessionName, c.lastMessage.content);
|
||||
break;
|
||||
case IMAGE_TYPE:
|
||||
sessionFriendArea->addItem(SessionItemType, c.chatSessionId, c.avatar, c.chatSessionName, "[图片]");
|
||||
break;
|
||||
case FILE_TYPE:
|
||||
sessionFriendArea->addItem(SessionItemType, c.chatSessionId, c.avatar, c.chatSessionName, "[文件]");
|
||||
break;
|
||||
case SPEECH_TYPE:
|
||||
sessionFriendArea->addItem(SessionItemType, c.chatSessionId, c.avatar, c.chatSessionName, "[语音]");
|
||||
break;
|
||||
default:
|
||||
LOG() << "updateSessionList 收到了错误的“最后一条消息的类型”";
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::updateApplyList()
|
||||
{
|
||||
if (activeTab != APPLY_LIST) {
|
||||
//当前的标签页不是“好友申请列表”
|
||||
return;
|
||||
}
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
QList<UserInfo>* applyList = dataCenter->getApplyList();
|
||||
|
||||
sessionFriendArea->clear();
|
||||
|
||||
for (const auto& u : *applyList) {
|
||||
//直接把这个UserInfo对象添加到界面之上,不涉及PB和自己结构的转换
|
||||
//此处的UserInfo的desc不需要填写进来,好友的申请列表中, 不显示用户的标签
|
||||
sessionFriendArea->addItem(ApplyItemType, u.userId, u.avatar, u.nickname, "");
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::loadRecentMessage(const QString& chatSessionId)
|
||||
{
|
||||
//也是先判定,本地内存中是否已经存在对应的消息列表数据
|
||||
//有的话直接显示到界面之上,没有的话从网络中获取
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
|
||||
if (dataCenter->getRecentMessageList(chatSessionId) != nullptr) {
|
||||
//直接拿着本地数据更新界面
|
||||
LOG() << "本地已存在好友聊天数据,更新加载好友聊天数据";
|
||||
updateRecentMessage(chatSessionId);
|
||||
}
|
||||
else {
|
||||
//本地没有数据,从网络加载
|
||||
LOG() << "好友聊天数据不存在,正在从网络获取...";
|
||||
connect(dataCenter, &DataCenter::getRecentMessageListDone, this, &MainWidget::updateRecentMessage, Qt::UniqueConnection);
|
||||
dataCenter->getRecnetMessageListAsync(chatSessionId);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWidget::updateRecentMessage(const QString& chatSessionId)
|
||||
{
|
||||
//拿到该会话最近的消息列表
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
auto* recentMessageList = dataCenter->getRecentMessageList(chatSessionId);
|
||||
|
||||
//清空原有界面上的消息列表
|
||||
messageShowArea->clear();
|
||||
|
||||
//根据当前拿到的消息列表,显示到界面上
|
||||
//此处把数据显示到界面上,可以使用头插也可以尾插
|
||||
//对于消息列表来说,用户最先看到的应该是最近的消息,也就是末尾的消息
|
||||
for (int i = recentMessageList->size() - 1; i >= 0; i--) {
|
||||
const Message& message = recentMessageList->at(i);
|
||||
bool isLeft = message.sender.userId != dataCenter->getMyselfsync()->userId;
|
||||
messageShowArea->addFrontMessage(isLeft, message);
|
||||
}
|
||||
|
||||
//设置会话标题
|
||||
ChatSessionInfo* chatSessionInfo = dataCenter->findChatSessionById(chatSessionId);
|
||||
if (chatSessionInfo != nullptr) {
|
||||
//把会话名称显示到界面之上
|
||||
sessionTitleLabel->setText(chatSessionInfo->chatSessionName);
|
||||
}
|
||||
|
||||
//保存当前选中的会话是哪个
|
||||
dataCenter->setCurrentChatSessionId(chatSessionId);
|
||||
|
||||
//自动把滚动条滚动到末尾
|
||||
messageShowArea->scrollToEnd();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user