File indexing completed on 2024-05-19 04:47:12
0001 #pragma once 0002 #include <QObject> 0003 #include <QUrl> 0004 0005 #include <QFutureWatcher> 0006 #include <libkommit/filestatus.h> 0007 0008 #include <libkommit/commands/commandswitchbranch.h> 0009 0010 #include <libkommit/commands/commandpull.h> 0011 0012 class QFileSystemWatcher; 0013 class QTimer; 0014 0015 namespace Git 0016 { 0017 class Manager; 0018 class LogsModel; 0019 class RemotesModel; 0020 } 0021 0022 class StatusMessage : public QObject 0023 { 0024 Q_OBJECT 0025 Q_PROPERTY(StatusCode code MEMBER code CONSTANT FINAL) 0026 Q_PROPERTY(QString message MEMBER message CONSTANT FINAL) 0027 public: 0028 explicit StatusMessage(QObject *parent = nullptr); 0029 0030 enum StatusCode 0031 { 0032 Loading, 0033 Ready, 0034 Error 0035 }; Q_ENUM(StatusCode) 0036 0037 StatusCode code = StatusCode::Ready; 0038 QString message; 0039 }; 0040 0041 0042 class Project : public QObject 0043 { 0044 Q_OBJECT 0045 Q_DISABLE_COPY(Project) 0046 0047 Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged) 0048 0049 Q_PROPERTY(StatusMessage* status READ status NOTIFY statusChanged FINAL) 0050 0051 Q_PROPERTY(QString title READ getTitle NOTIFY titleChanged) 0052 Q_PROPERTY(QUrl logo READ getLogo NOTIFY logoChanged) 0053 0054 Q_PROPERTY(QString currentBranch READ currentBranch WRITE setCurrentBranch NOTIFY currentBranchChanged) 0055 0056 Q_PROPERTY(QVariantMap headBranch READ getHeadBranch NOTIFY headBranchChanged) 0057 0058 Q_PROPERTY(Git::LogsModel *commitsModel READ getCommitsModel CONSTANT FINAL) 0059 Q_PROPERTY(QStringList repoStatus READ repoStatus NOTIFY repoStatusChanged) 0060 Q_PROPERTY(QUrl readmeFile READ readmeFile NOTIFY readmeFileChanged CONSTANT) 0061 Q_PROPERTY(Git::RemotesModel *remotesModel READ remotesModel CONSTANT FINAL) 0062 0063 Q_PROPERTY(QStringList allBranches READ allBranches NOTIFY repoChanged) 0064 Q_PROPERTY(QStringList remoteBranches READ remoteBranches NOTIFY repoChanged) 0065 0066 public: 0067 0068 Q_ENUM(Git::CommandSwitchBranch::Mode) 0069 0070 explicit Project(QObject *parent = nullptr); 0071 ~Project(); 0072 0073 QString url() const; 0074 0075 /** 0076 * @brief setUrl 0077 * @param url 0078 */ 0079 void setUrl(const QString &url); 0080 0081 [[nodiscard]] QString getTitle() const; 0082 0083 QUrl getLogo() const; 0084 0085 QString currentBranch() const; 0086 void setCurrentBranch(const QString ¤tBranch); 0087 0088 Git::LogsModel * getCommitsModel(); 0089 0090 QStringList repoStatus() const; 0091 QUrl readmeFile() const; 0092 0093 Git::RemotesModel *remotesModel() const; 0094 0095 0096 QVariantMap getHeadBranch() const; 0097 0098 StatusMessage* status() const; 0099 0100 QStringList allBranches() const; 0101 0102 QStringList remoteBranches() const; 0103 0104 public Q_SLOTS: 0105 QString fileStatusIcon(const QString &file); 0106 0107 QVariantMap commitAuthor(const QString &id); 0108 QVariantMap remoteInfo(const QString &remoteName); 0109 0110 //Actions 0111 void clone(const QString &url); 0112 0113 void checkout(const QString &target, const QString &remote = "", bool force = false, Git::CommandSwitchBranch::Mode mode = Git::CommandSwitchBranch::ExistingBranch); 0114 void stash(); 0115 void stashPop(); 0116 0117 void pull(const QString &remote, const QString &branch, Git::CommandPull::Rebase rebase = Git::CommandPull::None, Git::CommandPull::FastForward fastforward = Git::CommandPull::Unset, bool squash = false, bool noCommit = false, bool prune = false, bool tags = false); 0118 0119 private: 0120 Git::Manager *m_manager; 0121 QFutureWatcher<void> *m_cloneWatcher; 0122 QList<Git::FileStatus> m_filesStatus; 0123 QFileSystemWatcher *m_gitDirWacther; 0124 QTimer *m_watcherTimer; 0125 0126 QString m_url; 0127 QString m_remoteUrl; 0128 0129 QString m_title; 0130 0131 QUrl m_logo; 0132 0133 QString m_currentBranch; 0134 0135 QStringList m_repoStatus; 0136 0137 QUrl m_readmeFile; 0138 0139 QVariantMap m_headBranch; 0140 StatusMessage *m_status; 0141 0142 void setData(const QString &url); 0143 bool loadData(); 0144 0145 void setCurrentBranchRemote(const QString ¤tBranch); 0146 void setHeadBranch(); 0147 0148 void setStatus(StatusMessage::StatusCode code, const QString &message); 0149 QString createHashLink(const QString &hash) const; 0150 0151 Q_SIGNALS: 0152 void titleChanged(QString title); 0153 void logoChanged(QUrl logo); 0154 void urlChanged(QString url); 0155 void error(QString message); 0156 void currentBranchChanged(QString currentBranch); 0157 void repoStatusChanged(QStringList status); 0158 void readmeFileChanged(QUrl readmeFile); 0159 void currentBranchRemoteChanged(QVariantMap currentBranchRemote); 0160 void headBranchChanged(QVariantMap headBranch); 0161 void remoteUrlChanged(QString remoteUrl); 0162 void statusChanged(); 0163 void repoChanged(); 0164 void modelsChanged(); 0165 0166 void actionFinished(bool ok, const QString &message); 0167 }; 0168 0169 0170