📄 qgscomposervectorlegend.cpp
字号:
} return QRectF ( 0, 0, width, height);}void QgsComposerVectorLegend::cache ( void ){ std::cout << "QgsComposerVectorLegend::cache()" << std::endl;//typical boundingRect size is 15 units wide, mCachePixmap.resize ((int)QGraphicsRectItem::rect().width(), (int)QGraphicsRectItem::rect().height() ); QPainter p(&mCachePixmap); mCachePixmap.fill(QColor(255,255,255)); render ( &p ); p.end(); mNumCachedLayers = mMapCanvas->layerCount(); mCacheUpdated = true; }void QgsComposerVectorLegend::paint( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget ){#ifdef QGISDEBUG std::cout << "paint mPlotStyle = " << plotStyle() << " mPreviewMode = " << mPreviewMode << std::endl;#endif if ( plotStyle() == QgsComposition::Preview && mPreviewMode == Cache ) { if ( !mCacheUpdated || mMapCanvas->layerCount() != mNumCachedLayers ) //If the cache is out of date, update it. { cache(); } painter->drawPixmap(0,0, mCachePixmap); } else if(plotStyle() == QgsComposition::Preview && mPreviewMode == Rectangle) { QPen pen(QColor(0,0,0), 0.5); painter->setPen( pen ); painter->setBrush( QBrush( QColor(255,255,255), Qt::NoBrush)); //use SolidPattern instead? painter->drawRect(QRectF(0, 0, QGraphicsRectItem::rect().width(), QGraphicsRectItem::rect().height())); } else if ( (plotStyle() == QgsComposition::Preview && mPreviewMode == Render) || plotStyle() == QgsComposition::Print || plotStyle() == QgsComposition::Postscript ) //We're in render preview mode or printing, so do a full render of the legend. { painter->save(); render(painter); painter->restore(); } // Draw the "selected highlight" boxes if ( mSelected && plotStyle() == QgsComposition::Preview ) { painter->setPen( mComposition->selectionPen() ); painter->setBrush( mComposition->selectionBrush() ); double s = mComposition->selectionBoxSize(); painter->drawRect(QRectF(0, 0, s, s)); //top left painter->drawRect(QRectF(QGraphicsRectItem::rect().width()-s, 0, s, s)); //top right painter->drawRect(QRectF(QGraphicsRectItem::rect().width()-s, QGraphicsRectItem::rect().height()-s, s, s)); //bottom right painter->drawRect(QRectF(0, QGraphicsRectItem::rect().height()-s, s, s)); //bottom left }}void QgsComposerVectorLegend::on_mFontButton_clicked ( void ) { bool result; mFont = QFontDialog::getFont(&result, mFont, this ); if ( result ) { recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update(); writeSettings(); }}void QgsComposerVectorLegend::on_mTitleLineEdit_editingFinished ( void ){ mTitle = mTitleLineEdit->text(); recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update(); writeSettings();}void QgsComposerVectorLegend::on_mPreviewModeComboBox_activated ( int i ){ mPreviewMode = (PreviewMode) i; std::cout << "mPreviewMode = " << mPreviewMode << std::endl; writeSettings();}void QgsComposerVectorLegend::on_mMapComboBox_activated ( int i ){ mMap = mMaps[i]; recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update(); writeSettings();}void QgsComposerVectorLegend::mapChanged ( int id ){ if ( id != mMap ) return; recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update();}void QgsComposerVectorLegend::on_mFrameCheckBox_stateChanged ( int ){ mFrame = mFrameCheckBox->isChecked(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update(); writeSettings();}void QgsComposerVectorLegend::recalculate ( void ) { std::cout << "QgsComposerVectorLegend::recalculate" << std::endl; // Recalculate sizes according to current font size // Title and section font mTitleFont = mFont; mTitleFont.setPointSizeFloat ( 1.4 * mFont.pointSizeFloat()); mSectionFont = mFont; mSectionFont.setPointSizeFloat ( 1.2 * mFont.pointSizeFloat() ); std::cout << "font size = " << mFont.pointSizeFloat() << std::endl; std::cout << "title font size = " << mTitleFont.pointSizeFloat() << std::endl; // Font size in canvas units float size = 25.4 * mComposition->scale() * mFont.pointSizeFloat() / 72; mMargin = 0.9 * size; mSymbolHeight = 1.3 * size; mSymbolWidth = 3.5 * size; mSymbolSpace = 0.4 * size; std::cout << "mMargin = " << mMargin << " mSymbolHeight = " << mSymbolHeight << "mSymbolWidth = " << mSymbolWidth << " mSymbolSpace = " << mSymbolSpace << std::endl; QRectF r = render(0); QGraphicsRectItem::setRect(0, 0, r.width(), r.height() ); mCacheUpdated = false;}void QgsComposerVectorLegend::setOptions ( void ){ mTitleLineEdit->setText( mTitle ); // Maps mMapComboBox->clear(); std::vector<QgsComposerMap*> maps = mComposition->maps(); mMaps.clear(); bool found = false; mMapComboBox->insertItem ( "", 0 ); mMaps.push_back ( 0 ); for ( int i = 0; i < (int)maps.size(); i++ ) { mMapComboBox->insertItem ( maps[i]->name(), i+1 ); mMaps.push_back ( maps[i]->id() ); if ( maps[i]->id() == mMap ) { found = true; mMapComboBox->setCurrentItem ( i+1 ); } } if ( ! found ) { mMap = 0; mMapComboBox->setCurrentItem ( 0 ); } mFrameCheckBox->setChecked ( mFrame ); // Layers mLayersListView->clear(); if ( mMap != 0 ) { QgsComposerMap *map = mComposition->map ( mMap ); if ( map ) { int nlayers = mMapCanvas->layerCount(); for ( int i = 0; i < nlayers; i++ ) { QgsMapLayer *layer = mMapCanvas->getZpos(i); // if ( !layer->visible() ) continue; //if ( layer->type() != QgsMapLayer::VECTOR ) continue; Q3CheckListItem *li = new Q3CheckListItem ( mLayersListView, layer->name(), Q3CheckListItem::CheckBox ); QString id = layer->getLayerID(); li->setText(2, id ); li->setOn ( layerOn(id) ); int group = layerGroup(id); if ( group > 0 ) { li->setText(1, QString::number(group) ); } mLayersListView->insertItem ( li ); } } } mPreviewModeComboBox->setCurrentItem( mPreviewMode );}void QgsComposerVectorLegend::setSelected ( bool s ) { mSelected = s; QGraphicsRectItem::update(); // show highlight} bool QgsComposerVectorLegend::selected( void ){ return mSelected;}void QgsComposerVectorLegend::showLayersPopupMenu ( Q3ListViewItem * lvi, const QPoint & pt, int ){ std::cout << "QgsComposerVectorLegend::showLayersPopupMenu" << std::endl; mLayersPopupMenu->exec(pt);}bool QgsComposerVectorLegend::layerOn ( QString id ) { std::map<QString,bool>::iterator it = mLayersOn.find(id); if(it != mLayersOn.end() ) { return ( it->second ); } return true;}void QgsComposerVectorLegend::setLayerOn ( QString id, bool on ) { std::map<QString,bool>::iterator it = mLayersOn.find(id); if(it != mLayersOn.end() ) { it->second = on; } else { mLayersOn.insert(std::make_pair(id,on)); }}int QgsComposerVectorLegend::layerGroup ( QString id ) { std::map<QString,int>::iterator it = mLayersGroups.find(id); if(it != mLayersGroups.end() ) { return ( it->second ); } return 0;}void QgsComposerVectorLegend::setLayerGroup ( QString id, int group ) { std::map<QString,int>::iterator it = mLayersGroups.find(id); if(it != mLayersGroups.end() ) { it->second = group; } else { mLayersGroups.insert(std::make_pair(id,group)); }}void QgsComposerVectorLegend::layerChanged ( Q3ListViewItem *lvi ){ std::cout << "QgsComposerVectorLegend::layerChanged" << std::endl; if ( lvi == 0 ) return; QString id = lvi->text(2); Q3CheckListItem *cli = dynamic_cast <Q3CheckListItem *>(lvi); setLayerOn ( id, cli->isOn() ); writeSettings(); recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update();}void QgsComposerVectorLegend::groupLayers ( void ) { std::cout << "QgsComposerVectorLegend::groupLayers" << std::endl; Q3ListViewItemIterator it( mLayersListView ); int count = 0; Q3ListViewItem *lastItem = NULL; QString id; while ( it.current() ) { if ( it.current()->isSelected() ) { std::cout << "selected: " << it.current()->text(0).toLocal8Bit().data() << " " << it.current()->text(2).toLocal8Bit().data() << std::endl; id = it.current()->text(2); setLayerGroup ( id, mNextLayerGroup ); it.current()->setText(1,QString::number(mNextLayerGroup) ); lastItem = it.current(); count++; } ++it; } if ( count == 1 ) { // one item only setLayerGroup ( id, 0 ); lastItem->setText(1,"" ); } std::cout << "Groups:" << std::endl; for ( std::map<QString,int>::iterator it3 = mLayersGroups.begin(); it3 != mLayersGroups.end(); ++it3 ) { std::cout << "layer: " << (it3->first).toLocal8Bit().data() << " group: " << it3->second << std::endl; } mNextLayerGroup++; writeSettings(); recalculate(); QGraphicsRectItem::update(); QGraphicsRectItem::scene()->update();} QWidget *QgsComposerVectorLegend::options ( void ){ setOptions (); return ( dynamic_cast <QWidget *> (this) ); }bool QgsComposerVectorLegend::writeSettings ( void ) { std::cout << "QgsComposerVectorLegend::writeSettings" << std::endl; QString path; path.sprintf("/composition_%d/vectorlegend_%d/", mComposition->id(), mId ); QgsProject::instance()->writeEntry( "Compositions", path+"x", mComposition->toMM((int)QGraphicsRectItem::x()) ); QgsProject::instance()->writeEntry( "Compositions", path+"y", mComposition->toMM((int)QGraphicsRectItem::y()) ); QgsProject::instance()->writeEntry( "Compositions", path+"map", mMap ); QgsProject::instance()->writeEntry( "Compositions", path+"title", mTitle ); QgsProject::instance()->writeEntry( "Compositions", path+"font/size", mFont.pointSize() ); QgsProject::instance()->writeEntry( "Compositions", path+"font/family", mFont.family() ); QgsProject::instance()->writeEntry( "Compositions", path+"font/weight", mFont.weight() ); QgsProject::instance()->writeEntry( "Compositions", path+"font/underline", mFont.underline() ); QgsProject::instance()->writeEntry( "Compositions", path+"font/strikeout", mFont.strikeOut() ); QgsProject::instance()->writeEntry( "Compositions", path+"frame", mFrame ); // Layers: remove all, write new path.sprintf("/composition_%d/vectorlegend_%d/layers/", mComposition->id(), mId ); QgsProject::instance()->removeEntry ( "Compositions", path ); if ( mMap != 0 ) { QgsComposerMap *map = mComposition->map ( mMap ); if ( map ) { int nlayers = mMapCanvas->layerCount(); for ( int i = 0; i < nlayers; i++ ) { QgsMapLayer *layer = mMapCanvas->getZpos(i); // if ( !layer->visible() ) continue; QString id = layer->getLayerID(); path.sprintf("/composition_%d/vectorlegend_%d/layers/layer_%s/", mComposition->id(), mId, id.toLocal8Bit().data() ); QgsProject::instance()->writeEntry( "Compositions", path+"on", layerOn(id) ); QgsProject::instance()->writeEntry( "Compositions", path+"group", layerGroup(id) ); } } } QgsProject::instance()->writeEntry( "Compositions", path+"previewmode", mPreviewMode ); return true; }bool QgsComposerVectorLegend::readSettings ( void ){ bool ok; QString path; path.sprintf("/composition_%d/vectorlegend_%d/", mComposition->id(), mId ); double x = mComposition->fromMM(QgsProject::instance()->readDoubleEntry( "Compositions", path+"x", 0, &ok)); double y = mComposition->fromMM(QgsProject::instance()->readDoubleEntry( "Compositions", path+"y", 0, &ok)); QGraphicsRectItem::setPos(x, y); mMap = QgsProject::instance()->readNumEntry("Compositions", path+"map", 0, &ok); mTitle = QgsProject::instance()->readEntry("Compositions", path+"title", "???", &ok); mFont.setFamily ( QgsProject::instance()->readEntry("Compositions", path+"font/family", "", &ok) ); mFont.setPointSize ( QgsProject::instance()->readNumEntry("Compositions", path+"font/size", 10, &ok) ); mFont.setWeight( QgsProject::instance()->readNumEntry("Compositions", path+"font/weight", (int)QFont::Normal, &ok) ); mFont.setUnderline( QgsProject::instance()->readBoolEntry("Compositions", path+"font/underline", false, &ok) ); mFont.setStrikeOut( QgsProject::instance()->readBoolEntry("Compositions", path+"font/strikeout", false, &ok) ); mFrame = QgsProject::instance()->readBoolEntry("Compositions", path+"frame", true, &ok); // Preview mode mPreviewMode = (PreviewMode) QgsProject::instance()->readNumEntry("Compositions", path+"previewmode", Render, &ok); // Layers path.sprintf("/composition_%d/vectorlegend_%d/layers/", mComposition->id(), mId ); QStringList el = QgsProject::instance()->subkeyList ( "Compositions", path ); for ( QStringList::iterator it = el.begin(); it != el.end(); ++it ) { int idx = (*it).find('_'); QString id = (*it).right( (*it).length() - (idx+1) ); path.sprintf("/composition_%d/vectorlegend_%d/layers/layer_%s/", mComposition->id(), mId, id.toLocal8Bit().data() ); bool on = QgsProject::instance()->readBoolEntry("Compositions", path+"on", true, &ok); int group = QgsProject::instance()->readNumEntry("Compositions", path+"group", 0, &ok); setLayerOn ( id , on ); setLayerGroup ( id, group ); if ( group >= mNextLayerGroup ) mNextLayerGroup = group+1; } recalculate(); return true;}bool QgsComposerVectorLegend::removeSettings( void ){ std::cerr << "QgsComposerVectorLegend::deleteSettings" << std::endl; QString path; path.sprintf("/composition_%d/vectorlegend_%d", mComposition->id(), mId ); return QgsProject::instance()->removeEntry ( "Compositions", path );}bool QgsComposerVectorLegend::writeXML( QDomNode & node, QDomDocument & document, bool temp ){ return true;}bool QgsComposerVectorLegend::readXML( QDomNode & node ){ return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -