Skip to content

Commit c01edd4

Browse files
committed
Scaling for html multi frame
1 parent b3b9674 commit c01edd4

11 files changed

+101
-17
lines changed

src/app/composer/qgscomposer.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
136136
toggleActionGroup->addAction( mActionAddEllipse );
137137
toggleActionGroup->addAction( mActionAddArrow );
138138
toggleActionGroup->addAction( mActionAddTable );
139+
toggleActionGroup->addAction( mActionAddHtml );
139140
toggleActionGroup->setExclusive( true );
140141

141142

@@ -821,6 +822,14 @@ void QgsComposer::on_mActionAddTable_triggered()
821822
}
822823
}
823824

825+
void QgsComposer::on_mActionAddHtml_triggered()
826+
{
827+
if ( mView )
828+
{
829+
mView->setCurrentTool( QgsComposerView::AddHtml );
830+
}
831+
}
832+
824833
void QgsComposer::on_mActionAddArrow_triggered()
825834
{
826835
if ( mView )

src/app/composer/qgscomposer.h

+2
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
167167
//! Add attribute table
168168
void on_mActionAddTable_triggered();
169169

170+
void on_mActionAddHtml_triggered();
171+
170172
//! Save composer as template
171173
void on_mActionSaveAsTemplate_triggered();
172174

src/core/composer/qgscomposerframe.cpp

+15-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
#include "qgscomposerframe.h"
1717
#include "qgscomposermultiframe.h"
1818

19-
QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf ): QgsComposerItem( c ), mMultiFrame( mf )
19+
QgsComposerFrame::QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf, double x, double y, double width, double height ):
20+
QgsComposerItem( x, y, width, height, c ), mMultiFrame( mf )
2021
{
2122
}
2223

@@ -36,8 +37,20 @@ bool QgsComposerFrame::readXML( const QDomElement& itemElem, const QDomDocument&
3637

3738
void QgsComposerFrame::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget )
3839
{
39-
if ( mMultiFrame && painter )
40+
if ( !painter )
41+
{
42+
return;
43+
}
44+
45+
drawBackground( painter );
46+
if ( mMultiFrame )
4047
{
4148
mMultiFrame->render( painter, mSection );
4249
}
50+
51+
drawFrame( painter );
52+
if ( isSelected() )
53+
{
54+
drawSelectionBoxes( painter );
55+
}
4356
}

src/core/composer/qgscomposerframe.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class QgsComposerMultiFrame;
2525
class QgsComposerFrame: public QgsComposerItem
2626
{
2727
public:
28-
QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf );
28+
QgsComposerFrame( QgsComposition* c, QgsComposerMultiFrame* mf, qreal x, qreal y, qreal width, qreal height );
2929
~QgsComposerFrame();
3030

3131
/**Sets the part of this frame (relative to the total multiframe extent in mm)*/

src/core/composer/qgscomposerhtml.cpp

+31-10
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,27 @@
1414
***************************************************************************/
1515

1616
#include "qgscomposerhtml.h"
17+
#include "qgscomposerframe.h"
1718
#include "qgscomposition.h"
1819
#include <QCoreApplication>
1920
#include <QImage>
2021
#include <QPainter>
2122
#include <QWebFrame>
2223
#include <QWebPage>
2324

24-
QgsComposerHtml::QgsComposerHtml( QgsComposition* c ): QgsComposerMultiFrame( c ), mWebPage( 0 ), mLoaded( false )
25+
QgsComposerHtml::QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height ): QgsComposerMultiFrame( c ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
2526
{
27+
mHtmlUnitsToMM = htmlUnitsToMM();
2628
mWebPage = new QWebPage();
2729
QObject::connect( mWebPage, SIGNAL( loadFinished( bool ) ), this, SLOT( frameLoaded( bool ) ) );
30+
setUrl( QUrl( "http://www.qgis.org" ) );//test
31+
QgsComposerFrame* frame = new QgsComposerFrame( c, this, x, y, width, height );
32+
addFrame( frame );
33+
mComposition->addItem( frame );
34+
recalculateFrameSizes();
2835
}
2936

30-
QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0 ), mWebPage( 0 ), mLoaded( false )
37+
QgsComposerHtml::QgsComposerHtml(): QgsComposerMultiFrame( 0 ), mWebPage( 0 ), mLoaded( false ), mHtmlUnitsToMM( 1.0 )
3138
{
3239
}
3340

@@ -49,7 +56,12 @@ void QgsComposerHtml::setUrl( const QUrl& url )
4956
{
5057
qApp->processEvents();
5158
}
52-
mWebPage->setViewportSize( mWebPage->mainFrame()->contentsSize() );
59+
QSize contentsSize = mWebPage->mainFrame()->contentsSize();
60+
mWebPage->setViewportSize( contentsSize );
61+
62+
double pixelPerMM = mComposition->printResolution() / 25.4;
63+
mSize.setWidth( contentsSize.width() / pixelPerMM );
64+
mSize.setHeight( contentsSize.height() / pixelPerMM );
5365
}
5466

5567
void QgsComposerHtml::frameLoaded( bool ok )
@@ -59,7 +71,7 @@ void QgsComposerHtml::frameLoaded( bool ok )
5971

6072
QSizeF QgsComposerHtml::totalSize() const
6173
{
62-
return QSizeF(); //soon...
74+
return mSize;
6375
}
6476

6577
void QgsComposerHtml::render( QPainter* p, const QRectF& renderExtent )
@@ -69,12 +81,21 @@ void QgsComposerHtml::render( QPainter* p, const QRectF& renderExtent )
6981
return;
7082
}
7183

72-
QImage img; //dummy image to find out assumed screen dpi
73-
74-
double pixelPerMM = mComposition->printResolution() / 25.4;
75-
double painterScale = 1.0 / ( pixelPerMM / (( double )img.dotsPerMeterX() / 1000.0 ) );
7684
p->save();
77-
p->scale( painterScale, painterScale );
78-
mWebPage->mainFrame()->render( p, QRegion( renderExtent.left(), renderExtent.top(), renderExtent.width(), renderExtent.height() ) );
85+
p->scale( 1.0 / mHtmlUnitsToMM, 1.0 / mHtmlUnitsToMM );
86+
mWebPage->mainFrame()->render( p, QRegion( renderExtent.left(), renderExtent.top(), renderExtent.width() * mHtmlUnitsToMM, renderExtent.height() * mHtmlUnitsToMM ) );
7987
p->restore();
8088
}
89+
90+
double QgsComposerHtml::htmlUnitsToMM()
91+
{
92+
if ( !mComposition )
93+
{
94+
return 1.0;
95+
}
96+
97+
QImage img( 1, 1, QImage::Format_ARGB32_Premultiplied );
98+
double debug = img.dotsPerMeterX();
99+
double pixelPerMM = mComposition->printResolution() / 25.4;
100+
return ( pixelPerMM / ( img.dotsPerMeterX() / 1000.0 ) );
101+
}

src/core/composer/qgscomposerhtml.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class QgsComposerHtml: public QgsComposerMultiFrame
2525
{
2626
Q_OBJECT
2727
public:
28-
QgsComposerHtml( QgsComposition* c );
28+
QgsComposerHtml( QgsComposition* c, qreal x, qreal y, qreal width, qreal height );
2929
QgsComposerHtml();
3030
~QgsComposerHtml();
3131

@@ -42,6 +42,10 @@ class QgsComposerHtml: public QgsComposerMultiFrame
4242
QUrl mUrl;
4343
QWebPage* mWebPage;
4444
bool mLoaded;
45+
QSizeF mSize; //total size in mm
46+
double mHtmlUnitsToMM;
47+
48+
double htmlUnitsToMM(); //calculate scale factor
4549
};
4650

4751
#endif // QGSCOMPOSERHTML_H

src/core/composer/qgscomposermultiframe.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
***************************************************************************/
1515

1616
#include "qgscomposermultiframe.h"
17+
#include "qgscomposerframe.h"
1718

1819
QgsComposerMultiFrame::QgsComposerMultiFrame( QgsComposition* c ): mComposition( c )
1920
{
@@ -29,5 +30,10 @@ QgsComposerMultiFrame::~QgsComposerMultiFrame()
2930

3031
void QgsComposerMultiFrame::recalculateFrameSizes()
3132
{
32-
//todo...
33+
if ( mFrameItems.size() > 0 )
34+
{
35+
QSizeF size = totalSize();
36+
QgsComposerFrame* item = mFrameItems[0];
37+
item->setContentSection( QRectF( 0, 0, item->rect().width(), item->rect().height() ) );
38+
}
3339
}

src/core/composer/qgscomposermultiframe.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include <QObject>
2020
#include <QSizeF>
2121

22-
class QgsComposerItem;
22+
class QgsComposerFrame;
2323
class QgsComposition;
2424
class QRectF;
2525
class QPainter;
@@ -41,9 +41,11 @@ class QgsComposerMultiFrame: public QObject
4141
virtual QSizeF totalSize() const = 0;
4242
virtual void render( QPainter* p, const QRectF& renderExtent ) = 0;
4343

44+
void addFrame( QgsComposerFrame* frame ) { mFrameItems.push_back( frame ); }
45+
4446
protected:
4547
QgsComposition* mComposition;
46-
QList<QgsComposerItem*> mFrameItems;
48+
QList<QgsComposerFrame*> mFrameItems;
4749

4850
void recalculateFrameSizes();
4951

src/gui/qgscomposerview.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "qgscomposerview.h"
2626
#include "qgscomposerarrow.h"
27+
#include "qgscomposerhtml.h"
2728
#include "qgscomposerlabel.h"
2829
#include "qgscomposerlegend.h"
2930
#include "qgscomposermap.h"
@@ -126,6 +127,7 @@ void QgsComposerView::mousePressEvent( QMouseEvent* e )
126127
case AddRectangle:
127128
case AddTriangle:
128129
case AddEllipse:
130+
case AddHtml:
129131
{
130132
QTransform t;
131133
mRubberBandItem = new QGraphicsRectItem( 0, 0, 0, 0 );
@@ -317,6 +319,17 @@ void QgsComposerView::mouseReleaseEvent( QMouseEvent* e )
317319
}
318320
break;
319321

322+
case AddHtml:
323+
if ( composition() )
324+
{
325+
QgsComposerHtml* composerHtml = new QgsComposerHtml( composition(), mRubberBandItem->transform().dx(), mRubberBandItem->transform().dy(),
326+
mRubberBandItem->rect().width(), mRubberBandItem->rect().height() );
327+
scene()->removeItem( mRubberBandItem );
328+
delete mRubberBandItem;
329+
mRubberBandItem = 0;
330+
emit actionFinished();
331+
//composition()->pushAddRemoveCommand...
332+
}
320333
default:
321334
break;
322335
}
@@ -359,6 +372,7 @@ void QgsComposerView::mouseMoveEvent( QMouseEvent* e )
359372
case AddRectangle:
360373
case AddTriangle:
361374
case AddEllipse:
375+
case AddHtml:
362376
//adjust rubber band item
363377
{
364378
double x = 0;

src/gui/qgscomposerview.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
5454
{
5555
Select = 0, // Select/Move item
5656
AddArrow, //add arrow
57+
AddHtml,
5758
AddMap, // add new map
5859
AddLegend, // add vector legend
5960
AddLabel, // add label

src/ui/qgscomposerbase.ui

+12
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<addaction name="mActionAddNewScalebar"/>
8181
<addaction name="mActionAddArrow"/>
8282
<addaction name="mActionAddTable"/>
83+
<addaction name="mActionAddHtml"/>
8384
<addaction name="separator"/>
8485
<addaction name="mActionSelectMoveItem"/>
8586
<addaction name="mActionMoveItemContent"/>
@@ -443,6 +444,17 @@
443444
<string>Add Ellipse</string>
444445
</property>
445446
</action>
447+
<action name="mActionAddHtml">
448+
<property name="checkable">
449+
<bool>true</bool>
450+
</property>
451+
<property name="text">
452+
<string>Add html</string>
453+
</property>
454+
<property name="toolTip">
455+
<string>Add html frame</string>
456+
</property>
457+
</action>
446458
</widget>
447459
<resources>
448460
<include location="../../images/images.qrc"/>

0 commit comments

Comments
 (0)