Handle "Diff All Modified Files" action enablement

Also rename it to "Diff Open Files".

Task-number: QTCREATORBUG-17094
Change-Id: I370c32497fcb56cb2bd84700ef7cb4aa7ba0a573
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jarek Kobus
2016-10-18 13:14:40 +02:00
committed by Jarek Kobus
parent 1414826183
commit 4ae306a5e1
4 changed files with 55 additions and 45 deletions

View File

@@ -1906,9 +1906,9 @@ void EditorManagerPrivate::handleDocumentStateChange()
IDocument *document = qobject_cast<IDocument *>(sender()); IDocument *document = qobject_cast<IDocument *>(sender());
if (!document->isModified()) if (!document->isModified())
document->removeAutoSaveFile(); document->removeAutoSaveFile();
if (EditorManager::currentDocument() == document) { if (EditorManager::currentDocument() == document)
emit m_instance->currentDocumentStateChanged(); emit m_instance->currentDocumentStateChanged();
} emit m_instance->documentStateChanged(document);
} }
void EditorManagerPrivate::editorAreaDestroyed(QObject *area) void EditorManagerPrivate::editorAreaDestroyed(QObject *area)

View File

@@ -179,6 +179,7 @@ public: // for tests
signals: signals:
void currentEditorChanged(Core::IEditor *editor); void currentEditorChanged(Core::IEditor *editor);
void currentDocumentStateChanged(); void currentDocumentStateChanged();
void documentStateChanged(Core::IDocument *document);
void editorCreated(Core::IEditor *editor, const QString &fileName); void editorCreated(Core::IEditor *editor, const QString &fileName);
void editorOpened(Core::IEditor *editor); void editorOpened(Core::IEditor *editor);
void editorAboutToClose(Core::IEditor *editor); void editorAboutToClose(Core::IEditor *editor);

View File

@@ -44,8 +44,10 @@
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <texteditor/textdocument.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
namespace DiffEditor { namespace DiffEditor {
@@ -68,7 +70,7 @@ DiffFilesController::DiffFilesController(Core::IDocument *document)
FileData DiffFilesController::diffFiles(const QString &leftContents, const QString &rightContents) FileData DiffFilesController::diffFiles(const QString &leftContents, const QString &rightContents)
{ {
Differ differ; Differ differ;
QList<Diff> diffList = differ.cleanupSemantics(differ.diff(leftContents, rightContents)); const QList<Diff> diffList = differ.cleanupSemantics(differ.diff(leftContents, rightContents));
QList<Diff> leftDiffList; QList<Diff> leftDiffList;
QList<Diff> rightDiffList; QList<Diff> rightDiffList;
@@ -90,7 +92,7 @@ FileData DiffFilesController::diffFiles(const QString &leftContents, const QStri
const ChunkData chunkData = DiffUtils::calculateOriginalData( const ChunkData chunkData = DiffUtils::calculateOriginalData(
outputLeftDiffList, outputRightDiffList); outputLeftDiffList, outputRightDiffList);
FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0); const FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0);
return fileData; return fileData;
} }
@@ -152,23 +154,23 @@ void DiffCurrentFileController::reload()
///////////////// /////////////////
class DiffAllModifiedFilesController : public DiffFilesController class DiffOpenFilesController : public DiffFilesController
{ {
Q_OBJECT Q_OBJECT
public: public:
DiffAllModifiedFilesController(Core::IDocument *document); DiffOpenFilesController(Core::IDocument *document);
protected: protected:
void reload(); void reload();
}; };
DiffAllModifiedFilesController::DiffAllModifiedFilesController(Core::IDocument *document) : DiffOpenFilesController::DiffOpenFilesController(Core::IDocument *document) :
DiffFilesController(document) DiffFilesController(document)
{ } { }
void DiffAllModifiedFilesController::reload() void DiffOpenFilesController::reload()
{ {
QList<Core::IDocument *> openedDocuments = const QList<Core::IDocument *> openedDocuments =
Core::DocumentModel::openedDocuments(); Core::DocumentModel::openedDocuments();
QList<FileData> fileDataList; QList<FileData> fileDataList;
@@ -333,6 +335,13 @@ void DiffExternalFilesController::reload()
///////////////// /////////////////
static TextEditor::TextDocument *currentTextDocument()
{
return qobject_cast<TextEditor::TextDocument *>(
Core::EditorManager::currentDocument());
}
DiffEditorServiceImpl::DiffEditorServiceImpl(QObject *parent) : DiffEditorServiceImpl::DiffEditorServiceImpl(QObject *parent) :
QObject(parent) QObject(parent)
{ {
@@ -372,11 +381,11 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
connect(m_diffCurrentFileAction, &QAction::triggered, this, &DiffEditorPlugin::diffCurrentFile); connect(m_diffCurrentFileAction, &QAction::triggered, this, &DiffEditorPlugin::diffCurrentFile);
diffContainer->addAction(diffCurrentFileCommand); diffContainer->addAction(diffCurrentFileCommand);
QAction *diffAllModifiedFilesAction = new QAction(tr("Diff All Modified Files"), this); m_diffOpenFilesAction = new QAction(tr("Diff Open Files"), this);
Core::Command *diffAllModifiedFilesCommand = Core::ActionManager::registerAction(diffAllModifiedFilesAction, "DiffEditor.DiffAllModifiedFiles"); Core::Command *diffOpenFilesCommand = Core::ActionManager::registerAction(m_diffOpenFilesAction, "DiffEditor.DiffOpenFiles");
diffAllModifiedFilesCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Shift+H") : tr("Ctrl+Shift+H"))); diffOpenFilesCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Shift+H") : tr("Ctrl+Shift+H")));
connect(diffAllModifiedFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffAllModifiedFiles); connect(m_diffOpenFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffOpenFiles);
diffContainer->addAction(diffAllModifiedFilesCommand); diffContainer->addAction(diffOpenFilesCommand);
QAction *diffExternalFilesAction = new QAction(tr("Diff External Files..."), this); QAction *diffExternalFilesAction = new QAction(tr("Diff External Files..."), this);
Core::Command *diffExternalFilesCommand = Core::ActionManager::registerAction(diffExternalFilesAction, "DiffEditor.DiffExternalFiles"); Core::Command *diffExternalFilesCommand = Core::ActionManager::registerAction(diffExternalFilesAction, "DiffEditor.DiffExternalFiles");
@@ -384,9 +393,18 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
diffContainer->addAction(diffExternalFilesCommand); diffContainer->addAction(diffExternalFilesCommand);
connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged,
this, &DiffEditorPlugin::updateCurrentEditor); this, &DiffEditorPlugin::updateDiffCurrentFileAction);
connect(Core::EditorManager::instance(), &Core::EditorManager::currentDocumentStateChanged,
this, &DiffEditorPlugin::updateDiffCurrentFileAction);
connect(Core::EditorManager::instance(), &Core::EditorManager::editorOpened,
this, &DiffEditorPlugin::updateDiffOpenFilesAction);
connect(Core::EditorManager::instance(), &Core::EditorManager::editorsClosed,
this, &DiffEditorPlugin::updateDiffOpenFilesAction);
connect(Core::EditorManager::instance(), &Core::EditorManager::documentStateChanged,
this, &DiffEditorPlugin::updateDiffOpenFilesAction);
updateActions(); updateDiffCurrentFileAction();
updateDiffOpenFilesAction();
addAutoReleasedObject(new DiffEditorFactory(this)); addAutoReleasedObject(new DiffEditorFactory(this));
addAutoReleasedObject(new DiffEditorServiceImpl(this)); addAutoReleasedObject(new DiffEditorServiceImpl(this));
@@ -397,36 +415,28 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
void DiffEditorPlugin::extensionsInitialized() void DiffEditorPlugin::extensionsInitialized()
{ } { }
void DiffEditorPlugin::updateCurrentEditor(Core::IEditor *editor) void DiffEditorPlugin::updateDiffCurrentFileAction()
{ {
if (m_currentTextDocument) auto textDocument = currentTextDocument();
m_currentTextDocument->disconnect(this); const bool enabled = textDocument && textDocument->isModified();
m_currentTextDocument = 0; m_diffCurrentFileAction->setEnabled(enabled);
if (editor) {
TextEditor::TextEditorWidget *editorWidget = qobject_cast<TextEditor::TextEditorWidget *>(editor->widget());
if (editorWidget) {
m_currentTextDocument = editorWidget->textDocument();
connect(m_currentTextDocument.data(), &Core::IDocument::changed,
this, &DiffEditorPlugin::updateActions);
}
}
updateActions();
} }
void DiffEditorPlugin::updateActions() void DiffEditorPlugin::updateDiffOpenFilesAction()
{ {
const bool diffCurrentFileEnabled = m_currentTextDocument && m_currentTextDocument->isModified(); const bool enabled = Utils::anyOf(Core::DocumentModel::openedDocuments(), [](Core::IDocument *doc) {
m_diffCurrentFileAction->setEnabled(diffCurrentFileEnabled); return doc->isModified() && qobject_cast<TextEditor::TextDocument *>(doc);
});
m_diffOpenFilesAction->setEnabled(enabled);
} }
void DiffEditorPlugin::diffCurrentFile() void DiffEditorPlugin::diffCurrentFile()
{ {
if (!m_currentTextDocument) auto textDocument = currentTextDocument();
if (!textDocument)
return; return;
const QString fileName = m_currentTextDocument->filePath().toString(); const QString fileName = textDocument->filePath().toString();
if (fileName.isEmpty()) if (fileName.isEmpty())
return; return;
@@ -444,17 +454,17 @@ void DiffEditorPlugin::diffCurrentFile()
document->reload(); document->reload();
} }
void DiffEditorPlugin::diffAllModifiedFiles() void DiffEditorPlugin::diffOpenFiles()
{ {
const QString documentId = QLatin1String("Diff All Modified Files"); const QString documentId = QLatin1String("Diff Open Files");
const QString title = tr("Diff All Modified Files"); const QString title = tr("Diff Open Files");
auto const document = qobject_cast<DiffEditorDocument *>( auto const document = qobject_cast<DiffEditorDocument *>(
DiffEditorController::findOrCreateDocument(documentId, title)); DiffEditorController::findOrCreateDocument(documentId, title));
if (!document) if (!document)
return; return;
if (!DiffEditorController::controller(document)) if (!DiffEditorController::controller(document))
new DiffAllModifiedFilesController(document); new DiffOpenFilesController(document);
Core::EditorManager::activateEditorForDocument(document); Core::EditorManager::activateEditorForDocument(document);
document->reload(); document->reload();
} }

View File

@@ -28,7 +28,6 @@
#include "diffeditor_global.h" #include "diffeditor_global.h"
#include <coreplugin/diffservice.h> #include <coreplugin/diffservice.h>
#include <texteditor/textdocument.h>
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
QT_FORWARD_DECLARE_CLASS(QAction) QT_FORWARD_DECLARE_CLASS(QAction)
@@ -58,10 +57,10 @@ public:
void extensionsInitialized(); void extensionsInitialized();
private slots: private slots:
void updateCurrentEditor(Core::IEditor *editor); void updateDiffCurrentFileAction();
void updateActions(); void updateDiffOpenFilesAction();
void diffCurrentFile(); void diffCurrentFile();
void diffAllModifiedFiles(); void diffOpenFiles();
void diffExternalFiles(); void diffExternalFiles();
#ifdef WITH_TESTS #ifdef WITH_TESTS
@@ -72,7 +71,7 @@ private slots:
#endif // WITH_TESTS #endif // WITH_TESTS
private: private:
QAction *m_diffCurrentFileAction; QAction *m_diffCurrentFileAction;
QPointer<TextEditor::TextDocument> m_currentTextDocument; QAction *m_diffOpenFilesAction;
}; };
} // namespace Internal } // namespace Internal