File indexing completed on 2024-04-28 05:48:35

0001 /*
0002     SPDX-FileCopyrightText: 2021 Kåre Särs <kare.sars@iki.fi>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "gitblametooltip.h"
0010 
0011 #include <KTextEditor/InlineNoteProvider>
0012 #include <KTextEditor/MainWindow>
0013 #include <KTextEditor/Plugin>
0014 
0015 #include <QProcess>
0016 
0017 #include <QDateTime>
0018 #include <QHash>
0019 #include <QList>
0020 #include <QLocale>
0021 #include <QPointer>
0022 #include <QTimer>
0023 #include <QUrl>
0024 #include <QVariant>
0025 
0026 enum class KateGitBlameMode { None, SingleLine, AllLines, Count = AllLines };
0027 
0028 struct CommitInfo {
0029     QByteArray hash;
0030     QString authorName;
0031     QDateTime authorDate;
0032     QByteArray summary;
0033 };
0034 
0035 struct BlamedLine {
0036     QByteArray shortCommitHash;
0037     QByteArray lineText;
0038 };
0039 
0040 class KateGitBlamePluginView;
0041 class GitBlameTooltip;
0042 
0043 class GitBlameInlineNoteProvider : public KTextEditor::InlineNoteProvider
0044 {
0045     Q_OBJECT
0046 public:
0047     explicit GitBlameInlineNoteProvider(KateGitBlamePluginView *view);
0048     ~GitBlameInlineNoteProvider() override;
0049 
0050     QList<int> inlineNotes(int line) const override;
0051     QSize inlineNoteSize(const KTextEditor::InlineNote &note) const override;
0052     void paintInlineNote(const KTextEditor::InlineNote &note, QPainter &painter, Qt::LayoutDirection) const override;
0053 
0054     void inlineNoteActivated(const KTextEditor::InlineNote &note, Qt::MouseButtons buttons, const QPoint &globalPos) override;
0055     void cycleMode();
0056     void setMode(KateGitBlameMode mode);
0057 
0058 private:
0059     KateGitBlamePluginView *m_pluginView;
0060     QLocale m_locale;
0061     KateGitBlameMode m_mode;
0062 };
0063 
0064 class KateGitBlamePlugin : public KTextEditor::Plugin
0065 {
0066     Q_OBJECT
0067 public:
0068     explicit KateGitBlamePlugin(QObject *parent = nullptr, const QVariantList & = QVariantList());
0069 
0070     QObject *createView(KTextEditor::MainWindow *mainWindow) override;
0071 };
0072 
0073 class KateGitBlamePluginView : public QObject, public KXMLGUIClient
0074 {
0075     Q_OBJECT
0076 public:
0077     KateGitBlamePluginView(KateGitBlamePlugin *plugin, KTextEditor::MainWindow *mainwindow);
0078     ~KateGitBlamePluginView() override;
0079 
0080     QPointer<KTextEditor::View> activeView() const;
0081     QPointer<KTextEditor::Document> activeDocument() const;
0082 
0083     bool hasBlameInfo() const;
0084 
0085     const CommitInfo &blameInfo(int lineNr);
0086 
0087     void showCommitInfo(const QString &hash, KTextEditor::View *view);
0088 
0089     void setToolTipIgnoreKeySequence(QKeySequence sequence);
0090 
0091     void showCommitTreeView(const QUrl &url);
0092 
0093 private:
0094     void sendMessage(const QString &text, bool error);
0095 
0096     void startGitBlameForActiveView();
0097 
0098     void startBlameProcess(const QUrl &url);
0099     void blameFinished(int exitCode, QProcess::ExitStatus exitStatus);
0100 
0101     void startShowProcess(const QUrl &url, const QString &hash);
0102     void showFinished(int exitCode, QProcess::ExitStatus exitStatus);
0103 
0104     const CommitInfo &blameGetUpdateInfo(int lineNr);
0105 
0106     KTextEditor::MainWindow *m_mainWindow;
0107 
0108     GitBlameInlineNoteProvider m_inlineNoteProvider;
0109 
0110     QProcess m_blameInfoProc;
0111     QProcess m_showProc;
0112     QHash<QByteArray, CommitInfo> m_blameInfoForHash;
0113     std::vector<BlamedLine> m_blamedLines;
0114     QUrl m_blameUrl;
0115     QPointer<KTextEditor::View> m_lastView;
0116     int m_lineOffset{0};
0117     GitBlameTooltip m_tooltip;
0118     QString m_showHash;
0119     class CommitDiffTreeView *m_commitFilesView;
0120     QPointer<KTextEditor::View> m_diffView;
0121     QTimer m_startBlameTimer;
0122 };