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 ¬e) const override; 0052 void paintInlineNote(const KTextEditor::InlineNote ¬e, QPainter &painter, Qt::LayoutDirection) const override; 0053 0054 void inlineNoteActivated(const KTextEditor::InlineNote ¬e, 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 };