void QgsMapLayerStyleCommand::redo() { QString error; QgsReadWriteContext context = QgsReadWriteContext(); mLayer->readStyle( mXml, error, context ); mLayer->triggerRepaint(); }
QMimeData *QgsRuleBasedLabelingModel::mimeData( const QModelIndexList &indexes ) const { QMimeData *mimeData = new QMimeData(); QByteArray encodedData; QDataStream stream( &encodedData, QIODevice::WriteOnly ); const auto constIndexes = indexes; for ( const QModelIndex &index : constIndexes ) { // each item consists of several columns - let's add it with just first one if ( !index.isValid() || index.column() != 0 ) continue; // we use a clone of the existing rule because it has a new unique rule key // non-unique rule keys would confuse other components using them (e.g. legend) QgsRuleBasedLabeling::Rule *rule = ruleForIndex( index )->clone(); QDomDocument doc; QDomElement rootElem = doc.createElement( QStringLiteral( "rule_mime" ) ); rootElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "labeling" ) ); // for determining whether rules are from renderer or labeling QDomElement rulesElem = rule->save( doc, QgsReadWriteContext() ); rootElem.appendChild( rulesElem ); doc.appendChild( rootElem ); delete rule; stream << doc.toString( -1 ); } mimeData->setData( QStringLiteral( "application/vnd.text.list" ), encodedData ); return mimeData; }
void saveState( QDomDocument &stateDoc ) const override { stateDoc.clear(); QDomElement documentElement = stateDoc.createElement( QStringLiteral( "UndoState" ) ); mLayout->writeXmlLayoutSettings( documentElement, stateDoc, QgsReadWriteContext() ); stateDoc.appendChild( documentElement ); }
void restoreState( QDomDocument &stateDoc ) override { if ( !mLayout ) { return; } mLayout->readXmlLayoutSettings( stateDoc.documentElement(), stateDoc, QgsReadWriteContext() ); mLayout->project()->setDirty( true ); }
void QgsLayoutItemUndoCommand::saveState( QDomDocument &stateDoc ) const { stateDoc.clear(); QDomElement documentElement = stateDoc.createElement( QStringLiteral( "ItemState" ) ); QgsLayoutItem *item = mLayout->itemByUuid( mItemUuid ); Q_ASSERT_X( item, "QgsLayoutItemUndoCommand::saveState", "could not retrieve item for saving state" ); item->writeXml( documentElement, stateDoc, QgsReadWriteContext() ); stateDoc.appendChild( documentElement ); }
void QgsLayerStylingWidget::pushUndoItem( const QString &name ) { QString errorMsg; QDomDocument doc( QStringLiteral( "style" ) ); QDomElement rootNode = doc.createElement( QStringLiteral( "qgis" ) ); doc.appendChild( rootNode ); mCurrentLayer->writeStyle( rootNode, doc, errorMsg, QgsReadWriteContext() ); mCurrentLayer->undoStackStyles()->push( new QgsMapLayerStyleCommand( mCurrentLayer, name, rootNode, mLastStyleXml ) ); // Override the last style on the stack mLastStyleXml = rootNode.cloneNode(); }
void QgsLayoutItemUndoCommand::restoreState( QDomDocument &stateDoc ) { // find item by uuid... QgsLayoutItem *item = mLayout->itemByUuid( mItemUuid ); if ( !item ) { // uh oh - it's been deleted! we need to create a new instance item = recreateItem( mItemType, mLayout ); } item->readXml( stateDoc.documentElement().firstChild().toElement(), stateDoc, QgsReadWriteContext() ); item->finalizeRestoreFromXml(); mLayout->project()->setDirty( true ); mLayout->undoStack()->notifyUndoRedoOccurred( item ); }
void QgsMapLayerStyleCommand::undo() { QString error; mLayer->readStyle( mLastState, error, QgsReadWriteContext() ); mLayer->triggerRepaint(); }
void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer ) { if ( layer == mCurrentLayer ) return; if ( mCurrentLayer ) { disconnect( mCurrentLayer, &QgsMapLayer::styleChanged, this, &QgsLayerStylingWidget::updateCurrentWidgetLayer ); } if ( !layer || !layer->isSpatial() ) { mLayerCombo->setLayer( nullptr ); mStackedWidget->setCurrentIndex( mNotSupportedPage ); mLastStyleXml.clear(); mCurrentLayer = nullptr; return; } bool sameLayerType = false; if ( mCurrentLayer ) { sameLayerType = mCurrentLayer->type() == layer->type(); } mCurrentLayer = layer; mUndoWidget->setUndoStack( layer->undoStackStyles() ); connect( mCurrentLayer, &QgsMapLayer::styleChanged, this, &QgsLayerStylingWidget::updateCurrentWidgetLayer ); int lastPage = mOptionsListWidget->currentIndex().row(); mOptionsListWidget->blockSignals( true ); mOptionsListWidget->clear(); mUserPages.clear(); if ( layer->type() == QgsMapLayer::VectorLayer ) { QListWidgetItem *symbolItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "propertyicons/symbology.svg" ) ), QString() ); symbolItem->setData( Qt::UserRole, Symbology ); symbolItem->setToolTip( tr( "Symbology" ) ); mOptionsListWidget->addItem( symbolItem ); QListWidgetItem *labelItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "labelingSingle.svg" ) ), QString() ); labelItem->setData( Qt::UserRole, VectorLabeling ); labelItem->setToolTip( tr( "Labels" ) ); mOptionsListWidget->addItem( labelItem ); #ifdef HAVE_3D QListWidgetItem *symbol3DItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "3d.svg" ) ), QString() ); symbol3DItem->setData( Qt::UserRole, Symbology3D ); symbol3DItem->setToolTip( tr( "3D View" ) ); mOptionsListWidget->addItem( symbol3DItem ); #endif } else if ( layer->type() == QgsMapLayer::RasterLayer ) { QListWidgetItem *symbolItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "propertyicons/symbology.svg" ) ), QString() ); symbolItem->setData( Qt::UserRole, Symbology ); symbolItem->setToolTip( tr( "Symbology" ) ); mOptionsListWidget->addItem( symbolItem ); QListWidgetItem *transparencyItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "propertyicons/transparency.png" ) ), QString() ); transparencyItem->setToolTip( tr( "Transparency" ) ); transparencyItem->setData( Qt::UserRole, RasterTransparency ); mOptionsListWidget->addItem( transparencyItem ); if ( static_cast<QgsRasterLayer *>( layer )->dataProvider()->capabilities() & QgsRasterDataProvider::Size ) { QListWidgetItem *histogramItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "propertyicons/histogram.png" ) ), QString() ); histogramItem->setData( Qt::UserRole, RasterHistogram ); mOptionsListWidget->addItem( histogramItem ); histogramItem->setToolTip( tr( "Histogram" ) ); } } Q_FOREACH ( QgsMapLayerConfigWidgetFactory *factory, mPageFactories ) { if ( factory->supportsStyleDock() && factory->supportsLayer( layer ) ) { QListWidgetItem *item = new QListWidgetItem( factory->icon(), QString() ); item->setToolTip( factory->title() ); mOptionsListWidget->addItem( item ); int row = mOptionsListWidget->row( item ); mUserPages[row] = factory; } } QListWidgetItem *historyItem = new QListWidgetItem( QgsApplication::getThemeIcon( QStringLiteral( "mActionHistory.svg" ) ), QString() ); historyItem->setData( Qt::UserRole, History ); historyItem->setToolTip( tr( "History" ) ); mOptionsListWidget->addItem( historyItem ); mOptionsListWidget->blockSignals( false ); if ( sameLayerType ) { mOptionsListWidget->setCurrentRow( lastPage ); } else { mOptionsListWidget->setCurrentRow( 0 ); } mStackedWidget->setCurrentIndex( 1 ); QString errorMsg; QDomDocument doc( QStringLiteral( "style" ) ); mLastStyleXml = doc.createElement( QStringLiteral( "style" ) ); doc.appendChild( mLastStyleXml ); mCurrentLayer->writeStyle( mLastStyleXml, doc, errorMsg, QgsReadWriteContext() ); }
void QgsProjectLayerGroupDialog::changeProjectFile() { QFile projectFile( mProjectFileWidget->filePath() ); if ( !projectFile.exists() ) { return; } if ( mProjectPath == mProjectFileWidget->filePath() ) { //already up to date return; } //check we are not embedding from/to the same project if ( mProjectFileWidget->isVisible() && mProjectFileWidget->filePath() == QgsProject::instance()->fileName() ) { QMessageBox::critical( nullptr, tr( "Embed Layers and Groups" ), tr( "Recursive embedding is not supported. It is not possible to embed layers / groups from the current project." ) ); return; } //parse project file and fill tree if ( !projectFile.open( QIODevice::ReadOnly ) ) { return; } std::unique_ptr<QgsProjectArchive> archive; QDomDocument projectDom; if ( QgsZipUtils::isZipFile( mProjectFileWidget->filePath() ) ) { archive = qgis::make_unique<QgsProjectArchive>(); // unzip the archive if ( !archive->unzip( mProjectFileWidget->filePath() ) ) { return; } // test if zip provides a .qgs file if ( archive->projectFile().isEmpty() ) { return; } projectFile.setFileName( archive->projectFile() ); if ( !projectFile.exists() ) { return; } } QString errorMessage; int errorLine; if ( !projectDom.setContent( &projectFile, &errorMessage, &errorLine ) ) { QgsDebugMsg( QStringLiteral( "Error reading the project file %1 at line %2: %3" ) .arg( projectFile.fileName() ) .arg( errorLine ) .arg( errorMessage ) ); return; } mRootGroup->removeAllChildren(); QDomElement layerTreeElem = projectDom.documentElement().firstChildElement( QStringLiteral( "layer-tree-group" ) ); if ( !layerTreeElem.isNull() ) { mRootGroup->readChildrenFromXml( layerTreeElem, QgsReadWriteContext() ); } else { QgsLayerTreeUtils::readOldLegend( mRootGroup, projectDom.documentElement().firstChildElement( QStringLiteral( "legend" ) ) ); } if ( !mShowEmbeddedContent ) removeEmbeddedNodes( mRootGroup ); connect( mTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsProjectLayerGroupDialog::onTreeViewSelectionChanged ); mProjectPath = mProjectFileWidget->filePath(); }