diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.cpp b/src/plugins/compilerexplorer/compilerexplorereditor.cpp index f1a103a88e9..52e9355786f 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.cpp +++ b/src/plugins/compilerexplorer/compilerexplorereditor.cpp @@ -2,6 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "compilerexplorereditor.h" + +#include "api/compile.h" #include "compilerexplorerconstants.h" #include "compilerexploreroptions.h" #include "compilerexplorersettings.h" @@ -14,6 +16,11 @@ #include #include #include +#include + +#include + +#include #include #include @@ -21,9 +28,8 @@ #include #include -#include - #include +#include #include #include #include @@ -32,21 +38,16 @@ #include #include -#include #include #include +#include #include -#include -#include -#include -#include #include #include #include #include -#include -#include +#include using namespace std::chrono_literals; using namespace Aggregation; @@ -63,6 +64,258 @@ enum { constexpr char AsmEditorLinks[] = "AsmEditor.Links"; constexpr char SourceEditorHoverLine[] = "SourceEditor.HoveredLine"; +class CodeEditorWidget : public TextEditor::TextEditorWidget +{ + Q_OBJECT +public: + CodeEditorWidget(const std::shared_ptr &settings, QUndoStack *undoStack); + + void updateHighlighter(); + + void undo() override { m_undoStack->undo(); } + void redo() override { m_undoStack->redo(); } + + bool isUndoAvailable() const override { return m_undoStack->canUndo(); } + bool isRedoAvailable() const override { return m_undoStack->canRedo(); } + + void focusInEvent(QFocusEvent *event) override + { + TextEditorWidget::focusInEvent(event); + emit gotFocus(); + } + +signals: + void gotFocus(); + +private: + std::shared_ptr m_settings; + QUndoStack *m_undoStack; +}; + +class AsmDocument : public TextEditor::TextDocument +{ +public: + using TextEditor::TextDocument::TextDocument; + + QList setCompileResult(const Api::CompileResult &compileResult); + QList &asmLines() { return m_assemblyLines; } + +private: + QList m_assemblyLines; + QList m_marks; +}; + +class AsmEditorWidget : public TextEditor::TextEditorWidget +{ + Q_OBJECT + +public: + AsmEditorWidget(QUndoStack *undoStack); + + void focusInEvent(QFocusEvent *event) override + { + TextEditorWidget::focusInEvent(event); + emit gotFocus(); + updateUndoRedoActions(); + } + + void findLinkAt(const QTextCursor &, + const Utils::LinkHandler &processLinkCallback, + bool resolveTarget = true, + bool inNextSplit = false) override; + + void undo() override { m_undoStack->undo(); } + void redo() override { m_undoStack->redo(); } + + bool isUndoAvailable() const override { return m_undoStack->canUndo(); } + bool isRedoAvailable() const override { return m_undoStack->canRedo(); } + +protected: + void mouseMoveEvent(QMouseEvent *event) override; + void leaveEvent(QEvent *event) override; + +signals: + void gotFocus(); + void hoveredLineChanged(const std::optional &assemblyLine); + +private: + QUndoStack *m_undoStack; + std::optional m_currentlyHoveredLine; +}; + +class JsonSettingsDocument : public Core::IDocument +{ + Q_OBJECT +public: + JsonSettingsDocument(QUndoStack *undoStack); + + OpenResult open(QString *errorString, + const Utils::FilePath &filePath, + const Utils::FilePath &realFilePath) override; + + bool saveImpl(QString *errorString, + const Utils::FilePath &filePath = Utils::FilePath(), + bool autoSave = false) override; + + bool setContents(const QByteArray &contents) override; + + QString fallbackSaveAsFileName() const override; + + bool shouldAutoSave() const override { return !filePath().isEmpty(); } + bool isModified() const override; + bool isSaveAsAllowed() const override { return true; } + + CompilerExplorerSettings *settings() { return &m_ceSettings; } + + void setWindowStateCallback(std::function callback) + { + m_windowStateCallback = callback; + } + +signals: + void settingsChanged(); + +private: + mutable CompilerExplorerSettings m_ceSettings; + std::function m_windowStateCallback; + QUndoStack *m_undoStack; +}; + +class SourceEditorWidget : public QWidget +{ + Q_OBJECT +public: + SourceEditorWidget(const std::shared_ptr &settings, QUndoStack *undoStack); + + QString sourceCode(); + SourceSettings *sourceSettings() { return m_sourceSettings.get(); } + + void focusInEvent(QFocusEvent *) override { emit gotFocus(); } + + TextEditor::TextEditorWidget *textEditor() { return m_codeEditor; } + +public slots: + void markSourceLocation(const std::optional &assemblyLine); + +signals: + void sourceCodeChanged(); + void remove(); + void gotFocus(); + +private: + CodeEditorWidget *m_codeEditor{nullptr}; + std::shared_ptr m_sourceSettings; +}; + +class CompilerWidget : public QWidget +{ + Q_OBJECT +public: + CompilerWidget(const std::shared_ptr &sourceSettings, + const std::shared_ptr &compilerSettings, + QUndoStack *undoStack); + + Core::SearchableTerminal *createTerminal(); + + void compile(const QString &source); + + std::shared_ptr m_sourceSettings; + std::shared_ptr m_compilerSettings; + + void focusInEvent(QFocusEvent *) override { emit gotFocus(); } + + TextEditor::TextEditorWidget *textEditor() { return m_asmEditor; } + +private: + void doCompile(); + +signals: + void remove(); + void gotFocus(); + void hoveredLineChanged(const std::optional &assemblyLine); + +private: + AsmEditorWidget *m_asmEditor{nullptr}; + Core::SearchableTerminal *m_resultTerminal{nullptr}; + + SpinnerSolution::Spinner *m_spinner{nullptr}; + QSharedPointer m_asmDocument; + + std::unique_ptr> m_compileWatcher; + + QString m_source; + QTimer *m_delayTimer{nullptr}; +}; + +class HelperWidget : public QWidget +{ + Q_OBJECT +public: + HelperWidget(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + +signals: + void addSource(); +}; + +class EditorWidget : public Utils::FancyMainWindow +{ + Q_OBJECT +public: + EditorWidget(const std::shared_ptr &document, + QUndoStack *undoStack, + QWidget *parent = nullptr); + ~EditorWidget() override; + + TextEditor::TextEditorWidget *focusedEditorWidget() const; + +signals: + void sourceCodeChanged(); + void gotFocus(); + +protected: + void focusInEvent(QFocusEvent *event) override; + + void setupHelpWidget(); + QWidget *createHelpWidget() const; + + CompilerWidget *addCompiler(const std::shared_ptr &sourceSettings, + const std::shared_ptr &compilerSettings, + int idx); + + void addSourceEditor(const std::shared_ptr &sourceSettings); + void removeSourceEditor(const std::shared_ptr &sourceSettings); + + void recreateEditors(); + + QVariantMap windowStateCallback(); + +private: + std::shared_ptr m_document; + QUndoStack *m_undoStack; + + QList m_compilerWidgets; + QList m_sourceWidgets; +}; + +class Editor : public Core::IEditor +{ +public: + Editor(); + ~Editor(); + + Core::IDocument *document() const override { return m_document.get(); } + QWidget *toolBar() override; + + std::shared_ptr m_document; + QUndoStack m_undoStack; + std::unique_ptr m_toolBar; + QAction *m_undoAction = nullptr; + QAction *m_redoAction = nullptr; +}; + CodeEditorWidget::CodeEditorWidget(const std::shared_ptr &settings, QUndoStack *undoStack) : m_settings(settings) @@ -890,14 +1143,6 @@ QWidget *Editor::toolBar() return m_toolBar.get(); } -EditorFactory::EditorFactory() -{ - setId(Constants::CE_EDITOR_ID); - setDisplayName(Tr::tr("Compiler Explorer Editor")); - setMimeTypes({"application/compiler-explorer"}); - setEditorCreator([] { return new Editor; }); -} - QList AsmDocument::setCompileResult( const Api::CompileResult &compileResult) { @@ -1022,4 +1267,25 @@ void AsmEditorWidget::findLinkAt(const QTextCursor &cursor, } } +// CompilerExplorerEditorFactory + +class CompilerExplorerEditorFactory final : public IEditorFactory +{ +public: + CompilerExplorerEditorFactory() + { + setId(Constants::CE_EDITOR_ID); + setDisplayName(Tr::tr("Compiler Explorer Editor")); + setMimeTypes({"application/compiler-explorer"}); + setEditorCreator([] { return new Editor; }); + } +}; + +void setupCompilerExplorerEditor() +{ + static CompilerExplorerEditorFactory theCompilerExplorerEditorFactory; +} + } // namespace CompilerExplorer + +#include "compilerexplorereditor.moc" diff --git a/src/plugins/compilerexplorer/compilerexplorereditor.h b/src/plugins/compilerexplorer/compilerexplorereditor.h index 7aa7b185ef6..bcd12710c06 100644 --- a/src/plugins/compilerexplorer/compilerexplorereditor.h +++ b/src/plugins/compilerexplorer/compilerexplorereditor.h @@ -3,290 +3,8 @@ #pragma once -#include "api/compile.h" -#include "compilerexplorersettings.h" - -#include - -#include - -#include - -#include - -#include -#include -#include -#include - -#include - namespace CompilerExplorer { -class JsonSettingsDocument; -class SourceEditorWidget; -class AsmDocument; +void setupCompilerExplorerEditor(); -class CodeEditorWidget : public TextEditor::TextEditorWidget -{ - Q_OBJECT -public: - CodeEditorWidget(const std::shared_ptr &settings, QUndoStack *undoStack); - - void updateHighlighter(); - - void undo() override { m_undoStack->undo(); } - void redo() override { m_undoStack->redo(); } - - bool isUndoAvailable() const override { return m_undoStack->canUndo(); } - bool isRedoAvailable() const override { return m_undoStack->canRedo(); } - - void focusInEvent(QFocusEvent *event) override - { - TextEditorWidget::focusInEvent(event); - emit gotFocus(); - } - -signals: - void gotFocus(); - -private: - std::shared_ptr m_settings; - QUndoStack *m_undoStack; -}; - -class AsmDocument : public TextEditor::TextDocument -{ -public: - using TextEditor::TextDocument::TextDocument; - - QList setCompileResult(const Api::CompileResult &compileResult); - QList &asmLines() { return m_assemblyLines; } - -private: - QList m_assemblyLines; - QList m_marks; -}; - -class AsmEditorWidget : public TextEditor::TextEditorWidget -{ - Q_OBJECT - -public: - AsmEditorWidget(QUndoStack *undoStack); - - void focusInEvent(QFocusEvent *event) override - { - TextEditorWidget::focusInEvent(event); - emit gotFocus(); - updateUndoRedoActions(); - } - - void findLinkAt(const QTextCursor &, - const Utils::LinkHandler &processLinkCallback, - bool resolveTarget = true, - bool inNextSplit = false) override; - - void undo() override { m_undoStack->undo(); } - void redo() override { m_undoStack->redo(); } - - bool isUndoAvailable() const override { return m_undoStack->canUndo(); } - bool isRedoAvailable() const override { return m_undoStack->canRedo(); } - -protected: - void mouseMoveEvent(QMouseEvent *event) override; - void leaveEvent(QEvent *event) override; - -signals: - void gotFocus(); - void hoveredLineChanged(const std::optional &assemblyLine); - -private: - QUndoStack *m_undoStack; - std::optional m_currentlyHoveredLine; -}; - -class JsonSettingsDocument : public Core::IDocument -{ - Q_OBJECT -public: - JsonSettingsDocument(QUndoStack *undoStack); - - OpenResult open(QString *errorString, - const Utils::FilePath &filePath, - const Utils::FilePath &realFilePath) override; - - bool saveImpl(QString *errorString, - const Utils::FilePath &filePath = Utils::FilePath(), - bool autoSave = false) override; - - bool setContents(const QByteArray &contents) override; - - QString fallbackSaveAsFileName() const override; - - bool shouldAutoSave() const override { return !filePath().isEmpty(); } - bool isModified() const override; - bool isSaveAsAllowed() const override { return true; } - - CompilerExplorerSettings *settings() { return &m_ceSettings; } - - void setWindowStateCallback(std::function callback) - { - m_windowStateCallback = callback; - } - -signals: - void settingsChanged(); - -private: - mutable CompilerExplorerSettings m_ceSettings; - std::function m_windowStateCallback; - QUndoStack *m_undoStack; -}; - -class SourceEditorWidget : public QWidget -{ - Q_OBJECT -public: - SourceEditorWidget(const std::shared_ptr &settings, QUndoStack *undoStack); - - QString sourceCode(); - SourceSettings *sourceSettings() { return m_sourceSettings.get(); } - - void focusInEvent(QFocusEvent *) override { emit gotFocus(); } - - TextEditor::TextEditorWidget *textEditor() { return m_codeEditor; } - -public slots: - void markSourceLocation(const std::optional &assemblyLine); - -signals: - void sourceCodeChanged(); - void remove(); - void gotFocus(); - -private: - CodeEditorWidget *m_codeEditor{nullptr}; - std::shared_ptr m_sourceSettings; -}; - -class CompilerWidget : public QWidget -{ - Q_OBJECT -public: - CompilerWidget(const std::shared_ptr &sourceSettings, - const std::shared_ptr &compilerSettings, - QUndoStack *undoStack); - - Core::SearchableTerminal *createTerminal(); - - void compile(const QString &source); - - std::shared_ptr m_sourceSettings; - std::shared_ptr m_compilerSettings; - - void focusInEvent(QFocusEvent *) override { emit gotFocus(); } - - TextEditor::TextEditorWidget *textEditor() { return m_asmEditor; } - -private: - void doCompile(); - -signals: - void remove(); - void gotFocus(); - void hoveredLineChanged(const std::optional &assemblyLine); - -private: - AsmEditorWidget *m_asmEditor{nullptr}; - Core::SearchableTerminal *m_resultTerminal{nullptr}; - - SpinnerSolution::Spinner *m_spinner{nullptr}; - QSharedPointer m_asmDocument; - - std::unique_ptr> m_compileWatcher; - - QString m_source; - QTimer *m_delayTimer{nullptr}; -}; - -class HelperWidget : public QWidget -{ - Q_OBJECT -public: - HelperWidget(); - -protected: - void mousePressEvent(QMouseEvent *event) override; - -signals: - void addSource(); -}; - -class EditorWidget : public Utils::FancyMainWindow -{ - Q_OBJECT -public: - EditorWidget(const std::shared_ptr &document, - QUndoStack *undoStack, - QWidget *parent = nullptr); - ~EditorWidget() override; - - TextEditor::TextEditorWidget *focusedEditorWidget() const; - -signals: - void sourceCodeChanged(); - void gotFocus(); - -protected: - void focusInEvent(QFocusEvent *event) override; - - void setupHelpWidget(); - QWidget *createHelpWidget() const; - - CompilerWidget *addCompiler(const std::shared_ptr &sourceSettings, - const std::shared_ptr &compilerSettings, - int idx); - - void addSourceEditor(const std::shared_ptr &sourceSettings); - void removeSourceEditor(const std::shared_ptr &sourceSettings); - - void recreateEditors(); - - QVariantMap windowStateCallback(); - -private: - std::shared_ptr m_document; - QUndoStack *m_undoStack; - - QList m_compilerWidgets; - QList m_sourceWidgets; -}; - -class Editor : public Core::IEditor -{ -public: - Editor(); - ~Editor(); - - Core::IDocument *document() const override { return m_document.get(); } - QWidget *toolBar() override; - - std::shared_ptr m_document; - QUndoStack m_undoStack; - std::unique_ptr m_toolBar; - QAction *m_undoAction = nullptr; - QAction *m_redoAction = nullptr; -}; - -class EditorFactory : public Core::IEditorFactory -{ -public: - EditorFactory(); - -private: - QAction m_undoAction; - QAction m_redoAction; -}; - -} // namespace CompilerExplorer +} // CompilerExplorer diff --git a/src/plugins/compilerexplorer/compilerexplorerplugin.cpp b/src/plugins/compilerexplorer/compilerexplorerplugin.cpp index 48920561b4a..c9023ff5d41 100644 --- a/src/plugins/compilerexplorer/compilerexplorerplugin.cpp +++ b/src/plugins/compilerexplorer/compilerexplorerplugin.cpp @@ -15,8 +15,6 @@ #include -#include - #include using namespace Core; @@ -32,7 +30,7 @@ class CompilerExplorerPlugin final : public ExtensionSystem::IPlugin public: void initialize() final { - static CompilerExplorer::EditorFactory ceEditorFactory; + setupCompilerExplorerEditor(); FileIconProvider::registerIconForMimeType(QIcon(":/compilerexplorer/logos/ce.ico"), "application/compiler-explorer");