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 private:
133  struct ObjectData {
134  QString id;
135  QString path;
138  QString header;
139  int idiff;
140  bool staged = false;
141  };
142 private:
143  Ui::MainWindow *ui;
144 
145  struct Private;
147 
149  int row = -1;
150  };
151 
152  enum class FilterTarget {
153  RepositorySearch,
154  CommitLogSearch,
155  };
156 
157  class GitFile {
158  public:
160  QByteArray content;
161  operator bool () const
162  {
163  return type != GitObject::Type::NONE;
164  }
165  bool is(GitObject::Type t) const
166  {
167  return t == type;
168  }
169  };
170 
171  void postEvent(QObject *receiver, QEvent *event, int ms_later);
172  void postUserEvent(UserEventHandler::variant_t &&v, int ms_later);
173  void cancelPendingUserEvents();
174 
175  void updateFileList(const GitHash &id);
176  void updateFileList(const GitCommitItem *commit);
177  void updateFileListLater(int delay_ms);
178  void cancelUpdateFileList();
179  void initUpdateFileListTimer();
180 
182  bool new_session = true;
183 
184  bool validate = false;
185  bool wait_cursor = true;
186  bool keep_selection = false;
187 
188  bool clear_log = true;
189  bool do_fetch = true;
190  };
191  void openRepositoryMain(OpenRepositoryOption const &opt);
192  void openRepository(OpenRepositoryOption const &opt);
193  void reopenRepository(bool validate);
194  void openSelectedRepository();
195 
196  void doReopenRepository(ProcessStatus *status, const RepositoryInfo &repodata);
197 
198  QStringList selectedFiles_(QListWidget *listwidget) const;
199  QStringList selectedFiles() const;
200  void for_each_selected_files(std::function<void (QString const &)> const &fn);
201  void clearFileList();
202  void clearDiffView();
203 
204  RepositoryTreeIndex repositoryTreeIndex(const QTreeWidgetItem *item) const;
205  std::optional<RepositoryInfo> repositoryItem(const RepositoryTreeIndex &index) const;
206 
207  void buildRepoTree(QString const &group, QTreeWidgetItem *item, QList<RepositoryInfo> *repos);
208  void refrectRepositories();
209 
210  void updateDiffView(QListWidgetItem *item);
211  void updateDiffView();
212  void updateUnstagedFileCurrentItem();
213  void updateStagedFileCurrentItem();
214  void updateStatusBarText();
215  void setRepositoryInfo(QString const &reponame, QString const &brname);
216 
217  QString getIncrementalSearchText() const;
218  void setFilterText(const QString &text, int repo_list_select_row = -1);
219  void clearFilterText(int repo_list_select_row = -1);
220  void clearAllFilters(int select_row = -1);
221  bool applyFilter();
222  void _appendCharToFilterText(ushort c);
223  bool appendCharToFilterText(int k, FilterTarget ft);
224  MainWindow::FilterTarget filtertarget() const;
225 
226  void revertCommit();
227  void mergeBranch(const QString &commit, GitMergeFastForward ff, bool squash);
228  void mergeBranch(GitCommitItem const *commit, GitMergeFastForward ff, bool squash);
229  void rebaseBranch(GitCommitItem const *commit);
230  void cherrypick(GitCommitItem const *commit);
231  void merge(GitCommitItem commit = {});
232  void setRemoteOnline(bool f, bool save);
233  void startTimers();
234  void setNetworkingCommandsEnabled(bool enabled);
235  void blame(QListWidgetItem *item);
236  void blame();
237  QListWidgetItem *currentFileItem() const;
238  void execAreYouSureYouWantToContinueConnectingDialog(const QString &windowtitle);
239  void deleteRemoteBranch(const GitCommitItem &commit);
240  QStringList remoteBranches(const GitHash &id, QStringList *all);
241  bool isUninitialized();
242  void onLogCurrentItemChanged(bool update_file_list);
243  void findNext();
244  void findText(const QString &text);
245  bool locateCommitID(QString const &commit_id);
246  void showStatus();
247  void onStartEvent();
248  void showLogWindow(bool show);
249  bool isValidRemoteURL(const QString &url, const QString &sshkey);
250  QStringList whichCommand_(const QString &cmdfile1, const QString &cmdfile2 = {});
251  QString selectCommand_(const QString &cmdname, const QStringList &cmdfiles, const QStringList &list, QString path, const std::function<void (const QString &)> &callback);
252  QString selectCommand_(const QString &cmdname, const QString &cmdfile, const QStringList &list, const QString &path, const std::function<void (const QString &)> &callback);
253  const RepositoryInfo *findRegisteredRepository(QString *workdir) const;
254  bool execSetGlobalUserDialog();
255  void revertAllFiles();
256  bool execWelcomeWizardDialog();
257  void execRepositoryPropertyDialog(const RepositoryInfo &repo, bool open_repository_menu = false);
258  void execConfigUserDialog(const GitUser &global_user, const GitUser &local_user, bool enable_local_user, const QString &reponame);
259  void setGitCommand(const QString &path, bool save);
260  void setGpgCommand(const QString &path, bool save);
261  void setSshCommand(const QString &path, bool save);
262  bool checkGitCommand();
263  bool saveByteArrayAs(const QByteArray &ba, const QString &dstpath);
264  QString executableOrEmpty(const QString &path);
265  bool checkExecutable(const QString &path);
266  void internalSaveCommandPath(const QString &path, bool save, const QString &name);
267  void logGitVersion();
268  void internalClearRepositoryInfo();
269  void checkUser();
270 
271  void setCurrentRepository(const RepositoryInfo &repo, bool clear_authentication);
272  std::optional<QList<GitDiff>> makeDiffs(GitRunner g, GitHash id, std::future<QList<GitSubmoduleItem>> &&async_modules);
273 
274  void updateRemoteInfo();
275 
276  void submodule_add(QString url = {}, const QString &local_dir = {});
277  const GitCommitItem &selectedCommitItem() const;
278  void commit(bool amend = false);
279  void commitAmend();
280 
281  void clone(CloneParams const &a);
282 
283  void push(bool set_upstream, const QString &remote, const QString &branch, bool force);
284  void fetch(GitRunner g, bool prune);
285  void stage(GitRunner g, const QStringList &paths);
286  void fetch(GitRunner g);
287  void pull(GitRunner g);
288  void push_tags(GitRunner g);
289  void delete_tags(GitRunner g, const QStringList &tagnames);
290  void add_tag(GitRunner g, const QString &name, GitHash const &commit_id);
291 
292  bool push();
293 
294  void deleteBranch(const GitCommitItem &commit);
295  void deleteSelectedBranch();
296  void resetFile(const QStringList &paths);
297  void clearAuthentication();
298  void clearSshAuthentication();
299  void internalDeleteTags(const QStringList &tagnames);
300  void internalAddTag(const QString &name);
301  void createRepository(const QString &dir);
302  void addRepository(const QString &local_dir, const QString &group = {});
303  void addRepositoryAccepted(const AddRepositoryDialog &dlg);
304  void scanFolderAndRegister(const QString &group);
305  void doGitCommand(const std::function<void (GitRunner)> &callback);
306  void setWindowTitle_(const GitUser &user);
307  void setUnknownRepositoryInfo();
308  void setCurrentRemoteName(const QString &name);
309  void deleteTags(const GitCommitItem &commit);
310  QStringList remotes() const;
311  BranchList findBranch(const GitHash &id);
312  QString tempfileHeader() const;
313  void deleteTempFiles();
314  QString newTempFilePath();
315  int limitLogCount() const;
316  bool isThereUncommitedChanges() const;
317  GitCommitItemList retrieveCommitLog(GitRunner g) const;
318  const std::map<GitHash, BranchList> &branchmap() const;
319 
320  void updateWindowTitle(const GitUser &user);
321  void updateWindowTitle(GitRunner g);
322 
323  std::tuple<QString, BranchLabelList> makeCommitLabels(GitCommitItem const &commit, std::map<GitHash, BranchList> const &branch_map, std::map<GitHash, TagList> const &tag_map) const;
324  QString labelsInfoText(GitCommitItem const &commit);
325 
326  void removeRepositoryFromBookmark(RepositoryTreeIndex const &index, bool ask);
327  void openTerminal(const RepositoryInfo *repo);
328  void openExplorer(const RepositoryInfo *repo);
329  bool askAreYouSureYouWantToRun(const QString &title, const QString &command);
330  bool editFile(const QString &path, const QString &title);
331  void setAppSettings(const ApplicationSettings &appsettings);
332 
333  void saveApplicationSettings();
334 
335  void setDiffResult(const QList<GitDiff> &diffs);
336  const QList<GitSubmoduleItem> &submodules() const;
337  void setSubmodules(const QList<GitSubmoduleItem> &submodules);
338  bool runOnRepositoryDir(const std::function<void (QString, QString)> &callback, const RepositoryInfo *repo);
339  NamedCommitList namedCommitItems(int flags);
340 
341  const std::map<GitHash, TagList> &tagmap() const;
342  std::map<GitHash, TagList> queryTags(GitRunner g);
343  TagList findTag(const GitHash &id) const;
344 
345  void sshSetPassphrase(const std::string &user, const std::string &pass);
346  std::string sshPassphraseUser() const;
347  std::string sshPassphrasePass() const;
348  void httpSetAuthentication(const std::string &user, const std::string &pass);
349  std::string httpAuthenticationUser() const;
350  std::string httpAuthenticationPass() const;
351  const GitCommitItem *getLog(int index) const;
352 
353  bool saveRepositoryBookmarks();
354  QString getBookmarksFilePath() const;
355  void stopPtyProcess();
356  void abortPtyProcess();
357  PtyProcess *getPtyProcess();
358  PtyProcess const *getPtyProcess() const;
359  bool getPtyProcessOk() const;
360  bool isPtyProcessRunning() const;
361  void setCompletedHandler(std::function<void (bool, const QVariant &)> fn, const QVariant &userdata);
362  void setPtyProcessOk(bool pty_process_ok);
363 
364  const QList<RepositoryInfo> &repositoryList() const;
365  void setRepositoryList(QList<RepositoryInfo> &&list);
366 
367  bool interactionEnabled() const;
368  void setInteractionEnabled(bool enabled);
369  InteractionMode interactionMode() const;
370  void setInteractionMode(const InteractionMode &im);
371  void setUncommitedChanges(bool uncommited_changes);
372  QList<GitDiff> const *diffResult() const;
373 
374  void clearLabelMap();
375  GitObjectCache *getObjCache();
376  bool getForceFetch() const;
377  void setForceFetch(bool force_fetch);
378  GitHash getHeadId() const;
379  void setHeadId(const GitHash &head_id);
380  void setPtyProcessCompletionData(const QVariant &value);
381  const QVariant &getTempRepoForCloneCompleteV() const;
382  void msgNoRepositorySelected();
383  bool isRepositoryOpened() const;
384  void initRepository(const QString &path, const QString &reponame, const GitRemote &remote);
385  void updatePocessLog(bool processevents);
386  void appendLogHistory(const QByteArray &str);
387  std::vector<std::string> getLogHistoryLines();
388  void clearLogHistory();
389  void updateAvatar(const GitUser &user, bool request);
390  void cleanSubModule(GitRunner g, QListWidgetItem *item);
391 
392  void updateUncommitedChanges(GitRunner g);
394  QString preferredRepositoryGroup() const;
395  void setPreferredRepositoryGroup(const QString &group);
396  bool _addExistingLocalRepository(QString dir, QString name, QString sshkey, bool open, bool save = true, bool msgbox_if_err = true);
397  void addExistingLocalRepositoryWithGroup(const QString &dir, const QString &group);
398  bool addExistingLocalRepository(const QString &dir, bool open);
399  QString currentFileMimeFileType() const;
400 
401  int rowFromCommitId(const GitHash &id);
402 
403  void _updateCommitLogTableView(int delay_ms);
404  void makeCommitLog(GitHash const &head, CommitLogExchangeData exdata, int scroll_pos, int select_row);
405 
406  void updateButton();
407  void runPtyGit(const QString &progress_message, GitRunner g, GitCommandRunner::variant_t var, std::function<void (ProcessStatus *, QVariant const &userdata)> callback, QVariant const &userdata);
408  CommitLogExchangeData queryCommitLog(GitRunner g);
409  void updateHEAD(GitRunner g);
410  bool jump(GitRunner g, const GitHash &id);
411  void jump(GitRunner g, const QString &text);
412  void connectPtyProcessCompleted();
413  void setupShowFileListHandler();
414 
415  void setRetry(std::function<void (const QVariant &)> fn, const QVariant &var);
416  void clearRetry();
417  void retry();
418  bool isRetryQueued() const;
419 
420  void clearGitCommandCache();
421  void clearGitObjectCache();
422 
423  GitCommitItemList log_all2(GitRunner g, const GitHash &id, int maxcount) const;
424  ProgressWidget *progress_widget() const;
425  void internalShowPanel(FileListType file_list_type);
426 
427  void showFileList(FileListType files_list_type);
429  void setupAddFileObjectData();
430  void addFileObjectData(const MainWindowExchangeData &data);
431  void setupStatusInfoHandler();
432  void connectSetCommitLog();
433 
434  void _chooseRepository(QTreeWidgetItem *item);
435  void chooseRepository();
436  void setCurrentGitRunner(GitRunner g);
437  void endSession();
438  std::optional<GitCommitItem> getCommitItem(GitRunner g, const GitHash &hash) const;
439 protected:
440  void closeEvent(QCloseEvent *event) override;
441  void dragEnterEvent(QDragEnterEvent *event) override;
442  void keyPressEvent(QKeyEvent *event) override;
443  bool event(QEvent *event) override;
444  bool eventFilter(QObject *watched, QEvent *event) override;
445  std::optional<RepositoryInfo> selectedRepositoryItem() const;
446  void removeSelectedRepositoryFromBookmark(bool ask);
447 
448 protected slots:
449  void onLogIdle();
450 
451 private slots:
452  void updateUI();
453  void onLogVisibilityChanged();
454  void onRepositoriesTreeDropped();
455  void onInterval10ms();
456  void onAvatarReady();
457  void onCommitDetailGetterReady();
458  void onPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
459  void onSetCommitLog(const CommitLogExchangeData &log);
460  void onCommitLogCurrentRowChanged(int row);
461 
462  void on_action_about_triggered();
463  void on_action_add_repository_triggered();
464  void on_action_clean_df_triggered();
465  void on_action_commit_triggered();
466  void on_action_create_desktop_launcher_file_triggered();
467  void on_action_delete_branch_triggered();
468  void on_action_delete_remote_branch_triggered();
469  void on_action_edit_git_config_triggered();
470  void on_action_edit_gitignore_triggered();
471  void on_action_edit_global_gitconfig_triggered();
472  void on_action_edit_settings_triggered();
473  void on_action_edit_tags_triggered();
474  void on_action_exit_triggered();
475  void on_action_expand_commit_log_triggered();
476  void on_action_expand_diff_view_triggered();
477  void on_action_expand_file_list_triggered();
478  void on_action_explorer_triggered();
479  void on_action_fetch_prune_triggered();
480  void on_action_fetch_triggered();
481  void on_action_find_next_triggered();
482  void on_action_find_triggered();
483  void on_action_offline_triggered();
484  void on_action_online_triggered();
485  void on_action_pull_triggered();
486  void on_action_push_all_tags_triggered();
487  void on_action_push_triggered();
488  void on_action_reflog_triggered();
489  void on_action_repo_checkout_triggered();
490  void on_action_repo_jump_to_head_triggered();
491  void on_action_repo_jump_triggered();
492  void on_action_repo_merge_triggered();
493  void on_action_repositories_panel_triggered();
494  void on_action_repository_property_triggered();
495  void on_action_repository_status_triggered();
496  void on_action_reset_HEAD_1_triggered();
497  void on_action_reset_hard_triggered();
498  void on_action_configure_user_triggered();
499  void on_action_set_gpg_signing_triggered();
500  void on_action_show_labels_triggered();
501  void on_action_show_graph_triggered();
502  void on_action_show_avatars_triggered();
503  void on_action_sidebar_triggered();
504  void on_action_stash_apply_triggered();
505  void on_action_stash_drop_triggered();
506  void on_action_stash_triggered();
507  void on_action_stop_process_triggered();
508  void on_action_submodule_add_triggered();
509  void on_action_submodule_update_triggered();
510  void on_action_submodules_triggered();
511  void on_action_terminal_triggered();
512  void on_action_view_refresh_triggered();
513  void on_action_window_log_triggered(bool checked);
514  void on_listWidget_files_currentRowChanged(int currentRow);
515  void on_listWidget_files_customContextMenuRequested(const QPoint &pos);
516  void on_listWidget_files_itemDoubleClicked(QListWidgetItem *item);
517  void on_listWidget_staged_currentRowChanged(int currentRow);
518  void on_listWidget_staged_customContextMenuRequested(const QPoint &pos);
519  void on_listWidget_staged_itemDoubleClicked(QListWidgetItem *item);
520  void on_listWidget_unstaged_currentRowChanged(int currentRow);
521  void on_listWidget_unstaged_customContextMenuRequested(const QPoint &pos);
522  void on_listWidget_unstaged_itemDoubleClicked(QListWidgetItem *item);
523  void on_radioButton_remote_offline_clicked();
524  void on_radioButton_remote_online_clicked();
525  void on_tableWidget_log_customContextMenuRequested(const QPoint &pos);
526  void on_tableWidget_log_doubleClicked(const QModelIndex &index);
527  void on_toolButton_commit_clicked();
528  void on_toolButton_explorer_clicked();
529  void on_toolButton_fetch_clicked();
530  void on_toolButton_pull_clicked();
531  void on_toolButton_push_clicked();
532  void on_toolButton_select_all_clicked();
533  void on_toolButton_stage_clicked();
534  void on_toolButton_status_clicked();
535  void on_toolButton_stop_process_clicked();
536  void on_toolButton_terminal_clicked();
537  void on_toolButton_unstage_clicked();
538  void on_treeWidget_repos_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
539  void on_treeWidget_repos_customContextMenuRequested(const QPoint &pos);
540  void on_treeWidget_repos_itemDoubleClicked(QTreeWidgetItem *item, int column);
541  void on_toolButton_addrepo_clicked();
542 
543  void test();
544  void toggleMaximized();
545 
546  void onRemoteInfoChanged();
547  void onShowStatusInfo(StatusInfo const &info);
548  void on_action_rebase_abort_triggered();
549 
550  void onShowFileList(FileListType panel_type);
551  void onAddFileObjectData(const MainWindowExchangeData &data);
552 
553  void on_action_view_sort_by_time_changed();
554 
555  void on_action_ssh_triggered();
556 
557  void on_action_restart_trace_logger_triggered();
558 
559 signals:
561  void signalSetProgress(float progress);
562  void signalShowStatusInfo(StatusInfo const &info);
564  void sigWriteLog(LogData const &logdata);
565  void sigShowFileList(FileListType files_list_type);
568  void sigPtyCloneCompleted(bool ok, QVariant const &userdata);
569  void sigPtyFetchCompleted(bool ok, QVariant const &userdata);
570  void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
572 
573 public:
574  explicit MainWindow(QWidget *parent = nullptr);
575  ~MainWindow() override;
576 
577  QColor color(unsigned int i);
578  bool isOnlineMode() const;
579  void updateCurrentFileList();
580  RepositoryTreeWidget::RepositoryListStyle repositoriesListStyle() const;
581  void updateRepositoryList(RepositoryTreeWidget::RepositoryListStyle style = RepositoryTreeWidget::RepositoryListStyle::_Keep, int select_row = -1, QString const &search_text = {});
582 
583  const TagList &queryCurrentCommitTagList() const;
584 
585  static int indexOfLog(QListWidgetItem *item);
586  static int indexOfDiff(QListWidgetItem *item);
587  static QList<GitSubmoduleItem> updateSubmodules(GitRunner g, const GitHash &id);
588  static void updateCommitGraph(GitCommitItemList *logs);
589  static TagList findTag(std::map<GitHash, TagList> const &tagmap, GitHash const &id);
590  static QString makeRepositoryName(const QString &loc);
591  static void addDiffItems(const QList<GitDiff> *diff_list, const std::function<void (const ObjectData &)> &add_item);
592  static GitHash getObjectID(QListWidgetItem *item);
593  static QString getFilePath(QListWidgetItem *item);
594  static QString getSubmodulePath(QListWidgetItem *item);
595  static QString getSubmoduleCommitId(QListWidgetItem *item);
596  static std::pair<QString, QString> makeFileItemText(const ObjectData &data);
597  static QListWidgetItem *newListWidgetFileItem(const MainWindow::ObjectData &data);
598  static std::string parseDetectedDubiousOwnershipInRepositoryAt(const std::vector<std::string> &lines);
599  // static QString treeItemName(QTreeWidgetItem *item);
600  // static QString treeItemGroup(QTreeWidgetItem *item);
601  static bool isValidWorkingCopy(GitRunner g);
602  bool isValidWorkingCopy(QString const &local_dir);
603  static QString abbrevCommitID(const GitCommitItem &commit);
604 
605  void drawDigit(QPainter *pr, int x, int y, int n) const;
606  static constexpr int DIGIT_WIDTH = 5;
607  static constexpr int DIGIT_HEIGHT = 7;
608  void setStatusInfo(StatusInfo const &info);
609  void clearStatusInfo();
610  bool setCurrentLogRow(int row);
611  bool shown();
612  void deleteTags(QStringList const &tagnames);
613  void addTag(QString const &name);
614  int selectedLogIndex() const;
615  void updateAncestorCommitMap();
616  bool isAncestorCommit(GitHash const &id) const;
617  void postStartEvent(int ms_later);
618  void setShowLabels(bool show, bool save);
619  void setShowGraph(bool show, bool save);
620  void setShowAvatars(bool show, bool save);
621  bool isLabelsVisible() const;
622  bool isGraphVisible() const;
623  bool isAvatarsVisible() const;
624  bool isAvatarEnabled() const;
625  void makeDiffList(const GitHash &id, QList<GitDiff> *diff_list, QListWidget *listwidget);
626  void execCommitViewWindow(const GitCommitItem *commit);
627  void execCommitPropertyDialog(QWidget *parent, const GitCommitItem &commit);
628  void execCommitExploreWindow(QWidget *parent, const GitCommitItem *commit);
629  void execFileHistory(const QString &path);
630  void execFileHistory(QListWidgetItem *item);
631  void showObjectProperty(QListWidgetItem *item);
632  bool testRemoteRepositoryValidity(const QString &url, const QString &sshkey);
633  QString selectGitCommand(bool save);
634  QString selectGpgCommand(bool save);
635  QString selectSshCommand(bool save);
636  const GitBranch &currentBranch() const;
637  void setCurrentBranch(const GitBranch &b);
638  const RepositoryInfo &currentRepository() const;
639  QString currentRepositoryName() const;
640  QString currentRemoteName() const;
641  QString currentBranchName() const;
642  GitRunner _git(const QString &dir, const QString &submodpath, const QString &sshkey) const;
643  GitRunner unassosiated_git_runner() const;
644  GitRunner new_git_runner(const QString &dir, const QString &sshkey);
645  GitRunner new_git_runner();
646  GitRunner git();
647  static GitRunner git_for_submodule(GitRunner g, GitSubmoduleItem const &submod);
648  bool isValidWorkingCopy(QString const &dir) const;
649  void autoOpenRepository(QString dir, const QString &commit_id = {});
650  std::optional<GitCommitItem> queryCommit(const GitHash &id);
651  bool checkoutLocalBranch(QString const &name);
652  void checkout(QWidget *parent, const GitCommitItem &commit, std::function<void ()> accepted_callback = {});
653  void checkout();
654  bool jumpToCommit(const GitHash &id);
655  bool jumpToCommit(const QString &id);
656 
657  TextEditorThemePtr themeForTextEditor();
658  void emitWriteLog(LogData const &logdata);
659  QString findFileID(const GitHash &commit_id, const QString &file);
660  const GitCommitItem &commitItem(int row) const;
661  const GitCommitItem &commitItem(GitHash const &id) const;
662  QImage committerIcon(int row, QSize size) const;
663  void changeSshKey(const QString &local_dir, const QString &ssh_key, bool save);
664  ApplicationSettings *appsettings();
665  const ApplicationSettings *appsettings() const;
666  QString defaultWorkingDir() const;
667  QIcon signatureVerificationIcon(const GitHash &id) const;
668  QAction *addMenuActionProperty(QMenu *menu);
669  QString currentWorkingCopyDir() const;
670 
671  void refresh();
672  bool cloneRepository(const GitCloneData &clonedata, const RepositoryInfo &repodata);
673  GitUser currentGitUser() const;
674  void setupExternalPrograms();
675  void updateCommitLogTableViewLater();
676  void saveRepositoryBookmark(RepositoryInfo item);
677  void changeRepositoryBookmarkName(RepositoryInfo item, QString new_name);
678  BranchLabelList rowLabels(int row, bool sorted = true) const;
679  void setProgress(float progress);
680  void showProgress(const QString &text, float progress = -1.0f);
681  void hideProgress();
682  void internalAfterFetch();
683  void onRepositoryTreeSortRecent(bool f);
684  const GitCommitItemList &commitlog() const;
685  const GitCommitItem *currentCommitItem();
686  void clearLogContents();
687  void updateLogTableView();
688  void setFocusToLogTable();
689  void selectLogTableRow(int row);
690  RepositoryData *currentRepositoryData();
691  const RepositoryData *currentRepositoryData() const;
692  void setCommitLog(const CommitLogExchangeData &exdata);
693  bool saveFileAs(const QString &srcpath, const QString &dstpath);
694  bool saveBlobAs(const QString &id, const QString &dstpath);
695 public slots:
696  void internalWriteLog(const LogData &logdata);
697 };
698 
700 public:
702  std::vector<MainWindow::ObjectData> object_data;
703 };
704 Q_DECLARE_METATYPE(MainWindowExchangeData)
705 
706 #endif // MAINWINDOW_H
GitMergeFastForward
Definition: GitTypes.h:360
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:256
QList< BranchLabel > BranchLabelList
Definition: RepositoryModel.h:9
QList< GitBranch > BranchList
Definition: RepositoryModel.h:8
QList< GitTag > TagList
Definition: RepositoryModel.h:7
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: GitTypes.h:142
Definition: GitTypes.h:31
Definition: GitObjectManager.h:37
Definition: GitRunner.h:14
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:699
MainWindow::FileListType files_list_type
Definition: MainWindow.h:701
std::vector< MainWindow::ObjectData > object_data
Definition: MainWindow.h:702
Definition: MainWindow.h:157
QByteArray content
Definition: MainWindow.h:160
bool is(GitObject::Type t) const
Definition: MainWindow.h:165
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:143
static std::pair< QString, QString > makeFileItemText(const ObjectData &data)
Private * m
Definition: MainWindow.h:145
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:152
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: GitTypes.h:67
Definition: MainWindow.h:32
RepositoryInfo repodata
Definition: MainWindow.h:34
GitCloneData clonedata
Definition: MainWindow.h:33
Definition: RepositoryModel.h:28
Definition: GitTypes.h:220
Definition: GitTypes.h:247
Definition: GitTypes.h:114
Definition: MainWindow.h:60
QString repository_name
Definition: MainWindow.h:62
QString owner_account_name
Definition: MainWindow.h:61
Type
Definition: GitTypes.h:78
Definition: GitTypes.h:11
Definition: GitTypes.h:366
Definition: GitTypes.h:211
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:133
QString header
Definition: MainWindow.h:138
int idiff
Definition: MainWindow.h:139
QString id
Definition: MainWindow.h:134
GitSubmoduleItem submod
Definition: MainWindow.h:136
QString path
Definition: MainWindow.h:135
GitCommitItem submod_commit
Definition: MainWindow.h:137
Definition: MainWindow.h:181
Definition: MainWindow.cpp:114
Definition: MainWindow.h:148
Definition: RepositoryModel.h:11
Definition: RepositoryInfo.h:7