Guitar
MainWindow.h
Go to the documentation of this file.
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 
4 #include "RepositoryModel.h"
5 #include "Git.h"
6 #include "GitCommandRunner.h"
7 #include "MyProcess.h"
8 #include "RepositoryInfo.h"
9 #include "RepositoryTreeWidget.h"
10 #include "TextEditorTheme.h"
11 #include "UserEvent.h"
12 #include "StatusInfo.h"
13 #include <QMainWindow>
14 
17 class BranchLabel;
18 struct RepositoryInfo;
19 class GitObjectCache;
20 class QListWidget;
21 class QListWidgetItem;
22 class QTableWidgetItem;
23 class QTreeWidgetItem;
25 class ProgressWidget;
26 
27 namespace Ui {
28 class MainWindow;
29 }
30 
31 struct CloneParams {
34 };
35 Q_DECLARE_METATYPE(CloneParams)
36 
37 struct LogData {
38  QByteArray data;
39  LogData() = default;
40  LogData(QByteArray const &ba)
41  : data(ba)
42  {
43  }
44  LogData(QString const &s)
45  : data(s.toUtf8())
46  {
47  }
48  LogData(char const *p, int n)
49  : data(p, n)
50  {
51  }
52  LogData(std::string_view const &s)
53  : data(s.data(), s.size())
54  {
55  }
56 };
57 Q_DECLARE_METATYPE(LogData)
58 
61  QString repository_name;
62 };
63 
64 class HunkItem {
65 public:
66  int hunk_number = -1;
67  size_t pos, len;
68  std::vector<std::string> lines;
69 };
70 
71 class AbstractGitCommand;
72 
74 
76 public:
77  std::function<void (ProcessStatus const &, QVariant const &)> callback;
79  QVariant userdata;
80  QString process_name;
81  QElapsedTimer elapsed;
82 };
83 Q_DECLARE_METATYPE(PtyProcessCompleted)
84 
85 class MainWindow : public QMainWindow {
86  Q_OBJECT
87  friend class UserEventHandler;
88  friend class ImageViewWidget;
89  friend class FileDiffSliderWidget;
90  friend class FileHistoryWindow;
91  friend class FileDiffWidget;
92  friend class AboutDialog;
93  friend class RepositoryTreeWidget; // TODO:
94  friend class MainWindowExchangeData;
95 public:
96  enum {
97  IndexRole = Qt::UserRole,
104  };
108  };
109 
113  };
114 
116  Branches = 0x0001,
117  Tags = 0x0002,
118  Remotes = 0x0100,
119  };
120 
121  enum class FileListType {
122  MessagePanel,
123  SingleList,
124  SideBySide,
125  };
126 
127  struct Task {
128  int index = 0;
129  int parent = 0;
130  Task() = default;
131  Task(int index, int parent)
132  : index(index)
133  , parent(parent)
134  {
135  }
136  };
137 
138  struct Element {
139  int depth = 0;
140  std::vector<int> indexes;
141  };
142 
143 private:
144  struct ObjectData {
145  QString id;
146  QString path;
149  QString header;
150  int idiff;
151  bool staged = false;
152  };
153 private:
154  Ui::MainWindow *ui;
155 
156  struct Private;
158 
160  bool validate = false;
161  bool waitcursor = true;
162  bool keep_selection = false;
163  };
164 
166  int row = -1;
167  };
168 
169  enum class FilterTarget {
170  RepositorySearch,
171  CommitLogSearch,
172  };
173 
174  class GitFile {
175  public:
177  QByteArray content;
178  operator bool () const
179  {
180  return type != Git::Object::Type::NONE;
181  }
182  bool is(Git::Object::Type t) const
183  {
184  return t == type;
185  }
186  };
187 
188  void postEvent(QObject *receiver, QEvent *event, int ms_later);
189  void postUserEvent(UserEventHandler::variant_t &&v, int ms_later);
190  void cancelPendingUserEvents();
191 
192  void updateFileList(const Git::Hash &id);
193  void updateFileList(const Git::CommitItem *commit);
194  void updateFileListLater(int delay_ms);
195  void cancelUpdateFileList();
196  void initUpdateFileListTimer();
197 
198  void openRepositoryMain(GitRunner g, bool clear_log, bool do_fetch, bool keep_selection);
199  void doReopenRepository(const 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(const QString &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(const QString &commit, Git::MergeFastForward ff, bool squash);
231  void mergeBranch(Git::CommitItem const *commit, Git::MergeFastForward ff, bool squash);
232  void rebaseBranch(Git::CommitItem const *commit);
233  void cherrypick(Git::CommitItem const *commit);
234  void merge(Git::CommitItem 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(const QString &windowtitle);
242  void deleteRemoteBranch(const Git::CommitItem &commit);
243  QStringList remoteBranches(const Git::Hash &id, QStringList *all);
244  bool isUninitialized();
245  void onLogCurrentItemChanged(bool update_file_list);
246  void findNext();
247  void findText(const QString &text);
248  bool locateCommitID(QString const &commit_id);
249  void showStatus();
250  void onStartEvent();
251  void showLogWindow(bool show);
252  bool isValidRemoteURL(const QString &url, const QString &sshkey);
253  QStringList whichCommand_(const QString &cmdfile1, const QString &cmdfile2 = {});
254  QString selectCommand_(const QString &cmdname, const QStringList &cmdfiles, const QStringList &list, QString path, const std::function<void (const QString &)> &callback);
255  QString selectCommand_(const QString &cmdname, const QString &cmdfile, const QStringList &list, const QString &path, const std::function<void (const QString &)> &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 Git::User &global_user, const Git::User &local_user, bool enable_local_user, const QString &reponame);
262  void setGitCommand(const QString &path, bool save);
263  void setGpgCommand(const QString &path, bool save);
264  void setSshCommand(const QString &path, bool save);
265  bool checkGitCommand();
266  bool saveBlobAs(const QString &id, const QString &dstpath);
267  bool saveByteArrayAs(const QByteArray &ba, const QString &dstpath);
268  bool saveFileAs(const QString &srcpath, const QString &dstpath);
269  QString executableOrEmpty(const QString &path);
270  bool checkExecutable(const QString &path);
271  void internalSaveCommandPath(const QString &path, bool save, const QString &name);
272  void logGitVersion();
273  void internalClearRepositoryInfo();
274  void checkUser();
275 
276  void openRepository(OpenRepositoyOption const &opt);
277  void reopenRepository(bool validate);
278 
279  void setCurrentRepository(const RepositoryInfo &repo, bool clear_authentication);
280  void openSelectedRepository();
281  std::optional<QList<Git::Diff> > makeDiffs(GitRunner g, Git::Hash id);
282  void updateRemoteInfo(GitRunner g);
283  void queryRemotes(GitRunner g);
284  void submodule_add(QString url = {}, const QString &local_dir = {});
285  const Git::CommitItem &selectedCommitItem() const;
286  void commit(bool amend = false);
287  void commitAmend();
288 
289  void clone(CloneParams const &a);
290 
291  void push(bool set_upstream, const QString &remote, const QString &branch, bool force);
292  void fetch(GitRunner g, bool prune);
293  void stage(GitRunner g, const QStringList &paths);
294  void fetch_tags_f(GitRunner g);
295  void pull(GitRunner g);
296  void push_tags(GitRunner g);
297  void delete_tags(GitRunner g, const QStringList &tagnames);
298  void add_tag(GitRunner g, const QString &name, Git::Hash const &commit_id);
299 
300  bool push();
301 
302  void deleteBranch(const Git::CommitItem &commit);
303  void deleteSelectedBranch();
304  void resetFile(const QStringList &paths);
305  void clearAuthentication();
306  void clearSshAuthentication();
307  void internalDeleteTags(const QStringList &tagnames);
308  void internalAddTag(const QString &name);
309  void createRepository(const QString &dir);
310  void addRepository(const QString &local_dir, const QString &group = {});
311  void addRepositoryAccepted(const AddRepositoryDialog &dlg);
312  void scanFolderAndRegister(const QString &group);
313  void doGitCommand(const std::function<void (GitRunner)> &callback);
314  void setWindowTitle_(const Git::User &user);
315  void setUnknownRepositoryInfo();
316  void setCurrentRemoteName(const QString &name);
317  void deleteTags(const Git::CommitItem &commit);
318  QStringList remotes() const;
319  BranchList findBranch(const Git::Hash &id);
320  QString tempfileHeader() const;
321  void deleteTempFiles();
322  QString newTempFilePath();
323  int limitLogCount() const;
324  bool isThereUncommitedChanges() const;
325  Git::CommitItemList retrieveCommitLog(GitRunner g) const;
326  const std::map<Git::Hash, BranchList> &branchmap() const;
327 
328  void updateWindowTitle(const Git::User &user);
329  void updateWindowTitle(GitRunner g);
330 
331  std::tuple<QString, BranchLabelList> makeCommitLabels(Git::CommitItem const &commit, std::map<Git::Hash, BranchList> const &branch_map, std::map<Git::Hash, TagList> const &tag_map) const;
332  QString labelsInfoText(Git::CommitItem const &commit);
333 
334  void removeRepositoryFromBookmark(RepositoryTreeIndex const &index, bool ask);
335  void openTerminal(const RepositoryInfo *repo);
336  void openExplorer(const RepositoryInfo *repo);
337  bool askAreYouSureYouWantToRun(const QString &title, const QString &command);
338  bool editFile(const QString &path, const QString &title);
339  void setAppSettings(const ApplicationSettings &appsettings);
340  QStringList findGitObject(const QString &id) const;
341  void saveApplicationSettings();
342  void loadApplicationSettings();
343  void setDiffResult(const QList<Git::Diff> &diffs);
344  const QList<Git::SubmoduleItem> &submodules() const;
345  void setSubmodules(const QList<Git::SubmoduleItem> &submodules);
346  bool runOnRepositoryDir(const std::function<void (QString, QString)> &callback, const RepositoryInfo *repo);
347  NamedCommitList namedCommitItems(int flags);
348 
349  const std::map<Git::Hash, TagList> &tagmap() const;
350  std::map<Git::Hash, TagList> queryTags(GitRunner g);
351  TagList findTag(const Git::Hash &id) const;
352 
353  void sshSetPassphrase(const std::string &user, const std::string &pass);
354  std::string sshPassphraseUser() const;
355  std::string sshPassphrasePass() const;
356  void httpSetAuthentication(const std::string &user, const std::string &pass);
357  std::string httpAuthenticationUser() const;
358  std::string httpAuthenticationPass() const;
359  const Git::CommitItem *getLog(int index) const;
360 
361  bool saveRepositoryBookmarks();
362  QString getBookmarksFilePath() const;
363  void stopPtyProcess();
364  void abortPtyProcess();
365  PtyProcess *getPtyProcess();
366  PtyProcess const *getPtyProcess() const;
367  bool getPtyProcessOk() const;
368  bool isPtyProcessRunning() const;
369  void setCompletedHandler(std::function<void (bool, const QVariant &)> fn, const QVariant &userdata);
370  void setPtyProcessOk(bool pty_process_ok);
371 
372  const QList<RepositoryInfo> &repositoryList() const;
373  void setRepositoryList(QList<RepositoryInfo> &&list);
374 
375  bool interactionEnabled() const;
376  void setInteractionEnabled(bool enabled);
377  InteractionMode interactionMode() const;
378  void setInteractionMode(const InteractionMode &im);
379  void setUncommitedChanges(bool uncommited_changes);
380  QList<Git::Diff> const *diffResult() const;
381 
382  void clearLabelMap();
383  GitObjectCache *getObjCache();
384  bool getForceFetch() const;
385  void setForceFetch(bool force_fetch);
386  Git::Hash getHeadId() const;
387  void setHeadId(const Git::Hash &head_id);
388  void setPtyProcessCompletionData(const QVariant &value);
389  const QVariant &getTempRepoForCloneCompleteV() const;
390  void msgNoRepositorySelected();
391  bool isRepositoryOpened() const;
392  void initRepository(const QString &path, const QString &reponame, const Git::Remote &remote);
393  void updatePocessLog(bool processevents);
394  void appendLogHistory(const QByteArray &str);
395  std::vector<std::string> getLogHistoryLines();
396  void clearLogHistory();
397  void updateAvatar(const Git::User &user, bool request);
398  void cleanSubModule(QListWidgetItem *item);
399 
400  void updateUncommitedChanges();
402  QString preferredRepositoryGroup() const;
403  void setPreferredRepositoryGroup(const QString &group);
404  bool addExistingLocalRepository(QString dir, QString name, QString sshkey, bool open, bool save = true, bool msgbox_if_err = true);
405  void addExistingLocalRepositoryWithGroup(const QString &dir, const QString &group);
406  bool addExistingLocalRepository(const QString &dir, bool open);
407  QString currentFileMimeFileType() const;
408 
409  int rowFromCommitId(const Git::Hash &id);
410 
411  void _updateCommitLogTableView(int delay_ms);
412  void makeCommitLog(CommitLogExchangeData exdata, int scroll_pos, int select_row);
413 
414  void updateButton();
415  void runPtyGit(const QString &progress_message, GitRunner g, GitCommandRunner::variant_t var, std::function<void (const ProcessStatus &, QVariant const &userdata)> callback, QVariant const &userdata);
416  CommitLogExchangeData queryCommitLog(GitRunner g);
417  void updateHEAD(GitRunner g);
418  bool jump(GitRunner g, const Git::Hash &id);
419  void jump(GitRunner g, const QString &text);
420  void connectPtyProcessCompleted();
421  void setupShowFileListHandler();
422 
423  void setRetry(std::function<void (const QVariant &)> fn, const QVariant &var);
424  void clearRetry();
425  void retry();
426  bool isRetryQueued() const;
427  void clearGitCommandCache();
428  Git::CommitItemList log_all2(GitRunner g, const Git::Hash &id, int maxcount) const;
429  ProgressWidget *progress_widget() const;
430  void internalShowPanel(FileListType file_list_type);
431 
432  void showFileList(FileListType files_list_type);
434  void setupAddFileObjectData();
435  void addFileObjectData(const MainWindowExchangeData &data);
436  void setupStatusInfoHandler();
437  void connectSetCommitLog();
438 
439  void _chooseRepository(QTreeWidgetItem *item);
440  void chooseRepository();
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 signals:
559  void signalSetProgress(float progress);
560  void signalShowStatusInfo(StatusInfo const &info);
562  void sigWriteLog(LogData const &logdata);
563  void sigShowFileList(FileListType files_list_type);
566  void sigPtyCloneCompleted(bool ok, QVariant const &userdata);
567  void sigPtyFetchCompleted(bool ok, QVariant const &userdata);
568  void sigPtyProcessCompleted(bool ok, PtyProcessCompleted const &data);
570 
571 public:
572  explicit MainWindow(QWidget *parent = nullptr);
573  ~MainWindow() override;
574 
575  QColor color(unsigned int i);
576  bool isOnlineMode() const;
577  void updateCurrentFileList();
578  RepositoryTreeWidget::RepositoryListStyle repositoriesListStyle() const;
579  void updateRepositoryList(RepositoryTreeWidget::RepositoryListStyle style = RepositoryTreeWidget::RepositoryListStyle::_Keep, int select_row = -1, QString const &search_text = {});
580 
581  const TagList &queryCurrentCommitTagList() const;
582 
583  // static bool isGroupItem(QTreeWidgetItem *item);
584  // static void setRepoIndex(QTreeWidgetItem *item, int index);
585  // static int repoIndex(QTreeWidgetItem *item);
586  static int indexOfLog(QListWidgetItem *item);
587  static int indexOfDiff(QListWidgetItem *item);
588  static void updateSubmodules(GitRunner g, const Git::Hash &id, QList<Git::SubmoduleItem> *out);
589  static void updateCommitGraph(Git::CommitItemList *logs);
590  static TagList findTag(std::map<Git::Hash, TagList> const &tagmap, Git::Hash const &id);
591  static QString makeRepositoryName(const QString &loc);
592  static void addDiffItems(const QList<Git::Diff> *diff_list, const std::function<void (const ObjectData &)> &add_item);
593  static Git::Hash getObjectID(QListWidgetItem *item);
594  static QString getFilePath(QListWidgetItem *item);
595  static QString getSubmodulePath(QListWidgetItem *item);
596  static QString getSubmoduleCommitId(QListWidgetItem *item);
597  static std::pair<QString, QString> makeFileItemText(const ObjectData &data);
598  static QListWidgetItem *newListWidgetFileItem(const MainWindow::ObjectData &data);
599  static std::string parseDetectedDubiousOwnershipInRepositoryAt(const std::vector<std::string> &lines);
600  // static QString treeItemName(QTreeWidgetItem *item);
601  // static QString treeItemGroup(QTreeWidgetItem *item);
602  static bool isValidWorkingCopy(GitRunner g);
603  static QString abbrevCommitID(const Git::CommitItem &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(const QString &id);
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 Git::Hash &id, QList<Git::Diff> *diff_list, QListWidget *listwidget);
626  void execCommitViewWindow(const Git::CommitItem *commit);
627  void execCommitPropertyDialog(QWidget *parent, const Git::CommitItem &commit);
628  void execCommitExploreWindow(QWidget *parent, const Git::CommitItem *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 Git::Branch &currentBranch() const;
637  void setCurrentBranch(const Git::Branch &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, bool use_cache = true) const;
643  GitRunner git();
644  GitRunner git(Git::SubmoduleItem const &submod);
645  void autoOpenRepository(QString dir, const QString &commit_id = {});
646  std::optional<Git::CommitItem> queryCommit(const Git::Hash &id);
647  bool checkoutLocalBranch(QString const &name);
648  void checkout(QWidget *parent, const Git::CommitItem &commit, std::function<void ()> accepted_callback = {});
649  void checkout();
650  bool jumpToCommit(const Git::Hash &id);
651  bool jumpToCommit(const QString &id);
652 
653  Git::Object catFile(GitRunner g, const QString &id);
654  bool saveAs(const QString &id, const QString &dstpath);
655 
656  TextEditorThemePtr themeForTextEditor();
657  void emitWriteLog(LogData const &logdata);
658  QString findFileID(const Git::Hash &commit_id, const QString &file);
659  const Git::CommitItem &commitItem(int row) const;
660  const Git::CommitItem &commitItem(Git::Hash const &id) const;
661  QImage committerIcon(int row, QSize size) const;
662  void changeSshKey(const QString &local_dir, const QString &ssh_key, bool save);
663  ApplicationSettings *appsettings();
664  const ApplicationSettings *appsettings() const;
665  QString defaultWorkingDir() const;
666  QIcon signatureVerificationIcon(const Git::Hash &id) const;
667  QAction *addMenuActionProperty(QMenu *menu);
668  QString currentWorkingCopyDir() const;
669  Git::SubmoduleItem const *querySubmoduleByPath(const QString &path, Git::CommitItem *commit);
670  void refresh();
671  bool cloneRepository(const Git::CloneData &clonedata, const RepositoryInfo &repodata);
672  Git::User currentGitUser() const;
673  void setupExternalPrograms();
674  void updateCommitLogTableViewLater();
675  void saveRepositoryBookmark(RepositoryInfo item);
676  void changeRepositoryBookmarkName(RepositoryInfo item, QString new_name);
677  BranchLabelList rowLabels(int row, bool sorted = true) const;
678  void setProgress(float progress);
679  void showProgress(const QString &text, float progress = -1.0f);
680  void hideProgress();
681  void internalAfterFetch();
682  void onRepositoryTreeSortRecent(bool f);
683  const Git::CommitItemList &commitlog() const;
684  const Git::CommitItem *currentCommitItem();
685  void clearLogContents();
686  void updateLogTableView();
687  void setFocusToLogTable();
688  void selectLogTableRow(int row);
689  RepositoryData *currentRepositoryData();
690  const RepositoryData *currentRepositoryData() const;
691  void setCommitLog(const CommitLogExchangeData &exdata);
692 public slots:
693  void internalWriteLog(const LogData &logdata);
694 };
695 
697 public:
699  std::vector<MainWindow::ObjectData> object_data;
700 };
701 Q_DECLARE_METATYPE(MainWindowExchangeData)
702 
703 #endif // MAINWINDOW_H
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:721
QList< Git::Branch > BranchList
Definition: RepositoryModel.h:12
QList< BranchLabel > BranchLabelList
Definition: RepositoryModel.h:13
QList< Git::Tag > TagList
Definition: RepositoryModel.h:11
std::shared_ptr< TextEditorTheme > TextEditorThemePtr
Definition: TextEditorTheme.h:9
Definition: AboutDialog.h:10
Definition: AddRepositoryDialog.h:14
Definition: ApplicationSettings.h:22
ログテーブルウィジェットのブランチ名ラベル
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_fetch_tags_f, 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:142
Definition: GitObjectManager.h:40
Definition: Git.h:739
Definition: Git.h:144
Definition: Git.h:46
MergeFastForward
Definition: Git.h:322
Definition: MainWindow.h:64
std::vector< std::string > lines
Definition: MainWindow.h:68
size_t pos
Definition: MainWindow.h:67
size_t len
Definition: MainWindow.h:67
int hunk_number
Definition: MainWindow.h:66
Definition: ImageViewWidget.h:14
Definition: MainWindow.h:696
MainWindow::FileListType files_list_type
Definition: MainWindow.h:698
std::vector< MainWindow::ObjectData > object_data
Definition: MainWindow.h:699
Definition: MainWindow.h:174
QByteArray content
Definition: MainWindow.h:177
bool is(Git::Object::Type t) const
Definition: MainWindow.h:182
Definition: MainWindow.h:85
@ FilePathRole
Definition: MainWindow.h:98
@ DiffIndexRole
Definition: MainWindow.h:99
@ HeaderRole
Definition: MainWindow.h:101
@ ObjectIdRole
Definition: MainWindow.h:100
@ SubmoduleCommitIdRole
Definition: MainWindow.h:103
@ SubmodulePathRole
Definition: MainWindow.h:102
void signalShowStatusInfo(StatusInfo const &info)
void signalSetProgress(float progress)
void setForceFetch(bool force_fetch)
Ui::MainWindow * ui
Definition: MainWindow.h:154
static std::pair< QString, QString > makeFileItemText(const ObjectData &data)
Private * m
Definition: MainWindow.h:156
InteractionMode
Definition: MainWindow.h:110
@ None
Definition: MainWindow.h:111
@ Busy
Definition: MainWindow.h:112
void signalHideProgress()
NamedCommitFlag
Definition: MainWindow.h:115
void sigPtyFetchCompleted(bool ok, QVariant const &userdata)
QString currentFileMimeFileType() const
void sigPtyCloneCompleted(bool ok, QVariant const &userdata)
FileListType
Definition: MainWindow.h:121
CloneOperation
Definition: MainWindow.h:105
@ SubmoduleAdd
Definition: MainWindow.h:107
@ Clone
Definition: MainWindow.h:106
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:169
void remoteInfoChanged()
void sigWriteLog(LogData const &logdata)
void sigShowFileList(FileListType files_list_type)
void updateButton()
Definition: MyProcess.h:20
Definition: ProgressWidget.h:10
Definition: MainWindow.h:75
QString process_name
Definition: MainWindow.h:80
QVariant userdata
Definition: MainWindow.h:79
std::function< void(ProcessStatus const &, QVariant const &)> callback
Definition: MainWindow.h:77
QElapsedTimer elapsed
Definition: MainWindow.h:81
ProcessStatus status
Definition: MainWindow.h:78
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: MainWindow.h:31
RepositoryInfo repodata
Definition: MainWindow.h:33
Git::CloneData clonedata
Definition: MainWindow.h:32
Definition: RepositoryModel.h:27
Definition: MainWindow.h:59
QString repository_name
Definition: MainWindow.h:61
QString owner_account_name
Definition: MainWindow.h:60
Definition: Git.h:268
Definition: Git.h:519
Definition: Git.h:116
Definition: Git.h:79
Type
Definition: Git.h:80
Definition: Git.h:564
Definition: Git.h:95
Definition: Git.h:622
Definition: MainWindow.h:37
LogData(QByteArray const &ba)
Definition: MainWindow.h:40
LogData(char const *p, int n)
Definition: MainWindow.h:48
LogData(std::string_view const &s)
Definition: MainWindow.h:52
QByteArray data
Definition: MainWindow.h:38
LogData(QString const &s)
Definition: MainWindow.h:44
LogData()=default
Definition: MainWindow.h:138
std::vector< int > indexes
Definition: MainWindow.h:140
Definition: MainWindow.h:144
QString header
Definition: MainWindow.h:149
int idiff
Definition: MainWindow.h:150
Git::CommitItem submod_commit
Definition: MainWindow.h:148
Git::SubmoduleItem submod
Definition: MainWindow.h:147
QString id
Definition: MainWindow.h:145
QString path
Definition: MainWindow.h:146
Definition: MainWindow.h:159
Definition: MainWindow.cpp:110
Definition: MainWindow.h:165
Definition: MainWindow.h:127
Task(int index, int parent)
Definition: MainWindow.h:131
Definition: RepositoryModel.h:15
Definition: RepositoryInfo.h:7