InputLine now regains focus on keypress
authorManuel Nickschas <sputnick@quassel-irc.org>
Sun, 11 Jan 2009 11:46:28 +0000 (12:46 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 11 Jan 2009 11:46:28 +0000 (12:46 +0100)
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
src/qtui/mainwin.h
src/uisupport/inputline.cpp
src/uisupport/inputline.h

index e7205af..fcd854e 100644 (file)
@@ -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() {
index cc8d8d1..2d80e64 100644 (file)
@@ -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<BufferViewDock *> _bufferViews;
     BufferWidget *_bufferWidget;
     NickListWidget *_nickListWidget;
+    InputWidget *_inputWidget;
 
     QMenu *_fileMenu, *_networksMenu, *_viewMenu, *_bufferViewsMenu, *_settingsMenu, *_helpMenu, *_helpDebugMenu;
 
index 60f34fb..745a3e3 100644 (file)
@@ -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<BufferView *>(watched);
+  if(view) {
+    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(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:
index ff6091d..313a8b8 100644 (file)
@@ -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();