Skip to content

Commit

Permalink
#5408: No IMapFileChangeTracker reference is needed anymore when acqu…
Browse files Browse the repository at this point in the history
…iring an undo state saver.
  • Loading branch information
codereader committed Oct 25, 2021
1 parent d228c9c commit 1381730
Show file tree
Hide file tree
Showing 32 changed files with 108 additions and 158 deletions.
7 changes: 2 additions & 5 deletions include/iundo.h
Expand Up @@ -9,8 +9,6 @@
#include <memory>
#include <sigc++/signal.h>

class IMapFileChangeTracker;

/**
* greebo: An UndoMemento has to be allocated on the heap
* and contains all the information that is needed to describe
Expand Down Expand Up @@ -60,9 +58,8 @@ class IUndoSystem
using Ptr = std::shared_ptr<IUndoSystem>;

// Undoable objects need to call this to get hold of a StateSaver instance
// which will take care of exporting and saving the state. The passed map file change
// tracker will be notified when the state is saved.
virtual IUndoStateSaver* getStateSaver(IUndoable& undoable, IMapFileChangeTracker& tracker) = 0;
// which will take care of exporting and saving the state.
virtual IUndoStateSaver* getStateSaver(IUndoable& undoable) = 0;
virtual void releaseStateSaver(IUndoable& undoable) = 0;

virtual std::size_t size() const = 0;
Expand Down
19 changes: 4 additions & 15 deletions libs/ObservedUndoable.h
@@ -1,7 +1,6 @@
#pragma once

#include "iundo.h"
#include "imapfilechangetracker.h"
#include <functional>
#include "BasicUndoMemento.h"

Expand All @@ -17,41 +16,31 @@ class ObservedUndoable :
Copyable& _object;
ImportCallback _importCallback;
IUndoStateSaver* _undoStateSaver;
IMapFileChangeTracker* _changeTracker;

std::string _debugName;

public:
ObservedUndoable<Copyable>(Copyable& object, const ImportCallback& importCallback) :
_object(object),
_importCallback(importCallback),
_undoStateSaver(nullptr),
_changeTracker(nullptr)
_undoStateSaver(nullptr)
{}

ObservedUndoable<Copyable>(Copyable& object, const ImportCallback& importCallback, const std::string& debugName) :
_object(object),
_importCallback(importCallback),
_undoStateSaver(nullptr),
_changeTracker(nullptr),
_debugName(debugName)
{}

IMapFileChangeTracker& getUndoChangeTracker()
{
return *_changeTracker;
}

void connectUndoSystem(IMapFileChangeTracker& changeTracker)
void connectUndoSystem()
{
_changeTracker = &changeTracker;
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this, changeTracker);
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this);
}

void disconnectUndoSystem(IMapFileChangeTracker& map)
void disconnectUndoSystem()
{
_undoStateSaver = nullptr;
_changeTracker = nullptr;
GlobalUndoSystem().releaseStateSaver(*this);
}

Expand Down
1 change: 0 additions & 1 deletion libs/scene/BasicRootNode.h
@@ -1,7 +1,6 @@
#pragma once

#include "imap.h"
#include "imapfilechangetracker.h"
#include "ilayer.h"
#include "ientity.h"
#include "iundo.h"
Expand Down
8 changes: 4 additions & 4 deletions libs/scene/Node.cpp
Expand Up @@ -283,14 +283,14 @@ void Node::onRemoveFromScene(IMapRootNode& root)
_instantiated = false;
}

void Node::connectUndoSystem(IMapFileChangeTracker& changeTracker)
void Node::connectUndoSystem()
{
_children.connectUndoSystem(changeTracker);
_children.connectUndoSystem();
}

void Node::disconnectUndoSystem(IMapFileChangeTracker& changeTracker)
void Node::disconnectUndoSystem()
{
_children.disconnectUndoSystem(changeTracker);
_children.disconnectUndoSystem();
}

TraversableNodeSet& Node::getTraversable() {
Expand Down
4 changes: 2 additions & 2 deletions libs/scene/Node.h
Expand Up @@ -204,8 +204,8 @@ class Node :

TraversableNodeSet& getTraversable();

virtual void connectUndoSystem(IMapFileChangeTracker& changeTracker);
virtual void disconnectUndoSystem(IMapFileChangeTracker& changeTracker);
virtual void connectUndoSystem();
virtual void disconnectUndoSystem();

// Clears the TraversableNodeSet
virtual void removeAllChildNodes();
Expand Down
14 changes: 7 additions & 7 deletions libs/scene/SelectableNode.cpp
Expand Up @@ -28,7 +28,7 @@ SelectableNode::~SelectableNode()

void SelectableNode::onInsertIntoScene(IMapRootNode& root)
{
connectUndoSystem(root.getUndoChangeTracker());
connectUndoSystem();

Node::onInsertIntoScene(root);

Expand All @@ -51,7 +51,7 @@ void SelectableNode::onRemoveFromScene(IMapRootNode& root)
{
setSelected(false);

disconnectUndoSystem(root.getUndoChangeTracker());
disconnectUndoSystem();

// When a node is removed from the scene with a non-empty group assignment
// we do notify the SelectionGroup to remove ourselves, but we keep the ID list
Expand Down Expand Up @@ -233,19 +233,19 @@ void SelectableNode::onSelectionStatusChange(bool changeGroupStatus)
}
}

void SelectableNode::connectUndoSystem(IMapFileChangeTracker& changeTracker)
void SelectableNode::connectUndoSystem()
{
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this, changeTracker);
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this);

Node::connectUndoSystem(changeTracker);
Node::connectUndoSystem();
}

void SelectableNode::disconnectUndoSystem(IMapFileChangeTracker& changeTracker)
void SelectableNode::disconnectUndoSystem()
{
_undoStateSaver = nullptr;
GlobalUndoSystem().releaseStateSaver(*this);

Node::disconnectUndoSystem(changeTracker);
Node::disconnectUndoSystem();
}

void SelectableNode::undoSave()
Expand Down
4 changes: 2 additions & 2 deletions libs/scene/SelectableNode.h
Expand Up @@ -65,8 +65,8 @@ class SelectableNode :
*/
virtual void onSelectionStatusChange(bool changeGroupStatus);

virtual void connectUndoSystem(IMapFileChangeTracker& changeTracker) override;
virtual void disconnectUndoSystem(IMapFileChangeTracker& changeTracker) override;
virtual void connectUndoSystem() override;
virtual void disconnectUndoSystem() override;

private:
void undoSave();
Expand Down
7 changes: 3 additions & 4 deletions libs/scene/TraversableNodeSet.cpp
Expand Up @@ -4,7 +4,6 @@
#include <algorithm>
#include "LayerValidityCheckWalker.h"
#include "BasicUndoMemento.h"
#include "imapfilechangetracker.h"
#include "Node.h"

namespace scene
Expand Down Expand Up @@ -190,12 +189,12 @@ bool TraversableNodeSet::empty() const
return _children.empty();
}

void TraversableNodeSet::connectUndoSystem(IMapFileChangeTracker& changeTracker)
void TraversableNodeSet::connectUndoSystem()
{
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this, changeTracker);
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this);
}

void TraversableNodeSet::disconnectUndoSystem(IMapFileChangeTracker& changeTracker)
void TraversableNodeSet::disconnectUndoSystem()
{
_undoStateSaver = nullptr;
GlobalUndoSystem().releaseStateSaver(*this);
Expand Down
8 changes: 3 additions & 5 deletions libs/scene/TraversableNodeSet.h
Expand Up @@ -7,8 +7,6 @@
#include <sigc++/connection.h>
#include <sigc++/trackable.h>

class IMapFileChangeTracker;

namespace scene
{

Expand All @@ -23,7 +21,7 @@ class Node;
* as any child nodes are removed or inserted. When the user hits Undo, the UndoSystem sends back
* the memento and asks the TraversableNodeSet to overwrite its current children with the saved state.
*/
class TraversableNodeSet :
class TraversableNodeSet final :
public IUndoable,
public util::Noncopyable,
public sigc::trackable
Expand Down Expand Up @@ -89,8 +87,8 @@ class TraversableNodeSet :
*/
bool empty() const;

void connectUndoSystem(IMapFileChangeTracker& changeTracker);
void disconnectUndoSystem(IMapFileChangeTracker& changeTracker);
void connectUndoSystem();
void disconnectUndoSystem();

// Undoable implementation
IUndoMementoPtr exportState() const;
Expand Down
25 changes: 9 additions & 16 deletions radiantcore/brush/Brush.cpp
Expand Up @@ -38,7 +38,6 @@ namespace {
Brush::Brush(BrushNode& owner) :
_owner(owner),
_undoStateSaver(nullptr),
_mapFileChangeTracker(nullptr),
_faceCentroidPoints(GL_POINTS),
_uniqueVertexPoints(GL_POINTS),
_uniqueEdgePoints(GL_POINTS),
Expand All @@ -54,7 +53,6 @@ Brush::Brush(BrushNode& owner) :
Brush::Brush(BrushNode& owner, const Brush& other) :
_owner(owner),
_undoStateSaver(nullptr),
_mapFileChangeTracker(nullptr),
_faceCentroidPoints(GL_POINTS),
_uniqueVertexPoints(GL_POINTS),
_uniqueEdgePoints(GL_POINTS),
Expand Down Expand Up @@ -144,27 +142,22 @@ void Brush::forEachVisibleFace(const std::function<void(Face&)>& functor) const
}
}

void Brush::connectUndoSystem(IMapFileChangeTracker& changeTracker)
void Brush::connectUndoSystem()
{
assert(_undoStateSaver == nullptr);

// Keep a reference around, we need it when faces are changing
_mapFileChangeTracker = &changeTracker;
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this);

_undoStateSaver = GlobalUndoSystem().getStateSaver(*this, changeTracker);

// Notify each face that we have a tracker
forEachFace([&](Face& face) { face.connectUndoSystem(changeTracker); });
forEachFace([&](Face& face) { face.connectUndoSystem(); });
}

void Brush::disconnectUndoSystem(IMapFileChangeTracker& changeTracker)
void Brush::disconnectUndoSystem()
{
assert(_undoStateSaver != nullptr);

// Notify each face
forEachFace([&](Face& face) { face.disconnectUndoSystem(changeTracker); });
forEachFace([&](Face& face) { face.disconnectUndoSystem(); });

_mapFileChangeTracker = nullptr;
_undoStateSaver = nullptr;
GlobalUndoSystem().releaseStateSaver(*this);
}
Expand Down Expand Up @@ -436,7 +429,7 @@ void Brush::push_back(Faces::value_type face) {

if (_undoStateSaver)
{
m_faces.back()->connectUndoSystem(*_mapFileChangeTracker);
m_faces.back()->connectUndoSystem();
}

for (Observers::iterator i = m_observers.begin(); i != m_observers.end(); ++i) {
Expand All @@ -449,7 +442,7 @@ void Brush::pop_back()
{
if (_undoStateSaver)
{
m_faces.back()->disconnectUndoSystem(*_mapFileChangeTracker);
m_faces.back()->disconnectUndoSystem();
}

m_faces.pop_back();
Expand All @@ -463,7 +456,7 @@ void Brush::erase(std::size_t index)
{
if (_undoStateSaver)
{
m_faces[index]->disconnectUndoSystem(*_mapFileChangeTracker);
m_faces[index]->disconnectUndoSystem();
}

m_faces.erase(m_faces.begin() + index);
Expand Down Expand Up @@ -506,7 +499,7 @@ void Brush::clear()
undoSave();
if (_undoStateSaver)
{
forEachFace([&](Face& face) { face.disconnectUndoSystem(*_mapFileChangeTracker); });
forEachFace([&](Face& face) { face.disconnectUndoSystem(); });
}

m_faces.clear();
Expand Down
5 changes: 2 additions & 3 deletions radiantcore/brush/Brush.h
Expand Up @@ -94,7 +94,6 @@ class Brush :
typedef std::set<BrushObserver*> Observers;
Observers m_observers;
IUndoStateSaver* _undoStateSaver;
IMapFileChangeTracker* _mapFileChangeTracker;

// state
Faces m_faces;
Expand Down Expand Up @@ -177,8 +176,8 @@ class Brush :
// but are forcedly visible due to the brush being selected)
void forEachVisibleFace(const std::function<void(Face&)>& functor) const;

void connectUndoSystem(IMapFileChangeTracker& map);
void disconnectUndoSystem(IMapFileChangeTracker& map);
void connectUndoSystem();
void disconnectUndoSystem();

// Face observer callbacks
void onFacePlaneChanged();
Expand Down
4 changes: 2 additions & 2 deletions radiantcore/brush/BrushNode.cpp
Expand Up @@ -269,7 +269,7 @@ scene::INodePtr BrushNode::clone() const {

void BrushNode::onInsertIntoScene(scene::IMapRootNode& root)
{
m_brush.connectUndoSystem(root.getUndoChangeTracker());
m_brush.connectUndoSystem();
GlobalCounters().getCounter(counterBrushes).increment();

// Update the origin information needed for transformations
Expand All @@ -289,7 +289,7 @@ void BrushNode::onRemoveFromScene(scene::IMapRootNode& root)
setSelectedComponents(false, selection::ComponentSelectionMode::Face);

GlobalCounters().getCounter(counterBrushes).decrement();
m_brush.disconnectUndoSystem(root.getUndoChangeTracker());
m_brush.disconnectUndoSystem();

SelectableNode::onRemoveFromScene(root);
}
Expand Down
6 changes: 3 additions & 3 deletions radiantcore/brush/Face.cpp
Expand Up @@ -146,16 +146,16 @@ void Face::realiseShader()
_owner.onFaceShaderChanged();
}

void Face::connectUndoSystem(IMapFileChangeTracker& changeTracker)
void Face::connectUndoSystem()
{
assert(!_undoStateSaver);

_shader.setInUse(true);

_undoStateSaver = GlobalUndoSystem().getStateSaver(*this, changeTracker);
_undoStateSaver = GlobalUndoSystem().getStateSaver(*this);
}

void Face::disconnectUndoSystem(IMapFileChangeTracker& changeTracker)
void Face::disconnectUndoSystem()
{
assert(_undoStateSaver);
_undoStateSaver = nullptr;
Expand Down
5 changes: 2 additions & 3 deletions radiantcore/brush/Face.h
Expand Up @@ -2,7 +2,6 @@

#include "irender.h"
#include "iundo.h"
#include "imapfilechangetracker.h"
#include "iselectiontest.h"
#include <sigc++/connection.h>

Expand Down Expand Up @@ -87,8 +86,8 @@ class Face :
// greebo: Emits the updated normals to the Winding class.
void updateWinding();

void connectUndoSystem(IMapFileChangeTracker& changeTracker);
void disconnectUndoSystem(IMapFileChangeTracker& changeTracker);
void connectUndoSystem();
void disconnectUndoSystem();

void undoSave();

Expand Down

0 comments on commit 1381730

Please sign in to comment.