Improve external reply icons paddings.

This commit is contained in:
John Preston 2023-11-04 21:16:04 +04:00
parent 537c656ee1
commit d6c3760646
3 changed files with 39 additions and 11 deletions

View File

@ -93,6 +93,14 @@ private:
return u"internal:"_q; return u"internal:"_q;
} }
[[nodiscard]] QString InternalPadding(QMargins value) {
return value.isNull() ? QString() : QString(",%1,%2,%3,%4"
).arg(value.left()
).arg(value.top()
).arg(value.right()
).arg(value.bottom());
}
} // namespace } // namespace
class CustomEmojiLoader final class CustomEmojiLoader final
@ -549,13 +557,21 @@ std::unique_ptr<Ui::Text::CustomEmoji> CustomEmojiManager::create(
std::unique_ptr<Ui::Text::CustomEmoji> CustomEmojiManager::internal( std::unique_ptr<Ui::Text::CustomEmoji> CustomEmojiManager::internal(
QStringView data) { QStringView data) {
const auto index = data.mid(InternalPrefix().size()).toInt(); const auto v = data.mid(InternalPrefix().size()).split(',');
if (v.size() != 5 && v.size() != 1) {
return nullptr;
}
const auto index = v[0].toInt();
Assert(index >= 0 && index < _internalEmoji.size()); Assert(index >= 0 && index < _internalEmoji.size());
auto &info = _internalEmoji[index]; auto &info = _internalEmoji[index];
const auto padding = (v.size() == 5)
? QMargins(v[1].toInt(), v[2].toInt(), v[3].toInt(), v[4].toInt())
: QMargins();
return std::make_unique<Ui::CustomEmoji::Internal>( return std::make_unique<Ui::CustomEmoji::Internal>(
data.toString(), data.toString(),
info.image, info.image,
padding,
info.textColor); info.textColor);
} }
@ -906,17 +922,21 @@ uint64 CustomEmojiManager::coloredSetId() const {
QString CustomEmojiManager::registerInternalEmoji( QString CustomEmojiManager::registerInternalEmoji(
QImage emoji, QImage emoji,
QMargins padding,
bool textColor) { bool textColor) {
_internalEmoji.push_back({ std::move(emoji), textColor }); _internalEmoji.push_back({ std::move(emoji), textColor });
return InternalPrefix() + QString::number(_internalEmoji.size() - 1); return InternalPrefix()
+ QString::number(_internalEmoji.size() - 1)
+ InternalPadding(padding);
} }
QString CustomEmojiManager::registerInternalEmoji( QString CustomEmojiManager::registerInternalEmoji(
const style::icon &icon, const style::icon &icon,
QMargins padding,
bool textColor) { bool textColor) {
const auto i = _iconEmoji.find(&icon); const auto i = _iconEmoji.find(&icon);
if (i != end(_iconEmoji)) { if (i != end(_iconEmoji)) {
return i->second; return i->second + InternalPadding(padding);
} }
auto image = QImage( auto image = QImage(
icon.size() * style::DevicePixelRatio(), icon.size() * style::DevicePixelRatio(),
@ -927,9 +947,12 @@ QString CustomEmojiManager::registerInternalEmoji(
icon.paint(p, 0, 0, icon.width()); icon.paint(p, 0, 0, icon.width());
p.end(); p.end();
const auto result = registerInternalEmoji(std::move(image), textColor); const auto result = registerInternalEmoji(
std::move(image),
QMargins{},
textColor);
_iconEmoji.emplace(&icon, result); _iconEmoji.emplace(&icon, result);
return result; return result + InternalPadding(padding);
} }
int FrameSizeFromTag(SizeTag tag) { int FrameSizeFromTag(SizeTag tag) {

View File

@ -85,9 +85,11 @@ public:
[[nodiscard]] QString registerInternalEmoji( [[nodiscard]] QString registerInternalEmoji(
QImage emoji, QImage emoji,
QMargins padding = {},
bool textColor = true); bool textColor = true);
[[nodiscard]] QString registerInternalEmoji( [[nodiscard]] QString registerInternalEmoji(
const style::icon &icon, const style::icon &icon,
QMargins padding = {},
bool textColor = true); bool textColor = true);
[[nodiscard]] uint64 coloredSetId() const; [[nodiscard]] uint64 coloredSetId() const;

View File

@ -415,19 +415,22 @@ void Reply::updateName(
- st::historyReplyPadding.left()) - st::historyReplyPadding.left())
: 0; : 0;
const auto peerIcon = [](PeerData *peer) { const auto peerIcon = [](PeerData *peer) {
using namespace std;
return !peer return !peer
? &st::historyReplyUser ? pair(&st::historyReplyUser, st::historyReplyUserPadding)
: peer->isBroadcast() : peer->isBroadcast()
? &st::historyReplyChannel ? pair(&st::historyReplyChannel, st::historyReplyChannelPadding)
: (peer->isChannel() || peer->isChat()) : (peer->isChannel() || peer->isChat())
? &st::historyReplyGroup ? pair(&st::historyReplyGroup, st::historyReplyGroupPadding)
: &st::historyReplyUser; : pair(&st::historyReplyUser, st::historyReplyUserPadding);
}; };
const auto peerEmoji = [&](PeerData *peer) { const auto peerEmoji = [&](PeerData *peer) {
const auto owner = &view->history()->owner(); const auto owner = &view->history()->owner();
const auto icon = peerIcon(peer);
return Ui::Text::SingleCustomEmoji( return Ui::Text::SingleCustomEmoji(
owner->customEmojiManager().registerInternalEmoji( owner->customEmojiManager().registerInternalEmoji(
*peerIcon(peer))); *icon.first,
icon.second));
}; };
auto nameFull = TextWithEntities(); auto nameFull = TextWithEntities();
if (!groupNameAdded && data->external() && !fields.storyId) { if (!groupNameAdded && data->external() && !fields.storyId) {
@ -435,7 +438,7 @@ void Reply::updateName(
} }
nameFull.append(name); nameFull.append(name);
if (groupNameAdded) { if (groupNameAdded) {
nameFull.append(peerEmoji(externalPeer)); nameFull.append(' ').append(peerEmoji(externalPeer));
nameFull.append(externalPeer->name()); nameFull.append(externalPeer->name());
} }
if (!viaBotUsername.isEmpty()) { if (!viaBotUsername.isEmpty()) {