diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-06-30 12:30:28 (GMT) | 
|---|---|---|
| committer | Swift Review <review@swift.im> | 2014-07-09 13:04:52 (GMT) | 
| commit | 16b1f85c1a7a0310b0a722c853e5fc8dd799570b (patch) | |
| tree | a52e93753da58e6b9f3c039c6ae4b886ee30f83e /Swift/QtUI/UserSearch | |
| parent | 1edfc36235cc67d303ceb2bcf0630affc509f2f7 (diff) | |
| download | swift-contrib-16b1f85c1a7a0310b0a722c853e5fc8dd799570b.zip swift-contrib-16b1f85c1a7a0310b0a722c853e5fc8dd799570b.tar.bz2 | |
Reset QtSuggestingJIDInput when a contact has been selected.
Test-Information:
Verified that the selected contact is added to the contact list when selecting from the drop-down list or by pressing the 'Add' button and that the JID field is reset after this happens.
Change-Id: I7ef047ec9dbacf1af8635849320371f082bb3d0d
Diffstat (limited to 'Swift/QtUI/UserSearch')
4 files changed, 10 insertions, 1 deletions
| diff --git a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp index a4a4610..9b96627 100644 --- a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp +++ b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp @@ -59,118 +59,122 @@ QtSuggestingJIDInput::QtSuggestingJIDInput(QWidget* parent, SettingsProvider* se  }  QtSuggestingJIDInput::~QtSuggestingJIDInput() {  	settings_->onSettingChanged.disconnect(boost::bind(&QtSuggestingJIDInput::handleSettingsChanged, this, _1));  	delete treeViewPopup_;  }  Contact::ref QtSuggestingJIDInput::getContact() {  	if (!!currentContact_) {  		return currentContact_;  	}  	if (!text().isEmpty()) {  		JID jid(Q2PSTRING(text()));  		if (jid.isValid()) {  			Contact::ref manualContact = boost::make_shared<Contact>();  			manualContact->name = jid.toString();  			manualContact->jid = jid;  			return manualContact;  		}  	}  	return boost::shared_ptr<Contact>();  }  void QtSuggestingJIDInput::setSuggestions(const std::vector<Contact::ref>& suggestions) {  	contactListModel_->setList(suggestions);  	positionPopup();  	if (!suggestions.empty()) {  		treeViewPopup_->setCurrentIndex(contactListModel_->index(0, 0));  		showPopup();  	} else {  		currentContact_.reset();  	}  } +void QtSuggestingJIDInput::clear() { +	setText(""); +	currentContact_.reset(); +} +  void QtSuggestingJIDInput::keyPressEvent(QKeyEvent* event) {  	if (event->key() == Qt::Key_Up) {  		if (contactListModel_->rowCount() > 0) {  			int row = treeViewPopup_->currentIndex().row();  			row = (row + contactListModel_->rowCount() - 1) % contactListModel_->rowCount();  			treeViewPopup_->setCurrentIndex(contactListModel_->index(row, 0));  		}  	} else if (event->key() == Qt::Key_Down) {  		if (contactListModel_->rowCount() > 0) {  			int row = treeViewPopup_->currentIndex().row();  			row = (row + contactListModel_->rowCount() + 1) % contactListModel_->rowCount();  			treeViewPopup_->setCurrentIndex(contactListModel_->index(row, 0));  		}  	} else if (event->key() == Qt::Key_Return && treeViewPopup_->isVisible()) {  		QModelIndex index = treeViewPopup_->currentIndex();  		if (!contactListModel_->getList().empty() && index.isValid()) {  			currentContact_ = contactListModel_->getContact(index.row());  			setText(P2QSTRING(currentContact_->jid.toString()));  			hidePopup();  			clearFocus();  		} else {  			currentContact_.reset();  		}  		editingDone();  	} else {  		QLineEdit::keyPressEvent(event);  	}  }  void QtSuggestingJIDInput::handleApplicationFocusChanged(QWidget* /*old*/, QWidget* /*now*/) {  	/* Using the now argument gives use the wrong widget. This is part of the code needed  	   to prevent stealing of focus when opening a the suggestion window. */  	QWidget* now = qApp->focusWidget();  	if (!now || (now != treeViewPopup_ && now != this && !now->isAncestorOf(this) && !now->isAncestorOf(treeViewPopup_) && !this->isAncestorOf(now) && !treeViewPopup_->isAncestorOf(now))) {  		hidePopup();  	}  }  void QtSuggestingJIDInput::handleSettingsChanged(const std::string& setting) {  	if (setting == QtUISettingConstants::COMPACT_ROSTER.getKey()) {  		contactListDelegate_->setCompact(settings_->getSetting(QtUISettingConstants::COMPACT_ROSTER));  	}  }  void QtSuggestingJIDInput::handleClicked(const QModelIndex& index) {  	if (index.isValid()) {  		currentContact_ = contactListModel_->getContact(index.row()); -		setText("");  		onUserSelected(currentContact_->jid);  		hidePopup();  	}  }  void QtSuggestingJIDInput::positionPopup() {  	QDesktopWidget* desktop = QApplication::desktop();  	int screen = desktop->screenNumber(this);  	QPoint point = mapToGlobal(QPoint(0, height()));  	QRect geometry = desktop->availableGeometry(screen);  	int x = point.x();  	int y = point.y();  	int width = this->width();  	int height = 80;  	int screenWidth = geometry.x() + geometry.width();  	if (x + width > screenWidth) {  		x = screenWidth - width;  	}  	height = treeViewPopup_->sizeHintForRow(0) * contactListModel_->rowCount();  	height = height > 200 ? 200 : height;  	int marginLeft;  	int marginTop;  	int marginRight;  	int marginBottom;  	treeViewPopup_->getContentsMargins(&marginLeft, &marginTop, &marginRight, &marginBottom);  	height += marginTop + marginBottom;  	width += marginLeft + marginRight;  	treeViewPopup_->setGeometry(x, y, width, height);  	treeViewPopup_->move(x, y);  	treeViewPopup_->setMaximumWidth(width);  } diff --git a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h index 25e7d42..71cd87d 100644 --- a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h +++ b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h @@ -1,64 +1,66 @@  /*   * Copyright (c) 2013 Tobias Markmann   * Licensed under the simplified BSD license.   * See Documentation/Licenses/BSD-simplified.txt for more information.   */  /*   * Copyright (c) 2014 Kevin Smith and Remko Tronçon   * Licensed under the GNU General Public License v3.   * See Documentation/Licenses/GPLv3.txt for more information.   */  #pragma once  #include <QLineEdit>  #include <QTreeView>  #include <Swiften/Base/boost_bsignals.h>  #include <Swift/Controllers/Contact.h>  namespace Swift {  class ContactListDelegate;  class SettingsProvider;  class ContactListModel;  class QtSuggestingJIDInput : public QLineEdit {  	Q_OBJECT  	public:  		QtSuggestingJIDInput(QWidget* parent, SettingsProvider* settings);  		virtual ~QtSuggestingJIDInput();  		Contact::ref getContact();  		void setSuggestions(const std::vector<Contact::ref>& suggestions); +		void clear(); +  		boost::signal<void (const JID&)> onUserSelected;  	signals:  		void editingDone();  	protected:  		virtual void keyPressEvent(QKeyEvent* event);  	private:  		void handleSettingsChanged(const std::string& setting);  	private slots:  		void handleClicked(const QModelIndex& index);  		void handleApplicationFocusChanged(QWidget* old, QWidget* now);  	private:  		void positionPopup();  		void showPopup();  		void hidePopup();  	private:  		SettingsProvider* settings_;  		ContactListModel* contactListModel_;  		QTreeView* treeViewPopup_;  		ContactListDelegate* contactListDelegate_;  		Contact::ref currentContact_;  };  } diff --git a/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp b/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp index 8ea49c4..2c34aa6 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp @@ -26,70 +26,71 @@ namespace Swift {  QtUserSearchFirstMultiJIDPage::QtUserSearchFirstMultiJIDPage(UserSearchWindow::Type type, const QString& title, SettingsProvider* settings) {  	setupUi(this);  	setTitle(title);  	QString introText = "";  	switch (type) {  		case UserSearchWindow::AddContact:  			introText = tr("Add another user to your contact list");  			break;  		case UserSearchWindow::ChatToContact:  			introText = tr("Chat to another user");  			break;  		case UserSearchWindow::InviteToChat:  			introText = tr("Invite contact to chat");  			break;  	}  	setSubTitle(QString(tr("%1. If you know their address you can enter it directly, or you can search for them.")).arg(introText));  	contactList_ = new QtContactListWidget(this, settings);  	horizontalLayout_5->addWidget(contactList_);  	jid_ = new QtSuggestingJIDInput(this, settings);  	horizontalLayout_6->insertWidget(0, jid_);  	connect(contactList_, SIGNAL(onListChanged(std::vector<Contact::ref>)), this, SLOT(emitCompletenessCheck()));  	connect(jid_, SIGNAL(editingDone()), this, SLOT(handleEditingDone()));  	setAcceptDrops(true);  }  bool QtUserSearchFirstMultiJIDPage::isComplete() const {  	return !contactList_->getList().empty();  }  void QtUserSearchFirstMultiJIDPage::reset() { +	jid_->clear();  	reason_->clear();  }  void QtUserSearchFirstMultiJIDPage::emitCompletenessCheck() {  	emit completeChanged();  }  void QtUserSearchFirstMultiJIDPage::handleEditingDone() {  	addContactButton_->setFocus();  }  void QtUserSearchFirstMultiJIDPage::dragEnterEvent(QDragEnterEvent *event) {  	if (event->mimeData()->hasFormat("application/vnd.swift.contact-jid-list")  		|| event->mimeData()->hasFormat("application/vnd.swift.contact-jid-muc")) {  			if (!contactList_->isFull()) {  				event->acceptProposedAction();  			}  	}  }  void QtUserSearchFirstMultiJIDPage::dropEvent(QDropEvent *event) {  	if (event->mimeData()->hasFormat("application/vnd.swift.contact-jid-list")) {  		QByteArray dataBytes = event->mimeData()->data("application/vnd.swift.contact-jid-list");  		QDataStream dataStream(&dataBytes, QIODevice::ReadOnly);  		std::vector<JID> jids;  		while (!dataStream.atEnd()) {  			QString jidString;  			dataStream >> jidString;  			jids.push_back(Q2PSTRING(jidString));  		}  		onJIDsDropped(jids);  	} else if (event->mimeData()->hasFormat("application/vnd.swift.contact-jid-muc")) {  		QMessageBox* messageBox = new QMessageBox(this);  		messageBox->setText(tr("You can't invite a room to chat."));  		messageBox->setWindowTitle(tr("Error inviting room to chat")); diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp index 260ccfe..ca84759 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp @@ -126,70 +126,71 @@ void QtUserSearchWindow::handleAccepted() {  	switch(type_) {  		case AddContact:  			jid = getContactJID();  			eventStream_->send(boost::make_shared<AddContactUIEvent>(jid, detailsPage_->getName(), detailsPage_->getSelectedGroups()));  			break;  		case ChatToContact:  			if (contactVector_.size() == 1) {  				boost::shared_ptr<UIEvent> event(new RequestChatUIEvent(contactVector_[0]->jid));  				eventStream_->send(event);  				break;  			}  			foreach(Contact::ref contact, contactVector_) {  				jids.push_back(contact->jid);  			}  			eventStream_->send(boost::make_shared<CreateImpromptuMUCUIEvent>(jids, JID(), Q2PSTRING(firstMultiJIDPage_->reason_->text())));  			break;  		case InviteToChat:  			foreach(Contact::ref contact, contactVector_) {  				jids.push_back(contact->jid);  			}  			eventStream_->send(boost::make_shared<InviteToMUCUIEvent>(roomJID_, jids, Q2PSTRING(firstMultiJIDPage_->reason_->text())));  			break;  	}  }  void QtUserSearchWindow::handleContactSuggestionRequested(const QString& text) {  	std::string stdText = Q2PSTRING(text);  	onContactSuggestionsRequested(stdText);  }  void QtUserSearchWindow::addContact() {  	if (!!firstMultiJIDPage_->jid_->getContact()) {  		contactVector_.push_back(firstMultiJIDPage_->jid_->getContact()); +		firstMultiJIDPage_->jid_->clear();  	}  	firstMultiJIDPage_->contactList_->setList(contactVector_);  	firstMultiJIDPage_->emitCompletenessCheck();  	if (type_ == ChatToContact) {  		firstMultiJIDPage_->groupBox->setEnabled(supportsImpromptu_ ? 1 : (contactVector_.size() < 1));  	}  }  int QtUserSearchWindow::nextId() const {  	if (type_ == AddContact) {  		switch (currentId()) {  			case 1: return firstPage_->byJID_->isChecked() ? (type_ == AddContact ? 4 : -1) : 2;  			case 2: return 3;  			case 3: return type_ == AddContact ? 4 : -1;  			case 4: return -1;  			default: return -1;  		}  	} else {  		switch (currentId()) {  			case 1: return searchNext_ ? 2 : -1;  			case 2: return 3;  			case 3: return 1;  			case 4: return -1;  			default: return -1;  		}  	}  }  void QtUserSearchWindow::handleFirstPageRadioChange() {  	if (firstPage_->byJID_->isChecked()) {  		firstPage_->jid_->setText("");  		firstPage_->jid_->setEnabled(true);  		firstPage_->service_->setEnabled(false);  		restart();  	} @@ -241,70 +242,71 @@ JID QtUserSearchWindow::getContactJID() const {  	if (useSearchResult) {  		if (dynamic_cast<UserSearchModel*>(model_)) {  			UserSearchResult* userItem = static_cast<UserSearchResult*>(resultsPage_->results_->currentIndex().internalPointer());  			if (userItem) { /* Remember to leave this if we change to dynamic cast */  				jid = userItem->getJID();  			}  		} else {  			int row = resultsPage_->results_->currentIndex().row();  			Form::FormItem item = dynamic_cast<QtFormResultItemModel*>(model_)->getForm()->getItems().at(row);  			JID fallbackJid;  			foreach(FormField::ref field, item) {  				if (field->getType() == FormField::JIDSingleType) {  					jid = JID(field->getJIDSingleValue());  					break;  				}  				if (field->getName() == "jid") {  					fallbackJid = field->getValues()[0];  				}  			}  			if (!jid.isValid()) {  				jid = fallbackJid;  			}  		}  	}  	else {  		jid = JID(Q2PSTRING(firstPage_->jid_->text().trimmed()));  	}  	return jid;  }  void QtUserSearchWindow::addSearchedJIDToList(const JID& jid) {  	std::vector<JID> jids;  	jids.push_back(jid);  	handleJIDsAdded(jids); +	firstMultiJIDPage_->jid_->clear();  }  void QtUserSearchWindow::show() {  	clear();  	QWidget::show();  }  void QtUserSearchWindow::addSavedServices(const std::vector<JID>& services) {  	if (type_ == AddContact) {  		firstPage_->service_->clear();  		foreach (JID jid, services) {  			firstPage_->service_->addItem(P2QSTRING(jid.toString()));  		}  		firstPage_->service_->clearEditText();  	} else {  		firstMultiJIDPage_->service_->clear();  		foreach (JID jid, services) {  			firstMultiJIDPage_->service_->addItem(P2QSTRING(jid.toString()));  		}  		firstMultiJIDPage_->service_->clearEditText();  	}  }  void QtUserSearchWindow::setSearchFields(boost::shared_ptr<SearchPayload> fields) {  	fieldsPage_->fetchingThrobber_->hide();  	fieldsPage_->fetchingThrobber_->movie()->stop();  	fieldsPage_->fetchingLabel_->hide();  	fieldsPage_->instructionsLabel_->setText(fields->getInstructions() ? P2QSTRING(fields->getInstructions().get()) : "Enter search terms");  	if (fields->getForm()) {  		fieldsPage_->setFormWidget(new QtFormWidget(fields->getForm(), fieldsPage_));  	} else {  		fieldsPage_->setFormWidget(NULL);  		bool enabled[8] = {fields->getNick(), fields->getNick(), fields->getFirst(), fields->getFirst(), fields->getLast(), fields->getLast(), fields->getEMail(), fields->getEMail()};  		QWidget* legacySearchWidgets[8] = {fieldsPage_->nickInputLabel_, fieldsPage_->nickInput_, fieldsPage_->firstInputLabel_, fieldsPage_->firstInput_, fieldsPage_->lastInputLabel_, fieldsPage_->lastInput_, fieldsPage_->emailInputLabel_, fieldsPage_->emailInput_}; | 
 Swift
 Swift