diff options
| author | Peter Penz <[email protected]> | 2011-10-08 21:40:34 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-10-08 21:43:55 +0200 |
| commit | 6551c000fc68134932cdc21f2cc7086b34bff30b (patch) | |
| tree | f4892d247c13f988ee68de37ea1700aaf6e80ab2 /src/kitemviews | |
| parent | b1b5a6db2e8b9b1fc175d068ba393925d95c9dc6 (diff) | |
Context menu cleanups
- Open the context menu on the mouse-press event, not on the
mouse-release event.
- Provide an explicit position-information and don't use
QCursor::pos(). This fixes the issue that opening a context-menu
by the keyboard opens below the cursor.
- Provide different signals in the KItemListController for
the different context-menu types (item vs. view vs. header).
- Implement turning on/off roles by the header-context-menu.
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 52 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.h | 17 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistheader.cpp | 16 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 60 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 19 |
5 files changed, 107 insertions, 57 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 13ced1aac..deefe8e3c 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -322,33 +322,45 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent* event, const break; } - return true; - } else { if (event->buttons() & Qt::RightButton) { - m_selectionManager->clearSelection(); + emit itemContextMenuRequested(m_pressedIndex, event->screenPos()); } - KItemListRubberBand* rubberBand = m_view->rubberBand(); - QPointF startPos = m_pressedMousePos; - if (m_view->scrollOrientation() == Qt::Vertical) { - startPos.ry() += m_view->scrollOffset(); - if (m_view->itemSize().width() < 0) { - // Use a special rubberband for views that have only one column and - // expand the rubberband to use the whole width of the view. - startPos.setX(0); - } + return true; + } + + if (event->buttons() & Qt::RightButton) { + m_selectionManager->clearSelection(); + + const QRectF headerBounds = m_view->headerBoundaries(); + if (headerBounds.contains(event->pos())) { + emit headerContextMenuRequested(event->screenPos()); } else { - startPos.rx() += m_view->scrollOffset(); + emit viewContextMenuRequested(event->screenPos()); } + return true; + } - m_oldSelection = m_selectionManager->selectedItems(); - rubberBand->setStartPosition(startPos); - rubberBand->setEndPosition(startPos); - rubberBand->setActive(true); - connect(rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandChanged())); - m_view->setAutoScroll(true); + KItemListRubberBand* rubberBand = m_view->rubberBand(); + QPointF startPos = m_pressedMousePos; + if (m_view->scrollOrientation() == Qt::Vertical) { + startPos.ry() += m_view->scrollOffset(); + if (m_view->itemSize().width() < 0) { + // Use a special rubberband for views that have only one column and + // expand the rubberband to use the whole width of the view. + startPos.setX(0); + } + } else { + startPos.rx() += m_view->scrollOffset(); } + m_oldSelection = m_selectionManager->selectedItems(); + rubberBand->setStartPosition(startPos); + rubberBand->setEndPosition(startPos); + rubberBand->setActive(true); + connect(rubberBand, SIGNAL(endPositionChanged(QPointF,QPointF)), this, SLOT(slotRubberBandChanged())); + m_view->setAutoScroll(true); + return false; } @@ -437,8 +449,6 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con } } else if (event->button() & Qt::MidButton) { emit itemMiddleClicked(index); - } else if (event->button() & Qt::RightButton) { - emit contextMenuRequested(index, QPointF(event->pos())); } } else if (clearSelection) { m_selectionManager->clearSelection(); diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 8ef045ea3..d6205ea0a 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -108,7 +108,22 @@ public: signals: void itemActivated(int index); void itemMiddleClicked(int index); - void contextMenuRequested(int index, const QPointF& pos); + + /** + * Emitted if a context-menu is requested for the item with + * the index \a index. It is assured that the index is valid. + */ + void itemContextMenuRequested(int index, const QPointF& pos); + + /** + * Emitted if a context-menu is requested for the KItemListView. + */ + void viewContextMenuRequested(const QPointF& pos); + + /** + * Emitted if a context-menu is requested for the header of the KItemListView. + */ + void headerContextMenuRequested(const QPointF& pos); /** * Is emitted if the item with the index \p index gets hovered. diff --git a/src/kitemviews/kitemlistheader.cpp b/src/kitemviews/kitemlistheader.cpp index 0b94f327b..3187d2c36 100644 --- a/src/kitemviews/kitemlistheader.cpp +++ b/src/kitemviews/kitemlistheader.cpp @@ -19,6 +19,8 @@ #include "kitemlistheader_p.h" +#include <KAction> +#include <KMenu> #include "kitemmodelbase.h" #include <QApplication> @@ -143,11 +145,15 @@ void KItemListHeader::paint(QPainter* painter, const QStyleOptionGraphicsItem* o void KItemListHeader::mousePressEvent(QGraphicsSceneMouseEvent* event) { - event->accept(); - updatePressedRoleIndex(event->pos()); - m_pressedMousePos = event->pos(); - m_roleOperation = isAboveRoleGrip(m_pressedMousePos, m_pressedRoleIndex) ? - ResizeRoleOperation : NoRoleOperation; + if (event->button() & Qt::LeftButton) { + updatePressedRoleIndex(event->pos()); + m_pressedMousePos = event->pos(); + m_roleOperation = isAboveRoleGrip(m_pressedMousePos, m_pressedRoleIndex) ? + ResizeRoleOperation : NoRoleOperation; + event->accept(); + } else { + event->ignore(); + } } void KItemListHeader::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index d5926c0f7..08c92e551 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -434,6 +434,37 @@ bool KItemListView::isTransactionActive() const return m_activeTransactions > 0; } + +void KItemListView::setHeaderShown(bool show) +{ + + if (show && !m_header) { + m_header = new KItemListHeader(this); + m_header->setPos(0, 0); + m_header->setModel(m_model); + m_header->setVisibleRoles(m_visibleRoles); + m_header->setVisibleRolesWidths(headerRolesWidths()); + m_header->setZValue(1); + + m_useHeaderWidths = false; + + connect(m_header, SIGNAL(visibleRoleWidthChanged(QByteArray,qreal,qreal)), + this, SLOT(slotVisibleRoleWidthChanged(QByteArray,qreal,qreal))); + + m_layouter->setHeaderHeight(m_header->size().height()); + } else if (!show && m_header) { + delete m_header; + m_header = 0; + m_useHeaderWidths = false; + m_layouter->setHeaderHeight(0); + } +} + +bool KItemListView::isHeaderShown() const +{ + return m_header != 0; +} + QPixmap KItemListView::createDragPixmap(const QSet<int>& indexes) const { Q_UNUSED(indexes); @@ -1519,30 +1550,6 @@ void KItemListView::updateStretchedVisibleRolesSizes() } } -void KItemListView::setHeaderShown(bool show) -{ - if (show && !m_header) { - m_header = new KItemListHeader(this); - m_header->setPos(0, 0); - m_header->setModel(m_model); - m_header->setVisibleRoles(m_visibleRoles); - m_header->setVisibleRolesWidths(headerRolesWidths()); - m_header->setZValue(1); - - m_useHeaderWidths = false; - - connect(m_header, SIGNAL(visibleRoleWidthChanged(QByteArray,qreal,qreal)), - this, SLOT(slotVisibleRoleWidthChanged(QByteArray,qreal,qreal))); - - m_layouter->setHeaderHeight(m_header->size().height()); - } else if (!show && m_header) { - delete m_header; - m_header = 0; - m_useHeaderWidths = false; - m_layouter->setHeaderHeight(0); - } -} - qreal KItemListView::visibleRolesSizesWidthSum() const { qreal widthSum = 0; @@ -1565,6 +1572,11 @@ qreal KItemListView::visibleRolesSizesHeightSum() const return heightSum; } +QRectF KItemListView::headerBoundaries() const +{ + return m_header ? m_header->geometry() : QRectF(); +} + int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc) { int inc = 0; diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 47de53e20..e1678145d 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -181,6 +181,13 @@ public: bool isTransactionActive() const; /** + * Turns on the header if \p show is true. Per default the + * header is not shown. + */ + void setHeaderShown(bool show); + bool isHeaderShown() const; + + /** * @return Pixmap that is used for a drag operation based on the * items given by \a indexes. The default implementation returns * a null-pixmap. @@ -347,12 +354,6 @@ private: void updateStretchedVisibleRolesSizes(); /** - * Turns on the header if \p show is true. Per default the - * header is not shown. - */ - void setHeaderShown(bool show); - - /** * @return Sum of the widths of all visible roles. */ qreal visibleRolesSizesWidthSum() const; @@ -363,6 +364,12 @@ private: qreal visibleRolesSizesHeightSum() const; /** + * @return Boundaries of the header. An empty rectangle is returned + * if no header is shown. + */ + QRectF headerBoundaries() const; + + /** * Helper function for triggerAutoScrolling(). * @param pos Logical position of the mouse relative to the range. * @param range Range of the visible area. |
