diff options
Diffstat (limited to 'Swift/QtUI/Roster')
| -rw-r--r-- | Swift/QtUI/Roster/QtRosterWidget.cpp | 12 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.cpp | 39 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.h | 7 | 
3 files changed, 58 insertions, 0 deletions
diff --git a/Swift/QtUI/Roster/QtRosterWidget.cpp b/Swift/QtUI/Roster/QtRosterWidget.cpp index 923f977..f3b0441 100644 --- a/Swift/QtUI/Roster/QtRosterWidget.cpp +++ b/Swift/QtUI/Roster/QtRosterWidget.cpp @@ -9,10 +9,12 @@  #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 "QtContactEditWindow.h"  #include "Swift/Controllers/Roster/ContactRosterItem.h"  #include "Swift/Controllers/Roster/GroupRosterItem.h" @@ -54,6 +56,10 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {  	if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) {  		QAction* editContact = contextMenu.addAction(tr("Edit"));  		QAction* removeContact = contextMenu.addAction(tr("Remove")); +		QAction* sendFile = NULL; +		if (contact->supportsFeature(ContactRosterItem::FileTransferFeature)) { +			sendFile = contextMenu.addAction(tr("Send File")); +		}  		QAction* result = contextMenu.exec(event->globalPos());  		if (result == editContact) {  			eventStream_->send(boost::make_shared<RequestContactEditorUIEvent>(contact->getJID())); @@ -63,6 +69,12 @@ void QtRosterWidget::contextMenuEvent(QContextMenuEvent* event) {  				eventStream_->send(boost::make_shared<RemoveRosterItemUIEvent>(contact->getJID()));  			}  		} +		else if (result == sendFile) { +			QString fileName = QFileDialog::getOpenFileName(this, tr("Send File"), "", tr("All Files (*);;")); +			if (!fileName.isEmpty()) { +				eventStream_->send(boost::make_shared<SendFileUIEvent>(contact->getJID(), fileName.toStdString())); +			} +		}  	}  	else if (GroupRosterItem* group = dynamic_cast<GroupRosterItem*>(item)) {  		QAction* renameGroupAction = contextMenu.addAction(tr("Rename")); diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp index 96a078b..79dd6a2 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -8,11 +8,14 @@  #include <boost/smart_ptr/make_shared.hpp> +#include <QUrl> +  #include "Swiften/Base/Platform.h"  #include "Swift/Controllers/Roster/ContactRosterItem.h"  #include "Swift/Controllers/Roster/GroupRosterItem.h"  #include "Swift/Controllers/UIEvents/UIEventStream.h"  #include "Swift/Controllers/UIEvents/RequestChatUIEvent.h" +#include "Swift/Controllers/UIEvents/SendFileUIEvent.h"  #include "QtSwiftUtil.h"  namespace Swift { @@ -31,6 +34,7 @@ QtTreeWidget::QtTreeWidget(UIEventStream* eventStream, QWidget* parent) : QTreeV  	expandAll();  	setAnimated(true);  	setIndentation(0); +	setAcceptDrops(true);  	setRootIsDecorated(true);  	connect(this, SIGNAL(activated(const QModelIndex&)), this, SLOT(handleItemActivated(const QModelIndex&)));  	connect(model_, SIGNAL(itemExpanded(const QModelIndex&, bool)), this, SLOT(handleModelItemExpanded(const QModelIndex&, bool))); @@ -104,6 +108,41 @@ void QtTreeWidget::handleItemActivated(const QModelIndex& index) {  	}  } +void QtTreeWidget::dragEnterEvent(QDragEnterEvent *event) { +	if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() == 1) { +		event->acceptProposedAction(); +	} +} + +void QtTreeWidget::dropEvent(QDropEvent *event) { +	QModelIndex index = indexAt(event->pos()); +	if (index.isValid()) { +		RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); +		if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) { +			if (contact->supportsFeature(ContactRosterItem::FileTransferFeature)) { +				QString filename = event->mimeData()->urls().at(0).toLocalFile(); +				if (!filename.isEmpty()) { +					eventStream_->send(boost::make_shared<SendFileUIEvent>(contact->getJID(), filename.toStdString())); +				} +			} +		} +	} +} + +void QtTreeWidget::dragMoveEvent(QDragMoveEvent* event) { +	QModelIndex index = indexAt(event->pos()); +	if (index.isValid()) { +		RosterItem* item = static_cast<RosterItem*>(index.internalPointer()); +		if (ContactRosterItem* contact = dynamic_cast<ContactRosterItem*>(item)) { +			if (contact->supportsFeature(ContactRosterItem::FileTransferFeature)) { +				event->accept(); +				return; +			} +		} +	} +	event->ignore(); +} +  void QtTreeWidget::handleExpanded(const QModelIndex& index) {  	GroupRosterItem* item = dynamic_cast<GroupRosterItem*>(static_cast<RosterItem*>(index.internalPointer()));  	if (item) { diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index 1ad56d6..271fbd5 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -8,6 +8,9 @@  #include <QTreeView>  #include <QModelIndex> +#include <QDragEnterEvent> +#include <QDropEvent> +#include <QDragMoveEvent>  #include "Swift/QtUI/Roster/RosterModel.h"  #include "Swift/QtUI/Roster/RosterDelegate.h" @@ -31,6 +34,10 @@ class QtTreeWidget : public QTreeView{  		void handleExpanded(const QModelIndex&);  		void handleCollapsed(const QModelIndex&);  		void handleClicked(const QModelIndex&); +	protected: +		void dragEnterEvent(QDragEnterEvent* event); +		void dropEvent(QDropEvent* event); +		void dragMoveEvent(QDragMoveEvent* event);  	protected:  		QModelIndexList getSelectedIndexes() const;  | 
 Swift