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