From: Manuel Nickschas Date: Sun, 11 Jan 2009 11:46:28 +0000 (+0100) Subject: InputLine now regains focus on keypress X-Git-Tag: 0.4.0~243 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=dc9de5af386f61e6dc5537d04ccc8aceb8126b21;hp=a35e9270e608bfbc5b21ba47d49b3139f06b13e9 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. --- 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();