sticker packs order now is saved, new packs added to the top, fixed emoji categories icons

This commit is contained in:
John Preston 2015-05-21 13:44:26 +03:00
parent cfdacb09ac
commit 18361ce144
9 changed files with 74 additions and 44 deletions

View file

@ -1518,12 +1518,12 @@ emojiFoodActive: sprite(266px, 286px, 21px, 22px);
emojiCelebration: sprite(84px, 196px, 21px, 22px); emojiCelebration: sprite(84px, 196px, 21px, 22px);
emojiCelebrationOver: sprite(287px, 264px, 21px, 22px); emojiCelebrationOver: sprite(287px, 264px, 21px, 22px);
emojiCelebrationActive: sprite(287px, 286px, 21px, 22px); emojiCelebrationActive: sprite(287px, 286px, 21px, 22px);
emojiActivity: sprite(105px, 196px, 21px, 22px); emojiActivity: sprite(126px, 196px, 21px, 22px);
emojiActivityOver: sprite(308px, 264px, 21px, 22px); emojiActivityOver: sprite(321px, 344px, 21px, 22px);
emojiActivityActive: sprite(308px, 286px, 21px, 22px); emojiActivityActive: sprite(321px, 366px, 21px, 22px);
emojiTravel: sprite(126px, 196px, 21px, 22px); emojiTravel: sprite(105px, 196px, 21px, 22px);
emojiTravelOver: sprite(321px, 344px, 21px, 22px); emojiTravelOver: sprite(308px, 264px, 21px, 22px);
emojiTravelActive: sprite(321px, 366px, 21px, 22px); emojiTravelActive: sprite(308px, 286px, 21px, 22px);
emojiObjects: sprite(147px, 196px, 21px, 22px); emojiObjects: sprite(147px, 196px, 21px, 22px);
emojiObjectsOver: sprite(342px, 344px, 21px, 22px); emojiObjectsOver: sprite(342px, 344px, 21px, 22px);
emojiObjectsActive: sprite(342px, 366px, 21px, 22px); emojiObjectsActive: sprite(342px, 366px, 21px, 22px);

View file

@ -1529,6 +1529,7 @@ namespace App {
cSetStickersHash(QByteArray()); cSetStickersHash(QByteArray());
cSetEmojiStickers(EmojiStickersMap()); cSetEmojiStickers(EmojiStickersMap());
cSetStickerSets(StickerSets()); cSetStickerSets(StickerSets());
cSetStickerSetsOrder(StickerSetsOrder());
cSetLastStickersUpdate(0); cSetLastStickersUpdate(0);
::videoItems.clear(); ::videoItems.clear();
::audioItems.clear(); ::audioItems.clear();

View file

@ -83,14 +83,20 @@ bool StickerSetInner::failedSet(const RPCError &error) {
void StickerSetInner::installDone(const MTPBool &result) { void StickerSetInner::installDone(const MTPBool &result) {
StickerSets &sets(cRefStickerSets()); StickerSets &sets(cRefStickerSets());
StickerSets::iterator custom = sets.find(CustomStickerSetId);
sets.insert(_setId, StickerSet(_setId, _setAccess, _setTitle, _setShortName)).value().stickers = _pack; sets.insert(_setId, StickerSet(_setId, _setAccess, _setTitle, _setShortName)).value().stickers = _pack;
int32 index = cStickerSetsOrder().indexOf(_setId);
if (index > 0) {
cRefStickerSetsOrder().removeAt(index);
cRefStickerSetsOrder().push_front(_setId);
} else if (index < 0) {
cRefStickerSetsOrder().push_front(_setId);
}
StickerSets::iterator custom = sets.find(CustomStickerSetId);
if (custom != sets.cend()) { if (custom != sets.cend()) {
for (int32 i = 0, l = _pack.size(); i < l; ++i) { for (int32 i = 0, l = _pack.size(); i < l; ++i) {
int32 index = custom->stickers.indexOf(_pack.at(i)); custom->stickers.removeOne(_pack.at(i));
if (index >= 0) {
custom->stickers.removeAt(index);
}
} }
if (custom->stickers.isEmpty()) { if (custom->stickers.isEmpty()) {
sets.erase(custom); sets.erase(custom);

View file

@ -1386,13 +1386,10 @@ void StickerPanInner::refreshStickers() {
refreshRecent(false); refreshRecent(false);
StickerSets::const_iterator it; appendSet(CustomStickerSetId);
appendSet(DefaultStickerSetId);
it = sets.constFind(CustomStickerSetId); if (it != sets.cend()) appendSet(it); for (StickerSetsOrder::const_iterator i = cStickerSetsOrder().cbegin(), e = cStickerSetsOrder().cend(); i != e; ++i) {
it = sets.constFind(DefaultStickerSetId); if (it != sets.cend()) appendSet(it); appendSet(*i);
for (it = sets.cbegin(); it != sets.cend(); ++it) {
if (it->id != CustomStickerSetId && it->id != DefaultStickerSetId) appendSet(it);
} }
int32 h = countHeight(); int32 h = countHeight();
@ -1431,8 +1428,10 @@ void StickerPanInner::preloadImages() {
} }
} }
void StickerPanInner::appendSet(StickerSets::const_iterator it) { void StickerPanInner::appendSet(uint64 setId) {
if (it->stickers.isEmpty()) return; const StickerSets &sets(cStickerSets());
StickerSets::const_iterator it = sets.constFind(setId);
if (it == sets.cend() || it->stickers.isEmpty()) return;
StickerPack pack; StickerPack pack;
pack.reserve(it->stickers.size()); pack.reserve(it->stickers.size());
@ -2046,6 +2045,7 @@ void EmojiPan::onRemoveSetSure() {
} }
} }
cRefStickerSets().erase(it); cRefStickerSets().erase(it);
cRefStickerSetsOrder().removeOne(_removingSetId);
cSetStickersHash(QByteArray()); cSetStickersHash(QByteArray());
refreshStickers(); refreshStickers();
Local::writeStickers(); Local::writeStickers();

View file

@ -313,7 +313,7 @@ signals:
private: private:
void appendSet(StickerSets::const_iterator it); void appendSet(uint64 setId);
int32 countHeight(); int32 countHeight();
void selectEmoji(EmojiPtr emoji); void selectEmoji(EmojiPtr emoji);

View file

@ -1829,6 +1829,9 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) {
QByteArray wasHash = cStickersHash(); QByteArray wasHash = cStickersHash();
cSetStickersHash(qba(d.vhash)); cSetStickersHash(qba(d.vhash));
StickerSetsOrder &setsOrder(cRefStickerSetsOrder());
setsOrder.clear();
StickerSets &sets(cRefStickerSets()); StickerSets &sets(cRefStickerSets());
StickerSets::iterator def = sets.find(DefaultStickerSetId); StickerSets::iterator def = sets.find(DefaultStickerSetId);
if (def == sets.cend()) { if (def == sets.cend()) {
@ -1838,6 +1841,7 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) {
if (d_sets.at(i).type() == mtpc_stickerSet) { if (d_sets.at(i).type() == mtpc_stickerSet) {
const MTPDstickerSet &set(d_sets.at(i).c_stickerSet()); const MTPDstickerSet &set(d_sets.at(i).c_stickerSet());
StickerSets::iterator i = sets.find(set.vid.v); StickerSets::iterator i = sets.find(set.vid.v);
setsOrder.push_back(set.vid.v);
if (i == sets.cend()) { if (i == sets.cend()) {
i = sets.insert(set.vid.v, StickerSet(set.vid.v, set.vaccess_hash.v, qs(set.vtitle), qs(set.vshort_name))); i = sets.insert(set.vid.v, StickerSet(set.vid.v, set.vaccess_hash.v, qs(set.vtitle), qs(set.vshort_name)));
} else { } else {
@ -1931,6 +1935,7 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) {
++i; ++i;
} }
} }
setsOrder.removeOne(it->id);
it = sets.erase(it); it = sets.erase(it);
removed = true; removed = true;
} else { } else {
@ -1952,6 +1957,7 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) {
} }
} }
if (it->stickers.isEmpty()) { if (it->stickers.isEmpty()) {
setsOrder.removeOne(it->id);
it = sets.erase(it); it = sets.erase(it);
} else { } else {
++it; ++it;

View file

@ -2207,6 +2207,31 @@ namespace Local {
return _storageAudiosSize; return _storageAudiosSize;
} }
void _writeStickerSet(QDataStream &stream, uint64 setId) {
StickerSets::const_iterator it = cStickerSets().constFind(setId);
if (it == cStickerSets().cend() || it->stickers.isEmpty()) return;
stream << quint64(it->id) << quint64(it->access) << it->title << it->shortName << quint32(it->stickers.size());
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;
switch (doc->sticker->set.type()) {
case mtpc_inputStickerSetID: {
stream << qint32(StickerSetTypeID);
} break;
case mtpc_inputStickerSetShortName: {
stream << qint32(StickerSetTypeShortName);
} break;
case mtpc_inputStickerSetEmpty:
default: {
stream << qint32(StickerSetTypeEmpty);
} break;
}
const StorageImageLocation &loc(doc->sticker->loc);
stream << qint32(loc.width) << qint32(loc.height) << qint32(loc.dc) << quint64(loc.volume) << qint32(loc.local) << quint64(loc.secret);
}
}
void writeStickers() { void writeStickers() {
if (!_working()) return; if (!_working()) return;
@ -2241,29 +2266,11 @@ namespace Local {
} }
} }
EncryptedDescriptor data(size); EncryptedDescriptor data(size);
data.stream << quint32(sets.size()) << cStickersHash(); data.stream << quint32(cStickerSetsOrder().size()) << cStickersHash();
for (StickerSets::const_iterator i = sets.cbegin(); i != sets.cend(); ++i) { _writeStickerSet(data.stream, DefaultStickerSetId);
if (i->stickers.isEmpty()) continue; _writeStickerSet(data.stream, CustomStickerSetId);
for (StickerSetsOrder::const_iterator i = cStickerSetsOrder().cbegin(), e = cStickerSetsOrder().cend(); i != e; ++i) {
data.stream << quint64(i->id) << quint64(i->access) << i->title << i->shortName << quint32(i->stickers.size()); _writeStickerSet(data.stream, *i);
for (StickerPack::const_iterator j = i->stickers.cbegin(), e = i->stickers.cend(); j != e; ++j) {
DocumentData *doc = *j;
data.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;
switch (doc->sticker->set.type()) {
case mtpc_inputStickerSetID: {
data.stream << qint32(StickerSetTypeID);
} break;
case mtpc_inputStickerSetShortName: {
data.stream << qint32(StickerSetTypeShortName);
} break;
case mtpc_inputStickerSetEmpty:
default: {
data.stream << qint32(StickerSetTypeEmpty);
} break;
}
const StorageImageLocation &loc(doc->sticker->loc);
data.stream << qint32(loc.width) << qint32(loc.height) << qint32(loc.dc) << quint64(loc.volume) << qint32(loc.local) << quint64(loc.secret);
}
} }
FileWriteDescriptor file(_stickersKey); FileWriteDescriptor file(_stickersKey);
file.writeEncrypted(data); file.writeEncrypted(data);
@ -2283,6 +2290,8 @@ namespace Local {
StickerSets &sets(cRefStickerSets()); StickerSets &sets(cRefStickerSets());
sets.clear(); sets.clear();
cSetStickerSetsOrder(StickerSetsOrder());
RecentStickerPack &recent(cRefRecentStickers()); RecentStickerPack &recent(cRefRecentStickers());
recent.clear(); recent.clear();
@ -2352,6 +2361,9 @@ namespace Local {
StickerSets &sets(cRefStickerSets()); StickerSets &sets(cRefStickerSets());
sets.clear(); sets.clear();
StickerSetsOrder &order(cRefStickerSetsOrder());
order.clear();
quint32 cnt; quint32 cnt;
QByteArray hash; QByteArray hash;
stickers.stream >> cnt >> hash; stickers.stream >> cnt >> hash;
@ -2365,6 +2377,8 @@ namespace Local {
setTitle = lang(lng_stickers_default_set); setTitle = lang(lng_stickers_default_set);
} else if (setId == CustomStickerSetId) { } else if (setId == CustomStickerSetId) {
setTitle = lang(lng_custom_stickers); setTitle = lang(lng_custom_stickers);
} else {
order.push_back(setId);
} }
StickerSet &set(sets.insert(setId, StickerSet(setId, setAccess, setTitle, setShortName)).value()); StickerSet &set(sets.insert(setId, StickerSet(setId, setAccess, setTitle, setShortName)).value());
set.stickers.reserve(scnt); set.stickers.reserve(scnt);

View file

@ -96,6 +96,7 @@ EmojiStickersMap gEmojiStickers;
RecentStickerPreload gRecentStickersPreload; RecentStickerPreload gRecentStickersPreload;
RecentStickerPack gRecentStickers; RecentStickerPack gRecentStickers;
StickerSets gStickerSets; StickerSets gStickerSets;
StickerSetsOrder gStickerSetsOrder;
uint64 gLastStickersUpdate = 0; uint64 gLastStickersUpdate = 0;

View file

@ -208,6 +208,8 @@ struct StickerSet {
}; };
typedef QMap<uint64, StickerSet> StickerSets; typedef QMap<uint64, StickerSet> StickerSets;
DeclareRefSetting(StickerSets, StickerSets); DeclareRefSetting(StickerSets, StickerSets);
typedef QList<uint64> StickerSetsOrder;
DeclareRefSetting(StickerSetsOrder, StickerSetsOrder);
typedef QList<QPair<QString, ushort> > RecentHashtagPack; typedef QList<QPair<QString, ushort> > RecentHashtagPack;
DeclareSetting(RecentHashtagPack, RecentWriteHashtags); DeclareSetting(RecentHashtagPack, RecentWriteHashtags);