From e520ec1c7521c855e8d91748ed661b9848c324a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Mon, 7 Feb 2011 21:39:05 +0100
Subject: Split contact editing out into separate widget.


diff --git a/Swift/Controllers/ContactEditController.cpp b/Swift/Controllers/ContactEditController.cpp
index a8f7811..de99895 100644
--- a/Swift/Controllers/ContactEditController.cpp
+++ b/Swift/Controllers/ContactEditController.cpp
@@ -60,14 +60,13 @@ void ContactEditController::handleRemoveContactRequest() {
 	contactEditWindow->hide();
 }
 
-void ContactEditController::handleChangeContactRequest(const String& name, const std::vector<String>& groups) {
+void ContactEditController::handleChangeContactRequest(const String& name, const std::set<String>& newGroups) {
 	std::vector<String> oldGroupsVector = currentContact->getGroups();
 	std::set<String> oldGroups(oldGroupsVector.begin(), oldGroupsVector.end());
-	std::set<String> newGroups(groups.begin(), groups.end());
 	if (oldGroups != newGroups || currentContact->getName() != name) {
 		XMPPRosterItem newContact(*currentContact);
 		newContact.setName(name);
-		newContact.setGroups(groups);
+		newContact.setGroups(std::vector<String>(newGroups.begin(), newGroups.end()));
 		rosterController->updateItem(newContact);
 	}
 	contactEditWindow->hide();
diff --git a/Swift/Controllers/ContactEditController.h b/Swift/Controllers/ContactEditController.h
index 31917b1..b5c8101 100644
--- a/Swift/Controllers/ContactEditController.h
+++ b/Swift/Controllers/ContactEditController.h
@@ -7,6 +7,7 @@
 #pragma once
 
 #include <vector>
+#include <set>
 #include <boost/optional.hpp>
 
 #include <Swiften/JID/JID.h>
@@ -29,7 +30,7 @@ namespace Swift {
 
 		private:
 			void handleRemoveContactRequest();
-			void handleChangeContactRequest(const String& name, const std::vector<String>& groups);
+			void handleChangeContactRequest(const String& name, const std::set<String>& groups);
 
 		private:
 			void handleUIEvent(UIEvent::ref event);
diff --git a/Swift/Controllers/UIInterfaces/ContactEditWindow.h b/Swift/Controllers/UIInterfaces/ContactEditWindow.h
index 3feb718..fe552c2 100644
--- a/Swift/Controllers/UIInterfaces/ContactEditWindow.h
+++ b/Swift/Controllers/UIInterfaces/ContactEditWindow.h
@@ -28,6 +28,6 @@ namespace Swift {
 			virtual void hide() = 0;
 
 			boost::signal<void ()> onRemoveContactRequest;
-			boost::signal<void (const String& /* name */, const std::vector<String>& /* groups */)> onChangeContactRequest;
+			boost::signal<void (const String& /* name */, const std::set<String>& /* groups */)> onChangeContactRequest;
 	};
 }
diff --git a/Swift/QtUI/QtContactEditWidget.cpp b/Swift/QtUI/QtContactEditWidget.cpp
index 50d964b..1f97a37 100644
--- a/Swift/QtUI/QtContactEditWidget.cpp
+++ b/Swift/QtUI/QtContactEditWidget.cpp
@@ -21,6 +21,7 @@ namespace Swift {
 QtContactEditWidget::QtContactEditWidget(const std::set<String>& allGroups, QWidget* parent) : QWidget(parent), groups_(NULL) {
 	QBoxLayout* layout = new QVBoxLayout(this);
 	setContentsMargins(0,0,0,0);
+	layout->setContentsMargins(0,0,0,0);
 
 	QHBoxLayout* nameLayout = new QHBoxLayout();
 	
diff --git a/Swift/QtUI/QtContactEditWindow.cpp b/Swift/QtUI/QtContactEditWindow.cpp
index 6eb4316..0781f64 100644
--- a/Swift/QtUI/QtContactEditWindow.cpp
+++ b/Swift/QtUI/QtContactEditWindow.cpp
@@ -13,40 +13,28 @@
 #include <QLabel>
 #include <QCheckBox>
 #include <QLineEdit>
-#include <QDialogButtonBox>
 #include <QMessageBox>
 #include <QPushButton>
 
 #include "Swift/QtUI/QtSwiftUtil.h"
+#include "QtContactEditWidget.h"
 
 namespace Swift {
 
-QtContactEditWindow::QtContactEditWindow() : groups_(NULL) {
+QtContactEditWindow::QtContactEditWindow() : contactEditWidget_(NULL) {
 	resize(300,300);
 	setWindowTitle("Edit contact");
+	setContentsMargins(0,0,0,0);
 
 	QBoxLayout* layout = new QVBoxLayout(this);
-	setContentsMargins(0,0,0,0);
 
 	jidLabel_ = new QLabel(this);
 	jidLabel_->setAlignment(Qt::AlignHCenter);
 	layout->addWidget(jidLabel_);
 
-	QHBoxLayout* nameLayout = new QHBoxLayout();
-	
-	QLabel* label = new QLabel("Name:", this);
-	nameLayout->addWidget(label);
-	name_ = new QLineEdit(this);
-	nameLayout->addWidget(name_);
-	layout->addLayout(nameLayout);
-
-	layout->addWidget(new QLabel("Groups:", this));
-
-	groupsArea_ = new QScrollArea(this);
-	layout->addWidget(groupsArea_);
-	groupsArea_->setWidgetResizable(true);
-	groupsArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
-	groupsArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+	groupsLayout_ = new QVBoxLayout();
+	groupsLayout_->setContentsMargins(0,0,0,0);
+	layout->addLayout(groupsLayout_);
 
 	QHBoxLayout* buttonLayout = new QHBoxLayout();
 	layout->addLayout(buttonLayout);
@@ -60,38 +48,14 @@ QtContactEditWindow::QtContactEditWindow() : groups_(NULL) {
 }
 
 void QtContactEditWindow::setContact(const JID& jid, const String& name, const std::vector<String>& groups, const std::set<String>& allGroups) {
+	delete contactEditWidget_;
 	jid_ = jid;
-	
 	jidLabel_->setText("<b>" + P2QSTRING(jid.toString()) + "</b>");
-	name_->setText(P2QSTRING(name));
-
-	delete groups_;
-	checkBoxes_.clear();
-	groups_ = new QWidget(groupsArea_);
-	groupsArea_->setWidget(groups_);
-	QVBoxLayout* scrollLayout = new QVBoxLayout(groups_);
-
-	foreach (String group, allGroups) {
-		QCheckBox* check = new QCheckBox(groups_);
-		check->setText(P2QSTRING(group));
-		check->setCheckState(Qt::Unchecked);
-		checkBoxes_[group] = check;
-		scrollLayout->addWidget(check);
-	}
-	foreach (String group, groups) {
-		checkBoxes_[group]->setCheckState(Qt::Checked);
-	}
-
-	QHBoxLayout* newGroupLayout = new QHBoxLayout();
-	newGroup_ = new QCheckBox(groups_);
-	newGroup_->setText("New Group:");
-	newGroup_->setCheckState(Qt::Unchecked);
-	newGroupLayout->addWidget(newGroup_);
-	newGroupName_ = new QLineEdit(groups_);
-	newGroupLayout->addWidget(newGroupName_);
-	scrollLayout->addLayout(newGroupLayout);
 
-	scrollLayout->addItem(new QSpacerItem(20, 73, QSizePolicy::Minimum, QSizePolicy::Expanding));
+	contactEditWidget_ = new QtContactEditWidget(allGroups, this);
+	groupsLayout_->addWidget(contactEditWidget_);
+	contactEditWidget_->setName(name);
+	contactEditWidget_->setSelectedGroups(groups);
 }
 
 void QtContactEditWindow::setEnabled(bool b) {
@@ -121,16 +85,7 @@ void QtContactEditWindow::handleRemoveContact() {
 }
 
 void QtContactEditWindow::handleUpdateContact() {
-	std::vector<String> groups;
-	foreach(const CheckBoxMap::value_type& group, checkBoxes_) {
-		if (group.second->checkState() == Qt::Checked) {
-			groups.push_back(group.first);
-		}
-	}
-	if (newGroup_->checkState() == Qt::Checked && !newGroupName_->text().isEmpty()) {
-		groups.push_back(Q2PSTRING(newGroupName_->text()));
-	}
-	onChangeContactRequest(Q2PSTRING(name_->text()), groups);
+	onChangeContactRequest(contactEditWidget_->getName(), contactEditWidget_->getSelectedGroups());
 }
 
 }
diff --git a/Swift/QtUI/QtContactEditWindow.h b/Swift/QtUI/QtContactEditWindow.h
index a731480..25ea9b7 100644
--- a/Swift/QtUI/QtContactEditWindow.h
+++ b/Swift/QtUI/QtContactEditWindow.h
@@ -6,21 +6,18 @@
 
 #pragma once
 
-#include <map>
-#include <boost/shared_ptr.hpp>
-
 #include <QWidget>
 
 #include <Swift/Controllers/UIInterfaces/ContactEditWindow.h>
 #include <Swiften/Base/String.h>
 #include <Swiften/JID/JID.h>
 
-class QScrollArea;
 class QLabel;
-class QLineEdit;
-class QCheckBox;
+class QVBoxLayout;
 
 namespace Swift {
+	class QtContactEditWidget;
+
 	class QtContactEditWindow : public QWidget, public ContactEditWindow {
 			Q_OBJECT
 
@@ -38,15 +35,10 @@ namespace Swift {
 			void handleUpdateContact();
 
 		private:
-			typedef std::map<String, QCheckBox*> CheckBoxMap;
 			JID jid_;
+			QVBoxLayout* groupsLayout_;
 			QLabel* jidLabel_;
-			CheckBoxMap checkBoxes_;
-			QLineEdit* name_;
-			QScrollArea* groupsArea_;
-			QWidget* groups_;
-			QCheckBox* newGroup_;
-			QLineEdit* newGroupName_;
+			QtContactEditWidget* contactEditWidget_;
 	};
 }
 
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index e0d29a0..6238693 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -91,6 +91,7 @@ sources = [
     "QtAddBookmarkWindow.cpp",
     "QtEditBookmarkWindow.cpp",
     "QtContactEditWindow.cpp",
+    "QtContactEditWidget.cpp",
     "ChatSnippet.cpp",
     "MessageSnippet.cpp",
     "SystemMessageSnippet.cpp",
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
index 6a97e3a..911d410 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
@@ -28,17 +28,6 @@ QtUserSearchFirstPage::QtUserSearchFirstPage(UserSearchWindow::Type type, const
 	connect(service_, SIGNAL(textChanged(const QString&)), this, SLOT(emitCompletenessCheck()));
 }
 
-QtUserSearchFieldsPage::QtUserSearchFieldsPage() {
-	setupUi(this);
-}
-
-QtUserSearchResultsPage::QtUserSearchResultsPage() {
-	setupUi(this);
-	connect(results_, SIGNAL(activated(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
-	connect(results_, SIGNAL(clicked(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
-	connect(results_, SIGNAL(entered(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
-}
-
 bool QtUserSearchFirstPage::isComplete() const {
 	bool complete = false;
 	if (byJID_->isChecked()) {
@@ -51,22 +40,34 @@ bool QtUserSearchFirstPage::isComplete() const {
 	return complete;
 }
 
-bool QtUserSearchFieldsPage::isComplete() const {
-	return nickInput_->isEnabled() || firstInput_->isEnabled() || lastInput_->isEnabled() || emailInput_->isEnabled();
+void QtUserSearchFirstPage::emitCompletenessCheck() {
+	emit completeChanged();
 }
 
-bool QtUserSearchResultsPage::isComplete() const {
-	return results_->currentIndex().isValid();
+
+QtUserSearchFieldsPage::QtUserSearchFieldsPage() {
+	setupUi(this);
 }
 
-void QtUserSearchFirstPage::emitCompletenessCheck() {
-	emit completeChanged();
+bool QtUserSearchFieldsPage::isComplete() const {
+	return nickInput_->isEnabled() || firstInput_->isEnabled() || lastInput_->isEnabled() || emailInput_->isEnabled();
 }
 
 void QtUserSearchFieldsPage::emitCompletenessCheck() {
 	emit completeChanged();
 }
 
+QtUserSearchResultsPage::QtUserSearchResultsPage() {
+	setupUi(this);
+	connect(results_, SIGNAL(activated(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
+	connect(results_, SIGNAL(clicked(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
+	connect(results_, SIGNAL(entered(const QModelIndex&)), this, SLOT(emitCompletenessCheck()));
+}
+
+bool QtUserSearchResultsPage::isComplete() const {
+	return results_->currentIndex().isValid();
+}
+
 void QtUserSearchResultsPage::emitCompletenessCheck() {
 	emit completeChanged();
 }
-- 
cgit v0.10.2-6-g49f6