mirror of
https://github.com/kotatogram/kotatogram-desktop
synced 2025-09-03 08:05:12 +00:00
merged overview, merged search and searchGlobal done (supergroups)
This commit is contained in:
@@ -136,16 +136,16 @@ int32 OverviewInner::CachedLink::countHeight(int32 w) {
|
||||
|
||||
// flick scroll taken from http://qt-project.org/doc/qt-4.8/demos-embedded-anomaly-src-flickcharm-cpp.html
|
||||
|
||||
OverviewInner::OverviewInner(OverviewWidget *overview, ScrollArea *scroll, const PeerData *peer, MediaOverviewType type) : QWidget(0)
|
||||
OverviewInner::OverviewInner(OverviewWidget *overview, ScrollArea *scroll, PeerData *peer, MediaOverviewType type) : QWidget(0)
|
||||
, _overview(overview)
|
||||
, _scroll(scroll)
|
||||
, _resizeIndex(-1)
|
||||
, _resizeSkip(0)
|
||||
, _peer(App::peer(peer->id))
|
||||
, _peer(peer->migrateTo() ? peer->migrateTo() : peer)
|
||||
, _type(type)
|
||||
, _migrated(0)
|
||||
, _history(App::history(peer->id))
|
||||
, _channel(peerToChannel(peer->id))
|
||||
, _migrated(_peer->migrateFrom() ? App::history(_peer->migrateFrom()->id) : 0)
|
||||
, _history(App::history(_peer->id))
|
||||
, _channel(peerToChannel(_peer->id))
|
||||
, _photosInRow(1)
|
||||
, _photosToAdd(0)
|
||||
, _selMode(false)
|
||||
@@ -159,8 +159,10 @@ OverviewInner::OverviewInner(OverviewWidget *overview, ScrollArea *scroll, const
|
||||
, _itemsToBeLoaded(LinksOverviewPerPage * 2)
|
||||
, _inSearch(false)
|
||||
, _searchFull(false)
|
||||
, _searchFullMigrated(false)
|
||||
, _searchRequest(0)
|
||||
, _lastSearchId(0)
|
||||
, _lastSearchMigratedId(0)
|
||||
, _searchedCount(0)
|
||||
, _width(st::wndMinWidth)
|
||||
, _height(0)
|
||||
@@ -169,7 +171,8 @@ OverviewInner::OverviewInner(OverviewWidget *overview, ScrollArea *scroll, const
|
||||
, _cursor(style::cur_default)
|
||||
, _cursorState(HistoryDefaultCursorState)
|
||||
, _dragAction(NoDrag)
|
||||
, _dragItem(0), _selectedMsgId(0)
|
||||
, _dragItem(0)
|
||||
, _selectedMsgId(0)
|
||||
, _dragItemIndex(-1)
|
||||
, _mousedItem(0)
|
||||
, _mousedItemIndex(-1)
|
||||
@@ -272,16 +275,35 @@ void OverviewInner::touchUpdateSpeed() {
|
||||
_touchPrevPos = _touchPos;
|
||||
}
|
||||
|
||||
bool OverviewInner::itemMigrated(MsgId msgId) const {
|
||||
return _migrated && (msgId < 0) && (-msgId < ServerMaxMsgId);
|
||||
}
|
||||
|
||||
ChannelId OverviewInner::itemChannel(MsgId msgId) const {
|
||||
return itemMigrated(msgId) ? _migrated->channelId() : _channel;
|
||||
}
|
||||
|
||||
MsgId OverviewInner::itemMsgId(MsgId msgId) const {
|
||||
return itemMigrated(msgId) ? -msgId : msgId;
|
||||
}
|
||||
|
||||
int32 OverviewInner::migratedIndexSkip() const {
|
||||
return (_migrated && _history->overviewLoaded(_type)) ? _migrated->overview[_type].size() : 0;
|
||||
}
|
||||
|
||||
void OverviewInner::fixItemIndex(int32 ¤t, MsgId msgId) const {
|
||||
if (!msgId) {
|
||||
current = -1;
|
||||
} else if (_type == OverviewPhotos || _type == OverviewAudioDocuments) {
|
||||
int32 l = _history->overview[_type].size();
|
||||
if (current < 0 || current >= l || _history->overview[_type][current] != msgId) {
|
||||
History *history = itemMigrated(msgId) ? _migrated : _history;
|
||||
int32 l = history->overview[_type].size(), indexskip = migratedIndexSkip();
|
||||
int32 index = (current >= 0 && history == _history) ? (current - indexskip) : current;
|
||||
MsgId findMsgId = (history == _history ? 1 : -1) * msgId;
|
||||
if (current < 0 || current >= l || history->overview[_type][current] != findMsgId) {
|
||||
current = -1;
|
||||
for (int32 i = 0; i < l; ++i) {
|
||||
if (_history->overview[_type][i] == msgId) {
|
||||
current = i;
|
||||
if (history->overview[_type][i] == findMsgId) {
|
||||
current = i + (history == _history ? indexskip : 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -300,12 +322,14 @@ void OverviewInner::fixItemIndex(int32 ¤t, MsgId msgId) const {
|
||||
}
|
||||
}
|
||||
|
||||
void OverviewInner::searchReceived(bool fromStart, const MTPmessages_Messages &result, mtpRequestId req) {
|
||||
if (fromStart && !_search.text().isEmpty()) {
|
||||
SearchQueries::iterator i = _searchQueries.find(req);
|
||||
if (i != _searchQueries.cend()) {
|
||||
_searchCache[i.value()] = result;
|
||||
_searchQueries.erase(i);
|
||||
void OverviewInner::searchReceived(SearchRequestType type, const MTPmessages_Messages &result, mtpRequestId req) {
|
||||
if (!_search.text().isEmpty()) {
|
||||
if (_type == SearchFromStart) {
|
||||
SearchQueries::iterator i = _searchQueries.find(req);
|
||||
if (i != _searchQueries.cend()) {
|
||||
_searchCache[i.value()] = result;
|
||||
_searchQueries.erase(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,20 +370,36 @@ void OverviewInner::searchReceived(bool fromStart, const MTPmessages_Messages &r
|
||||
} break;
|
||||
}
|
||||
if (messages) {
|
||||
bool migratedSearch = (type == SearchMigratedFromStart || type == SearchMigratedFromOffset);
|
||||
if (messages->isEmpty()) {
|
||||
_searchFull = true;
|
||||
if (migratedSearch) {
|
||||
_searchFullMigrated = true;
|
||||
} else {
|
||||
_searchFull = true;
|
||||
}
|
||||
}
|
||||
if (fromStart) {
|
||||
if (type == SearchFromStart) {
|
||||
_searchResults.clear();
|
||||
_lastSearchId = 0;
|
||||
_lastSearchId = _lastSearchMigratedId = 0;
|
||||
_itemsToBeLoaded = LinksOverviewPerPage * 2;
|
||||
}
|
||||
if (type == SearchMigratedFromStart) {
|
||||
_lastSearchMigratedId = 0;
|
||||
}
|
||||
for (QVector<MTPMessage>::const_iterator i = messages->cbegin(), e = messages->cend(); i != e; ++i) {
|
||||
HistoryItem *item = App::histories().addNewMessage(*i, NewMessageExisting);
|
||||
_searchResults.push_front(item->id);
|
||||
_lastSearchId = item->id;
|
||||
if (migratedSearch) {
|
||||
_searchResults.push_front(-item->id);
|
||||
_lastSearchMigratedId = item->id;
|
||||
} else {
|
||||
_searchResults.push_front(item->id);
|
||||
_lastSearchId = item->id;
|
||||
}
|
||||
}
|
||||
mediaOverviewUpdated();
|
||||
if (messages->isEmpty()) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
_searchRequest = 0;
|
||||
@@ -367,19 +407,24 @@ void OverviewInner::searchReceived(bool fromStart, const MTPmessages_Messages &r
|
||||
}
|
||||
}
|
||||
|
||||
bool OverviewInner::searchFailed(const RPCError &error, mtpRequestId req) {
|
||||
bool OverviewInner::searchFailed(SearchRequestType type, const RPCError &error, mtpRequestId req) {
|
||||
if (mtpIsFlood(error)) return false;
|
||||
|
||||
if (_searchRequest == req) {
|
||||
_searchRequest = 0;
|
||||
_searchFull = true;
|
||||
if (type == SearchFromStart || type == SearchFromOffset) {
|
||||
_searchFull = true;
|
||||
} else if (type == SearchMigratedFromStart || type == SearchMigratedFromOffset) {
|
||||
_searchFullMigrated = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
OverviewInner::CachedLink *OverviewInner::cachedLink(HistoryItem *item) {
|
||||
CachedLinks::const_iterator i = _links.constFind(item->id);
|
||||
if (i == _links.cend()) i = _links.insert(item->id, new CachedLink(item));
|
||||
MsgId msgId = (item->history() == _migrated) ? -item->id : item->id;
|
||||
CachedLinks::const_iterator i = _links.constFind(msgId);
|
||||
if (i == _links.cend()) i = _links.insert(msgId, new CachedLink(item));
|
||||
return i.value();
|
||||
}
|
||||
|
||||
@@ -423,7 +468,7 @@ bool OverviewInner::itemHasPoint(MsgId msgId, int32 index, int32 x, int32 y) con
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
HistoryItem *item = App::histItemById(_channel, msgId);
|
||||
HistoryItem *item = App::histItemById(itemChannel(msgId), itemMsgId(msgId));
|
||||
HistoryMedia *media = item ? item->getMedia(true) : 0;
|
||||
if (media) {
|
||||
int32 w = _width - st::msgMargin.left() - st::msgMargin.right();
|
||||
@@ -462,11 +507,12 @@ void OverviewInner::moveToNextItem(MsgId &msgId, int32 &index, MsgId upTo, int32
|
||||
|
||||
index += delta;
|
||||
if (_type == OverviewPhotos || _type == OverviewAudioDocuments) {
|
||||
if (index < 0 || index >= _history->overview[_type].size()) {
|
||||
int32 indexskip = migratedIndexSkip();
|
||||
if (index < 0 || index >= indexskip + _history->overview[_type].size()) {
|
||||
msgId = 0;
|
||||
index = -1;
|
||||
} else {
|
||||
msgId = _history->overview[_type][index];
|
||||
msgId = (index >= indexskip) ? _history->overview[_type][index - indexskip] : (-_migrated->overview[_type][index]);
|
||||
}
|
||||
} else {
|
||||
while (index >= 0 && index < _items.size() && !_items[index].msgid) {
|
||||
@@ -739,7 +785,7 @@ void OverviewInner::dragActionFinish(const QPoint &screenPos, Qt::MouseButton bu
|
||||
}
|
||||
if (_dragAction == PrepareSelect && !needClick && !_dragWasInactive && !_selected.isEmpty() && _selected.cbegin().value() == FullItemSel) {
|
||||
SelectedItems::iterator i = _selected.find(_dragItem);
|
||||
if (i == _selected.cend() && _dragItem > 0) {
|
||||
if (i == _selected.cend() && itemMsgId(_dragItem) > 0) {
|
||||
if (_selected.size() < MaxSelectedItems) {
|
||||
if (!_selected.isEmpty() && _selected.cbegin().value() != FullItemSel) {
|
||||
_selected.clear();
|
||||
@@ -755,7 +801,7 @@ void OverviewInner::dragActionFinish(const QPoint &screenPos, Qt::MouseButton bu
|
||||
if (i != _selected.cend() && i.value() == FullItemSel) {
|
||||
_selected.erase(i);
|
||||
updateMsg(_dragItem, _dragItemIndex);
|
||||
} else if (i == _selected.cend() && _dragItem > 0 && !_selected.isEmpty() && _selected.cbegin().value() == FullItemSel) {
|
||||
} else if (i == _selected.cend() && itemMsgId(_dragItem) > 0 && !_selected.isEmpty() && _selected.cbegin().value() == FullItemSel) {
|
||||
if (_selected.size() < MaxSelectedItems) {
|
||||
_selected.insert(_dragItem, FullItemSel);
|
||||
updateMsg(_dragItem, _dragItemIndex);
|
||||
@@ -797,7 +843,7 @@ void OverviewInner::onDragExec() {
|
||||
QList<QUrl> urls;
|
||||
bool forwardSelected = false;
|
||||
if (uponSelected) {
|
||||
forwardSelected = !_selected.isEmpty() && _selected.cbegin().value() == FullItemSel && cWideMode() && !_history->peer->isChannel();
|
||||
forwardSelected = !_selected.isEmpty() && _selected.cbegin().value() == FullItemSel && cWideMode();
|
||||
} else if (textlnkDown()) {
|
||||
sel = textlnkDown()->encoded();
|
||||
if (!sel.isEmpty() && sel.at(0) != '/' && sel.at(0) != '@' && sel.at(0) != '#') {
|
||||
@@ -841,9 +887,7 @@ void OverviewInner::onDragExec() {
|
||||
QDrag *drag = new QDrag(App::wnd());
|
||||
QMimeData *mimeData = new QMimeData;
|
||||
|
||||
if (!_history->peer->isChannel()) {
|
||||
mimeData->setData(qsl("application/x-td-forward-pressed-link"), "1");
|
||||
}
|
||||
mimeData->setData(qsl("application/x-td-forward-pressed-link"), "1");
|
||||
if (lnkDocument) {
|
||||
QString already = static_cast<DocumentOpenLink*>(textlnkDown().data())->document()->already(true);
|
||||
if (!already.isEmpty()) {
|
||||
@@ -867,42 +911,60 @@ void OverviewInner::touchScrollUpdated(const QPoint &screenPos) {
|
||||
touchUpdateSpeed();
|
||||
}
|
||||
|
||||
void OverviewInner::addSelectionRange(int32 selFrom, int32 selTo, History *history) {
|
||||
if (selFrom < 0 || selTo < 0) return;
|
||||
for (int32 i = selFrom; i <= selTo; ++i) {
|
||||
MsgId msgid = 0;
|
||||
if (_type == OverviewPhotos || _type == OverviewAudioDocuments) {
|
||||
msgid = ((history == _history) ? 1 : -1) * history->overview[_type][i];
|
||||
} else {
|
||||
msgid = _items[i].msgid;
|
||||
}
|
||||
if (!msgid) continue;
|
||||
|
||||
SelectedItems::iterator j = _selected.find(msgid);
|
||||
if (_dragSelecting && itemMsgId(msgid) > 0) {
|
||||
if (j == _selected.cend()) {
|
||||
if (_selected.size() >= MaxSelectedItems) break;
|
||||
_selected.insert(msgid, FullItemSel);
|
||||
} else if (j.value() != FullItemSel) {
|
||||
*j = FullItemSel;
|
||||
}
|
||||
} else {
|
||||
if (j != _selected.cend()) {
|
||||
_selected.erase(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OverviewInner::applyDragSelection() {
|
||||
if (_dragSelFromIndex < 0 || _dragSelToIndex < 0) return;
|
||||
|
||||
if (!_selected.isEmpty() && _selected.cbegin().value() != FullItemSel) {
|
||||
_selected.clear();
|
||||
}
|
||||
if (_dragSelecting) {
|
||||
for (int32 i = _dragSelToIndex; i <= _dragSelFromIndex; ++i) {
|
||||
MsgId msgid = (_type == OverviewPhotos || _type == OverviewAudioDocuments) ? _history->overview[_type][i] : _items[i].msgid;
|
||||
if (!msgid) continue;
|
||||
|
||||
SelectedItems::iterator j = _selected.find(msgid);
|
||||
if (msgid > 0) {
|
||||
if (j == _selected.cend()) {
|
||||
if (_selected.size() >= MaxSelectedItems) break;
|
||||
_selected.insert(msgid, FullItemSel);
|
||||
} else if (j.value() != FullItemSel) {
|
||||
*j = FullItemSel;
|
||||
}
|
||||
int32 selfrom = _dragSelToIndex, selto = _dragSelFromIndex;
|
||||
if (_migrated && (_type == OverviewPhotos || _type == OverviewAudioDocuments)) {
|
||||
int32 indexskip = migratedIndexSkip();
|
||||
if (selfrom < indexskip) {
|
||||
if (selto < indexskip) {
|
||||
addSelectionRange(selfrom, selto, _migrated);
|
||||
selto = -1;
|
||||
} else {
|
||||
if (j != _selected.cend()) {
|
||||
_selected.erase(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int32 i = _dragSelToIndex; i <= _dragSelFromIndex; ++i) {
|
||||
MsgId msgid = (_type == OverviewPhotos || _type == OverviewAudioDocuments) ? _history->overview[_type][i] : _items[i].msgid;
|
||||
if (!msgid) continue;
|
||||
|
||||
SelectedItems::iterator j = _selected.find(msgid);
|
||||
if (j != _selected.cend()) {
|
||||
_selected.erase(j);
|
||||
addSelectionRange(selfrom, _migrated->overview[_type].size() - 1, _migrated);
|
||||
selto -= indexskip;
|
||||
}
|
||||
selfrom = 0;
|
||||
} else if (selto < indexskip) { // wtf
|
||||
selfrom = selto = -1;
|
||||
} else {
|
||||
selfrom -= indexskip;
|
||||
selto -= indexskip;
|
||||
}
|
||||
}
|
||||
addSelectionRange(selfrom, selto, _history);
|
||||
|
||||
_dragSelFrom = _dragSelTo = 0;
|
||||
_dragSelFromIndex = _dragSelToIndex = -1;
|
||||
_overview->updateTopBarSelection();
|
||||
@@ -940,9 +1002,14 @@ void OverviewInner::clear() {
|
||||
}
|
||||
|
||||
int32 OverviewInner::itemTop(const FullMsgId &msgId) const {
|
||||
if (_type == OverviewAudioDocuments && msgId.channel == _channel) {
|
||||
int32 index = _history->overview[_type].indexOf(msgId.msg);
|
||||
if (index >= 0) {
|
||||
if (_type == OverviewAudioDocuments) {
|
||||
if (msgId.channel == _channel) {
|
||||
int32 index = _history->overview[_type].indexOf(msgId.msg);
|
||||
if (index >= 0) {
|
||||
return _addToY + int32((index + migratedIndexSkip()) * _audioHeight);
|
||||
}
|
||||
} else if (_migrated && msgId.channel == _migrated->channelId()) {
|
||||
int32 index = _migrated->overview[_type].indexOf(msgId.msg);
|
||||
return _addToY + int32(index * _audioHeight);
|
||||
}
|
||||
}
|
||||
@@ -951,21 +1018,30 @@ int32 OverviewInner::itemTop(const FullMsgId &msgId) const {
|
||||
|
||||
void OverviewInner::preloadMore() {
|
||||
if (_inSearch) {
|
||||
if (!_searchRequest && !_searchFull) {
|
||||
int32 flags = (_history->peer->isChannel() && !_history->peer->isMegagroup()) ? MTPmessages_Search::flag_important_only : 0;
|
||||
_searchRequest = MTP::send(MTPmessages_Search(MTP_int(flags), _history->peer->input, MTP_string(_searchQuery), MTP_inputMessagesFilterUrl(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(_lastSearchId), MTP_int(SearchPerPage)), rpcDone(&OverviewInner::searchReceived, !_lastSearchId), rpcFail(&OverviewInner::searchFailed));
|
||||
if (!_lastSearchId) {
|
||||
_searchQueries.insert(_searchRequest, _searchQuery);
|
||||
if (!_searchRequest) {
|
||||
if (!_searchFull) {
|
||||
int32 flags = (_history->peer->isChannel() && !_history->peer->isMegagroup()) ? MTPmessages_Search::flag_important_only : 0;
|
||||
_searchRequest = MTP::send(MTPmessages_Search(MTP_int(flags), _history->peer->input, MTP_string(_searchQuery), MTP_inputMessagesFilterUrl(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(_lastSearchId), MTP_int(SearchPerPage)), rpcDone(&OverviewInner::searchReceived, _lastSearchId ? SearchFromOffset : SearchFromStart), rpcFail(&OverviewInner::searchFailed, _lastSearchId ? SearchFromOffset : SearchFromStart));
|
||||
if (!_lastSearchId) {
|
||||
_searchQueries.insert(_searchRequest, _searchQuery);
|
||||
}
|
||||
} else if (_migrated && !_searchFullMigrated) {
|
||||
int32 flags = (_migrated->peer->isChannel() && !_migrated->peer->isMegagroup()) ? MTPmessages_Search::flag_important_only : 0;
|
||||
_searchRequest = MTP::send(MTPmessages_Search(MTP_int(flags), _migrated->peer->input, MTP_string(_searchQuery), MTP_inputMessagesFilterUrl(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(_lastSearchMigratedId), MTP_int(SearchPerPage)), rpcDone(&OverviewInner::searchReceived, _lastSearchMigratedId ? SearchMigratedFromOffset : SearchMigratedFromStart), rpcFail(&OverviewInner::searchFailed, _lastSearchMigratedId ? SearchMigratedFromOffset : SearchMigratedFromStart));
|
||||
}
|
||||
}
|
||||
} else if (App::main()) {
|
||||
App::main()->loadMediaBack(_history->peer, _type, _type != OverviewLinks);
|
||||
if (_migrated && _history->overviewLoaded(_type)) {
|
||||
App::main()->loadMediaBack(_migrated->peer, _type, _type != OverviewLinks);
|
||||
} else {
|
||||
App::main()->loadMediaBack(_history->peer, _type, _type != OverviewLinks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool OverviewInner::preloadLocal() {
|
||||
if (_type != OverviewLinks) return false;
|
||||
if (_itemsToBeLoaded >= _history->overview[_type].size()) return false;
|
||||
if (_itemsToBeLoaded >= migratedIndexSkip() + _history->overview[_type].size()) return false;
|
||||
_itemsToBeLoaded += LinksOverviewPerPage;
|
||||
mediaOverviewUpdated();
|
||||
return true;
|
||||
@@ -1000,11 +1076,11 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
QRect r(e->rect());
|
||||
p.setClipRect(r);
|
||||
|
||||
if (_history->overview[_type].isEmpty()) {
|
||||
if (_history->overview[_type].isEmpty() && (!_migrated || !_history->overviewLoaded(_type) || _migrated->overview[_type].isEmpty())) {
|
||||
QPoint dogPos((_width - st::msgDogImg.pxWidth()) / 2, ((height() - st::msgDogImg.pxHeight()) * 4) / 9);
|
||||
p.drawPixmap(dogPos, *cChatDogImage());
|
||||
return;
|
||||
} else if (_inSearch && _searchResults.isEmpty() && _searchFull && !_searchTimer.isActive()) {
|
||||
} else if (_inSearch && _searchResults.isEmpty() && _searchFull && (!_migrated || _searchFullMigrated) && !_searchTimer.isActive()) {
|
||||
p.setFont(st::noContactsFont->f);
|
||||
p.setPen(st::noContactsColor->p);
|
||||
p.drawText(QRect(_linksLeft, _addToY, _linksWidth, _addToY), lng_search_found_results(lt_count, 0), style::al_center);
|
||||
@@ -1021,8 +1097,9 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
bool hasSel = !_selected.isEmpty();
|
||||
|
||||
if (_type == OverviewPhotos) {
|
||||
History::MediaOverview &overview(_history->overview[_type]);
|
||||
int32 count = overview.size();
|
||||
History::MediaOverview &overview(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migratedCount = migratedIndexSkip();
|
||||
int32 count = migratedCount + overview.size();
|
||||
int32 rowFrom = floorclamp(r.y() - _addToY - st::overviewPhotoSkip, _vsize + st::overviewPhotoSkip, 0, count);
|
||||
int32 rowTo = ceilclamp(r.y() + r.height() - _addToY - st::overviewPhotoSkip, _vsize + st::overviewPhotoSkip, 0, count);
|
||||
float64 w = float64(_width - st::overviewPhotoSkip) / _photosInRow;
|
||||
@@ -1033,7 +1110,10 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
if (index < 0) continue;
|
||||
if (index >= count) break;
|
||||
|
||||
HistoryItem *item = App::histItemById(_channel, overview[index]);
|
||||
bool migratedindex = (index < migratedCount);
|
||||
int32 bareindex = migratedindex ? index : (index - migratedCount);
|
||||
|
||||
HistoryItem *item = App::histItemById(migratedindex ? _migrated->channelId() : _channel, (migratedindex ? *migratedOverview : overview)[bareindex]);
|
||||
HistoryMedia *m = item ? item->getMedia(true) : 0;
|
||||
if (!m) continue;
|
||||
|
||||
@@ -1088,7 +1168,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
if (index >= selfrom && index <= selto) {
|
||||
sel = (_dragSelecting && item->id > 0) ? FullItemSel : 0;
|
||||
} else if (hasSel) {
|
||||
SelectedItems::const_iterator i = _selected.constFind(item->id);
|
||||
SelectedItems::const_iterator i = _selected.constFind(migratedindex ? -item->id : item->id);
|
||||
if (i != selEnd) {
|
||||
sel = i.value();
|
||||
}
|
||||
@@ -1104,15 +1184,19 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
}
|
||||
}
|
||||
} else if (_type == OverviewAudioDocuments) {
|
||||
History::MediaOverview &overview(_history->overview[_type]);
|
||||
int32 count = overview.size();
|
||||
History::MediaOverview &overview(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migratedCount = migratedIndexSkip();
|
||||
int32 count = migratedCount + overview.size();
|
||||
int32 from = floorclamp(r.y() - _addToY, _audioHeight, 0, count);
|
||||
int32 to = ceilclamp(r.y() + r.height() - _addToY, _audioHeight, 0, count);
|
||||
p.translate(_audioLeft, _addToY + from * _audioHeight);
|
||||
for (int32 index = from; index < to; ++index) {
|
||||
if (index >= count) break;
|
||||
|
||||
HistoryItem *item = App::histItemById(_channel, overview[index]);
|
||||
bool migratedindex = (index < migratedCount);
|
||||
int32 bareindex = migratedindex ? index : (index - migratedCount);
|
||||
|
||||
HistoryItem *item = App::histItemById(migratedindex ? _migrated->channelId() : _channel, (migratedindex ? *migratedOverview : overview)[bareindex]);
|
||||
HistoryMedia *m = item ? item->getMedia(true) : 0;
|
||||
if (!m || m->type() != MediaTypeDocument) continue;
|
||||
|
||||
@@ -1120,13 +1204,14 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
if (index >= selfrom && index <= selto) {
|
||||
sel = (_dragSelecting && item->id > 0) ? FullItemSel : 0;
|
||||
} else if (hasSel) {
|
||||
SelectedItems::const_iterator i = _selected.constFind(item->id);
|
||||
SelectedItems::const_iterator i = _selected.constFind(migratedindex ? -item->id : item->id);
|
||||
if (i != selEnd) {
|
||||
sel = i.value();
|
||||
}
|
||||
}
|
||||
|
||||
static_cast<HistoryDocument*>(m)->drawInPlaylist(p, item, (sel == FullItemSel), ((_menu ? (App::contextItem() ? App::contextItem()->id : 0) : _selectedMsgId) == item->id), _audioWidth);
|
||||
bool drawOver = _menu ? (App::contextItem() ? (App::contextItem() == item) : false) : (itemMsgId(_selectedMsgId) == item->id && itemChannel(_selectedMsgId) == item->channelId());
|
||||
static_cast<HistoryDocument*>(m)->drawInPlaylist(p, item, (sel == FullItemSel), drawOver, _audioWidth);
|
||||
p.translate(0, _audioHeight);
|
||||
}
|
||||
} else if (_type == OverviewLinks) {
|
||||
@@ -1171,7 +1256,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
|
||||
uint32 sel = 0;
|
||||
if (i >= selfrom && i <= selto) {
|
||||
sel = (_dragSelecting && _items[i].msgid > 0) ? FullItemSel : 0;
|
||||
sel = (_dragSelecting && itemMsgId(_items[i].msgid) > 0) ? FullItemSel : 0;
|
||||
} else if (hasSel) {
|
||||
SelectedItems::const_iterator j = _selected.constFind(_items[i].msgid);
|
||||
if (j != selEnd) {
|
||||
@@ -1231,7 +1316,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
|
||||
p.translate(0, curY - y);
|
||||
if (_items[i].msgid) { // draw item
|
||||
HistoryItem *item = App::histItemById(_channel, _items[i].msgid);
|
||||
HistoryItem *item = App::histItemById(itemChannel(_items[i].msgid), itemMsgId(_items[i].msgid));
|
||||
HistoryMedia *media = item ? item->getMedia(true) : 0;
|
||||
if (media) {
|
||||
bool out = item->out(), fromChannel = item->fromChannel(), outbg = out && !fromChannel;
|
||||
@@ -1245,9 +1330,9 @@ void OverviewInner::paintEvent(QPaintEvent *e) {
|
||||
if (i >= selfrom && i <= selto) {
|
||||
sel = (_dragSelecting && item->id > 0) ? FullItemSel : 0;
|
||||
} else if (hasSel) {
|
||||
SelectedItems::const_iterator i = _selected.constFind(item->id);
|
||||
if (i != selEnd) {
|
||||
sel = i.value();
|
||||
SelectedItems::const_iterator j = _selected.constFind(_items[i].msgid);
|
||||
if (j != selEnd) {
|
||||
sel = j.value();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1309,7 +1394,9 @@ void OverviewInner::onUpdateSelected() {
|
||||
if (row < 0) row = 0;
|
||||
bool upon = true;
|
||||
|
||||
int32 i = row * _photosInRow + inRow - _photosToAdd, count = _history->overview[_type].size();
|
||||
History::MediaOverview &overview(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migratedCount = migratedIndexSkip();
|
||||
int32 i = row * _photosInRow + inRow - _photosToAdd, count = migratedCount + overview.size();
|
||||
if (i < 0) {
|
||||
i = 0;
|
||||
upon = false;
|
||||
@@ -1319,8 +1406,8 @@ void OverviewInner::onUpdateSelected() {
|
||||
upon = false;
|
||||
}
|
||||
if (i >= 0) {
|
||||
MsgId msgid = _history->overview[_type][i];
|
||||
HistoryItem *histItem = App::histItemById(_channel, msgid);
|
||||
MsgId msgid = (i >= migratedCount) ? overview[i - migratedCount] : (*migratedOverview)[i];
|
||||
HistoryItem *histItem = App::histItemById((i >= migratedCount) ? _channel : _migrated->channelId(), msgid);
|
||||
if (histItem) {
|
||||
item = histItem;
|
||||
index = i;
|
||||
@@ -1335,7 +1422,9 @@ void OverviewInner::onUpdateSelected() {
|
||||
}
|
||||
}
|
||||
} else if (_type == OverviewAudioDocuments) {
|
||||
int32 i = int32((m.y() - _addToY) / _audioHeight), count = _history->overview[_type].size();
|
||||
History::MediaOverview &overview(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migratedCount = migratedIndexSkip();
|
||||
int32 i = int32((m.y() - _addToY) / _audioHeight), count = migratedCount + overview.size();
|
||||
|
||||
bool upon = true;
|
||||
if (m.y() < _addToY) {
|
||||
@@ -1347,8 +1436,8 @@ void OverviewInner::onUpdateSelected() {
|
||||
upon = false;
|
||||
}
|
||||
if (i >= 0) {
|
||||
MsgId msgid = _history->overview[_type][i];
|
||||
HistoryItem *histItem = App::histItemById(_channel, msgid);
|
||||
MsgId msgid = (i >= migratedCount) ? overview[i - migratedCount] : (*migratedOverview)[i];
|
||||
HistoryItem *histItem = App::histItemById((i >= migratedCount) ? _channel : _migrated->channelId(), msgid);
|
||||
if (histItem) {
|
||||
item = histItem;
|
||||
index = i;
|
||||
@@ -1356,13 +1445,13 @@ void OverviewInner::onUpdateSelected() {
|
||||
HistoryMedia *media = item->getMedia(true);
|
||||
if (media && media->type() == MediaTypeDocument) {
|
||||
lnk = static_cast<HistoryDocument*>(media)->linkInPlaylist();
|
||||
newsel = item->id;
|
||||
newsel = (item->history() == _migrated) ? (-item->id) : item->id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (newsel != _selectedMsgId) {
|
||||
if (_selectedMsgId) updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
if (_selectedMsgId) updateMsg(_selectedMsgId, -1);
|
||||
_selectedMsgId = newsel;
|
||||
updateMsg(item);
|
||||
}
|
||||
@@ -1386,7 +1475,7 @@ void OverviewInner::onUpdateSelected() {
|
||||
}
|
||||
}
|
||||
|
||||
HistoryItem *histItem = App::histItemById(_channel, _items[i].msgid);
|
||||
HistoryItem *histItem = App::histItemById(itemChannel(_items[i].msgid), itemMsgId(_items[i].msgid));
|
||||
if (histItem) {
|
||||
item = histItem;
|
||||
index = i;
|
||||
@@ -1435,7 +1524,7 @@ void OverviewInner::onUpdateSelected() {
|
||||
}
|
||||
}
|
||||
|
||||
HistoryItem *histItem = App::histItemById(_channel, _items[i].msgid);
|
||||
HistoryItem *histItem = App::histItemById(itemChannel(_items[i].msgid), itemMsgId(_items[i].msgid));
|
||||
if (histItem) {
|
||||
item = histItem;
|
||||
index = i;
|
||||
@@ -1461,7 +1550,7 @@ void OverviewInner::onUpdateSelected() {
|
||||
|
||||
MsgId oldMousedItem = _mousedItem;
|
||||
int32 oldMousedItemIndex = _mousedItemIndex;
|
||||
_mousedItem = item ? item->id : 0;
|
||||
_mousedItem = item ? ((item->history() == _migrated) ? -item->id : item->id) : 0;
|
||||
_mousedItemIndex = index;
|
||||
m = mapMouseToItem(m, _mousedItem, _mousedItemIndex);
|
||||
|
||||
@@ -1479,7 +1568,7 @@ void OverviewInner::onUpdateSelected() {
|
||||
}
|
||||
if (lnkIndex != _lnkOverIndex || _mousedItem != oldMousedItem) {
|
||||
lnkChanged = true;
|
||||
if (oldMousedItem) updateMsg(App::histItemById(_channel, oldMousedItem));
|
||||
if (oldMousedItem) updateMsg(oldMousedItem, oldMousedItemIndex);
|
||||
_lnkOverIndex = lnkIndex;
|
||||
if (item) updateMsg(item);
|
||||
QToolTip::hideText();
|
||||
@@ -1606,7 +1695,7 @@ void OverviewInner::onUpdateSelected() {
|
||||
bool dragSelecting = false;
|
||||
MsgId dragFirstAffected = dragSelFrom;
|
||||
int32 dragFirstAffectedIndex = dragSelFromIndex;
|
||||
while (dragFirstAffectedIndex >= 0 && dragFirstAffected <= 0) {
|
||||
while (dragFirstAffectedIndex >= 0 && itemMsgId(dragFirstAffected) <= 0) {
|
||||
moveToNextItem(dragFirstAffected, dragFirstAffectedIndex, dragSelTo, ((selectingDown && (_type == OverviewPhotos || _type == OverviewAudioDocuments)) || (!selectingDown && (_type != OverviewPhotos && _type != OverviewAudioDocuments))) ? -1 : 1);
|
||||
}
|
||||
if (dragFirstAffectedIndex >= 0) {
|
||||
@@ -1653,7 +1742,7 @@ void OverviewInner::showLinkTip() {
|
||||
QToolTip::showText(_dragPos, url, this, r);
|
||||
}
|
||||
} else if (_cursorState == HistoryInDateCursorState && _dragAction == NoDrag && _mousedItem) {
|
||||
if (HistoryItem *item = App::histItemById(_channel, _mousedItem)) {
|
||||
if (HistoryItem *item = App::histItemById(itemChannel(_mousedItem), itemMsgId(_mousedItem))) {
|
||||
QToolTip::showText(_dragPos, item->date.toString(QLocale::system().dateTimeFormat(QLocale::LongFormat)), this, r);
|
||||
}
|
||||
}
|
||||
@@ -1704,8 +1793,8 @@ void OverviewInner::enterEvent(QEvent *e) {
|
||||
}
|
||||
|
||||
void OverviewInner::leaveEvent(QEvent *e) {
|
||||
if (_selectedMsgId > 0) {
|
||||
updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
if (_selectedMsgId) {
|
||||
updateMsg(_selectedMsgId, -1);
|
||||
_selectedMsgId = 0;
|
||||
}
|
||||
if (textlnkOver()) {
|
||||
@@ -1738,14 +1827,14 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
|
||||
_menu->deleteLater();
|
||||
_menu = 0;
|
||||
updateMsg(App::contextItem());
|
||||
if (_selectedMsgId > 0) updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
if (_selectedMsgId) updateMsg(_selectedMsgId, -1);
|
||||
}
|
||||
if (e->reason() == QContextMenuEvent::Mouse) {
|
||||
dragActionUpdate(e->globalPos());
|
||||
}
|
||||
|
||||
bool ignoreMousedItem = false;
|
||||
if (_mousedItem > 0) {
|
||||
if (itemMsgId(_mousedItem) > 0) {
|
||||
QPoint m = mapMouseToItem(mapFromGlobal(e->globalPos()), _mousedItem, _mousedItemIndex);
|
||||
if (m.y() < 0 || m.y() >= itemHeight(_mousedItem, _mousedItemIndex)) {
|
||||
ignoreMousedItem = true;
|
||||
@@ -1761,7 +1850,7 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
|
||||
isUponSelected = -1;
|
||||
if (_selected.cbegin().value() == FullItemSel) {
|
||||
hasSelected = 2;
|
||||
if (!ignoreMousedItem && App::mousedItem() && _selected.constFind(App::mousedItem()->id) != _selected.cend()) {
|
||||
if (!ignoreMousedItem && App::mousedItem() && _selected.constFind(App::mousedItem()->history() == _migrated ? -App::mousedItem()->id : App::mousedItem()->id) != _selected.cend()) {
|
||||
isUponSelected = 2;
|
||||
} else {
|
||||
isUponSelected = -2;
|
||||
@@ -1816,8 +1905,8 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
|
||||
}
|
||||
App::contextItem(App::hoveredLinkItem());
|
||||
updateMsg(App::contextItem());
|
||||
if (_selectedMsgId > 0) updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
} else if (!ignoreMousedItem && App::mousedItem() && App::mousedItem()->id == _mousedItem) {
|
||||
if (_selectedMsgId) updateMsg(_selectedMsgId, -1);
|
||||
} else if (!ignoreMousedItem && App::mousedItem() && App::mousedItem()->channelId() == itemChannel(_mousedItem) && App::mousedItem()->id == itemMsgId(_mousedItem)) {
|
||||
_contextMenuUrl = _lnkOverIndex ? urlByIndex(_mousedItem, _mousedItemIndex, _lnkOverIndex) : QString();
|
||||
_menu = new PopupMenu();
|
||||
if ((_contextMenuLnk && dynamic_cast<TextLink*>(_contextMenuLnk.data())) || (!_contextMenuUrl.isEmpty() && !urlIsEmail(_contextMenuUrl))) {
|
||||
@@ -1856,7 +1945,7 @@ void OverviewInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
|
||||
}
|
||||
App::contextItem(App::mousedItem());
|
||||
updateMsg(App::contextItem());
|
||||
if (_selectedMsgId > 0) updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
if (_selectedMsgId) updateMsg(_selectedMsgId, -1);
|
||||
}
|
||||
if (_menu) {
|
||||
connect(_menu, SIGNAL(destroyed(QObject*)), this, SLOT(onMenuDestroy(QObject*)));
|
||||
@@ -1896,6 +1985,10 @@ PeerData *OverviewInner::peer() const {
|
||||
return _peer;
|
||||
}
|
||||
|
||||
PeerData *OverviewInner::migratePeer() const {
|
||||
return _migrated ? _migrated->peer : 0;
|
||||
}
|
||||
|
||||
MediaOverviewType OverviewInner::type() const {
|
||||
return _type;
|
||||
}
|
||||
@@ -1970,12 +2063,13 @@ void OverviewInner::selectMessage() {
|
||||
HistoryItem *item = App::contextItem();
|
||||
if (!item || item->type() != HistoryItemMsg || item->serviceMsg()) return;
|
||||
|
||||
MsgId msgid = item->history() == _migrated ? -item->id : item->id;
|
||||
if (!_selected.isEmpty() && _selected.cbegin().value() != FullItemSel) {
|
||||
_selected.clear();
|
||||
} else if (_selected.size() == MaxSelectedItems && _selected.constFind(item->id) == _selected.cend()) {
|
||||
} else if (_selected.size() == MaxSelectedItems && _selected.constFind(msgid) == _selected.cend()) {
|
||||
return;
|
||||
}
|
||||
_selected.insert(item->id, FullItemSel);
|
||||
_selected.insert(msgid, FullItemSel);
|
||||
_overview->updateTopBarSelection();
|
||||
_overview->update();
|
||||
}
|
||||
@@ -2015,6 +2109,7 @@ void OverviewInner::openContextFile() {
|
||||
}
|
||||
|
||||
bool OverviewInner::onSearchMessages(bool searchCache) {
|
||||
_searchTimer.stop();
|
||||
QString q = _search.text().trimmed();
|
||||
if (q.isEmpty()) {
|
||||
if (_searchRequest) {
|
||||
@@ -2026,16 +2121,16 @@ bool OverviewInner::onSearchMessages(bool searchCache) {
|
||||
SearchCache::const_iterator i = _searchCache.constFind(q);
|
||||
if (i != _searchCache.cend()) {
|
||||
_searchQuery = q;
|
||||
_searchFull = false;
|
||||
_searchFull = _searchFullMigrated = false;
|
||||
_searchRequest = 0;
|
||||
searchReceived(true, i.value(), 0);
|
||||
searchReceived(SearchFromStart, i.value(), 0);
|
||||
return true;
|
||||
}
|
||||
} else if (_searchQuery != q) {
|
||||
_searchQuery = q;
|
||||
_searchFull = false;
|
||||
_searchFull = _searchFullMigrated = false;
|
||||
int32 flags = (_history->peer->isChannel() && !_history->peer->isMegagroup()) ? MTPmessages_Search::flag_important_only : 0;
|
||||
_searchRequest = MTP::send(MTPmessages_Search(MTP_int(flags), _history->peer->input, MTP_string(_searchQuery), MTP_inputMessagesFilterUrl(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(SearchPerPage)), rpcDone(&OverviewInner::searchReceived, true), rpcFail(&OverviewInner::searchFailed));
|
||||
_searchRequest = MTP::send(MTPmessages_Search(MTP_int(flags), _history->peer->input, MTP_string(_searchQuery), MTP_inputMessagesFilterUrl(), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(0), MTP_int(SearchPerPage)), rpcDone(&OverviewInner::searchReceived, SearchFromStart), rpcFail(&OverviewInner::searchFailed, SearchFromStart));
|
||||
_searchQueries.insert(_searchRequest, _searchQuery);
|
||||
}
|
||||
return false;
|
||||
@@ -2044,7 +2139,7 @@ bool OverviewInner::onSearchMessages(bool searchCache) {
|
||||
void OverviewInner::onNeedSearchMessages() {
|
||||
if (!onSearchMessages(true)) {
|
||||
_searchTimer.start(AutoSearchTimeout);
|
||||
if (_inSearch && _searchFull && _searchResults.isEmpty()) {
|
||||
if (_inSearch && _searchFull && (!_migrated || _searchFullMigrated) && _searchResults.isEmpty()) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
@@ -2098,7 +2193,7 @@ void OverviewInner::onMenuDestroy(QObject *obj) {
|
||||
_menu = 0;
|
||||
dragActionUpdate(QCursor::pos());
|
||||
updateMsg(App::contextItem());
|
||||
if (_selectedMsgId > 0) updateMsg(App::histItemById(_channel, _selectedMsgId));
|
||||
if (_selectedMsgId) updateMsg(_selectedMsgId, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2106,7 +2201,7 @@ void OverviewInner::getSelectionState(int32 &selectedForForward, int32 &selected
|
||||
selectedForForward = selectedForDelete = 0;
|
||||
for (SelectedItems::const_iterator i = _selected.cbegin(), e = _selected.cend(); i != e; ++i) {
|
||||
if (i.value() == FullItemSel) {
|
||||
if (HistoryItem *item = App::histItemById(_channel, i.key())) {
|
||||
if (HistoryItem *item = App::histItemById(itemChannel(i.key()), itemMsgId(i.key()))) {
|
||||
if (item->canDelete()) {
|
||||
++selectedForDelete;
|
||||
}
|
||||
@@ -2131,7 +2226,7 @@ void OverviewInner::fillSelectedItems(SelectedItemSet &sel, bool forDelete) {
|
||||
if (_selected.isEmpty() || _selected.cbegin().value() != FullItemSel) return;
|
||||
|
||||
for (SelectedItems::const_iterator i = _selected.cbegin(), e = _selected.cend(); i != e; ++i) {
|
||||
HistoryItem *item = App::histItemById(_channel, i.key());
|
||||
HistoryItem *item = App::histItemById(itemChannel(i.key()), itemMsgId(i.key()));
|
||||
if (item && item->toHistoryMessage() && item->id > 0) {
|
||||
if (item->history() == _migrated) {
|
||||
sel.insert(item->id - ServerMaxMsgId, item);
|
||||
@@ -2171,15 +2266,16 @@ void OverviewInner::onTouchScrollTimer() {
|
||||
void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
int32 oldHeight = _height;
|
||||
if (_type == OverviewLinks) {
|
||||
History::MediaOverview &o(_inSearch ? _searchResults : _history->overview[_type]);
|
||||
int32 l = o.size(), tocheck = qMin(l, _itemsToBeLoaded);
|
||||
History::MediaOverview &o(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migrateCount = migratedIndexSkip();
|
||||
int32 l = _inSearch ? _searchResults.size() : (migrateCount + o.size()), tocheck = qMin(l, _itemsToBeLoaded);
|
||||
_items.reserve(2 * l); // day items
|
||||
|
||||
int32 y = 0, in = 0;
|
||||
bool allGood = true;
|
||||
QDate prevDate;
|
||||
for (int32 i = 0; i < tocheck; ++i) {
|
||||
MsgId msgid = o.at(l - i - 1);
|
||||
MsgId msgid = _inSearch ? _searchResults.at(l - i - 1) : ((l - i - 1 < migrateCount) ? -(*migratedOverview)[l - i - 1] : o.at(l - i - 1 - migrateCount));
|
||||
if (allGood) {
|
||||
if (_items.size() > in && _items.at(in).msgid == msgid) {
|
||||
prevDate = _items.at(in).date;
|
||||
@@ -2210,7 +2306,8 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
}
|
||||
allGood = false;
|
||||
}
|
||||
HistoryItem *item = App::histItemById(_channel, msgid);
|
||||
HistoryItem *item = App::histItemById(itemChannel(msgid), itemMsgId(msgid));
|
||||
if (!item) continue;
|
||||
|
||||
QDate date = item->date.date();
|
||||
if (!in || (in > 0 && date != prevDate)) {
|
||||
@@ -2227,11 +2324,11 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
}
|
||||
|
||||
if (_items.size() > in) {
|
||||
_items[in] = CachedItem(item->id, item->date.date(), y);
|
||||
_items[in] = CachedItem(msgid, item->date.date(), y);
|
||||
_items[in].link = cachedLink(item);
|
||||
y += _items[in].link->countHeight(_linksWidth);
|
||||
} else {
|
||||
_items.push_back(CachedItem(item->id, item->date.date(), y));
|
||||
_items.push_back(CachedItem(msgid, item->date.date(), y));
|
||||
_items.back().link = cachedLink(item);
|
||||
y += _items.back().link->countHeight(_linksWidth);
|
||||
}
|
||||
@@ -2249,8 +2346,9 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
dragActionUpdate(QCursor::pos());
|
||||
update();
|
||||
} else if (_type != OverviewPhotos && _type != OverviewAudioDocuments) {
|
||||
History::MediaOverview &o(_history->overview[_type]);
|
||||
int32 l = o.size();
|
||||
History::MediaOverview &o(_history->overview[_type]), *migratedOverview = _migrated ? &_migrated->overview[_type] : 0;
|
||||
int32 migrateCount = migratedIndexSkip();
|
||||
int32 l = migrateCount + o.size();
|
||||
_items.reserve(2 * l); // day items
|
||||
|
||||
int32 y = 0, in = 0;
|
||||
@@ -2258,7 +2356,7 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
bool allGood = true;
|
||||
QDate prevDate;
|
||||
for (int32 i = 0; i < l; ++i) {
|
||||
MsgId msgid = o.at(l - i - 1);
|
||||
MsgId msgid = (l - i - 1 < migrateCount) ? -(*migratedOverview)[l - i - 1] : o.at(l - i - 1 - migrateCount);
|
||||
if (allGood) {
|
||||
if (_items.size() > in && _items.at(in).msgid == msgid) {
|
||||
prevDate = _items.at(in).date;
|
||||
@@ -2297,7 +2395,7 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
}
|
||||
allGood = false;
|
||||
}
|
||||
HistoryItem *item = App::histItemById(_channel, msgid);
|
||||
HistoryItem *item = App::histItemById(itemChannel(msgid), itemMsgId(msgid));
|
||||
HistoryMedia *media = item ? item->getMedia(true) : 0;
|
||||
if (!media) continue;
|
||||
|
||||
@@ -2363,33 +2461,36 @@ void OverviewInner::mediaOverviewUpdated(bool fromResize) {
|
||||
}
|
||||
|
||||
void OverviewInner::changingMsgId(HistoryItem *row, MsgId newId) {
|
||||
if (_dragSelFrom == row->id) _dragSelFrom = newId;
|
||||
if (_dragSelTo == row->id) _dragSelTo = newId;
|
||||
if (_mousedItem == row->id) _mousedItem = newId;
|
||||
if (_dragItem == row->id) _dragItem = newId;
|
||||
MsgId oldId = (row->history() == _migrated) ? -row->id : row->id;
|
||||
if (row->history() == _migrated) newId = -newId;
|
||||
if (_dragSelFrom == oldId) _dragSelFrom = newId;
|
||||
if (_dragSelTo == oldId) _dragSelTo = newId;
|
||||
if (_mousedItem == oldId) _mousedItem = newId;
|
||||
if (_dragItem == oldId) _dragItem = newId;
|
||||
if (_selectedMsgId == oldId) _selectedMsgId = newId;
|
||||
for (SelectedItems::iterator i = _selected.begin(), e = _selected.end(); i != e; ++i) {
|
||||
if (i.key() == row->id) {
|
||||
if (i.key() == oldId) {
|
||||
uint32 sel = i.value();
|
||||
_selected.erase(i);
|
||||
_selected.insert(newId, sel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (_links.contains(row->id) && row->id != newId) {
|
||||
if (_links.contains(oldId) && oldId != newId) {
|
||||
if (_links.contains(newId)) {
|
||||
for (CachedItems::iterator i = _items.begin(), e = _items.end(); i != e; ++i) {
|
||||
if (i->msgid == newId && i->link) {
|
||||
i->link = _links[row->id];
|
||||
i->link = _links[oldId];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
_links[newId] = _links[row->id];
|
||||
delete _links[row->id];
|
||||
_links.remove(row->id);
|
||||
delete _links[newId];
|
||||
_links[newId] = _links[oldId];
|
||||
_links.remove(oldId);
|
||||
}
|
||||
for (CachedItems::iterator i = _items.begin(), e = _items.end(); i != e; ++i) {
|
||||
if (i->msgid == row->id) {
|
||||
if (i->msgid == oldId) {
|
||||
i->msgid = newId;
|
||||
break;
|
||||
}
|
||||
@@ -2397,11 +2498,15 @@ void OverviewInner::changingMsgId(HistoryItem *row, MsgId newId) {
|
||||
}
|
||||
|
||||
void OverviewInner::itemRemoved(HistoryItem *item) {
|
||||
if (_dragItem == item->id) {
|
||||
MsgId msgId = (item->history() == _migrated) ? -item->id : item->id;
|
||||
if (_dragItem == msgId) {
|
||||
dragActionCancel();
|
||||
}
|
||||
if (_selectedMsgId == msgId) {
|
||||
_selectedMsgId = 0;
|
||||
}
|
||||
|
||||
SelectedItems::iterator i = _selected.find(item->id);
|
||||
SelectedItems::iterator i = _selected.find(msgId);
|
||||
if (i != _selected.cend()) {
|
||||
_selected.erase(i);
|
||||
_overview->updateTopBarSelection();
|
||||
@@ -2409,11 +2514,11 @@ void OverviewInner::itemRemoved(HistoryItem *item) {
|
||||
|
||||
onUpdateSelected();
|
||||
|
||||
if (_dragSelFrom == item->id) {
|
||||
if (_dragSelFrom == msgId) {
|
||||
_dragSelFrom = 0;
|
||||
_dragSelFromIndex = -1;
|
||||
}
|
||||
if (_dragSelTo == item->id) {
|
||||
if (_dragSelTo == msgId) {
|
||||
_dragSelTo = 0;
|
||||
_dragSelToIndex = -1;
|
||||
}
|
||||
@@ -2427,8 +2532,9 @@ void OverviewInner::itemResized(HistoryItem *item, bool scrollToIt) {
|
||||
HistoryMedia *media = item ? item->getMedia(true) : 0;
|
||||
if (!media) return;
|
||||
|
||||
MsgId msgId = (item->history() == _migrated) ? -item->id : item->id;
|
||||
for (int32 i = 0, l = _items.size(); i < l; ++i) {
|
||||
if (_items[i].msgid == item->id) {
|
||||
if (_items[i].msgid == msgId) {
|
||||
int32 from = 0;
|
||||
if (i > 0) from = _items[i - 1].y;
|
||||
|
||||
@@ -2460,23 +2566,30 @@ void OverviewInner::itemResized(HistoryItem *item, bool scrollToIt) {
|
||||
}
|
||||
|
||||
void OverviewInner::msgUpdated(const HistoryItem *msg) {
|
||||
if (!msg || _history != msg->history()) return;
|
||||
if (!msg) return;
|
||||
History *history = (msg->history() == _history) ? _history : (msg->history() == _migrated ? _migrated : 0);
|
||||
if (!history) return;
|
||||
|
||||
int32 migrateindex = migratedIndexSkip();
|
||||
MsgId msgid = msg->id;
|
||||
if (_history->overviewIds[_type].constFind(msgid) != _history->overviewIds[_type].cend()) {
|
||||
if (history->overviewHasMsgId(_type, msgid) && (history == _history || migrateindex > 0)) {
|
||||
if (_type == OverviewPhotos) {
|
||||
int32 index = _history->overview[_type].indexOf(msgid);
|
||||
int32 index = history->overview[_type].indexOf(msgid);
|
||||
if (index >= 0) {
|
||||
if (history == _history) index += migrateindex;
|
||||
float64 w = (float64(width() - st::overviewPhotoSkip) / _photosInRow);
|
||||
int32 vsize = (_vsize + st::overviewPhotoSkip);
|
||||
int32 row = (_photosToAdd + index) / _photosInRow, col = (_photosToAdd + index) % _photosInRow;
|
||||
update(int32(col * w), _addToY + int32(row * vsize), qCeil(w), vsize);
|
||||
}
|
||||
} else if (_type == OverviewAudioDocuments) {
|
||||
int32 index = _history->overview[_type].indexOf(msgid);
|
||||
int32 index = history->overview[_type].indexOf(msgid);
|
||||
if (index >= 0) {
|
||||
if (history == _history) index += migrateindex;
|
||||
update(_audioLeft, _addToY + int32(index * _audioHeight), _audioWidth, _audioHeight);
|
||||
}
|
||||
} else if (_type == OverviewLinks) {
|
||||
if (history == _migrated) msgid = -msgid;
|
||||
for (int32 i = 0, l = _items.size(); i != l; ++i) {
|
||||
if (_items[i].msgid == msgid) {
|
||||
update(_linksLeft, _addToY + _items[i].y, _linksWidth, itemHeight(msgid, i));
|
||||
@@ -2484,6 +2597,7 @@ void OverviewInner::msgUpdated(const HistoryItem *msg) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (history == _migrated) msgid = -msgid;
|
||||
for (int32 i = 0, l = _items.size(); i != l; ++i) {
|
||||
if (_items[i].msgid == msgid) {
|
||||
update(0, _addToY + _height - _items[i].y, _width, itemHeight(msgid, i));
|
||||
@@ -2499,8 +2613,10 @@ void OverviewInner::showAll(bool recountHeights) {
|
||||
if (_type == OverviewPhotos) {
|
||||
_photosInRow = int32(width() - st::overviewPhotoSkip) / int32(st::overviewPhotoMinSize + st::overviewPhotoSkip);
|
||||
_vsize = (int32(width() - st::overviewPhotoSkip) / _photosInRow) - st::overviewPhotoSkip;
|
||||
int32 count = _history->overview[_type].size(), fullCount = _history->overviewCount[_type];
|
||||
if (fullCount > 0) {
|
||||
int32 migratedCount = migratedIndexSkip(), count = migratedCount + _history->overview[_type].size();
|
||||
int32 migratedFullCount = _migrated ? _migrated->overviewCount(_type) : 0;
|
||||
int32 fullCount = migratedFullCount + _history->overviewCount(_type);
|
||||
if (fullCount > 0 && migratedFullCount >= 0) {
|
||||
int32 cnt = count - (fullCount % _photosInRow);
|
||||
if (cnt < 0) cnt += _photosInRow;
|
||||
_photosToAdd = (_photosInRow - (cnt % _photosInRow)) % _photosInRow;
|
||||
@@ -2511,7 +2627,7 @@ void OverviewInner::showAll(bool recountHeights) {
|
||||
newHeight = _height = (_vsize + st::overviewPhotoSkip) * rows + st::overviewPhotoSkip;
|
||||
_addToY = (_height < _minHeight) ? (_minHeight - _height) : 0;
|
||||
} else if (_type == OverviewAudioDocuments) {
|
||||
int32 count = _history->overview[_type].size(), fullCount = _history->overviewCount[_type];
|
||||
int32 migratedCount = migratedIndexSkip(), count = migratedCount + _history->overview[_type].size();
|
||||
newHeight = _height = count * _audioHeight + 2 * st::playlistPadding;
|
||||
_addToY = st::playlistPadding;
|
||||
} else if (_type == OverviewLinks) {
|
||||
@@ -2544,7 +2660,7 @@ OverviewInner::~OverviewInner() {
|
||||
_links.clear();
|
||||
}
|
||||
|
||||
OverviewWidget::OverviewWidget(QWidget *parent, const PeerData *peer, MediaOverviewType type) : TWidget(parent)
|
||||
OverviewWidget::OverviewWidget(QWidget *parent, PeerData *peer, MediaOverviewType type) : TWidget(parent)
|
||||
, _scroll(this, st::historyScroll, false)
|
||||
, _inner(this, &_scroll, peer, type)
|
||||
, _noDropResizeIndex(false)
|
||||
@@ -2709,6 +2825,10 @@ PeerData *OverviewWidget::peer() const {
|
||||
return _inner.peer();
|
||||
}
|
||||
|
||||
PeerData *OverviewWidget::migratePeer() const {
|
||||
return _inner.migratePeer();
|
||||
}
|
||||
|
||||
MediaOverviewType OverviewWidget::type() const {
|
||||
return _inner.type();
|
||||
}
|
||||
@@ -2861,7 +2981,7 @@ void OverviewWidget::doneShow() {
|
||||
}
|
||||
|
||||
void OverviewWidget::mediaOverviewUpdated(PeerData *p, MediaOverviewType t) {
|
||||
if (peer() == p && t == type()) {
|
||||
if ((peer() == p || migratePeer() == p) && t == type()) {
|
||||
_inner.mediaOverviewUpdated();
|
||||
onScroll();
|
||||
updateTopBarSelection();
|
||||
@@ -2869,13 +2989,13 @@ void OverviewWidget::mediaOverviewUpdated(PeerData *p, MediaOverviewType t) {
|
||||
}
|
||||
|
||||
void OverviewWidget::changingMsgId(HistoryItem *row, MsgId newId) {
|
||||
if (peer() == row->history()->peer) {
|
||||
if (peer() == row->history()->peer || migratePeer() == row->history()->peer) {
|
||||
_inner.changingMsgId(row, newId);
|
||||
}
|
||||
}
|
||||
|
||||
void OverviewWidget::msgUpdated(const HistoryItem *msg) {
|
||||
if (peer() == msg->history()->peer) {
|
||||
if (peer() == msg->history()->peer || migratePeer() == msg->history()->peer) {
|
||||
_inner.msgUpdated(msg);
|
||||
}
|
||||
}
|
||||
@@ -2885,7 +3005,7 @@ void OverviewWidget::itemRemoved(HistoryItem *row) {
|
||||
}
|
||||
|
||||
void OverviewWidget::itemResized(HistoryItem *row, bool scrollToIt) {
|
||||
if (!row || row->history()->peer == peer()) {
|
||||
if (!row || row->history()->peer == peer() || row->history()->peer == migratePeer()) {
|
||||
_inner.itemResized(row, scrollToIt);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user