Skip to content

Commit da2d7db

Browse files
committed
Redesign composer; use dock widgets vs splitter; reduce scrolling in
item widgets
1 parent a406a88 commit da2d7db

15 files changed

+1271
-1111
lines changed

python/gui/qgscomposerview.sip

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ class QgsComposerView: QGraphicsView
3030
AddLabel, // add label
3131
AddScalebar, // add scalebar
3232
AddPicture, // add raster/vector picture
33-
AddShape, //add shape item (ellipse, rectangle, triangle)
33+
AddRectangle,
34+
AddEllipse,
35+
AddTriangle,
3436
MoveItemContent //move content of item (e.g. content of map)
3537
};
3638

src/app/composer/qgscomposer.cpp

Lines changed: 86 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
8989
orderingToolButton->setPopupMode( QToolButton::InstantPopup );
9090
orderingToolButton->setAutoRaise( true );
9191
orderingToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly );
92-
9392
orderingToolButton->addAction( mActionRaiseItems );
9493
orderingToolButton->addAction( mActionLowerItems );
9594
orderingToolButton->addAction( mActionMoveItemsToTop );
@@ -111,6 +110,17 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
111110
alignToolButton->setDefaultAction( mActionAlignLeft );
112111
toolBar->addWidget( alignToolButton );
113112

113+
QToolButton* shapeToolButton = new QToolButton( toolBar );
114+
shapeToolButton->setCheckable( true );
115+
shapeToolButton->setPopupMode( QToolButton::InstantPopup );
116+
shapeToolButton->setAutoRaise( true );
117+
shapeToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly );
118+
shapeToolButton->addAction( mActionAddRectangle );
119+
shapeToolButton->addAction( mActionAddTriangle );
120+
shapeToolButton->addAction( mActionAddEllipse );
121+
shapeToolButton->setDefaultAction( mActionAddEllipse );
122+
toolBar->insertWidget( mActionAddArrow, shapeToolButton );
123+
114124
QActionGroup* toggleActionGroup = new QActionGroup( this );
115125
toggleActionGroup->addAction( mActionMoveItemContent );
116126
toggleActionGroup->addAction( mActionAddNewMap );
@@ -119,19 +129,21 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
119129
toggleActionGroup->addAction( mActionAddNewScalebar );
120130
toggleActionGroup->addAction( mActionAddImage );
121131
toggleActionGroup->addAction( mActionSelectMoveItem );
122-
toggleActionGroup->addAction( mActionAddBasicShape );
132+
toggleActionGroup->addAction( mActionAddRectangle );
133+
toggleActionGroup->addAction( mActionAddTriangle );
134+
toggleActionGroup->addAction( mActionAddEllipse );
123135
toggleActionGroup->addAction( mActionAddArrow );
124136
toggleActionGroup->addAction( mActionAddTable );
125137
toggleActionGroup->setExclusive( true );
126138

139+
127140
mActionAddNewMap->setCheckable( true );
128141
mActionAddNewLabel->setCheckable( true );
129142
mActionAddNewLegend->setCheckable( true );
130143
mActionSelectMoveItem->setCheckable( true );
131144
mActionAddNewScalebar->setCheckable( true );
132145
mActionAddImage->setCheckable( true );
133146
mActionMoveItemContent->setCheckable( true );
134-
mActionAddBasicShape->setCheckable( true );
135147
mActionAddArrow->setCheckable( true );
136148

137149
#ifdef Q_WS_MAC
@@ -172,7 +184,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
172184
layoutMenu->addAction( mActionAddImage );
173185
layoutMenu->addAction( mActionSelectMoveItem );
174186
layoutMenu->addAction( mActionMoveItemContent );
175-
layoutMenu->addAction( mActionAddBasicShape );
187+
176188
layoutMenu->addAction( mActionAddArrow );
177189
layoutMenu->addAction( mActionAddTable );
178190
layoutMenu->addSeparator();
@@ -201,7 +213,6 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
201213
QgsDebugMsg( "entered." );
202214

203215
setMouseTracking( true );
204-
//mSplitter->setMouseTracking(true);
205216
mViewFrame->setMouseTracking( true );
206217

207218
//create composer view
@@ -224,23 +235,40 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
224235
mComposition->setParent( mView );
225236
mView->setComposition( mComposition );
226237

227-
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
228-
QObject::connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
229-
compositionWidget->show();
238+
setTabPosition( Qt::AllDockWidgetAreas, QTabWidget::North);
239+
mGeneralDock = new QDockWidget(tr("Composition"),this);
240+
mGeneralDock->setObjectName( "CompositionDock" );
241+
mItemDock = new QDockWidget(tr("Item Properties"));
242+
mItemDock->setObjectName( "ItemDock");
243+
mUndoDock = new QDockWidget(tr("Command history"),this);
244+
mUndoDock->setObjectName( "CommandDock" );
230245

231-
mCompositionOptionsLayout = new QGridLayout( mCompositionOptionsFrame );
232-
mCompositionOptionsLayout->setMargin( 0 );
233-
mCompositionOptionsLayout->addWidget( compositionWidget );
234246

235-
QGridLayout *l = new QGridLayout( mViewFrame );
236-
l->setMargin( 0 );
237-
l->addWidget( mView, 0, 0 );
238247

239-
mCompositionNameComboBox->insertItem( 0, tr( "Map 1" ) );
248+
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mGeneralDock, mComposition );
249+
connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
250+
mGeneralDock->setWidget( compositionWidget );
240251

241252
//undo widget
242253
mUndoView = new QUndoView( mComposition->undoStack(), this );
243-
mOptionsTabWidget->addTab( mUndoView, tr( "Command history" ) );
254+
mUndoDock->setWidget( mUndoView );
255+
256+
addDockWidget( Qt::RightDockWidgetArea, mItemDock );
257+
addDockWidget( Qt::RightDockWidgetArea, mGeneralDock );
258+
addDockWidget( Qt::RightDockWidgetArea, mUndoDock );
259+
260+
mItemDock->show();
261+
mGeneralDock->show();
262+
mUndoDock->hide();
263+
264+
tabifyDockWidget(mGeneralDock, mUndoDock);
265+
tabifyDockWidget(mGeneralDock, mItemDock);
266+
267+
mGeneralDock->raise();
268+
269+
QGridLayout *l = new QGridLayout( mViewFrame );
270+
l->setMargin( 0 );
271+
l->addWidget( mView, 0, 0 );
244272

245273
// Create size grip (needed by Mac OS X for QMainWindow if QStatusBar is not visible)
246274
mSizeGrip = new QSizeGrip( this );
@@ -286,7 +314,9 @@ void QgsComposer::setupTheme()
286314
mActionAddNewLabel->setIcon( QgisApp::getThemeIcon( "/mActionLabel.png" ) );
287315
mActionAddNewLegend->setIcon( QgisApp::getThemeIcon( "/mActionAddLegend.png" ) );
288316
mActionAddNewScalebar->setIcon( QgisApp::getThemeIcon( "/mActionScaleBar.png" ) );
289-
mActionAddBasicShape->setIcon( QgisApp::getThemeIcon( "/mActionAddBasicShape.png" ) );
317+
mActionAddRectangle->setIcon( QgisApp::getThemeIcon( "/mActionAddBasicShape.png" ) );
318+
mActionAddTriangle->setIcon( QgisApp::getThemeIcon( "/mActionAddBasicShape.png" ) );
319+
mActionAddEllipse->setIcon( QgisApp::getThemeIcon( "/mActionAddBasicShape.png" ) );
290320
mActionAddArrow->setIcon( QgisApp::getThemeIcon( "/mActionAddArrow.png" ) );
291321
mActionAddTable->setIcon( QgisApp::getThemeIcon( "/mActionOpenTable.png" ) );
292322
mActionSelectMoveItem->setIcon( QgisApp::getThemeIcon( "/mActionSelectPan.png" ) );
@@ -396,21 +426,13 @@ void QgsComposer::setTitle( const QString& title )
396426
}
397427
}
398428

399-
void QgsComposer::showCompositionOptions( QWidget *w )
400-
{
401-
QWidget* currentWidget = mItemStackedWidget->currentWidget();
402-
mItemStackedWidget->removeWidget( currentWidget );
403-
mItemStackedWidget->addWidget( w );
404-
}
405-
406429
void QgsComposer::showItemOptions( QgsComposerItem* item )
407430
{
408-
QWidget* currentWidget = mItemStackedWidget->currentWidget();
431+
QWidget* currentWidget = mItemDock->widget();
409432

410433
if ( !item )
411434
{
412-
mItemStackedWidget->removeWidget( currentWidget );
413-
mItemStackedWidget->setCurrentWidget( 0 );
435+
mItemDock->setWidget( 0 );
414436
return;
415437
}
416438

@@ -427,10 +449,7 @@ void QgsComposer::showItemOptions( QgsComposerItem* item )
427449
return;
428450
}
429451

430-
mItemStackedWidget->removeWidget( currentWidget );
431-
mItemStackedWidget->addWidget( newWidget );
432-
mItemStackedWidget->setCurrentWidget( newWidget );
433-
//newWidget->show();
452+
mItemDock->setWidget( newWidget );
434453
}
435454

436455
QgsMapCanvas *QgsComposer::mapCanvas( void )
@@ -848,11 +867,27 @@ void QgsComposer::on_mActionAddImage_triggered()
848867
}
849868
}
850869

851-
void QgsComposer::on_mActionAddBasicShape_triggered()
870+
void QgsComposer::on_mActionAddRectangle_triggered()
871+
{
872+
if ( mView )
873+
{
874+
mView->setCurrentTool( QgsComposerView::AddRectangle );
875+
}
876+
}
877+
878+
void QgsComposer::on_mActionAddTriangle_triggered()
852879
{
853880
if ( mView )
854881
{
855-
mView->setCurrentTool( QgsComposerView::AddShape );
882+
mView->setCurrentTool( QgsComposerView::AddTriangle );
883+
}
884+
}
885+
886+
void QgsComposer::on_mActionAddEllipse_triggered()
887+
{
888+
if ( mView )
889+
{
890+
mView->setCurrentTool( QgsComposerView::AddEllipse );
856891
}
857892
}
858893

@@ -1064,6 +1099,12 @@ void QgsComposer::on_mActionRedo_triggered()
10641099
}
10651100
}
10661101

1102+
void QgsComposer::closeEvent(QCloseEvent *e)
1103+
{
1104+
Q_UNUSED( e );
1105+
saveWindowState();
1106+
}
1107+
10671108
void QgsComposer::moveEvent( QMoveEvent *e )
10681109
{
10691110
Q_UNUSED( e );
@@ -1108,24 +1149,18 @@ void QgsComposer::saveWindowState()
11081149
{
11091150
QSettings settings;
11101151
settings.setValue( "/Composer/geometry", saveGeometry() );
1111-
//settings.setValue("/Composer/splitterState", mSplitter->saveState());
1152+
// store the toolbar/dock widget settings using Qt4 settings API
1153+
settings.setValue( "/ComposerUI/state", saveState() );
11121154
}
11131155

11141156
void QgsComposer::restoreWindowState()
11151157
{
11161158
QSettings settings;
1117-
restoreGeometry( settings.value( "/Composer/geometry" ).toByteArray() );
1118-
QVariant splitterState = settings.value( "/Composer/splitterState" );
1119-
if ( !splitterState.isNull() )
1159+
if (! restoreState( settings.value( "/ComposerUI/state" ).toByteArray() ))
11201160
{
1121-
//mSplitter->restoreState(settings.value("/Composer/splitterState").toByteArray());
1122-
}
1123-
else
1124-
{
1125-
QList<int> defaultSize;
1126-
defaultSize << 300 << 100; // page display 300 pixels, details pane 100 pixels
1127-
//mSplitter->setSizes(defaultSize);
1161+
QgsDebugMsg("RESTORE STATE FAILED!!");
11281162
}
1163+
restoreGeometry( settings.value( "/Composer/geometry" ).toByteArray() );
11291164
}
11301165

11311166
void QgsComposer::writeXML( QDomDocument& doc )
@@ -1218,7 +1253,7 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
12181253
delete( *it );
12191254
}
12201255
//delete composition widget
1221-
QgsCompositionWidget* oldCompositionWidget = qobject_cast<QgsCompositionWidget *>( mCompositionOptionsFrame->children().at( 0 ) );
1256+
QgsCompositionWidget* oldCompositionWidget = qobject_cast<QgsCompositionWidget *>( mGeneralDock->widget() );
12221257
delete oldCompositionWidget;
12231258
delete mCompositionOptionsLayout;
12241259
mCompositionOptionsLayout = 0;
@@ -1241,13 +1276,13 @@ void QgsComposer::readXML( const QDomElement& composerElem, const QDomDocument&
12411276
l->addWidget( mView, 0, 0 );
12421277

12431278
//create compositionwidget
1244-
QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
1245-
QObject::connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
1246-
compositionWidget->show();
1279+
// QgsCompositionWidget* compositionWidget = new QgsCompositionWidget( mCompositionOptionsFrame, mComposition );
1280+
// QObject::connect( mComposition, SIGNAL( paperSizeChanged() ), compositionWidget, SLOT( displayCompositionWidthHeight() ) );
1281+
// compositionWidget->show();
12471282

1248-
mCompositionOptionsLayout = new QGridLayout( mCompositionOptionsFrame );
1249-
mCompositionOptionsLayout->setMargin( 0 );
1250-
mCompositionOptionsLayout->addWidget( compositionWidget );
1283+
// mCompositionOptionsLayout = new QGridLayout( mCompositionOptionsFrame );
1284+
// mCompositionOptionsLayout->setMargin( 0 );
1285+
// mCompositionOptionsLayout->addWidget( compositionWidget );
12511286

12521287
//read and restore all the items
12531288
if ( mComposition )

src/app/composer/qgscomposer.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgscomposermap.h"
2121
#include "qgscontexthelp.h"
2222
#include <QPrinter>
23+
#include <QDockWidget>
2324

2425
class QgisApp;
2526
class QgsComposerArrow;
@@ -74,9 +75,6 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
7475
//! Return current composition
7576
//QgsComposition *composition(void);
7677

77-
//! Show composition options in widget
78-
void showCompositionOptions( QWidget *w );
79-
8078
//! Restore the window and toolbar state
8179
void restoreWindowState();
8280

@@ -89,6 +87,8 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
8987
//! Move event
9088
virtual void moveEvent( QMoveEvent * );
9189

90+
virtual void closeEvent(QCloseEvent * );
91+
9292
//! Resize event
9393
virtual void resizeEvent( QResizeEvent * );
9494

@@ -157,8 +157,11 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
157157
//! Add new picture
158158
void on_mActionAddImage_triggered();
159159

160-
//! Add ellipse shape item
161-
void on_mActionAddBasicShape_triggered();
160+
void on_mActionAddRectangle_triggered();
161+
162+
void on_mActionAddTriangle_triggered();
163+
164+
void on_mActionAddEllipse_triggered();
162165

163166
//! Add attribute table
164167
void on_mActionAddTable_triggered();
@@ -322,6 +325,10 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
322325

323326
//! We load composer map content from project xml only on demand. Therefore we need to store the real preview mode type
324327
QMap< QgsComposerMap*, QgsComposerMap::PreviewMode > mMapsToRestore;
328+
329+
QDockWidget* mItemDock;
330+
QDockWidget* mUndoDock;
331+
QDockWidget* mGeneralDock;
325332
};
326333

327334
#endif

0 commit comments

Comments
 (0)