mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 11:26:38 +00:00 
			
		
		
		
	Avoid storing ref, dynamic cast worldspacewidget for safety
This commit is contained in:
		
							parent
							
								
									af3b9187b4
								
							
						
					
					
						commit
						b84e41bd27
					
				
					 7 changed files with 53 additions and 12 deletions
				
			
		|  | @ -1,19 +1,40 @@ | |||
| #include "commands.hpp" | ||||
| 
 | ||||
| #include <components/debug/debuglog.hpp> | ||||
| #include <components/esm/loadland.hpp> | ||||
| 
 | ||||
| #include "editmode.hpp" | ||||
| #include "terrainselection.hpp" | ||||
| #include "terrainshapemode.hpp" | ||||
| #include "terraintexturemode.hpp" | ||||
| #include "worldspacewidget.hpp" | ||||
| 
 | ||||
| CSVRender::DrawTerrainSelectionCommand::DrawTerrainSelectionCommand(TerrainSelection& terrainSelection, QUndoCommand* parent) | ||||
|     : mTerrainSelection(terrainSelection) | ||||
| CSVRender::DrawTerrainSelectionCommand::DrawTerrainSelectionCommand(WorldspaceWidget* worldspaceWidget, QUndoCommand* parent) | ||||
|     : mWorldspaceWidget(worldspaceWidget) | ||||
| { } | ||||
| 
 | ||||
| void CSVRender::DrawTerrainSelectionCommand::redo() | ||||
| { | ||||
|     mTerrainSelection.update(); | ||||
|     if (CSVRender::WorldspaceWidget* worldspaceWidget = dynamic_cast<CSVRender::WorldspaceWidget *> (mWorldspaceWidget)) | ||||
|     { | ||||
|         if (CSVRender::TerrainShapeMode* terrainMode = dynamic_cast<CSVRender::TerrainShapeMode *> (worldspaceWidget->getEditMode()) ) | ||||
|             { | ||||
|                 terrainMode->getTerrainSelection()->update(); | ||||
|                 return; | ||||
|             } | ||||
|     } | ||||
|     Log(Debug::Warning) << "Error in redoing terrain selection"; | ||||
| } | ||||
| 
 | ||||
| void CSVRender::DrawTerrainSelectionCommand::undo() | ||||
| { | ||||
|     mTerrainSelection.update(); | ||||
|     if (CSVRender::WorldspaceWidget* worldspaceWidget = dynamic_cast<CSVRender::WorldspaceWidget *> (mWorldspaceWidget)) | ||||
|     { | ||||
|         if (CSVRender::TerrainShapeMode* terrainMode = dynamic_cast<CSVRender::TerrainShapeMode *> (worldspaceWidget->getEditMode()) ) | ||||
|             { | ||||
|                 terrainMode->getTerrainSelection()->update(); | ||||
|                 return; | ||||
|             } | ||||
|     } | ||||
|     Log(Debug::Warning) << "Error in undoing terrain selection"; | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,8 @@ | |||
| 
 | ||||
| #include <QUndoCommand> | ||||
| 
 | ||||
| #include "worldspacewidget.hpp" | ||||
| 
 | ||||
| namespace CSVRender | ||||
| { | ||||
|     class TerrainSelection; | ||||
|  | @ -21,11 +23,13 @@ namespace CSVRender | |||
|     */ | ||||
|     class DrawTerrainSelectionCommand : public QUndoCommand | ||||
|     { | ||||
|         friend class WorldspaceWidget; | ||||
| 
 | ||||
|     private: | ||||
|         TerrainSelection& mTerrainSelection; | ||||
|         WorldspaceWidget *mWorldspaceWidget; | ||||
| 
 | ||||
|     public: | ||||
|         DrawTerrainSelectionCommand(TerrainSelection& terrainSelection, QUndoCommand* parent = nullptr); | ||||
|         DrawTerrainSelectionCommand(WorldspaceWidget* worldspaceWidget, QUndoCommand* parent = nullptr); | ||||
| 
 | ||||
|         void redo() override; | ||||
|         void undo() override; | ||||
|  |  | |||
|  | @ -287,7 +287,7 @@ void CSVRender::TerrainShapeMode::applyTerrainEditChanges() | |||
|     undoStack.beginMacro ("Edit shape and normal records"); | ||||
| 
 | ||||
|     // One command at the beginning of the macro for redrawing the terrain-selection grid when undoing the changes.
 | ||||
|     undoStack.push(new DrawTerrainSelectionCommand(*mTerrainShapeSelection)); | ||||
|     undoStack.push(new DrawTerrainSelectionCommand(&getWorldspaceWidget())); | ||||
| 
 | ||||
|     for(CSMWorld::CellCoordinates cellCoordinates: mAlteredCells) | ||||
|     { | ||||
|  | @ -358,7 +358,7 @@ void CSVRender::TerrainShapeMode::applyTerrainEditChanges() | |||
|         pushNormalsEditToCommand(landNormalsNew, document, landTable, cellId); | ||||
|     } | ||||
|     // One command at the end of the macro for redrawing the terrain-selection grid when redoing the changes.
 | ||||
|     undoStack.push(new DrawTerrainSelectionCommand(*mTerrainShapeSelection)); | ||||
|     undoStack.push(new DrawTerrainSelectionCommand(&getWorldspaceWidget())); | ||||
| 
 | ||||
|     undoStack.endMacro(); | ||||
|     clearTransientEdits(); | ||||
|  | @ -1049,7 +1049,7 @@ void CSVRender::TerrainShapeMode::handleSelection(int globalSelectionX, int glob | |||
|         */ | ||||
|         if (xIsAtCellBorder && yIsAtCellBorder) | ||||
|         { | ||||
|             /* 
 | ||||
|             /*
 | ||||
|                 Handle the NW, NE, and SE corner vertices. | ||||
|                 NW corner: (+1, -1) offset to reach current cell. | ||||
|                 NE corner: (-1, -1) offset to reach current cell. | ||||
|  | @ -1132,7 +1132,7 @@ void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>& | |||
|         selectAction = CSMPrefs::get()["3D Scene Editing"]["primary-select-action"].toString(); | ||||
|     else | ||||
|         selectAction = CSMPrefs::get()["3D Scene Editing"]["secondary-select-action"].toString(); | ||||
|          | ||||
| 
 | ||||
|     if (selectAction == "Select only") | ||||
|         mTerrainShapeSelection->onlySelect(selections); | ||||
|     else if (selectAction == "Add to selection") | ||||
|  | @ -1444,6 +1444,11 @@ void CSVRender::TerrainShapeMode::mouseMoveEvent (QMouseEvent *event) | |||
|         mBrushDraw->hide(); | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<CSVRender::TerrainSelection> CSVRender::TerrainShapeMode::getTerrainSelection() | ||||
| { | ||||
|     return mTerrainShapeSelection; | ||||
| } | ||||
| 
 | ||||
| void CSVRender::TerrainShapeMode::setBrushSize(int brushSize) | ||||
| { | ||||
|     mBrushSize = brushSize; | ||||
|  |  | |||
|  | @ -92,6 +92,8 @@ namespace CSVRender | |||
|             void dragMoveEvent (QDragMoveEvent *event) override; | ||||
|             void mouseMoveEvent (QMouseEvent *event) override; | ||||
| 
 | ||||
|             std::shared_ptr<TerrainSelection> getTerrainSelection(); | ||||
| 
 | ||||
|         private: | ||||
| 
 | ||||
|             /// Remove duplicates and sort mAlteredCells, then limitAlteredHeights forward and reverse
 | ||||
|  | @ -176,7 +178,7 @@ namespace CSVRender | |||
|             int mDragMode = InteractionType_None; | ||||
|             osg::Group* mParentNode; | ||||
|             bool mIsEditing = false; | ||||
|             std::unique_ptr<TerrainSelection> mTerrainShapeSelection; | ||||
|             std::shared_ptr<TerrainSelection> mTerrainShapeSelection; | ||||
|             int mTotalDiffY = 0; | ||||
|             std::vector<CSMWorld::CellCoordinates> mAlteredCells; | ||||
|             osg::Vec3d mEditingPos; | ||||
|  |  | |||
|  | @ -712,6 +712,11 @@ void CSVRender::TerrainTextureMode::mouseMoveEvent (QMouseEvent *event) | |||
|         mBrushDraw->hide(); | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<CSVRender::TerrainSelection> CSVRender::TerrainTextureMode::getTerrainSelection() | ||||
| { | ||||
|     return mTerrainTextureSelection; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void CSVRender::TerrainTextureMode::setBrushSize(int brushSize) | ||||
| { | ||||
|  |  | |||
|  | @ -85,6 +85,8 @@ namespace CSVRender | |||
| 
 | ||||
|             void mouseMoveEvent (QMouseEvent *event) override; | ||||
| 
 | ||||
|             std::shared_ptr<TerrainSelection> getTerrainSelection(); | ||||
| 
 | ||||
|         private: | ||||
|             /// \brief Handle brush mechanics, maths regarding worldspace hit etc.
 | ||||
|             void editTerrainTextureGrid (const WorldspaceHitResult& hit); | ||||
|  | @ -115,7 +117,7 @@ namespace CSVRender | |||
|             int mDragMode; | ||||
|             osg::Group* mParentNode; | ||||
|             bool mIsEditing; | ||||
|             std::unique_ptr<TerrainSelection> mTerrainTextureSelection; | ||||
|             std::shared_ptr<TerrainSelection> mTerrainTextureSelection; | ||||
| 
 | ||||
|             const int cellSize {ESM::Land::REAL_SIZE}; | ||||
|             const int landTextureSize {ESM::Land::LAND_TEXTURE_SIZE}; | ||||
|  |  | |||
|  | @ -49,6 +49,8 @@ namespace CSVRender | |||
|     { | ||||
|             Q_OBJECT | ||||
| 
 | ||||
|             friend class DrawTerrainSelectionCommand; | ||||
| 
 | ||||
|             CSVWidget::SceneToolToggle2 *mSceneElements; | ||||
|             CSVWidget::SceneToolRun *mRun; | ||||
|             CSMDoc::Document& mDocument; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue