diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-05-19 11:18:52 (GMT) | 
|---|---|---|
| committer | Swift Review <review@swift.im> | 2014-07-09 10:19:41 (GMT) | 
| commit | 05d9e618e4c756e50b633448f0546614a645a13d (patch) | |
| tree | 5a05e5c2c939c240a58c4aa468af0806a7ed8822 /Swift | |
| parent | acac7962ba04c083377f62f4265ecc754176f74e (diff) | |
| download | swift-contrib-05d9e618e4c756e50b633448f0546614a645a13d.zip swift-contrib-05d9e618e4c756e50b633448f0546614a645a13d.tar.bz2 | |
Add dialog to send AdHoc's to target specific JID's. Fix multi-item Form rendering.
Test-Information:
Use AdHoc bot that presents a multi-item form and check that it is rendered correctly. Check that entering invalid JID and node parameters in the dialog do not cause malfunction. Check that canceling the JID prompt closes the dialog without sending any server commands.
Change-Id: I10e6f4c7eccd1a35c8c885d548994b5f57fdbf66
Diffstat (limited to 'Swift')
| -rw-r--r-- | Swift/Controllers/AdHocManager.cpp | 8 | ||||
| -rw-r--r-- | Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h | 21 | ||||
| -rw-r--r-- | Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp | 61 | ||||
| -rw-r--r-- | Swift/QtUI/QtAdHocCommandWithJIDWindow.h | 32 | ||||
| -rw-r--r-- | Swift/QtUI/QtFormWidget.cpp | 55 | ||||
| -rw-r--r-- | Swift/QtUI/QtFormWidget.h | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 12 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.h | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtSwift.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.h | 3 | ||||
| -rw-r--r-- | Swift/QtUI/SConscript | 1 | 
12 files changed, 184 insertions, 25 deletions
| diff --git a/Swift/Controllers/AdHocManager.cpp b/Swift/Controllers/AdHocManager.cpp index 59e139b..b179ec6 100644 --- a/Swift/Controllers/AdHocManager.cpp +++ b/Swift/Controllers/AdHocManager.cpp @@ -17,2 +17,3 @@  #include <Swift/Controllers/UIInterfaces/AdHocCommandWindowFactory.h> +#include <Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h>  #include <Swift/Controllers/UIEvents/UIEventStream.h> @@ -83,2 +84,9 @@ void AdHocManager::handleUIEvent(boost::shared_ptr<UIEvent> event) {  	} +	boost::shared_ptr<RequestAdHocWithJIDUIEvent> adHocJIDEvent = boost::dynamic_pointer_cast<RequestAdHocWithJIDUIEvent>(event); +	if (!!adHocJIDEvent) { +		boost::shared_ptr<OutgoingAdHocCommandSession> command = boost::make_shared<OutgoingAdHocCommandSession>(adHocJIDEvent->getJID(), adHocJIDEvent->getNode(), iqRouter_); +		boost::shared_ptr<AdHocController> controller = boost::make_shared<AdHocController>(factory_, command); +		controller->onDeleting.connect(boost::bind(&AdHocManager::removeController, this, controller)); +		controllers_.push_back(controller); +	}  } diff --git a/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h b/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h new file mode 100644 index 0000000..2b1fcea --- /dev/null +++ b/Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h @@ -0,0 +1,21 @@ +/* + * 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 "Swift/Controllers/UIEvents/UIEvent.h" + +namespace Swift { +	class RequestAdHocWithJIDUIEvent : public UIEvent { +		public: +			RequestAdHocWithJIDUIEvent(const JID& jid, const std::string& node) : jid_(jid), node_(node) {} +			JID getJID() const { return jid_; } +			std::string getNode() const { return node_; } +		private: +			JID jid_; +			std::string node_; +	}; +} diff --git a/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp b/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp new file mode 100644 index 0000000..7f33f77 --- /dev/null +++ b/Swift/QtUI/QtAdHocCommandWithJIDWindow.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010-2014 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <boost/bind.hpp> +#include <QLabel> +#include <QPushButton> +#include <QBoxLayout> +#include <QDialogButtonBox> +#include <Swiften/Elements/Command.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/Controllers/UIEvents/RequestAdHocWithJIDUIEvent.h> +#include <Swift/QtUI/QtAdHocCommandWithJIDWindow.h> +#include <Swift/QtUI/QtFormWidget.h> +#include <Swift/QtUI/QtSwiftUtil.h> + +const int FormLayoutIndex = 1; + +namespace Swift { +QtAdHocCommandWithJIDWindow::QtAdHocCommandWithJIDWindow(UIEventStream* uiEventStream) : uiEventStream_(uiEventStream) { +	QVBoxLayout* hlayout = new QVBoxLayout(this); + +	QLabel* jidLabel = new QLabel("JID:", this); +	hlayout->addWidget(jidLabel); +	jid_ = new QLineEdit(this); +	hlayout->addWidget(jid_); + +	QLabel* commandLabel = new QLabel("Command:", this); +	hlayout->addWidget(commandLabel); +	node_ = new QLineEdit(this); +	hlayout->addWidget(node_); + +	QDialogButtonBox* buttonBox = new QDialogButtonBox(this); +	QPushButton* rejectButton = buttonBox->addButton("Cancel", QDialogButtonBox::RejectRole); +	connect(rejectButton, SIGNAL(clicked()), this, SLOT(handleRejectClick())); +	QPushButton* acceptButton = buttonBox->addButton("Complete", QDialogButtonBox::AcceptRole); +	connect(acceptButton, SIGNAL(clicked()), this, SLOT(handleAcceptClick())); +	hlayout->addWidget(buttonBox); + +	setLayout(hlayout); +	show(); +} + +QtAdHocCommandWithJIDWindow::~QtAdHocCommandWithJIDWindow() { +} + +void QtAdHocCommandWithJIDWindow::handleAcceptClick() { +	const JID jid = JID(Q2PSTRING(jid_->text())); +	const std::string node = Q2PSTRING(node_->text()); +	boost::shared_ptr<UIEvent> event(new RequestAdHocWithJIDUIEvent(jid, node)); +	uiEventStream_->send(event); +	accept(); +} + +void QtAdHocCommandWithJIDWindow::handleRejectClick() { +	reject(); +} + +} diff --git a/Swift/QtUI/QtAdHocCommandWithJIDWindow.h b/Swift/QtUI/QtAdHocCommandWithJIDWindow.h new file mode 100644 index 0000000..b168827 --- /dev/null +++ b/Swift/QtUI/QtAdHocCommandWithJIDWindow.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2010-2012 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <QDialog> +#include <QLineEdit> + +#include <Swiften/AdHoc/OutgoingAdHocCommandSession.h> + +class QBoxLayout; + +namespace Swift { +	class UIEventStream; +	class QtFormWidget; +	class QtAdHocCommandWithJIDWindow : public QDialog { +		Q_OBJECT +		public: +			QtAdHocCommandWithJIDWindow(UIEventStream* eventStream); +			virtual ~QtAdHocCommandWithJIDWindow(); +		public slots: +			void handleAcceptClick(); +			void handleRejectClick(); +		private: +			UIEventStream* uiEventStream_; +			QLineEdit* jid_; +			QLineEdit* node_; +	}; +} diff --git a/Swift/QtUI/QtFormWidget.cpp b/Swift/QtUI/QtFormWidget.cpp index 874c8a1..b4840e9 100644 --- a/Swift/QtUI/QtFormWidget.cpp +++ b/Swift/QtUI/QtFormWidget.cpp @@ -1,3 +1,3 @@  /* - * Copyright (c) 2010-2013 Kevin Smith + * Copyright (c) 2010-2014 Kevin Smith   * Licensed under the GNU General Public License v3. @@ -39,7 +39,23 @@ QtFormWidget::QtFormWidget(Form::ref form, QWidget* parent) : QWidget(parent), f  	QGridLayout* layout = new QGridLayout(scroll); -	foreach (boost::shared_ptr<FormField> field, form->getFields()) { -		QWidget* widget = createWidget(field); -		if (widget) { -			layout->addWidget(new QLabel(field->getLabel().c_str(), this), row, 0); -			layout->addWidget(widget, row++, 1); +	const std::vector<Form::FormItem> items = form->getItems(); +	if (items.empty()) { /* single item forms */ +		foreach (FormField::ref field, form->getFields()) { +			QWidget* widget = createWidget(field, field->getType(), 0); +			if (widget) { +				layout->addWidget(new QLabel(field->getLabel().c_str(), this), row, 0); +				layout->addWidget(widget, row++, 1); +			} +		} +	} else { /* multi-item forms */ +		const Form::FormItem& headers = form->getFields(); +		for (size_t i = 0; i < items.size(); ++i) { +			const Form::FormItem& item = items[i]; +			assert(item.size() == headers.size()); +			for (size_t j = 0; j < item.size(); ++j) { +				QWidget* widget = createWidget(item[j], headers[j]->getType(), i); +				if (widget) { +					layout->addWidget(new QLabel(item[j]->getLabel().c_str(), this), row, 0); +					layout->addWidget(widget, row++, 1); +				} +			}  		} @@ -85,5 +101,5 @@ QListWidget* QtFormWidget::createList(FormField::ref field) { -QWidget* QtFormWidget::createWidget(FormField::ref field) { +QWidget* QtFormWidget::createWidget(FormField::ref field, const FormField::Type type, const size_t index) {  	QWidget* widget = NULL; -	if (field->getType() == FormField::BooleanType) { +	if (type == FormField::BooleanType) {  		QCheckBox* checkWidget = new QCheckBox(this); @@ -92,3 +108,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::FixedType) { +	if (type == FormField::FixedType) {  		QString value = field->getFixedValue().c_str(); @@ -96,6 +112,6 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::ListSingleType) { +	if (type == FormField::ListSingleType) {  		widget = createList(field);  	} -	if (field->getType() == FormField::TextMultiType) { +	if (type == FormField::TextMultiType) {  		QString value = field->getTextMultiValue().c_str(); @@ -105,3 +121,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::TextPrivateType) { +	if (type == FormField::TextPrivateType) {  		QString value = field->getTextPrivateValue().c_str(); @@ -111,3 +127,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::TextSingleType) { +	if (type == FormField::TextSingleType) {  		QString value = field->getTextSingleValue().c_str(); @@ -115,3 +131,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::JIDSingleType) { +	if (type == FormField::JIDSingleType) {  		QString value = field->getJIDSingleValue().toString().c_str(); @@ -119,3 +135,3 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::JIDMultiType) { +	if (type == FormField::JIDMultiType) {  		QString text = boost::join(field->getValues(), "\n").c_str(); @@ -125,6 +141,11 @@ QWidget* QtFormWidget::createWidget(FormField::ref field) {  	} -	if (field->getType() == FormField::ListMultiType) { +	if (type == FormField::ListMultiType) {  		widget = createList(field);  	} -	fields_[field->getName()] = widget; +	std::string indexString; +	if (index) { +		/* for multi-item forms we need to distinguish between the different rows */ +		indexString = boost::lexical_cast<std::string>(index); +	} +	fields_[field->getName() + indexString] = widget;  	return widget; diff --git a/Swift/QtUI/QtFormWidget.h b/Swift/QtUI/QtFormWidget.h index c7aae73..f58ff4b 100644 --- a/Swift/QtUI/QtFormWidget.h +++ b/Swift/QtUI/QtFormWidget.h @@ -1,3 +1,3 @@  /* - * Copyright (c) 2011 Kevin Smith + * Copyright (c) 2011-2014 Kevin Smith   * Licensed under the GNU General Public License v3. @@ -25,3 +25,3 @@ class QtFormWidget : public QWidget {  	private: -		QWidget* createWidget(FormField::ref field); +		QWidget* createWidget(FormField::ref field, const FormField::Type type, const size_t index);  		QListWidget* createList(FormField::ref field); diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 31a8234..1db8c77 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -42,2 +42,3 @@  #include <Swift/QtUI/QtUISettingConstants.h> +#include <Swift/QtUI/QtAdHocCommandWithJIDWindow.h>  #if defined(SWIFTEN_PLATFORM_MACOSX) @@ -52,3 +53,3 @@ namespace Swift { -QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist) : QWidget(), MainWindow(false), loginMenus_(loginMenus) { +QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID) : QWidget(), MainWindow(false), loginMenus_(loginMenus) {  	uiEventStream_ = uiEventStream; @@ -177,2 +178,7 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr  	actionsMenu->addAction(chatUserAction_); +	if (enableAdHocCommandOnJID) { +		otherAdHocAction_ = new QAction(tr("Run Other Command"), this); +		connect(otherAdHocAction_, SIGNAL(triggered()), this, SLOT(handleOtherAdHocActionTriggered())); +		actionsMenu->addAction(otherAdHocAction_); +	}  	serverAdHocMenu_ = new QMenu(tr("Run Server Command"), this); @@ -271,2 +277,6 @@ void QtMainWindow::handleChatUserActionTriggered(bool /*checked*/) { +void QtMainWindow::handleOtherAdHocActionTriggered() { +	new QtAdHocCommandWithJIDWindow(uiEventStream_); +} +  void QtMainWindow::handleSignOutAction() { diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index f1f6900..84fab15 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -41,3 +41,3 @@ namespace Swift {  		public: -			QtMainWindow(SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist); +			QtMainWindow(SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID);  			virtual ~QtMainWindow(); @@ -71,2 +71,3 @@ namespace Swift {  			void handleChatUserActionTriggered(bool checked); +			void handleOtherAdHocActionTriggered();  			void handleAdHocActionTriggered(bool checked); @@ -89,2 +90,3 @@ namespace Swift {  			QAction* chatUserAction_; +			QAction* otherAdHocAction_;  			QAction* showOfflineAction_; diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp index 183f64d..d2224ba 100644 --- a/Swift/QtUI/QtSwift.cpp +++ b/Swift/QtUI/QtSwift.cpp @@ -91,2 +91,3 @@ po::options_description QtSwift::getOptionsDescription() {  		("start-minimized", "Don't show the login/roster window at startup") +		("enable-jid-adhocs", "Enable AdHoc commands to custom JID's.")  #if QT_VERSION >= 0x040800 @@ -164,2 +165,3 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa +	bool enableAdHocCommandOnJID = options.count("enable-jid-adhocs") > 0;  	tabs_ = options.count("no-tabs") && !splitter_ ? NULL : new QtChatTabs(splitter_ != NULL); @@ -212,3 +214,3 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa  		} -		QtUIFactory* uiFactory = new QtUIFactory(settingsHierachy_, qtSettings_, tabs_, splitter_, systemTrays_[i], chatWindowFactory_, networkFactories_.getTimerFactory(), statusCache_, startMinimized, !emoticons.empty()); +		QtUIFactory* uiFactory = new QtUIFactory(settingsHierachy_, qtSettings_, tabs_, splitter_, systemTrays_[i], chatWindowFactory_, networkFactories_.getTimerFactory(), statusCache_, startMinimized, !emoticons.empty(), enableAdHocCommandOnJID);  		uiFactories_.push_back(uiFactory); diff --git a/Swift/QtUI/QtUIFactory.cpp b/Swift/QtUI/QtUIFactory.cpp index afd2a9e..701170c 100644 --- a/Swift/QtUI/QtUIFactory.cpp +++ b/Swift/QtUI/QtUIFactory.cpp @@ -38,3 +38,3 @@ namespace Swift { -QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist) : settings(settings), qtOnlySettings(qtOnlySettings), tabs(tabs), netbookSplitter(netbookSplitter), systemTray(systemTray), chatWindowFactory(chatWindowFactory), timerFactory_(timerFactory), lastMainWindow(NULL), loginWindow(NULL), statusCache(statusCache), startMinimized(startMinimized), emoticonsExist_(emoticonsExist) { +QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID) : settings(settings), qtOnlySettings(qtOnlySettings), tabs(tabs), netbookSplitter(netbookSplitter), systemTray(systemTray), chatWindowFactory(chatWindowFactory), timerFactory_(timerFactory), lastMainWindow(NULL), loginWindow(NULL), statusCache(statusCache), startMinimized(startMinimized), emoticonsExist_(emoticonsExist), enableAdHocCommandOnJID_(enableAdHocCommandOnJID) {  	chatFontSize = settings->getSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE); @@ -83,3 +83,3 @@ FileTransferListWidget* QtUIFactory::createFileTransferListWidget() {  MainWindow* QtUIFactory::createMainWindow(UIEventStream* eventStream) { -	lastMainWindow  = new QtMainWindow(settings, eventStream, loginWindow->getMenus(), statusCache, emoticonsExist_); +	lastMainWindow  = new QtMainWindow(settings, eventStream, loginWindow->getMenus(), statusCache, emoticonsExist_, enableAdHocCommandOnJID_);  	return lastMainWindow; diff --git a/Swift/QtUI/QtUIFactory.h b/Swift/QtUI/QtUIFactory.h index 721aa76..4c50572 100644 --- a/Swift/QtUI/QtUIFactory.h +++ b/Swift/QtUI/QtUIFactory.h @@ -34,3 +34,3 @@ namespace Swift {  		public: -			QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist); +			QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID); @@ -75,2 +75,3 @@ namespace Swift {  			bool emoticonsExist_; +			bool enableAdHocCommandOnJID_;  	}; diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 53dbea9..dd7d0c3 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -121,2 +121,3 @@ sources = [      "QtAdHocCommandWindow.cpp", +    "QtAdHocCommandWithJIDWindow.cpp",      "QtUtilities.cpp", | 
 Swift
 Swift