Added animation to voice messages with ttl.
This commit is contained in:
parent
a1c7a48958
commit
3962e5a680
Binary file not shown.
Binary file not shown.
|
@ -11,5 +11,7 @@
|
||||||
<file alias="ttl.tgs">../../animations/ttl.tgs</file>
|
<file alias="ttl.tgs">../../animations/ttl.tgs</file>
|
||||||
<file alias="discussion.tgs">../../animations/discussion.tgs</file>
|
<file alias="discussion.tgs">../../animations/discussion.tgs</file>
|
||||||
<file alias="stats.tgs">../../animations/stats.tgs</file>
|
<file alias="stats.tgs">../../animations/stats.tgs</file>
|
||||||
|
<file alias="voice_ttl_idle.tgs">../../animations/voice_ttl_idle.tgs</file>
|
||||||
|
<file alias="voice_ttl_start.tgs">../../animations/voice_ttl_start.tgs</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
|
@ -1140,6 +1140,10 @@ crl::time MediaFile::ttlSeconds() const {
|
||||||
return _ttlSeconds;
|
return _ttlSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MediaFile::allowsForward() const {
|
||||||
|
return !ttlSeconds();
|
||||||
|
}
|
||||||
|
|
||||||
bool MediaFile::updateInlineResultMedia(const MTPMessageMedia &media) {
|
bool MediaFile::updateInlineResultMedia(const MTPMessageMedia &media) {
|
||||||
if (media.type() != mtpc_messageMediaDocument) {
|
if (media.type() != mtpc_messageMediaDocument) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -281,6 +281,7 @@ public:
|
||||||
bool dropForwardedInfo() const override;
|
bool dropForwardedInfo() const override;
|
||||||
bool hasSpoiler() const override;
|
bool hasSpoiler() const override;
|
||||||
crl::time ttlSeconds() const override;
|
crl::time ttlSeconds() const override;
|
||||||
|
bool allowsForward() const override;
|
||||||
|
|
||||||
bool updateInlineResultMedia(const MTPMessageMedia &media) override;
|
bool updateInlineResultMedia(const MTPMessageMedia &media) override;
|
||||||
bool updateSentMedia(const MTPMessageMedia &media) override;
|
bool updateSentMedia(const MTPMessageMedia &media) override;
|
||||||
|
|
|
@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "base/random.h"
|
#include "base/random.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
#include "lottie/lottie_icon.h"
|
||||||
#include "storage/localstorage.h"
|
#include "storage/localstorage.h"
|
||||||
#include "main/main_session.h"
|
#include "main/main_session.h"
|
||||||
#include "media/player/media_player_float.h" // Media::Player::RoundPainter.
|
#include "media/player/media_player_float.h" // Media::Player::RoundPainter.
|
||||||
|
@ -31,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/cached_round_corners.h"
|
#include "ui/cached_round_corners.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "ui/power_saving.h"
|
#include "ui/power_saving.h"
|
||||||
|
#include "ui/rect.h"
|
||||||
#include "ui/ui_utility.h"
|
#include "ui/ui_utility.h"
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "data/data_document.h"
|
#include "data/data_document.h"
|
||||||
|
@ -48,6 +50,52 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kAudioVoiceMsgUpdateView = crl::time(100);
|
constexpr auto kAudioVoiceMsgUpdateView = crl::time(100);
|
||||||
|
|
||||||
|
[[nodiscard]] HistoryView::TtlPaintCallback CreateTtlPaintCallback(
|
||||||
|
std::shared_ptr<rpl::lifetime> lifetime,
|
||||||
|
Fn<void()> update) {
|
||||||
|
struct State final {
|
||||||
|
std::unique_ptr<Lottie::Icon> start;
|
||||||
|
std::unique_ptr<Lottie::Icon> idle;
|
||||||
|
};
|
||||||
|
const auto iconSize = Size(std::min(
|
||||||
|
st::historyFileInPause.width(),
|
||||||
|
st::historyFileInPause.height()));
|
||||||
|
const auto state = lifetime->make_state<State>();
|
||||||
|
state->start = Lottie::MakeIcon({
|
||||||
|
.name = u"voice_ttl_start"_q,
|
||||||
|
.color = &st::historyFileInIconFg,
|
||||||
|
.sizeOverride = iconSize,
|
||||||
|
});
|
||||||
|
|
||||||
|
const auto animateSingle = [=](
|
||||||
|
not_null<Lottie::Icon*> icon,
|
||||||
|
Fn<void()> next) {
|
||||||
|
auto callback = [=] {
|
||||||
|
update();
|
||||||
|
if (icon->frameIndex() == icon->framesCount()) {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
icon->animate(std::move(callback), 0, icon->framesCount());
|
||||||
|
};
|
||||||
|
const auto animate = [=](auto reanimate) -> void {
|
||||||
|
animateSingle(state->idle.get(), [=] { reanimate(reanimate); });
|
||||||
|
};
|
||||||
|
animateSingle(
|
||||||
|
state->start.get(),
|
||||||
|
[=] {
|
||||||
|
state->idle = Lottie::MakeIcon({
|
||||||
|
.name = u"voice_ttl_idle"_q,
|
||||||
|
.color = &st::historyFileInIconFg,
|
||||||
|
.sizeOverride = iconSize,
|
||||||
|
});
|
||||||
|
animate(animate);
|
||||||
|
});
|
||||||
|
return [=](QPainter &p, QRect r, QColor c) {
|
||||||
|
(state->idle ? state->idle : state->start)->paintInCenter(p, r, c);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool OncePlayable(not_null<HistoryItem*> item) {
|
[[nodiscard]] bool OncePlayable(not_null<HistoryItem*> item) {
|
||||||
return !item->out() && item->media()->ttlSeconds();
|
return !item->out() && item->media()->ttlSeconds();
|
||||||
}
|
}
|
||||||
|
@ -249,9 +297,11 @@ Document::Document(
|
||||||
Ui::Text::WithEntities)
|
Ui::Text::WithEntities)
|
||||||
});
|
});
|
||||||
if (lifetime) {
|
if (lifetime) {
|
||||||
|
_drawTtl = nullptr;
|
||||||
base::take(lifetime)->destroy();
|
base::take(lifetime)->destroy();
|
||||||
}
|
}
|
||||||
}, *lifetime);
|
}, *lifetime);
|
||||||
|
_drawTtl = CreateTtlPaintCallback(lifetime, [=] { repaint(); });
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
@ -670,7 +720,9 @@ void Document::draw(
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
const auto paintContent = [&](QPainter &q) {
|
const auto paintContent = [&](QPainter &q) {
|
||||||
if (previous && radialOpacity > 0. && radialOpacity < 1.) {
|
if (_drawTtl) {
|
||||||
|
_drawTtl(q, inner, context.st->historyFileInIconFg()->c);
|
||||||
|
} else if (previous && radialOpacity > 0. && radialOpacity < 1.) {
|
||||||
PaintInterpolatedIcon(q, icon, *previous, radialOpacity, inner);
|
PaintInterpolatedIcon(q, icon, *previous, radialOpacity, inner);
|
||||||
} else {
|
} else {
|
||||||
icon.paintInCenter(q, inner);
|
icon.paintInCenter(q, inner);
|
||||||
|
|
|
@ -25,6 +25,8 @@ class String;
|
||||||
|
|
||||||
namespace HistoryView {
|
namespace HistoryView {
|
||||||
|
|
||||||
|
using TtlPaintCallback = Fn<void(QPainter&, QRect, QColor)>;
|
||||||
|
|
||||||
class Document final
|
class Document final
|
||||||
: public File
|
: public File
|
||||||
, public RuntimeComposer<Document> {
|
, public RuntimeComposer<Document> {
|
||||||
|
@ -178,6 +180,8 @@ private:
|
||||||
|
|
||||||
mutable TooltipFilename _tooltipFilename;
|
mutable TooltipFilename _tooltipFilename;
|
||||||
|
|
||||||
|
TtlPaintCallback _drawTtl;
|
||||||
|
|
||||||
bool _transcribedRound = false;
|
bool _transcribedRound = false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue