Guitar
MainWindow.h
Go to the documentation of this file.
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 
4 #include "Git.h"
5 #include "GitCommandRunner.h"
6 #include "MyProcess.h"
7 #include "RepositoryInfo.h"
8 #include "RepositoryModel.h"
9 #include "RepositoryTreeWidget.h"
10 #include "StatusInfo.h"
11 #include "TextEditorTheme.h"
12 #include "UserEvent.h"
13 #include <QMainWindow>
14 #include <memory>
15 
18 class BranchLabel;
19 struct RepositoryInfo;
20 class GitObjectCache;
21 class QListWidget;
22 class QListWidgetItem;
23 class QTableWidgetItem;
24 class QTreeWidgetItem;
26 class ProgressWidget;
27 
28 namespace Ui {
29 class MainWindow;
30 }
31 
32 struct CloneParams {
35 };
36 Q_DECLARE_METATYPE(CloneParams)
37 
38 struct LogData {
39  QByteArray data;
40  LogData() = default;
41  LogData(QByteArray const &ba)
42  : data(ba)
43  {
44  }
45  LogData(QString const &s)
46  : data(s.toUtf8())
47  {
48  }
49  LogData(char const *p, int n)
50  : data(p, n)
51  {
52  }
53  LogData(std::string_view const &s)
54  : data(s.data(), s.size())
55  {
56  }
57 };
58 Q_DECLARE_METATYPE(LogData)
59 
62  QString repository_name;
63 };
64 
65 class HunkItem {
66 public:
67  int hunk_number = -1;
68  size_t pos, len;
69  std::vector<std::string> lines;
70 };
71 
72 class AbstractGitCommand;
73 
75 
77 public:
78  std::function<void (ProcessStatus *, QVariant const &)> callback;
79  std::shared_ptr<ProcessStatus> status;
80  QVariant userdata;
81  QString process_name;
82  QElapsedTimer elapsed;
84  : status(std::make_shared<ProcessStatus>())
85  {
86  }
87 };
88 Q_DECLARE_METATYPE(PtyProcessCompleted)
89 
90 class MainWindow : public QMainWindow {
91  Q_OBJECT
92  friend class UserEventHandler;
93  friend class ImageViewWidget;
94  friend class FileDiffSliderWidget;
95  friend class FileHistoryWindow;
96  friend class FileDiffWidget;
97  friend class AboutDialog;
98  friend class RepositoryTreeWidget; // TODO:
99  friend class MainWindowExchangeData;
100 public:
101  enum {
102  IndexRole = Qt::UserRole,
109  };
113  };
114 
118  };
119 
121  Branches = 0x0001,
122  Tags = 0x0002,
123  Remotes = 0x0100,
124  };
125 
126  enum class FileListType {
127  MessagePanel,
128  SingleList,
129  SideBySide,
130  };
131 
132  struct Task {
133  int index = 0;
134  int parent = 0;
135  Task() = default;
136  Task(int index, int parent)
137  : index(index)
138  , parent(parent)
139  {
140  }
141  };
142 
143  struct Element {
144  int depth = 0;
145  std::vector<int> indexes;
146  };
147 
148 private:
149  struct ObjectData {
150  QString id;
151  QString path;
154  QString header;
155  int idiff;
156  bool staged = false;
157  };
158 private:
159  Ui::MainWindow *ui;
160 
161  struct Private;
163 
165  int row = -1;
166  };
167 
168  enum class FilterTarget {
169  RepositorySearch,
170  CommitLogSearch,
171  };
172 
173  class GitFile {
174  public:
176  QByteArray content;
177  operator bool () const
178  {
179  return type != Git::Object::Type::NONE;
180  }
181  bool is(Git::Object::Type t) const
182  {
183  return t == type;
184  }
185  };
186 
187  void postEvent(QObject *receiver, QEvent *event, int ms_later);
188  void postUserEvent(UserEventHandler::variant_t &&v, int ms_later);
189  void cancelPendingUserEvents();
190 
191  void updateFileList(const Git::Hash &id);
192  void updateFileList(const Git::CommitItem *commit);
193  void updateFileListLater(int delay_ms);
194  void cancelUpdateFileList();
195  void initUpdateFileListTimer();
196 
198  bool new_session = true;
199 
200  bool validate = false;
201  bool wait_cursor = true;
202  bool keep_selection = false;
203 
204  bool clear_log = true;
205  bool do_fetch = true;
206  };
207  void openRepositoryMain(OpenRepositoryOption const &opt);
208  void openRepository(OpenRepositoryOption const &opt);
209  void reopenRepository(bool validate);
210  void openSelectedRepository();
211 
212  void doReopenRepository(ProcessStatus *status, const RepositoryInfo &repodata);
213 
214  QStringList selectedFiles_(QListWidget *listwidget) const;
215  QStringList selectedFiles() const;
216  void for_each_selected_files(std::function<void (QString const &)> const &fn);
217  void clearFileList();
218  void clearDiffView();
219 
220  RepositoryTreeIndex repositoryTreeIndex(const QTreeWidgetItem *item) const;
221  std::optional<RepositoryInfo> repositoryItem(const RepositoryTreeIndex &index) const;
222 
223  void buildRepoTree(QString const &group, QTreeWidgetItem *item, QList<RepositoryInfo> *repos);
224  void refrectRepositories();
225 
226  void updateDiffView(QListWidgetItem *item);
227  void updateDiffView();
228  void updateUnstagedFileCurrentItem();
229  void updateStagedFileCurrentItem();
230  void updateStatusBarText();
231  void setRepositoryInfo(QString const &reponame, QString const &brname);
232 
233  QString getIncrementalSearchText() const;
234  void setFilterText(const QString &text, int repo_list_select_row = -1);
235  void clearFilterText(int repo_list_select_row = -1);
236  void clearAllFilters(int select_row = -1);
237  bool applyFilter();
238  void _appendCharToFilterText(ushort c);
239  bool appendCharToFilterText(int k, FilterTarget ft);
240  MainWindow::FilterTarget filtertarget() const;
241 
242  void revertCommit();
243  void mergeBranch(const QString &commit, Git::MergeFastForward ff, bool squash);
244  void mergeBranch(Git::CommitItem const *commit, Git::MergeFastForward ff, bool squash);
245  void rebaseBranch(Git::CommitItem const *commit);
246  void cherrypick(Git::CommitItem const *commit);
247  void merge(Git::CommitItem commit = {});
248  void setRemoteOnline(bool f, bool save);
249  void startTimers();
250  void setNetworkingCommandsEnabled(bool enabled);
251  void blame(QListWidgetItem *item);
252  void blame();
253  QListWidgetItem *currentFileItem() const;
254  void execAreYouSureYouWantToContinueConnectingDialog(const QString &windowtitle);
255  void deleteRemoteBranch(const Git::CommitItem &commit);
256  QStringList remoteBranches(const Git::Hash &id, QStringList *all);
257  bool isUninitialized();
258  void onLogCurrentItemChanged(bool update_file_list);
259  void findNext();
260  void findText(const QString &text);
261  bool locateCommitID(QString const &commit_id);
262  void showStatus();
263  void onStartEvent();
264  void showLogWindow(bool show);
265  bool isValidRemoteURL(const QString &url, const QString &sshkey);
266  QStringList whichCommand_(const QString &cmdfile1, const QString &cmdfile2 = {});
267  QString selectCommand_(const QString &cmdname, const QStringList &cmdfiles, const QStringList &list, QString path, const std::function<void (const QString &)> &callback);
268  QString selectCommand_(const QString &cmdname, const QString &cmdfile, const QStringList &list, const QString &path, const std::function<void (const QString &)> &callback);
269  const RepositoryInfo *findRegisteredRepository(QString *workdir) const;
270  bool execSetGlobalUserDialog();
271  void revertAllFiles();
272  bool execWelcomeWizardDialog();
273  void execRepositoryPropertyDialog(const RepositoryInfo &repo, bool open_repository_menu = false);
274  void execConfigUserDialog(const Git::User &global_user, const Git::User &local_user, bool enable_local_user, const QString &reponame);
275  void setGitCommand(const QString &path, bool save);
276  void setGpgCommand(const QString &path, bool save);
277  void setSshCommand(const QString &path, bool save);
278  bool checkGitCommand();
279  bool saveBlobAs(const QString &id, const QString &dstpath);
280  bool saveByteArrayAs(const QByteArray &ba, const QString &dstpath);
281  bool saveFileAs(const QString &srcpath, const QString &dstpath);
282  QString executableOrEmpty(const QString &path);
283  bool checkExecutable(const QString &path);
284  void internalSaveCommandPath(const QString &path, bool save, const QString &name);
285  void logGitVersion();
286  void internalClearRepositoryInfo();
287  void checkUser();
288 
289  void setCurrentRepository(const RepositoryInfo &repo, bool clear_authentication);
290  std::optional<QList<Git::Diff> > makeDiffs(GitRunner g, Git::Hash id);
291 
292  void updateRemoteInfo();
293 
294  void submodule_add(QString url = {}, const QString &local_dir = {});
295  const Git::CommitItem &selectedCommitItem() const;
296  void commit(bool amend = false);
297  void commitAmend();
298 
299  void clone(CloneParams const &a);
300 
301  void push(bool set_upstream, const QString &remote, const QString &branch, bool force);
302  void fetch(GitRunner g, bool prune);
303  void stage(GitRunner g, const QStringList &paths);
304  void fetch(GitRunner g);
305  void pull(GitRunner g);
306  void push_tags(GitRunner g);
307  void delete_tags(GitRunner g, const QStringList &tagnames);
308  void add_tag(GitRunner g, const QString &name, Git::Hash const &commit_id);
309 
310  bool push();
311 
312  void deleteBranch(const Git::CommitItem &commit);
313  void deleteSelectedBranch();
314  void resetFile(const QStringList &paths);
315  void clearAuthentication();
316  void clearSshAuthentication();
317  void internalDeleteTags(const QStringList &tagnames);
318  void internalAddTag(const QString &name);
319  void createRepository(const QString &dir);
320  void addRepository(const QString &local_dir, const QString &group = {});
321  void addRepositoryAccepted(const AddRepositoryDialog &dlg);
322  void scanFolderAndRegister(const QString &group);
323  void doGitCommand(const std::function<void (GitRunner)> &callback);
324  void setWindowTitle_(const Git::User &user);
325  void setUnknownRepositoryInfo();
326  void setCurrentRemoteName(const QString &name);
327  void deleteTags(const Git::CommitItem &commit);
328  QStringList remotes() const;
329  BranchList findBranch(const Git::Hash &id);
330  QString tempfileHeader() const;
331  void deleteTempFiles();
332  QString newTempFilePath();
333  int limitLogCount() const;
334  bool isThereUncommitedChanges() const;
335  Git::CommitItemList retrieveCommitLog(GitRunner g) const;
336  const std::map<Git::Hash, BranchList> &branchmap() const;
337 
338  void updateWindowTitle(const Git::User &user);
339  void updateWindowTitle(GitRunner g);
340 
341  std::tuple<QString, BranchLabelList> makeCommitLabels(Git::CommitItem const &commit, std::map<Git::Hash, BranchList> const &branch_map, std::map<Git::Hash, TagList> const &tag_map) const;
342  QString labelsInfoText(Git::CommitItem const &commit);
343 
344  void removeRepositoryFromBookmark(RepositoryTreeIndex const &index, bool ask);
345  void openTerminal(const RepositoryInfo *repo);
346  void openExplorer(const RepositoryInfo *repo);
347  bool askAreYouSureYouWantToRun(const QString &title, const QString &command);
348  bool editFile(const QString &path, const QString &title);
349  void setAppSettings(const ApplicationSettings &appsettings);
350  QStringList findGitObject(const QString &id) const;
351  void saveApplicationSettings();
352  void loadApplicationSettings();
353  void setDiffResult(const QList<Git::Diff> &diffs);
354  const QList<Git::SubmoduleItem> &submodules() const;
355  void setSubmodules(const QList<Git::SubmoduleItem> &submodules);
356  bool runOnRepositoryDir(const std::function<void (QString, QString)> &callback, const RepositoryInfo *repo);
357  NamedCommitList namedCommitItems(int flags);
358 
359  const std::map<Git::Hash, TagList> &tagmap() const;
360  std::map<Git::Hash, TagList> queryTags(GitRunner g);
361  TagList findTag(const Git::Hash &id) const;
362 
363  void sshSetPassphrase(const std::string &user, const std::string &pass);
364  std::string sshPassphraseUser() const;
365  std::string sshPassphrasePass() const;
366  void httpSetAuthentication(const std::string &user, const std::string &pass);
367  std::string httpAuthenticationUser() const;
368  std::string httpAuthenticationPass() const;
369  const Git::CommitItem *getLog(int index) const;
370 
371  bool saveRepositoryBookmarks();
372  QString getBookmarksFilePath() const;
373  void stopPtyProcess();
374  void abortPtyProcess();
375  PtyProcess *getPtyProcess();
376  PtyProcess const *getPtyProcess() const;
377  bool getPtyProcessOk() const;
378  bool isPtyProcessRunning() const;
379  void setCompletedHandler(std::function<void (bool, const QVariant &)> fn, const QVariant &userdata);
380  void setPtyProcessOk(bool pty_process_ok);
381 
382  const QList<RepositoryInfo> &repositoryList() const;
383  void setRepositoryList(QList<RepositoryInfo> &&list);
384 
385  bool interactionEnabled() const;
386  void setInteractionEnabled(bool enabled);
387  InteractionMode interactionMode() const;
388  void setInteractionMode(const InteractionMode &im);
389  void setUncommitedChanges(bool uncommited_changes);
390  QList<Git::Diff> const *diffResult() const;
391 
392  void clearLabelMap();
393  GitObjectCache *getObjCache();
394  bool getForceFetch() const;
395  void setForceFetch(bool force_fetch);
396  Git::Hash getHeadId() const;
397  void setHeadId(const Git::Hash &head_id);
398  void setPtyProcessCompletionData(const QVariant &value);
399  const QVariant &getTempRepoForCloneCompleteV() const;
400  void msgNoRepositorySelected();
401  bool isRepositoryOpened() const;
402  void initRepository(const QString &path, const QString &reponame, const Git::Remote &remote);
403  void updatePocessLog(bool processevents);
404  void appendLogHistory(const QByteArray &str);
405  std::vector<std::string> getLogHistoryLines();
406  void clearLogHistory();
407  void updateAvatar(const Git::User &user, bool request);
408  void cleanSubModule(GitRunner g, QListWidgetItem *item);
409 
410  void updateUncommitedChanges(GitRunner g);
412  QString preferredRepositoryGroup() const;
413  void setPreferredRepositoryGroup(const QString &group);
414  bool _addExistingLocalRepository(QString dir, QString name, QString sshkey, bool open, bool save = true, bool msgbox_if_err = true);
415  void addExistingLocalRepositoryWithGroup(const QString &dir, const QString &group);
416  bool addExistingLocalRepository(const QString &dir, bool open);
417  QString currentFileMimeFileType() const;
418 
419  int rowFromCommitId(const Git::Hash &id);
420 
421  void _updateCommitLogTableView(int delay_ms);
422  void makeCommitLog(Git::Hash const &head, CommitLogExchangeData exdata, int scroll_pos, int select_row);
423 
424  void updateButton();
425  void runPtyGit(const QString &progress_message, GitRunner g, GitCommandRunner::variant_t var, std::function<void (ProcessStatus *, QVariant const &userdata)> callback, QVariant const &userdata);
426  CommitLogExchangeData queryCommitLog(GitRunner g);
427  void updateHEAD(GitRunner g);
428  bool jump(GitRunner g, const Git::Hash &id);
429  void jump(GitRunner g, const QString &text);
430  void connectPtyProcessCompleted();
431  void setupShowFileListHandler();
432 
433  void setRetry(std::function<void (const QVariant &)> fn, const QVariant &var);
434  void clearRetry();
435  void retry();
436  bool isRetryQueued() const;
437  void clearGitCommandCache();
438  Git::CommitItemList log_all2(GitRunner g, const Git::Hash &id, int maxcount) const;
439  ProgressWidget *progress_widget() const;
440  void internalShowPanel(FileListType file_list_type);
441 
442  void showFileList(FileListType files_list_type);
444  void setupAddFileObjectData();
445  void addFileObjectData(const MainWindowExchangeData &data);
446  void setupStatusInfoHandler();
447  void connectSetCommitLog();
448 
449  void _chooseRepository(QTreeWidgetItem *item);
450  void chooseRepository();
451  void setCurrentGitRunner(GitRunner g);
452  void endSession();
453 protected:
454  void closeEvent(QCloseEvent *event) override;
455  void dragEnterEvent(QDragEnterEvent *event) override;
456  void keyPressEvent(QKeyEvent *event) override;
457  bool event(QEvent *event) override;
458  bool eventFilter(QObject *watched, QEvent *event) override;
459  std::optional<RepositoryInfo> selectedRepositoryItem() const;
460  void removeSelectedRepositoryFromBookmark(bool ask);
461 
462 protected slots:
463  void onLogIdle();
464 
465 private slots:
466  void updateUI();
467  void onLogVisibilityChanged();
468  void onRepositoriesTreeDropped();
469  void onInterval10ms();
470  void onAvatarReady();
471  void onCommitDetailGetterReady();
472  void onPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
473  void onSetCommitLog(const CommitLogExchangeData &log);
474  void onCommitLogCurrentRowChanged(int row);
475 
476  void on_action_about_triggered();
477  void on_action_add_repository_triggered();
478  void on_action_clean_df_triggered();
479  void on_action_commit_triggered();
480  void on_action_create_desktop_launcher_file_triggered();
481  void on_action_delete_branch_triggered();
482  void on_action_delete_remote_branch_triggered();
483  void on_action_edit_git_config_triggered();
484  void on_action_edit_gitignore_triggered();
485  void on_action_edit_global_gitconfig_triggered();
486  void on_action_edit_settings_triggered();
487  void on_action_edit_tags_triggered();
488  void on_action_exit_triggered();
489  void on_action_expand_commit_log_triggered();
490  void on_action_expand_diff_view_triggered();
491  void on_action_expand_file_list_triggered();
492  void on_action_explorer_triggered();
493  void on_action_fetch_prune_triggered();
494  void on_action_fetch_triggered();
495  void on_action_find_next_triggered();
496  void on_action_find_triggered();
497  void on_action_offline_triggered();
498  void on_action_online_triggered();
499  void on_action_pull_triggered();
500  void on_action_push_all_tags_triggered();
501  void on_action_push_triggered();
502  void on_action_reflog_triggered();
503  void on_action_repo_checkout_triggered();
504  void on_action_repo_jump_to_head_triggered();
505  void on_action_repo_jump_triggered();
506  void on_action_repo_merge_triggered();
507  void on_action_repositories_panel_triggered();
508  void on_action_repository_property_triggered();
509  void on_action_repository_status_triggered();
510  void on_action_reset_HEAD_1_triggered();
511  void on_action_reset_hard_triggered();
512  void on_action_configure_user_triggered();
513  void on_action_set_gpg_signing_triggered();
514  void on_action_show_labels_triggered();
515  void on_action_show_graph_triggered();
516  void on_action_show_avatars_triggered();
517  void on_action_sidebar_triggered();
518  void on_action_stash_apply_triggered();
519  void on_action_stash_drop_triggered();
520  void on_action_stash_triggered();
521  void on_action_stop_process_triggered();
522  void on_action_submodule_add_triggered();
523  void on_action_submodule_update_triggered();
524  void on_action_submodules_triggered();
525  void on_action_terminal_triggered();
526  void on_action_view_refresh_triggered();
527  void on_action_window_log_triggered(bool checked);
528  void on_listWidget_files_currentRowChanged(int currentRow);
529  void on_listWidget_files_customContextMenuRequested(const QPoint &pos);
530  void on_listWidget_files_itemDoubleClicked(QListWidgetItem *item);
531  void on_listWidget_staged_currentRowChanged(int currentRow);
532  void on_listWidget_staged_customContextMenuRequested(const QPoint &pos);
533  void on_listWidget_staged_itemDoubleClicked(QListWidgetItem *item);
534  void on_listWidget_unstaged_currentRowChanged(int currentRow);
535  void on_listWidget_unstaged_customContextMenuRequested(const QPoint &pos);
536  void on_listWidget_unstaged_itemDoubleClicked(QListWidgetItem *item);
537  void on_radioButton_remote_offline_clicked();
538  void on_radioButton_remote_online_clicked();
539  void on_tableWidget_log_customContextMenuRequested(const QPoint &pos);
540  void on_tableWidget_log_doubleClicked(const QModelIndex &index);
541  void on_toolButton_commit_clicked();
542  void on_toolButton_explorer_clicked();
543  void on_toolButton_fetch_clicked();
544  void on_toolButton_pull_clicked();
545  void on_toolButton_push_clicked();
546  void on_toolButton_select_all_clicked();
547  void on_toolButton_stage_clicked();
548  void on_toolButton_status_clicked();
549  void on_toolButton_stop_process_clicked();
550  void on_toolButton_terminal_clicked();
551  void on_toolButton_unstage_clicked();
552  void on_treeWidget_repos_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
553  void on_treeWidget_repos_customContextMenuRequested(const QPoint &pos);
554  void on_treeWidget_repos_itemDoubleClicked(QTreeWidgetItem *item, int column);
555  void on_toolButton_addrepo_clicked();
556 
557  void test();
558  void toggleMaximized();
559 
560  void onRemoteInfoChanged();
561  void onShowStatusInfo(StatusInfo const &info);
562  void on_action_rebase_abort_triggered();
563 
564  void onShowFileList(FileListType panel_type);
565  void onAddFileObjectData(const MainWindowExchangeData &data);
566 
567  void on_action_view_sort_by_time_changed();
568 
569  void on_action_ssh_triggered();
570 
571 signals:
573  void signalSetProgress(float progress);
574  void signalShowStatusInfo(StatusInfo const &info);
576  void sigWriteLog(LogData const &logdata);
577  void sigShowFileList(FileListType files_list_type);
580  void sigPtyCloneCompleted(bool ok, QVariant const &userdata);
581  void sigPtyFetchCompleted(bool ok, QVariant const &userdata);
582  void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
584 
585 public:
586  explicit MainWindow(QWidget *parent = nullptr);
587  ~MainWindow() override;
588 
589  QColor color(unsigned int i);
590  bool isOnlineMode() const;
591  void updateCurrentFileList();
592  RepositoryTreeWidget::RepositoryListStyle repositoriesListStyle() const;
593  void updateRepositoryList(RepositoryTreeWidget::RepositoryListStyle style = RepositoryTreeWidget::RepositoryListStyle::_Keep, int select_row = -1, QString const &search_text = {});
594 
595  const TagList &queryCurrentCommitTagList() const;
596 
597  // static bool isGroupItem(QTreeWidgetItem *item);
598  // static void setRepoIndex(QTreeWidgetItem *item, int index);
599  // static int repoIndex(QTreeWidgetItem *item);
600  static int indexOfLog(QListWidgetItem *item);
601  static int indexOfDiff(QListWidgetItem *item);
602  static void updateSubmodules(GitRunner g, const Git::Hash &id, QList<Git::SubmoduleItem> *out);
603  static void updateCommitGraph(Git::CommitItemList *logs);
604  static TagList findTag(std::map<Git::Hash, TagList> const &tagmap, Git::Hash const &id);
605  static QString makeRepositoryName(const QString &loc);
606  static void addDiffItems(const QList<Git::Diff> *diff_list, const std::function<void (const ObjectData &)> &add_item);
607  static Git::Hash getObjectID(QListWidgetItem *item);
608  static QString getFilePath(QListWidgetItem *item);
609  static QString getSubmodulePath(QListWidgetItem *item);
610  static QString getSubmoduleCommitId(QListWidgetItem *item);
611  static std::pair<QString, QString> makeFileItemText(const ObjectData &data);
612  static QListWidgetItem *newListWidgetFileItem(const MainWindow::ObjectData &data);
613  static std::string parseDetectedDubiousOwnershipInRepositoryAt(const std::vector<std::string> &lines);
614  // static QString treeItemName(QTreeWidgetItem *item);
615  // static QString treeItemGroup(QTreeWidgetItem *item);
616  static bool isValidWorkingCopy(GitRunner g);
617  bool isValidWorkingCopy(QString const &local_dir);
618  static QString abbrevCommitID(const Git::CommitItem &commit);
619 
620  void drawDigit(QPainter *pr, int x, int y, int n) const;
621  static constexpr int DIGIT_WIDTH = 5;
622  static constexpr int DIGIT_HEIGHT = 7;
623  void setStatusInfo(StatusInfo const &info);
624  void clearStatusInfo();
625  bool setCurrentLogRow(int row);
626  bool shown();
627  void deleteTags(QStringList const &tagnames);
628  void addTag(QString const &name);
629  int selectedLogIndex() const;
630  void updateAncestorCommitMap();
631  bool isAncestorCommit(Git::Hash const &id) const;
632  void postStartEvent(int ms_later);
633  void setShowLabels(bool show, bool save);
634  void setShowGraph(bool show, bool save);
635  void setShowAvatars(bool show, bool save);
636  bool isLabelsVisible() const;
637  bool isGraphVisible() const;
638  bool isAvatarsVisible() const;
639  bool isAvatarEnabled() const;
640  void makeDiffList(const Git::Hash &id, QList<Git::Diff> *diff_list, QListWidget *listwidget);
641  void execCommitViewWindow(const Git::CommitItem *commit);
642  void execCommitPropertyDialog(QWidget *parent, const Git::CommitItem &commit);
643  void execCommitExploreWindow(QWidget *parent, const Git::CommitItem *commit);
644  void execFileHistory(const QString &path);
645  void execFileHistory(QListWidgetItem *item);
646  void showObjectProperty(QListWidgetItem *item);
647  bool testRemoteRepositoryValidity(const QString &url, const QString &sshkey);
648  QString selectGitCommand(bool save);
649  QString selectGpgCommand(bool save);
650  QString selectSshCommand(bool save);
651  const Git::Branch &currentBranch() const;
652  void setCurrentBranch(const Git::Branch &b);
653  const RepositoryInfo &currentRepository() const;
654  QString currentRepositoryName() const;
655  QString currentRemoteName() const;
656  QString currentBranchName() const;
657  GitRunner _git(const QString &dir, const QString &submodpath, const QString &sshkey, bool use_cache) const;
658  GitRunner unassosiated_git_runner() const;
659  GitRunner new_git_runner(const QString &dir, const QString &sshkey);
660  GitRunner new_git_runner();
661  GitRunner git();
662  static GitRunner git_for_submodule(GitRunner g, Git::SubmoduleItem const &submod);
663  bool isValidWorkingCopy(QString const &dir) const;
664  void autoOpenRepository(QString dir, const QString &commit_id = {});
665  std::optional<Git::CommitItem> queryCommit(const Git::Hash &id);
666  bool checkoutLocalBranch(QString const &name);
667  void checkout(QWidget *parent, const Git::CommitItem &commit, std::function<void ()> accepted_callback = {});
668  void checkout();
669  bool jumpToCommit(const Git::Hash &id);
670  bool jumpToCommit(const QString &id);
671 
672  Git::Object catFile(GitRunner g, const QString &id);
673  bool saveAs(const QString &id, const QString &dstpath);
674 
675  TextEditorThemePtr themeForTextEditor();
676  void emitWriteLog(LogData const &logdata);
677  QString findFileID(const Git::Hash &commit_id, const QString &file);
678  const Git::CommitItem &commitItem(int row) const;
679  const Git::CommitItem &commitItem(Git::Hash const &id) const;
680  QImage committerIcon(int row, QSize size) const;
681  void changeSshKey(const QString &local_dir, const QString &ssh_key, bool save);
682  ApplicationSettings *appsettings();
683  const ApplicationSettings *appsettings() const;
684  QString defaultWorkingDir() const;
685  QIcon signatureVerificationIcon(const Git::Hash &id) const;
686  QAction *addMenuActionProperty(QMenu *menu);
687  QString currentWorkingCopyDir() const;
688 
689  void refresh();
690  bool cloneRepository(const Git::CloneData &clonedata, const RepositoryInfo &repodata);
691  Git::User currentGitUser() const;
692  void setupExternalPrograms();
693  void updateCommitLogTableViewLater();
694  void saveRepositoryBookmark(RepositoryInfo item);
695  void changeRepositoryBookmarkName(RepositoryInfo item, QString new_name);
696  BranchLabelList rowLabels(int row, bool sorted = true) const;
697  void setProgress(float progress);
698  void showProgress(const QString &text, float progress = -1.0f);
699  void hideProgress();
700  void internalAfterFetch();
701  void onRepositoryTreeSortRecent(bool f);
702  const Git::CommitItemList &commitlog() const;
703  const Git::CommitItem *currentCommitItem();
704  void clearLogContents();
705  void updateLogTableView();
706  void setFocusToLogTable();
707  void selectLogTableRow(int row);
708  RepositoryData *currentRepositoryData();
709  const RepositoryData *currentRepositoryData() const;
710  void setCommitLog(const CommitLogExchangeData &exdata);
711 public slots:
712  void internalWriteLog(const LogData &logdata);
713 };
714 
716 public:
718  std::vector<MainWindow::ObjectData> object_data;
719 };
720 Q_DECLARE_METATYPE(MainWindowExchangeData)
721 
722 #endif // MAINWINDOW_H
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:710
QList< Git::Branch > BranchList
Definition: RepositoryModel.h:9
QList< BranchLabel > BranchLabelList
Definition: RepositoryModel.h:10
QList< Git::Tag > TagList
Definition: RepositoryModel.h:8
std::shared_ptr< TextEditorTheme > TextEditorThemePtr
Definition: TextEditorTheme.h:9
Definition: AboutDialog.h:10
Definition: AddRepositoryDialog.h:14
Definition: ApplicationSettings.h:23
ログテーブルウィジェットのブランチ名ラベル
Definition: BranchLabel.h:11
Definition: FileDiffSliderWidget.h:21
The FileDiffWidget class サイドバイサイドで2つのファイルのdiffを表示するウィジェット
Definition: FileDiffWidget.h:40
Definition: FileHistoryWindow.h:14
std::variant< Git_clone, Git_fetch, Git_stage, Git_push, Git_pull, Git_push_tags, Git_delete_tag, Git_delete_tags, Git_add_tag, Git_submodule_add > variant_t
Definition: GitCommandRunner.h:133
Definition: GitObjectManager.h:41
Definition: Git.h:740
Definition: Git.h:143
Definition: Git.h:43
MergeFastForward
Definition: Git.h:325
Definition: MainWindow.h:65
std::vector< std::string > lines
Definition: MainWindow.h:69
size_t pos
Definition: MainWindow.h:68
size_t len
Definition: MainWindow.h:68
int hunk_number
Definition: MainWindow.h:67
Definition: ImageViewWidget.h:14
Definition: MainWindow.h:715
MainWindow::FileListType files_list_type
Definition: MainWindow.h:717
std::vector< MainWindow::ObjectData > object_data
Definition: MainWindow.h:718
Definition: MainWindow.h:173
QByteArray content
Definition: MainWindow.h:176
bool is(Git::Object::Type t) const
Definition: MainWindow.h:181
Definition: MainWindow.h:90
@ FilePathRole
Definition: MainWindow.h:103
@ DiffIndexRole
Definition: MainWindow.h:104
@ HeaderRole
Definition: MainWindow.h:106
@ ObjectIdRole
Definition: MainWindow.h:105
@ SubmoduleCommitIdRole
Definition: MainWindow.h:108
@ SubmodulePathRole
Definition: MainWindow.h:107
void signalShowStatusInfo(StatusInfo const &info)
void signalSetProgress(float progress)
void setForceFetch(bool force_fetch)
Ui::MainWindow * ui
Definition: MainWindow.h:159
static std::pair< QString, QString > makeFileItemText(const ObjectData &data)
Private * m
Definition: MainWindow.h:161
InteractionMode
Definition: MainWindow.h:115
@ None
Definition: MainWindow.h:116
@ Busy
Definition: MainWindow.h:117
void signalHideProgress()
NamedCommitFlag
Definition: MainWindow.h:120
void sigPtyFetchCompleted(bool ok, QVariant const &userdata)
QString currentFileMimeFileType() const
void sigPtyCloneCompleted(bool ok, QVariant const &userdata)
FileListType
Definition: MainWindow.h:126
CloneOperation
Definition: MainWindow.h:110
@ SubmoduleAdd
Definition: MainWindow.h:112
@ Clone
Definition: MainWindow.h:111
void enableDragAndDropOnRepositoryTree(bool enabled)
bool getForceFetch() const
void signalAddFileObjectData(const MainWindowExchangeData &data)
void sigSetCommitLog(const CommitLogExchangeData &log)
void signalUpdateCommitLog()
void connectShowFileListHandler()
void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data)
FilterTarget
Definition: MainWindow.h:168
void remoteInfoChanged()
void sigWriteLog(LogData const &logdata)
void sigShowFileList(FileListType files_list_type)
void updateButton()
Definition: MyProcess.h:21
Definition: ProgressWidget.h:10
Definition: MainWindow.h:76
PtyProcessCompleted()
Definition: MainWindow.h:83
QString process_name
Definition: MainWindow.h:81
QVariant userdata
Definition: MainWindow.h:80
QElapsedTimer elapsed
Definition: MainWindow.h:82
std::function< void(ProcessStatus *, QVariant const &)> callback
Definition: MainWindow.h:78
std::shared_ptr< ProcessStatus > status
Definition: MainWindow.h:79
Definition: RepositoryTreeWidget.h:20
RepositoryListStyle
Definition: RepositoryTreeWidget.h:24
Definition: StatusInfo.h:8
Definition: UnixPtyProcess.h:7
Definition: UserEvent.h:31
std::variant< StartEventData, CloneRepositoryEventData > variant_t
Definition: UserEvent.h:36
Definition: AboutDialog.h:6
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1612
Definition: Git.h:726
Definition: MainWindow.h:32
RepositoryInfo repodata
Definition: MainWindow.h:34
Git::CloneData clonedata
Definition: MainWindow.h:33
Definition: RepositoryModel.h:31
Definition: MainWindow.h:60
QString repository_name
Definition: MainWindow.h:62
QString owner_account_name
Definition: MainWindow.h:61
Definition: Git.h:271
Definition: Git.h:506
Definition: Git.h:115
Definition: Git.h:74
Type
Definition: Git.h:75
Definition: Git.h:550
Definition: Git.h:94
Definition: Git.h:608
Definition: MainWindow.h:38
LogData(QByteArray const &ba)
Definition: MainWindow.h:41
LogData(char const *p, int n)
Definition: MainWindow.h:49
LogData(std::string_view const &s)
Definition: MainWindow.h:53
QByteArray data
Definition: MainWindow.h:39
LogData(QString const &s)
Definition: MainWindow.h:45
LogData()=default
Definition: MainWindow.h:143
std::vector< int > indexes
Definition: MainWindow.h:145
Definition: MainWindow.h:149
QString header
Definition: MainWindow.h:154
int idiff
Definition: MainWindow.h:155
Git::CommitItem submod_commit
Definition: MainWindow.h:153
Git::SubmoduleItem submod
Definition: MainWindow.h:152
QString id
Definition: MainWindow.h:150
QString path
Definition: MainWindow.h:151
Definition: MainWindow.h:197
Definition: MainWindow.cpp:116
Definition: MainWindow.h:164
Definition: MainWindow.h:132
Task(int index, int parent)
Definition: MainWindow.h:136
Definition: RepositoryModel.h:12
Definition: RepositoryInfo.h:7