X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Finputwidget.cpp;h=be18830b0795eb1938c4f91cbed24e0e2a00adaf;hp=737387fbcfa8ffca3936742f547112523b966205;hb=a9c2f4157175cfb775980eb72c8312cdffcbfe00;hpb=ab16c77fe03b73a863d9b52b11919bcbac903f58 diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 737387fb..be18830b 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,23 +30,57 @@ #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.ownNick, SIGNAL(activated(QString)), this, SLOT(changeNick(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->installEventFilter(this); + + ui.inputEdit->setMinHeight(1); + ui.inputEdit->setMaxHeight(5); + ui.inputEdit->setMode(MultiLineEdit::MultiLine); + ui.inputEdit->setPasteProtectionEnabled(true); + + new TabCompleter(ui.inputEdit); + + UiStyleSettings fs("Fonts"); + fs.notify("UseCustomInputWidgetFont", this, SLOT(setUseCustomFont(QVariant))); + fs.notify("InputWidget", this, SLOT(setCustomFont(QVariant))); + if(fs.value("UseCustomInputWidgetFont", false).toBool()) + setCustomFont(fs.value("InputWidget", QFont())); + + UiSettings s("InputWidget"); + +#ifdef HAVE_KDE + s.notify("EnableSpellCheck", this, SLOT(setEnableSpellCheck(QVariant))); + setEnableSpellCheck(s.value("EnableSpellCheck", false)); +#endif - QtUiStyleSettings s("Fonts"); - s.notify("InputLine", this, SLOT(setCustomFont(QVariant))); - setCustomFont(s.value("InputLine", QFont())); + s.notify("ShowNickSelector", this, SLOT(setShowNickSelector(QVariant))); + setShowNickSelector(s.value("ShowNickSelector", true)); + + s.notify("MaxNumLines", this, SLOT(setMaxLines(QVariant))); + setMaxLines(s.value("MaxNumLines", 5)); + + s.notify("EnableScrollBars", this, SLOT(setScrollBarsEnabled(QVariant))); + setScrollBarsEnabled(s.value("EnableScrollBars", true)); + + s.notify("EnableMultiLine", this, SLOT(setMultiLineEnabled(QVariant))); + setMultiLineEnabled(s.value("EnableMultiLine", true)); ActionCollection *coll = QtUi::actionCollection(); @@ -53,11 +88,48 @@ InputWidget::InputWidget(QWidget *parent) connect(activateInputline, SIGNAL(triggered()), SLOT(setFocus())); activateInputline->setText(tr("Focus Input Line")); activateInputline->setShortcut(tr("Ctrl+L")); + + actionTextBold = coll->add("TextBold"); + QFont bold; + bold.setBold(true); + actionTextBold->setFont(bold); + actionTextBold->setText(tr("Bold")); + actionTextBold->setShortcut(tr("Ctrl+B")); + actionTextBold->setCheckable(true); + connect(actionTextBold, SIGNAL(triggered()), SLOT(textBold())); + + actionTextUnderline = coll->add("TextUnderline"); + QFont underline; + underline.setUnderline(true); + actionTextUnderline->setFont(underline); + actionTextUnderline->setText(tr("Underline")); + actionTextUnderline->setShortcut(tr("Ctrl+U")); + actionTextUnderline->setCheckable(true); + connect(actionTextUnderline, SIGNAL(triggered()), SLOT(textUnderline())); + + actionTextItalic = coll->add("TextItalic"); + QFont italic; + italic.setItalic(true); + actionTextItalic->setFont(italic); + actionTextItalic->setText(tr("Italic")); + actionTextItalic->setShortcut(tr("Ctrl+I")); + actionTextItalic->setCheckable(true); + connect(actionTextItalic, SIGNAL(triggered()), SLOT(textItalic())); + + connect(inputLine(), SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(currentCharFormatChanged(QTextCharFormat))); } InputWidget::~InputWidget() { } +void InputWidget::setUseCustomFont(const QVariant &v) { + if(v.toBool()) { + UiStyleSettings fs("Fonts"); + setCustomFont(fs.value("InputWidget")); + } else + setCustomFont(QFont()); +} + void InputWidget::setCustomFont(const QVariant &v) { QFont font = v.value(); if(font.family().isEmpty()) @@ -65,6 +137,57 @@ void InputWidget::setCustomFont(const QVariant &v) { ui.inputEdit->setCustomFont(font); } +void InputWidget::setEnableSpellCheck(const QVariant &v) { + ui.inputEdit->setSpellCheckEnabled(v.toBool()); +} + +void InputWidget::setShowNickSelector(const QVariant &v) { + ui.ownNick->setVisible(v.toBool()); +} + +void InputWidget::setMaxLines(const QVariant &v) { + ui.inputEdit->setMaxHeight(v.toInt()); +} + +void InputWidget::setScrollBarsEnabled(const QVariant &v) { + ui.inputEdit->setScrollBarsEnabled(v.toBool()); +} + +void InputWidget::setMultiLineEnabled(const QVariant &v) { + ui.inputEdit->setMode(v.toBool()? MultiLineEdit::MultiLine : MultiLineEdit::SingleLine); +} + +bool InputWidget::eventFilter(QObject *watched, QEvent *event) { + if(event->type() != QEvent::KeyPress) + return false; + + QKeyEvent *keyEvent = static_cast(event); + + // keys from BufferView should be sent to (and focus) the input line + BufferView *view = qobject_cast(watched); + if(view) { + 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; + } + } + return false; + } else if(watched == ui.inputEdit) { + if(keyEvent->matches(QKeySequence::Find)) { + QAction *act = GraphicalUi::actionCollection()->action("ToggleSearchBar"); + if(act) { + act->toggle(); + return true; + } + } + return false; + } + return false; +} + void InputWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_UNUSED(previous) NetworkId networkId = current.data(NetworkModel::NetworkIdRole).value(); @@ -101,7 +224,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) { @@ -208,7 +331,7 @@ void InputWidget::updateNickSelector() const { if(!me->userModes().isEmpty()) nicks[nickIdx] += QString(" (+%1)").arg(me->userModes()); } - + ui.ownNick->addItems(nicks); if(me && me->isAway()) @@ -228,10 +351,66 @@ void InputWidget::changeNick(const QString &newNick) const { Client::userInput(BufferInfo::fakeStatusBuffer(net->networkId()), QString("/NICK %1").arg(newNick)); } -void InputWidget::sendText(const QString &text) const { +void InputWidget::on_inputEdit_textEntered(const QString &text) const { Client::userInput(currentBufferInfo(), text); + actionTextBold->setChecked(false); + actionTextUnderline->setChecked(false); + actionTextItalic->setChecked(false); + inputLine()->setFontWeight(QFont::Normal); + inputLine()->setFontUnderline(false); + inputLine()->setFontItalic(false); +} + +void InputWidget::mergeFormatOnWordOrSelection(const QTextCharFormat &format) { + QTextCursor cursor = inputLine()->textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); + inputLine()->mergeCurrentCharFormat(format); +} + +void InputWidget::currentCharFormatChanged(const QTextCharFormat &format) { + fontChanged(format.font()); + colorChanged(format.foreground().color(), format.background().color()); +} + +void InputWidget::textBold() +{ + if (inputLine()->hasFocus()) { + QTextCharFormat fmt; + fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); + } } +void InputWidget::textUnderline() +{ + if (inputLine()->hasFocus()) { + QTextCharFormat fmt; + fmt.setFontUnderline(actionTextUnderline->isChecked()); + mergeFormatOnWordOrSelection(fmt); + } +} + +void InputWidget::textItalic() +{ + if (inputLine()->hasFocus()) { + QTextCharFormat fmt; + fmt.setFontItalic(actionTextItalic->isChecked()); + mergeFormatOnWordOrSelection(fmt); + } +} + +void InputWidget::fontChanged(const QFont &f) +{ + actionTextBold->setChecked(f.bold()); + actionTextItalic->setChecked(f.italic()); + actionTextUnderline->setChecked(f.underline()); +} + +void InputWidget::colorChanged(const QColor &fg, const QColor &bg) { + //TODO update colorpicker +} // MOUSE WHEEL FILTER MouseWheelFilter::MouseWheelFilter(QObject *parent)