Guitar
FileDiffWidget.h
Go to the documentation of this file.
1 
2 #ifndef FILEDIFFWIDGET_H
3 #define FILEDIFFWIDGET_H
4 
5 #include "FileViewWidget.h"
6 #include "FileDiffSliderWidget.h"
7 #include "GitRunner.h"
9 #include <QDialog>
10 #include <memory>
11 
12 namespace Ui {
13 class FileDiffWidget;
14 }
15 
16 enum class ViewType {
17  None,
18  Left,
19  Right
20 };
21 
22 class MainWindow;
23 
25 using TextDiffLineList = std::vector<Document::Line>;
26 
27 struct ObjectContent {
28  QString id;
29  QString path;
30  QByteArray bytes;
32 };
33 using ObjectContentPtr = std::shared_ptr<ObjectContent>;
34 
35 class QTableWidgetItem;
36 
41 class FileDiffWidget : public QWidget {
42  Q_OBJECT
43  friend class BigDiffWindow;
44 public:
45  struct DiffData {
48  std::vector<std::string> original_lines;
50  {
51  clear();
52  }
53  void clear()
54  {
55  left = std::make_shared<ObjectContent>();
56  right = std::make_shared<ObjectContent>();
57  original_lines.clear();
58  }
59  };
60 
61  // enum DiffViewStyle {
62  // SideBySide,
63  // Inline,
64  // };
65 
66  enum ViewStyle {
68  // SingleFile,
74  };
75 
76  struct LineFragment {
77  Document::LineType type = Document::LineType::Unknown;
80  LineFragment() = default;
82  : type(type)
85  {
86  }
87  };
88 
89  struct TextDiffData {
90  std::vector<std::string> original_lines;
94  };
95 
96 private:
97  Ui::FileDiffWidget *ui;
98 
99  struct Private;
101 
102  struct InitParam_ {
103  ViewStyle view_style = ViewStyle::None;
104  QByteArray bytes_a;
105  QByteArray bytes_b;
107  bool uncommitted = false;
108  QString workingdir;
109  };
110 
112 
113  ViewStyle viewstyle() const;
114  void setViewStyle(ViewStyle diffstyle);
115 
116  GitRunner git();
117  GitObject catFile(GitRunner g, const std::string &id);
118 
119  int totalTextLines() const;
120 
121  void resetScrollBarValue();
122  void updateSliderCursor();
123 
124  int fileviewHeight() const;
125 
126  void setDiffText(GitDiff const &diff, TextDiffData const &data);
127 
128  void setLeftOnlyDiff(const GitDiff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir);
129  void setRightOnlyDiff(const GitDiff &diff, QByteArray const &ba, bool uncommited, const QString &workingdir);
130 private:
131  TextDiffData makeSideBySideDiffData(const GitDiff &diff, const std::vector<std::string> &original_lines);
132  void _setDiff(ViewStyle viewstyle, const GitDiff &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir);
133  bool isSideBySideView() const;
134 public:
135  void setSideBySideDiff(const GitDiff &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir);
136  void setInlineDiff(GitDiff const &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir);
137 
138  void setSideBySideBlobDiff(const GitDiff &diff, QByteArray const &ba_a, QByteArray const &ba_b, bool uncommitted, QString const &workingdir);
139 
140  bool isValidID(std::string const &id);
141 
143 
144  void onUpdateSliderBar();
145  void reflectScrollBar();
146  void reflectScrollBarV();
147  void reflectScrollBarH();
148  void setOriginalLines_(QByteArray const &ba, const GitSubmoduleItem *submodule, const GitCommitItem *submodule_commit);
149  std::string diffObjects(const std::string &a_id, const std::string &b_id);
150  bool setSubmodule(const GitDiff &diff);
151 protected:
152  void resizeEvent(QResizeEvent *) override;
153  void keyPressEvent(QKeyEvent *event) override;
154 public:
155  explicit FileDiffWidget(QWidget *parent = nullptr);
156  ~FileDiffWidget() override;
157 
158  void init();
159 
160  void clearDiffView();
161 
162  // void setSingleFile(QByteArray const &ba, QString const &id, QString const &path);
163 
164  void updateControls();
165  void scrollToBottom();
166 
167  void updateDiffView(const GitDiff &info, bool uncommited);
168  void updateDiffView(const std::string &id_left, const std::string &id_right, const std::string &path);
169 
170  void setMaximizeButtonEnabled(bool f);
171  void setFocusAcceptable(Qt::FocusPolicy focuspolicy);
172  QPixmap makeDiffPixmap(DiffPane pane, int width, int height);
173  void setViewType(FileViewType type);
174 private slots:
175  void onVerticalScrollValueChanged(int value);
176  void onHorizontalScrollValueChanged(int value);
177  void onDiffWidgetWheelScroll(int lines);
178  // void onScrollValueChanged2(int value);
179  void onDiffWidgetResized();
181 
182  void scrollTo(int value);
183  void onMoved(int cur_row, int cur_col, int scr_row, int scr_col);
185 
186  void onVerticalScrollValueChanged_inline(int value);
188 
189 signals:
190  // void moveNextItem();
191  // void movePreviousItem();
193 };
194 
195 #endif // FILEDIFFWIDGET_H
std::vector< Document::Line > TextDiffLineList
Definition: FileDiffSliderWidget.h:11
DiffPane
Definition: FileDiffSliderWidget.h:13
ViewType
Definition: FileDiffWidget.h:16
std::shared_ptr< ObjectContent > ObjectContentPtr
Definition: FileDiffWidget.h:33
FileViewType
Definition: FileViewWidget.h:15
Definition: BigDiffWindow.h:11
LineType
Definition: AbstractCharacterBasedApplication.h:80
The FileDiffWidget class サイドバイサイドで2つのファイルのdiffを表示するウィジェット
Definition: FileDiffWidget.h:41
Ui::FileDiffWidget * ui
Definition: FileDiffWidget.h:97
void resizeEvent(QResizeEvent *) override
Definition: FileDiffWidget.cpp:680
QPixmap makeDiffPixmap(DiffPane pane, int width, int height)
Definition: FileDiffWidget.cpp:956
void setFocusAcceptable(Qt::FocusPolicy focuspolicy)
Definition: FileDiffWidget.cpp:734
void on_toolButton_menu_clicked()
Definition: FileDiffWidget.cpp:983
Private * m
Definition: FileDiffWidget.h:99
void setLeftOnlyDiff(const GitDiff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir)
Definition: FileDiffWidget.cpp:538
TextDiffData makeSideBySideDiffData(const GitDiff &diff, const std::vector< std::string > &original_lines)
Definition: FileDiffWidget.cpp:240
MainWindow * mainwindow()
Definition: FileDiffWidget.cpp:102
bool isSideBySideView() const
Definition: FileDiffWidget.cpp:112
std::string diffObjects(const std::string &a_id, const std::string &b_id)
Definition: FileDiffWidget.cpp:576
GitRunner git()
Definition: FileDiffWidget.cpp:166
void setViewStyle(ViewStyle diffstyle)
Definition: FileDiffWidget.cpp:118
void textcodecChanged()
void setRightOnlyDiff(const GitDiff &diff, QByteArray const &ba, bool uncommited, const QString &workingdir)
Definition: FileDiffWidget.cpp:543
void on_toolButton_fullscreen_clicked()
Definition: FileDiffWidget.cpp:722
bool isValidID(std::string const &id)
コミットIDの検証
Definition: FileDiffWidget.cpp:586
FileViewType setupPreviewWidget()
テキストか画像かでビューを切り替える
Definition: FileDiffWidget.cpp:446
void reflectScrollBarV()
縦スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:943
void onHorizontalScrollValueChanged_inline(int value)
Definition: FileDiffWidget.cpp:1019
void onVerticalScrollValueChanged_inline(int value)
Definition: FileDiffWidget.cpp:1013
~FileDiffWidget() override
Definition: FileDiffWidget.cpp:96
void scrollTo(int value)
Definition: FileDiffWidget.cpp:699
void setSideBySideBlobDiff(const GitDiff &diff, QByteArray const &ba_a, QByteArray const &ba_b, bool uncommitted, QString const &workingdir)
Definition: FileDiffWidget.cpp:558
void init()
スクロールバーのセットアップ
Definition: FileDiffWidget.cpp:139
void onHorizontalScrollValueChanged(int value)
Definition: FileDiffWidget.cpp:1007
void _setDiff(ViewStyle viewstyle, const GitDiff &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir)
Definition: FileDiffWidget.cpp:491
int fileviewHeight() const
Definition: FileDiffWidget.cpp:207
void onUpdateSliderBar()
Definition: FileDiffWidget.cpp:740
GitObject catFile(GitRunner g, const std::string &id)
Definition: FileDiffWidget.cpp:175
bool setSubmodule(const GitDiff &diff)
Definition: FileDiffWidget.cpp:407
void scrollToBottom()
Definition: FileDiffWidget.cpp:222
void setDiffText(GitDiff const &diff, TextDiffData const &data)
Definition: FileDiffWidget.cpp:355
void updateSliderCursor()
Definition: FileDiffWidget.cpp:228
void setMaximizeButtonEnabled(bool f)
Definition: FileDiffWidget.cpp:160
int totalTextLines() const
Definition: FileDiffWidget.cpp:194
void onVerticalScrollValueChanged(int value)
Definition: FileDiffWidget.cpp:1001
void updateDiffView(const GitDiff &info, bool uncommited)
差分ビューを更新
Definition: FileDiffWidget.cpp:602
void onDiffWidgetWheelScroll(int lines)
Definition: FileDiffWidget.cpp:705
void reflectScrollBarH()
横スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:951
void onMoved(int cur_row, int cur_col, int scr_row, int scr_col)
スクロール位置の行と桁を設定
Definition: FileDiffWidget.cpp:973
ViewStyle viewstyle() const
Definition: FileDiffWidget.cpp:107
ViewStyle
Definition: FileDiffWidget.h:66
@ LeftOnly
Definition: FileDiffWidget.h:69
@ SideBySideBinaryDiff
Definition: FileDiffWidget.h:73
@ InlineTextDiff
Definition: FileDiffWidget.h:71
@ RightOnly
Definition: FileDiffWidget.h:70
@ None
Definition: FileDiffWidget.h:67
@ SideBySideTextDiff
Definition: FileDiffWidget.h:72
void setInlineDiff(GitDiff const &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir)
Definition: FileDiffWidget.cpp:553
void setOriginalLines_(QByteArray const &ba, const GitSubmoduleItem *submodule, const GitCommitItem *submodule_commit)
Definition: FileDiffWidget.cpp:475
void updateControls()
Definition: FileDiffWidget.cpp:235
void setViewType(FileViewType type)
Definition: FileDiffWidget.cpp:153
void setSideBySideDiff(const GitDiff &diff, QByteArray const &ba, bool uncommitted, QString const &workingdir)
Definition: FileDiffWidget.cpp:548
void onDiffWidgetResized()
Definition: FileDiffWidget.cpp:717
void keyPressEvent(QKeyEvent *event) override
Definition: FileDiffWidget.cpp:685
void reflectScrollBar()
スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:915
void resetScrollBarValue()
Definition: FileDiffWidget.cpp:212
void clearDiffView()
Definition: FileDiffWidget.cpp:199
FileDiffWidget(QWidget *parent=nullptr)
Definition: FileDiffWidget.cpp:53
Definition: GitDiff.h:16
Definition: GitRunner.h:21
Definition: MainWindow.h:49
Definition: AboutDialog.h:6
Definition: AbstractCharacterBasedApplication.h:86
Definition: FileDiffWidget.h:45
void clear()
Definition: FileDiffWidget.h:53
DiffData()
Definition: FileDiffWidget.h:49
ObjectContentPtr right
Definition: FileDiffWidget.h:47
std::vector< std::string > original_lines
Definition: FileDiffWidget.h:48
ObjectContentPtr left
Definition: FileDiffWidget.h:46
Definition: FileDiffWidget.h:102
QByteArray bytes_a
Definition: FileDiffWidget.h:104
bool uncommitted
Definition: FileDiffWidget.h:107
QString workingdir
Definition: FileDiffWidget.h:108
GitDiff diff
Definition: FileDiffWidget.h:106
QByteArray bytes_b
Definition: FileDiffWidget.h:105
ViewStyle view_style
Definition: FileDiffWidget.h:103
Definition: FileDiffWidget.h:76
int line_index
Definition: FileDiffWidget.h:78
LineFragment(Document::LineType type, int line_index, int line_count)
Definition: FileDiffWidget.h:81
int line_count
Definition: FileDiffWidget.h:79
Document::LineType type
Definition: FileDiffWidget.h:77
Definition: FileDiffWidget.cpp:33
Definition: FileDiffWidget.h:89
TextDiffLineList left_lines
Definition: FileDiffWidget.h:91
TextDiffLineList inline_lines
Definition: FileDiffWidget.h:93
TextDiffLineList right_lines
Definition: FileDiffWidget.h:92
std::vector< std::string > original_lines
Definition: FileDiffWidget.h:90
Definition: GitCommitItem.h:21
Definition: GitObject.h:7
Definition: GitSubmodule.h:7
Definition: FileDiffWidget.h:27
QString id
Definition: FileDiffWidget.h:28
TextDiffLineList lines
Definition: FileDiffWidget.h:31
QString path
Definition: FileDiffWidget.h:29
QByteArray bytes
Definition: FileDiffWidget.h:30