Fix groupview issues
* indexAt was using the wrong coordinate system * model events now trigger a delayed layout update instead of immediate.
This commit is contained in:
		@@ -48,26 +48,16 @@ GroupView::~GroupView()
 | 
			
		||||
void GroupView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
 | 
			
		||||
							const QVector<int> &roles)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	if (roles.contains(GroupViewRoles::GroupRole) || roles.contains(Qt::DisplayRole))
 | 
			
		||||
	{
 | 
			
		||||
		*/
 | 
			
		||||
		updateGeometries();
 | 
			
		||||
		/*
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
	viewport()->update();
 | 
			
		||||
	scheduleDelayedItemsLayout();
 | 
			
		||||
}
 | 
			
		||||
void GroupView::rowsInserted(const QModelIndex &parent, int start, int end)
 | 
			
		||||
{
 | 
			
		||||
	updateGeometries();
 | 
			
		||||
	viewport()->update();
 | 
			
		||||
	scheduleDelayedItemsLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GroupView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
 | 
			
		||||
{
 | 
			
		||||
	updateGeometries();
 | 
			
		||||
	viewport()->update();
 | 
			
		||||
	scheduleDelayedItemsLayout();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GroupView::updateGeometries()
 | 
			
		||||
@@ -274,15 +264,17 @@ void GroupView::mousePressEvent(QMouseEvent *event)
 | 
			
		||||
{
 | 
			
		||||
	// endCategoryEditor();
 | 
			
		||||
 | 
			
		||||
	QPoint pos = event->pos() + offset();
 | 
			
		||||
	QPersistentModelIndex index = indexAt(pos);
 | 
			
		||||
	QPoint visualPos = event->pos();
 | 
			
		||||
	QPoint geometryPos = event->pos() + offset();
 | 
			
		||||
	
 | 
			
		||||
	QPersistentModelIndex index = indexAt(visualPos);
 | 
			
		||||
 | 
			
		||||
	m_pressedIndex = index;
 | 
			
		||||
	m_pressedAlreadySelected = selectionModel()->isSelected(m_pressedIndex);
 | 
			
		||||
	QItemSelectionModel::SelectionFlags selection_flags = selectionCommand(index, event);
 | 
			
		||||
	m_pressedPosition = pos;
 | 
			
		||||
	m_pressedPosition = geometryPos;
 | 
			
		||||
 | 
			
		||||
	m_pressedCategory = categoryAt(m_pressedPosition);
 | 
			
		||||
	m_pressedCategory = categoryAt(geometryPos);
 | 
			
		||||
	if (m_pressedCategory)
 | 
			
		||||
	{
 | 
			
		||||
		setState(m_pressedCategory->collapsed ? ExpandingState : CollapsingState);
 | 
			
		||||
@@ -298,7 +290,7 @@ void GroupView::mousePressEvent(QMouseEvent *event)
 | 
			
		||||
		setAutoScroll(false);
 | 
			
		||||
		selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
 | 
			
		||||
		setAutoScroll(autoScroll);
 | 
			
		||||
		QRect rect(m_pressedPosition, pos);
 | 
			
		||||
		QRect rect(geometryPos, geometryPos);
 | 
			
		||||
		setSelection(rect, QItemSelectionModel::ClearAndSelect);
 | 
			
		||||
 | 
			
		||||
		// signal handlers may change the model
 | 
			
		||||
@@ -314,7 +306,8 @@ void GroupView::mousePressEvent(QMouseEvent *event)
 | 
			
		||||
void GroupView::mouseMoveEvent(QMouseEvent *event)
 | 
			
		||||
{
 | 
			
		||||
	QPoint topLeft;
 | 
			
		||||
	QPoint pos = event->pos() + offset();
 | 
			
		||||
	QPoint visualPos = event->pos();
 | 
			
		||||
	QPoint geometryPos = event->pos() + offset();
 | 
			
		||||
 | 
			
		||||
	if (state() == ExpandingState || state() == CollapsingState)
 | 
			
		||||
	{
 | 
			
		||||
@@ -340,7 +333,7 @@ void GroupView::mouseMoveEvent(QMouseEvent *event)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		topLeft = pos;
 | 
			
		||||
		topLeft = geometryPos;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (m_pressedIndex.isValid() && (state() != DragSelectingState) &&
 | 
			
		||||
@@ -354,8 +347,8 @@ void GroupView::mouseMoveEvent(QMouseEvent *event)
 | 
			
		||||
	{
 | 
			
		||||
		setState(DragSelectingState);
 | 
			
		||||
 | 
			
		||||
		setSelection(QRect(pos, pos), QItemSelectionModel::ClearAndSelect);
 | 
			
		||||
		QModelIndex index = indexAt(pos);
 | 
			
		||||
		setSelection(QRect(geometryPos, geometryPos), QItemSelectionModel::ClearAndSelect);
 | 
			
		||||
		QModelIndex index = indexAt(visualPos);
 | 
			
		||||
 | 
			
		||||
		// set at the end because it might scroll the view
 | 
			
		||||
		if (index.isValid() && (index != selectionModel()->currentIndex()) &&
 | 
			
		||||
@@ -368,11 +361,12 @@ void GroupView::mouseMoveEvent(QMouseEvent *event)
 | 
			
		||||
 | 
			
		||||
void GroupView::mouseReleaseEvent(QMouseEvent *event)
 | 
			
		||||
{
 | 
			
		||||
	QPoint pos = event->pos() + offset();
 | 
			
		||||
	QPersistentModelIndex index = indexAt(pos);
 | 
			
		||||
	QPoint visualPos = event->pos();
 | 
			
		||||
	QPoint geometryPos = event->pos() + offset();
 | 
			
		||||
	QPersistentModelIndex index = indexAt(visualPos);
 | 
			
		||||
 | 
			
		||||
	bool click = (index == m_pressedIndex && index.isValid()) ||
 | 
			
		||||
				 (m_pressedCategory && m_pressedCategory == categoryAt(pos));
 | 
			
		||||
				 (m_pressedCategory && m_pressedCategory == categoryAt(geometryPos));
 | 
			
		||||
 | 
			
		||||
	if (click && m_pressedCategory)
 | 
			
		||||
	{
 | 
			
		||||
@@ -708,7 +702,7 @@ QModelIndex GroupView::indexAt(const QPoint &point) const
 | 
			
		||||
	for (int i = 0; i < model()->rowCount(); ++i)
 | 
			
		||||
	{
 | 
			
		||||
		QModelIndex index = model()->index(i, 0);
 | 
			
		||||
		if (geometryRect(index).contains(point))
 | 
			
		||||
		if (visualRect(index).contains(point))
 | 
			
		||||
		{
 | 
			
		||||
			return index;
 | 
			
		||||
		}
 | 
			
		||||
@@ -716,6 +710,7 @@ QModelIndex GroupView::indexAt(const QPoint &point) const
 | 
			
		||||
	return QModelIndex();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FIXME: is rect supposed to be geometry or visual coords?
 | 
			
		||||
void GroupView::setSelection(const QRect &rect,
 | 
			
		||||
							 const QItemSelectionModel::SelectionFlags commands)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,12 @@ public:
 | 
			
		||||
	GroupView(QWidget *parent = 0);
 | 
			
		||||
	~GroupView();
 | 
			
		||||
 | 
			
		||||
	/// return geometry rectangle occupied by the specified model item
 | 
			
		||||
	QRect geometryRect(const QModelIndex &index) const;
 | 
			
		||||
	/// return visual rectangle occupied by the specified model item
 | 
			
		||||
	virtual QRect visualRect(const QModelIndex &index) const override;
 | 
			
		||||
	QModelIndex indexAt(const QPoint &point) const;
 | 
			
		||||
	/// get the model index at the specified visual point
 | 
			
		||||
	virtual QModelIndex indexAt(const QPoint &point) const override;
 | 
			
		||||
	void setSelection(const QRect &rect,
 | 
			
		||||
					  const QItemSelectionModel::SelectionFlags commands) override;
 | 
			
		||||
 | 
			
		||||
@@ -114,6 +117,7 @@ private slots:
 | 
			
		||||
	void endCategoryEditor();*/
 | 
			
		||||
 | 
			
		||||
private: /* variables */
 | 
			
		||||
	/// point where the currently active mouse action started in geometry coordinates
 | 
			
		||||
	QPoint m_pressedPosition;
 | 
			
		||||
	QPersistentModelIndex m_pressedIndex;
 | 
			
		||||
	bool m_pressedAlreadySelected;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user