X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Finputwidget.cpp;h=dc8b6a6a6b1ada1fb4c88cda00e9158f41b7fa6f;hp=3c7bec537a01dd78edcd153e55570428bc0d03f4;hb=b819fa39f3053f047f5389456570d00020051688;hpb=61563967e74a1b02e82d7d8946e33c188c72e944 diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 3c7bec53..dc8b6a6a 100644 --- a/src/qtui/inputwidget.cpp +++ b/src/qtui/inputwidget.cpp @@ -22,6 +22,7 @@ #include "action.h" #include "actioncollection.h" +#include "bufferview.h" #include "client.h" #include "iconloader.h" #include "ircuser.h" @@ -29,21 +30,32 @@ #include "networkmodel.h" #include "qtui.h" #include "qtuisettings.h" +#include "tabcompleter.h" InputWidget::InputWidget(QWidget *parent) : AbstractItemView(parent), _networkId(0) { ui.setupUi(this); - connect(ui.inputEdit, SIGNAL(sendText(QString)), this, SLOT(sendText(QString))); + connect(ui.inputEdit, SIGNAL(textEntered(QString)), this, SLOT(sendText(QString))); connect(ui.ownNick, SIGNAL(activated(QString)), this, SLOT(changeNick(QString))); - connect(this, SIGNAL(userInput(BufferInfo, QString)), Client::instance(), SIGNAL(sendInput(BufferInfo, QString))); + + layout()->setAlignment(ui.ownNick, Qt::AlignBottom); + layout()->setAlignment(ui.inputEdit, Qt::AlignBottom); + setFocusProxy(ui.inputEdit); + ui.ownNick->setFocusProxy(ui.inputEdit); ui.ownNick->setSizeAdjustPolicy(QComboBox::AdjustToContents); ui.ownNick->installEventFilter(new MouseWheelFilter(this)); ui.inputEdit->installEventFilter(new JumpKeyHandler(this)); + ui.inputEdit->setMinHeight(1); + ui.inputEdit->setMaxHeight(5); + ui.inputEdit->setMode(MultiLineEdit::MultiLine); + + new TabCompleter(ui.inputEdit); + QtUiStyleSettings s("Fonts"); s.notify("InputLine", this, SLOT(setCustomFont(QVariant))); setCustomFont(s.value("InputLine", QFont())); @@ -63,7 +75,39 @@ void InputWidget::setCustomFont(const QVariant &v) { QFont font = v.value(); if(font.family().isEmpty()) font = QApplication::font(); - ui.inputEdit->setFont(font); + ui.inputEdit->setCustomFont(font); +} + +bool InputWidget::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 && !(keyEvent->modifiers() & (Qt::ControlModifier ^ Qt::AltModifier)) ) { // normal key press + QChar c = keyEvent->text().at(0); + if(c.isLetterOrNumber() || c.isSpace() || c.isPunct() || c.isSymbol()) { + setFocus(); + QCoreApplication::sendEvent(inputLine(), keyEvent); + return true; + } else + return false; + } + } + return false; +} + +void InputWidget::keyPressEvent(QKeyEvent * event) { + if(event->matches(QKeySequence::Find)) { + QAction *act = GraphicalUi::actionCollection()->action("ToggleSearchBar"); + if(act) { + act->toggle(); + return; + } + } + AbstractItemView::keyPressEvent(event); } void InputWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { @@ -102,7 +146,7 @@ void InputWidget::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int void InputWidget::updateEnabledState() { QModelIndex currentIndex = selectionModel()->currentIndex(); - + const Network *net = Client::networkModel()->networkByIndex(currentIndex); bool enabled = false; if(net) { @@ -204,8 +248,11 @@ void InputWidget::updateNickSelector() const { return; IrcUser *me = net->me(); - if(me) - nicks[nickIdx] = net->myNick() + QString(" (+%1)").arg(me->userModes()); + if(me) { + nicks[nickIdx] = net->myNick(); + if(!me->userModes().isEmpty()) + nicks[nickIdx] += QString(" (+%1)").arg(me->userModes()); + } ui.ownNick->addItems(nicks); @@ -219,11 +266,15 @@ void InputWidget::changeNick(const QString &newNick) const { const Network *net = currentNetwork(); if(!net || net->isMyNick(newNick)) return; - emit userInput(currentBufferInfo(), QString("/nick %1").arg(newNick)); + + // we reset the nick selecter as we have no confirmation yet, that this will succeed. + // if the action succeeds it will be properly updated anyways. + updateNickSelector(); + Client::userInput(BufferInfo::fakeStatusBuffer(net->networkId()), QString("/NICK %1").arg(newNick)); } -void InputWidget::sendText(QString text) { - emit userInput(currentBufferInfo(), text); +void InputWidget::sendText(const QString &text) const { + Client::userInput(currentBufferInfo(), text); }