From kde-commits Mon Aug 31 16:14:51 2009 From: =?utf-8?q?Micha=C5=82=20Dutkiewicz?= Date: Mon, 31 Aug 2009 16:14:51 +0000 To: kde-commits Subject: KDE/kdebase/workspace/plasma/applets/tasks Message-Id: <1251735291.271259.28647.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125173529817454 SVN commit 1017829 by mdutkiewicz: Keyboard navigation [Shift + ] Tab for Tasks applet (Enter / Return to activate task). To make real use of it there is need to fix panel focus issue too. M +25 -0 abstracttaskitem.cpp M +3 -0 abstracttaskitem.h M +59 -26 taskgroupitem.cpp M +2 -0 taskgroupitem.h M +13 -1 windowtaskitem.cpp M +1 -0 windowtaskitem.h --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/abstracttaskitem.cpp #1017828:1017829 @@ -81,6 +81,9 @@ setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); setAcceptsHoverEvents(true); setAcceptDrops(true); + setFocusPolicy(Qt::StrongFocus); + setFlag(QGraphicsItem::ItemIsFocusable); + // setPreferredSize(basicPreferredSize()); Plasma::ToolTipManager::self()->registerWidget(this); @@ -286,6 +289,28 @@ m_lastUpdate.restart(); } +void AbstractTaskItem::focusInEvent(QFocusEvent *event) +{ + Q_UNUSED(event) + + m_flags |= TaskHasFocus; + + setTaskFlags(m_flags); + + update(); +} + +void AbstractTaskItem::focusOutEvent(QFocusEvent *event) +{ + Q_UNUSED(event) + + m_flags &= ~TaskHasFocus; + + setTaskFlags(m_flags); + + update(); +} + void AbstractTaskItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event) --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/abstracttaskitem.h #1017828:1017829 @@ -31,6 +31,7 @@ // Qt #include #include +#include #include class QTextOption; @@ -143,6 +144,8 @@ void dragLeaveEvent(QGraphicsSceneDragDropEvent *event); // reimplemented + void focusInEvent(QFocusEvent *event); + void focusOutEvent(QFocusEvent *event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/taskgroupitem.cpp #1017828:1017829 @@ -693,6 +693,64 @@ return QGraphicsWidget::eventFilter(watched, event); } +bool TaskGroupItem::focusNextPrevChild(bool next) +{ + return focusSubTask(next, false); +} + +bool TaskGroupItem::focusSubTask(bool next, bool activate) +{ + const int subTasks = totalSubTasks(); + + if (subTasks > 0) { + int index = -1; + + if (focusWidget() && subTasks > 1) { + for (int i = 0; i < subTasks; ++i) { + if (focusWidget() == selectSubTask(i)) { + index = i; + + break; + } + } + } + + if (next) { + ++index; + + if (index >= subTasks) { + index = 0; + } + } + else { + --index; + + if (index < 0) { + index = (subTasks - 1); + } + } + + AbstractTaskItem *taskItem = selectSubTask(index); + + if (taskItem) { + taskItem->setFocus(); + + m_activeTaskIndex = index; + } + + if (activate && taskItem) { + stopWindowHoverEffect(); + + taskItem->activate(); + } + + return true; + } + else { + return false; + } +} + void TaskGroupItem::clearPopupLostFocus() { m_popupLostFocus = false; @@ -1206,32 +1264,7 @@ void TaskGroupItem::wheelEvent(QGraphicsSceneWheelEvent *event) { - int subTasks = totalSubTasks(); - //zero or one tasks don't cycle - if (subTasks < 1) { - return; - } - - //mouse wheel down - if (event->delta() < 0) { - m_activeTaskIndex++; - if (m_activeTaskIndex >= subTasks) { - m_activeTaskIndex = 0; // last item is spacer - } - } else { - //mouse wheel up - m_activeTaskIndex--; - if (m_activeTaskIndex < 0) { - m_activeTaskIndex = subTasks - 1; //last item is a spacer - } - } - - //kDebug() << "Wheel event m_activeTaskIndex: " << m_activeTaskIndex << " of " << subTasks; - AbstractTaskItem *taskItem = selectSubTask(m_activeTaskIndex); - if (taskItem) { - stopWindowHoverEffect(); - taskItem->activate(); - } + focusSubTask((event->delta() > 0), true); } int TaskGroupItem::maxRows() --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/taskgroupitem.h #1017828:1017829 @@ -140,6 +140,7 @@ virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event); virtual void dropEvent(QGraphicsSceneDragDropEvent *event); bool eventFilter(QObject *watched, QEvent *event); + bool focusNextPrevChild(bool next); void handleDroppedId(WId id, AbstractTaskItem *targetTask, QGraphicsSceneDragDropEvent *event); @@ -185,6 +186,7 @@ void setSplitIndex(int position); int totalSubTasks(); + bool focusSubTask(bool next, bool activate); AbstractTaskItem * selectSubTask(int index); GroupPtr m_group; --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/windowtaskitem.cpp #1017828:1017829 @@ -96,6 +96,18 @@ event->accept(); } +void WindowTaskItem::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + { + activate(); + } + else + { + QGraphicsWidget::keyPressEvent(event); + } +} + //destroy this item void WindowTaskItem::close() { @@ -240,7 +252,7 @@ if (!m_busyWidget) { m_busyWidget = new Plasma::BusyWidget(this); m_busyWidget->hide(); - } + } } void WindowTaskItem::gotTaskPointer() --- trunk/KDE/kdebase/workspace/plasma/applets/tasks/windowtaskitem.h #1017828:1017829 @@ -68,6 +68,7 @@ protected: void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); + void keyPressEvent(QKeyEvent *event); void updateToolTip(); private slots: