summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Maudsley <richard.maudsley@isode.com>2014-07-03 10:42:32 (GMT)
committerSwift Review <review@swift.im>2014-07-09 13:29:35 (GMT)
commit43fce94494307d1b3a866f5781528c94df7e5bca (patch)
tree13b26494ae618047e0eecd7aa35fad850a58f34c /Swift/QtUI
parent8e0e67a24bfa8d3dcdeef2f177449c2a35901b99 (diff)
downloadswift-contrib-43fce94494307d1b3a866f5781528c94df7e5bca.zip
swift-contrib-43fce94494307d1b3a866f5781528c94df7e5bca.tar.bz2
Honour 'show offline contacts' toggle when exiting roster search filter
Test-Information: Enter search term and check that toggling "show offline contacts" resets the QtFilterWidget and that the roster list is representative of the "show offline contacts" state. Ensure that "show offline contacts" behaves normally when no search term has been entered. Toggle "show offline contacts" several times to make sure it remains in-sync. Change-Id: Id92a6a65b8f38cf6806f22c175514283e05affa9
Diffstat (limited to 'Swift/QtUI')
-rw-r--r--Swift/QtUI/Roster/QtFilterWidget.cpp22
-rw-r--r--Swift/QtUI/Roster/QtFilterWidget.h3
2 files changed, 24 insertions, 1 deletions
diff --git a/Swift/QtUI/Roster/QtFilterWidget.cpp b/Swift/QtUI/Roster/QtFilterWidget.cpp
index a4c9449..64eb312 100644
--- a/Swift/QtUI/Roster/QtFilterWidget.cpp
+++ b/Swift/QtUI/Roster/QtFilterWidget.cpp
@@ -54,93 +54,113 @@ bool QtFilterWidget::eventFilter(QObject*, QEvent* event) {
event->type() == QEvent::KeyRelease ||
// InputMethodQuery got introduced in Qt 5.
#if QT_VERSION >= 0x050000
event->type() == QEvent::InputMethodQuery ||
#endif
event->type() == QEvent::InputMethod) {
event->ignore();
QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event);
if (keyEvent) {
if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) {
return false;
} else if ((keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Right) && filterLineEdit_->text().isEmpty()) {
return false;
} else if (keyEvent->key() == Qt::Key_Alt && event->type() == QEvent::KeyPress) {
isModifierSinglePressed_ = true;
} else if (keyEvent->key() == Qt::Key_Alt && event->type() == QEvent::KeyRelease && isModifierSinglePressed_) {
QPoint itemOffset(2,2);
QPoint contextMenuPosition = treeView_->visualRect(treeView_->currentIndex()).topLeft() + itemOffset;;
QApplication::postEvent(treeView_, new QContextMenuEvent(QContextMenuEvent::Keyboard, contextMenuPosition, treeView_->mapToGlobal(contextMenuPosition)));
return true;
} else if (keyEvent->key() == Qt::Key_Return) {
JID target = treeView_->selectedJID();
if (target.isValid()) {
eventStream_->send(boost::shared_ptr<UIEvent>(new RequestChatUIEvent(target)));
}
filterLineEdit_->setText("");
updateRosterFilters();
} else if (keyEvent->key() == Qt::Key_Escape) {
filterLineEdit_->setText("");
} else {
isModifierSinglePressed_ = false;
}
}
filterLineEdit_->event(event);
- filterLineEdit_->setVisible(!filterLineEdit_->text().isEmpty());
if (event->type() == QEvent::KeyRelease) {
updateRosterFilters();
}
return true;
}
return false;
}
void QtFilterWidget::popAllFilters() {
std::vector<RosterFilter*> filters = treeView_->getRoster()->getFilters();
foreach(RosterFilter* filter, filters) {
filters_.push_back(filter);
treeView_->getRoster()->removeFilter(filter);
}
+ treeView_->getRoster()->onFilterAdded.connect(boost::bind(&QtFilterWidget::handleFilterAdded, this, _1));
+ treeView_->getRoster()->onFilterRemoved.connect(boost::bind(&QtFilterWidget::handleFilterRemoved, this, _1));
}
void QtFilterWidget::pushAllFilters() {
+ treeView_->getRoster()->onFilterAdded.disconnect(boost::bind(&QtFilterWidget::handleFilterAdded, this, _1));
+ treeView_->getRoster()->onFilterRemoved.disconnect(boost::bind(&QtFilterWidget::handleFilterRemoved, this, _1));
foreach(RosterFilter* filter, filters_) {
treeView_->getRoster()->addFilter(filter);
}
filters_.clear();
}
void QtFilterWidget::updateRosterFilters() {
if (fuzzyRosterFilter_) {
if (filterLineEdit_->text().isEmpty()) {
// remove currently installed search filter and put old filters back
treeView_->getRoster()->removeFilter(fuzzyRosterFilter_);
delete fuzzyRosterFilter_;
fuzzyRosterFilter_ = NULL;
pushAllFilters();
} else {
// remove currently intsalled search filter and put new search filter in place
updateSearchFilter();
}
} else {
if (!filterLineEdit_->text().isEmpty()) {
// remove currently installed filters and put a search filter in place
popAllFilters();
updateSearchFilter();
}
}
+ filterLineEdit_->setVisible(!filterLineEdit_->text().isEmpty());
}
void QtFilterWidget::updateSearchFilter() {
if (fuzzyRosterFilter_) {
treeView_->getRoster()->removeFilter(fuzzyRosterFilter_);
delete fuzzyRosterFilter_;
fuzzyRosterFilter_ = NULL;
}
fuzzyRosterFilter_ = new FuzzyRosterFilter(Q2PSTRING(filterLineEdit_->text()));
treeView_->getRoster()->addFilter(fuzzyRosterFilter_);
treeView_->setCurrentIndex(sourceModel_->index(0, 0, sourceModel_->index(0,0)));
}
+void QtFilterWidget::handleFilterAdded(RosterFilter* filter) {
+ if (filter != fuzzyRosterFilter_) {
+ filterLineEdit_->setText("");
+ updateRosterFilters();
+ }
+}
+
+void QtFilterWidget::handleFilterRemoved(RosterFilter* filter) {
+ /* make sure we don't end up adding this one back in later */
+ filters_.erase(std::remove(filters_.begin(), filters_.end(), filter), filters_.end());
+ if (filter != fuzzyRosterFilter_) {
+ filterLineEdit_->setText("");
+ updateRosterFilters();
+ }
+}
+
}
diff --git a/Swift/QtUI/Roster/QtFilterWidget.h b/Swift/QtUI/Roster/QtFilterWidget.h
index 3e17566..d0307ea 100644
--- a/Swift/QtUI/Roster/QtFilterWidget.h
+++ b/Swift/QtUI/Roster/QtFilterWidget.h
@@ -3,46 +3,49 @@
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#pragma once
#include <vector>
#include <QBoxLayout>
#include <QWidget>
#include <Swift/Controllers/Roster/RosterFilter.h>
#include <Swift/Controllers/Roster/FuzzyRosterFilter.h>
#include <Swift/QtUI/Roster/QtTreeWidget.h>
namespace Swift {
class UIEventStream;
class QtClosableLineEdit;
class QtFilterWidget : public QWidget {
Q_OBJECT
public:
QtFilterWidget(QWidget* parent, QtTreeWidget* treeView, UIEventStream* eventStream, QBoxLayout* layout = 0);
virtual ~QtFilterWidget();
protected:
bool eventFilter(QObject*, QEvent* event);
private:
void popAllFilters();
void pushAllFilters();
void updateRosterFilters();
void updateSearchFilter();
+ void handleFilterAdded(RosterFilter* filter);
+ void handleFilterRemoved(RosterFilter* filter);
+
private:
QtClosableLineEdit* filterLineEdit_;
QtTreeWidget* treeView_;
UIEventStream* eventStream_;
std::vector<RosterFilter*> filters_;
QAbstractItemModel* sourceModel_;
FuzzyRosterFilter* fuzzyRosterFilter_;
bool isModifierSinglePressed_;
};
}