Fix group mouse interaction issues

This commit is contained in:
Petr Mrázek
2014-02-02 14:27:43 +01:00
parent b2bf50a6d7
commit eb0ed082d8
4 changed files with 109 additions and 33 deletions

View File

@@ -36,7 +36,7 @@ GroupView::GroupView(QWidget *parent)
// setWordWrap(true);
// setDragDropMode(QListView::InternalMove);
setAcceptDrops(true);
// setSpacing(10);
m_spacing = 5;
}
GroupView::~GroupView()
@@ -145,31 +145,31 @@ Group *GroupView::category(const QModelIndex &index) const
Group *GroupView::category(const QString &cat) const
{
for (int i = 0; i < m_categories.size(); ++i)
for (auto group : m_categories)
{
if (m_categories.at(i)->text == cat)
if (group->text == cat)
{
return m_categories.at(i);
return group;
}
}
return 0;
return nullptr;
}
Group *GroupView::categoryAt(const QPoint &pos) const
{
for (int i = 0; i < m_categories.size(); ++i)
for (auto group : m_categories)
{
if (m_categories.at(i)->iconRect.contains(pos))
if(group->pointIntersect(pos) & Group::CheckboxHit)
{
return m_categories.at(i);
return group;
}
}
return 0;
return nullptr;
}
int GroupView::itemsPerRow() const
{
return qFloor((qreal)(contentWidth()) / (qreal)(itemWidth() + /* spacing */ 10));
return qFloor((qreal)(contentWidth()) / (qreal)(itemWidth() + m_spacing));
}
int GroupView::contentWidth() const
@@ -261,7 +261,7 @@ void GroupView::mousePressEvent(QMouseEvent *event)
m_pressedIndex = index;
m_pressedAlreadySelected = selectionModel()->isSelected(m_pressedIndex);
QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
QItemSelectionModel::SelectionFlags selection_flags = selectionCommand(index, event);
m_pressedPosition = pos;
m_pressedCategory = categoryAt(m_pressedPosition);
@@ -428,9 +428,8 @@ void GroupView::mouseDoubleClickEvent(QMouseEvent *event)
void GroupView::paintEvent(QPaintEvent *event)
{
QPainter painter(this->viewport());
painter.translate(-offset());
int y = 0;
int y = -verticalOffset();
for (int i = 0; i < m_categories.size(); ++i)
{
Group *category = m_categories.at(i);
@@ -502,7 +501,7 @@ void GroupView::resizeEvent(QResizeEvent *event)
// if (m_categoryEditor)
// {
// m_categoryEditor->resize(qMax(contentWidth() / 2,
//m_editedCategory->textRect.width()),
// m_editedCategory->textRect.width()),
// m_categoryEditor->height());
// }
@@ -618,6 +617,11 @@ void GroupView::startDrag(Qt::DropActions supportedActions)
}
QRect GroupView::visualRect(const QModelIndex &index) const
{
return geometryRect(index).translated(-offset());
}
QRect GroupView::geometryRect(const QModelIndex &index) const
{
if (!index.isValid() || isIndexHidden(index) || index.column() > 0)
{
@@ -627,15 +631,16 @@ QRect GroupView::visualRect(const QModelIndex &index) const
const Group *cat = category(index);
QPair<int, int> pos = categoryInternalPosition(index);
int x = pos.first;
int y = pos.second;
// int y = pos.second;
QRect out;
out.setTop(cat->top() + cat->headerHeight() + 5 + categoryInternalRowTop(index));
out.setLeft(/*spacing*/ 10 + x * itemWidth() + x * /*spacing()*/ 10);
out.setLeft(m_spacing + x * (itemWidth() + m_spacing));
out.setSize(itemDelegate()->sizeHint(viewOptions(), index));
return out;
}
/*
void CategorizedView::startCategoryEditor(Category *category)
{
@@ -680,7 +685,7 @@ QModelIndex GroupView::indexAt(const QPoint &point) const
for (int i = 0; i < model()->rowCount(); ++i)
{
QModelIndex index = model()->index(i, 0);
if (visualRect(index).contains(point))
if (geometryRect(index).contains(point))
{
return index;
}
@@ -694,7 +699,7 @@ void GroupView::setSelection(const QRect &rect,
for (int i = 0; i < model()->rowCount(); ++i)
{
QModelIndex index = model()->index(i, 0);
if (visualRect(index).intersects(rect))
if (geometryRect(index).intersects(rect))
{
selectionModel()->select(index, commands);
}
@@ -734,7 +739,7 @@ QList<QPair<QRect, QModelIndex>> GroupView::draggablePaintPairs(const QModelInde
for (int i = 0; i < indices.count(); ++i)
{
const QModelIndex &index = indices.at(i);
const QRect current = visualRect(index);
const QRect current = geometryRect(index);
if (current.intersects(viewportRect))
{
ret += qMakePair(current, index);
@@ -857,3 +862,24 @@ QPoint GroupView::offset() const
{
return QPoint(horizontalOffset(), verticalOffset());
}
QRegion GroupView::visualRegionForSelection(const QItemSelection &selection) const
{
QRegion region;
for (auto &range : selection)
{
int start_row = range.top();
int end_row = range.bottom();
for (int row = start_row; row <= end_row; ++row)
{
int start_column = range.left();
int end_column = range.right();
for (int column = start_column; column <= end_column; ++column)
{
QModelIndex index = model()->index(row, column, rootIndex());
region += visualRect(index); // OK
}
}
}
return region;
}