X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchannellistdlg.cpp;h=de872a740b84114fb61df566e7854355837dbd3f;hp=18bc5ef77982e59b00144658a18bd1d3c223f592;hb=158443f71d48215eea8b47b836b61afd77654b78;hpb=f824db0e31b54969e0b7fa0b5405b1e9173d482c diff --git a/src/qtui/channellistdlg.cpp b/src/qtui/channellistdlg.cpp index 18bc5ef7..de872a74 100644 --- a/src/qtui/channellistdlg.cpp +++ b/src/qtui/channellistdlg.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 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 * @@ -15,7 +15,7 @@ * 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. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "channellistdlg.h" @@ -27,133 +27,182 @@ #include "client.h" #include "clientirclisthelper.h" #include "icon.h" -#include "iconloader.h" ChannelListDlg::ChannelListDlg(QWidget *parent) - : QDialog(parent), - _listFinished(true), + : QDialog(parent), _ircListModel(this), - _sortFilter(this), - _simpleModeSpacer(0), - _advancedMode(false) + _sortFilter(this) { - _sortFilter.setSourceModel(&_ircListModel); - _sortFilter.setFilterCaseSensitivity(Qt::CaseInsensitive); - _sortFilter.setFilterKeyColumn(-1); - - ui.setupUi(this); - ui.advancedModeLabel->setPixmap(BarIcon("edit-rename")); - - ui.channelListView->setSelectionBehavior(QAbstractItemView::SelectRows); - ui.channelListView->setSelectionMode(QAbstractItemView::SingleSelection); - ui.channelListView->setAlternatingRowColors(true); - ui.channelListView->setTabKeyNavigation(false); - ui.channelListView->setModel(&_sortFilter); - ui.channelListView->setSortingEnabled(true); - ui.channelListView->verticalHeader()->hide(); - ui.channelListView->horizontalHeader()->setStretchLastSection(true); - - ui.searchChannelsButton->setAutoDefault(false); - - setWindowIcon(Icon("format-list-unordered")); - - connect(ui.advancedModeLabel, SIGNAL(clicked()), this, SLOT(toggleMode())); - connect(ui.searchChannelsButton, SIGNAL(clicked()), this, SLOT(requestSearch())); - connect(ui.channelNameLineEdit, SIGNAL(returnPressed()), this, SLOT(requestSearch())); - connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), &_sortFilter, SLOT(setFilterFixedString(QString))); - connect(Client::ircListHelper(), SIGNAL(channelListReceived(const NetworkId &, const QStringList &, QList)), - this, SLOT(receiveChannelList(NetworkId , QStringList, QList))); - connect(Client::ircListHelper(), SIGNAL(finishedListReported(const NetworkId &)), this, SLOT(reportFinishedList())); - connect(Client::ircListHelper(), SIGNAL(errorReported(const QString &)), this, SLOT(showError(const QString &))); - connect(ui.channelListView, SIGNAL(activated(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); - - setAdvancedMode(false); - enableQuery(true); - showFilterLine(false); - showErrors(false); + _sortFilter.setSourceModel(&_ircListModel); + _sortFilter.setFilterCaseSensitivity(Qt::CaseInsensitive); + _sortFilter.setFilterKeyColumn(-1); + + ui.setupUi(this); + ui.advancedModeLabel->setPixmap(icon::get("edit-rename").pixmap(22)); + + ui.channelListView->setSelectionBehavior(QAbstractItemView::SelectRows); + ui.channelListView->setSelectionMode(QAbstractItemView::SingleSelection); + ui.channelListView->setAlternatingRowColors(true); + ui.channelListView->setTabKeyNavigation(false); + ui.channelListView->setModel(&_sortFilter); + ui.channelListView->setSortingEnabled(true); + // Sort A-Z by default + ui.channelListView->sortByColumn(0, Qt::AscendingOrder); + ui.channelListView->verticalHeader()->hide(); + ui.channelListView->horizontalHeader()->setStretchLastSection(true); + + ui.searchChannelsButton->setAutoDefault(false); + + setWindowIcon(icon::get("format-list-unordered")); + + connect(ui.advancedModeLabel, SIGNAL(clicked()), this, SLOT(toggleMode())); + connect(ui.searchChannelsButton, SIGNAL(clicked()), this, SLOT(requestSearch())); + connect(ui.channelNameLineEdit, SIGNAL(returnPressed()), this, SLOT(requestSearch())); + connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), &_sortFilter, SLOT(setFilterFixedString(QString))); + connect(Client::ircListHelper(), SIGNAL(channelListReceived(const NetworkId &, const QStringList &, QList )), + this, SLOT(receiveChannelList(NetworkId, QStringList, QList ))); + connect(Client::ircListHelper(), SIGNAL(finishedListReported(const NetworkId &)), this, SLOT(reportFinishedList())); + connect(Client::ircListHelper(), SIGNAL(errorReported(const QString &)), this, SLOT(showError(const QString &))); + connect(ui.channelListView, SIGNAL(activated(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); + + setAdvancedMode(false); + enableQuery(true); + showFilterLine(false); + showErrors(false); + + // Set initial input focus + updateInputFocus(); } -void ChannelListDlg::setNetwork(NetworkId netId) { - if(_netId == netId) - return; - _netId = netId; - _ircListModel.setChannelList(); - showFilterLine(false); +void ChannelListDlg::setNetwork(NetworkId netId) +{ + if (_netId == netId) + return; + + _netId = netId; + _ircListModel.setChannelList(); + showFilterLine(false); } -void ChannelListDlg::requestSearch() { - _listFinished = false; - enableQuery(false); - showErrors(false); - QStringList channelFilters; - channelFilters << ui.channelNameLineEdit->text().trimmed(); - Client::ircListHelper()->requestChannelList(_netId, channelFilters); + +void ChannelListDlg::setChannelFilters(const QString &channelFilters) +{ + // Enable advanced mode if searching + setAdvancedMode(!channelFilters.isEmpty()); + // Set channel search text after setting advanced mode so it's not cleared + ui.channelNameLineEdit->setText(channelFilters.trimmed()); } -void ChannelListDlg::receiveChannelList(const NetworkId &netId, const QStringList &channelFilters, const QList &channelList) { - Q_UNUSED(channelFilters) - if(netId != _netId) - return; - showFilterLine(!channelList.isEmpty()); - _ircListModel.setChannelList(channelList); - enableQuery(_listFinished); +void ChannelListDlg::requestSearch() +{ + if (!_netId.isValid()) { + // No valid network set yet + return; + } + + _listFinished = false; + enableQuery(false); + showErrors(false); + QStringList channelFilters; + channelFilters << ui.channelNameLineEdit->text().trimmed(); + Client::ircListHelper()->requestChannelList(_netId, channelFilters); } -void ChannelListDlg::showFilterLine(bool show) { - ui.line->setVisible(show); - ui.filterLabel->setVisible(show); - ui.filterLineEdit->setVisible(show); + +void ChannelListDlg::receiveChannelList(const NetworkId &netId, const QStringList &channelFilters, const QList &channelList) +{ + Q_UNUSED(channelFilters) + if (netId != _netId) + return; + + showFilterLine(!channelList.isEmpty()); + _ircListModel.setChannelList(channelList); + enableQuery(_listFinished); + // Reset input focus since UI changed + updateInputFocus(); } -void ChannelListDlg::enableQuery(bool enable) { - ui.channelNameLineEdit->setEnabled(enable); - ui.searchChannelsButton->setEnabled(enable); + +void ChannelListDlg::showFilterLine(bool show) +{ + ui.line->setVisible(show); + ui.filterLabel->setVisible(show); + ui.filterLineEdit->setVisible(show); +} + + +void ChannelListDlg::enableQuery(bool enable) +{ + ui.channelNameLineEdit->setEnabled(enable); + ui.searchChannelsButton->setEnabled(enable); } -void ChannelListDlg::setAdvancedMode(bool advanced) { - _advancedMode = advanced; - if(advanced) { - if(_simpleModeSpacer) { - ui.searchLayout->removeItem(_simpleModeSpacer); - delete _simpleModeSpacer; - _simpleModeSpacer = 0; +void ChannelListDlg::setAdvancedMode(bool advanced) +{ + _advancedMode = advanced; + + if (advanced) { + if (_simpleModeSpacer) { + ui.searchLayout->removeItem(_simpleModeSpacer); + delete _simpleModeSpacer; + _simpleModeSpacer = nullptr; + } + ui.advancedModeLabel->setPixmap(icon::get("edit-clear-locationbar-rtl").pixmap(16)); } - ui.advancedModeLabel->setPixmap(BarIcon("edit-clear-locationbar-rtl")); - } else { - if(!_simpleModeSpacer) { - _simpleModeSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - ui.searchLayout->insertSpacerItem(0, _simpleModeSpacer); + else { + if (!_simpleModeSpacer) { + _simpleModeSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + ui.searchLayout->insertSpacerItem(0, _simpleModeSpacer); + } + ui.advancedModeLabel->setPixmap(icon::get("edit-rename").pixmap(16)); } - ui.advancedModeLabel->setPixmap(BarIcon("edit-rename")); - } - ui.channelNameLineEdit->clear(); - ui.channelNameLineEdit->setVisible(advanced); - ui.searchPatternLabel->setVisible(advanced); + ui.channelNameLineEdit->clear(); + ui.channelNameLineEdit->setVisible(advanced); + ui.searchPatternLabel->setVisible(advanced); } -void ChannelListDlg::showErrors(bool show) { - if(!show) { - ui.errorTextEdit->clear(); - } - ui.errorLabel->setVisible(show); - ui.errorTextEdit->setVisible(show); + +void ChannelListDlg::updateInputFocus() +{ + // Update keyboard focus to match what options are available. Prioritize the channel name + // editor as one likely won't need to filter when already limiting the list. + if (ui.channelNameLineEdit->isVisible()) { + ui.channelNameLineEdit->setFocus(); + } else if (ui.filterLineEdit->isVisible()) { + ui.filterLineEdit->setFocus(); + } +} + + +void ChannelListDlg::showErrors(bool show) +{ + if (!show) { + ui.errorTextEdit->clear(); + } + ui.errorLabel->setVisible(show); + ui.errorTextEdit->setVisible(show); } -void ChannelListDlg::reportFinishedList() { - _listFinished = true; +void ChannelListDlg::reportFinishedList() +{ + _listFinished = true; } -void ChannelListDlg::showError(const QString &error) { - showErrors(true); - ui.errorTextEdit->moveCursor(QTextCursor::End); - ui.errorTextEdit->insertPlainText(error + "\n"); + +void ChannelListDlg::showError(const QString &error) +{ + showErrors(true); + ui.errorTextEdit->moveCursor(QTextCursor::End); + ui.errorTextEdit->insertPlainText(error + "\n"); } -void ChannelListDlg::joinChannel(const QModelIndex &index) { - Client::instance()->userInput(BufferInfo::fakeStatusBuffer(_netId), QString("/JOIN %1").arg(index.sibling(index.row(), 0).data().toString())); + +void ChannelListDlg::joinChannel(const QModelIndex &index) +{ + Client::instance()->userInput(BufferInfo::fakeStatusBuffer(_netId), QString("/JOIN %1").arg(index.sibling(index.row(), 0).data().toString())); }