From dc9de5af386f61e6dc5537d04ccc8aceb8126b21 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sun, 11 Jan 2009 12:46:28 +0100 Subject: [PATCH] InputLine now regains focus on keypress Pressing any letter, number, or space will automatically focus the input line now. This compensates for the fact that clicking in the BufferView now takes away focus :) Fixes #47 and #221. --- src/qtui/mainwin.cpp | 13 +++++++------ src/qtui/mainwin.h | 2 ++ src/uisupport/inputline.cpp | 22 ++++++++++++++++++++++ src/uisupport/inputline.h | 1 + 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index e7205af9..fcd854ed 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -315,6 +315,7 @@ void MainWin::addBufferView(BufferViewConfig *config) { //create the view and initialize it's filter BufferView *view = new BufferView(dock); view->setFilteredModel(Client::bufferModel(), config); + view->installEventFilter(_inputWidget->inputLine()); // for key presses view->show(); Client::bufferModel()->synchronizeView(view); @@ -414,20 +415,20 @@ void MainWin::setupInputWidget() { VerticalDock *dock = new VerticalDock(tr("Inputline"), this); dock->setObjectName("InputDock"); - InputWidget *inputWidget = new InputWidget(dock); - dock->setWidget(inputWidget); + _inputWidget = new InputWidget(dock); + dock->setWidget(_inputWidget); addDockWidget(Qt::BottomDockWidgetArea, dock); _viewMenu->addAction(dock->toggleViewAction()); dock->toggleViewAction()->setText(tr("Show Input Line")); - inputWidget->setModel(Client::bufferModel()); - inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); + _inputWidget->setModel(Client::bufferModel()); + _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - _bufferWidget->setFocusProxy(inputWidget); + _bufferWidget->setFocusProxy(_inputWidget); - inputWidget->inputLine()->installEventFilter(_bufferWidget); + _inputWidget->inputLine()->installEventFilter(_bufferWidget); } void MainWin::setupTopicWidget() { diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index cc8d8d12..2d80e641 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -38,6 +38,7 @@ class BufferView; class BufferViewConfig; class BufferViewDock; class BufferWidget; +class InputWidget; class MsgProcessorStatusWidget; class NickListWidget; class SystemTrayIcon; @@ -158,6 +159,7 @@ class MainWin QList _bufferViews; BufferWidget *_bufferWidget; NickListWidget *_nickListWidget; + InputWidget *_inputWidget; QMenu *_fileMenu, *_networksMenu, *_viewMenu, *_bufferViewsMenu, *_settingsMenu, *_helpMenu, *_helpDebugMenu; diff --git a/src/uisupport/inputline.cpp b/src/uisupport/inputline.cpp index 60f34fb0..745a3e33 100644 --- a/src/uisupport/inputline.cpp +++ b/src/uisupport/inputline.cpp @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "bufferview.h" #include "inputline.h" #include "tabcompleter.h" @@ -33,6 +34,27 @@ InputLine::InputLine(QWidget *parent) InputLine::~InputLine() { } +bool InputLine::eventFilter(QObject *watched, QEvent *event) { + if(event->type() != QEvent::KeyPress) + return false; + + // keys from BufferView should be sent to (and focus) the input line + BufferView *view = qobject_cast(watched); + if(view) { + QKeyEvent *keyEvent = static_cast(event); + if(keyEvent->text().length() == 1) { // normal key press + QChar c = keyEvent->text().at(0); + if(c.isLetterOrNumber() || c.isSpace() || c.isPunct() || c.isSymbol()) { + setFocus(); + keyPressEvent(keyEvent); + return true; + } else + return false; + } + } + return false; +} + void InputLine::keyPressEvent(QKeyEvent * event) { switch(event->key()) { case Qt::Key_Up: diff --git a/src/uisupport/inputline.h b/src/uisupport/inputline.h index ff6091d4..313a8b8e 100644 --- a/src/uisupport/inputline.h +++ b/src/uisupport/inputline.h @@ -35,6 +35,7 @@ public: protected: // virtual bool event(QEvent *); virtual void keyPressEvent(QKeyEvent * event); + virtual bool eventFilter(QObject *watched, QEvent *event); private slots: void on_returnPressed(); -- 2.20.1