From ba9d9d766830eab8cc238c60a69f67c8b527aa7e Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sun, 10 Feb 2008 12:46:52 +0000 Subject: [PATCH] The Handler for the RTS-Like Keybindings is now a eventFilter aswell. --- src/qtui/inputwidget.cpp | 3 ++ src/qtui/jumpkeyhandler.cpp | 97 +++++++++++++++++++++++++++++++++++++ src/qtui/jumpkeyhandler.h | 45 +++++++++++++++++ src/qtui/mainwin.cpp | 69 ++++---------------------- src/qtui/mainwin.h | 7 +-- src/qtui/qtui.pri | 4 +- src/uisupport/inputline.cpp | 16 ------ version.inc | 4 +- 8 files changed, 159 insertions(+), 86 deletions(-) create mode 100644 src/qtui/jumpkeyhandler.cpp create mode 100644 src/qtui/jumpkeyhandler.h diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 5f316700..0745d666 100644 --- a/src/qtui/inputwidget.cpp +++ b/src/qtui/inputwidget.cpp @@ -22,6 +22,7 @@ #include "client.h" #include "networkmodel.h" +#include "jumpkeyhandler.h" InputWidget::InputWidget(QWidget *parent) : QWidget(parent), @@ -34,6 +35,8 @@ InputWidget::InputWidget(QWidget *parent) connect(ui.ownNick, SIGNAL(activated(QString)), this, SLOT(changeNick(QString))); connect(this, SIGNAL(userInput(BufferInfo, QString)), Client::instance(), SIGNAL(sendInput(BufferInfo, QString))); setFocusProxy(ui.inputEdit); + + ui.inputEdit->installEventFilter(new JumpKeyHandler(this)); } InputWidget::~InputWidget() { diff --git a/src/qtui/jumpkeyhandler.cpp b/src/qtui/jumpkeyhandler.cpp new file mode 100644 index 00000000..941c5d2e --- /dev/null +++ b/src/qtui/jumpkeyhandler.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "jumpkeyhandler.h" + +#include + +#include "client.h" +#include "networkmodel.h" +#include "buffermodel.h" + +JumpKeyHandler::JumpKeyHandler(QObject *parent) + : QObject(parent), +#ifdef Q_WS_MAC + bindModifier(Qt::ControlModifier | Qt::AltModifier), + jumpModifier(Qt::ControlModifier) +#else + bindModifier(Qt::ControlModifier), + jumpModifier(Qt::AltModifier) +#endif +{ +} + +bool JumpKeyHandler::eventFilter(QObject *obj, QEvent *event) { + if(event->type() != QEvent::KeyPress) + return QObject::eventFilter(obj, event); + + QKeyEvent *keyEvent = static_cast(event); + + const int key = keyEvent->key(); + + if(key < Qt::Key_0 || Qt::Key_9 < key) + return QObject::eventFilter(obj, event); + + if(keyEvent->modifiers() == bindModifier) { + bindKey(key); + return true; + } + + if(keyEvent->modifiers() == jumpModifier) { + jumpKey(key); + return true; + } + + return false; +} + +void JumpKeyHandler::bindKey(int key) { + QModelIndex bufferIdx = Client::bufferModel()->standardSelectionModel()->currentIndex(); + NetworkId netId = bufferIdx.data(NetworkModel::NetworkIdRole).value(); + const Network *net = Client::network(netId); + if(!net) + return; + + QString bufferName = bufferIdx.sibling(bufferIdx.row(), 0).data().toString(); + BufferId bufferId = bufferIdx.data(NetworkModel::BufferIdRole).value(); + + _keyboardJump[key] = bufferId; + CoreAccountSettings().setJumpKeyMap(_keyboardJump); + //emit statusMessage(tr("Bound Buffer %1::%2 to Key %3").arg(net->networkName()).arg(bufferName).arg(key - Qt::Key_0), 10000); + //statusBar()->showMessage(tr("Bound Buffer %1::%2 to Key %3").arg(net->networkName()).arg(bufferName).arg(key - Qt::Key_0), 10000); +} + +void JumpKeyHandler::jumpKey(int key) { + if(key < Qt::Key_0 || Qt::Key_9 < key) + return; + + if(_keyboardJump.isEmpty()) + _keyboardJump = CoreAccountSettings().jumpKeyMap(); + + if(!_keyboardJump.contains(key)) + return; + + QModelIndex source_bufferIdx = Client::networkModel()->bufferIndex(_keyboardJump[key]); + QModelIndex bufferIdx = Client::bufferModel()->mapFromSource(source_bufferIdx); + + if(bufferIdx.isValid()) + Client::bufferModel()->standardSelectionModel()->setCurrentIndex(bufferIdx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + +} diff --git a/src/qtui/jumpkeyhandler.h b/src/qtui/jumpkeyhandler.h new file mode 100644 index 00000000..ff8cd891 --- /dev/null +++ b/src/qtui/jumpkeyhandler.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef JUMPKEYHANDLER_H +#define JUMPKEYHANDLER_H + +#include +#include +#include "types.h" + +class JumpKeyHandler : public QObject { + Q_OBJECT + +public: + JumpKeyHandler(QObject *parent = 0); + + void jumpKey(int key); + void bindKey(int key); + + virtual bool eventFilter(QObject *obj, QEvent *event); + +private: + int bindModifier; + int jumpModifier; + QHash _keyboardJump; +}; + +#endif //JUMPKEYHANDLER_H diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index e977c6f7..e1763041 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -38,6 +38,7 @@ #include "verticaldock.h" #include "uisettings.h" #include "qtuisettings.h" +#include "jumpkeyhandler.h" #include "selectionmodelsynchronizer.h" #include "mappedselectionmodel.h" @@ -49,15 +50,20 @@ #include "debugconsole.h" -MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui) { +MainWin::MainWin(QtUi *_gui, QWidget *parent) + : QMainWindow(parent), + gui(_gui), + settingsDlg(new SettingsDlg(this)), + debugConsole(new DebugConsole(this)) +{ ui.setupUi(this); setWindowTitle("Quassel IRC"); setWindowIcon(QIcon(":icons/quassel-icon.png")); setWindowIconText("Quassel IRC"); statusBar()->showMessage(tr("Waiting for core...")); - settingsDlg = new SettingsDlg(this); - debugConsole = new DebugConsole(this); + + installEventFilter(new JumpKeyHandler(this)); } void MainWin::init() { @@ -445,60 +451,3 @@ void MainWin::connectOrDisconnectFromNet() { else net->requestDisconnect(); } -void MainWin::keyPressEvent(QKeyEvent *event) { -#ifdef Q_WS_MAC - int bindModifier = Qt::ControlModifier | Qt::AltModifier; - int jumpModifier = Qt::ControlModifier; -#else - int bindModifier = Qt::ControlModifier; - int jumpModifier = Qt::AltModifier; -#endif - - if(event->modifiers() == bindModifier) { - event->accept(); - return bindKey(event->key()); - } - - if(event->modifiers() == jumpModifier) { - event->accept(); - return jumpKey(event->key()); - } - - event->ignore(); -} - -void MainWin::bindKey(int key) { - if(key < Qt::Key_0 || Qt::Key_9 < key) - return; - - QModelIndex bufferIdx = Client::bufferModel()->standardSelectionModel()->currentIndex(); - NetworkId netId = bufferIdx.data(NetworkModel::NetworkIdRole).value(); - const Network *net = Client::network(netId); - if(!net) - return; - - QString bufferName = bufferIdx.sibling(bufferIdx.row(), 0).data().toString(); - BufferId bufferId = bufferIdx.data(NetworkModel::BufferIdRole).value(); - - _keyboardJump[key] = bufferId; - CoreAccountSettings().setJumpKeyMap(_keyboardJump); - statusBar()->showMessage(tr("Bound Buffer %1::%2 to Key %3").arg(net->networkName()).arg(bufferName).arg(key - Qt::Key_0), 10000); -} - -void MainWin::jumpKey(int key) { - if(key < Qt::Key_0 || Qt::Key_9 < key) - return; - - if(_keyboardJump.isEmpty()) - _keyboardJump = CoreAccountSettings().jumpKeyMap(); - - if(!_keyboardJump.contains(key)) - return; - - QModelIndex source_bufferIdx = Client::networkModel()->bufferIndex(_keyboardJump[key]); - QModelIndex bufferIdx = Client::bufferModel()->mapFromSource(source_bufferIdx); - - if(bufferIdx.isValid()) - Client::bufferModel()->standardSelectionModel()->setCurrentIndex(bufferIdx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); - -} diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 0e915cfc..40764f31 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -53,7 +53,6 @@ class MainWin : public QMainWindow { protected: void closeEvent(QCloseEvent *event); virtual void changeEvent(QEvent *event); - virtual void keyPressEvent(QKeyEvent *event); protected slots: void connectedToCore(); @@ -99,14 +98,11 @@ class MainWin : public QMainWindow { void enableMenus(); - void bindKey(int key); - void jumpKey(int key); - - QHash _keyboardJump; QSystemTrayIcon *systray; CoreConnectDlg *coreConnectDlg; SettingsDlg *settingsDlg; + DebugConsole *debugConsole; BufferId currentBuffer; QString currentProfile; @@ -118,7 +114,6 @@ class MainWin : public QMainWindow { QAction *actionEditNetworks; QList networkActions; - DebugConsole *debugConsole; friend class QtUi; }; diff --git a/src/qtui/qtui.pri b/src/qtui/qtui.pri index f4304ed1..b76a1c8e 100644 --- a/src/qtui/qtui.pri +++ b/src/qtui/qtui.pri @@ -3,11 +3,11 @@ QT_MOD = core gui network SRCS += aboutdlg.cpp bufferwidget.cpp chatline-old.cpp chatwidget.cpp coreconfigwizard.cpp coreconnectdlg.cpp configwizard.cpp debugconsole.cpp inputwidget.cpp \ mainwin.cpp nicklistwidget.cpp qtui.cpp qtuisettings.cpp qtuistyle.cpp settingsdlg.cpp settingspagedlg.cpp \ - topicwidget.cpp verticaldock.cpp + topicwidget.cpp verticaldock.cpp jumpkeyhandler.cpp HDRS += aboutdlg.h bufferwidget.h chatline-old.h chatwidget.h coreconfigwizard.h configwizard.h debugconsole.h inputwidget.h \ coreconnectdlg.h mainwin.h nicklistwidget.h qtui.h qtuisettings.h qtuistyle.h settingsdlg.h settingspagedlg.h \ - topicwidget.h verticaldock.h + topicwidget.h verticaldock.h jumpkeyhandler.h FORMNAMES = aboutdlg.ui mainwin.ui coreaccounteditdlg.ui coreconnectdlg.ui bufferviewwidget.ui bufferwidget.ui nicklistwidget.ui settingsdlg.ui \ settingspagedlg.ui topicwidget.ui debugconsole.ui inputwidget.ui \ diff --git a/src/uisupport/inputline.cpp b/src/uisupport/inputline.cpp index c297694c..31ec3991 100644 --- a/src/uisupport/inputline.cpp +++ b/src/uisupport/inputline.cpp @@ -27,30 +27,14 @@ InputLine::InputLine(QWidget *parent) idx(0), tabCompleter(new TabCompleter(this)) { - -#ifdef Q_WS_MAC - bindModifier = Qt::ControlModifier | Qt::AltModifier; - jumpModifier = Qt::ControlModifier; -#else - bindModifier = Qt::ControlModifier; - jumpModifier = Qt::AltModifier; -#endif - connect(this, SIGNAL(returnPressed()), this, SLOT(on_returnPressed())); connect(this, SIGNAL(textChanged(QString)), this, SLOT(on_textChanged(QString))); - } InputLine::~InputLine() { } void InputLine::keyPressEvent(QKeyEvent * event) { - if((event->modifiers() == jumpModifier || event->modifiers() == bindModifier) && - (Qt::Key_0 <= event->key() && event->key() <= Qt::Key_9)) { - event->ignore(); - return; - } - if(event->key() == Qt::Key_Up) { if(idx > 0) { idx--; setText(history[idx]); } event->accept(); diff --git a/version.inc b/version.inc index 129a7b33..ba5bb55b 100644 --- a/version.inc +++ b/version.inc @@ -4,8 +4,8 @@ { using namespace Global; quasselVersion = "0.2.0-pre"; - quasselDate = "2008-02-08"; - quasselBuild = 489; + quasselDate = "2008-02-10"; + quasselBuild = 495; //! Minimum client build number the core needs clientBuildNeeded = 480; -- 2.20.1