Display message being replied to above input box (#4350)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
#include "widgets/helper/MessageView.hpp"
|
||||
|
||||
#include "Application.hpp"
|
||||
#include "messages/layouts/MessageLayout.hpp"
|
||||
#include "messages/MessageElement.hpp"
|
||||
#include "messages/Selection.hpp"
|
||||
#include "providers/colors/ColorProvider.hpp"
|
||||
#include "singletons/Theme.hpp"
|
||||
#include "singletons/WindowManager.hpp"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QPainter>
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace chatterino;
|
||||
|
||||
const Selection EMPTY_SELECTION;
|
||||
|
||||
const MessageElementFlags MESSAGE_FLAGS{
|
||||
MessageElementFlag::Text,
|
||||
MessageElementFlag::EmojiAll,
|
||||
MessageElementFlag::EmoteText,
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace chatterino {
|
||||
|
||||
MessageView::MessageView() = default;
|
||||
MessageView::~MessageView() = default;
|
||||
|
||||
void MessageView::createMessageLayout()
|
||||
{
|
||||
if (this->message_ == nullptr)
|
||||
{
|
||||
this->messageLayout_.reset();
|
||||
return;
|
||||
}
|
||||
|
||||
this->messageLayout_ = std::make_unique<MessageLayout>(this->message_);
|
||||
}
|
||||
|
||||
void MessageView::setMessage(const MessagePtr &message)
|
||||
{
|
||||
if (!message)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto singleLineMessage = std::make_shared<Message>();
|
||||
singleLineMessage->elements.emplace_back(
|
||||
std::make_unique<SingleLineTextElement>(
|
||||
message->messageText, MESSAGE_FLAGS, MessageColor::Type::System,
|
||||
FontStyle::ChatMediumSmall));
|
||||
this->message_ = std::move(singleLineMessage);
|
||||
this->createMessageLayout();
|
||||
this->layoutMessage();
|
||||
}
|
||||
|
||||
void MessageView::clearMessage()
|
||||
{
|
||||
this->setMessage(nullptr);
|
||||
}
|
||||
|
||||
void MessageView::setWidth(int width)
|
||||
{
|
||||
if (this->width_ != width)
|
||||
{
|
||||
this->width_ = width;
|
||||
this->layoutMessage();
|
||||
}
|
||||
}
|
||||
|
||||
void MessageView::paintEvent(QPaintEvent * /*event*/)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
auto ctx = MessagePaintContext{
|
||||
.painter = painter,
|
||||
.selection = EMPTY_SELECTION,
|
||||
.colorProvider = ColorProvider::instance(),
|
||||
.messageColors = this->messageColors_,
|
||||
.preferences = this->messagePreferences_,
|
||||
|
||||
.canvasWidth = this->width_,
|
||||
.isWindowFocused = this->window() == QApplication::activeWindow(),
|
||||
.isMentions = false,
|
||||
|
||||
.y = 0,
|
||||
.messageIndex = 0,
|
||||
.isLastReadMessage = false,
|
||||
};
|
||||
|
||||
this->messageLayout_->paint(ctx);
|
||||
}
|
||||
|
||||
void MessageView::themeChangedEvent()
|
||||
{
|
||||
this->messageColors_.applyTheme(getTheme());
|
||||
this->messageColors_.regular = getTheme()->splits.input.background;
|
||||
if (this->messageLayout_)
|
||||
{
|
||||
this->messageLayout_->invalidateBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
void MessageView::scaleChangedEvent(float newScale)
|
||||
{
|
||||
(void)newScale;
|
||||
|
||||
this->layoutMessage();
|
||||
}
|
||||
|
||||
void MessageView::layoutMessage()
|
||||
{
|
||||
if (this->messageLayout_ == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool updateRequired = this->messageLayout_->layout(
|
||||
this->width_, this->scale(),
|
||||
this->scale() * static_cast<float>(this->devicePixelRatio()),
|
||||
MESSAGE_FLAGS, false);
|
||||
|
||||
if (updateRequired)
|
||||
{
|
||||
this->setFixedSize(this->width_, this->messageLayout_->getHeight());
|
||||
this->update();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace chatterino
|
||||
Reference in New Issue
Block a user