From b5fd37a9ddef890bf6bbf8b939dc9a1a284c5237 Mon Sep 17 00:00:00 2001
From: Anna Udovichenko <anuta.udovichenko@gmail.com>
Date: Mon, 7 May 2012 16:50:25 +0300
Subject: [PATCH 1/3] added importing images from board to library

---
 src/board/UBFeaturesController.cpp | 21 ++++++++++++
 src/board/UBFeaturesController.h   |  1 +
 src/gui/UBFeaturesWidget.cpp       | 55 +++++++++++++++++++-----------
 src/gui/UBFeaturesWidget.h         |  1 +
 4 files changed, 58 insertions(+), 20 deletions(-)

diff --git a/src/board/UBFeaturesController.cpp b/src/board/UBFeaturesController.cpp
index b104c317..a2678f36 100644
--- a/src/board/UBFeaturesController.cpp
+++ b/src/board/UBFeaturesController.cpp
@@ -345,6 +345,27 @@ QPixmap UBFeaturesController::createThumbnail(const QString &path)
     return QPixmap(thumbnailPath);
 }
 
+UBFeature UBFeaturesController::importImage( const QImage &image, const UBFeature &destination )
+{
+    QDateTime now = QDateTime::currentDateTime();
+    QString fileName = tr("ImportedImage") + "-" + now.toString("dd-MM-yyyy hh-mm-ss") + ".png";
+
+    UBFeature dest = destination;
+
+    if ( !destination.getFullVirtualPath().startsWith( picturesElement.getFullVirtualPath(), Qt::CaseInsensitive ) )
+    {
+	    dest = picturesElement;
+    }
+
+    QString filePath = dest.getFullPath().toLocalFile() + "/" + fileName;
+    image.save(filePath);
+
+    QPixmap thumb = createThumbnail( filePath );
+    return UBFeature( dest.getFullVirtualPath(), thumb, fileName, 
+        QUrl::fromLocalFile( filePath ), FEATURE_ITEM );
+    
+}
+
 UBFeature UBFeaturesController::newFolder( const QString &name )
 {
     QString path = currentElement.getFullPath().toLocalFile() + "/" + name;
diff --git a/src/board/UBFeaturesController.h b/src/board/UBFeaturesController.h
index 0431eb7e..254514a4 100644
--- a/src/board/UBFeaturesController.h
+++ b/src/board/UBFeaturesController.h
@@ -86,6 +86,7 @@ public:
 	UBFeature newFolder( const QString &name );
 	UBFeature addToFavorite( const QUrl &path );
 	void removeFromFavorite( const QUrl &path );
+    UBFeature importImage( const QImage &image, const UBFeature &destination );
 
 	static QString fileNameFromUrl( const QUrl &url );
 	static QPixmap thumbnailForFile( const QString &path );
diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp
index c5d5cd76..b5e70b2b 100644
--- a/src/gui/UBFeaturesWidget.cpp
+++ b/src/gui/UBFeaturesWidget.cpp
@@ -404,13 +404,19 @@ void UBFeaturesListView::mouseReleaseEvent( QMouseEvent *event )
 */
 void UBFeaturesListView::dragEnterEvent( QDragEnterEvent *event )
 {
-	if ( event->mimeData()->hasUrls() )
+    if ( event->mimeData()->hasUrls() || event->mimeData()->hasImage() )
 		event->acceptProposedAction();
 }
 
+void UBFeaturesListView::dragMoveEvent( QDragMoveEvent *event )
+{
+    if ( event->mimeData()->hasUrls() || event->mimeData()->hasImage() )
+        event->acceptProposedAction();
+}
+
 void UBFeaturesListView::dropEvent( QDropEvent *event )
 {
-	if( event->source() || dynamic_cast<UBFeaturesListView *>( event->source() ) )
+	if( event->source() && dynamic_cast<UBFeaturesListView *>( event->source() ) )
 	{
 		event->setDropAction( Qt::MoveAction );
 	}
@@ -775,7 +781,7 @@ bool UBFeaturesModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction act
 {
     Q_UNUSED(row)
 
-    if ( !mimeData->hasUrls() )
+    if ( !mimeData->hasUrls() && !mimeData->hasImage() )
 		return false;
 	if ( action == Qt::IgnoreAction )
 		return true;
@@ -794,22 +800,31 @@ bool UBFeaturesModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction act
 		parentFeature = parent.data( Qt::UserRole + 1).value<UBFeature>();
 	}
 
-	QList<QUrl> urls = mimeData->urls();
-	
-	foreach ( QUrl url, urls )
-	{
-		UBFeature element;
-		
-		if ( action == Qt::MoveAction )
-		{
-			element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->moveItemToFolder( url, parentFeature );
-		}
-		else
-		{
-			element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->copyItemToFolder( url, parentFeature );
-		}
-		addItem( element );
-	}
+    if ( mimeData->hasUrls() )
+    {
+	    QList<QUrl> urls = mimeData->urls();
+    	
+	    foreach ( QUrl url, urls )
+	    {
+		    UBFeature element;
+    		
+		    if ( action == Qt::MoveAction )
+		    {
+			    element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->moveItemToFolder( url, parentFeature );
+		    }
+		    else
+		    {
+			    element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->copyItemToFolder( url, parentFeature );
+		    }
+		    addItem( element );
+	    }
+    }
+    else if ( mimeData->hasImage() )
+    {
+        QImage image = qvariant_cast<QImage>( mimeData->imageData() );
+        UBFeature element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->importImage( image, parentFeature );
+        addItem( element );
+    }
 	return true;
 }
 
@@ -897,7 +912,7 @@ Qt::ItemFlags UBFeaturesModel::flags( const QModelIndex &index ) const
 QStringList UBFeaturesModel::mimeTypes() const
 {
 	QStringList types;
-    types << "text/uri-list";
+    types << "text/uri-list" << "image/png" << "image/tiff" << "image/gif" << "image/jpeg";
     return types;
 }
 
diff --git a/src/gui/UBFeaturesWidget.h b/src/gui/UBFeaturesWidget.h
index d9e77a4d..69dfe4fa 100644
--- a/src/gui/UBFeaturesWidget.h
+++ b/src/gui/UBFeaturesWidget.h
@@ -114,6 +114,7 @@ public:
 protected:
 	virtual void dragEnterEvent( QDragEnterEvent *event );
 	virtual void dropEvent( QDropEvent *event );
+    virtual void dragMoveEvent( QDragMoveEvent *event );
 	/*virtual void mousePressEvent( QMouseEvent *event );
 	virtual void mouseMoveEvent( QMouseEvent *event );
 	virtual void mouseReleaseEvent( QMouseEvent *event );*/

From 604ea2faeafd751d10a6d6d9cde2fdf19085d4b7 Mon Sep 17 00:00:00 2001
From: Anna Udovichenko <anuta.udovichenko@gmail.com>
Date: Mon, 7 May 2012 17:22:16 +0300
Subject: [PATCH 2/3] Fixed some DnD bugs

---
 src/board/UBFeaturesController.cpp | 36 ++++++++++++++++++++++++++++--
 src/gui/UBFeaturesWidget.cpp       |  2 +-
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/board/UBFeaturesController.cpp b/src/board/UBFeaturesController.cpp
index a2678f36..5bd9f5b7 100644
--- a/src/board/UBFeaturesController.cpp
+++ b/src/board/UBFeaturesController.cpp
@@ -429,8 +429,39 @@ UBFeature UBFeaturesController::addDownloadedFile( const QUrl &sourceUrl, const
 
 UBFeature UBFeaturesController::moveItemToFolder( const QUrl &url, const UBFeature &destination )
 {
-	UBFeature newElement = copyItemToFolder( url, destination );
+	/*UBFeature newElement = copyItemToFolder( url, destination );
 	deleteItem( url );
+	return newElement;*/
+    QString sourcePath = url.toLocalFile();
+
+	Q_ASSERT( QFileInfo( sourcePath ).exists() );
+
+	UBFeature possibleDest = getDestinationForItem( url );
+
+	UBFeature dest = destination;
+
+	if ( destination != trashElement && 
+		!destination.getFullVirtualPath().startsWith( possibleDest.getFullVirtualPath(), Qt::CaseInsensitive ) )
+	{
+		dest = possibleDest;
+	}
+
+	QString name = QFileInfo( sourcePath ).fileName();
+    QString destPath = dest.getFullPath().toLocalFile();
+	QString destVirtualPath = dest.getFullVirtualPath();
+	QString newFullPath = destPath + "/" + name;
+    if ( sourcePath.compare( newFullPath, Qt::CaseInsensitive ) )
+    {
+	    QFile( sourcePath ).copy( newFullPath );
+        deleteItem( url );
+    }
+
+	QPixmap thumb = thumbnailForFile( newFullPath );
+	
+    UBFeatureElementType type = FEATURE_ITEM;
+	if ( UBFileSystemUtils::mimeTypeFromFileName( newFullPath ).contains("application") ) 
+        type = FEATURE_INTERACTIVE;
+    UBFeature newElement( destVirtualPath, thumb, name, QUrl::fromLocalFile( newFullPath ), type );
 	return newElement;
 }
 
@@ -454,7 +485,8 @@ UBFeature UBFeaturesController::copyItemToFolder( const QUrl &url, const UBFeatu
     QString destPath = dest.getFullPath().toLocalFile();
 	QString destVirtualPath = dest.getFullVirtualPath();
 	QString newFullPath = destPath + "/" + name;
-	QFile( sourcePath ).copy( newFullPath );
+    if ( !sourcePath.compare( newFullPath, Qt::CaseInsensitive ) )
+	    QFile( sourcePath ).copy( newFullPath );
 
 	QPixmap thumb = thumbnailForFile( newFullPath );
 	
diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp
index b5e70b2b..ea0fcaa7 100644
--- a/src/gui/UBFeaturesWidget.cpp
+++ b/src/gui/UBFeaturesWidget.cpp
@@ -831,7 +831,7 @@ bool UBFeaturesModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction act
 void UBFeaturesModel::addItem( const UBFeature &item )
 {
 	beginInsertRows( QModelIndex(), featuresList->size(), featuresList->size() );
-	featuresList->push_back( item );
+	featuresList->append( item );
 	endInsertRows();
 }
 

From de0ea916ad629a5a043a82b373d19a51546baa22 Mon Sep 17 00:00:00 2001
From: Anna Udovichenko <anuta.udovichenko@gmail.com>
Date: Mon, 7 May 2012 18:38:07 +0300
Subject: [PATCH 3/3] Implemented adding selected group of elements to favorite

---
 src/gui/UBFeaturesActionBar.cpp |  9 +++++++--
 src/gui/UBFeaturesActionBar.h   |  2 ++
 src/gui/UBFeaturesWidget.cpp    | 35 +++++++++++++++++++++++----------
 src/gui/UBFeaturesWidget.h      |  1 +
 4 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/src/gui/UBFeaturesActionBar.cpp b/src/gui/UBFeaturesActionBar.cpp
index ac009c48..8311bfc9 100644
--- a/src/gui/UBFeaturesActionBar.cpp
+++ b/src/gui/UBFeaturesActionBar.cpp
@@ -66,8 +66,8 @@ UBFeaturesActionBar::UBFeaturesActionBar( UBFeaturesController *controller, QWid
     mButtonGroup->addButton(mpRemoveFavoriteBtn);
     mButtonGroup->addButton(mpNewFolderBtn);
     // Connect signals & slots
-    /*connect(mpFavoriteAction,SIGNAL(triggered()), this, SLOT(onActionFavorite()));
-    connect(mpSocialAction,SIGNAL(triggered()), this, SLOT(onActionSocial()));
+    connect(mpFavoriteAction,SIGNAL(triggered()), this, SLOT(onActionFavorite()));
+    /*connect(mpSocialAction,SIGNAL(triggered()), this, SLOT(onActionSocial()));
     connect(mpSearchAction,SIGNAL(triggered()), this, SLOT(onActionSearch()));
     connect(mpDeleteAction,SIGNAL(triggered()), this, SLOT(onActionTrash()));
     connect(mpCloseAction, SIGNAL(triggered()), this, SLOT(onActionClose()));
@@ -170,6 +170,11 @@ void UBFeaturesActionBar::onActionNewFolder()
     emit newFolderToCreate();
 }
 
+void UBFeaturesActionBar::onActionFavorite()
+{
+    emit addElementsToFavorite();
+}
+
 /*
 void UBFeaturesActionBar::dragMoveEvent(QDragMoveEvent *event)
 {
diff --git a/src/gui/UBFeaturesActionBar.h b/src/gui/UBFeaturesActionBar.h
index a45371d8..7aec99a9 100644
--- a/src/gui/UBFeaturesActionBar.h
+++ b/src/gui/UBFeaturesActionBar.h
@@ -30,9 +30,11 @@ signals:
 	void deleteElements( const QMimeData &data );
 	void addToFavorite( const QMimeData &data );
 	void removeFromFavorite( const QMimeData &data );
+    void addElementsToFavorite();
 private slots:
 	void onSearchTextChanged(QString txt);
 	void onActionNewFolder();
+    void onActionFavorite();
 protected:
 	//void dragMoveEvent(QDragMoveEvent *event);
 	void dragEnterEvent( QDragEnterEvent *event );
diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp
index ea0fcaa7..7a71b555 100644
--- a/src/gui/UBFeaturesWidget.cpp
+++ b/src/gui/UBFeaturesWidget.cpp
@@ -121,6 +121,7 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
 	connect( mActionBar, SIGNAL( deleteElements(const QMimeData &) ), this, SLOT( deleteElements(const QMimeData &) ) ); 
 	connect( mActionBar, SIGNAL( addToFavorite(const QMimeData &) ), this, SLOT( addToFavorite(const QMimeData &) ) );
 	connect( mActionBar, SIGNAL( removeFromFavorite(const QMimeData &) ), this, SLOT( removeFromFavorite(const QMimeData &) ) );
+    connect ( mActionBar, SIGNAL( addElementsToFavorite() ), this, SLOT ( addElementsToFavorite() ) ); 
 	connect( pathListView, SIGNAL(clicked( const QModelIndex & ) ),
 		this, SLOT( currentPathChanged( const QModelIndex & ) ) );
 	connect( thumbSlider, SIGNAL( sliderMoved(int) ), this, SLOT(thumbnailSizeChanged( int ) ) );
@@ -333,6 +334,20 @@ void UBFeaturesWidget::onAddDownloadedFileToLibrary(bool pSuccess, QUrl sourceUr
     }
 }
 
+void UBFeaturesWidget::addElementsToFavorite()
+{
+    QModelIndexList selected = featuresListView->selectionModel()->selectedIndexes();
+    for ( int i = 0; i < selected.size(); ++i )
+    {
+        UBFeature feature = selected.at(i).data( Qt::UserRole + 1 ).value<UBFeature>();
+        UBFeature elem = controller->addToFavorite( feature.getFullPath() );
+		if ( !elem.getVirtualPath().isEmpty() && !elem.getVirtualPath().isNull() )
+			featuresModel->addItem( elem );
+    }
+    QSortFilterProxyModel *model = dynamic_cast<QSortFilterProxyModel *>( featuresListView->model() );
+	model->invalidate();
+}
+
 void UBFeaturesWidget::switchToListView()
 {
 	stackedWidget->setCurrentIndex(ID_LISTVIEW);
@@ -806,17 +821,17 @@ bool UBFeaturesModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction act
     	
 	    foreach ( QUrl url, urls )
 	    {
-		    UBFeature element;
+	        UBFeature element;
     		
-		    if ( action == Qt::MoveAction )
-		    {
-			    element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->moveItemToFolder( url, parentFeature );
-		    }
-		    else
-		    {
-			    element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->copyItemToFolder( url, parentFeature );
-		    }
-		    addItem( element );
+	        if ( action == Qt::MoveAction )
+	        {
+		        element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->moveItemToFolder( url, parentFeature );
+	        }
+	        else
+	        {
+		        element = dynamic_cast<UBFeaturesWidget *>(QObject::parent())->getFeaturesController()->copyItemToFolder( url, parentFeature );
+	        }
+	        addItem( element );
 	    }
     }
     else if ( mimeData->hasImage() )
diff --git a/src/gui/UBFeaturesWidget.h b/src/gui/UBFeaturesWidget.h
index 69dfe4fa..85aaebbd 100644
--- a/src/gui/UBFeaturesWidget.h
+++ b/src/gui/UBFeaturesWidget.h
@@ -101,6 +101,7 @@ private slots:
 	void thumbnailSizeChanged( int );
 	void onDisplayMetadata( QMap<QString,QString> );
     void onAddDownloadedFileToLibrary(bool, QUrl, QString, QByteArray);
+    void addElementsToFavorite();
 protected:
 	bool eventFilter(QObject *target, QEvent *event);
 };