multi select in media overview done properly
This commit is contained in:
		
							parent
							
								
									dfb4d01015
								
							
						
					
					
						commit
						db7fa9ba2f
					
				
					 10 changed files with 127 additions and 59 deletions
				
			
		|  | @ -242,18 +242,7 @@ void AddParticipantInner::chooseParticipant() { | ||||||
| 		changeCheckState(row); | 		changeCheckState(row); | ||||||
| 
 | 
 | ||||||
| 		PeerData *peer = row->history->peer; | 		PeerData *peer = row->history->peer; | ||||||
| 		updateFilter(); | 		emit selectAllQuery(); | ||||||
| 
 |  | ||||||
| 		for (_sel = _contacts->list.begin; _sel != _contacts->list.end; _sel = _sel->next) { |  | ||||||
| 			if (_sel->history->peer == peer) { |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if (_sel == _contacts->list.end) { |  | ||||||
| 			_sel = 0; |  | ||||||
| 		} else { |  | ||||||
| 			emit mustScrollTo(_sel->pos * rh, (_sel->pos + 1) * rh); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	parentWidget()->update(); | 	parentWidget()->update(); | ||||||
| } | } | ||||||
|  | @ -530,6 +519,7 @@ AddParticipantBox::AddParticipantBox(ChatData *chat) : | ||||||
| 	connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); | 	connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); | ||||||
| 	connect(&_filter, SIGNAL(cancelled()), this, SIGNAL(onClose())); | 	connect(&_filter, SIGNAL(cancelled()), this, SIGNAL(onClose())); | ||||||
| 	connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); | 	connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); | ||||||
|  | 	connect(&_inner, SIGNAL(selectAllQuery()), &_filter, SLOT(selectAll())); | ||||||
| 
 | 
 | ||||||
| 	showAll(); | 	showAll(); | ||||||
| 	_cache = myGrab(this, rect()); | 	_cache = myGrab(this, rect()); | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ public: | ||||||
| signals: | signals: | ||||||
| 
 | 
 | ||||||
| 	void mustScrollTo(int ymin, int ymax); | 	void mustScrollTo(int ymin, int ymax); | ||||||
|  | 	void selectAllQuery(); | ||||||
| 
 | 
 | ||||||
| public slots: | public slots: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -233,18 +233,7 @@ void NewGroupInner::chooseParticipant() { | ||||||
| 		changeCheckState(row); | 		changeCheckState(row); | ||||||
| 
 | 
 | ||||||
| 		PeerData *peer = row->history->peer; | 		PeerData *peer = row->history->peer; | ||||||
| 		updateFilter(); | 		emit selectAllQuery(); | ||||||
| 
 |  | ||||||
| 		for (_sel = _contacts->list.begin; _sel != _contacts->list.end; _sel = _sel->next) { |  | ||||||
| 			if (_sel->history->peer == peer) { |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		if (_sel == _contacts->list.end) { |  | ||||||
| 			_sel = 0; |  | ||||||
| 		} else { |  | ||||||
| 			emit mustScrollTo(_sel->pos * rh, (_sel->pos + 1) * rh); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	parentWidget()->update(); | 	parentWidget()->update(); | ||||||
|  | @ -469,6 +458,7 @@ NewGroupBox::NewGroupBox() : _scroll(this, st::newGroupScroll), _inner(), | ||||||
| 	connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); | 	connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate())); | ||||||
| 	connect(&_filter, SIGNAL(cancelled()), this, SIGNAL(onClose())); | 	connect(&_filter, SIGNAL(cancelled()), this, SIGNAL(onClose())); | ||||||
| 	connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); | 	connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int))); | ||||||
|  | 	connect(&_inner, SIGNAL(selectAllQuery()), &_filter, SLOT(selectAll())); | ||||||
| 
 | 
 | ||||||
| 	showAll(); | 	showAll(); | ||||||
| 	_cache = myGrab(this, rect()); | 	_cache = myGrab(this, rect()); | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ public: | ||||||
| signals: | signals: | ||||||
| 
 | 
 | ||||||
| 	void mustScrollTo(int ymin, int ymax); | 	void mustScrollTo(int ymin, int ymax); | ||||||
|  | 	void selectAllQuery(); | ||||||
| 
 | 
 | ||||||
| public slots: | public slots: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -467,7 +467,7 @@ void HistoryList::itemRemoved(HistoryItem *item) { | ||||||
| 	SelectedItems::iterator i = _selected.find(item); | 	SelectedItems::iterator i = _selected.find(item); | ||||||
| 	if (i != _selected.cend()) { | 	if (i != _selected.cend()) { | ||||||
| 		_selected.erase(i); | 		_selected.erase(i); | ||||||
| 		update(); | 		historyWidget->updateTopBarSelection(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	onUpdateSelected(); | 	onUpdateSelected(); | ||||||
|  | @ -475,8 +475,6 @@ void HistoryList::itemRemoved(HistoryItem *item) { | ||||||
| 	if (_dragSelFrom == item) _dragSelFrom = 0; | 	if (_dragSelFrom == item) _dragSelFrom = 0; | ||||||
| 	if (_dragSelTo == item) _dragSelTo = 0; | 	if (_dragSelTo == item) _dragSelTo = 0; | ||||||
| 	updateDragSelection(_dragSelFrom, _dragSelTo, _dragSelecting, true); | 	updateDragSelection(_dragSelFrom, _dragSelTo, _dragSelecting, true); | ||||||
| 
 |  | ||||||
| 	parentWidget()->update(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void HistoryList::dragActionFinish(const QPoint &screenPos, Qt::MouseButton button) { | void HistoryList::dragActionFinish(const QPoint &screenPos, Qt::MouseButton button) { | ||||||
|  | @ -1154,8 +1152,8 @@ void HistoryList::applyDragSelection() { | ||||||
| 				HistoryBlock *block = (*hist)[fromblock]; | 				HistoryBlock *block = (*hist)[fromblock]; | ||||||
| 				for (int32 cnt = (fromblock < toblock) ? block->size() : (toitem + 1); fromitem < cnt; ++fromitem) { | 				for (int32 cnt = (fromblock < toblock) ? block->size() : (toitem + 1); fromitem < cnt; ++fromitem) { | ||||||
| 					HistoryItem *item = (*block)[fromitem]; | 					HistoryItem *item = (*block)[fromitem]; | ||||||
| 					if (item->id > 0 && !item->serviceMsg()) { |  | ||||||
| 					SelectedItems::iterator i = _selected.find(item); | 					SelectedItems::iterator i = _selected.find(item); | ||||||
|  | 					if (item->id > 0 && !item->serviceMsg()) { | ||||||
| 						if (i == _selected.cend()) { | 						if (i == _selected.cend()) { | ||||||
| 							if (_selected.size() >= MaxSelectedItems) break; | 							if (_selected.size() >= MaxSelectedItems) break; | ||||||
| 							_selected.insert(item, FullItemSel); | 							_selected.insert(item, FullItemSel); | ||||||
|  | @ -1163,7 +1161,6 @@ void HistoryList::applyDragSelection() { | ||||||
| 							*i = FullItemSel; | 							*i = FullItemSel; | ||||||
| 						} | 						} | ||||||
| 					} else { | 					} else { | ||||||
| 						SelectedItems::iterator i = _selected.find(item); |  | ||||||
| 						if (i != _selected.cend()) { | 						if (i != _selected.cend()) { | ||||||
| 							_selected.erase(i); | 							_selected.erase(i); | ||||||
| 						} | 						} | ||||||
|  |  | ||||||
|  | @ -642,6 +642,10 @@ void MainWidget::mediaOverviewUpdated(PeerData *peer) { | ||||||
| 	if (overview) overview->mediaOverviewUpdated(peer); | 	if (overview) overview->mediaOverviewUpdated(peer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void MainWidget::changingMsgId(HistoryItem *row, MsgId newId) { | ||||||
|  | 	if (overview) overview->changingMsgId(row, newId); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool MainWidget::overviewFailed(PeerData *peer, const RPCError &error, mtpRequestId req) { | bool MainWidget::overviewFailed(PeerData *peer, const RPCError &error, mtpRequestId req) { | ||||||
| 	MediaOverviewType type = OverviewCount; | 	MediaOverviewType type = OverviewCount; | ||||||
| 	for (int32 i = 0; i < OverviewCount; ++i) { | 	for (int32 i = 0; i < OverviewCount; ++i) { | ||||||
|  |  | ||||||
|  | @ -271,6 +271,7 @@ public: | ||||||
| 	void searchMessages(const QString &query); | 	void searchMessages(const QString &query); | ||||||
| 	void preloadOverviews(PeerData *peer); | 	void preloadOverviews(PeerData *peer); | ||||||
| 	void mediaOverviewUpdated(PeerData *peer); | 	void mediaOverviewUpdated(PeerData *peer); | ||||||
|  | 	void changingMsgId(HistoryItem *row, MsgId newId); | ||||||
| 
 | 
 | ||||||
| 	void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false); | 	void loadMediaBack(PeerData *peer, MediaOverviewType type, bool many = false); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -161,26 +161,20 @@ bool OverviewInner::itemHasPoint(MsgId msgId, int32 index, int32 x, int32 y) con | ||||||
| 	if (index < 0) return false; | 	if (index < 0) return false; | ||||||
| 
 | 
 | ||||||
| 	if (_type == OverviewPhotos) { | 	if (_type == OverviewPhotos) { | ||||||
| 		int32 row = (_photosToAdd + index) / _photosInRow, col = (_photosToAdd + index) % _photosInRow, vsize = _vsize + st::overviewPhotoSkip; | 		if (x >= 0 && x < _vsize && y >= 0 && y < _vsize) { | ||||||
| 		if (y >= _addToY + row * vsize + st::overviewPhotoSkip && y < _addToY + (row + 1) * vsize) { |  | ||||||
| 			float64 w = (_width - st::overviewPhotoSkip) / float64(_photosInRow); |  | ||||||
| 			if (x >= int32(col * w + st::overviewPhotoSkip) && x < int32(col * w + vsize)) { |  | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 		} |  | ||||||
| 	} else { | 	} else { | ||||||
| 		HistoryItem *item = App::histItemById(msgId); | 		HistoryItem *item = App::histItemById(msgId); | ||||||
| 		HistoryMedia *media = item ? item->getMedia(true) : 0; | 		HistoryMedia *media = item ? item->getMedia(true) : 0; | ||||||
| 		if (media) { | 		if (media) { | ||||||
| 			int32 w = _width - st::msgMargin.left() - st::msgMargin.right(); | 			int32 w = _width - st::msgMargin.left() - st::msgMargin.right(); | ||||||
| 			y -= _addToY + (_height - _items[index].y); |  | ||||||
| 			bool out = item->out(); | 			bool out = item->out(); | ||||||
| 			int32 mw = media->maxWidth(), left = (out ? st::msgMargin.right() : st::msgMargin.left()) + (out && mw < w ? (w - mw) : 0); | 			int32 mw = media->maxWidth(), left = (out ? st::msgMargin.right() : st::msgMargin.left()) + (out && mw < w ? (w - mw) : 0); | ||||||
| 			if (!out && _hist->peer->chat) { | 			if (!out && _hist->peer->chat) { | ||||||
| 				left += st::msgPhotoSkip; | 				left += st::msgPhotoSkip; | ||||||
| 			} | 			} | ||||||
| 			x -= left; | 			return media->hasPoint(x - left, y - st::msgMargin.top(), w); | ||||||
| 			return media->hasPoint(x, y, w); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return false; | 	return false; | ||||||
|  | @ -485,12 +479,18 @@ void OverviewInner::applyDragSelection() { | ||||||
| 			if (!msgid) continue; | 			if (!msgid) continue; | ||||||
| 
 | 
 | ||||||
| 			SelectedItems::iterator j = _selected.find(msgid); | 			SelectedItems::iterator j = _selected.find(msgid); | ||||||
|  | 			if (msgid > 0) { | ||||||
| 				if (j == _selected.cend()) { | 				if (j == _selected.cend()) { | ||||||
| 					if (_selected.size() >= MaxSelectedItems) break; | 					if (_selected.size() >= MaxSelectedItems) break; | ||||||
| 					_selected.insert(msgid, FullItemSel); | 					_selected.insert(msgid, FullItemSel); | ||||||
| 				} else if (j.value() != FullItemSel) { | 				} else if (j.value() != FullItemSel) { | ||||||
| 					*j = FullItemSel; | 					*j = FullItemSel; | ||||||
| 				} | 				} | ||||||
|  | 			} else { | ||||||
|  | 				if (j != _selected.cend()) { | ||||||
|  | 					_selected.erase(j); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		for (int32 i = _dragSelToIndex; i <= _dragSelFromIndex; ++i) { | 		for (int32 i = _dragSelToIndex; i <= _dragSelFromIndex; ++i) { | ||||||
|  | @ -514,7 +514,7 @@ QPoint OverviewInner::mapMouseToItem(QPoint p, MsgId itemId, int32 itemIndex) { | ||||||
| 	if (_type == OverviewPhotos) { | 	if (_type == OverviewPhotos) { | ||||||
| 		int32 row = (_photosToAdd + itemIndex) / _photosInRow, col = (_photosToAdd + itemIndex) % _photosInRow; | 		int32 row = (_photosToAdd + itemIndex) / _photosInRow, col = (_photosToAdd + itemIndex) % _photosInRow; | ||||||
| 		float64 w = (_width - st::overviewPhotoSkip) / float64(_photosInRow); | 		float64 w = (_width - st::overviewPhotoSkip) / float64(_photosInRow); | ||||||
| 		p.setX(p.x() - col * int32(w) - st::overviewPhotoSkip); | 		p.setX(p.x() - int32(col * w) - st::overviewPhotoSkip); | ||||||
| 		p.setY(p.y() - _addToY - row * (_vsize + st::overviewPhotoSkip) - st::overviewPhotoSkip); | 		p.setY(p.y() - _addToY - row * (_vsize + st::overviewPhotoSkip) - st::overviewPhotoSkip); | ||||||
| 	} else { | 	} else { | ||||||
| 		p.setY(p.y() - _addToY - (_height - _items[itemIndex].y)); | 		p.setY(p.y() - _addToY - (_height - _items[itemIndex].y)); | ||||||
|  | @ -616,7 +616,7 @@ void OverviewInner::paintEvent(QPaintEvent *e) { | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					uint32 sel = 0; | 					uint32 sel = 0; | ||||||
| 					if (count - index - 1 >= selfrom && count - index - 1 <= selto) { | 					if (index >= selfrom && index <= selto) { | ||||||
| 						sel = (_dragSelecting && item->id > 0) ? FullItemSel : 0; | 						sel = (_dragSelecting && item->id > 0) ? FullItemSel : 0; | ||||||
| 					} else if (hasSel) { | 					} else if (hasSel) { | ||||||
| 						SelectedItems::const_iterator i = _selected.constFind(item->id); | 						SelectedItems::const_iterator i = _selected.constFind(item->id); | ||||||
|  | @ -713,8 +713,8 @@ void OverviewInner::onUpdateSelected() { | ||||||
| 	int32 index = -1; | 	int32 index = -1; | ||||||
| 	if (_type == OverviewPhotos) { | 	if (_type == OverviewPhotos) { | ||||||
| 		float64 w = (float64(_width - st::overviewPhotoSkip) / _photosInRow); | 		float64 w = (float64(_width - st::overviewPhotoSkip) / _photosInRow); | ||||||
| 		int32 inRow = int32(m.x() / w), vsize = (_vsize + st::overviewPhotoSkip); | 		int32 inRow = int32((m.x() - (st::overviewPhotoSkip / 2)) / w), vsize = (_vsize + st::overviewPhotoSkip); | ||||||
| 		int32 row = int32((m.y() - _addToY) / vsize); | 		int32 row = int32((m.y() - _addToY - (st::overviewPhotoSkip / 2)) / vsize); | ||||||
| 		if (inRow < 0) inRow = 0; | 		if (inRow < 0) inRow = 0; | ||||||
| 		if (row < 0) row = 0; | 		if (row < 0) row = 0; | ||||||
| 		bool upon = true; | 		bool upon = true; | ||||||
|  | @ -761,9 +761,11 @@ void OverviewInner::onUpdateSelected() { | ||||||
| 					if (i > 0 && ((y + h / 2) < m.y() || i == _items.size() - 1)) { | 					if (i > 0 && ((y + h / 2) < m.y() || i == _items.size() - 1)) { | ||||||
| 						--i; | 						--i; | ||||||
| 						if (!_items[i].msgid) break; // wtf
 | 						if (!_items[i].msgid) break; // wtf
 | ||||||
|  | 						y = _addToY + _height - _items[i].y; | ||||||
| 					} else if (i < _items.size() - 1 && ((y + h / 2) >= m.y() || !i)) { | 					} else if (i < _items.size() - 1 && ((y + h / 2) >= m.y() || !i)) { | ||||||
| 						++i; | 						++i; | ||||||
| 						if (!_items[i].msgid) break; // wtf
 | 						if (!_items[i].msgid) break; // wtf
 | ||||||
|  | 						y = _addToY + _height - _items[i].y; | ||||||
| 					} else { | 					} else { | ||||||
| 						break; // wtf
 | 						break; // wtf
 | ||||||
| 					} | 					} | ||||||
|  | @ -816,7 +818,7 @@ void OverviewInner::onUpdateSelected() { | ||||||
| 			cur = style::cur_pointer; | 			cur = style::cur_pointer; | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		if (_dragItemIndex < 0 || _mousedItem < 0) { | 		if (_dragItemIndex < 0 || _mousedItemIndex < 0) { | ||||||
| 			_dragAction = NoDrag; | 			_dragAction = NoDrag; | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
|  | @ -829,36 +831,60 @@ void OverviewInner::onUpdateSelected() { | ||||||
| 		} | 		} | ||||||
| 		cur = textlnkDown() ? style::cur_pointer : style::cur_default; | 		cur = textlnkDown() ? style::cur_pointer : style::cur_default; | ||||||
| 		if (_dragAction == Selecting) { | 		if (_dragAction == Selecting) { | ||||||
| 			bool selectingDown = (_mousedItemIndex < _dragItemIndex) || (_mousedItemIndex == _dragItemIndex && _dragStartPos.y() < m.y()); | 			bool selectingDown = (_type == OverviewPhotos ? (_mousedItemIndex > _dragItemIndex) : (_mousedItemIndex < _dragItemIndex)) || (_mousedItemIndex == _dragItemIndex && (_type == OverviewPhotos ? (_dragStartPos.x() < m.x()) : (_dragStartPos.y() < m.y()))); | ||||||
| 			MsgId dragSelFrom = _dragItem, dragSelTo = _mousedItem; | 			MsgId dragSelFrom = _dragItem, dragSelTo = _mousedItem; | ||||||
| 			int32 dragSelFromIndex = _dragItemIndex, dragSelToIndex = _mousedItemIndex; | 			int32 dragSelFromIndex = _dragItemIndex, dragSelToIndex = _mousedItemIndex; | ||||||
| 			if (!itemHasPoint(dragSelFrom, dragSelFromIndex, _dragStartPos.x(), _dragStartPos.y())) { // maybe exclude dragSelFrom
 | 			if (!itemHasPoint(dragSelFrom, dragSelFromIndex, _dragStartPos.x(), _dragStartPos.y())) { // maybe exclude dragSelFrom
 | ||||||
| 				if (selectingDown) { | 				if (selectingDown) { | ||||||
| 					if (_dragStartPos.y() >= ((_type == OverviewPhotos) ? _vsize : (itemHeight(dragSelFrom, dragSelFromIndex) - st::msgMargin.bottom())) || ((_mousedItem == dragSelFrom) && (m.y() < _dragStartPos.y() + QApplication::startDragDistance()))) { | 					if (_type == OverviewPhotos) { | ||||||
|  | 						if (_dragStartPos.x() >= _vsize || ((_mousedItem == dragSelFrom) && (m.x() < _dragStartPos.x() + QApplication::startDragDistance()))) { | ||||||
|  | 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, 1); | ||||||
|  | 						} | ||||||
|  | 					} else { | ||||||
|  | 						if (_dragStartPos.y() >= (itemHeight(dragSelFrom, dragSelFromIndex) - st::msgMargin.bottom()) || ((_mousedItem == dragSelFrom) && (m.y() < _dragStartPos.y() + QApplication::startDragDistance()))) { | ||||||
|  | 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, -1); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} else { | ||||||
|  | 					if (_type == OverviewPhotos) { | ||||||
|  | 						if (_dragStartPos.x() < 0 || ((_mousedItem == dragSelFrom) && (m.x() >= _dragStartPos.x() - QApplication::startDragDistance()))) { | ||||||
| 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, -1); | 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, -1); | ||||||
| 						} | 						} | ||||||
| 					} else { | 					} else { | ||||||
| 					if (_dragStartPos.y() < ((_type == OverviewPhotos ? 0 : st::msgMargin.top())) || ((_mousedItem == dragSelFrom) && (m.y() >= _dragStartPos.y() - QApplication::startDragDistance()))) { | 						if (_dragStartPos.y() < st::msgMargin.top() || ((_mousedItem == dragSelFrom) && (m.y() >= _dragStartPos.y() - QApplication::startDragDistance()))) { | ||||||
| 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, 1); | 							moveToNextItem(dragSelFrom, dragSelFromIndex, dragSelTo, 1); | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | 			} | ||||||
| 			if (_dragItem != _mousedItem) { // maybe exclude dragSelTo
 | 			if (_dragItem != _mousedItem) { // maybe exclude dragSelTo
 | ||||||
| 				if (selectingDown) { | 				if (selectingDown) { | ||||||
| 					if (m.y() < ((_type == OverviewPhotos) ? 0 : st::msgMargin.top())) { | 					if (_type == OverviewPhotos) { | ||||||
|  | 						if (m.x() < 0) { | ||||||
|  | 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, -1); | ||||||
|  | 						} | ||||||
|  | 					} else { | ||||||
|  | 						if (m.y() < st::msgMargin.top()) { | ||||||
|  | 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, 1); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} else { | ||||||
|  | 					if (_type == OverviewPhotos) { | ||||||
|  | 						if (m.x() >= _vsize) { | ||||||
| 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, 1); | 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, 1); | ||||||
| 						} | 						} | ||||||
| 					} else { | 					} else { | ||||||
| 					if (m.y() >= ((_type == OverviewPhotos) ? _vsize : (itemHeight(dragSelTo, dragSelToIndex) - st::msgMargin.bottom()))) { | 						if (m.y() >= itemHeight(dragSelTo, dragSelToIndex) - st::msgMargin.bottom()) { | ||||||
| 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, -1); | 							moveToNextItem(dragSelTo, dragSelToIndex, dragSelFrom, -1); | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | 			} | ||||||
| 			bool dragSelecting = false; | 			bool dragSelecting = false; | ||||||
| 			MsgId dragFirstAffected = dragSelFrom; | 			MsgId dragFirstAffected = dragSelFrom; | ||||||
| 			int32 dragFirstAffectedIndex = dragSelFromIndex; | 			int32 dragFirstAffectedIndex = dragSelFromIndex; | ||||||
| 			while (dragFirstAffectedIndex >= 0 && dragFirstAffected <= 0) { | 			while (dragFirstAffectedIndex >= 0 && dragFirstAffected <= 0) { | ||||||
| 				moveToNextItem(dragFirstAffected, dragFirstAffectedIndex, dragSelTo, selectingDown ? -1 : 1); | 				moveToNextItem(dragFirstAffected, dragFirstAffectedIndex, dragSelTo, ((selectingDown && (_type == OverviewPhotos)) || (!selectingDown && (_type != OverviewPhotos))) ? -1 : 1); | ||||||
| 			} | 			} | ||||||
| 			if (dragFirstAffectedIndex >= 0) { | 			if (dragFirstAffectedIndex >= 0) { | ||||||
| 				SelectedItems::const_iterator i = _selected.constFind(dragFirstAffected); | 				SelectedItems::const_iterator i = _selected.constFind(dragFirstAffected); | ||||||
|  | @ -1132,7 +1158,7 @@ void OverviewInner::fillSelectedItems(SelectedItemSet &sel, bool forDelete) { | ||||||
| 	for (SelectedItems::const_iterator i = _selected.cbegin(), e = _selected.cend(); i != e; ++i) { | 	for (SelectedItems::const_iterator i = _selected.cbegin(), e = _selected.cend(); i != e; ++i) { | ||||||
| 		HistoryItem *item = App::histItemById(i.key()); | 		HistoryItem *item = App::histItemById(i.key()); | ||||||
| 		if (item && item->itemType() == HistoryItem::MsgType && ((item->id > 0 && !item->serviceMsg()) || forDelete)) { | 		if (item && item->itemType() == HistoryItem::MsgType && ((item->id > 0 && !item->serviceMsg()) || forDelete)) { | ||||||
| 			sel.insert(item->y + item->block()->y, item); | 			sel.insert(item->id, item); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -1251,6 +1277,53 @@ void OverviewInner::mediaOverviewUpdated() { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 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; | ||||||
|  | 	for (SelectedItems::iterator i = _selected.begin(), e = _selected.end(); i != e; ++i) { | ||||||
|  | 		if (i.key() == row->id) { | ||||||
|  | 			uint32 sel = i.value(); | ||||||
|  | 			_selected.erase(i); | ||||||
|  | 			_selected.insert(newId, sel); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	for (CachedItems::iterator i = _items.begin(), e = _items.end(); i != e; ++i) { | ||||||
|  | 		if (i->msgid == row->id) { | ||||||
|  | 			i->msgid = newId; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void OverviewInner::itemRemoved(HistoryItem *item) { | ||||||
|  | 	if (_dragItem == item->id) { | ||||||
|  | 		dragActionCancel(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SelectedItems::iterator i = _selected.find(item->id); | ||||||
|  | 	if (i != _selected.cend()) { | ||||||
|  | 		_selected.erase(i); | ||||||
|  | 		_overview->updateTopBarSelection(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	onUpdateSelected(); | ||||||
|  | 
 | ||||||
|  | 	if (_dragSelFrom == item->id) { | ||||||
|  | 		_dragSelFrom = 0; | ||||||
|  | 		_dragSelFromIndex = -1; | ||||||
|  | 	} | ||||||
|  | 	if (_dragSelTo == item->id) { | ||||||
|  | 		_dragSelTo = 0; | ||||||
|  | 		_dragSelToIndex = -1; | ||||||
|  | 	} | ||||||
|  | 	updateDragSelection(_dragSelFrom, _dragSelFromIndex, _dragSelTo, _dragSelToIndex, _dragSelecting); | ||||||
|  | 
 | ||||||
|  | 	parentWidget()->update(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void OverviewInner::msgUpdated(HistoryItem *msg) { | void OverviewInner::msgUpdated(HistoryItem *msg) { | ||||||
| 	if (!msg || _hist != msg->history()) return; | 	if (!msg || _hist != msg->history()) return; | ||||||
| 	MsgId msgid = msg->id; | 	MsgId msgid = msg->id; | ||||||
|  | @ -1507,6 +1580,12 @@ void OverviewWidget::mediaOverviewUpdated(PeerData *p) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void OverviewWidget::changingMsgId(HistoryItem *row, MsgId newId) { | ||||||
|  | 	if (peer() == row->history()->peer) { | ||||||
|  | 		_inner.changingMsgId(row, newId); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void OverviewWidget::msgUpdated(PeerId p, HistoryItem *msg) { | void OverviewWidget::msgUpdated(PeerId p, HistoryItem *msg) { | ||||||
| 	if (peer()->id == p) { | 	if (peer()->id == p) { | ||||||
| 		_inner.msgUpdated(msg); | 		_inner.msgUpdated(msg); | ||||||
|  |  | ||||||
|  | @ -56,6 +56,7 @@ public: | ||||||
| 	void switchType(MediaOverviewType type); | 	void switchType(MediaOverviewType type); | ||||||
| 
 | 
 | ||||||
| 	void mediaOverviewUpdated(); | 	void mediaOverviewUpdated(); | ||||||
|  | 	void changingMsgId(HistoryItem *row, MsgId newId); | ||||||
| 	void msgUpdated(HistoryItem *msg); | 	void msgUpdated(HistoryItem *msg); | ||||||
| 
 | 
 | ||||||
| 	void getSelectionState(int32 &selectedForForward, int32 &selectedForDelete) const; | 	void getSelectionState(int32 &selectedForForward, int32 &selectedForDelete) const; | ||||||
|  | @ -82,6 +83,8 @@ public slots: | ||||||
| 	void onTouchSelect(); | 	void onTouchSelect(); | ||||||
| 	void onTouchScrollTimer(); | 	void onTouchScrollTimer(); | ||||||
| 
 | 
 | ||||||
|  | 	void itemRemoved(HistoryItem *item); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
| 
 | 
 | ||||||
| 	void fixItemIndex(int32 ¤t, MsgId msgId) const; | 	void fixItemIndex(int32 ¤t, MsgId msgId) const; | ||||||
|  | @ -208,6 +211,7 @@ public: | ||||||
| 	bool animStep(float64 ms); | 	bool animStep(float64 ms); | ||||||
| 
 | 
 | ||||||
| 	void mediaOverviewUpdated(PeerData *peer); | 	void mediaOverviewUpdated(PeerData *peer); | ||||||
|  | 	void changingMsgId(HistoryItem *row, MsgId newId); | ||||||
| 	void msgUpdated(PeerId peer, HistoryItem *msg); | 	void msgUpdated(PeerId peer, HistoryItem *msg); | ||||||
| 
 | 
 | ||||||
| 	QPoint clampMousePosition(QPoint point); | 	QPoint clampMousePosition(QPoint point); | ||||||
|  |  | ||||||
|  | @ -1214,6 +1214,7 @@ void Window::mediaOverviewUpdated(PeerData *peer) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Window::changingMsgId(HistoryItem *row, MsgId newId) { | void Window::changingMsgId(HistoryItem *row, MsgId newId) { | ||||||
|  | 	if (main) main->changingMsgId(row, newId); | ||||||
| 	if (!_mediaView || _mediaView->isHidden()) return; | 	if (!_mediaView || _mediaView->isHidden()) return; | ||||||
| 	_mediaView->changingMsgId(row, newId); | 	_mediaView->changingMsgId(row, newId); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 John Preston
						John Preston