summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2012-03-14 21:36:10 (GMT)
committerKevin Smith <git@kismith.co.uk>2012-03-20 18:15:37 (GMT)
commit3d27d98ccc232ae7bfacfd5a3f85f44b6c2e9cc9 (patch)
treecae0589a1826560668683d2129fe024148d4e43d /Swift/QtUI
parent138223ab9ca917420d107d95a113e7628c27bac5 (diff)
downloadswift-3d27d98ccc232ae7bfacfd5a3f85f44b6c2e9cc9.zip
swift-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.cpp71
-rw-r--r--Swift/QtUI/QtContactEditWidget.h10
-rw-r--r--Swift/QtUI/QtContactEditWindow.cpp13
-rw-r--r--Swift/QtUI/QtContactEditWindow.h3
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchDetailsPage.cpp18
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchDetailsPage.h14
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.cpp71
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.h5
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_;