Respect wallpaper_overriden flag.

This commit is contained in:
John Preston 2023-11-29 18:00:50 +04:00
parent 1a69975131
commit 514ced1d8e
7 changed files with 47 additions and 22 deletions

View file

@ -1996,7 +1996,8 @@ void Updates::feedUpdate(const MTPUpdate &update) {
if (const auto peer = session().data().peerLoaded(peerFromMTP(d.vpeer()))) { if (const auto peer = session().data().peerLoaded(peerFromMTP(d.vpeer()))) {
if (const auto paper = d.vwallpaper()) { if (const auto paper = d.vwallpaper()) {
peer->setWallPaper( peer->setWallPaper(
Data::WallPaper::Create(&session(), *paper)); Data::WallPaper::Create(&session(), *paper),
d.is_wallpaper_overridden());
} else { } else {
peer->setWallPaper({}); peer->setWallPaper({});
} }

View file

@ -310,7 +310,7 @@ void BackgroundBox::resetForPeer() {
}).send(); }).send();
const auto weak = Ui::MakeWeak(this); const auto weak = Ui::MakeWeak(this);
_forPeer->setWallPaper(std::nullopt); _forPeer->setWallPaper({});
if (weak) { if (weak) {
_controller->finishChatThemeEdit(_forPeer); _controller->finishChatThemeEdit(_forPeer);
} }

View file

@ -1227,16 +1227,30 @@ const QString &PeerData::themeEmoji() const {
return _themeEmoticon; return _themeEmoticon;
} }
void PeerData::setWallPaper(std::optional<Data::WallPaper> paper) { void PeerData::setWallPaper(
if (!paper && !_wallPaper) { std::optional<Data::WallPaper> paper,
return; bool overriden) {
} else if (paper && _wallPaper && _wallPaper->equals(*paper)) { const auto paperChanged = (paper || _wallPaper)
return; && (!paper || !_wallPaper || !_wallPaper->equals(*paper));
if (paperChanged) {
_wallPaper = paper
? std::make_unique<Data::WallPaper>(std::move(*paper))
: nullptr;
} }
_wallPaper = paper
? std::make_unique<Data::WallPaper>(std::move(*paper)) const auto overridenValue = overriden ? 1 : 0;
: nullptr; const auto overridenChanged = (_wallPaperOverriden != overridenValue);
session().changes().peerUpdated(this, UpdateFlag::ChatWallPaper); if (overridenChanged) {
_wallPaperOverriden = overridenValue;
}
if (paperChanged || overridenChanged) {
session().changes().peerUpdated(this, UpdateFlag::ChatWallPaper);
}
}
bool PeerData::wallPaperOverriden() const {
return _wallPaperOverriden != 0;
} }
const Data::WallPaper *PeerData::wallPaper() const { const Data::WallPaper *PeerData::wallPaper() const {

View file

@ -414,7 +414,10 @@ public:
void setThemeEmoji(const QString &emoticon); void setThemeEmoji(const QString &emoticon);
[[nodiscard]] const QString &themeEmoji() const; [[nodiscard]] const QString &themeEmoji() const;
void setWallPaper(std::optional<Data::WallPaper> paper); void setWallPaper(
std::optional<Data::WallPaper> paper,
bool overriden = false);
[[nodiscard]] bool wallPaperOverriden() const;
[[nodiscard]] const Data::WallPaper *wallPaper() const; [[nodiscard]] const Data::WallPaper *wallPaper() const;
enum class StoriesState { enum class StoriesState {
@ -467,7 +470,8 @@ private:
crl::time _lastFullUpdate = 0; crl::time _lastFullUpdate = 0;
QString _name; QString _name;
int _nameVersion = 1; uint32 _nameVersion : 31 = 1;
uint32 _wallPaperOverriden : 1 = 0;
TimeId _ttlPeriod = 0; TimeId _ttlPeriod = 0;
@ -475,6 +479,7 @@ private:
TimeId _requestChatDate = 0; TimeId _requestChatDate = 0;
Settings _settings = PeerSettings(PeerSetting::Unknown); Settings _settings = PeerSettings(PeerSetting::Unknown);
BlockStatus _blockStatus = BlockStatus::Unknown; BlockStatus _blockStatus = BlockStatus::Unknown;
LoadedStatus _loadedStatus = LoadedStatus::Not; LoadedStatus _loadedStatus = LoadedStatus::Not;
TranslationFlag _translationFlag = TranslationFlag::Unknown; TranslationFlag _translationFlag = TranslationFlag::Unknown;

View file

@ -515,7 +515,8 @@ void ApplyUserUpdate(not_null<UserData*> user, const MTPDuserFull &update) {
if (const auto paper = update.vwallpaper()) { if (const auto paper = update.vwallpaper()) {
user->setWallPaper( user->setWallPaper(
Data::WallPaper::Create(&user->session(), *paper)); Data::WallPaper::Create(&user->session(), *paper),
update.is_wallpaper_overridden());
} else { } else {
user->setWallPaper({}); user->setWallPaper({});
} }

View file

@ -1195,7 +1195,8 @@ void History::applyServiceChanges(
}, [&](const MTPDmessageActionSetChatWallPaper &data) { }, [&](const MTPDmessageActionSetChatWallPaper &data) {
if (item->out() || data.is_for_both()) { if (item->out() || data.is_for_both()) {
peer->setWallPaper( peer->setWallPaper(
Data::WallPaper::Create(&session(), data.vwallpaper())); Data::WallPaper::Create(&session(), data.vwallpaper()),
!item->out() && data.is_for_both());
} }
}, [&](const MTPDmessageActionChatJoinedByRequest &data) { }, [&](const MTPDmessageActionChatJoinedByRequest &data) {
processJoinedPeer(item->from()); processJoinedPeer(item->from());

View file

@ -40,22 +40,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace HistoryView { namespace HistoryView {
namespace { namespace {
[[nodiscard]] bool HasThatWallPaperForBoth( [[nodiscard]] bool WallPaperRevertable(
not_null<PeerData*> peer, not_null<PeerData*> peer,
const Data::WallPaper &paper) { const Data::WallPaper &paper) {
if (!peer->wallPaperOverriden()) {
return false;
}
const auto now = peer->wallPaper(); const auto now = peer->wallPaper();
return now && now->equals(paper); return now && now->equals(paper);
} }
[[nodiscard]] bool HasThatWallPaperForBoth(not_null<HistoryItem*> item) { [[nodiscard]] bool WallPaperRevertable(not_null<HistoryItem*> item) {
const auto media = item->media(); const auto media = item->media();
const auto paper = media ? media->paper() : nullptr; const auto paper = media ? media->paper() : nullptr;
return paper return paper
&& media->paperForBoth() && media->paperForBoth()
&& HasThatWallPaperForBoth(item->history()->peer, *paper); && WallPaperRevertable(item->history()->peer, *paper);
} }
[[nodiscard]] rpl::producer<bool> HasThatWallPaperForBothValue( [[nodiscard]] rpl::producer<bool> WallPaperRevertableValue(
not_null<HistoryItem*> item) { not_null<HistoryItem*> item) {
const auto media = item->media(); const auto media = item->media();
const auto paper = media ? media->paper() : nullptr; const auto paper = media ? media->paper() : nullptr;
@ -67,7 +70,7 @@ namespace {
peer, peer,
Data::PeerUpdate::Flag::ChatWallPaper Data::PeerUpdate::Flag::ChatWallPaper
) | rpl::map([peer, paper = *paper] { ) | rpl::map([peer, paper = *paper] {
return HasThatWallPaperForBoth(peer, paper); return WallPaperRevertable(peer, paper);
}); });
} }
@ -499,7 +502,7 @@ rpl::producer<QString> ThemeDocumentBox::button() {
return _parent->data()->out() return _parent->data()->out()
? nullptr ? nullptr
: rpl::conditional( : rpl::conditional(
HasThatWallPaperForBothValue(_parent->data()), WallPaperRevertableValue(_parent->data()),
tr::lng_action_set_wallpaper_remove(), tr::lng_action_set_wallpaper_remove(),
tr::lng_action_set_wallpaper_button()); tr::lng_action_set_wallpaper_button());
} }
@ -518,7 +521,7 @@ ClickHandlerPtr ThemeDocumentBox::createViewLink() {
const auto view = weak.get(); const auto view = weak.get();
if (view if (view
&& !view->data()->out() && !view->data()->out()
&& HasThatWallPaperForBoth(view->data())) { && WallPaperRevertable(view->data())) {
const auto reset = crl::guard(weak, [=](Fn<void()> close) { const auto reset = crl::guard(weak, [=](Fn<void()> close) {
const auto api = &controller->session().api(); const auto api = &controller->session().api();
api->request(MTPmessages_SetChatWallPaper( api->request(MTPmessages_SetChatWallPaper(