ui: switch to single file mode with snippet maximize

* switch back to snippet view with snippet button in file title bar
* use new title bar widget in single view as well
* restore view mode on undo, store current view mode for every message id (added id to message)
* treat view mode switch as adapt message on undo stack
* fixed crash after snippet expansion
* fixed hatching in file title not shown
This commit is contained in:
Eberhard Graether
2017-12-20 20:40:38 +01:00
parent 8672d14319
commit bfa43df491
31 changed files with 462 additions and 323 deletions
+1
View File
@@ -454,6 +454,7 @@ add_files(
utility/messaging/type/MessageZoom.h
utility/messaging/Message.h
utility/messaging/MessageBase.cpp
utility/messaging/MessageBase.h
utility/messaging/MessageFilter.h
utility/messaging/MessageInterruptTasksCounter.cpp
@@ -61,6 +61,7 @@ void ActivationController::handleMessage(MessageActivateFile* message)
MessageChangeFileView msg(
message->filePath,
MessageChangeFileView::FILE_MAXIMIZED,
MessageChangeFileView::VIEW_CURRENT,
true,
true
);
+32 -13
View File
@@ -31,6 +31,7 @@ void CodeController::handleMessage(MessageActivateAll* message)
{
TRACE("code all");
saveOrRestoreViewMode(message);
clear();
Project* currentProject = Application::getInstance()->getCurrentProject().get();
@@ -107,6 +108,8 @@ void CodeController::handleMessage(MessageActivateTokens* message)
{
TRACE("code activate");
saveOrRestoreViewMode(message);
CodeView* view = getView();
CodeView::CodeParams params;
@@ -180,6 +183,8 @@ void CodeController::handleMessage(MessageActivateTrailEdge* message)
{
TRACE("trail edge activate");
saveOrRestoreViewMode(message);
CodeView::ScrollParams scrollParams(CodeView::ScrollParams::SCROLL_TO_DEFINITION);
getView()->scrollTo(scrollParams);
@@ -197,14 +202,6 @@ void CodeController::handleMessage(MessageChangeFileView* message)
{
TRACE("code change file");
if (!m_collection)
{
return;
}
CodeView* view = getView();
bool inListMode = view->isInListMode();
CodeView::FileState state;
switch (message->state)
{
@@ -219,13 +216,15 @@ void CodeController::handleMessage(MessageChangeFileView* message)
case MessageChangeFileView::FILE_MAXIMIZED:
state = CodeView::FILE_MAXIMIZED;
break;
case MessageChangeFileView::FILE_DEFAULT_FOR_MODE:
state = inListMode ? CodeView::FILE_SNIPPETS : CodeView::FILE_MAXIMIZED;
break;
}
if (message->needsData)
CodeView* view = getView();
if (message->viewMode != MessageChangeFileView::VIEW_CURRENT)
{
view->setMode(message->viewMode == MessageChangeFileView::VIEW_LIST);
}
if (message->needsData && !message->filePath.empty())
{
CodeView::CodeParams params;
view->showCodeSnippets(getSnippetsForFileWithState(message->filePath, state, !message->showErrors), params);
@@ -302,6 +301,8 @@ void CodeController::handleMessage(MessageShowErrors* message)
{
TRACE("code errors");
saveOrRestoreViewMode(message);
CodeView* view = getView();
if (!view->showsErrors() || !message->errorId)
{
@@ -337,6 +338,8 @@ void CodeController::handleMessage(MessageSearchFullText* message)
{
TRACE("code fulltext");
saveOrRestoreViewMode(message);
m_collection = m_storageAccess->getFullTextSearchLocations(message->searchTerm, message->caseSensitive);
CodeView::ScrollParams scrollParams(CodeView::ScrollParams::SCROLL_TO_DEFINITION);
@@ -892,3 +895,19 @@ void CodeController::addActiveSourceLocations(std::shared_ptr<SourceLocationFile
);
}
}
void CodeController::saveOrRestoreViewMode(MessageBase* message)
{
if (message->isReplayed())
{
auto it = m_messageIdToViewModeMap.find(message->getId());
if (it != m_messageIdToViewModeMap.end())
{
getView()->setMode(it->second);
}
}
else
{
m_messageIdToViewModeMap.emplace(message->getId(), getView()->isInListMode());
}
}
@@ -100,8 +100,12 @@ private:
void addModificationTimes(std::vector<CodeSnippetParams>& snippets) const;
void addActiveSourceLocations(std::shared_ptr<SourceLocationFile> locationFile) const;
void saveOrRestoreViewMode(MessageBase* message);
StorageAccess* m_storageAccess;
mutable std::shared_ptr<SourceLocationCollection> m_collection;
std::map<Id, bool> m_messageIdToViewModeMap;
};
#endif // CODE_CONTROLLER_H
@@ -108,7 +108,8 @@ void UndoRedoController::handleMessage(MessageActivateTrailEdge* message)
void UndoRedoController::handleMessage(MessageChangeFileView* message)
{
Command command(std::make_shared<MessageChangeFileView>(*message), Command::ORDER_VIEW);
Command command(std::make_shared<MessageChangeFileView>(*message),
message->switchesViewMode ? Command::ORDER_ADAPT : Command::ORDER_VIEW);
processCommand(command);
}
+2
View File
@@ -94,6 +94,8 @@ public:
virtual void showContents() = 0;
virtual bool isInListMode() const = 0;
virtual void setMode(bool listMode) = 0;
virtual bool hasSingleFileCached(const FilePath& filePath) const = 0;
private:
@@ -0,0 +1,3 @@
#include "utility/messaging/MessageBase.h"
Id MessageBase::s_nextId = 1;
+13 -1
View File
@@ -4,11 +4,14 @@
#include <ostream>
#include <sstream>
#include "utility/types.h"
class MessageBase
{
public:
MessageBase()
: m_isParallel(false)
: m_id(s_nextId++)
, m_isParallel(false)
, m_isReplayed(false)
, m_sendAsTask(true)
, m_keepContent(false)
@@ -24,6 +27,11 @@ public:
virtual std::string getType() const = 0;
virtual void dispatch() = 0;
Id getId() const
{
return m_id;
}
bool sendAsTask() const
{
return m_sendAsTask;
@@ -95,6 +103,10 @@ public:
}
private:
static size_t s_nextId;
Id m_id;
bool m_isParallel;
bool m_isReplayed;
@@ -1,3 +1,3 @@
#include "utility/messaging/MessageListenerBase.h"
uint MessageListenerBase::s_nextId = 0;
Id MessageListenerBase::s_nextId = 1;
@@ -26,7 +26,7 @@ public:
}
}
uint getId() const
Id getId() const
{
return m_id;
}
@@ -57,9 +57,9 @@ private:
virtual std::string doGetType() const = 0;
virtual void doHandleMessageBase(MessageBase*) = 0;
static uint s_nextId;
static Id s_nextId;
uint m_id;
Id m_id;
bool m_alive;
};
+3 -3
View File
@@ -64,12 +64,12 @@ void MessageQueue::unregisterListener(MessageListenerBase* listener)
LOG_ERROR("Listener was not found");
}
MessageListenerBase* MessageQueue::getListenerById(const uint id) const
MessageListenerBase* MessageQueue::getListenerById(Id listenerId) const
{
std::lock_guard<std::mutex> lock(m_listenersMutex);
for (size_t i = 0; i < m_listeners.size(); i++)
{
if (m_listeners[i]->getId() == id)
if (m_listeners[i]->getId() == listenerId)
{
return m_listeners[i];
}
@@ -284,7 +284,7 @@ void MessageQueue::sendMessageAsTask(std::shared_ptr<MessageBase> message, bool
if (listener->getType() == message->getType())
{
uint listenerId = listener->getId();
Id listenerId = listener->getId();
taskGroup->addTask(std::make_shared<TaskLambda>(
[listenerId, message]()
{
+1 -1
View File
@@ -24,7 +24,7 @@ public:
void registerListener(MessageListenerBase* listener);
void unregisterListener(MessageListenerBase* listener);
MessageListenerBase* getListenerById(const uint id) const;
MessageListenerBase* getListenerById(Id listenerId) const;
void addMessageFilter(std::shared_ptr<MessageFilter> filter);
@@ -12,20 +12,30 @@ public:
{
FILE_MINIMIZED,
FILE_SNIPPETS,
FILE_MAXIMIZED,
FILE_DEFAULT_FOR_MODE
FILE_MAXIMIZED
};
enum ViewMode
{
VIEW_LIST,
VIEW_SINGLE,
VIEW_CURRENT
};
MessageChangeFileView(
const FilePath& filePath,
FileState state,
ViewMode viewMode,
bool needsData,
bool showErrors
bool showErrors,
bool switchesViewMode = false
)
: filePath(filePath)
, state(state)
, viewMode(viewMode)
, needsData(needsData)
, showErrors(showErrors)
, switchesViewMode(switchesViewMode)
{
}
@@ -41,7 +51,13 @@ public:
case FILE_MINIMIZED: os << "minimize"; break;
case FILE_SNIPPETS: os << "snippets"; break;
case FILE_MAXIMIZED: os << "maximize"; break;
case FILE_DEFAULT_FOR_MODE: os << "default"; break;
}
switch (viewMode)
{
case VIEW_LIST: os << ", list"; break;
case VIEW_SINGLE: os << ", single"; break;
case VIEW_CURRENT: os << ", current"; break;
}
if (needsData)
@@ -50,11 +66,12 @@ public:
}
}
FilePath filePath;
FileState state;
bool needsData;
bool showErrors;
const FilePath filePath;
const FileState state;
const ViewMode viewMode;
const bool needsData;
const bool showErrors;
const bool switchesViewMode;
};
#endif // MESSAGE_CHANGE_FILE_VIEW_H