Skip to content

Commit 70a2a4a

Browse files
Hugo Merciertimlinux
Hugo Mercier
authored andcommitted
Make the style copy/paste functionality closer to the geometry copy/paste implementation
1 parent 0daaf23 commit 70a2a4a

File tree

4 files changed

+78
-14
lines changed

4 files changed

+78
-14
lines changed

src/app/legend/qgslegend.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "qgsrasterlayer.h"
3434
#include "qgsvectorlayer.h"
3535
#include "qgsgenericprojectionselector.h"
36+
#include "qgsclipboard.h"
3637

3738
#include <QFont>
3839
#include <QDomDocument>
@@ -702,7 +703,7 @@ void QgsLegend::handleRightClickEvent( QTreeWidgetItem* item, const QPoint& posi
702703
{
703704
QgisApp* app = QgisApp::instance();
704705
theMenu.addAction( tr( "Copy Style" ), app, SLOT( copyStyle() ) );
705-
if ( QApplication::clipboard()->mimeData()->hasFormat( "application/qgis.style" ) )
706+
if ( app->clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) )
706707
{
707708
theMenu.addAction( tr( "Paste Style" ), app, SLOT( pasteStyle() ) );
708709
}

src/app/qgisapp.cpp

+7-11
Original file line numberDiff line numberDiff line change
@@ -4400,11 +4400,10 @@ void QgisApp::copyStyle( QgsMapLayer * sourceLayer )
44004400
QMessageBox::Ok );
44014401
return;
44024402
}
4403-
QClipboard* clipboard = QApplication::clipboard();
4404-
QMimeData *mimeData = new QMimeData();
4405-
mimeData->setData( "application/qgis.style", doc.toByteArray() );
4406-
// transfers the ownership to the clipboard object
4407-
clipboard->setMimeData( mimeData );
4403+
// Copies data in text form as well, so the XML can be pasted into a text editor
4404+
clipboard()->setData( QGSCLIPBOARD_STYLE_MIME, doc.toByteArray(), doc.toString() );
4405+
// Enables the paste menu element
4406+
mActionPasteStyle->setEnabled( true );
44084407
}
44094408
}
44104409

@@ -4413,15 +4412,12 @@ void QgisApp::pasteStyle( QgsMapLayer * destinationLayer )
44134412
QgsMapLayer *selectionLayer = destinationLayer ? destinationLayer : activeLayer();
44144413
if ( selectionLayer )
44154414
{
4416-
QClipboard* clipboard = QApplication::clipboard();
4417-
4418-
const QMimeData* mimeData = clipboard->mimeData();
4419-
if ( mimeData->hasFormat( "application/qgis.style" ) )
4415+
if ( clipboard()->hasFormat( QGSCLIPBOARD_STYLE_MIME ) )
44204416
{
44214417
QDomDocument doc( "qgis" );
44224418
QString errorMsg;
44234419
int errorLine, errorColumn;
4424-
if ( !doc.setContent ( mimeData->data( "application/qgis.style" ), false, &errorMsg, &errorLine, &errorColumn ) )
4420+
if ( !doc.setContent ( clipboard()->data( QGSCLIPBOARD_STYLE_MIME ), false, &errorMsg, &errorLine, &errorColumn ) )
44254421
{
44264422
QMessageBox::information( this,
44274423
tr( "Error" ),
@@ -6403,7 +6399,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
64036399
mActionZoomToLayer->setEnabled( true );
64046400

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

64086404
/***********Vector layers****************/
64096405
if ( layer->type() == QgsMapLayer::VectorLayer )

src/app/qgsclipboard.cpp

+38-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <QStringList>
2323
#include <QClipboard>
2424
#include <QSettings>
25+
#include <QMimeData>
2526

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

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

112113
QgsDebugMsg( QString( "replaced system clipboard with: %1." ).arg( textCopy ) );
@@ -163,3 +164,38 @@ QgsCoordinateReferenceSystem QgsClipboard::crs()
163164
{
164165
return mCRS;
165166
}
167+
168+
void QgsClipboard::setData( const QString& mimeType, const QByteArray& data, const QString* text )
169+
{
170+
QMimeData *mdata = new QMimeData();
171+
mdata->setData( mimeType, data );
172+
if ( text )
173+
{
174+
mdata->setText( *text );
175+
}
176+
// Transfers ownership to the clipboard object
177+
#ifndef Q_OS_WIN
178+
QApplication::clipboard()->setMimeData( mdata, QClipboard::Selection );
179+
#endif
180+
QApplication::clipboard()->setMimeData( mdata, QClipboard::Clipboard );
181+
}
182+
183+
void QgsClipboard::setData( const QString& mimeType, const QByteArray& data, const QString& text )
184+
{
185+
setData( mimeType, data, &text );
186+
}
187+
188+
void QgsClipboard::setData( const QString& mimeType, const QByteArray& data )
189+
{
190+
setData( mimeType, data, 0 );
191+
}
192+
193+
bool QgsClipboard::hasFormat( const QString& mimeType )
194+
{
195+
return QApplication::clipboard()->mimeData()->hasFormat( mimeType );
196+
}
197+
198+
QByteArray QgsClipboard::data( const QString& mimeType )
199+
{
200+
return QApplication::clipboard()->mimeData()->data( mimeType );
201+
}

src/app/qgsclipboard.h

+31
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
TODO: Make it work
4242
*/
4343

44+
/*
45+
* Constants used to describe copy-paste MIME types
46+
*/
47+
#define QGSCLIPBOARD_STYLE_MIME "application/qgis.style"
48+
4449
class QgsClipboard
4550
{
4651
public:
@@ -98,6 +103,32 @@ class QgsClipboard
98103
*/
99104
QgsCoordinateReferenceSystem crs();
100105

106+
/*
107+
* Stores a MimeData together with a text into the system clipboard
108+
*/
109+
void setData( const QString& mimeType, const QByteArray& data, const QString* text = 0 );
110+
/*
111+
* Stores a MimeData together with a text into the system clipboard
112+
*/
113+
void setData( const QString& mimeType, const QByteArray& data, const QString& text );
114+
/*
115+
* Stores a MimeData into the system clipboard
116+
*/
117+
void setData( const QString& mimeType, const QByteArray& data );
118+
/*
119+
* Stores a text into the system clipboard
120+
*/
121+
void setText( const QString& text );
122+
/*
123+
* Proxy to QMimeData::hasFormat
124+
* Tests whether the system clipboard contains data of a given MIME type
125+
*/
126+
bool hasFormat( const QString& mimeType );
127+
/*
128+
* Retrieve data from the system clipboard.
129+
* No copy is involved, since the return QByteArray is implicitly shared
130+
*/
131+
QByteArray data( const QString& mimeType );
101132
private:
102133

103134
/** QGIS-internal vector feature clipboard.

0 commit comments

Comments
 (0)