Skip to content

Commit 0181324

Browse files
committed
create QgsDecorationItem class for all decoration items and render in a specific order (grid before others so it's on bottom
1 parent edda90a commit 0181324

15 files changed

+158
-153
lines changed

src/app/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ SET(QGIS_APP_SRCS
1919
qgsconfigureshortcutsdialog.cpp
2020
qgscustomization.cpp
2121
qgscustomprojectiondialog.cpp
22+
qgsdecorationitem.cpp
2223
qgsdecorationcopyright.cpp
2324
qgsdecorationcopyrightdialog.cpp
2425
qgsdecorationnortharrow.cpp
@@ -169,6 +170,7 @@ SET (QGIS_APP_MOC_HDRS
169170
qgscontinuouscolordialog.h
170171
qgscustomization.h
171172
qgscustomprojectiondialog.h
173+
qgsdecorationitem.h
172174
qgsdecorationcopyright.h
173175
qgsdecorationcopyrightdialog.h
174176
qgsdecorationnortharrow.h

src/app/qgisapp.cpp

+28-13
Original file line numberDiff line numberDiff line change
@@ -2004,26 +2004,41 @@ void QgisApp::createMapTips()
20042004

20052005
void QgisApp::createDecorations()
20062006
{
2007-
mDecorationCopyright = new QgsDecorationCopyright( this );
2007+
QgsDecorationCopyright* mDecorationCopyright = new QgsDecorationCopyright( this );
20082008
connect( mActionDecorationCopyright, SIGNAL( triggered() ), mDecorationCopyright, SLOT( run() ) );
2009-
connect( mMapCanvas, SIGNAL( renderComplete( QPainter * ) ), mDecorationCopyright, SLOT( renderLabel( QPainter * ) ) );
2010-
connect( this, SIGNAL( projectRead() ), mDecorationCopyright, SLOT( projectRead() ) );
20112009

2012-
mDecorationNorthArrow = new QgsDecorationNorthArrow( this );
2010+
QgsDecorationNorthArrow* mDecorationNorthArrow = new QgsDecorationNorthArrow( this );
20132011
connect( mActionDecorationNorthArrow, SIGNAL( triggered() ), mDecorationNorthArrow, SLOT( run() ) );
2014-
connect( mMapCanvas, SIGNAL( renderComplete( QPainter * ) ), mDecorationNorthArrow, SLOT( renderNorthArrow( QPainter * ) ) );
2015-
connect( this, SIGNAL( projectRead() ), mDecorationNorthArrow, SLOT( projectRead() ) );
20162012

2017-
mDecorationScaleBar = new QgsDecorationScaleBar( this );
2013+
QgsDecorationScaleBar* mDecorationScaleBar = new QgsDecorationScaleBar( this );
20182014
connect( mActionDecorationScaleBar, SIGNAL( triggered() ), mDecorationScaleBar, SLOT( run() ) );
2019-
connect( mMapCanvas, SIGNAL( renderComplete( QPainter * ) ), mDecorationScaleBar, SLOT( renderScaleBar( QPainter * ) ) );
2020-
connect( this, SIGNAL( projectRead() ), mDecorationScaleBar, SLOT( projectRead() ) );
20212015

2022-
// TODO draw the decorations in a particular order - perhaps use a vector or decoration objects?
2023-
mDecorationGrid = new QgsDecorationGrid( this );
2016+
QgsDecorationGrid* mDecorationGrid = new QgsDecorationGrid( this );
20242017
connect( mActionDecorationGrid, SIGNAL( triggered() ), mDecorationGrid, SLOT( run() ) );
2025-
connect( mMapCanvas, SIGNAL( renderComplete( QPainter * ) ), mDecorationGrid, SLOT( renderGrid( QPainter * ) ) );
2026-
connect( this, SIGNAL( projectRead() ), mDecorationGrid, SLOT( projectRead() ) );
2018+
2019+
// add the decorations in a particular order so they are rendered in that order
2020+
addDecorationItem( mDecorationGrid );
2021+
addDecorationItem( mDecorationCopyright );
2022+
addDecorationItem( mDecorationNorthArrow );
2023+
addDecorationItem( mDecorationScaleBar );
2024+
connect( mMapCanvas, SIGNAL( renderComplete( QPainter * ) ), this, SLOT( renderDecorationItems( QPainter * ) ) );
2025+
connect( this, SIGNAL( projectRead() ), this, SLOT( projectReadDecorationItems() ) );
2026+
}
2027+
2028+
void QgisApp::renderDecorationItems( QPainter *p )
2029+
{
2030+
foreach( QgsDecorationItem* item, mDecorationItems )
2031+
{
2032+
item->render( p );
2033+
}
2034+
}
2035+
2036+
void QgisApp::projectReadDecorationItems()
2037+
{
2038+
foreach( QgsDecorationItem* item, mDecorationItems )
2039+
{
2040+
item->projectRead( );
2041+
}
20272042
}
20282043

20292044
// Update file menu with the current list of recently accessed projects

src/app/qgisapp.h

+12-8
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ class QgsBrowserDockWidget;
6969
class QgsSnappingDialog;
7070
class QgsGPSInformationWidget;
7171

72-
class QgsDecorationCopyright;
73-
class QgsDecorationNorthArrow;
74-
class QgsDecorationScaleBar;
75-
class QgsDecorationGrid;
72+
class QgsDecorationItem;
7673

7774
class QgsMessageLogViewer;
7875

@@ -381,6 +378,9 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
381378

382379
void emitCustomSrsValidation( QgsCoordinateReferenceSystem *crs );
383380

381+
QList<QgsDecorationItem*> decorationItems() { return mDecorationItems; }
382+
void addDecorationItem( QgsDecorationItem* item ) { mDecorationItems.append( item ); }
383+
384384
public slots:
385385
//! Zoom to full extent
386386
void zoomFull();
@@ -869,6 +869,9 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
869869
//! Activates label property tool
870870
void changeLabelProperties();
871871

872+
void renderDecorationItems( QPainter *p );
873+
void projectReadDecorationItems( );
874+
872875
signals:
873876
/** emitted when a key is pressed and we want non widget sublasses to be able
874877
to pick up on this (e.g. maplayer) */
@@ -1185,10 +1188,10 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
11851188

11861189
QgsSnappingDialog* mSnappingDialog;
11871190

1188-
QgsDecorationCopyright* mDecorationCopyright;
1189-
QgsDecorationNorthArrow* mDecorationNorthArrow;
1190-
QgsDecorationScaleBar* mDecorationScaleBar;
1191-
QgsDecorationGrid* mDecorationGrid;
1191+
//! Persistent tile scale slider
1192+
QgsTileScaleWidget * mpTileScaleWidget;
1193+
1194+
QList<QgsDecorationItem*> mDecorationItems;
11921195

11931196
int mLastComposerId;
11941197

@@ -1214,6 +1217,7 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
12141217
bool gestureEvent( QGestureEvent *event );
12151218
void tapAndHoldTriggered( QTapAndHoldGesture *gesture );
12161219
#endif
1220+
12171221
};
12181222

12191223
#ifdef ANDROID

src/app/qgsdecorationcopyright.cpp

+22-24
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ email : tim@linfiniti.com
4242

4343

4444
QgsDecorationCopyright::QgsDecorationCopyright( QObject* parent )
45-
: QObject( parent )
45+
: QgsDecorationItem( parent )
4646
{
4747
mPlacementLabels << tr( "Bottom Left" ) << tr( "Top Left" )
4848
<< tr( "Top Right" ) << tr( "Bottom Right" );
4949

50+
setName( "Copyright Label" );
5051
// initialise default values in the gui
5152
projectRead();
5253
}
@@ -56,20 +57,29 @@ QgsDecorationCopyright::~QgsDecorationCopyright()
5657

5758
void QgsDecorationCopyright::projectRead()
5859
{
59-
QDate now;
60-
QString defString;
60+
QgsDecorationItem::projectRead();
6161

62-
now = QDate::currentDate();
63-
defString = "&copy; QGIS " + now.toString( "yyyy" );
62+
QDate now = QDate::currentDate();
63+
QString defString = "&copy; QGIS " + now.toString( "yyyy" );
6464

6565
// there is no font setting in the UI, so just use the Qt/QGIS default font (what mQFont gets when created)
6666
// mQFont.setFamily( QgsProject::instance()->readEntry( "CopyrightLabel", "/FontName", "Sans Serif" ) );
6767
// mQFont.setPointSize( QgsProject::instance()->readNumEntry( "CopyrightLabel", "/FontSize", 9 ) );
6868
QgsProject* prj = QgsProject::instance();
69-
mLabelQString = prj->readEntry( "CopyrightLabel", "/Label", defString );
70-
mPlacementIndex = prj->readNumEntry( "CopyrightLabel", "/Placement", 3 );
71-
mEnable = prj->readBoolEntry( "CopyrightLabel", "/Enabled", false );
72-
mLabelQColor.setNamedColor( prj->readEntry( "CopyrightLabel", "/Color", "#000000" ) ); // default color is black
69+
mLabelQString = prj->readEntry( mNameConfig, "/Label", defString );
70+
mPlacementIndex = prj->readNumEntry( mNameConfig, "/Placement", 3 );
71+
mLabelQColor.setNamedColor( prj->readEntry( mNameConfig, "/Color", "#000000" ) ); // default color is black
72+
}
73+
74+
void QgsDecorationCopyright::saveToProject()
75+
{
76+
QgsDecorationItem::saveToProject();
77+
QgsProject* prj = QgsProject::instance();
78+
prj->writeEntry( mNameConfig, "/FontName", mQFont.family() );
79+
prj->writeEntry( mNameConfig, "/FontSize", mQFont.pointSize() );
80+
prj->writeEntry( mNameConfig, "/Label", mLabelQString );
81+
prj->writeEntry( mNameConfig, "/Color", mLabelQColor.name() );
82+
prj->writeEntry( mNameConfig, "/Placement", mPlacementIndex );
7383
}
7484

7585
// Slot called when the buffer menu item is activated
@@ -79,16 +89,15 @@ void QgsDecorationCopyright::run()
7989

8090
if ( dlg.exec() )
8191
{
82-
saveToProject();
83-
QgisApp::instance()->mapCanvas()->refresh();
92+
update();
8493
}
8594
}
8695

8796

88-
void QgsDecorationCopyright::renderLabel( QPainter * theQPainter )
97+
void QgsDecorationCopyright::render( QPainter * theQPainter )
8998
{
9099
//Large IF statement to enable/disable copyright label
91-
if ( mEnable )
100+
if ( enabled() )
92101
{
93102
// need width/height of paint device
94103
int myHeight = theQPainter->device()->height();
@@ -139,14 +148,3 @@ void QgsDecorationCopyright::renderLabel( QPainter * theQPainter )
139148
}
140149
}
141150

142-
void QgsDecorationCopyright::saveToProject()
143-
{
144-
//save state to the project file.....
145-
QgsProject* prj = QgsProject::instance();
146-
prj->writeEntry( "CopyrightLabel", "/FontName", mQFont.family() );
147-
prj->writeEntry( "CopyrightLabel", "/FontSize", mQFont.pointSize() );
148-
prj->writeEntry( "CopyrightLabel", "/Label", mLabelQString );
149-
prj->writeEntry( "CopyrightLabel", "/Color", mLabelQColor.name() );
150-
prj->writeEntry( "CopyrightLabel", "/Placement", mPlacementIndex );
151-
prj->writeEntry( "CopyrightLabel", "/Enabled", mEnable );
152-
}

src/app/qgsdecorationcopyright.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#ifndef QGSCOPYRIGHTLABELPLUGIN
2020
#define QGSCOPYRIGHTLABELPLUGIN
2121

22+
#include "qgsdecorationitem.h"
23+
2224
#include <QColor>
2325
#include <QFont>
2426
#include <QObject>
@@ -27,7 +29,7 @@ class QPainter;
2729

2830
class QgsDecorationCopyrightDialog;
2931

30-
class QgsDecorationCopyright : public QObject
32+
class QgsDecorationCopyright : public QgsDecorationItem
3133
{
3234
Q_OBJECT
3335
public:
@@ -46,7 +48,7 @@ class QgsDecorationCopyright : public QObject
4648
//! Show the dialog box
4749
void run();
4850
//! render the copyright label
49-
void renderLabel( QPainter * );
51+
void render( QPainter * );
5052

5153
private:
5254
//! This is the font that will be used for the copyright label
@@ -58,8 +60,6 @@ class QgsDecorationCopyright : public QObject
5860
//! Placement of the copyright label - index and translated label names
5961
int mPlacementIndex;
6062
QStringList mPlacementLabels;
61-
//! Copyright label enabled
62-
bool mEnable;
6363

6464
friend class QgsDecorationCopyrightDialog;
6565
};

src/app/qgsdecorationcopyrightdialog.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ QgsDecorationCopyrightDialog::QgsDecorationCopyrightDialog( QgsDecorationCopyrig
3333
cboOrientation->hide();
3434
textLabel15->hide();
3535

36-
cboxEnabled->setChecked( mDeco.mEnable );
36+
cboxEnabled->setChecked( mDeco.enabled() );
3737
// text
3838
txtCopyrightText->setPlainText( mDeco.mLabelQString );
3939
// placement
@@ -60,7 +60,7 @@ void QgsDecorationCopyrightDialog::on_buttonBox_accepted()
6060
mDeco.mLabelQString = txtCopyrightText->toPlainText();
6161
mDeco.mLabelQColor = pbnColorChooser->color();
6262
mDeco.mPlacementIndex = cboPlacement->currentIndex();
63-
mDeco.mEnable = cboxEnabled->isChecked();
63+
mDeco.setEnabled( cboxEnabled->isChecked() );
6464

6565
accept();
6666
}

src/app/qgsdecorationgrid.cpp

+33-37
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@
5252

5353

5454
QgsDecorationGrid::QgsDecorationGrid( QObject* parent )
55-
: QObject( parent )
55+
: QgsDecorationItem( parent )
5656
{
57+
setName( "Grid" );
5758
projectRead();
5859
}
5960

@@ -62,42 +63,40 @@ QgsDecorationGrid::~QgsDecorationGrid()
6263

6364
}
6465

65-
void QgsDecorationGrid::update()
66-
{
67-
QgisApp::instance()->mapCanvas()->refresh();
68-
}
69-
7066
void QgsDecorationGrid::projectRead()
7167
{
72-
mGridEnabled = QgsProject::instance()->readBoolEntry( "Grid", "/Enabled", false );
73-
mGridStyle = ( GridStyle ) QgsProject::instance()->readNumEntry( "Grid", "/Style", 0 );
74-
mGridIntervalX = QgsProject::instance()->readDoubleEntry( "Grid", "/IntervalX", 0 );
75-
mGridIntervalY = QgsProject::instance()->readDoubleEntry( "Grid", "/IntervalY", 0 );
76-
mGridOffsetX = QgsProject::instance()->readDoubleEntry( "Grid", "/OffsetX", 0 );
77-
mGridOffsetY = QgsProject::instance()->readDoubleEntry( "Grid", "/OffsetY", 0 );
78-
mCrossLength = QgsProject::instance()->readDoubleEntry( "Grid", "/CrossLength", 0 );
79-
// missing mGridPen, mGridAnnotationFont
80-
mGridAnnotationPrecision = ( GridAnnotationPosition ) QgsProject::instance()->readNumEntry( "Grid", "/AnnotationPrecision", 3 );
81-
mShowGridAnnotation = QgsProject::instance()->readBoolEntry( "Grid", "/ShowAnnotation", false );
82-
// mGridAnnotationPosition = (GridAnnotationPosition) QgsProject::instance()->readNumEntry( "Grid", "/AnnotationPosition", 0 );
83-
mAnnotationFrameDistance = QgsProject::instance()->readDoubleEntry( "Grid", "/AnnotationFrameDistance", 0 );
84-
mGridAnnotationDirection = ( GridAnnotationDirection ) QgsProject::instance()->readNumEntry( "Grid", "/AnnotationDirection", 0 );
68+
QgsDecorationItem::projectRead();
69+
mGridStyle = ( GridStyle ) QgsProject::instance()->readNumEntry( mNameConfig, "/Style", 0 );
70+
mGridIntervalX = QgsProject::instance()->readDoubleEntry( mNameConfig, "/IntervalX", 0 );
71+
mGridIntervalY = QgsProject::instance()->readDoubleEntry( mNameConfig, "/IntervalY", 0 );
72+
mGridOffsetX = QgsProject::instance()->readDoubleEntry( mNameConfig, "/OffsetX", 0 );
73+
mGridOffsetY = QgsProject::instance()->readDoubleEntry( mNameConfig, "/OffsetY", 0 );
74+
// missing mGridPen, but should use styles anyway
75+
mCrossLength = QgsProject::instance()->readDoubleEntry( mNameConfig, "/CrossLength", 0 );
76+
mShowGridAnnotation = QgsProject::instance()->readBoolEntry( mNameConfig, "/ShowAnnotation", false );
77+
mGridAnnotationPosition = ( GridAnnotationPosition ) QgsProject::instance()->readNumEntry( mNameConfig, "/AnnotationPosition", 0 );
78+
mGridAnnotationDirection = ( GridAnnotationDirection ) QgsProject::instance()->readNumEntry( mNameConfig, "/AnnotationDirection", 0 );
79+
mGridAnnotationFont.fromString( QgsProject::instance()->readEntry( mNameConfig, "/AnnotationFont", "" ) );
80+
mAnnotationFrameDistance = QgsProject::instance()->readDoubleEntry( mNameConfig, "/AnnotationFrameDistance", 0 );
81+
mGridAnnotationPrecision = QgsProject::instance()->readNumEntry( mNameConfig, "/AnnotationPrecision", 3 );
8582
}
8683

8784
void QgsDecorationGrid::saveToProject()
8885
{
89-
QgsProject::instance()->writeEntry( "Grid", "/Enabled", mGridEnabled );
90-
QgsProject::instance()->writeEntry( "Grid", "/IntervalX", mGridIntervalX );
91-
QgsProject::instance()->writeEntry( "Grid", "/IntervalY", mGridIntervalY );
92-
QgsProject::instance()->writeEntry( "Grid", "/OffsetX", mGridOffsetX );
93-
QgsProject::instance()->writeEntry( "Grid", "/OffsetX", mGridOffsetY );
94-
QgsProject::instance()->writeEntry( "Grid", "/CrossLength", mCrossLength );
95-
// missing mGridPen, mGridAnnotationFont
96-
QgsProject::instance()->writeEntry( "Grid", "/AnnotationPrecision", mGridAnnotationPrecision );
97-
QgsProject::instance()->writeEntry( "Grid", "/ShowAnnotation", mShowGridAnnotation );
98-
// QgsProject::instance()->writeEntry( "Grid", "/AnnotationPosition", mGridAnnotationPosition );
99-
QgsProject::instance()->writeEntry( "Grid", "/AnnotationFrameDistance", mAnnotationFrameDistance );
100-
QgsProject::instance()->writeEntry( "Grid", "/AnnotationDirection", mGridAnnotationDirection );
86+
QgsDecorationItem::saveToProject();
87+
QgsProject::instance()->writeEntry( mNameConfig, "/Style", ( int ) mGridStyle );
88+
QgsProject::instance()->writeEntry( mNameConfig, "/IntervalX", mGridIntervalX );
89+
QgsProject::instance()->writeEntry( mNameConfig, "/IntervalY", mGridIntervalY );
90+
QgsProject::instance()->writeEntry( mNameConfig, "/OffsetX", mGridOffsetX );
91+
QgsProject::instance()->writeEntry( mNameConfig, "/OffsetX", mGridOffsetY );
92+
QgsProject::instance()->writeEntry( mNameConfig, "/CrossLength", mCrossLength );
93+
// missing mGridPen, but should use styles anyway
94+
QgsProject::instance()->writeEntry( mNameConfig, "/ShowAnnotation", mShowGridAnnotation );
95+
QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationPosition", ( int ) mGridAnnotationPosition );
96+
QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationDirection", ( int ) mGridAnnotationDirection );
97+
QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationFont", mGridAnnotationFont.toString() );
98+
QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationFrameDistance", mAnnotationFrameDistance );
99+
QgsProject::instance()->writeEntry( mNameConfig, "/AnnotationPrecision", mGridAnnotationPrecision );
101100
}
102101

103102

@@ -107,16 +106,13 @@ void QgsDecorationGrid::run()
107106

108107
if ( dlg.exec() )
109108
{
110-
saveToProject();
111-
QgisApp::instance()->mapCanvas()->refresh();
109+
update();
112110
}
113111
}
114112

115-
116-
117-
void QgsDecorationGrid::renderGrid( QPainter * p )
113+
void QgsDecorationGrid::render( QPainter * p )
118114
{
119-
if ( ! mGridEnabled )
115+
if ( ! mEnabled )
120116
return;
121117

122118
p->setPen( mGridPen );

0 commit comments

Comments
 (0)