kate-gitplusplus/gitplusplus.h

181 lines
4.5 KiB
C++

#ifndef GITPLUSPLUS_H
#define GITPLUSPLUS_H
#include <KTextEditor/Plugin>
#include <KTextEditor/MainWindow>
#include <KTextEditor/View>
#include <ktexteditor_version.h>
#if KTEXTEDITOR_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <KPluginMetaData>
#endif
#include <QPointer>
#include <QProcess>
#include <QWidget>
#include <QTimer>
class GitPlusPlusView;
class GitStatusModel;
class QTreeView;
class QListWidget;
class QLineEdit;
class QTextEdit;
class QToolButton;
class QLabel;
class QComboBox;
class QCheckBox;
class QTabWidget;
class QSortFilterProxyModel;
class QStringListModel;
class QFileSystemWatcher;
/**
* Git++ Plugin - standalone KTextEditor plugin providing git operations.
*/
class GitPlusPlusPlugin : public KTextEditor::Plugin
{
Q_OBJECT
public:
#if KTEXTEDITOR_VERSION >= QT_VERSION_CHECK(6, 0, 0)
explicit GitPlusPlusPlugin(QObject *parent, const KPluginMetaData &data, const QVariantList &args = {});
#else
explicit GitPlusPlusPlugin(QObject *parent, const QVariantList &args = {});
#endif
~GitPlusPlusPlugin() override = default;
QObject *createView(KTextEditor::MainWindow *mainWindow) override;
};
/**
* Per-main-window view providing the Git++ tool view.
*/
class GitPlusPlusView : public QObject
{
Q_OBJECT
public:
explicit GitPlusPlusView(GitPlusPlusPlugin *plugin, KTextEditor::MainWindow *mainWindow);
~GitPlusPlusView() override;
private Q_SLOTS:
// Status
void updateStatus();
void onStatusFinished(int exitCode, QProcess::ExitStatus exitStatus);
// Stage/commit
void stageSelected();
void unstageSelected();
void discardSelected();
void commitChanges();
// Remote
void push();
void pull();
void fetch();
// Branches
void refreshBranches();
void onBranchFinished(int exitCode, QProcess::ExitStatus exitStatus);
void checkoutBranch();
void createBranch();
void deleteBranch();
void compareBranch();
void createWorktree();
// Worktrees
void refreshWorktrees();
void createWorktreeFromTab();
void removeWorktree();
void pruneWorktrees();
void worktreeContextMenu(const QPoint &pos);
// Stash
void stashSave();
void stashApply();
void stashPop();
void stashDrop();
void stashDiff();
void refreshStashes();
void stashContextMenu(const QPoint &pos);
// Log/commit
void openCommit();
// Branch context menu
void branchContextMenu(const QPoint &pos);
private:
QString projectBaseDir() const;
QProcess *gitProcess(const QStringList &args) const;
void runSimpleGit(const QStringList &args, const QString &successMsg, const QString &errorMsg);
void runRemoteGit(const QStringList &args, const QString &opName);
void setMessage(const QString &text, bool isError = false);
void updateIndicators();
void setRemoteBusy(bool busy, const QString &opName = {});
void refreshAll();
void setupFileWatcher();
QStringList selectedFiles(bool staged) const;
QString selectedBranch() const;
QString selectedStash() const;
GitPlusPlusPlugin *m_plugin;
KTextEditor::MainWindow *m_mainWindow;
QWidget *m_toolView;
// Tab widget
QTabWidget *m_tabWidget;
// --- Status tab ---
QTreeView *m_treeView;
GitStatusModel *m_model;
QSortFilterProxyModel *m_proxy;
QLineEdit *m_filterEdit;
QTextEdit *m_commitMsgEdit;
QCheckBox *m_amendCheck;
QLabel *m_statusLabel;
QToolButton *m_commitBtn;
QToolButton *m_pushBtn;
QToolButton *m_pullBtn;
QToolButton *m_fetchBtn;
QToolButton *m_stageBtn;
QToolButton *m_unstageBtn;
QToolButton *m_discardBtn;
QToolButton *m_refreshBtn;
QToolButton *m_stashBtn;
// --- Branches tab ---
QLineEdit *m_branchFilterEdit;
QListWidget *m_branchList;
QToolButton *m_branchCheckoutBtn;
QToolButton *m_branchCreateBtn;
QToolButton *m_branchDeleteBtn;
QToolButton *m_branchCompareBtn;
// --- Stashes tab ---
QListWidget *m_stashList;
QToolButton *m_stashSaveBtn;
QToolButton *m_stashApplyBtn;
QToolButton *m_stashPopBtn;
QToolButton *m_stashDropBtn;
// --- Worktrees tab ---
QListWidget *m_worktreeList;
// --- Indicators ---
QLabel *m_repoLabel;
QLabel *m_statusBarWidget;
// State
QString m_gitDir;
QString m_currentBranch;
QStringList m_allBranches;
bool m_isDirty = false;
QPointer<QProcess> m_remoteProc;
int m_spinnerFrame = 0;
QTimer m_fsDebounce;
QFileSystemWatcher *m_watcher = nullptr;
};
#endif // GITPLUSPLUS_H