logic: fallback selection after refresh

* extracted code for translating input messages to token activations from the FeatureController to the helper class ActivationTranslator.
* used ActivationTranslator in UndoRedoController to determine if the symbols that have been selected before refresh are still available after parsing again.
This commit is contained in:
malte_langkabel
2015-10-14 12:27:05 +02:00
parent e61171cc85
commit 4e4cb25540
9 changed files with 245 additions and 100 deletions
@@ -8,6 +8,7 @@
FeatureController::FeatureController(StorageAccess* storageAccess)
: m_storageAccess(storageAccess)
, m_activationTranslator(storageAccess)
{
}
@@ -17,73 +18,38 @@ FeatureController::~FeatureController()
void FeatureController::handleMessage(MessageActivateEdge* message)
{
if (message->type == Edge::EDGE_AGGREGATION)
std::shared_ptr<MessageActivateTokens> m = m_activationTranslator.translateMessage(message);
if (m)
{
const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy);
const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy);
MessageActivateTokens m(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId));
m.isAggregation = true;
m.undoRedoType = message->undoRedoType;
m.dispatchImmediately();
}
else
{
Id edgeId = message->tokenId;
if (!message->isFresh())
{
edgeId = m_storageAccess->getIdForEdge(message->type, message->fromNameHierarchy, message->toNameHierarchy);
}
if (!edgeId)
{
return;
}
MessageActivateTokens m(std::vector<Id>(1, edgeId));
m.isEdge = true;
m.undoRedoType = message->undoRedoType;
m.setKeepContent(message->keepContent());
m.dispatchImmediately();
m->dispatchImmediately();
}
}
void FeatureController::handleMessage(MessageActivateFile* message)
{
MessageActivateTokens m(std::vector<Id>(1, m_storageAccess->getTokenIdForFileNode(message->filePath)));
m.undoRedoType = message->undoRedoType;
m.setKeepContent(message->keepContent());
m.dispatchImmediately();
std::shared_ptr<MessageActivateTokens> m = m_activationTranslator.translateMessage(message);
if (m)
{
m->dispatchImmediately();
}
}
void FeatureController::handleMessage(MessageActivateNodes* message)
{
std::vector<Id> nodeIds;
if (message->isFresh())
std::shared_ptr<MessageActivateTokens> m = m_activationTranslator.translateMessage(message);
if (m)
{
for (const MessageActivateNodes::ActiveNode& node : message->nodes)
{
nodeIds.push_back(node.nodeId);
}
}
else
{
for (const MessageActivateNodes::ActiveNode& node : message->nodes)
{
Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(node.nameHierarchy);
if (nodeId > 0)
{
nodeIds.push_back(nodeId);
}
}
m->dispatchImmediately();
}
}
MessageActivateTokens m(nodeIds);
m.isFromSystem = message->isFromSystem;
m.undoRedoType = message->undoRedoType;
m.setKeepContent(message->keepContent());
m.dispatchImmediately();
void FeatureController::handleMessage(MessageSearch* message)
{
std::shared_ptr<MessageActivateTokens> m = m_activationTranslator.translateMessage(message);
if (m)
{
m->dispatchImmediately();
}
}
void FeatureController::handleMessage(MessageActivateTokenLocations* message)
@@ -98,22 +64,11 @@ void FeatureController::handleMessage(MessageActivateTokenLocations* message)
nodeId,
m_storageAccess->getNodeTypeForNodeWithId(nodeId),
m_storageAccess->getNameHierarchyForNodeWithId(nodeId)
);
);
}
m.dispatchImmediately();
}
void FeatureController::handleMessage(MessageSearch* message)
{
std::vector<Id> tokenIds = m_storageAccess->getTokenIdsForMatches(message->getMatches());
tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds);
MessageActivateTokens m(tokenIds);
m.undoRedoType = message->undoRedoType;
m.setKeepContent(message->keepContent());
m.dispatchImmediately();
}
void FeatureController::handleMessage(MessageSwitchColorScheme* message)
{
ApplicationSettings* settings = ApplicationSettings::getInstance().get();
@@ -131,3 +86,4 @@ void FeatureController::handleMessage(MessageZoom* message)
MessageRefresh().refreshUiOnly().dispatch();
}