Skip to content

Commit

Permalink
Make the style copy/paste functionality closer to the geometry copy/p…
Browse files Browse the repository at this point in the history
…aste implementation
  • Loading branch information
Hugo Mercier authored and timlinux committed Apr 17, 2012
1 parent 0daaf23 commit 70a2a4a
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 14 deletions.
3 changes: 2 additions & 1 deletion src/app/legend/qgslegend.cpp
Expand Up @@ -33,6 +33,7 @@
#include "qgsrasterlayer.h"
#include "qgsvectorlayer.h"
#include "qgsgenericprojectionselector.h"
#include "qgsclipboard.h"

#include <QFont>
#include <QDomDocument>
Expand Down Expand Up @@ -702,7 +703,7 @@ void QgsLegend::handleRightClickEvent( QTreeWidgetItem* item, const QPoint& posi
{
QgisApp* app = QgisApp::instance();
theMenu.addAction( tr( "Copy Style" ), app, SLOT( copyStyle() ) );
if ( QApplication::clipboard()->mimeData()->hasFormat( "application/qgis.style" ) )
if ( app->clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) )
{
theMenu.addAction( tr( "Paste Style" ), app, SLOT( pasteStyle() ) );
}
Expand Down
18 changes: 7 additions & 11 deletions src/app/qgisapp.cpp
Expand Up @@ -4400,11 +4400,10 @@ void QgisApp::copyStyle( QgsMapLayer * sourceLayer )
QMessageBox::Ok );
return;
}
QClipboard* clipboard = QApplication::clipboard();
QMimeData *mimeData = new QMimeData();
mimeData->setData( "application/qgis.style", doc.toByteArray() );
// transfers the ownership to the clipboard object
clipboard->setMimeData( mimeData );
// Copies data in text form as well, so the XML can be pasted into a text editor
clipboard()->setData( QGSCLIPBOARD_STYLE_MIME, doc.toByteArray(), doc.toString() );
// Enables the paste menu element
mActionPasteStyle->setEnabled( true );
}
}

Expand All @@ -4413,15 +4412,12 @@ void QgisApp::pasteStyle( QgsMapLayer * destinationLayer )
QgsMapLayer *selectionLayer = destinationLayer ? destinationLayer : activeLayer();
if ( selectionLayer )
{
QClipboard* clipboard = QApplication::clipboard();

const QMimeData* mimeData = clipboard->mimeData();
if ( mimeData->hasFormat( "application/qgis.style" ) )
if ( clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) )
{
QDomDocument doc( "qgis" );
QString errorMsg;
int errorLine, errorColumn;
if ( !doc.setContent ( mimeData->data( "application/qgis.style" ), false, &errorMsg, &errorLine, &errorColumn ) )
if ( !doc.setContent ( clipboard()->data( QGSCLIPBOARD_STYLE_MIME ), false, &errorMsg, &errorLine, &errorColumn ) )
{
QMessageBox::information( this,
tr( "Error" ),
Expand Down Expand Up @@ -6403,7 +6399,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
mActionZoomToLayer->setEnabled( true );

mActionCopyStyle->setEnabled( true );
mActionPasteStyle->setEnabled( QApplication::clipboard()->mimeData()->hasFormat( "application/qgis.style" ) );
mActionPasteStyle->setEnabled( clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) );

/***********Vector layers****************/
if ( layer->type() == QgsMapLayer::VectorLayer )
Expand Down
40 changes: 38 additions & 2 deletions src/app/qgsclipboard.cpp
Expand Up @@ -22,6 +22,7 @@
#include <QStringList>
#include <QClipboard>
#include <QSettings>
#include <QMimeData>

#include "qgsclipboard.h"
#include "qgsfeature.h"
Expand Down Expand Up @@ -104,9 +105,9 @@ void QgsClipboard::replaceWithCopyOf( const QgsFieldMap& fields, QgsFeatureList&
// docs). With a Linux X server, ::Clipboard was required.
// The simple solution was to put the text into both clipboards.

// The ::Selection setText() below one may need placing inside so
// #ifdef so that it doesn't get compiled under Windows.
#ifndef Q_OS_WIN
cb->setText( textCopy, QClipboard::Selection );
#endif
cb->setText( textCopy, QClipboard::Clipboard );

QgsDebugMsg( QString( "replaced system clipboard with: %1." ).arg( textCopy ) );
Expand Down Expand Up @@ -163,3 +164,38 @@ QgsCoordinateReferenceSystem QgsClipboard::crs()
{
return mCRS;
}

void QgsClipboard::setData( const QString& mimeType, const QByteArray& data, const QString* text )
{
QMimeData *mdata = new QMimeData();
mdata->setData( mimeType, data );
if ( text )
{
mdata->setText( *text );
}
// Transfers ownership to the clipboard object
#ifndef Q_OS_WIN
QApplication::clipboard()->setMimeData( mdata, QClipboard::Selection );
#endif
QApplication::clipboard()->setMimeData( mdata, QClipboard::Clipboard );
}

void QgsClipboard::setData( const QString& mimeType, const QByteArray& data, const QString& text )
{
setData( mimeType, data, &text );
}

void QgsClipboard::setData( const QString& mimeType, const QByteArray& data )
{
setData( mimeType, data, 0 );
}

bool QgsClipboard::hasFormat( const QString& mimeType )
{
return QApplication::clipboard()->mimeData()->hasFormat( mimeType );
}

QByteArray QgsClipboard::data( const QString& mimeType )
{
return QApplication::clipboard()->mimeData()->data( mimeType );
}
31 changes: 31 additions & 0 deletions src/app/qgsclipboard.h
Expand Up @@ -41,6 +41,11 @@
TODO: Make it work
*/

/*
* Constants used to describe copy-paste MIME types
*/
#define QGSCLIPBOARD_STYLE_MIME "application/qgis.style"

class QgsClipboard
{
public:
Expand Down Expand Up @@ -98,6 +103,32 @@ class QgsClipboard
*/
QgsCoordinateReferenceSystem crs();

/*
* Stores a MimeData together with a text into the system clipboard
*/
void setData( const QString& mimeType, const QByteArray& data, const QString* text = 0 );
/*
* Stores a MimeData together with a text into the system clipboard
*/
void setData( const QString& mimeType, const QByteArray& data, const QString& text );
/*
* Stores a MimeData into the system clipboard
*/
void setData( const QString& mimeType, const QByteArray& data );
/*
* Stores a text into the system clipboard
*/
void setText( const QString& text );
/*
* Proxy to QMimeData::hasFormat
* Tests whether the system clipboard contains data of a given MIME type
*/
bool hasFormat( const QString& mimeType );
/*
* Retrieve data from the system clipboard.
* No copy is involved, since the return QByteArray is implicitly shared
*/
QByteArray data( const QString& mimeType );
private:

/** QGIS-internal vector feature clipboard.
Expand Down

0 comments on commit 70a2a4a

Please sign in to comment.