QGIS API Documentation  2.8.2-Wien
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgscomposerframe.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgscomposerframe.cpp
3  ------------------------------------------------------------
4  begin : July 2012
5  copyright : (C) 2012 by Marco Hugentobler
6  email : marco dot hugentobler at sourcepole dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgscomposerframe.h"
17 #include "qgscomposermultiframe.h"
18 #include "qgscomposition.h"
19 
20 QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf, qreal x, qreal y, qreal width, qreal height )
21  : QgsComposerItem( x, y, width, height, c )
22  , mMultiFrame( mf )
23  , mHidePageIfEmpty( false )
24  , mHideBackgroundIfEmpty( false )
25 {
26 
27  //default to no background
28  setBackgroundEnabled( false );
29 
30  //repaint frame when multiframe content changes
31  connect( mf, SIGNAL( contentsChanged() ), this, SLOT( repaint() ) );
32  if ( mf )
33  {
34  //force recalculation of rect, so that multiframe specified sizes can be applied
35  setSceneRect( QRectF( pos().x(), pos().y(), rect().width(), rect().height() ) );
36  }
37 }
38 
39 QgsComposerFrame::QgsComposerFrame()
40  : QgsComposerItem( 0, 0, 0, 0, 0 )
41  , mMultiFrame( 0 )
42  , mHidePageIfEmpty( false )
43  , mHideBackgroundIfEmpty( false )
44 {
45  //default to no background
46  setBackgroundEnabled( false );
47 }
48 
50 {
51 }
52 
53 bool QgsComposerFrame::writeXML( QDomElement& elem, QDomDocument & doc ) const
54 {
55  QDomElement frameElem = doc.createElement( "ComposerFrame" );
56  frameElem.setAttribute( "sectionX", QString::number( mSection.x() ) );
57  frameElem.setAttribute( "sectionY", QString::number( mSection.y() ) );
58  frameElem.setAttribute( "sectionWidth", QString::number( mSection.width() ) );
59  frameElem.setAttribute( "sectionHeight", QString::number( mSection.height() ) );
60  frameElem.setAttribute( "hidePageIfEmpty", mHidePageIfEmpty );
61  frameElem.setAttribute( "hideBackgroundIfEmpty", mHideBackgroundIfEmpty );
62  elem.appendChild( frameElem );
63 
64  return _writeXML( frameElem, doc );
65 }
66 
67 bool QgsComposerFrame::readXML( const QDomElement& itemElem, const QDomDocument& doc )
68 {
69  double x = itemElem.attribute( "sectionX" ).toDouble();
70  double y = itemElem.attribute( "sectionY" ).toDouble();
71  double width = itemElem.attribute( "sectionWidth" ).toDouble();
72  double height = itemElem.attribute( "sectionHeight" ).toDouble();
73  mSection = QRectF( x, y, width, height );
74  mHidePageIfEmpty = itemElem.attribute( "hidePageIfEmpty", "0" ).toInt();
75  mHideBackgroundIfEmpty = itemElem.attribute( "hideBackgroundIfEmpty", "0" ).toInt();
76  QDomElement composerItem = itemElem.firstChildElement( "ComposerItem" );
77  if ( composerItem.isNull() )
78  {
79  return false;
80  }
81  return _readXML( composerItem, doc );
82 }
83 
84 void QgsComposerFrame::setHidePageIfEmpty( const bool hidePageIfEmpty )
85 {
86  mHidePageIfEmpty = hidePageIfEmpty;
87 }
88 
89 void QgsComposerFrame::setHideBackgroundIfEmpty( const bool hideBackgroundIfEmpty )
90 {
91  if ( hideBackgroundIfEmpty == mHideBackgroundIfEmpty )
92  {
93  return;
94  }
95 
96  mHideBackgroundIfEmpty = hideBackgroundIfEmpty;
97  update();
98 }
99 
101 {
102  if ( !mMultiFrame )
103  {
104  return true;
105  }
106 
107  double multiFrameHeight = mMultiFrame->totalSize().height();
108  if ( multiFrameHeight <= mSection.top() )
109  {
110  //multiframe height is less than top of this frame's visible portion
111  return true;
112  }
113 
114  return false;
115 
116 }
117 
119 {
120  if ( !id().isEmpty() )
121  {
122  return id();
123  }
124 
125  if ( mMultiFrame )
126  {
127  return mMultiFrame->displayName();
128  }
129 
130  return tr( "<frame>" );
131 }
132 
133 void QgsComposerFrame::setSceneRect( const QRectF &rectangle )
134 {
135  QRectF fixedRect = rectangle;
136 
137  if ( mMultiFrame )
138  {
139  //calculate index of frame
140  int frameIndex = mMultiFrame->frameIndex( this );
141 
142  QSizeF fixedSize = mMultiFrame->fixedFrameSize( frameIndex );
143  if ( fixedSize.width() > 0 )
144  {
145  fixedRect.setWidth( fixedSize.width() );
146  }
147  if ( fixedSize.height() > 0 )
148  {
149  fixedRect.setHeight( fixedSize.height() );
150  }
151 
152  //check minimum size
153  QSizeF minSize = mMultiFrame->minFrameSize( frameIndex );
154  fixedRect.setWidth( qMax( minSize.width(), fixedRect.width() ) );
155  fixedRect.setHeight( qMax( minSize.height(), fixedRect.height() ) );
156  }
157 
158  QgsComposerItem::setSceneRect( fixedRect );
159 }
160 
161 void QgsComposerFrame::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget )
162 {
163  Q_UNUSED( itemStyle );
164  Q_UNUSED( pWidget );
165 
166  if ( !painter )
167  {
168  return;
169  }
170  if ( !shouldDrawItem() )
171  {
172  return;
173  }
174 
175  bool empty = isEmpty();
176 
177  if ( !empty || !mHideBackgroundIfEmpty )
178  {
179  drawBackground( painter );
180  }
181  if ( mMultiFrame )
182  {
183  //calculate index of frame
184  int frameIndex = mMultiFrame->frameIndex( this );
185  mMultiFrame->render( painter, mSection, frameIndex );
186  }
187 
188  if ( !empty || !mHideBackgroundIfEmpty )
189  {
190  drawFrame( painter );
191  }
192  if ( isSelected() )
193  {
194  drawSelectionBoxes( painter );
195  }
196 }
197 
198 void QgsComposerFrame::beginItemCommand( const QString& text )
199 {
200  if ( mComposition )
201  {
203  }
204 }
205 
207 {
208  if ( mComposition )
209  {
211  }
212 }