Guitar
FileDiffWidget.h
Go to the documentation of this file.
1 #ifndef FILEDIFFWIDGET_H
2 #define FILEDIFFWIDGET_H
3 
4 #include "FileDiffSliderWidget.h"
5 #include "FileViewWidget.h"
6 #include "Git.h"
8 #include <QDialog>
9 #include <memory>
10 
11 namespace Ui {
12 class FileDiffWidget;
13 }
14 
15 enum class ViewType {
16  None,
17  Left,
18  Right
19 };
20 
21 class MainWindow;
22 
24 using TextDiffLineList = QList<Document::Line>;
25 
26 struct ObjectContent {
27  QString id;
28  QString path;
29  QByteArray bytes;
31 };
32 using ObjectContentPtr = std::shared_ptr<ObjectContent>;
33 
34 class QTableWidgetItem;
35 
40 class FileDiffWidget : public QWidget {
41  Q_OBJECT
42  friend class BigDiffWindow;
43 public:
44  struct DiffData {
47  std::vector<std::string> original_lines;
49  {
50  clear();
51  }
52  void clear()
53  {
54  left = std::make_shared<ObjectContent>();
55  right = std::make_shared<ObjectContent>();
56  original_lines.clear();
57  }
58  };
59 
60  enum ViewStyle {
67  };
68 
69  struct LineFragment {
73  LineFragment() = default;
75  : type(type)
78  {
79  }
80  };
81 
82 
83 private:
84  Ui::FileDiffWidget *ui;
85 
86  struct Private;
88 
89  struct InitParam_ {
90  ViewStyle view_style = ViewStyle::None;
91  QByteArray bytes_a;
92  QByteArray bytes_b;
94  bool uncommited = false;
95  QString workingdir;
96  };
97 
99 
100  ViewStyle viewstyle() const;
101 
102  GitRunner git();
103  Git::Object catFile(GitRunner g, QString const &id);
104 
105  int totalTextLines() const;
106 
107  void resetScrollBarValue();
108  void updateSliderCursor();
109 
110  int fileviewHeight() const;
111 
112  void setDiffText(const Git::Diff &diff, TextDiffLineList const &left, TextDiffLineList const &right);
113 
114 
115  void setLeftOnly(const Git::Diff &diff, QByteArray const &ba);
116  void setRightOnly(const Git::Diff &diff, QByteArray const &ba);
117  void setSideBySide(const Git::Diff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir);
118  void setSideBySide_(const Git::Diff &diff, QByteArray const &ba_a, QByteArray const &ba_b, QString const &workingdir);
119 
120  bool isValidID_(QString const &id);
121 
123 
124  void makeSideBySideDiffData(const Git::Diff &diff, const std::vector<std::string> &original_lines, TextDiffLineList *left_lines, TextDiffLineList *right_lines);
125  void onUpdateSliderBar();
126  void refrectScrollBar();
127  void refrectScrollBarV();
128  void refrectScrollBarH();
129  void setOriginalLines_(QByteArray const &ba, const Git::SubmoduleItem *submodule, const Git::CommitItem *submodule_commit);
130  QString diffObjects(QString const &a_id, QString const &b_id);
131  bool setSubmodule(const Git::Diff &diff);
132 protected:
133  void resizeEvent(QResizeEvent *) override;
134  void keyPressEvent(QKeyEvent *event) override;
135 public:
136  explicit FileDiffWidget(QWidget *parent = nullptr);
137  ~FileDiffWidget() override;
138 
139  void init();
140 
141  void clearDiffView();
142 
143  void setSingleFile(QByteArray const &ba, QString const &id, QString const &path);
144 
145  void updateControls();
146  void scrollToBottom();
147 
148  void updateDiffView(const Git::Diff &info, bool uncommited);
149  void updateDiffView_(const QString &id_left, const QString &id_right, QString const &path = QString());
150 
151  void setMaximizeButtonEnabled(bool f);
152  void setFocusAcceptable(Qt::FocusPolicy focuspolicy);
153  QPixmap makeDiffPixmap(DiffPane pane, int width, int height);
154  void setViewType(FileViewType type);
155  void setTextCodec(std::shared_ptr<MyTextCodec> codec);
156  void setTextCodec(char const *name);
157 private slots:
160  void onDiffWidgetWheelScroll(int lines);
161  void onScrollValueChanged2(int value);
162  void onDiffWidgetResized();
164 
165  void scrollTo(int value);
166  void onMoved(int cur_row, int cur_col, int scr_row, int scr_col);
168 
169 signals:
170  // void moveNextItem();
171  // void movePreviousItem();
173 };
174 
175 #endif // FILEDIFFWIDGET_H
QList< Document::Line > TextDiffLineList
Definition: FileDiffSliderWidget.h:12
DiffPane
Definition: FileDiffSliderWidget.h:14
ViewType
Definition: FileDiffWidget.h:15
std::shared_ptr< ObjectContent > ObjectContentPtr
Definition: FileDiffWidget.h:32
FileViewType
Definition: FileViewWidget.h:15
Definition: BigDiffWindow.h:12
The FileDiffWidget class サイドバイサイドで2つのファイルのdiffを表示するウィジェット
Definition: FileDiffWidget.h:40
Ui::FileDiffWidget * ui
Definition: FileDiffWidget.h:84
void resizeEvent(QResizeEvent *) override
Definition: FileDiffWidget.cpp:715
QPixmap makeDiffPixmap(DiffPane pane, int width, int height)
Definition: FileDiffWidget.cpp:877
void setFocusAcceptable(Qt::FocusPolicy focuspolicy)
Definition: FileDiffWidget.cpp:789
void on_toolButton_menu_clicked()
Definition: FileDiffWidget.cpp:919
void setSideBySide(const Git::Diff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir)
Definition: FileDiffWidget.cpp:553
void setTextCodec(std::shared_ptr< MyTextCodec > codec)
Definition: FileDiffWidget.cpp:904
Private * m
Definition: FileDiffWidget.h:86
QString diffObjects(QString const &a_id, QString const &b_id)
Definition: FileDiffWidget.cpp:601
MainWindow * mainwindow()
Definition: FileDiffWidget.cpp:90
void refrectScrollBarV()
縦スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:864
GitRunner git()
Definition: FileDiffWidget.cpp:125
void onVerticalScrollValueChanged(int)
縦スクロールバーが操作された
Definition: FileDiffWidget.cpp:742
void textcodecChanged()
void refrectScrollBar()
スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:807
void on_toolButton_fullscreen_clicked()
Definition: FileDiffWidget.cpp:777
FileViewType setupPreviewWidget()
テキストか画像かでビューを切り替える
Definition: FileDiffWidget.cpp:411
void setLeftOnly(const Git::Diff &diff, QByteArray const &ba)
Definition: FileDiffWidget.cpp:466
bool isValidID_(QString const &id)
コミットIDの検証
Definition: FileDiffWidget.cpp:635
~FileDiffWidget() override
Definition: FileDiffWidget.cpp:84
void scrollTo(int value)
Definition: FileDiffWidget.cpp:734
void setOriginalLines_(QByteArray const &ba, const Git::SubmoduleItem *submodule, const Git::CommitItem *submodule_commit)
Definition: FileDiffWidget.cpp:450
void init()
スクロールバーのセットアップ
Definition: FileDiffWidget.cpp:99
int fileviewHeight() const
Definition: FileDiffWidget.cpp:153
void onUpdateSliderBar()
Definition: FileDiffWidget.cpp:795
void onScrollValueChanged2(int value)
Definition: FileDiffWidget.cpp:767
void updateDiffView_(const QString &id_left, const QString &id_right, QString const &path=QString())
差分ビューを更新
Definition: FileDiffWidget.cpp:696
void makeSideBySideDiffData(const Git::Diff &diff, const std::vector< std::string > &original_lines, TextDiffLineList *left_lines, TextDiffLineList *right_lines)
Definition: FileDiffWidget.cpp:182
void scrollToBottom()
Definition: FileDiffWidget.cpp:164
void updateSliderCursor()
Definition: FileDiffWidget.cpp:170
void updateDiffView(const Git::Diff &info, bool uncommited)
差分ビューを更新
Definition: FileDiffWidget.cpp:648
void setMaximizeButtonEnabled(bool f)
Definition: FileDiffWidget.cpp:114
int totalTextLines() const
Definition: FileDiffWidget.cpp:139
void onHorizontalScrollValueChanged(int)
横スクロールバーが操作された
Definition: FileDiffWidget.cpp:750
void onDiffWidgetWheelScroll(int lines)
Definition: FileDiffWidget.cpp:755
void onMoved(int cur_row, int cur_col, int scr_row, int scr_col)
スクロール位置の行と桁を設定
Definition: FileDiffWidget.cpp:894
void setDiffText(const Git::Diff &diff, TextDiffLineList const &left, TextDiffLineList const &right)
Definition: FileDiffWidget.cpp:323
ViewStyle viewstyle() const
Definition: FileDiffWidget.cpp:120
void refrectScrollBarH()
横スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:872
ViewStyle
Definition: FileDiffWidget.h:60
@ LeftOnly
Definition: FileDiffWidget.h:63
@ SideBySideImage
Definition: FileDiffWidget.h:66
@ SingleFile
Definition: FileDiffWidget.h:62
@ RightOnly
Definition: FileDiffWidget.h:64
@ None
Definition: FileDiffWidget.h:61
@ SideBySideText
Definition: FileDiffWidget.h:65
Git::Object catFile(GitRunner g, QString const &id)
Definition: FileDiffWidget.cpp:134
void updateControls()
Definition: FileDiffWidget.cpp:177
void setRightOnly(const Git::Diff &diff, QByteArray const &ba)
Definition: FileDiffWidget.cpp:528
void setSingleFile(QByteArray const &ba, QString const &id, QString const &path)
Definition: FileDiffWidget.cpp:441
void setViewType(FileViewType type)
Definition: FileDiffWidget.cpp:108
void onDiffWidgetResized()
Definition: FileDiffWidget.cpp:772
void keyPressEvent(QKeyEvent *event) override
Definition: FileDiffWidget.cpp:720
bool setSubmodule(const Git::Diff &diff)
Definition: FileDiffWidget.cpp:489
void resetScrollBarValue()
Definition: FileDiffWidget.cpp:158
void setSideBySide_(const Git::Diff &diff, QByteArray const &ba_a, QByteArray const &ba_b, QString const &workingdir)
Definition: FileDiffWidget.cpp:579
void clearDiffView()
Definition: FileDiffWidget.cpp:144
FileDiffWidget(QWidget *parent=nullptr)
Definition: FileDiffWidget.cpp:44
Definition: Git.h:740
Definition: Git.h:205
Definition: MainWindow.h:90
Definition: AboutDialog.h:6
Definition: AbstractCharacterBasedApplication.h:53
Type
Definition: AbstractCharacterBasedApplication.h:54
@ Unknown
Definition: AbstractCharacterBasedApplication.h:55
Definition: FileDiffWidget.h:44
void clear()
Definition: FileDiffWidget.h:52
DiffData()
Definition: FileDiffWidget.h:48
ObjectContentPtr right
Definition: FileDiffWidget.h:46
std::vector< std::string > original_lines
Definition: FileDiffWidget.h:47
ObjectContentPtr left
Definition: FileDiffWidget.h:45
Definition: FileDiffWidget.h:89
QByteArray bytes_a
Definition: FileDiffWidget.h:91
QString workingdir
Definition: FileDiffWidget.h:95
bool uncommited
Definition: FileDiffWidget.h:94
Git::Diff diff
Definition: FileDiffWidget.h:93
QByteArray bytes_b
Definition: FileDiffWidget.h:92
ViewStyle view_style
Definition: FileDiffWidget.h:90
Definition: FileDiffWidget.h:69
int line_index
Definition: FileDiffWidget.h:71
int line_count
Definition: FileDiffWidget.h:72
LineFragment(Document::Line::Type type, int line_index, int line_count)
Definition: FileDiffWidget.h:74
Document::Line::Type type
Definition: FileDiffWidget.h:70
Definition: FileDiffWidget.cpp:26
Definition: Git.h:115
Definition: Git.h:74
Definition: Git.h:94
Definition: FileDiffWidget.h:26
QString id
Definition: FileDiffWidget.h:27
TextDiffLineList lines
Definition: FileDiffWidget.h:30
QString path
Definition: FileDiffWidget.h:28
QByteArray bytes
Definition: FileDiffWidget.h:29