Add root message display in replies section.

This commit is contained in:
John Preston 2020-09-04 14:07:40 +04:00
parent d42ce87c09
commit beb623bee2
3 changed files with 92 additions and 15 deletions

View file

@ -38,8 +38,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session.h"
#include "data/data_session.h"
#include "data/data_user.h"
#include "data/data_channel.h"
#include "data/data_replies_list.h"
#include "data/data_user.h"
#include "data/data_changes.h"
#include "storage/storage_media_prepare.h"
#include "storage/storage_account.h"
@ -114,9 +114,13 @@ RepliesWidget::RepliesWidget(
this,
controller,
ComposeControls::Mode::Normal))
, _rootShadow(this)
, _scrollDown(_scroll, st::historyToDown) {
setupRoot();
_rootHeight = st::msgReplyPadding.top()
+ st::msgReplyBarSize.height()
+ st::msgReplyPadding.bottom();
_topBar->setActiveChat(_history, TopBarWidget::Section::Replies);
_topBar->move(0, 0);
@ -137,6 +141,7 @@ RepliesWidget::RepliesWidget(
}, _topBar->lifetime());
_topBarShadow->raise();
_rootShadow->raise();
updateAdaptiveLayout();
subscribe(Adaptive::Changed(), [=] { updateAdaptiveLayout(); });
@ -144,7 +149,7 @@ RepliesWidget::RepliesWidget(
this,
controller,
static_cast<ListDelegate*>(this)));
_scroll->move(0, _topBar->height());
_scroll->move(0, _topBar->height() + _rootHeight);
_scroll->show();
connect(_scroll, &Ui::ScrollArea::scrolled, [=] { onScroll(); });
@ -191,15 +196,40 @@ void RepliesWidget::setupRoot() {
const auto done = crl::guard(this, [=](ChannelData*, MsgId) {
_root = lookupRoot();
if (_root) {
refreshRootView();
_areComments = computeAreComments();
}
refreshRootView();
});
_history->session().api().requestMessageData(channel, _rootId, done);
}
}
void RepliesWidget::refreshRootView() {
const auto sender = (_root && _root->discussionPostOriginalSender())
? _root->discussionPostOriginalSender()
: _history->peer.get();
_rootTitle.setText(
st::fwdTextStyle,
sender->name,
Ui::NameTextOptions());
if (_rootTitle.isEmpty()) {
_rootTitle.setText(
st::fwdTextStyle,
"Message",
Ui::NameTextOptions());
}
if (_root) {
_rootMessage.setText(
st::messageTextStyle,
_root->inReplyText(),
Ui::DialogTextOptions());
} else {
_rootMessage.setText(
st::messageTextStyle,
textcmdLink(1, tr::lng_deleted_message(tr::now)),
Ui::DialogTextOptions());
}
update();
}
HistoryItem *RepliesWidget::lookupRoot() const {
@ -988,6 +1018,9 @@ void RepliesWidget::updateAdaptiveLayout() {
_topBarShadow->moveToLeft(
Adaptive::OneColumn() ? 0 : st::lineWidth,
_topBar->height());
_rootShadow->moveToLeft(
Adaptive::OneColumn() ? 0 : st::lineWidth,
_topBar->height() + _rootHeight);
}
not_null<History*> RepliesWidget::history() const {
@ -1138,10 +1171,11 @@ void RepliesWidget::updateControlsGeometry() {
: base::make_optional(_scroll->scrollTop() + topDelta());
_topBar->resizeToWidth(contentWidth);
_topBarShadow->resize(contentWidth, st::lineWidth);
_rootShadow->resize(contentWidth, st::lineWidth);
const auto bottom = height();
const auto controlsHeight = _composeControls->heightCurrent();
const auto scrollHeight = bottom - _topBar->height() - controlsHeight;
const auto scrollHeight = bottom - _topBar->height() - _rootHeight - controlsHeight;
const auto scrollSize = QSize(contentWidth, scrollHeight);
if (_scroll->size() != scrollSize) {
_skipScrollEvent = true;
@ -1164,18 +1198,56 @@ void RepliesWidget::paintEvent(QPaintEvent *e) {
if (animating()) {
SectionWidget::paintEvent(e);
return;
}
if (Ui::skipPaintEvent(this, e)) {
} else if (Ui::skipPaintEvent(this, e)) {
return;
}
//if (hasPendingResizedItems()) {
// updateListSize();
//}
//auto ms = crl::now();
//_historyDownShown.step(ms);
const auto aboveHeight = _topBar->height() + _rootHeight;
const auto bg = e->rect().intersected(
QRect(0, aboveHeight, width(), height() - aboveHeight));
SectionWidget::PaintBackground(controller(), this, bg);
SectionWidget::PaintBackground(controller(), this, e->rect());
auto p = Painter(this);
paintRoot(p);
}
void RepliesWidget::paintRoot(Painter &p) {
auto top = _topBar->bottomNoMargins();
p.fillRect(myrtlrect(0, top, width(), st::historyReplyHeight), st::historyPinnedBg);
top += st::msgReplyPadding.top();
QRect rbar(myrtlrect(st::msgReplyBarSkip + st::msgReplyBarPos.x(), top + st::msgReplyBarPos.y(), st::msgReplyBarSize.width(), st::msgReplyBarSize.height()));
p.fillRect(rbar, st::msgInReplyBarColor);
int32 left = st::msgReplyBarSkip + st::msgReplyBarSkip;
if (!_rootTitle.isEmpty()) {
const auto media = _root ? _root->media() : nullptr;
if (media && media->hasReplyPreview()) {
if (const auto image = media->replyPreview()) {
QRect to(left, top, st::msgReplyBarSize.height(), st::msgReplyBarSize.height());
p.drawPixmap(to.x(), to.y(), image->pixSingle(image->width() / cIntRetinaFactor(), image->height() / cIntRetinaFactor(), to.width(), to.height(), ImageRoundRadius::Small));
}
left += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x();
}
p.setPen(st::historyReplyNameFg);
p.setFont(st::msgServiceNameFont);
const auto poll = media ? media->poll() : nullptr;
const auto pinnedHeader = !poll
? tr::lng_pinned_message(tr::now)
: poll->quiz()
? tr::lng_pinned_quiz(tr::now)
: tr::lng_pinned_poll(tr::now);
_rootTitle.drawElided(p, left, top, width() - left - st::msgReplyPadding.right());
p.setPen(st::historyComposeAreaFg);
p.setTextPalette(st::historyComposeAreaPalette);
_rootMessage.drawElided(p, left, top + st::msgServiceNameFont->height, width() - left - st::msgReplyPadding.right());
p.restoreTextPalette();
} else {
p.setFont(st::msgDateFont);
p.setPen(st::historyComposeAreaFgService);
p.drawText(left, top + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->elided(tr::lng_profile_loading(tr::now), width() - left - st::msgReplyPadding.right()));
}
}
void RepliesWidget::onScroll() {

View file

@ -217,6 +217,8 @@ private:
not_null<UserData*> bot,
Api::SendOptions options);
void paintRoot(Painter &p);
const not_null<History*> _history;
const MsgId _rootId = 0;
HistoryItem *_root = nullptr;
@ -229,6 +231,11 @@ private:
std::unique_ptr<ComposeControls> _composeControls;
bool _skipScrollEvent = false;
Ui::Text::String _rootTitle;
Ui::Text::String _rootMessage;
object_ptr<Ui::PlainShadow> _rootShadow;
int _rootHeight = 0;
std::vector<MsgId> _replyReturns;
HistoryItem *_replyReturn = nullptr;

View file

@ -105,9 +105,7 @@ void SessionNavigation::showRepliesForMessage(
const auto channelId = history->channelId();
const auto item = _session->data().message(channelId, rootId);
if (!item || !item->repliesAreComments()) {
if (item->repliesCount() > 0) {
showSection(HistoryView::RepliesMemento(history, rootId));
}
showSection(HistoryView::RepliesMemento(history, rootId));
return;
} else if (const auto id = item->commentsItemId()) {
if (const auto item = _session->data().message(id)) {