Skip to content

Commit b232e74

Browse files
committed
[FEATURE]: possibility to copy/paste entries in renderer widgets (using ctrl+c/ctrl+v)
1 parent f21562c commit b232e74

9 files changed

+181
-1
lines changed

src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ QgsRendererCategoryV2::QgsRendererCategoryV2( const QgsRendererCategoryV2& cat )
4949

5050
QgsRendererCategoryV2::~QgsRendererCategoryV2()
5151
{
52-
if ( mSymbol ) delete mSymbol;
52+
delete mSymbol;
5353
}
5454

5555
QgsRendererCategoryV2& QgsRendererCategoryV2::operator=( const QgsRendererCategoryV2 & cat )

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,11 @@ void QgsGraduatedSymbolRendererV2::addClass( QgsSymbolV2* symbol )
11861186

11871187
}
11881188

1189+
void QgsGraduatedSymbolRendererV2::addClass( QgsRendererRangeV2 range )
1190+
{
1191+
mRanges.append( range );
1192+
}
1193+
11891194
void QgsGraduatedSymbolRendererV2::deleteClass( int idx )
11901195
{
11911196
mRanges.removeAt( idx );

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
9595
bool updateRangeLowerValue( int rangeIndex, double value );
9696

9797
void addClass( QgsSymbolV2* symbol );
98+
void addClass( QgsRendererRangeV2 range );
9899
void deleteClass( int idx );
99100
void deleteAllClasses();
100101

src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "qgsproject.h"
3131
#include "qgsexpression.h"
3232

33+
#include <QKeyEvent>
3334
#include <QMenu>
3435
#include <QMessageBox>
3536
#include <QStandardItemModel>
@@ -68,6 +69,21 @@ void QgsCategorizedSymbolRendererV2Model::addCategory( const QgsRendererCategory
6869
endInsertRows();
6970
}
7071

72+
QgsRendererCategoryV2 QgsCategorizedSymbolRendererV2Model::category( const QModelIndex &index )
73+
{
74+
if ( !mRenderer )
75+
{
76+
return QgsRendererCategoryV2();
77+
}
78+
const QgsCategoryList& catList = mRenderer->categories();
79+
int row = index.row();
80+
if ( row >= catList.size() )
81+
{
82+
return QgsRendererCategoryV2();
83+
}
84+
return catList.at( row );
85+
}
86+
7187

7288
Qt::ItemFlags QgsCategorizedSymbolRendererV2Model::flags( const QModelIndex & index ) const
7389
{
@@ -822,6 +838,24 @@ QList<QgsSymbolV2*> QgsCategorizedSymbolRendererV2Widget::selectedSymbols()
822838
return selectedSymbols;
823839
}
824840

841+
QgsCategoryList QgsCategorizedSymbolRendererV2Widget::selectedCategoryList()
842+
{
843+
QgsCategoryList cl;
844+
845+
QItemSelectionModel* m = viewCategories->selectionModel();
846+
QModelIndexList selectedIndexes = m->selectedRows( 1 );
847+
848+
if ( m && selectedIndexes.size() > 0 )
849+
{
850+
QModelIndexList::const_iterator indexIt = selectedIndexes.constBegin();
851+
for ( ; indexIt != selectedIndexes.constEnd(); ++indexIt )
852+
{
853+
cl.append( mModel->category( *indexIt ) );
854+
}
855+
}
856+
return cl;
857+
}
858+
825859
void QgsCategorizedSymbolRendererV2Widget::showSymbolLevels()
826860
{
827861
showSymbolLevelsDialog( mRenderer );
@@ -831,3 +865,25 @@ void QgsCategorizedSymbolRendererV2Widget::rowsMoved()
831865
{
832866
viewCategories->selectionModel()->clear();
833867
}
868+
869+
void QgsCategorizedSymbolRendererV2Widget::keyPressEvent( QKeyEvent* event )
870+
{
871+
if ( !event )
872+
{
873+
return;
874+
}
875+
876+
if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
877+
{
878+
mCopyBuffer.clear();
879+
mCopyBuffer = selectedCategoryList();
880+
}
881+
else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
882+
{
883+
QgsCategoryList::const_iterator rIt = mCopyBuffer.constBegin();
884+
for ( ; rIt != mCopyBuffer.constEnd(); ++rIt )
885+
{
886+
mModel->addCategory( *rIt );
887+
}
888+
}
889+
}

src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Model : public QAbstractItemModel
4646
void setRenderer( QgsCategorizedSymbolRendererV2* renderer );
4747

4848
void addCategory( const QgsRendererCategoryV2 &cat );
49+
QgsRendererCategoryV2 category( const QModelIndex &index );
4950
void deleteRows( QList<int> rows );
5051
void removeAllRows( );
5152
void sort( int column, Qt::SortOrder order = Qt::AscendingOrder );
@@ -120,7 +121,9 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg
120121
void changeCategorySymbol();
121122

122123
QList<QgsSymbolV2*> selectedSymbols();
124+
QgsCategoryList selectedCategoryList();
123125
void refreshSymbolView() { populateCategories(); }
126+
void keyPressEvent( QKeyEvent* event );
124127

125128
protected:
126129
QgsCategorizedSymbolRendererV2* mRenderer;
@@ -133,6 +136,7 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg
133136

134137
private:
135138
QString mOldClassificationAttribute;
139+
QgsCategoryList mCopyBuffer;
136140
};
137141

138142
#endif // QGSCATEGORIZEDSYMBOLRENDERERV2WIDGET_H

src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "qgsproject.h"
3030

31+
#include <QKeyEvent>
3132
#include <QMenu>
3233
#include <QMessageBox>
3334
#include <QStandardItemModel>
@@ -68,6 +69,28 @@ void QgsGraduatedSymbolRendererV2Model::addClass( QgsSymbolV2* symbol )
6869
endInsertRows();
6970
}
7071

72+
void QgsGraduatedSymbolRendererV2Model::addClass( QgsRendererRangeV2 range )
73+
{
74+
if ( !mRenderer )
75+
{
76+
return;
77+
}
78+
int idx = mRenderer->ranges().size();
79+
beginInsertRows( QModelIndex(), idx, idx );
80+
mRenderer->addClass( range );
81+
endInsertRows();
82+
}
83+
84+
QgsRendererRangeV2 QgsGraduatedSymbolRendererV2Model::rendererRange( const QModelIndex &index )
85+
{
86+
if ( !index.isValid() || !mRenderer || mRenderer->ranges().size() <= index.row() )
87+
{
88+
return QgsRendererRangeV2();
89+
}
90+
91+
return mRenderer->ranges().value( index.row() );
92+
}
93+
7194
Qt::ItemFlags QgsGraduatedSymbolRendererV2Model::flags( const QModelIndex & index ) const
7295
{
7396
Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
@@ -606,6 +629,20 @@ QList<int> QgsGraduatedSymbolRendererV2Widget::selectedClasses()
606629
return rows;
607630
}
608631

632+
QgsRangeList QgsGraduatedSymbolRendererV2Widget::selectedRanges()
633+
{
634+
QgsRangeList selectedRanges;
635+
QModelIndexList selectedRows = viewGraduated->selectionModel()->selectedRows();
636+
QModelIndexList::const_iterator sIt = selectedRows.constBegin();
637+
638+
const QgsRangeList& ranges = mRenderer->ranges();
639+
for ( ; sIt != selectedRows.constEnd(); ++sIt )
640+
{
641+
selectedRanges.append( mModel->rendererRange( *sIt ) );
642+
}
643+
return selectedRanges;
644+
}
645+
609646
void QgsGraduatedSymbolRendererV2Widget::rangesDoubleClicked( const QModelIndex & idx )
610647
{
611648
if ( idx.isValid() && idx.column() == 0 )
@@ -622,6 +659,8 @@ void QgsGraduatedSymbolRendererV2Widget::rangesClicked( const QModelIndex & idx
622659
mRowSelected = idx.row();
623660
}
624661

662+
663+
625664
void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols()
626665
{
627666
QItemSelectionModel* m = viewGraduated->selectionModel();
@@ -778,3 +817,25 @@ void QgsGraduatedSymbolRendererV2Widget::rowsMoved()
778817
{
779818
viewGraduated->selectionModel()->clear();
780819
}
820+
821+
void QgsGraduatedSymbolRendererV2Widget::keyPressEvent( QKeyEvent* event )
822+
{
823+
if ( !event )
824+
{
825+
return;
826+
}
827+
828+
if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
829+
{
830+
mCopyBuffer.clear();
831+
mCopyBuffer = selectedRanges();
832+
}
833+
else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
834+
{
835+
QgsRangeList::const_iterator rIt = mCopyBuffer.constBegin();
836+
for ( ; rIt != mCopyBuffer.constEnd(); ++rIt )
837+
{
838+
mModel->addClass( *rIt );
839+
}
840+
}
841+
}

src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h

+6
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Model : public QAbstractItemModel
4343

4444
void setRenderer( QgsGraduatedSymbolRendererV2* renderer );
4545

46+
QgsRendererRangeV2 rendererRange( const QModelIndex &index );
4647
void addClass( QgsSymbolV2* symbol );
48+
void addClass( QgsRendererRangeV2 range );
4749
void deleteRows( QList<int> rows );
4850
void removeAllRows( );
4951
void sort( int column, Qt::SortOrder order = Qt::AscendingOrder );
@@ -109,6 +111,7 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
109111

110112
//! return a list of indexes for the classes under selection
111113
QList<int> selectedClasses();
114+
QgsRangeList selectedRanges();
112115

113116
//! populate column combos in categorized and graduated page
114117
void populateColumns();
@@ -122,6 +125,8 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
122125
QgsSymbolV2* findSymbolForRange( double lowerBound, double upperBound, const QgsRangeList& ranges ) const;
123126
void refreshSymbolView();
124127

128+
void keyPressEvent( QKeyEvent* event );
129+
125130
protected:
126131
QgsGraduatedSymbolRendererV2* mRenderer;
127132

@@ -133,6 +138,7 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
133138

134139
QgsGraduatedSymbolRendererV2Model* mModel;
135140

141+
QgsRangeList mCopyBuffer;
136142
};
137143

138144

src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgslogger.h"
2626
#include "qstring.h"
2727

28+
#include <QKeyEvent>
2829
#include <QMenu>
2930
#include <QProgressDialog>
3031
#include <QSettings>
@@ -110,6 +111,7 @@ QgsRuleBasedRendererV2Widget::QgsRuleBasedRendererV2Widget( QgsVectorLayer* laye
110111

111112
QgsRuleBasedRendererV2Widget::~QgsRuleBasedRendererV2Widget()
112113
{
114+
qDeleteAll( mCopyBuffer );
113115
delete mRenderer;
114116
}
115117

@@ -366,6 +368,23 @@ QList<QgsSymbolV2*> QgsRuleBasedRendererV2Widget::selectedSymbols()
366368
return symbolList;
367369
}
368370

371+
QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2Widget::selectedRules()
372+
{
373+
QgsRuleBasedRendererV2::RuleList rl;
374+
QItemSelection sel = viewRules->selectionModel()->selection();
375+
foreach ( QItemSelectionRange range, sel )
376+
{
377+
QModelIndex parent = range.parent();
378+
QgsRuleBasedRendererV2::Rule* parentRule = mModel->ruleForIndex( parent );
379+
QgsRuleBasedRendererV2::RuleList& children = parentRule->children();
380+
for ( int row = range.top(); row <= range.bottom(); row++ )
381+
{
382+
rl.append( children[row]->clone() );
383+
}
384+
}
385+
return rl;
386+
}
387+
369388
void QgsRuleBasedRendererV2Widget::refreshSymbolView()
370389
{
371390
// TODO: model/view
@@ -377,6 +396,30 @@ void QgsRuleBasedRendererV2Widget::refreshSymbolView()
377396
*/
378397
}
379398

399+
void QgsRuleBasedRendererV2Widget::keyPressEvent( QKeyEvent* event )
400+
{
401+
if ( !event )
402+
{
403+
return;
404+
}
405+
406+
if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
407+
{
408+
qDeleteAll( mCopyBuffer );
409+
mCopyBuffer.clear();
410+
mCopyBuffer = selectedRules();
411+
}
412+
else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
413+
{
414+
QgsRuleBasedRendererV2::RuleList::const_iterator rIt = mCopyBuffer.constBegin();
415+
for ( ; rIt != mCopyBuffer.constEnd(); ++rIt )
416+
{
417+
int rows = mModel->rowCount();
418+
mModel->insertRule( QModelIndex(), rows, ( *rIt )->clone() );
419+
}
420+
}
421+
}
422+
380423
#include "qgssymbollevelsv2dialog.h"
381424

382425
void QgsRuleBasedRendererV2Widget::setRenderingOrder()

src/gui/symbology-ng/qgsrulebasedrendererv2widget.h

+4
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,18 @@ class GUI_EXPORT QgsRuleBasedRendererV2Widget : public QgsRendererV2Widget, priv
136136
QgsRuleBasedRendererV2::Rule* currentRule();
137137

138138
QList<QgsSymbolV2*> selectedSymbols();
139+
QgsRuleBasedRendererV2::RuleList selectedRules();
139140
void refreshSymbolView();
141+
void keyPressEvent( QKeyEvent* event );
140142

141143
QgsRuleBasedRendererV2* mRenderer;
142144
QgsRuleBasedRendererV2Model* mModel;
143145

144146
QMenu* mRefineMenu;
145147
QAction* mDeleteAction;
146148

149+
QgsRuleBasedRendererV2::RuleList mCopyBuffer;
150+
147151
protected slots:
148152
void copy();
149153
void paste();

0 commit comments

Comments
 (0)