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