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
-9
View File
@@ -1,16 +1,7 @@
#include "header.h"
#include <vector>
int main()
{
std::vector<Fooo<int>> yay;
for (Fooo<int> a: yay)
{
a;
}
Foo<true, int, float> ft;
ft.bar();
return 0;
+2
View File
@@ -35,6 +35,8 @@ add_files(
add_files(
LIB_FILES
component/controller/helper/ActivationTranslator.cpp
component/controller/helper/ActivationTranslator.h
component/controller/helper/BucketGrid.cpp
component/controller/helper/BucketGrid.h
component/controller/helper/DummyEdge.h
@@ -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();
}
@@ -1,6 +1,8 @@
#ifndef FEATURE_CONTROLLER_H
#define FEATURE_CONTROLLER_H
#include <memory>
#include "utility/messaging/MessageListener.h"
#include "utility/messaging/type/MessageActivateEdge.h"
#include "utility/messaging/type/MessageActivateFile.h"
@@ -11,6 +13,7 @@
#include "utility/messaging/type/MessageZoom.h"
#include "component/controller/Controller.h"
#include "component/controller/helper/ActivationTranslator.h"
class StorageAccess;
@@ -32,12 +35,13 @@ private:
virtual void handleMessage(MessageActivateEdge* message);
virtual void handleMessage(MessageActivateFile* message);
virtual void handleMessage(MessageActivateNodes* message);
virtual void handleMessage(MessageActivateTokenLocations* message);
virtual void handleMessage(MessageSearch* message);
virtual void handleMessage(MessageActivateTokenLocations* message);
virtual void handleMessage(MessageSwitchColorScheme* message);
virtual void handleMessage(MessageZoom* message);
StorageAccess* m_storageAccess;
ActivationTranslator m_activationTranslator;
};
#endif // FEATURE_CONTROLLER_H
@@ -1,6 +1,7 @@
#include "component/controller/UndoRedoController.h"
#include "utility/logging/logging.h"
#include "utility/messaging/type/MessageActivateTokens.h"
#include "utility/messaging/type/MessageFlushUpdates.h"
#include "component/view/UndoRedoView.h"
@@ -8,6 +9,7 @@
UndoRedoController::UndoRedoController(StorageAccess* storageAccess)
: m_storageAccess(storageAccess)
, m_activationTranslator(storageAccess)
, m_lastCommand(nullptr, 0)
{
}
@@ -136,7 +138,7 @@ void UndoRedoController::handleMessage(MessageRefresh* message)
return;
}
if (!m_lastCommand.message)
if (requiresActivateFallbackToken())
{
Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(NameHierarchy("main"));
if (!nodeId)
@@ -151,35 +153,35 @@ void UndoRedoController::handleMessage(MessageRefresh* message)
nodeId,
m_storageAccess->getNodeTypeForNodeWithId(nodeId),
m_storageAccess->getNameHierarchyForNodeWithId(nodeId)
);
);
m.isFromSystem = true;
m.dispatch();
}
return;
}
if (m_lastCommand.order > 0)
{
replayCommands(false);
}
std::shared_ptr<MessageBase> msg = m_lastCommand.message;
if (m_undo.size())
{
m_lastCommand = m_undo.back();
m_undo.pop_back();
}
else
{
m_lastCommand.message.reset();
if (m_lastCommand.order > 0)
{
replayCommands(false);
}
std::shared_ptr<MessageBase> msg = m_lastCommand.message;
if (m_undo.size() > 0)
{
m_lastCommand = m_undo.back();
m_undo.pop_back();
}
else
{
m_lastCommand.message.reset();
}
msg->undoRedoType = MessageBase::UNDOTYPE_REDO;
msg->dispatch();
MessageFlushUpdates().dispatch();
}
msg->undoRedoType = MessageBase::UNDOTYPE_REDO;
msg->dispatch();
MessageFlushUpdates().dispatch();
}
void UndoRedoController::handleMessage(MessageSearch* message)
@@ -328,3 +330,57 @@ void UndoRedoController::clear()
getView()->setUndoButtonEnabled(false);
getView()->setRedoButtonEnabled(false);
}
bool UndoRedoController::requiresActivateFallbackToken() const
{
bool activateFallbackToken = true;
if (m_lastCommand.message)
{
if (m_lastCommand.order == 0)
{
activateFallbackToken = !checkCommandCausesTokenActivation(m_lastCommand);
}
else
{
for (int i = m_undo.size() - 1; i >= 0; i--)
{
if (m_undo[i].order == 0)
{
activateFallbackToken = !checkCommandCausesTokenActivation(m_undo[i]);
break;
}
}
}
}
return activateFallbackToken;
}
bool UndoRedoController::checkCommandCausesTokenActivation(const Command& command) const
{
MessageBase* commandMessage = command.message.get();
if (commandMessage)
{
std::shared_ptr<MessageActivateTokens> m;
std::string commandMessageTypeString = commandMessage->getType();
if (commandMessageTypeString == MessageActivateEdge::getStaticType())
{
m = m_activationTranslator.translateMessage(dynamic_cast<const MessageActivateEdge*>(commandMessage));
}
else if (commandMessageTypeString == MessageActivateFile::getStaticType())
{
m = m_activationTranslator.translateMessage(dynamic_cast<const MessageActivateFile*>(commandMessage));
}
else if (commandMessageTypeString == MessageActivateNodes::getStaticType())
{
MessageActivateNodes inputMessage(*dynamic_cast<MessageActivateNodes*>(commandMessage));
inputMessage.undoRedoType = MessageBase::UNDOTYPE_REDO;
m = m_activationTranslator.translateMessage(&inputMessage);
}
else if (commandMessageTypeString == MessageSearch::getStaticType())
{
m = m_activationTranslator.translateMessage(dynamic_cast<const MessageSearch*>(commandMessage));
}
return (m && m->tokenIds.size() > 0);
}
return false;
}
@@ -20,6 +20,7 @@
#include "utility/messaging/type/MessageShowScope.h"
#include "utility/messaging/type/MessageUndo.h"
#include "component/controller/helper/ActivationTranslator.h"
#include "component/controller/Controller.h"
class StorageAccess;
@@ -81,6 +82,10 @@ private:
void clear();
bool requiresActivateFallbackToken() const;
bool checkCommandCausesTokenActivation(const Command& command) const;
ActivationTranslator m_activationTranslator;
StorageAccess* m_storageAccess;
Command m_lastCommand;
@@ -0,0 +1,100 @@
#include "component/controller/helper/ActivationTranslator.h"
#include "data/access/StorageAccess.h"
#include "utility/messaging/type/MessageActivateEdge.h"
#include "utility/messaging/type/MessageActivateFile.h"
#include "utility/messaging/type/MessageActivateNodes.h"
#include "utility/messaging/type/MessageActivateTokens.h"
#include "utility/messaging/type/MessageSearch.h"
ActivationTranslator::ActivationTranslator(StorageAccess* storageAccess)
: m_storageAccess(storageAccess)
{
}
ActivationTranslator::~ActivationTranslator()
{
}
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateEdge* message) const
{
std::shared_ptr<MessageActivateTokens> m;
if (message->type == Edge::EDGE_AGGREGATION)
{
const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy);
const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy);
m = std::make_shared<MessageActivateTokens>(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId));
m->isAggregation = true;
m->undoRedoType = message->undoRedoType;
}
else
{
Id edgeId = message->tokenId;
if (!message->isFresh())
{
edgeId = m_storageAccess->getIdForEdge(message->type, message->fromNameHierarchy, message->toNameHierarchy);
}
if (edgeId)
{
m = std::make_shared<MessageActivateTokens>(std::vector<Id>(1, edgeId));
m->isEdge = true;
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
}
}
return m;
}
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateFile* message) const
{
std::shared_ptr<MessageActivateTokens> m;
m = std::make_shared<MessageActivateTokens>(std::vector<Id>(1, m_storageAccess->getTokenIdForFileNode(message->filePath)));
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m;
}
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateNodes* message) const
{
std::vector<Id> nodeIds;
if (message->isFresh())
{
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);
}
}
}
std::shared_ptr<MessageActivateTokens> m;
m = std::make_shared<MessageActivateTokens>(nodeIds);
m->isFromSystem = message->isFromSystem;
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m;
}
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageSearch* message) const
{
std::vector<Id> tokenIds = m_storageAccess->getTokenIdsForMatches(message->getMatches());
tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds);
std::shared_ptr<MessageActivateTokens> m;
m = std::make_shared<MessageActivateTokens>(tokenIds);
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m;
}
@@ -0,0 +1,28 @@
#ifndef ACTIVATION_TRANSLATOR_H
#define ACTIVATION_TRANSLATOR_H
#include <memory>
class MessageActivateEdge;
class MessageActivateFile;
class MessageActivateNodes;
class MessageActivateTokens;
class MessageSearch;
class StorageAccess;
class ActivationTranslator
{
public:
ActivationTranslator(StorageAccess* storageAccess);
~ActivationTranslator();
std::shared_ptr<MessageActivateTokens> translateMessage(const MessageActivateEdge* message) const;
std::shared_ptr<MessageActivateTokens> translateMessage(const MessageActivateFile* message) const;
std::shared_ptr<MessageActivateTokens> translateMessage(const MessageActivateNodes* message) const;
std::shared_ptr<MessageActivateTokens> translateMessage(const MessageSearch* message) const;
private:
StorageAccess* m_storageAccess;
};
#endif // ACTIVATION_TRANSLATOR_H
+4 -1
View File
@@ -970,7 +970,10 @@ std::vector<Id> Storage::getTokenIdsForMatches(const std::vector<SearchMatch>& m
for (const SearchMatch& match : matches)
{
SearchNode* searchNode = m_tokenIndex.getNode(match.nameHierarchy);
utility::append(idSet, searchNode->getTokenIds());
if (searchNode)
{
utility::append(idSet, searchNode->getTokenIds());
}
}
std::vector<Id> ids;