X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Finputwidget.cpp;h=f843eced573836b4bab992e04160f420053cadb4;hp=5f5f0a03eef29d471f01258e3d241af4c7ce06b4;hb=98144aaad0cd747f186edcd0e36a1d67326ac766;hpb=9d54503555534a2c554f09a33df6afa33d6308ec diff --git a/src/qtui/inputwidget.cpp b/src/qtui/inputwidget.cpp index 5f5f0a03..f843eced 100644 --- a/src/qtui/inputwidget.cpp +++ b/src/qtui/inputwidget.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2014 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -20,17 +20,21 @@ #include "inputwidget.h" +#include +#include +#include +#include + #include "action.h" #include "actioncollection.h" #include "bufferview.h" #include "client.h" -#include "iconloader.h" +#include "icon.h" #include "ircuser.h" #include "networkmodel.h" #include "qtui.h" #include "qtuisettings.h" #include "tabcompleter.h" -#include const int leftMargin = 3; @@ -46,7 +50,7 @@ InputWidget::InputWidget(QWidget *parent) layout()->setAlignment(ui.showStyleButton, Qt::AlignBottom); layout()->setAlignment(ui.styleFrame, Qt::AlignBottom); - ui.styleFrame->setVisible(false); + setStyleOptionsExpanded(false); setFocusProxy(ui.inputEdit); ui.ownNick->setFocusProxy(ui.inputEdit); @@ -60,11 +64,10 @@ InputWidget::InputWidget(QWidget *parent) ui.inputEdit->setMode(MultiLineEdit::MultiLine); ui.inputEdit->setPasteProtectionEnabled(true); - ui.boldButton->setIcon(SmallIcon("format-text-bold")); - ui.italicButton->setIcon(SmallIcon("format-text-italic")); - ui.underlineButton->setIcon(SmallIcon("format-text-underline")); - ui.textcolorButton->setIcon(SmallIcon("format-text-color")); - ui.highlightcolorButton->setIcon(SmallIcon("format-fill-color")); + ui.boldButton->setIcon(icon::get("format-text-bold")); + ui.italicButton->setIcon(icon::get("format-text-italic")); + ui.underlineButton->setIcon(icon::get("format-text-underline")); + ui.clearButton->setIcon(icon::get("edit-clear")); ui.encryptionIconLabel->hide(); _colorMenu = new QMenu(); @@ -86,10 +89,25 @@ InputWidget::InputWidget(QWidget *parent) _colorFillMenu->addAction(pix, tr("Clear Color"))->setData(""); ui.textcolorButton->setMenu(_colorMenu); + // Set the default action to clear color (last added action) + ui.textcolorButton->setDefaultAction(_colorMenu->actions().last()); connect(_colorMenu, SIGNAL(triggered(QAction *)), this, SLOT(colorChosen(QAction *))); + ui.highlightcolorButton->setMenu(_colorFillMenu); + // Set the default action to clear fill color (last added action) + ui.highlightcolorButton->setDefaultAction(_colorFillMenu->actions().last()); connect(_colorFillMenu, SIGNAL(triggered(QAction *)), this, SLOT(colorHighlightChosen(QAction *))); + // Needs to be done after adding the menu, otherwise the icon mysteriously vanishes until clicked + ui.textcolorButton->setIcon(icon::get("format-text-color")); + ui.highlightcolorButton->setIcon(icon::get("format-fill-color")); + + // Show/hide style button + connect(ui.showStyleButton, SIGNAL(toggled(bool)), this, SLOT(setStyleOptionsExpanded(bool))); + + // Clear formatting button + connect(ui.clearButton, SIGNAL(clicked()), this, SLOT(clearFormat())); + new TabCompleter(ui.inputEdit); UiStyleSettings fs("Fonts"); @@ -100,11 +118,6 @@ InputWidget::InputWidget(QWidget *parent) UiSettings s("InputWidget"); -#ifdef HAVE_KDE - s.notify("EnableSpellCheck", this, SLOT(setEnableSpellCheck(QVariant))); - setEnableSpellCheck(s.value("EnableSpellCheck", false)); -#endif - s.notify("EnableEmacsMode", this, SLOT(setEnableEmacsMode(QVariant))); setEnableEmacsMode(s.value("EnableEmacsMode", false)); @@ -115,7 +128,7 @@ InputWidget::InputWidget(QWidget *parent) setShowStyleButtons(s.value("ShowStyleButtons", true)); s.notify("EnablePerChatHistory", this, SLOT(setEnablePerChatHistory(QVariant))); - setEnablePerChatHistory(s.value("EnablePerChatHistory", false)); + setEnablePerChatHistory(s.value("EnablePerChatHistory", true)); s.notify("MaxNumLines", this, SLOT(setMaxLines(QVariant))); setMaxLines(s.value("MaxNumLines", 5)); @@ -123,12 +136,15 @@ InputWidget::InputWidget(QWidget *parent) s.notify("EnableScrollBars", this, SLOT(setScrollBarsEnabled(QVariant))); setScrollBarsEnabled(s.value("EnableScrollBars", true)); + s.notify("EnableLineWrap", this, SLOT(setLineWrapEnabled(QVariant))); + setLineWrapEnabled(s.value("EnableLineWrap", true)); + s.notify("EnableMultiLine", this, SLOT(setMultiLineEnabled(QVariant))); setMultiLineEnabled(s.value("EnableMultiLine", true)); ActionCollection *coll = QtUi::actionCollection(); - Action *activateInputline = coll->add("FocusInputLine"); + auto *activateInputline = coll->add("FocusInputLine"); connect(activateInputline, SIGNAL(triggered()), SLOT(setFocus())); activateInputline->setText(tr("Focus Input Line")); activateInputline->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); @@ -138,11 +154,6 @@ InputWidget::InputWidget(QWidget *parent) } -InputWidget::~InputWidget() -{ -} - - void InputWidget::setUseCustomFont(const QVariant &v) { if (v.toBool()) { @@ -168,12 +179,6 @@ void InputWidget::setCustomFont(const QVariant &v) } -void InputWidget::setEnableSpellCheck(const QVariant &v) -{ - ui.inputEdit->setSpellCheckEnabled(v.toBool()); -} - - void InputWidget::setEnableEmacsMode(const QVariant &v) { ui.inputEdit->setEmacsMode(v.toBool()); @@ -210,6 +215,12 @@ void InputWidget::setScrollBarsEnabled(const QVariant &v) } +void InputWidget::setLineWrapEnabled(const QVariant &v) +{ + ui.inputEdit->setLineWrapEnabled(v.toBool()); +} + + void InputWidget::setMultiLineEnabled(const QVariant &v) { ui.inputEdit->setMode(v.toBool() ? MultiLineEdit::MultiLine : MultiLineEdit::SingleLine); @@ -221,10 +232,10 @@ bool InputWidget::eventFilter(QObject *watched, QEvent *event) if (event->type() != QEvent::KeyPress) return false; - QKeyEvent *keyEvent = static_cast(event); + auto *keyEvent = static_cast(event); // keys from BufferView should be sent to (and focus) the input line - BufferView *view = qobject_cast(watched); + auto *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); @@ -293,11 +304,11 @@ void InputWidget::dataChanged(const QModelIndex &topLeft, const QModelIndex &bot bool encrypted = false; - IrcChannel *chan = qobject_cast(Client::bufferModel()->data(selectionModel()->currentIndex(), NetworkModel::IrcChannelRole).value()); + auto *chan = qobject_cast(Client::bufferModel()->data(selectionModel()->currentIndex(), NetworkModel::IrcChannelRole).value()); if (chan) encrypted = chan->encrypted(); - IrcUser *user = qobject_cast(Client::bufferModel()->data(selectionModel()->currentIndex(), NetworkModel::IrcUserRole).value()); + auto *user = qobject_cast(Client::bufferModel()->data(selectionModel()->currentIndex(), NetworkModel::IrcUserRole).value()); if (user) encrypted = user->encrypted(); @@ -358,7 +369,51 @@ const Network *InputWidget::currentNetwork() const BufferInfo InputWidget::currentBufferInfo() const { return selectionModel()->currentIndex().data(NetworkModel::BufferInfoRole).value(); -}; +} + + +void InputWidget::applyFormatActiveColor() +{ + if (!ui.textcolorButton->defaultAction()) { + return; + } + colorChosen(ui.textcolorButton->defaultAction()); +} + + +void InputWidget::applyFormatActiveColorFill() +{ + if (!ui.highlightcolorButton->defaultAction()) { + return; + } + colorHighlightChosen(ui.highlightcolorButton->defaultAction()); +} + + +void InputWidget::toggleFormatBold() +{ + setFormatBold(!ui.boldButton->isChecked()); +} + + +void InputWidget::toggleFormatItalic() +{ + setFormatItalic(!ui.italicButton->isChecked()); +} + + +void InputWidget::toggleFormatUnderline() +{ + setFormatUnderline(!ui.underlineButton->isChecked()); +} + + +void InputWidget::clearFormat() +{ + // Clear all formatting for selection (not global) + setFormatClear(false); +} + void InputWidget::setNetwork(NetworkId networkId) { @@ -367,9 +422,9 @@ void InputWidget::setNetwork(NetworkId networkId) const Network *previousNet = Client::network(_networkId); if (previousNet) { - disconnect(previousNet, 0, this, 0); + disconnect(previousNet, nullptr, this, nullptr); if (previousNet->me()) - disconnect(previousNet->me(), 0, this, 0); + disconnect(previousNet->me(), nullptr, this, nullptr); } _networkId = networkId; @@ -412,7 +467,7 @@ void InputWidget::setIdentity(IdentityId identityId) const Identity *previousIdentity = Client::identity(_identityId); if (previousIdentity) - disconnect(previousIdentity, 0, this, 0); + disconnect(previousIdentity, nullptr, this, nullptr); _identityId = identityId; @@ -461,7 +516,7 @@ void InputWidget::updateNickSelector() const ui.ownNick->addItems(nicks); if (me && me->isAway()) - ui.ownNick->setItemData(nickIdx, SmallIcon("user-away"), Qt::DecorationRole); + ui.ownNick->setItemData(nickIdx, icon::get({"im-user-away", "user-away"}), Qt::DecorationRole); ui.ownNick->setCurrentIndex(nickIdx); } @@ -483,23 +538,65 @@ void InputWidget::changeNick(const QString &newNick) const void InputWidget::onTextEntered(const QString &text) { Client::userInput(currentBufferInfo(), text); - ui.boldButton->setChecked(false); - ui.underlineButton->setChecked(false); - ui.italicButton->setChecked(false); + // Remove formatting from entered text + // TODO: Offer a way to convert pasted text to mIRC formatting codes + setFormatClear(true); +} + + +void InputWidget::setFormatClear(const bool global) +{ + // Apply formatting QTextCharFormat fmt; fmt.setFontWeight(QFont::Normal); fmt.setFontUnderline(false); fmt.setFontItalic(false); fmt.clearForeground(); fmt.clearBackground(); - inputLine()->setCurrentCharFormat(fmt); + if (global) { + inputLine()->setCurrentCharFormat(fmt); + } else { + setFormatOnSelection(fmt); + } -#ifdef HAVE_KDE - // Set highlighter back to active in case it was deactivated by too many errors. - if (ui.inputEdit->highlighter()) - ui.inputEdit->highlighter()->setActive(true); -#endif + // Make sure UI state follows + ui.boldButton->setChecked(false); + ui.italicButton->setChecked(false); + ui.underlineButton->setChecked(false); +} + + +void InputWidget::setFormatBold(const bool bold) +{ + // Apply formatting + QTextCharFormat fmt; + fmt.setFontWeight(bold ? QFont::Bold : QFont::Normal); + mergeFormatOnSelection(fmt); + // Make sure UI state follows + ui.boldButton->setChecked(bold); +} + + +void InputWidget::setFormatItalic(const bool italic) +{ + // Apply formatting + QTextCharFormat fmt; + fmt.setFontItalic(italic); + mergeFormatOnSelection(fmt); + // Make sure UI state follows + ui.italicButton->setChecked(italic); +} + + +void InputWidget::setFormatUnderline(const bool underline) +{ + // Apply formatting + QTextCharFormat fmt; + fmt.setFontUnderline(underline); + mergeFormatOnSelection(fmt); + // Make sure UI state follows + ui.underlineButton->setChecked(underline); } @@ -526,6 +623,19 @@ QTextCharFormat InputWidget::getFormatOfWordOrSelection() } +void InputWidget::setStyleOptionsExpanded(bool expanded) +{ + ui.styleFrame->setVisible(expanded); + if (expanded) { + ui.showStyleButton->setArrowType(Qt::LeftArrow); + ui.showStyleButton->setToolTip(tr("Hide formatting options")); + } else { + ui.showStyleButton->setArrowType(Qt::RightArrow); + ui.showStyleButton->setToolTip(tr("Show formatting options")); + } +} + + void InputWidget::currentCharFormatChanged(const QTextCharFormat &format) { fontChanged(format.font()); @@ -534,25 +644,19 @@ void InputWidget::currentCharFormatChanged(const QTextCharFormat &format) void InputWidget::on_boldButton_clicked(bool checked) { - QTextCharFormat fmt; - fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal); - mergeFormatOnSelection(fmt); + setFormatBold(checked); } void InputWidget::on_underlineButton_clicked(bool checked) { - QTextCharFormat fmt; - fmt.setFontUnderline(checked); - mergeFormatOnSelection(fmt); + setFormatUnderline(checked); } void InputWidget::on_italicButton_clicked(bool checked) { - QTextCharFormat fmt; - fmt.setFontItalic(checked); - mergeFormatOnSelection(fmt); + setFormatItalic(checked); } @@ -568,19 +672,19 @@ void InputWidget::colorChosen(QAction *action) { QTextCharFormat fmt; QColor color; - if (qVariantValue(action->data()) == "") { + if (action->data().value() == "") { color = Qt::transparent; fmt = getFormatOfWordOrSelection(); fmt.clearForeground(); setFormatOnSelection(fmt); } else { - color = QColor(inputLine()->rgbColorFromMirc(qVariantValue(action->data()))); + color = QColor(inputLine()->rgbColorFromMirc(action->data().value())); fmt.setForeground(color); mergeFormatOnSelection(fmt); } ui.textcolorButton->setDefaultAction(action); - ui.textcolorButton->setIcon(createColorToolButtonIcon(SmallIcon("format-text-color"), color)); + ui.textcolorButton->setIcon(createColorToolButtonIcon(icon::get("format-text-color"), color)); } @@ -588,31 +692,25 @@ void InputWidget::colorHighlightChosen(QAction *action) { QTextCharFormat fmt; QColor color; - if (qVariantValue(action->data()) == "") { + if (action->data().value() == "") { color = Qt::transparent; fmt = getFormatOfWordOrSelection(); fmt.clearBackground(); setFormatOnSelection(fmt); } else { - color = QColor(inputLine()->rgbColorFromMirc(qVariantValue(action->data()))); + color = QColor(inputLine()->rgbColorFromMirc(action->data().value())); fmt.setBackground(color); mergeFormatOnSelection(fmt); } ui.highlightcolorButton->setDefaultAction(action); - ui.highlightcolorButton->setIcon(createColorToolButtonIcon(SmallIcon("format-fill-color"), color)); + ui.highlightcolorButton->setIcon(createColorToolButtonIcon(icon::get("format-fill-color"), color)); } void InputWidget::on_showStyleButton_toggled(bool checked) { - ui.styleFrame->setVisible(checked); - if (checked) { - ui.showStyleButton->setArrowType(Qt::LeftArrow); - } - else { - ui.showStyleButton->setArrowType(Qt::RightArrow); - } + setStyleOptionsExpanded(checked); }