Fix build for macOS.

This commit is contained in:
John Preston 2020-05-29 20:55:01 +04:00
parent 36fbdfb380
commit d5b3fa017b
10 changed files with 61 additions and 37 deletions

View File

@ -516,6 +516,7 @@ Manager::Private::Private(not_null<Manager*> manager, Type type)
void Manager::Private::showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -607,6 +608,7 @@ Manager::~Manager() = default;
void Manager::doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -615,6 +617,7 @@ void Manager::doShowNativeNotification(
bool hideReplyButton) {
_private->showNotification(
peer,
userpicView,
msgId,
title,
subtitle,

View File

@ -90,6 +90,7 @@ public:
protected:
void doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -112,6 +113,7 @@ public:
void showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,

View File

@ -22,6 +22,7 @@
#include "data/data_folder.h"
#include "data/data_peer_values.h"
#include "data/data_session.h"
#include "data/data_cloud_file.h"
#include "dialogs/dialogs_layout.h"
#include "ui/emoji_config.h"
#include "history/history.h"
@ -178,12 +179,12 @@ inline bool CurrentSongExists() {
return Media::Player::instance()->current(kSongType).audio() != nullptr;
}
inline bool UseEmptyUserpic(PeerData *peer) {
return (peer && (peer->useEmptyUserpic() || peer->isSelf()));
inline bool UseEmptyUserpic(PeerData *peer, std::shared_ptr<Data::CloudImageView> &userpic) {
return peer && (peer->useEmptyUserpic(userpic) || peer->isSelf());
}
inline bool IsSelfPeer(PeerData *peer) {
return (peer && peer->isSelf());
return peer && peer->isSelf();
}
inline int UnreadCount(not_null<PeerData*> peer) {
@ -484,6 +485,7 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
rpl::lifetime _lifetime;
rpl::lifetime _peerChangedLifetime;
base::has_weak_ptr _guard;
std::shared_ptr<Data::CloudImageView> _userpicView;
bool isWaitingUserpicLoad;
}
@ -523,7 +525,7 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
return update.paletteChanged();
}) | rpl::start_with_next([=] {
crl::on_main(&_guard, [=] {
if (_number <= kSavedMessagesId || UseEmptyUserpic(_peer)) {
if (_number <= kSavedMessagesId || UseEmptyUserpic(_peer, _userpicView)) {
[self updateUserpic];
} else if (_peer
&& (UnreadCount(_peer) || Data::IsPeerAnOnlineUser(_peer))) {
@ -556,8 +558,10 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
_peerChangedLifetime.destroy();
_peer = newPeer;
if (!_peer || IsSelfPeer(_peer)) {
_userpicView = nullptr;
return;
}
_userpicView = _peer->createUserpicView();
Notify::PeerUpdateViewer(
_peer,
Notify::PeerUpdate::Flag::PhotoChanged
@ -613,7 +617,9 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
Ui::EmptyUserpic::PaintSavedMessages(paint, 0, 0, s, s);
} else if (const auto folder =
Auth().data().folderLoaded(Data::Folder::kId)) {
folder->paintUserpic(paint, 0, 0, s);
// Not used in the folders.
auto view = std::shared_ptr<Data::CloudImageView>();
folder->paintUserpic(paint, view, 0, 0, s);
}
_userpic.setDevicePixelRatio(cRetinaFactor());
[self updateImage:_userpic];
@ -622,8 +628,8 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
if (!self.peer) {
return;
}
isWaitingUserpicLoad = !self.peer->userpicLoaded();
_userpic = self.peer->genUserpic(kIdealIconSize);
isWaitingUserpicLoad = _userpicView && !_userpicView->image();
_userpic = self.peer->genUserpic(_userpicView, kIdealIconSize);
_userpic.setDevicePixelRatio(cRetinaFactor());
[self updateBadge];
}
@ -681,24 +687,20 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
if (!document->sticker()) {
return;
}
documentData = document;
_media = document->createMediaView();
_media->checkStickerSmall();
_image = _media->getStickerSmall();
if (!_image) {
return;
}
fileOrigin = document->stickerSetOrigin();
documentData = std::move(document);
_dimensions = document->dimensions;
_image->load(fileOrigin);
if (_image->loaded()) {
if (_image) {
_dimensions = document->dimensions;
[self updateImage];
return;
}
base::ObservableViewer(
Auth().downloaderTaskFinished()
) | rpl::start_with_next([=] {
if (_image->loaded()) {
_image = _media->getStickerSmall();
if (_image) {
[self updateImage];
_lifetime.destroy();
}
@ -708,13 +710,13 @@ void AppendEmojiPacks(std::vector<PickerScrubberItem> &to) {
const auto size = _dimensions
.scaled(kCircleDiameter, kCircleDiameter, Qt::KeepAspectRatio);
_imageView.image = [qt_mac_create_nsimage(
_image->pixSingle(
size.width(),
size.height(),
kCircleDiameter,
kCircleDiameter,
ImageRoundRadius::None))
autorelease];
_image->pixSingle(
size.width(),
size.height(),
kCircleDiameter,
kCircleDiameter,
ImageRoundRadius::None))
autorelease];
}
@end // @implementation PickerScrubberItemView

View File

@ -21,6 +21,7 @@ public:
protected:
void doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,

View File

@ -164,6 +164,7 @@ public:
void showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -219,6 +220,7 @@ Manager::Private::Private(Manager *manager)
void Manager::Private::showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -241,7 +243,7 @@ void Manager::Private::showNotification(
if (!hideNameAndPhoto && [notification respondsToSelector:@selector(setContentImage:)]) {
auto userpic = peer->isSelf()
? Ui::EmptyUserpic::GenerateSavedMessages(st::notifyMacPhotoSize)
: peer->genUserpic(st::notifyMacPhotoSize);
: peer->genUserpic(userpicView, st::notifyMacPhotoSize);
NSImage *img = [qt_mac_create_nsimage(userpic) autorelease];
[notification setContentImage:img];
}
@ -349,6 +351,7 @@ Manager::~Manager() = default;
void Manager::doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -357,6 +360,7 @@ void Manager::doShowNativeNotification(
bool hideReplyButton) {
_private->showNotification(
peer,
userpicView,
msgId,
title,
subtitle,

View File

@ -343,6 +343,7 @@ public:
bool showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -455,6 +456,7 @@ void Manager::Private::clearNotification(PeerId peerId, MsgId msgId) {
bool Manager::Private::showNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -478,11 +480,10 @@ bool Manager::Private::showNotification(
hr = SetAudioSilent(toastXml.Get());
if (!SUCCEEDED(hr)) return false;
auto view = std::shared_ptr<Data::CloudImageView>(); // #TODO optimize
const auto key = hideNameAndPhoto
? InMemoryKey()
: peer->userpicUniqueKey(view);
const auto userpicPath = _cachedUserpics.get(key, peer, view);
: peer->userpicUniqueKey(userpicView);
const auto userpicPath = _cachedUserpics.get(key, peer, userpicView);
const auto userpicPathWide = QDir::toNativeSeparators(userpicPath).toStdWString();
hr = SetImageSrc(userpicPathWide.c_str(), toastXml.Get());
@ -582,6 +583,7 @@ Manager::~Manager() = default;
void Manager::doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,
@ -590,6 +592,7 @@ void Manager::doShowNativeNotification(
bool hideReplyButton) {
_private->showNotification(
peer,
userpicView,
msgId,
title,
subtitle,

View File

@ -26,6 +26,7 @@ public:
protected:
void doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,

View File

@ -160,7 +160,7 @@ const QPixmap &Image::pix(int w, int h) const {
if (i == _cache.cend()) {
auto p = pixNoCache(w, h, options);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -195,7 +195,7 @@ const QPixmap &Image::pixRounded(
if (i == _cache.cend()) {
auto p = pixNoCache(w, h, options);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -213,7 +213,7 @@ const QPixmap &Image::pixCircled(int w, int h) const {
if (i == _cache.cend()) {
auto p = pixNoCache(w, h, options);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -231,7 +231,7 @@ const QPixmap &Image::pixBlurredCircled(int w, int h) const {
if (i == _cache.cend()) {
auto p = pixNoCache(w, h, options);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -249,7 +249,7 @@ const QPixmap &Image::pixBlurred(int w, int h) const {
if (i == _cache.cend()) {
auto p = pixNoCache(w, h, options);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -267,7 +267,7 @@ const QPixmap &Image::pixColored(style::color add, int w, int h) const {
if (i == _cache.cend()) {
auto p = pixColoredNoCache(add, w, h, true);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -288,7 +288,7 @@ const QPixmap &Image::pixBlurredColored(
if (i == _cache.cend()) {
auto p = pixBlurredColoredNoCache(add, w, h);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -331,7 +331,7 @@ const QPixmap &Image::pixSingle(
if (i == _cache.cend() || i->second.width() != (outerw * cIntRetinaFactor()) || i->second.height() != (outerh * cIntRetinaFactor())) {
auto p = pixNoCache(w, h, options, outerw, outerh, colored);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}
@ -370,7 +370,7 @@ const QPixmap &Image::pixBlurredSingle(
if (i == _cache.cend() || i->second.width() != (outerw * cIntRetinaFactor()) || i->second.height() != (outerh * cIntRetinaFactor())) {
auto p = pixNoCache(w, h, options, outerw, outerh);
p.setDevicePixelRatio(cRetinaFactor());
i = _cache.emplace(k, p).first;
i = _cache.emplace_or_assign(k, p).first;
}
return i->second;
}

View File

@ -587,8 +587,11 @@ void NativeManager::doShowNotification(
: item->notificationText())
: tr::lng_forward_messages(tr::now, lt_count, forwardedCount));
// #TODO optimize
auto userpicView = item->history()->peer->createUserpicView();
doShowNativeNotification(
item->history()->peer,
userpicView,
item->id,
scheduled ? WrapFromScheduled(title) : title,
subtitle,

View File

@ -11,6 +11,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class History;
namespace Data {
class CloudImageView;
} // namespace Data
namespace Main {
class Session;
} // namespace Main
@ -219,6 +223,7 @@ protected:
virtual void doShowNativeNotification(
not_null<PeerData*> peer,
std::shared_ptr<Data::CloudImageView> &userpicView,
MsgId msgId,
const QString &title,
const QString &subtitle,