diff options
author | Tobias Markmann <tm@ayena.de> | 2012-03-14 21:36:10 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2012-03-20 18:15:37 (GMT) |
commit | 3d27d98ccc232ae7bfacfd5a3f85f44b6c2e9cc9 (patch) | |
tree | cae0589a1826560668683d2129fe024148d4e43d /Swift/QtUI | |
parent | 138223ab9ca917420d107d95a113e7628c27bac5 (diff) | |
download | swift-contrib-3d27d98ccc232ae7bfacfd5a3f85f44b6c2e9cc9.zip swift-contrib-3d27d98ccc232ae7bfacfd5a3f85f44b6c2e9cc9.tar.bz2 |
Naming suggestion for 'Add Contact'-dialog and "Edit Contact"-dialog based on vCards.
License: This patch is BSD-licensed, see http://www.opensource.org/licenses/bsd-license.php
Diffstat (limited to 'Swift/QtUI')
-rw-r--r-- | Swift/QtUI/QtContactEditWidget.cpp | 71 | ||||
-rw-r--r-- | Swift/QtUI/QtContactEditWidget.h | 10 | ||||
-rw-r--r-- | Swift/QtUI/QtContactEditWindow.cpp | 13 | ||||
-rw-r--r-- | Swift/QtUI/QtContactEditWindow.h | 3 | ||||
-rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp | 18 | ||||
-rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h | 14 | ||||
-rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchWindow.cpp | 71 | ||||
-rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchWindow.h | 5 |
8 files changed, 161 insertions, 44 deletions
diff --git a/Swift/QtUI/QtContactEditWidget.cpp b/Swift/QtUI/QtContactEditWidget.cpp index a5134e4..a80eb38 100644 --- a/Swift/QtUI/QtContactEditWidget.cpp +++ b/Swift/QtUI/QtContactEditWidget.cpp @@ -8,28 +8,36 @@ #include <algorithm> -#include <QScrollArea> #include <QBoxLayout> -#include <QLabel> #include <QCheckBox> +#include <QLabel> #include <QLineEdit> +#include <QMovie> +#include <QScrollArea> +#include <QRadioButton> #include "Swift/QtUI/QtSwiftUtil.h" namespace Swift { -QtContactEditWidget::QtContactEditWidget(const std::set<std::string>& allGroups, QWidget* parent) : QWidget(parent), groups_(NULL) { +QtContactEditWidget::QtContactEditWidget(const std::set<std::string>& allGroups, QWidget* parent) : QWidget(parent), nameRadioButton_(NULL), groups_(NULL) { QBoxLayout* layout = new QVBoxLayout(this); setContentsMargins(0,0,0,0); layout->setContentsMargins(0,0,0,0); - QHBoxLayout* nameLayout = new QHBoxLayout(); - - QLabel* label = new QLabel(tr("Name:"), this); - nameLayout->addWidget(label); + nameLayout_ = new QHBoxLayout(); + suggestionsLayout_ = new QHBoxLayout(); + nameLayout_->addLayout(suggestionsLayout_); + name_ = new QLineEdit(this); - nameLayout->addWidget(name_); - layout->addLayout(nameLayout); + nameLayout_->addWidget(name_); + + throbberLabel_ = new QLabel(this); + throbberLabel_->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), this)); + throbberLabel_->movie()->start(); + nameLayout_->addWidget(throbberLabel_); + + layout->addLayout(nameLayout_); layout->addWidget(new QLabel(tr("Groups:"), this)); @@ -68,7 +76,19 @@ void QtContactEditWidget::setName(const std::string& name) { } std::string QtContactEditWidget::getName() const { - return Q2PSTRING(name_->text()); + std::string name; + QList<QRadioButton*> buttons = findChildren<QRadioButton*>(); + foreach(const QRadioButton* button, buttons) { + if (button->isChecked()) { + if (button == nameRadioButton_) { + name = Q2PSTRING(name_->text()); + } else { + name = Q2PSTRING(button->text()); + } + break; + } + } + return name; } void QtContactEditWidget::setSelectedGroups(const std::vector<std::string>& groups) { @@ -90,11 +110,42 @@ std::set<std::string> QtContactEditWidget::getSelectedGroups() const { return groups; } +void QtContactEditWidget::setNameSuggestions(const std::vector<std::string>& suggestions) { + throbberLabel_->movie()->stop(); + throbberLabel_->hide(); + + foreach(const std::string& name, suggestions) { + suggestionsLayout_->insertWidget(nameLayout_->count() - 2, new QRadioButton(P2QSTRING(name), this)); + } + + nameRadioButton_ = new QRadioButton(tr("Name:"), this); + suggestionsLayout_->insertWidget(nameLayout_->count(), nameRadioButton_); + + if (name_->text().isEmpty()) { + QRadioButton* suggestedRadioButton = dynamic_cast<QRadioButton*>(suggestionsLayout_->itemAt(0)->widget()); + if (suggestedRadioButton) { + suggestedRadioButton->setChecked(true); + } + } else { + nameRadioButton_->setChecked(true); + } +} + void QtContactEditWidget::clear() { name_->clear(); setSelectedGroups(std::vector<std::string>()); newGroup_->setChecked(false); newGroupName_->clear(); + throbberLabel_->movie()->start(); + throbberLabel_->show(); + + // clear suggestions + while(suggestionsLayout_->count() != 0) { + QLayoutItem *layoutItem = suggestionsLayout_->takeAt(0); + delete layoutItem->widget(); + delete layoutItem; + } + nameRadioButton_ = NULL; } } diff --git a/Swift/QtUI/QtContactEditWidget.h b/Swift/QtUI/QtContactEditWidget.h index 8ff267d..5350762 100644 --- a/Swift/QtUI/QtContactEditWidget.h +++ b/Swift/QtUI/QtContactEditWidget.h @@ -12,10 +12,14 @@ #include <QWidget> +#include <vector> #include <string> +class QLabel; class QLineEdit; class QCheckBox; +class QHBoxLayout; +class QRadioButton; namespace Swift { class QtContactEditWidget : public QWidget { @@ -30,15 +34,21 @@ namespace Swift { void setSelectedGroups(const std::vector<std::string>& groups); std::set<std::string> getSelectedGroups() const; + void setNameSuggestions(const std::vector<std::string>& suggestions); + void clear(); private: typedef std::map<std::string, QCheckBox*> CheckBoxMap; CheckBoxMap checkBoxes_; + QHBoxLayout* nameLayout_; + QHBoxLayout* suggestionsLayout_; + QRadioButton* nameRadioButton_; QLineEdit* name_; QWidget* groups_; QCheckBox* newGroup_; QLineEdit* newGroupName_; + QLabel* throbberLabel_; }; } diff --git a/Swift/QtUI/QtContactEditWindow.cpp b/Swift/QtUI/QtContactEditWindow.cpp index 9b24b23..6520c0a 100644 --- a/Swift/QtUI/QtContactEditWindow.cpp +++ b/Swift/QtUI/QtContactEditWindow.cpp @@ -8,6 +8,8 @@ #include <algorithm> +#include <boost/bind.hpp> + #include <QScrollArea> #include <QBoxLayout> #include <QLabel> @@ -22,7 +24,7 @@ namespace Swift { QtContactEditWindow::QtContactEditWindow() : contactEditWidget_(NULL) { - resize(300,300); + resize(400,300); setWindowTitle(tr("Edit contact")); setContentsMargins(0,0,0,0); @@ -48,6 +50,15 @@ QtContactEditWindow::QtContactEditWindow() : contactEditWidget_(NULL) { buttonLayout->addWidget(okButton); } +QtContactEditWindow::~QtContactEditWindow() { +} + +void QtContactEditWindow::setNameSuggestions(const std::vector<std::string>& nameSuggestions) { + if (contactEditWidget_) { + contactEditWidget_->setNameSuggestions(nameSuggestions); + } +} + void QtContactEditWindow::setContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, const std::set<std::string>& allGroups) { delete contactEditWidget_; jid_ = jid; diff --git a/Swift/QtUI/QtContactEditWindow.h b/Swift/QtUI/QtContactEditWindow.h index b25e8b9..5392b10 100644 --- a/Swift/QtUI/QtContactEditWindow.h +++ b/Swift/QtUI/QtContactEditWindow.h @@ -11,6 +11,7 @@ #include <Swift/Controllers/UIInterfaces/ContactEditWindow.h> #include <string> #include <Swiften/JID/JID.h> +#include <Swiften/Elements/VCard.h> class QLabel; class QVBoxLayout; @@ -23,7 +24,9 @@ namespace Swift { public: QtContactEditWindow(); + virtual ~QtContactEditWindow(); + virtual void setNameSuggestions(const std::vector<std::string>& nameSuggestions); virtual void setContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, const std::set<std::string>& allGroups); void setEnabled(bool); diff --git a/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp b/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp index 779e547..da89a8d 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp @@ -8,6 +8,11 @@ #include <QVBoxLayout> +#include <boost/bind.hpp> + +#include <Swiften/Base/boost_bsignals.h> +#include <Swiften/JID/JID.h> + #include <Swift/QtUI/QtContactEditWidget.h> namespace Swift { @@ -19,6 +24,18 @@ QtUserSearchDetailsPage::QtUserSearchDetailsPage(const std::set<std::string>& gr layout->addWidget(editWidget); } +QtUserSearchDetailsPage::~QtUserSearchDetailsPage() { + +} + +void QtUserSearchDetailsPage::setJID(const JID& jid) { + contactJID = jid; +} + +void QtUserSearchDetailsPage::setNameSuggestions(const std::vector<std::string>& nameSuggestions) { + editWidget->setNameSuggestions(nameSuggestions); +} + std::set<std::string> QtUserSearchDetailsPage::getSelectedGroups() { return editWidget->getSelectedGroups(); } @@ -31,5 +48,4 @@ void QtUserSearchDetailsPage::clear() { editWidget->clear(); } - } diff --git a/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h b/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h index 70afcba..9409493 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h +++ b/Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h @@ -7,8 +7,13 @@ #pragma once #include <QWizardPage> + #include <set> +#include <string> +#include <vector> +#include <Swiften/Elements/VCard.h> +#include <Swiften/JID/JID.h> #include <Swift/QtUI/UserSearch/ui_QtUserSearchFieldsPage.h> namespace Swift { @@ -18,6 +23,10 @@ namespace Swift { Q_OBJECT public: QtUserSearchDetailsPage(const std::set<std::string>& availableGroups); + virtual ~QtUserSearchDetailsPage(); + + void setJID(const JID& jid); + void setNameSuggestions(const std::vector<std::string>& nameSuggestions); std::set<std::string> getSelectedGroups(); std::string getName(); @@ -25,9 +34,10 @@ namespace Swift { void clear(); signals: - void onUserTriggersFinish(); + void onUserTriggersFinish(); private: - QtContactEditWidget* editWidget; + QtContactEditWidget* editWidget; + JID contactJID; }; } diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp index 933612c..53eac07 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp @@ -90,6 +90,8 @@ void QtUserSearchWindow::handleCurrentChanged(int page) { } else if (page == 4) { detailsPage_->clear(); + detailsPage_->setJID(getContactJID()); + onNameSuggestionRequested(getContactJID()); } lastPage_ = page; } @@ -99,35 +101,7 @@ JID QtUserSearchWindow::getServerToSearch() { } void QtUserSearchWindow::handleAccepted() { - JID jid; - if (!firstPage_->byJID_->isChecked()) { - 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 (boost::dynamic_pointer_cast<JIDSingleFormField>(field)) { - jid = JID(field->getRawValues().at(0)); - break; - } - if (field->getName() == "jid") { - fallbackJid = field->getRawValues().at(0); - } - } - if (!jid.isValid()) { - jid = fallbackJid; - } - } - } - else { - jid = JID(Q2PSTRING(firstPage_->jid_->text())); - } + JID jid = getContactJID(); if (type_ == AddContact) { eventStream_->send(boost::make_shared<AddContactUIEvent>(jid, detailsPage_->getName(), detailsPage_->getSelectedGroups())); @@ -190,6 +164,39 @@ void QtUserSearchWindow::handleSearch() { onSearchRequested(search, getServerToSearch()); } +JID QtUserSearchWindow::getContactJID() const { + JID jid; + if (!firstPage_->byJID_->isChecked()) { + 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 (boost::dynamic_pointer_cast<JIDSingleFormField>(field)) { + jid = JID(field->getRawValues().at(0)); + break; + } + if (field->getName() == "jid") { + fallbackJid = field->getRawValues().at(0); + } + } + if (!jid.isValid()) { + jid = fallbackJid; + } + } + } + else { + jid = JID(Q2PSTRING(firstPage_->jid_->text())); + } + return jid; +} + void QtUserSearchWindow::show() { clear(); QWidget::show(); @@ -223,6 +230,12 @@ void QtUserSearchWindow::setSearchFields(boost::shared_ptr<SearchPayload> fields fieldsPage_->emitCompletenessCheck(); } +void QtUserSearchWindow::setNameSuggestions(const std::vector<std::string>& suggestions) { + if (detailsPage_) { + detailsPage_->setNameSuggestions(suggestions); + } +} + void QtUserSearchWindow::setResults(const std::vector<UserSearchResult>& results) { UserSearchModel *newModel = new UserSearchModel(); newModel->setResults(results); diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.h b/Swift/QtUI/UserSearch/QtUserSearchWindow.h index 4cfe93f..9173ba9 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.h +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.h @@ -38,7 +38,9 @@ namespace Swift { virtual void setSelectedService(const JID& jid); virtual void setServerSupportsSearch(bool error); virtual void setSearchError(bool error); - virtual void setSearchFields(boost::shared_ptr<SearchPayload> fields) ; + virtual void setSearchFields(boost::shared_ptr<SearchPayload> fields); + virtual void setNameSuggestions(const std::vector<std::string>& suggestions); + protected: virtual int nextId() const; private slots: @@ -50,6 +52,7 @@ namespace Swift { void setError(const QString& error); JID getServerToSearch(); void handleSearch(); + JID getContactJID() const; private: UIEventStream* eventStream_; |