diff options
Diffstat (limited to 'Swift/QtUI')
| -rw-r--r-- | Swift/QtUI/QtBlockListEditorWindow.cpp | 162 | ||||
| -rw-r--r-- | Swift/QtUI/QtBlockListEditorWindow.h | 42 | ||||
| -rw-r--r-- | Swift/QtUI/QtBlockListEditorWindow.ui | 89 | ||||
| -rw-r--r-- | Swift/QtUI/QtChatWindow.cpp | 65 | ||||
| -rw-r--r-- | Swift/QtUI/QtChatWindow.h | 6 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 13 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.h | 3 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.cpp | 49 | ||||
| -rw-r--r-- | Swift/QtUI/QtUIFactory.h | 1 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtRosterWidget.cpp | 43 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/RosterModel.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/SConscript | 2 | ||||
| -rw-r--r-- | Swift/QtUI/Swift.qrc | 1 | 
13 files changed, 423 insertions, 57 deletions
| diff --git a/Swift/QtUI/QtBlockListEditorWindow.cpp b/Swift/QtUI/QtBlockListEditorWindow.cpp new file mode 100644 index 0000000..63e8d1f --- /dev/null +++ b/Swift/QtUI/QtBlockListEditorWindow.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2013 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include <QtBlockListEditorWindow.h> +#include <ui_QtBlockListEditorWindow.h> + +#include <boost/bind.hpp> + +#include <QLineEdit> +#include <QMovie> +#include <QShortcut> +#include <QStyledItemDelegate> +#include <QValidator> + +#include <Swift/QtUI/QtUtilities.h> +#include <Swiften/Client/ClientBlockListManager.h> +#include <Swiften/Base/foreach.h> +#include <Swift/QtUI/QtSwiftUtil.h> +#include <Swiften/JID/JID.h> + +namespace Swift { + +class QtJIDValidator : public QValidator { +	public: +		QtJIDValidator(QObject* parent) : QValidator(parent) {} +		virtual ~QtJIDValidator() {} +		virtual QValidator::State validate(QString& input, int&) const { +			return JID(Q2PSTRING(input)).isValid() ? Acceptable : Intermediate; +		} +}; + +class QtJIDValidatedItemDelegate : public QItemDelegate { +	public: +		QtJIDValidatedItemDelegate(QObject* parent) : QItemDelegate(parent) {} +		virtual ~QtJIDValidatedItemDelegate() {} + +		virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem&, const QModelIndex&) const { +			QLineEdit *editor = new QLineEdit(parent); +			editor->setValidator(new QtJIDValidator(editor)); +			return editor; +		} + +		void setEditorData(QWidget *editor, const QModelIndex &index) const { +			QString value = index.model()->data(index, Qt::EditRole).toString(); + +			QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); +			lineEdit->setText(value); +		} + +		void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { +			QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); +			QString currentValue = lineEdit->text(); +			int pos = 0; +			if (lineEdit->validator()->validate(currentValue, pos) == QValidator::Acceptable) { +				model->setData(index, lineEdit->text(), Qt::EditRole); +			} else { +				model->setData(index, QString(), Qt::EditRole); +			} +		} + +		void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { +			editor->setGeometry(option.rect); +		} +}; + +QtBlockListEditorWindow::QtBlockListEditorWindow() : QWidget(), ui(new Ui::QtBlockListEditorWindow) { +	ui->setupUi(this); +	new QShortcut(QKeySequence::Close, this, SLOT(close())); +	ui->throbberLabel->setMovie(new QMovie(":/icons/throbber.gif", QByteArray(), this)); + +	itemDelegate = new QtRemovableItemDelegate(style()); + +	connect(ui->savePushButton, SIGNAL(clicked()), SLOT(applyChanges())); + +	ui->blockListTreeWidget->setColumnCount(2); +	ui->blockListTreeWidget->header()->setStretchLastSection(false); +	int closeIconWidth = ui->blockListTreeWidget->fontMetrics().height(); +	ui->blockListTreeWidget->header()->resizeSection(1, closeIconWidth); + +#if QT_VERSION >= 0x050000 +	ui->blockListTreeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch); +#else +	ui->blockListTreeWidget->header()->setResizeMode(0, QHeaderView::Stretch); +#endif + +	ui->blockListTreeWidget->setHeaderHidden(true); +	ui->blockListTreeWidget->setRootIsDecorated(false); +	ui->blockListTreeWidget->setEditTriggers(QAbstractItemView::DoubleClicked); +	ui->blockListTreeWidget->setItemDelegateForColumn(0, new QtJIDValidatedItemDelegate(this)); +	ui->blockListTreeWidget->setItemDelegateForColumn(1, itemDelegate); +	connect(ui->blockListTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), SLOT(handleItemChanged(QTreeWidgetItem*,int))); + +	QTreeWidgetItem* item = new QTreeWidgetItem(QStringList("") << ""); +	item->setFlags(item->flags() | Qt::ItemIsEditable); +	ui->blockListTreeWidget->addTopLevelItem(item); +} + +QtBlockListEditorWindow::~QtBlockListEditorWindow() { +} + +void QtBlockListEditorWindow::show() { +	QWidget::show(); +	QWidget::activateWindow(); +} + +void QtBlockListEditorWindow::handleItemChanged(QTreeWidgetItem *, int) { +	bool hasEmptyRow = false; +	QList<QTreeWidgetItem*> rows = ui->blockListTreeWidget->findItems("", Qt::MatchFixedString); +	foreach(QTreeWidgetItem* row, rows) { +		if (row->text(0).isEmpty()) { +			hasEmptyRow = true; +		} +	} + +	if (!hasEmptyRow) { +		QTreeWidgetItem* item = new QTreeWidgetItem(QStringList("") << ""); +		item->setFlags(item->flags() | Qt::ItemIsEditable); +		ui->blockListTreeWidget->addTopLevelItem(item); +	} +} + +void QtBlockListEditorWindow::applyChanges() { +	onSetNewBlockList(getCurrentBlockList()); +} + +void Swift::QtBlockListEditorWindow::setCurrentBlockList(const std::vector<JID> &blockedJIDs) { +	ui->blockListTreeWidget->clear(); + +	foreach(const JID& jid, blockedJIDs) { +		QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(P2QSTRING(jid.toString())) << ""); +		item->setFlags(item->flags() | Qt::ItemIsEditable); +		ui->blockListTreeWidget->addTopLevelItem(item); +	} +	handleItemChanged(0,0); +} + +void Swift::QtBlockListEditorWindow::setBusy(bool isBusy) { +	if (isBusy) { +		ui->throbberLabel->movie()->start(); +		ui->throbberLabel->show(); +	} else { +		ui->throbberLabel->movie()->stop(); +		ui->throbberLabel->hide(); +	} +} + +std::vector<JID> Swift::QtBlockListEditorWindow::getCurrentBlockList() const { +	std::vector<JID> futureBlockedJIDs; + +	for(int i=0; i < ui->blockListTreeWidget->topLevelItemCount(); ++i) { +		QTreeWidgetItem* row = ui->blockListTreeWidget->topLevelItem(i); +		if (!row->text(0).isEmpty()) { +			futureBlockedJIDs.push_back(JID(Q2PSTRING(row->text(0)))); +		} +	} +	return futureBlockedJIDs; +} + +} diff --git a/Swift/QtUI/QtBlockListEditorWindow.h b/Swift/QtUI/QtBlockListEditorWindow.h new file mode 100644 index 0000000..4b124a3 --- /dev/null +++ b/Swift/QtUI/QtBlockListEditorWindow.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2013 Tobias Markmann + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#pragma once + +#include <Swift/Controllers/UIInterfaces/BlockListEditorWidget.h> +#include <Swift/QtUI/QtVCardWidget/QtRemovableItemDelegate.h> + +#include <QWidget> +#include <QTreeWidgetItem> + +namespace Ui { +	class QtBlockListEditorWindow; +} + +namespace Swift { + +class QtBlockListEditorWindow : public QWidget, public BlockListEditorWidget { +	Q_OBJECT + +	public: +		QtBlockListEditorWindow(); +		virtual ~QtBlockListEditorWindow(); + +		virtual void show(); +		virtual void setCurrentBlockList(const std::vector<JID>& blockedJIDs); +		virtual void setBusy(bool isBusy); +		virtual std::vector<JID> getCurrentBlockList() const; + +	private slots: +		void handleItemChanged(QTreeWidgetItem*, int); +		void applyChanges(); + +	private: +		Ui::QtBlockListEditorWindow* ui; +		QtRemovableItemDelegate* itemDelegate; +}; + +} diff --git a/Swift/QtUI/QtBlockListEditorWindow.ui b/Swift/QtUI/QtBlockListEditorWindow.ui new file mode 100644 index 0000000..f71bbae --- /dev/null +++ b/Swift/QtUI/QtBlockListEditorWindow.ui @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>QtBlockListEditorWindow</class> + <widget class="QWidget" name="QtBlockListEditorWindow"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>348</width> +    <height>262</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Edit Block List</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <property name="spacing"> +    <number>5</number> +   </property> +   <property name="margin"> +    <number>5</number> +   </property> +   <item> +    <widget class="QTreeWidget" name="blockListTreeWidget"> +     <attribute name="headerVisible"> +      <bool>false</bool> +     </attribute> +     <column> +      <property name="text"> +       <string notr="true">1</string> +      </property> +     </column> +    </widget> +   </item> +   <item> +    <layout class="QHBoxLayout" name="horizontalLayout"> +     <property name="sizeConstraint"> +      <enum>QLayout::SetDefaultConstraint</enum> +     </property> +     <item> +      <spacer name="horizontalSpacer"> +       <property name="orientation"> +        <enum>Qt::Horizontal</enum> +       </property> +       <property name="sizeHint" stdset="0"> +        <size> +         <width>40</width> +         <height>20</height> +        </size> +       </property> +      </spacer> +     </item> +     <item> +      <widget class="QLabel" name="errorLabel"> +       <property name="text"> +        <string/> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QLabel" name="throbberLabel"> +       <property name="text"> +        <string/> +       </property> +       <property name="alignment"> +        <set>Qt::AlignCenter</set> +       </property> +       <property name="textInteractionFlags"> +        <set>Qt::NoTextInteraction</set> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QPushButton" name="savePushButton"> +       <property name="text"> +        <string>Save</string> +       </property> +       <property name="default"> +        <bool>true</bool> +       </property> +      </widget> +     </item> +    </layout> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp index 11e64ab..efdab99 100644 --- a/Swift/QtUI/QtChatWindow.cpp +++ b/Swift/QtUI/QtChatWindow.cpp @@ -24,6 +24,7 @@  #include <Swift/Controllers/UIEvents/UIEventStream.h>  #include <Swift/Controllers/UIEvents/SendFileUIEvent.h>  #include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h> +#include <Swift/Controllers/UIEvents/RequestChangeBlockStateUIEvent.h>  #include "QtChatWindowJSBridge.h"  #include "QtUtilities.h" @@ -47,6 +48,7 @@  #include <QTextEdit>  #include <QTime>  #include <QUrl> +#include <QToolButton>  #include <QPushButton>  #include <QFileDialog>  #include <QMenu> @@ -66,7 +68,7 @@ const QString QtChatWindow::ButtonFileTransferAcceptRequest = QString("filetrans  const QString QtChatWindow::ButtonMUCInvite = QString("mucinvite"); -QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventStream* eventStream, SettingsProvider* settings, QMap<QString, QString> emoticons) : QtTabbable(), contact_(contact), previousMessageWasSelf_(false), previousMessageKind_(PreviosuMessageWasNone), eventStream_(eventStream), emoticons_(emoticons) { +QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventStream* eventStream, SettingsProvider* settings, QMap<QString, QString> emoticons) : QtTabbable(), contact_(contact), previousMessageWasSelf_(false), previousMessageKind_(PreviosuMessageWasNone), eventStream_(eventStream), emoticons_(emoticons), blockingState_(BlockingUnsupported) {  	settings_ = settings;  	unreadCount_ = 0;  	idCounter_ = 0; @@ -105,21 +107,18 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	alertLabel_->setStyleSheet(alertStyleSheet_);  	alertWidget_->hide(); -	QBoxLayout* subjectLayout = new QBoxLayout(QBoxLayout::LeftToRight); +	subjectLayout_ = new QBoxLayout(QBoxLayout::LeftToRight);  	subject_ = new QLineEdit(this); -	subjectLayout->addWidget(subject_); +	subjectLayout_->addWidget(subject_);  	setSubject("");  	subject_->setReadOnly(true); -	actionButton_ = new QPushButton(this); +	QPushButton* actionButton_ = new QPushButton(this);  	actionButton_->setIcon(QIcon(":/icons/actions.png"));  	connect(actionButton_, SIGNAL(clicked()), this, SLOT(handleActionButtonClicked())); -	subjectLayout->addWidget(actionButton_); -  	subject_->hide(); -	actionButton_->hide(); -	layout->addLayout(subjectLayout); +	layout->addLayout(subjectLayout_);  	logRosterSplitter_ = new QSplitter(this);  	logRosterSplitter_->setAutoFillBackground(true); @@ -159,6 +158,12 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	correctingLabel_ = new QLabel(tr("Correcting"), this);  	inputBarLayout->addWidget(correctingLabel_);  	correctingLabel_->hide(); + +	// using an extra layout to work around Qt margin glitches on OS X +	QHBoxLayout* actionLayout = new QHBoxLayout(); +	actionLayout->addWidget(actionButton_); + +	inputBarLayout->addLayout(actionLayout);  	layout->addLayout(inputBarLayout);  	inputClearing_ = false; @@ -415,7 +420,6 @@ void QtChatWindow::convertToMUC() {  	setAcceptDrops(false);  	treeWidget_->show();  	subject_->show(); -	actionButton_->show();  }  void QtChatWindow::qAppFocusChanged(QWidget* /*old*/, QWidget* /*now*/) { @@ -504,8 +508,7 @@ QString QtChatWindow::linkimoticonify(const QString& message) const {  	return messageHTML;  } -QString QtChatWindow::getHighlightSpanStart(const HighlightAction& highlight) -{ +QString QtChatWindow::getHighlightSpanStart(const HighlightAction& highlight) {  	QString color = QtUtilities::htmlEscape(P2QSTRING(highlight.getTextColor()));  	QString background = QtUtilities::htmlEscape(P2QSTRING(highlight.getTextBackground()));  	if (color.isEmpty()) { @@ -922,15 +925,26 @@ void QtChatWindow::handleActionButtonClicked() {  	QAction* destroy = NULL;  	QAction* invite = NULL; -	foreach(ChatWindow::RoomAction availableAction, availableRoomActions_) -	{ -		switch(availableAction) +	QAction* block = NULL; +	QAction* unblock = NULL; + +	if (availableRoomActions_.empty()) { +		if (blockingState_ == IsBlocked) { +			unblock = contextMenu.addAction(tr("Unblock")); +		} else if (blockingState_ == IsUnblocked) { +			block = contextMenu.addAction(tr("Block")); +		} +	} else { +		foreach(ChatWindow::RoomAction availableAction, availableRoomActions_)  		{ -			case ChatWindow::ChangeSubject: changeSubject = contextMenu.addAction(tr("Change subject…")); break; -			case ChatWindow::Configure: configure = contextMenu.addAction(tr("Configure room…")); break; -			case ChatWindow::Affiliations: affiliations = contextMenu.addAction(tr("Edit affiliations…")); break; -			case ChatWindow::Destroy: destroy = contextMenu.addAction(tr("Destroy room")); break; -			case ChatWindow::Invite: invite = contextMenu.addAction(tr("Invite person to this room…")); break; +			switch(availableAction) +			{ +				case ChatWindow::ChangeSubject: changeSubject = contextMenu.addAction(tr("Change subject…")); break; +				case ChatWindow::Configure: configure = contextMenu.addAction(tr("Configure room…")); break; +				case ChatWindow::Affiliations: affiliations = contextMenu.addAction(tr("Edit affiliations…")); break; +				case ChatWindow::Destroy: destroy = contextMenu.addAction(tr("Destroy room")); break; +				case ChatWindow::Invite: invite = contextMenu.addAction(tr("Invite person to this room…")); break; +			}  		}  	} @@ -970,6 +984,12 @@ void QtChatWindow::handleActionButtonClicked() {  	else if (result == invite) {  		onInvitePersonToThisMUCRequest();  	} +	else if (result == block) { +		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Blocked, JID(Q2PSTRING(contact_)))); +	} +	else if (result == unblock) { +		eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Unblocked, JID(Q2PSTRING(contact_)))); +	}  }  void QtChatWindow::handleAffiliationEditorAccepted() { @@ -981,11 +1001,14 @@ void QtChatWindow::setAffiliations(MUCOccupant::Affiliation affiliation, const s  	affiliationEditor_->setAffiliations(affiliation, jids);  } -void QtChatWindow::setAvailableRoomActions(const std::vector<RoomAction> &actions) -{ +void QtChatWindow::setAvailableRoomActions(const std::vector<RoomAction>& actions) {  	availableRoomActions_ = actions;  } +void QtChatWindow::setBlockingState(BlockingState state) { +	blockingState_ = state; +} +  void QtChatWindow::showRoomConfigurationForm(Form::ref form) {  	if (mucConfigurationWindow_) {  		delete mucConfigurationWindow_.data(); diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h index 4abd456..3ccea31 100644 --- a/Swift/QtUI/QtChatWindow.h +++ b/Swift/QtUI/QtChatWindow.h @@ -132,7 +132,8 @@ namespace Swift {  			void showRoomConfigurationForm(Form::ref);  			void addMUCInvitation(const std::string& senderName, const JID& jid, const std::string& reason, const std::string& password, bool direct = true);  			void setAffiliations(MUCOccupant::Affiliation, const std::vector<JID>&); -			void setAvailableRoomActions(const std::vector<RoomAction> &actions); +			void setAvailableRoomActions(const std::vector<RoomAction>& actions); +			void setBlockingState(BlockingState state);  			InviteToChatWindow* createInviteToChatWindow(); @@ -209,6 +210,7 @@ namespace Swift {  			QtChatTheme* theme_;  			QtTextEdit* input_;  			QWidget* midBar_;  +			QBoxLayout* subjectLayout_;  			QComboBox* labelsWidget_;  			QtOccupantListWidget* treeWidget_;  			QLabel* correctingLabel_; @@ -217,7 +219,6 @@ namespace Swift {  			QPushButton* alertButton_;  			TabComplete* completer_;  			QLineEdit* subject_; -			QPushButton* actionButton_;  			bool isCorrection_;  			bool previousMessageWasSelf_;  			PreviousMessageKind previousMessageKind_; @@ -240,5 +241,6 @@ namespace Swift {  			bool showEmoticons_;  			QPalette defaultLabelsPalette_;  			LabelModel* labelModel_; +			BlockingState blockingState_;  	};  } diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 9749397..572b06f 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -33,6 +33,7 @@  #include <Swift/Controllers/UIEvents/RequestProfileEditorUIEvent.h>  #include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>  #include <Swift/Controllers/UIEvents/RequestAdHocUIEvent.h> +#include <Swift/Controllers/UIEvents/RequestBlockListDialogUIEvent.h>  #include <Swift/QtUI/QtUISettingConstants.h>  #include <Swift/Controllers/SettingConstants.h>  #include <Swiften/Base/Platform.h> @@ -138,6 +139,10 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr  	connect(viewLogsAction, SIGNAL(triggered()), SLOT(handleViewLogsAction()));  	actionsMenu->addAction(viewLogsAction);  #endif +	openBlockingListEditor_ = new QAction(tr("Edit &Blocking List…"), this); +	connect(openBlockingListEditor_, SIGNAL(triggered()), SLOT(handleEditBlockingList())); +	actionsMenu->addAction(openBlockingListEditor_); +	openBlockingListEditor_->setVisible(false);  	addUserAction_ = new QAction(tr("&Add Contact…"), this);  	connect(addUserAction_, SIGNAL(triggered(bool)), this, SLOT(handleAddUserActionTriggered(bool)));  	actionsMenu->addAction(addUserAction_); @@ -190,6 +195,10 @@ void QtMainWindow::handleShowCertificateInfo() {  	onShowCertificateRequest();  } +void QtMainWindow::handleEditBlockingList() { +	uiEventStream_->send(boost::make_shared<RequestBlockListDialogUIEvent>()); +} +  QtEventWindow* QtMainWindow::getEventWindow() {  	return eventWindow_;  } @@ -359,5 +368,9 @@ void QtMainWindow::setAvailableAdHocCommands(const std::vector<DiscoItems::Item>  	}  } +void QtMainWindow::setBlockingCommandAvailable(bool isAvailable) { +	openBlockingListEditor_->setVisible(isAvailable); +} +  } diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index 99bc675..3e6e1d3 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -53,6 +53,7 @@ namespace Swift {  			QtChatListWindow* getChatListWindow();  			void setRosterModel(Roster* roster);  			void setAvailableAdHocCommands(const std::vector<DiscoItems::Item>& commands); +			void setBlockingCommandAvailable(bool isAvailable);  		private slots:  			void handleStatusChanged(StatusShow::Type showType, const QString &statusMessage);  			void handleSettingChanged(const std::string& settingPath); @@ -72,6 +73,7 @@ namespace Swift {  			void handleTabChanged(int index);  			void handleToggleRequestDeliveryReceipts(bool enabled);  			void handleShowCertificateInfo(); +			void handleEditBlockingList();  		private:  			SettingsProvider* settings_; @@ -85,6 +87,7 @@ namespace Swift {  			QAction* showOfflineAction_;  			QAction* compactRosterAction_;  			QAction* showEmoticonsAction_; +			QAction* openBlockingListEditor_;  			QAction* toggleRequestDeliveryReceipts_;  			QMenu* serverAdHocMenu_;  			QtTabWidget* tabs_; diff --git a/Swift/QtUI/QtUIFactory.cpp b/Swift/QtUI/QtUIFactory.cpp index 7ec25df..0c7fbc2 100644 --- a/Swift/QtUI/QtUIFactory.cpp +++ b/Swift/QtUI/QtUIFactory.cpp @@ -4,34 +4,35 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "QtUIFactory.h" +#include <Swift/QtUI/QtUIFactory.h>  #include <QSplitter> -#include "QtXMLConsoleWidget.h" -#include "QtChatTabs.h" -#include "QtMainWindow.h" -#include "QtLoginWindow.h" -#include "QtSystemTray.h" -#include "QtSettingsProvider.h" -#include "QtMainWindow.h" -#include "QtChatWindow.h" -#include "QtJoinMUCWindow.h" -#include "QtChatWindowFactory.h" -#include "QtSwiftUtil.h" -#include "MUCSearch/QtMUCSearchWindow.h" -#include "UserSearch/QtUserSearchWindow.h" -#include "QtProfileWindow.h" -#include "QtContactEditWindow.h" -#include "QtAdHocCommandWindow.h" -#include "QtFileTransferListWidget.h" -#include <QtHighlightEditorWidget.h> -#include "Whiteboard/QtWhiteboardWindow.h" +#include <Swift/QtUI/QtXMLConsoleWidget.h> +#include <Swift/QtUI/QtChatTabs.h> +#include <Swift/QtUI/QtMainWindow.h> +#include <Swift/QtUI/QtLoginWindow.h> +#include <Swift/QtUI/QtSystemTray.h> +#include <Swift/QtUI/QtSettingsProvider.h> +#include <Swift/QtUI/QtMainWindow.h> +#include <Swift/QtUI/QtChatWindow.h> +#include <Swift/QtUI/QtJoinMUCWindow.h> +#include <Swift/QtUI/QtChatWindowFactory.h> +#include <Swift/QtUI/QtSwiftUtil.h> +#include <Swift/QtUI/MUCSearch/QtMUCSearchWindow.h> +#include <Swift/QtUI/UserSearch/QtUserSearchWindow.h> +#include <Swift/QtUI/QtProfileWindow.h> +#include <Swift/QtUI/QtContactEditWindow.h> +#include <Swift/QtUI/QtAdHocCommandWindow.h> +#include <Swift/QtUI/QtFileTransferListWidget.h> +#include <Swift/QtUI/QtHighlightEditorWidget.h> +#include <Swift/QtUI/Whiteboard/QtWhiteboardWindow.h>  #include <Swift/Controllers/Settings/SettingsProviderHierachy.h>  #include <Swift/QtUI/QtUISettingConstants.h> -#include <QtHistoryWindow.h> +#include <Swift/QtUI/QtHistoryWindow.h>  #include <Swiften/Whiteboard/WhiteboardSession.h> -#include <QtSingleWindow.h> +#include <Swift/QtUI/QtSingleWindow.h> +#include <Swift/QtUI/QtBlockListEditorWindow.h>  namespace Swift { @@ -167,6 +168,10 @@ HighlightEditorWidget* QtUIFactory::createHighlightEditorWidget() {  	return new QtHighlightEditorWidget();  } +BlockListEditorWidget *QtUIFactory::createBlockListEditorWidget() { +	return new QtBlockListEditorWindow(); +} +  void QtUIFactory::createAdHocCommandWindow(boost::shared_ptr<OutgoingAdHocCommandSession> command) {  	new QtAdHocCommandWindow(command);  } diff --git a/Swift/QtUI/QtUIFactory.h b/Swift/QtUI/QtUIFactory.h index a1baa82..662c78e 100644 --- a/Swift/QtUI/QtUIFactory.h +++ b/Swift/QtUI/QtUIFactory.h @@ -49,6 +49,7 @@ namespace Swift {  			virtual FileTransferListWidget* createFileTransferListWidget();  			virtual WhiteboardWindow* createWhiteboardWindow(boost::shared_ptr<WhiteboardSession> whiteboardSession);  			virtual HighlightEditorWidget* createHighlightEditorWidget(); +			virtual BlockListEditorWidget* createBlockListEditorWidget();  			virtual void createAdHocCommandWindow(boost::shared_ptr<OutgoingAdHocCommandSession> command);  		private slots: diff --git a/Swift/QtUI/Roster/QtRosterWidget.cpp b/Swift/QtUI/Roster/QtRosterWidget.cpp index b783ff6..6bf3989 100644 --- a/Swift/QtUI/Roster/QtRosterWidget.cpp +++ b/Swift/QtUI/Roster/QtRosterWidget.cpp @@ -4,24 +4,25 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "Roster/QtRosterWidget.h" +#include <Swift/QtUI/Roster/QtRosterWidget.h>  #include <QContextMenuEvent>  #include <QMenu>  #include <QInputDialog>  #include <QFileDialog> -#include "Swift/Controllers/UIEvents/RequestContactEditorUIEvent.h" -#include "Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h" -#include "Swift/Controllers/UIEvents/RenameGroupUIEvent.h" -#include "Swift/Controllers/UIEvents/SendFileUIEvent.h" -#include "Swift/Controllers/UIEvents/RequestWhiteboardUIEvent.h" -#include "Swift/Controllers/UIEvents/ShowProfileForRosterItemUIEvent.h" -#include "QtContactEditWindow.h" -#include "Swift/Controllers/Roster/ContactRosterItem.h" -#include "Swift/Controllers/Roster/GroupRosterItem.h" -#include "Swift/Controllers/UIEvents/UIEventStream.h" -#include "QtSwiftUtil.h" +#include <Swift/Controllers/UIEvents/RequestContactEditorUIEvent.h> +#include <Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h> +#include <Swift/Controllers/UIEvents/RenameGroupUIEvent.h> +#include <Swift/Controllers/UIEvents/SendFileUIEvent.h> +#include <Swift/Controllers/UIEvents/RequestWhiteboardUIEvent.h> +#include <Swift/Controllers/UIEvents/ShowProfileForRosterItemUIEvent.h> +#include <Swift/Controllers/UIEvents/RequestChangeBlockStateUIEvent.h> +#include <Swift/QtUI/QtContactEditWindow.h> +#include <Swift/Controllers/Roster/ContactRosterItem.h> +#include <Swift/Controllers/Roster/GroupRosterItem.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/QtUI/QtSwiftUtil.h>  namespace Swift { @@ -59,6 +60,17 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {  		QAction* editContact = contextMenu.addAction(tr("Edit…"));  		QAction* removeContact = contextMenu.addAction(tr("Remove"));  		QAction* showProfileForContact = contextMenu.addAction(tr("Show Profile")); + +		QAction* unblockContact = NULL; +		if (contact->blockState() == ContactRosterItem::IsBlocked) { +			unblockContact = contextMenu.addAction(tr("Unblock")); +		} + +		QAction* blockContact = NULL; +		if (contact->blockState() == ContactRosterItem::IsUnblocked) { +			blockContact = contextMenu.addAction(tr("Block")); +		} +  #ifdef SWIFT_EXPERIMENTAL_FT  		QAction* sendFile = NULL;  		if (contact->supportsFeature(ContactRosterItem::FileTransferFeature)) { @@ -71,6 +83,7 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {  			startWhiteboardChat = contextMenu.addAction(tr("Start Whiteboard Chat"));  		}  #endif +  		QAction* result = contextMenu.exec(event->globalPos());  		if (result == editContact) {  			eventStream_->send(boost::make_shared<RequestContactEditorUIEvent>(contact->getJID())); @@ -83,6 +96,12 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {  		else if (result == showProfileForContact) {  			eventStream_->send(boost::make_shared<ShowProfileForRosterItemUIEvent>(contact->getJID()));  		} +		else if (unblockContact && result == unblockContact) { +			eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Unblocked, contact->getJID())); +		} +		else if (blockContact && result == blockContact) { +			eventStream_->send(boost::make_shared<RequestChangeBlockStateUIEvent>(RequestChangeBlockStateUIEvent::Blocked, contact->getJID())); +		}  #ifdef SWIFT_EXPERIMENTAL_FT  		else if (sendFile && result == sendFile) {  			QString fileName = QFileDialog::getOpenFileName(this, tr("Send File"), "", tr("All Files (*);;")); diff --git a/Swift/QtUI/Roster/RosterModel.cpp b/Swift/QtUI/Roster/RosterModel.cpp index 2909c05..8f39f35 100644 --- a/Swift/QtUI/Roster/RosterModel.cpp +++ b/Swift/QtUI/Roster/RosterModel.cpp @@ -162,6 +162,10 @@ QString RosterModel::getStatusText(RosterItem* item) const {  QIcon RosterModel::getPresenceIcon(RosterItem* item) const {  	ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item);  	if (!contact) return QIcon(); +	if (contact->blockState() == ContactRosterItem::IsBlocked) { +		return QIcon(":/icons/stop.png"); +	} +  	QString iconString;  	switch (contact->getStatusShow()) {  		case StatusShow::Online: iconString = "online";break; diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index 0d69d6b..0bcab5e 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -94,6 +94,7 @@ sources = [      "QtLoginWindow.cpp",      "QtMainWindow.cpp",      "QtProfileWindow.cpp", +    "QtBlockListEditorWindow.cpp",      "QtNameWidget.cpp",      "QtSettingsProvider.cpp",      "QtStatusWidget.cpp", @@ -273,6 +274,7 @@ myenv.Uic4("QtHistoryWindow.ui")  myenv.Uic4("QtConnectionSettings.ui")  myenv.Uic4("QtHighlightRuleWidget.ui")  myenv.Uic4("QtHighlightEditorWidget.ui") +myenv.Uic4("QtBlockListEditorWindow.ui")  myenv.Uic4("QtSpellCheckerWindow.ui")  myenv.Qrc("DefaultTheme.qrc")  myenv.Qrc("Swift.qrc") diff --git a/Swift/QtUI/Swift.qrc b/Swift/QtUI/Swift.qrc index f1b3140..eeef80d 100644 --- a/Swift/QtUI/Swift.qrc +++ b/Swift/QtUI/Swift.qrc @@ -41,5 +41,6 @@  		<file alias="icons/star-checked.png">../resources/icons/star-checked2.png</file>  		<file alias="icons/star-unchecked.png">../resources/icons/star-unchecked2.png</file>  		<file alias="icons/zzz.png">../resources/icons/zzz.png</file> +		<file alias="icons/stop.png">../resources/icons/stop.png</file>  	</qresource>  </RCC> | 
 Swift
 Swift