mirror of https://github.com/procxx/kepka.git
				
				
				
			Suggest faved stickers by emoji.
Request added faved sticker emoji if its pack is not loaded yet.
This commit is contained in:
		
							parent
							
								
									8188724920
								
							
						
					
					
						commit
						d44b303fb3
					
				|  | @ -1301,9 +1301,9 @@ void ApiWrap::gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result) | ||||||
| 		custom = sets.end(); | 		custom = sets.end(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool writeRecent = false; | 	auto writeRecent = false; | ||||||
| 	RecentStickerPack &recent(cGetRecentStickers()); | 	auto &recent = cGetRecentStickers(); | ||||||
| 	for (RecentStickerPack::iterator i = recent.begin(); i != recent.cend();) { | 	for (auto i = recent.begin(); i != recent.cend();) { | ||||||
| 		if (it->stickers.indexOf(i->first) >= 0 && pack.indexOf(i->first) < 0) { | 		if (it->stickers.indexOf(i->first) >= 0 && pack.indexOf(i->first) < 0) { | ||||||
| 			i = recent.erase(i); | 			i = recent.erase(i); | ||||||
| 			writeRecent = true; | 			writeRecent = true; | ||||||
|  | @ -1612,7 +1612,7 @@ void ApiWrap::requestFavedStickers(TimeId now) { | ||||||
| 		case mtpc_messages_favedStickersNotModified: return; | 		case mtpc_messages_favedStickersNotModified: return; | ||||||
| 		case mtpc_messages_favedStickers: { | 		case mtpc_messages_favedStickers: { | ||||||
| 			auto &d = result.c_messages_favedStickers(); | 			auto &d = result.c_messages_favedStickers(); | ||||||
| 			Stickers::SpecialSetReceived(Stickers::FavedSetId, lang(lng_faved_stickers), d.vstickers.v, d.vhash.v); | 			Stickers::SpecialSetReceived(Stickers::FavedSetId, lang(lng_faved_stickers), d.vstickers.v, d.vhash.v, d.vpacks.v); | ||||||
| 		} return; | 		} return; | ||||||
| 		default: Unexpected("Type in ApiWrap::favedStickersDone()"); | 		default: Unexpected("Type in ApiWrap::favedStickersDone()"); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org | ||||||
| #include "styles/style_widgets.h" | #include "styles/style_widgets.h" | ||||||
| #include "styles/style_chat_helpers.h" | #include "styles/style_chat_helpers.h" | ||||||
| #include "auth_session.h" | #include "auth_session.h" | ||||||
|  | #include "chat_helpers/stickers.h" | ||||||
| 
 | 
 | ||||||
| FieldAutocomplete::FieldAutocomplete(QWidget *parent) : TWidget(parent) | FieldAutocomplete::FieldAutocomplete(QWidget *parent) : TWidget(parent) | ||||||
| , _scroll(this, st::mentionScroll) { | , _scroll(this, st::mentionScroll) { | ||||||
|  | @ -147,30 +148,7 @@ void FieldAutocomplete::updateFiltered(bool resetScroll) { | ||||||
| 	internal::BotCommandRows brows; | 	internal::BotCommandRows brows; | ||||||
| 	StickerPack srows; | 	StickerPack srows; | ||||||
| 	if (_emoji) { | 	if (_emoji) { | ||||||
| 		auto original = _emoji->original(); | 		srows = Stickers::GetListByEmoji(_emoji); | ||||||
| 		QMap<uint64, uint64> setsToRequest; |  | ||||||
| 		auto &sets = Global::RefStickerSets(); |  | ||||||
| 		auto &order = Global::StickerSetsOrder(); |  | ||||||
| 		for (auto i = 0, l = order.size(); i != l; ++i) { |  | ||||||
| 			auto it = sets.find(order[i]); |  | ||||||
| 			if (it != sets.cend()) { |  | ||||||
| 				if (it->emoji.isEmpty()) { |  | ||||||
| 					setsToRequest.insert(it->id, it->access); |  | ||||||
| 					it->flags |= MTPDstickerSet_ClientFlag::f_not_loaded; |  | ||||||
| 				} else if (!(it->flags & MTPDstickerSet::Flag::f_archived)) { |  | ||||||
| 					auto i = it->emoji.constFind(original); |  | ||||||
| 					if (i != it->emoji.cend()) { |  | ||||||
| 						srows += *i; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if (!setsToRequest.isEmpty() && App::api()) { |  | ||||||
| 			for (QMap<uint64, uint64>::const_iterator i = setsToRequest.cbegin(), e = setsToRequest.cend(); i != e; ++i) { |  | ||||||
| 				App::api()->scheduleStickerSetRequest(i.key(), i.value()); |  | ||||||
| 			} |  | ||||||
| 			App::api()->requestStickerSets(); |  | ||||||
| 		} |  | ||||||
| 	} else if (_type == Type::Mentions) { | 	} else if (_type == Type::Mentions) { | ||||||
| 		int maxListSize = _addInlineBots ? cRecentInlineBots().size() : 0; | 		int maxListSize = _addInlineBots ? cRecentInlineBots().size() : 0; | ||||||
| 		if (_chat) { | 		if (_chat) { | ||||||
|  |  | ||||||
|  | @ -183,43 +183,115 @@ void MarkFeaturedAsRead(uint64 setId) { | ||||||
| 	FeaturedReaderInstance->scheduleRead(setId); | 	FeaturedReaderInstance->scheduleRead(setId); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool IsFaved(DocumentData *document) { | bool IsFaved(gsl::not_null<DocumentData*> document) { | ||||||
| 	auto it = Global::StickerSets().constFind(FavedSetId); | 	auto it = Global::StickerSets().constFind(FavedSetId); | ||||||
| 	return (it != Global::StickerSets().cend()) && it->stickers.contains(document); | 	return (it != Global::StickerSets().cend()) && it->stickers.contains(document); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SetFaved(DocumentData *document, bool faved) { | void SetIsFaved(gsl::not_null<DocumentData*> document, const std::vector<gsl::not_null<EmojiPtr>> *emojiList = nullptr) { | ||||||
| 	auto &sets = Global::RefStickerSets(); | 	auto &sets = Global::RefStickerSets(); | ||||||
| 	auto it = sets.find(FavedSetId); | 	auto it = sets.find(FavedSetId); | ||||||
| 	if (faved) { | 	if (it == sets.end()) { | ||||||
| 		if (it == sets.end()) { | 		it = sets.insert(FavedSetId, Set(FavedSetId, 0, lang(lng_faved_stickers), QString(), 0, 0, qFlags(MTPDstickerSet_ClientFlag::f_special))); | ||||||
| 			it = sets.insert(FavedSetId, Set(FavedSetId, 0, lang(lng_faved_stickers), QString(), 0, 0, qFlags(MTPDstickerSet_ClientFlag::f_special))); | 	} | ||||||
|  | 	auto index = it->stickers.indexOf(document); | ||||||
|  | 	if (index == 0) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	if (index > 0) { | ||||||
|  | 		// Push this sticker to the front.
 | ||||||
|  | 		while (index-- != 0) { | ||||||
|  | 			it->stickers[index + 1] = it->stickers[index]; | ||||||
| 		} | 		} | ||||||
| 		auto index = it->stickers.indexOf(document); | 		it->stickers[0] = document; | ||||||
| 		if (index != 0) { | 		for (auto &list : it->emoji) { | ||||||
|  | 			auto index = list.indexOf(document); | ||||||
| 			if (index > 0) { | 			if (index > 0) { | ||||||
| 				// Push this sticker to the front.
 |  | ||||||
| 				while (index-- != 0) { | 				while (index-- != 0) { | ||||||
| 					it->stickers[index + 1] = it->stickers[index]; | 					list[index + 1] = list[index]; | ||||||
| 				} | 				} | ||||||
| 				it->stickers[0] = document; | 				list[0] = document; | ||||||
| 			} else { |  | ||||||
| 				it->stickers.push_front(document); |  | ||||||
| 			} | 			} | ||||||
| 			Local::writeFavedStickers(); |  | ||||||
| 			emit App::main()->stickersUpdated(); |  | ||||||
| 			App::main()->onStickersInstalled(FavedSetId); |  | ||||||
| 		} | 		} | ||||||
| 	} else if (it != sets.end()) { | 	} else if (emojiList) { | ||||||
| 		auto index = it->stickers.indexOf(document); | 		it->stickers.push_front(document); | ||||||
|  | 		for (auto emoji : *emojiList) { | ||||||
|  | 			it->emoji[emoji].push_front(document); | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		auto list = GetEmojiListFromSet(document); | ||||||
|  | 		if (list.empty()) { | ||||||
|  | 			MTP::send(MTPmessages_GetStickerSet(document->sticker()->set), rpcDone([document](const MTPmessages_StickerSet &result) { | ||||||
|  | 				Expects(result.type() == mtpc_messages_stickerSet); | ||||||
|  | 				auto list = std::vector<gsl::not_null<EmojiPtr>>(); | ||||||
|  | 				auto &d = result.c_messages_stickerSet(); | ||||||
|  | 				list.reserve(d.vpacks.v.size()); | ||||||
|  | 				for_const (auto &mtpPack, d.vpacks.v) { | ||||||
|  | 					auto &pack = mtpPack.c_stickerPack(); | ||||||
|  | 					for_const (auto &documentId, pack.vdocuments.v) { | ||||||
|  | 						if (documentId.v == document->id) { | ||||||
|  | 							if (auto emoji = Ui::Emoji::Find(qs(mtpPack.c_stickerPack().vemoticon))) { | ||||||
|  | 								list.push_back(emoji); | ||||||
|  | 							} | ||||||
|  | 							break; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				if (list.empty()) { | ||||||
|  | 					if (auto sticker = document->sticker()) { | ||||||
|  | 						if (auto emoji = Ui::Emoji::Find(sticker->alt)) { | ||||||
|  | 							list.push_back(emoji); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				SetIsFaved(document, &list); | ||||||
|  | 			})); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		it->stickers.push_front(document); | ||||||
|  | 		for (auto emoji : list) { | ||||||
|  | 			it->emoji[emoji].push_front(document); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	Local::writeFavedStickers(); | ||||||
|  | 	emit App::main()->stickersUpdated(); | ||||||
|  | 	App::main()->onStickersInstalled(FavedSetId); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetIsNotFaved(gsl::not_null<DocumentData*> document) { | ||||||
|  | 	auto &sets = Global::RefStickerSets(); | ||||||
|  | 	auto it = sets.find(FavedSetId); | ||||||
|  | 	if (it == sets.end()) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	auto index = it->stickers.indexOf(document); | ||||||
|  | 	if (index < 0) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	it->stickers.removeAt(index); | ||||||
|  | 	for (auto i = it->emoji.begin(); i != it->emoji.end();) { | ||||||
|  | 		auto index = i->indexOf(document); | ||||||
| 		if (index >= 0) { | 		if (index >= 0) { | ||||||
| 			it->stickers.removeAt(index); | 			i->removeAt(index); | ||||||
| 			if (it->stickers.empty()) { | 			if (i->empty()) { | ||||||
| 				sets.erase(it); | 				i = it->emoji.erase(i); | ||||||
|  | 				continue; | ||||||
| 			} | 			} | ||||||
| 			Local::writeFavedStickers(); |  | ||||||
| 			emit App::main()->stickersUpdated(); |  | ||||||
| 		} | 		} | ||||||
|  | 		++i; | ||||||
|  | 	} | ||||||
|  | 	if (it->stickers.empty()) { | ||||||
|  | 		sets.erase(it); | ||||||
|  | 	} | ||||||
|  | 	Local::writeFavedStickers(); | ||||||
|  | 	emit App::main()->stickersUpdated(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetFaved(gsl::not_null<DocumentData*> document, bool faved) { | ||||||
|  | 	if (faved) { | ||||||
|  | 		SetIsFaved(document); | ||||||
|  | 	} else { | ||||||
|  | 		SetIsNotFaved(document); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -287,7 +359,30 @@ void SetsReceived(const QVector<MTPStickerSet> &data, int32 hash) { | ||||||
| 	if (App::main()) emit App::main()->stickersUpdated(); | 	if (App::main()) emit App::main()->stickersUpdated(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SpecialSetReceived(uint64 setId, const QString &setTitle, const QVector<MTPDocument> &items, int32 hash) { | void SetPackAndEmoji(Set &set, StickerPack &&pack, const QVector<MTPStickerPack> &packs) { | ||||||
|  | 	set.stickers = std::move(pack); | ||||||
|  | 	set.emoji.clear(); | ||||||
|  | 	for_const (auto &mtpPack, packs) { | ||||||
|  | 		t_assert(mtpPack.type() == mtpc_stickerPack); | ||||||
|  | 		auto &pack = mtpPack.c_stickerPack(); | ||||||
|  | 		if (auto emoji = Ui::Emoji::Find(qs(pack.vemoticon))) { | ||||||
|  | 			emoji = emoji->original(); | ||||||
|  | 			auto &stickers = pack.vdocuments.v; | ||||||
|  | 
 | ||||||
|  | 			auto p = StickerPack(); | ||||||
|  | 			p.reserve(stickers.size()); | ||||||
|  | 			for (auto j = 0, c = stickers.size(); j != c; ++j) { | ||||||
|  | 				auto document = App::document(stickers[j].v); | ||||||
|  | 				if (!document || !document->sticker()) continue; | ||||||
|  | 
 | ||||||
|  | 				p.push_back(document); | ||||||
|  | 			} | ||||||
|  | 			set.emoji.insert(emoji, p); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SpecialSetReceived(uint64 setId, const QString &setTitle, const QVector<MTPDocument> &items, int32 hash, const QVector<MTPStickerPack> &packs) { | ||||||
| 	auto &sets = Global::RefStickerSets(); | 	auto &sets = Global::RefStickerSets(); | ||||||
| 	auto it = sets.find(setId); | 	auto it = sets.find(setId); | ||||||
| 
 | 
 | ||||||
|  | @ -338,8 +433,7 @@ void SpecialSetReceived(uint64 setId, const QString &setTitle, const QVector<MTP | ||||||
| 		if (pack.isEmpty()) { | 		if (pack.isEmpty()) { | ||||||
| 			sets.erase(it); | 			sets.erase(it); | ||||||
| 		} else { | 		} else { | ||||||
| 			it->stickers = pack; | 			SetPackAndEmoji(*it, std::move(pack), packs); | ||||||
| 			it->emoji.clear(); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (writeRecent) { | 		if (writeRecent) { | ||||||
|  | @ -492,6 +586,71 @@ void GifsReceived(const QVector<MTPDocument> &items, int32 hash) { | ||||||
| 	AuthSession::Current().data().savedGifsUpdated().notify(); | 	AuthSession::Current().data().savedGifsUpdated().notify(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | StickerPack GetListByEmoji(gsl::not_null<EmojiPtr> emoji) { | ||||||
|  | 	auto original = emoji->original(); | ||||||
|  | 	auto result = StickerPack(); | ||||||
|  | 	auto setsToRequest = QMap<uint64, uint64>(); | ||||||
|  | 	auto &sets = Global::RefStickerSets(); | ||||||
|  | 
 | ||||||
|  | 	auto faved = StickerPack(); | ||||||
|  | 	auto favedIt = sets.find(Stickers::FavedSetId); | ||||||
|  | 	if (favedIt != sets.cend()) { | ||||||
|  | 		auto i = favedIt->emoji.constFind(original); | ||||||
|  | 		if (i != favedIt->emoji.cend()) { | ||||||
|  | 			faved = *i; | ||||||
|  | 			result = faved; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	auto &order = Global::StickerSetsOrder(); | ||||||
|  | 	for (auto i = 0, l = order.size(); i != l; ++i) { | ||||||
|  | 		auto it = sets.find(order[i]); | ||||||
|  | 		if (it != sets.cend()) { | ||||||
|  | 			if (it->emoji.isEmpty()) { | ||||||
|  | 				setsToRequest.insert(it->id, it->access); | ||||||
|  | 				it->flags |= MTPDstickerSet_ClientFlag::f_not_loaded; | ||||||
|  | 			} else if (!(it->flags & MTPDstickerSet::Flag::f_archived)) { | ||||||
|  | 				auto i = it->emoji.constFind(original); | ||||||
|  | 				if (i != it->emoji.cend()) { | ||||||
|  | 					result.reserve(result.size() + i->size()); | ||||||
|  | 					for_const (auto sticker, *i) { | ||||||
|  | 						if (!faved.contains(sticker)) { | ||||||
|  | 							result.push_back(sticker); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if (!setsToRequest.isEmpty()) { | ||||||
|  | 		for (auto i = setsToRequest.cbegin(), e = setsToRequest.cend(); i != e; ++i) { | ||||||
|  | 			AuthSession::Current().api().scheduleStickerSetRequest(i.key(), i.value()); | ||||||
|  | 		} | ||||||
|  | 		AuthSession::Current().api().requestStickerSets(); | ||||||
|  | 	} | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::vector<gsl::not_null<EmojiPtr>> GetEmojiListFromSet(gsl::not_null<DocumentData*> document) { | ||||||
|  | 	auto result = std::vector<gsl::not_null<EmojiPtr>>(); | ||||||
|  | 	if (auto sticker = document->sticker()) { | ||||||
|  | 		auto &inputSet = sticker->set; | ||||||
|  | 		if (inputSet.type() != mtpc_inputStickerSetID) { | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 		auto &sets = Global::StickerSets(); | ||||||
|  | 		auto it = sets.constFind(inputSet.c_inputStickerSetID().vid.v); | ||||||
|  | 		if (it == sets.cend()) { | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 		for (auto i = it->emoji.cbegin(), e = it->emoji.cend(); i != e; ++i) { | ||||||
|  | 			if (i->contains(document)) { | ||||||
|  | 				result.push_back(i.key()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace internal { | namespace internal { | ||||||
| 
 | 
 | ||||||
| FeaturedReader::FeaturedReader(QObject *parent) : QObject(parent) | FeaturedReader::FeaturedReader(QObject *parent) : QObject(parent) | ||||||
|  |  | ||||||
|  | @ -31,14 +31,17 @@ bool ApplyArchivedResultFake(); // For testing. | ||||||
| void InstallLocally(uint64 setId); | void InstallLocally(uint64 setId); | ||||||
| void UndoInstallLocally(uint64 setId); | void UndoInstallLocally(uint64 setId); | ||||||
| void MarkFeaturedAsRead(uint64 setId); | void MarkFeaturedAsRead(uint64 setId); | ||||||
| bool IsFaved(DocumentData *document); | bool IsFaved(gsl::not_null<DocumentData*> document); | ||||||
| void SetFaved(DocumentData *document, bool faved); | void SetFaved(gsl::not_null<DocumentData*> document, bool faved); | ||||||
| 
 | 
 | ||||||
| void SetsReceived(const QVector<MTPStickerSet> &data, int32 hash); | void SetsReceived(const QVector<MTPStickerSet> &data, int32 hash); | ||||||
| void SpecialSetReceived(uint64 setId, const QString &setTitle, const QVector<MTPDocument> &items, int32 hash); | void SpecialSetReceived(uint64 setId, const QString &setTitle, const QVector<MTPDocument> &items, int32 hash, const QVector<MTPStickerPack> &packs = QVector<MTPStickerPack>()); | ||||||
| void FeaturedSetsReceived(const QVector<MTPStickerSetCovered> &data, const QVector<MTPlong> &unread, int32 hash); | void FeaturedSetsReceived(const QVector<MTPStickerSetCovered> &data, const QVector<MTPlong> &unread, int32 hash); | ||||||
| void GifsReceived(const QVector<MTPDocument> &items, int32 hash); | void GifsReceived(const QVector<MTPDocument> &items, int32 hash); | ||||||
| 
 | 
 | ||||||
|  | StickerPack GetListByEmoji(gsl::not_null<EmojiPtr> emoji); | ||||||
|  | std::vector<gsl::not_null<EmojiPtr>> GetEmojiListFromSet(gsl::not_null<DocumentData*> document); | ||||||
|  | 
 | ||||||
| namespace internal { | namespace internal { | ||||||
| 
 | 
 | ||||||
| class FeaturedReader : public QObject, private MTP::Sender { | class FeaturedReader : public QObject, private MTP::Sender { | ||||||
|  |  | ||||||
|  | @ -33,6 +33,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org | ||||||
| #include "ui/widgets/shadow.h" | #include "ui/widgets/shadow.h" | ||||||
| #include "window/window_main_menu.h" | #include "window/window_main_menu.h" | ||||||
| #include "auth_session.h" | #include "auth_session.h" | ||||||
|  | #include "chat_helpers/stickers.h" | ||||||
| #include "window/window_controller.h" | #include "window/window_controller.h" | ||||||
| 
 | 
 | ||||||
| namespace { | namespace { | ||||||
|  | @ -756,12 +757,12 @@ void MediaPreviewWidget::paintEvent(QPaintEvent *e) { | ||||||
| 	} | 	} | ||||||
| 	p.fillRect(r, st::stickerPreviewBg); | 	p.fillRect(r, st::stickerPreviewBg); | ||||||
| 	p.drawPixmap((width() - w) / 2, (height() - h) / 2, image); | 	p.drawPixmap((width() - w) / 2, (height() - h) / 2, image); | ||||||
| 	if (!_emojiList.isEmpty()) { | 	if (!_emojiList.empty()) { | ||||||
| 		auto emojiCount = _emojiList.size(); | 		auto emojiCount = _emojiList.size(); | ||||||
| 		auto emojiWidth = (emojiCount * _emojiSize) + (emojiCount - 1) * st::stickerEmojiSkip; | 		auto emojiWidth = (emojiCount * _emojiSize) + (emojiCount - 1) * st::stickerEmojiSkip; | ||||||
| 		auto emojiLeft = (width() - emojiWidth) / 2; | 		auto emojiLeft = (width() - emojiWidth) / 2; | ||||||
| 		auto esize = Ui::Emoji::Size(Ui::Emoji::Index() + 1); | 		auto esize = Ui::Emoji::Size(Ui::Emoji::Index() + 1); | ||||||
| 		for_const (auto emoji, _emojiList) { | 		for (auto emoji : _emojiList) { | ||||||
| 			p.drawPixmapLeft(emojiLeft, (height() - h) / 2 - (_emojiSize * 2), width(), App::emojiLarge(), QRect(emoji->x() * esize, emoji->y() * esize, esize, esize)); | 			p.drawPixmapLeft(emojiLeft, (height() - h) / 2 - (_emojiSize * 2), width(), App::emojiLarge(), QRect(emoji->x() * esize, emoji->y() * esize, esize, esize)); | ||||||
| 			emojiLeft += _emojiSize + st::stickerEmojiSkip; | 			emojiLeft += _emojiSize + st::stickerEmojiSkip; | ||||||
| 		} | 		} | ||||||
|  | @ -825,36 +826,17 @@ void MediaPreviewWidget::hidePreview() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void MediaPreviewWidget::fillEmojiString() { | void MediaPreviewWidget::fillEmojiString() { | ||||||
| 	auto getStickerEmojiList = [this](uint64 setId) { |  | ||||||
| 		QList<EmojiPtr> result; |  | ||||||
| 		auto &sets = Global::StickerSets(); |  | ||||||
| 		auto it = sets.constFind(setId); |  | ||||||
| 		if (it == sets.cend()) { |  | ||||||
| 			return result; |  | ||||||
| 		} |  | ||||||
| 		for (auto i = it->emoji.cbegin(), e = it->emoji.cend(); i != e; ++i) { |  | ||||||
| 			for_const (auto document, *i) { |  | ||||||
| 				if (document == _document) { |  | ||||||
| 					result.append(i.key()); |  | ||||||
| 					if (result.size() >= kStickerPreviewEmojiLimit) { |  | ||||||
| 						return result; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return result; |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	if (_photo) { | 	if (_photo) { | ||||||
| 		_emojiList.clear(); | 		_emojiList.clear(); | ||||||
| 	} else if (auto sticker = _document->sticker()) { | 	} else if (auto sticker = _document->sticker()) { | ||||||
| 		auto &inputSet = sticker->set; | 		_emojiList = Stickers::GetEmojiListFromSet(_document); | ||||||
| 		if (inputSet.type() == mtpc_inputStickerSetID) { | 		if (_emojiList.empty()) { | ||||||
| 			_emojiList = getStickerEmojiList(inputSet.c_inputStickerSetID().vid.v); |  | ||||||
| 		} else { |  | ||||||
| 			_emojiList.clear(); |  | ||||||
| 			if (auto emoji = Ui::Emoji::Find(sticker->alt)) { | 			if (auto emoji = Ui::Emoji::Find(sticker->alt)) { | ||||||
| 				_emojiList.append(emoji); | 				_emojiList.push_back(emoji); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			while (_emojiList.size() > kStickerPreviewEmojiLimit) { | ||||||
|  | 				_emojiList.pop_back(); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
|  |  | ||||||
|  | @ -197,7 +197,7 @@ private: | ||||||
| 	Media::Clip::ReaderPointer _gif; | 	Media::Clip::ReaderPointer _gif; | ||||||
| 
 | 
 | ||||||
| 	int _emojiSize; | 	int _emojiSize; | ||||||
| 	QList<EmojiPtr> _emojiList; | 	std::vector<gsl::not_null<EmojiPtr>> _emojiList; | ||||||
| 
 | 
 | ||||||
| 	void clipCallback(Media::Clip::Notification notification); | 	void clipCallback(Media::Clip::Notification notification); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue