2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-08-31 14:38:15 +00:00

forward by drag-n-drop from media overview, fixed video overview, stickers enlarged and optimized, preparing version 0.8.34.dev

This commit is contained in:
John Preston
2015-06-28 15:37:10 +03:00
parent 8e82b8894d
commit 405dfbebae
31 changed files with 818 additions and 572 deletions

View File

@@ -2240,9 +2240,17 @@ namespace Local {
void _writeStickerSet(QDataStream &stream, uint64 setId) {
StickerSets::const_iterator it = cStickerSets().constFind(setId);
if (it == cStickerSets().cend() || it->stickers.isEmpty()) return;
if (it == cStickerSets().cend()) return;
stream << quint64(it->id) << quint64(it->access) << it->title << it->shortName << quint32(it->stickers.size());
bool notLoaded = (it->flags & MTPDstickerSet_flag_NOT_LOADED);
if (notLoaded) {
stream << quint64(it->id) << quint64(it->access) << it->title << it->shortName << qint32(-it->count) << qint32(it->hash) << qint32(it->flags);
return;
} else {
if (it->stickers.isEmpty()) return;
}
stream << quint64(it->id) << quint64(it->access) << it->title << it->shortName << qint32(it->stickers.size()) << qint32(it->hash) << qint32(it->flags);
for (StickerPack::const_iterator j = it->stickers.cbegin(), e = it->stickers.cend(); j != e; ++j) {
DocumentData *doc = *j;
stream << quint64(doc->id) << quint64(doc->access) << qint32(doc->date) << doc->name << doc->mime << qint32(doc->dc) << qint32(doc->size) << qint32(doc->dimensions.width()) << qint32(doc->dimensions.height()) << qint32(doc->type) << doc->sticker->alt;
@@ -2275,17 +2283,20 @@ namespace Local {
}
_writeMap();
} else {
if (!_stickersKey) {
_stickersKey = genKey();
_mapChanged = true;
_writeMap(WriteMapFast);
}
int32 setsCount = 0;
quint32 size = sizeof(quint32) + _bytearraySize(cStickersHash());
for (StickerSets::const_iterator i = sets.cbegin(); i != sets.cend(); ++i) {
if (i->stickers.isEmpty()) continue;
bool notLoaded = (i->flags & MTPDstickerSet_flag_NOT_LOADED);
if (notLoaded) {
if (!(i->flags & MTPDstickerSet_flag_disabled)) { // waiting to receive
return;
}
} else {
if (i->stickers.isEmpty()) continue;
}
// id + access + title + shortName + stickersCount
size += sizeof(quint64) * 2 + _stringSize(i->title) + _stringSize(i->shortName) + sizeof(quint32);
// id + access + title + shortName + stickersCount + hash + flags
size += sizeof(quint64) * 2 + _stringSize(i->title) + _stringSize(i->shortName) + sizeof(quint32) + sizeof(qint32) * 2;
for (StickerPack::const_iterator j = i->stickers.cbegin(), e = i->stickers.cend(); j != e; ++j) {
DocumentData *doc = *j;
@@ -2295,10 +2306,16 @@ namespace Local {
// thumb-width + thumb-height + thumb-dc + thumb-volume + thumb-local + thumb-secret
size += sizeof(qint32) + sizeof(qint32) + sizeof(qint32) + sizeof(quint64) + sizeof(qint32) + sizeof(quint64);
}
++setsCount;
}
if (!_stickersKey) {
_stickersKey = genKey();
_mapChanged = true;
_writeMap(WriteMapFast);
}
EncryptedDescriptor data(size);
data.stream << quint32(cStickerSets().size()) << cStickersHash();
_writeStickerSet(data.stream, DefaultStickerSetId);
data.stream << quint32(setsCount) << cStickersHash();
_writeStickerSet(data.stream, CustomStickerSetId);
for (StickerSetsOrder::const_iterator i = cStickerSetsOrder().cbegin(), e = cStickerSetsOrder().cend(); i != e; ++i) {
_writeStickerSet(data.stream, *i);
@@ -2321,15 +2338,17 @@ namespace Local {
StickerSets &sets(cRefStickerSets());
sets.clear();
cSetStickerSetsOrder(StickerSetsOrder());
StickerSetsOrder &order(cRefStickerSetsOrder());
order.clear();
RecentStickerPack &recent(cRefRecentStickers());
recent.clear();
cSetStickersHash(QByteArray());
StickerSet &def(sets.insert(DefaultStickerSetId, StickerSet(DefaultStickerSetId, 0, lang(lng_stickers_default_set), QString())).value());
StickerSet &custom(sets.insert(CustomStickerSetId, StickerSet(CustomStickerSetId, 0, lang(lng_custom_stickers), QString())).value());
StickerSet &def(sets.insert(DefaultStickerSetId, StickerSet(DefaultStickerSetId, 0, lang(lng_stickers_default_set), QString(), 0, 0, MTPDstickerSet_flag_official)).value());
StickerSet &custom(sets.insert(CustomStickerSetId, StickerSet(CustomStickerSetId, 0, lang(lng_custom_stickers), QString(), 0, 0, 0)).value());
QMap<uint64, bool> read;
while (!stickers.stream.atEnd()) {
@@ -2360,12 +2379,18 @@ namespace Local {
if (value > 0) {
def.stickers.push_back(doc);
++def.count;
} else {
custom.stickers.push_back(doc);
++custom.count;
}
if (recent.size() < StickerPanPerRow * StickerPanRowsPerPage && qAbs(value) > 1) recent.push_back(qMakePair(doc, qAbs(value)));
}
if (def.stickers.isEmpty()) sets.remove(DefaultStickerSetId);
if (def.stickers.isEmpty()) {
sets.remove(DefaultStickerSetId);
} else {
order.push_front(DefaultStickerSetId);
}
if (custom.stickers.isEmpty()) sets.remove(CustomStickerSetId);
writeStickers();
@@ -2405,11 +2430,18 @@ namespace Local {
for (uint32 i = 0; i < cnt; ++i) {
quint64 setId = 0, setAccess = 0;
QString setTitle, setShortName;
quint32 scnt = 0;
qint32 scnt = 0;
stickers.stream >> setId >> setAccess >> setTitle >> setShortName >> scnt;
qint32 setHash = 0, setFlags = 0;
if (stickers.version > 8033) {
stickers.stream >> setHash >> setFlags;
}
if (setId == DefaultStickerSetId) {
setTitle = lang(lng_stickers_default_set);
setFlags |= MTPDstickerSet_flag_official;
order.push_front(setId);
} else if (setId == CustomStickerSetId) {
setTitle = lang(lng_custom_stickers);
} else if (setId) {
@@ -2417,7 +2449,12 @@ namespace Local {
} else {
continue;
}
StickerSet &set(sets.insert(setId, StickerSet(setId, setAccess, setTitle, setShortName)).value());
StickerSet &set(sets.insert(setId, StickerSet(setId, setAccess, setTitle, setShortName, 0, setHash, setFlags)).value());
if (scnt < 0) { // disabled not loaded set
set.count = -scnt;
continue;
}
set.stickers.reserve(scnt);
QMap<uint64, bool> read;
@@ -2465,6 +2502,7 @@ namespace Local {
if (!doc->sticker) continue;
set.stickers.push_back(doc);
++set.count;
}
}