┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-10-08 21:40:34 +0200
committerPeter Penz <[email protected]>2011-10-08 21:43:55 +0200
commit6551c000fc68134932cdc21f2cc7086b34bff30b (patch)
treef4892d247c13f988ee68de37ea1700aaf6e80ab2 /src/kitemviews
parentb1b5a6db2e8b9b1fc175d068ba393925d95c9dc6 (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.cpp52
-rw-r--r--src/kitemviews/kitemlistcontroller.h17
-rw-r--r--src/kitemviews/kitemlistheader.cpp16
-rw-r--r--src/kitemviews/kitemlistview.cpp60
-rw-r--r--src/kitemviews/kitemlistview.h19
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.