diff options
Diffstat (limited to 'Swift/QtUI')
| -rw-r--r-- | Swift/QtUI/QtFormResultItemModel.cpp | 87 | ||||
| -rw-r--r-- | Swift/QtUI/QtFormResultItemModel.h | 36 | ||||
| -rw-r--r-- | Swift/QtUI/SConscript | 1 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchFieldsPage.cpp | 23 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchFieldsPage.h | 9 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchFieldsPage.ui | 39 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchResultsPage.ui | 6 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchWindow.cpp | 102 | ||||
| -rw-r--r-- | Swift/QtUI/UserSearch/QtUserSearchWindow.h | 4 | 
9 files changed, 259 insertions, 48 deletions
diff --git a/Swift/QtUI/QtFormResultItemModel.cpp b/Swift/QtUI/QtFormResultItemModel.cpp new file mode 100644 index 0000000..5461f05 --- /dev/null +++ b/Swift/QtUI/QtFormResultItemModel.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2012 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include "QtFormResultItemModel.h" + +#include <boost/algorithm/string/join.hpp> + +#include <Swift/QtUI/QtSwiftUtil.h> +#include <Swiften/Base/foreach.h> + +namespace Swift { + +QtFormResultItemModel::QtFormResultItemModel(QObject *parent) : QAbstractTableModel(parent) { + +} + +QtFormResultItemModel::QtFormResultItemModel(QObject* parent, Form::ref formResult) : QAbstractTableModel(parent), formResult_(formResult) { + +} + +void QtFormResultItemModel::setForm(Form::ref formResult) { +	emit layoutAboutToBeChanged(); +	formResult_ = formResult; +	emit layoutChanged(); +} + +const Form::ref QtFormResultItemModel::getForm() const { +	return formResult_; +} + +QVariant QtFormResultItemModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { +	if (!formResult_) return QVariant(); +	if (role != Qt::DisplayRole) return QVariant(); +	if (static_cast<size_t>(section) >= formResult_->getReportedFields().size()) return QVariant(); +	return QVariant(QString::fromStdString(formResult_->getReportedFields().at(section)->getLabel())); +} + +int QtFormResultItemModel::rowCount(const QModelIndex &/*parent*/) const { +	if (!formResult_) return 0; +	return formResult_->getItems().size(); +} + +int QtFormResultItemModel::columnCount(const QModelIndex &/*parent*/) const { +	if (!formResult_) return 0; +	return formResult_->getReportedFields().size(); +} + +QVariant QtFormResultItemModel::data(const QModelIndex &index, int role) const { +	if (!formResult_) return QVariant(); +	if (role != Qt::DisplayRole || !index.isValid()) { +		return QVariant(); +	} + +	if (static_cast<size_t>(index.row()) >= formResult_->getItems().size()) return QVariant(); +	if (static_cast<size_t>(index.column()) >= formResult_->getReportedFields().size()) return QVariant(); + +	Form::FormItem item = formResult_->getItems().at(index.row()); + +	return QVariant(P2QSTRING(getFieldValue(item, index.column()))); +} + +const std::string QtFormResultItemModel::getFieldValue(const Form::FormItem& item, const int column) const { +	// determine field name +	std::string name = formResult_->getReportedFields().at(column)->getName(); + +	foreach(FormField::ref field, item) { +		if (field->getName() == name) { +			std::string delimiter = ""; +			if (boost::dynamic_pointer_cast<TextMultiFormField>(field)) { +				delimiter = "\n"; +			} else if (boost::dynamic_pointer_cast<JIDMultiFormField>(field)) { +				delimiter = ", "; +			} else if (boost::dynamic_pointer_cast<ListMultiFormField>(field)) { +				delimiter = ", "; +			} + +			return boost::algorithm::join(field->getRawValues(), delimiter); +		} +	} + +	return ""; +} + +} diff --git a/Swift/QtUI/QtFormResultItemModel.h b/Swift/QtUI/QtFormResultItemModel.h new file mode 100644 index 0000000..f383f74 --- /dev/null +++ b/Swift/QtUI/QtFormResultItemModel.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2012 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <QAbstractTableModel> + +#include <Swiften/Elements/Form.h> + +namespace Swift { + +class QtFormResultItemModel : public QAbstractTableModel { +	Q_OBJECT +	public: +		QtFormResultItemModel(QObject* parent); +		QtFormResultItemModel(QObject* parent, Form::ref formResult); + +		void setForm(Form::ref formResult); +		const Form::ref getForm() const; + +		virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; +		virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; +		virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; +		virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + +	private: +		const std::string getFieldValue(const Form::FormItem& item, const int column) const; + +	private: +		Form::ref formResult_; +}; + +} diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 95ec49a..2283001 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -99,6 +99,7 @@ sources = [      "SystemMessageSnippet.cpp",      "QtElidingLabel.cpp",      "QtFormWidget.cpp", +	"QtFormResultItemModel.cpp",      "QtLineEdit.cpp",      "QtJoinMUCWindow.cpp",      "Roster/RosterModel.cpp", diff --git a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.cpp b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.cpp index 3ef048b..13858a7 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.cpp @@ -8,12 +8,31 @@  namespace Swift { -QtUserSearchFieldsPage::QtUserSearchFieldsPage() { +QtUserSearchFieldsPage::QtUserSearchFieldsPage() : formWidget_(0) {  	setupUi(this);  }  bool QtUserSearchFieldsPage::isComplete() const { -	return nickInput_->isEnabled() || firstInput_->isEnabled() || lastInput_->isEnabled() || emailInput_->isEnabled(); +	if (formWidget_) { +		return formWidget_->isEnabled(); +	} else { +		return nickInput_->isEnabled() || firstInput_->isEnabled() || lastInput_->isEnabled() || emailInput_->isEnabled(); +	} +} + +QtFormWidget* QtUserSearchFieldsPage::getFormWidget() { +	return formWidget_; +} + +void QtUserSearchFieldsPage::setFormWidget(QtFormWidget *widget) { +	if (formWidget_) { +		delete formWidget_; +		formWidget_ = NULL; +	} +	if (widget) { +		formContainer_->layout()->addWidget(widget); +	} +	formWidget_ = widget;  }  void QtUserSearchFieldsPage::emitCompletenessCheck() { diff --git a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.h b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.h index 12c28b5..066205b 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.h +++ b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.h @@ -8,6 +8,8 @@  #include <QWizardPage> +#include <Swift/QtUI/QtFormWidget.h> +  #include <Swift/QtUI/UserSearch/ui_QtUserSearchFieldsPage.h>  namespace Swift { @@ -16,7 +18,14 @@ namespace Swift {  		public:  			QtUserSearchFieldsPage();  			virtual bool isComplete() const; + +			QtFormWidget* getFormWidget(); +			void setFormWidget(QtFormWidget *widget); +  		public slots:  			void emitCompletenessCheck(); + +		private: +			QtFormWidget *formWidget_;  	};  } diff --git a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.ui b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.ui index fa6e376..f972516 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.ui +++ b/Swift/QtUI/UserSearch/QtUserSearchFieldsPage.ui @@ -11,7 +11,7 @@     </rect>    </property>    <property name="windowTitle"> -   <string></string> +   <string/>    </property>    <layout class="QGridLayout" name="gridLayout">     <item row="0" column="0" colspan="2"> @@ -61,7 +61,30 @@     <item row="4" column="1">      <widget class="QLineEdit" name="emailInput_"/>     </item> +   <item row="6" column="0"> +    <widget class="QLabel" name="fetchingThrobber_"> +     <property name="text"> +      <string/> +     </property> +    </widget> +   </item>     <item row="6" column="1"> +    <widget class="QLabel" name="fetchingLabel_"> +     <property name="text"> +      <string>Fetching search fields</string> +     </property> +    </widget> +   </item> +   <item row="5" column="0" colspan="2"> +    <widget class="QWidget" name="formContainer_" native="true"> +     <layout class="QHBoxLayout" name="horizontalLayout"> +      <property name="margin"> +       <number>0</number> +      </property> +     </layout> +    </widget> +   </item> +   <item row="7" column="1">      <spacer name="verticalSpacer">       <property name="orientation">        <enum>Qt::Vertical</enum> @@ -74,20 +97,6 @@       </property>      </spacer>     </item> -   <item row="5" column="0"> -    <widget class="QLabel" name="fetchingThrobber_"> -     <property name="text"> -      <string></string> -     </property> -    </widget> -   </item> -   <item row="5" column="1"> -    <widget class="QLabel" name="fetchingLabel_"> -     <property name="text"> -      <string>Fetching search fields</string> -     </property> -    </widget> -   </item>    </layout>   </widget>   <resources/> diff --git a/Swift/QtUI/UserSearch/QtUserSearchResultsPage.ui b/Swift/QtUI/UserSearch/QtUserSearchResultsPage.ui index f312fde..ceb15e1 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchResultsPage.ui +++ b/Swift/QtUI/UserSearch/QtUserSearchResultsPage.ui @@ -11,10 +11,10 @@     </rect>    </property>    <property name="windowTitle"> -   <string></string> +   <string/>    </property> -  <layout class="QHBoxLayout" name="horizontalLayout"> -   <item> +  <layout class="QGridLayout" name="layout"> +   <item row="0" column="0">      <widget class="QTreeView" name="results_">       <property name="rootIsDecorated">        <bool>false</bool> diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp index 0559683..933612c 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp @@ -6,17 +6,20 @@  #include "Swift/QtUI/UserSearch/QtUserSearchWindow.h" +#include <QItemDelegate>  #include <QModelIndex>  #include <QWizardPage>  #include <QMovie>  #include <boost/smart_ptr/make_shared.hpp> +#include <Swiften/Base/foreach.h>  #include "Swift/Controllers/UIEvents/UIEventStream.h"  #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h"  #include "Swift/Controllers/UIEvents/AddContactUIEvent.h"  #include "Swift/QtUI/UserSearch/UserSearchModel.h"  #include "Swift/QtUI/UserSearch/UserSearchDelegate.h"  #include "Swift/QtUI/QtSwiftUtil.h" +#include "Swift/QtUI/QtFormResultItemModel.h"  #include "QtUserSearchFirstPage.h"  #include "QtUserSearchFieldsPage.h"  #include "QtUserSearchResultsPage.h" @@ -24,7 +27,7 @@  namespace Swift { -QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWindow::Type type, const std::set<std::string>& groups) : eventStream_(eventStream), type_(type) { +QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWindow::Type type, const std::set<std::string>& groups) : eventStream_(eventStream), type_(type), model_(NULL) {  	setupUi(this);  #ifndef Q_WS_MAC  	setWindowIcon(QIcon(":/logo-icon-16.png")); @@ -32,7 +35,6 @@ QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWin  	QString title(type == UserSearchWindow::AddContact ? tr("Add Contact") : tr("Chat to User"));  	setWindowTitle(title); -	model_ = new UserSearchModel();  	delegate_ = new UserSearchDelegate();  	firstPage_ = new QtUserSearchFirstPage(type, title); @@ -51,9 +53,7 @@ QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWin  	setPage(2, fieldsPage_);  	resultsPage_ = new QtUserSearchResultsPage(); -	resultsPage_->results_->setModel(model_); -	resultsPage_->results_->setItemDelegate(delegate_); -	resultsPage_->results_->setHeaderHidden(true); +  #ifdef SWIFT_PLATFORM_MACOSX  	resultsPage_->results_->setAlternatingRowColors(true);  #endif @@ -74,7 +74,7 @@ QtUserSearchWindow::QtUserSearchWindow(UIEventStream* eventStream, UserSearchWin  }  QtUserSearchWindow::~QtUserSearchWindow() { - +	delete model_;  }  void QtUserSearchWindow::handleCurrentChanged(int page) { @@ -101,9 +101,28 @@ JID QtUserSearchWindow::getServerToSearch() {  void QtUserSearchWindow::handleAccepted() {  	JID jid;  	if (!firstPage_->byJID_->isChecked()) { -		UserSearchResult* userItem = static_cast<UserSearchResult*>(resultsPage_->results_->currentIndex().internalPointer()); -		if (userItem) { /* Remember to leave this if we change to dynamic cast */ -			jid = userItem->getJID(); +		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 { @@ -152,17 +171,21 @@ void QtUserSearchWindow::handleFirstPageRadioChange() {  void QtUserSearchWindow::handleSearch() {  	boost::shared_ptr<SearchPayload> search(new SearchPayload()); -	if (fieldsPage_->nickInput_->isEnabled()) { -		search->setNick(Q2PSTRING(fieldsPage_->nickInput_->text())); -	} -	if (fieldsPage_->firstInput_->isEnabled()) { -		search->setFirst(Q2PSTRING(fieldsPage_->firstInput_->text())); -	} -	if (fieldsPage_->lastInput_->isEnabled()) { -		search->setLast(Q2PSTRING(fieldsPage_->lastInput_->text())); -	} -	if (fieldsPage_->emailInput_->isEnabled()) { -		search->setEMail(Q2PSTRING(fieldsPage_->emailInput_->text())); +	if (fieldsPage_->getFormWidget()) { +		search->setForm(fieldsPage_->getFormWidget()->getCompletedForm()); +	} else { +		if (fieldsPage_->nickInput_->isEnabled()) { +			search->setNick(Q2PSTRING(fieldsPage_->nickInput_->text())); +		} +		if (fieldsPage_->firstInput_->isEnabled()) { +			search->setFirst(Q2PSTRING(fieldsPage_->firstInput_->text())); +		} +		if (fieldsPage_->lastInput_->isEnabled()) { +			search->setLast(Q2PSTRING(fieldsPage_->lastInput_->text())); +		} +		if (fieldsPage_->emailInput_->isEnabled()) { +			search->setEMail(Q2PSTRING(fieldsPage_->emailInput_->text())); +		}  	}  	onSearchRequested(search, getServerToSearch());  } @@ -184,18 +207,41 @@ 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"); -	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_}; -	for (int i = 0; i < 8; i++) { -		legacySearchWidgets[i]->setVisible(enabled[i]); -		legacySearchWidgets[i]->setEnabled(enabled[i]); +	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_}; +		for (int i = 0; i < 8; i++) { +			legacySearchWidgets[i]->setVisible(enabled[i]); +			legacySearchWidgets[i]->setEnabled(enabled[i]); +		}  	}  	fieldsPage_->emitCompletenessCheck();  }  void QtUserSearchWindow::setResults(const std::vector<UserSearchResult>& results) { -	model_->setResults(results); +	UserSearchModel *newModel = new UserSearchModel(); +	newModel->setResults(results); +	resultsPage_->results_->setModel(newModel); +	resultsPage_->results_->setItemDelegate(delegate_); +	resultsPage_->results_->setHeaderHidden(true); +	delete model_; +	model_ = newModel; +} + +void QtUserSearchWindow::setResultsForm(Form::ref results) { +	QtFormResultItemModel *newModel = new QtFormResultItemModel(this); +	newModel->setForm(results); +	resultsPage_->results_->setModel(newModel); +	resultsPage_->results_->setItemDelegate(new QItemDelegate()); +	resultsPage_->results_->setHeaderHidden(false); +	resultsPage_->results_->header()->setResizeMode(QHeaderView::ResizeToContents); +	delete model_; +	model_ = newModel;  }  void QtUserSearchWindow::setSelectedService(const JID& jid) { @@ -228,7 +274,9 @@ void QtUserSearchWindow::clear() {  	firstPage_->howLabel_->setText(howText);  	firstPage_->byJID_->setChecked(true);  	clearForm(); -	model_->clear(); +	resultsPage_->results_->setModel(NULL); +	delete model_; +	model_ = NULL;  	handleFirstPageRadioChange();  	restart();  	lastPage_ = 1; diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.h b/Swift/QtUI/UserSearch/QtUserSearchWindow.h index bb40cd3..4cfe93f 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.h +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.h @@ -21,6 +21,7 @@ namespace Swift {  	class QtUserSearchFieldsPage;  	class QtUserSearchResultsPage;  	class QtUserSearchDetailsPage; +	class QtFormResultItemModel;  	class QtUserSearchWindow : public QWizard, public UserSearchWindow, private Ui::QtUserSearchWizard {  		Q_OBJECT @@ -33,6 +34,7 @@ namespace Swift {  			virtual void clear();  			virtual void show();  			virtual void setResults(const std::vector<UserSearchResult>& results); +			virtual void setResultsForm(Form::ref results);  			virtual void setSelectedService(const JID& jid);  			virtual void setServerSupportsSearch(bool error);  			virtual void setSearchError(bool error); @@ -52,7 +54,7 @@ namespace Swift {  		private:  			UIEventStream* eventStream_;  			UserSearchWindow::Type type_; -			UserSearchModel* model_; +			QAbstractItemModel* model_;  			UserSearchDelegate* delegate_;  			QtUserSearchFirstPage* firstPage_;  			QtUserSearchFieldsPage* fieldsPage_;  | 
 Swift