Make sure that key presses are handled in KItemListController

Key press events are forwarded from KItemListContainer to
KItemListController. Right now, only the 'Home' and 'End' keys
are handled (arrow keys require some more work because their action
depends on the view mode).
Note:
1. Before key presses are handled, the view has to be clicked with
   the mouse. It seems that the view does not have the keyboard
   focus initially.
2. The view does not scroll to the new current item yet.
This commit is contained in:
Frank Reininghaus 2011-08-10 14:30:32 +02:00
parent 2e3b7e6dd3
commit 6d6fe76dcf
3 changed files with 24 additions and 1 deletions

View file

@ -26,6 +26,7 @@
#include "kitemlistview.h"
#include "kitemmodelbase.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPropertyAnimation>
@ -82,6 +83,20 @@ KItemListController* KItemListContainer::controller() const
return m_controller;
}
void KItemListContainer::keyPressEvent(QKeyEvent* event)
{
// TODO: We should find a better way to handle the key press events in the view.
// The reasons why we need this hack are:
// 1. Without reimplementing keyPressEvent() here, the event would not reach the QGraphicsView.
// 2. By default, the KItemListView does not have the keyboard focus in the QGraphicsScene, so
// simply sending the event to the QGraphicsView which is the KItemListContainer's viewport
// does not work.
KItemListView* view = m_controller->view();
if (view) {
QApplication::sendEvent(view, event);
}
}
void KItemListContainer::showEvent(QShowEvent* event)
{
QAbstractScrollArea::showEvent(event);

View file

@ -49,6 +49,7 @@ public:
KItemListController* controller() const;
protected:
virtual void keyPressEvent(QKeyEvent* event);
virtual void showEvent(QShowEvent* event);
virtual void resizeEvent(QResizeEvent* event);
virtual void scrollContentsBy(int dx, int dy);

View file

@ -119,7 +119,14 @@ bool KItemListController::hideEvent(QHideEvent* event)
bool KItemListController::keyPressEvent(QKeyEvent* event)
{
Q_UNUSED(event);
switch (event->key()) {
case Qt::Key_Home:
m_selectionManager->setCurrentItem(0);
break;
case Qt::Key_End:
m_selectionManager->setCurrentItem(m_model->count() - 1);
break;
}
return false;
}