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"
7 #include "MainWindow.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 
23 using TextDiffLineList = QList<Document::Line>;
24 
25 struct ObjectContent {
26  QString id;
27  QString path;
28  QByteArray bytes;
30 };
31 using ObjectContentPtr = std::shared_ptr<ObjectContent>;
32 
33 class QTableWidgetItem;
34 
39 class FileDiffWidget : public QWidget {
40  Q_OBJECT
41  friend class BigDiffWindow;
42 public:
43  struct DiffData {
46  std::vector<std::string> original_lines;
48  {
49  clear();
50  }
51  void clear()
52  {
53  left = std::make_shared<ObjectContent>();
54  right = std::make_shared<ObjectContent>();
55  original_lines.clear();
56  }
57  };
58 
59  enum ViewStyle {
66  };
67 
68  struct LineFragment {
72  LineFragment() = default;
74  : type(type)
77  {
78  }
79  };
80 
81 
82 private:
83  Ui::FileDiffWidget *ui;
84 
85  struct Private;
86  Private *m;
87 
88  struct InitParam_ {
89  ViewStyle view_style = ViewStyle::None;
90  QByteArray bytes_a;
91  QByteArray bytes_b;
93  bool uncommited = false;
94  QString workingdir;
95  };
96 
97  ViewStyle viewstyle() const;
98 
99  GitPtr git();
100  Git::Object catFile(QString const &id);
101 
102  int totalTextLines() const;
103 
104  void resetScrollBarValue();
105  void updateSliderCursor();
106 
107  int fileviewHeight() const;
108 
109  void setDiffText(const Git::Diff &diff, TextDiffLineList const &left, TextDiffLineList const &right);
110 
111 
112  void setLeftOnly(const Git::Diff &diff, QByteArray const &ba);
113  void setRightOnly(const Git::Diff &diff, QByteArray const &ba);
114  void setSideBySide(const Git::Diff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir);
115  void setSideBySide_(const Git::Diff &diff, QByteArray const &ba_a, QByteArray const &ba_b, QString const &workingdir);
116 
117  bool isValidID_(QString const &id);
118 
120 
121  void makeSideBySideDiffData(const Git::Diff &diff, const std::vector<std::string> &original_lines, TextDiffLineList *left_lines, TextDiffLineList *right_lines);
122  void onUpdateSliderBar();
123  void refrectScrollBar();
124  void refrectScrollBarV();
125  void refrectScrollBarH();
126  void setOriginalLines_(QByteArray const &ba, const Git::SubmoduleItem *submodule, const Git::CommitItem *submodule_commit);
127  QString diffObjects(QString const &a_id, QString const &b_id);
129  bool setSubmodule(const Git::Diff &diff);
130 protected:
131  void resizeEvent(QResizeEvent *) override;
132  void keyPressEvent(QKeyEvent *event) override;
133 public:
134  explicit FileDiffWidget(QWidget *parent = nullptr);
135  ~FileDiffWidget() override;
136 
137  void bind(MainWindow *mw);
138 
139  void clearDiffView();
140 
141  void setSingleFile(QByteArray const &ba, QString const &id, QString const &path);
142 
143  void updateControls();
144  void scrollToBottom();
145 
146  void updateDiffView(const Git::Diff &info, bool uncommited);
147  void updateDiffView(const QString &id_left, const QString &id_right, QString const &path = QString());
148 
149  void setMaximizeButtonEnabled(bool f);
150  void setFocusAcceptable(Qt::FocusPolicy focuspolicy);
151  QPixmap makeDiffPixmap(DiffPane pane, int width, int height);
152  void setViewType(FileViewType type);
153  void setTextCodec(QTextCodec *codec);
154  void setTextCodec(char const *name);
155 private slots:
158  void onDiffWidgetWheelScroll(int lines);
159  void onScrollValueChanged2(int value);
160  void onDiffWidgetResized();
162 
163  void scrollTo(int value);
164  void onMoved(int cur_row, int cur_col, int scr_row, int scr_col);
166 
167 signals:
168 // void moveNextItem();
169 // void movePreviousItem();
170  void textcodecChanged();
171 };
172 
173 #endif // FILEDIFFWIDGET_H
FileDiffWidget::updateSliderCursor
void updateSliderCursor()
Definition: FileDiffWidget.cpp:173
BigDiffWindow::init
void init(MainWindow *mw, const FileDiffWidget::InitParam_ &param)
Definition: BigDiffWindow.cpp:44
Git::Object::type
Type type
Definition: Git.h:84
misc::makeDateTimeString
static QString makeDateTimeString(const QDateTime &dt)
Definition: misc.cpp:199
Document::Line::Normal
@ Normal
Definition: AbstractCharacterBasedApplication.h:39
FileDiffWidget::ui
Ui::FileDiffWidget * ui
Definition: FileDiffWidget.h:83
FileDiffWidget::Private::init_param_
FileDiffWidget::InitParam_ init_param_
Definition: FileDiffWidget.cpp:28
FileDiffWidget::setDiffText
void setDiffText(const Git::Diff &diff, TextDiffLineList const &left, TextDiffLineList const &right)
Definition: FileDiffWidget.cpp:326
FileDiffWidget::Private
Definition: FileDiffWidget.cpp:26
ObjectContent::id
QString id
Definition: FileDiffWidget.h:26
FileDiffWidget::makeSideBySideDiffData
void makeSideBySideDiffData(const Git::Diff &diff, const std::vector< std::string > &original_lines, TextDiffLineList *left_lines, TextDiffLineList *right_lines)
Definition: FileDiffWidget.cpp:185
FileDiffWidget::onDiffWidgetWheelScroll
void onDiffWidgetWheelScroll(int lines)
Definition: FileDiffWidget.cpp:759
FileDiffWidget::DiffData
Definition: FileDiffWidget.h:43
FileDiffWidget::LineFragment::LineFragment
LineFragment(Document::Line::Type type, int line_index, int line_count)
Definition: FileDiffWidget.h:73
dtl::SES_ADD
const edit_t SES_ADD
Definition: variables.hpp:74
GitPtr
std::shared_ptr< Git > GitPtr
Definition: Git.h:38
ObjectContent::lines
TextDiffLineList lines
Definition: FileDiffWidget.h:29
FileDiffWidget::onMoved
void onMoved(int cur_row, int cur_col, int scr_row, int scr_col)
スクロール位置の行と桁を設定
Definition: FileDiffWidget.cpp:898
FileDiffWidget::setOriginalLines_
void setOriginalLines_(QByteArray const &ba, const Git::SubmoduleItem *submodule, const Git::CommitItem *submodule_commit)
Definition: FileDiffWidget.cpp:452
FileDiffWidget::Private::max_line_length
int max_line_length
Definition: FileDiffWidget.cpp:35
FileDiffWidget::LineFragment::type
Document::Line::Type type
Definition: FileDiffWidget.h:69
FileDiffWidget::SideBySideImage
@ SideBySideImage
Definition: FileDiffWidget.h:65
Git::Object::Type::BLOB
@ BLOB
FileDiffWidget::onUpdateSliderBar
void onUpdateSliderBar()
Definition: FileDiffWidget.cpp:799
Git::SubmoduleItem::id
Git::CommitID id
Definition: Git.h:90
Document::Line::type
Type type
Definition: AbstractCharacterBasedApplication.h:43
FileDiffWidget::setSideBySide_
void setSideBySide_(const Git::Diff &diff, QByteArray const &ba_a, QByteArray const &ba_b, QString const &workingdir)
Definition: FileDiffWidget.cpp:579
Git::CommitID::toQString
QString toQString(int maxlen=-1) const
Definition: Git.cpp:60
FileDiffWidget::InitParam_
Definition: FileDiffWidget.h:88
TextDiffLineList
QList< Document::Line > TextDiffLineList
Definition: FileDiffSliderWidget.h:12
FileDiffWidget::SingleFile
@ SingleFile
Definition: FileDiffWidget.h:61
DiffPane::Left
@ Left
FileDiffWidget::FileDiffWidget
FileDiffWidget(QWidget *parent=nullptr)
Definition: FileDiffWidget.cpp:45
FileDiffWidget::DiffData::clear
void clear()
Definition: FileDiffWidget.h:51
Document::Line::line_number
int line_number
Definition: AbstractCharacterBasedApplication.h:45
Document::Line::Del
@ Del
Definition: AbstractCharacterBasedApplication.h:41
TextEditorEnginePtr
std::shared_ptr< TextEditorEngine > TextEditorEnginePtr
Definition: AbstractCharacterBasedApplication.h:132
HunkItem::hunk_number
int hunk_number
Definition: MainWindow.h:53
FileDiffWidget::Private::text_codec
QTextCodec * text_codec
Definition: FileDiffWidget.cpp:40
FileDiffWidget::SideBySideText
@ SideBySideText
Definition: FileDiffWidget.h:64
AbstractCharacterBasedApplication::CharAttr
Definition: AbstractCharacterBasedApplication.h:189
FileDiffWidget::InitParam_::bytes_b
QByteArray bytes_b
Definition: FileDiffWidget.h:91
FileDiffWidget::Private::term_cursor_row
int term_cursor_row
Definition: FileDiffWidget.cpp:37
FileDiffWidget::ViewStyle
ViewStyle
Definition: FileDiffWidget.h:59
Git::Diff::BLOB_AB_::b_id_or_path
QString b_id_or_path
Definition: Git.h:208
FileDiffWidget::InitParam_::workingdir
QString workingdir
Definition: FileDiffWidget.h:94
ApplicationGlobal::theme
ThemePtr theme
Definition: ApplicationGlobal.h:47
FileDiffWidget::onVerticalScrollValueChanged
void onVerticalScrollValueChanged(int)
縦スクロールバーが操作された
Definition: FileDiffWidget.cpp:746
FileViewWidget.h
Git::Diff::mode
QString mode
Definition: Git.h:205
FileDiffWidget::m
Private * m
Definition: FileDiffWidget.h:85
FileDiffWidget::InitParam_::diff
Git::Diff diff
Definition: FileDiffWidget.h:92
FileDiffWidget::Private::right_lines
TextDiffLineList right_lines
Definition: FileDiffWidget.cpp:34
dtl::SES_DELETE
const edit_t SES_DELETE
Definition: variables.hpp:72
FileDiffSliderWidget::valueChanged
void valueChanged(int value)
FileDiffWidget::DiffData::left
ObjectContentPtr left
Definition: FileDiffWidget.h:44
HunkItem::pos
size_t pos
Definition: MainWindow.h:54
FileDiffWidget::Private::left_lines
TextDiffLineList left_lines
Definition: FileDiffWidget.cpp:33
dtl::SES_COMMON
const edit_t SES_COMMON
Definition: variables.hpp:73
Git::Diff::a_submodule
struct Git::Diff::SubmoduleDetail a_submodule
FileDiffWidget::refrectScrollBarH
void refrectScrollBarH()
横スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:876
TextEditorView::FormattedLines
Definition: TextEditorView.h:43
MainWindow::determinFileType
QString determinFileType(QByteArray in)
Definition: MainWindow.cpp:5374
FileViewType::None
@ None
ObjectContent::path
QString path
Definition: FileDiffWidget.h:27
MainWindow::newTempFilePath
QString newTempFilePath()
Definition: MainWindow.cpp:2401
FileDiffWidget::LineFragment
Definition: FileDiffWidget.h:68
Git::Object::Type::UNKNOWN
@ UNKNOWN
FileViewType::Text
@ Text
Document::Line::Type
Type
Definition: AbstractCharacterBasedApplication.h:37
FileDiffWidget::refrectScrollBar
void refrectScrollBar()
スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:811
Theme.h
PATH_PREFIX
#define PATH_PREFIX
Definition: ApplicationGlobal.h:63
FileDiffWidget::on_toolButton_menu_clicked
void on_toolButton_menu_clicked()
Definition: FileDiffWidget.cpp:922
FileDiffWidget::Private::term_cursor_col
int term_cursor_col
Definition: FileDiffWidget.cpp:38
FileDiffWidget::onScrollValueChanged2
void onScrollValueChanged2(int value)
Definition: FileDiffWidget.cpp:771
GitDiff::diffObjects
static QString diffObjects(GitPtr g, QString const &a_id, QString const &b_id)
Definition: GitDiff.cpp:69
ObjectContent::bytes
QByteArray bytes
Definition: FileDiffWidget.h:28
ObjectContentPtr
std::shared_ptr< ObjectContent > ObjectContentPtr
Definition: FileDiffWidget.h:31
FileDiffWidget::updateControls
void updateControls()
Definition: FileDiffWidget.cpp:180
EscapeCode::Right
@ Right
Definition: AbstractCharacterBasedApplication.h:19
FileDiffWidget::setSideBySide
void setSideBySide(const Git::Diff &diff, QByteArray const &ba, bool uncommited, QString const &workingdir)
Definition: FileDiffWidget.cpp:553
FileDiffWidget::on_toolButton_fullscreen_clicked
void on_toolButton_fullscreen_clicked()
Definition: FileDiffWidget.cpp:781
FileDiffWidget::DiffData::DiffData
DiffData()
Definition: FileDiffWidget.h:47
misc.h
FileDiffWidget::setupPreviewWidget
FileViewType setupPreviewWidget()
テキストか画像かでビューを切り替える
Definition: FileDiffWidget.cpp:413
ObjectContent
Definition: FileDiffWidget.h:25
Ui
Definition: AboutDialog.h:6
MainWindow
Definition: MainWindow.h:58
DiffPane::Right
@ Right
FileDiffWidget::InitParam_::bytes_a
QByteArray bytes_a
Definition: FileDiffWidget.h:90
Git::SubmoduleItem::name
QString name
Definition: Git.h:89
TextEditorView::FormattedLines::chars
std::vector< Char > * chars(size_t i)
Definition: TextEditorView.h:67
MainWindow::catFile
Git::Object catFile(const QString &id)
Definition: MainWindow.cpp:4033
Git::SubmoduleItem::url
QString url
Definition: Git.h:93
Git::Diff::SubmoduleDetail::commit
Git::CommitItem commit
Definition: Git.h:213
FileDiffWidget::LeftOnly
@ LeftOnly
Definition: FileDiffWidget.h:62
FileDiffWidget::textcodecChanged
void textcodecChanged()
Git::Diff::b_submodule
struct Git::Diff::SubmoduleDetail b_submodule
TextEditorView::FormattedLines::size
size_t size() const
Definition: TextEditorView.h:55
FileDiffWidget::setLeftOnly
void setLeftOnly(const Git::Diff &diff, QByteArray const &ba)
Definition: FileDiffWidget.cpp:466
HunkItem
Definition: MainWindow.h:51
FileDiffWidget::Private::engine_right
TextEditorEnginePtr engine_right
Definition: FileDiffWidget.cpp:32
FileDiffWidget::LineFragment::line_index
int line_index
Definition: FileDiffWidget.h:70
AbstractCharacterBasedApplication::Char
Definition: AbstractCharacterBasedApplication.h:228
Git::SubmoduleItem
Definition: Git.h:88
AbstractCharacterBasedApplication.h
FileDiffWidget::Private::original_lines
std::vector< std::string > original_lines
Definition: FileDiffWidget.cpp:30
FileDiffWidget::~FileDiffWidget
~FileDiffWidget() override
Definition: FileDiffWidget.cpp:85
joinpath.h
Git::Object::content
QByteArray content
Definition: Git.h:85
GitDiff::parseDiff
static void parseDiff(std::string const &s, const Git::Diff *info, Git::Diff *out)
Definition: GitDiff.cpp:85
misc::splitLines
static QStringList splitLines(QByteArray const &ba, std::function< QString(char const *ptr, size_t len)> const &tos)
QByteArrayの文字列を行に分割する。
Definition: misc.cpp:33
BigDiffWindow.h
FileDiffWidget::Private::linefragmentpair
std::vector< std::pair< LineFragment, LineFragment > > linefragmentpair
Definition: FileDiffWidget.cpp:42
Git::CommitItemList
Definition: Git.h:131
EscapeCode::Left
@ Left
Definition: AbstractCharacterBasedApplication.h:20
dtl.hpp
FileDiffSliderWidget::makeDiffPixmap
QPixmap makeDiffPixmap(DiffPane pane, int width, int height)
Definition: FileDiffSliderWidget.cpp:39
FileDiffWidget::setFocusAcceptable
void setFocusAcceptable(Qt::FocusPolicy focuspolicy)
Definition: FileDiffWidget.cpp:793
FileDiffWidget::None
@ None
Definition: FileDiffWidget.h:60
FileViewType
FileViewType
Definition: FileViewWidget.h:15
MainWindow::themeForTextEditor
TextEditorThemePtr themeForTextEditor()
Definition: MainWindow.cpp:5413
FileDiffWidget::onDiffWidgetResized
void onDiffWidgetResized()
Definition: FileDiffWidget.cpp:776
ViewType::None
@ None
DiffPane
DiffPane
Definition: FileDiffSliderWidget.h:14
Git.h
FileDiffWidget::fileviewHeight
int fileviewHeight() const
Definition: FileDiffWidget.cpp:156
FileDiffWidget::bind
void bind(MainWindow *mw)
スクロールバーのセットアップ
Definition: FileDiffWidget.cpp:95
FileDiffWidget::resizeEvent
void resizeEvent(QResizeEvent *) override
Definition: FileDiffWidget.cpp:719
FileDiffWidget::setMaximizeButtonEnabled
void setMaximizeButtonEnabled(bool f)
Definition: FileDiffWidget.cpp:117
FileDiffWidget::updateDiffView
void updateDiffView(const Git::Diff &info, bool uncommited)
差分ビューを更新
Definition: FileDiffWidget.cpp:647
FileDiffWidget::clearDiffView
void clearDiffView()
Definition: FileDiffWidget.cpp:147
Git::Diff::path
QString path
Definition: Git.h:204
FileDiffWidget::makeDiffPixmap
QPixmap makeDiffPixmap(DiffPane pane, int width, int height)
Definition: FileDiffWidget.cpp:881
MainWindow.h
Git::isValidID
static bool isValidID(QString const &id)
Definition: Git.cpp:154
dtl::Diff
Definition: Diff.hpp:48
DiffIndexRole
@ DiffIndexRole
Definition: FileDiffWidget.cpp:23
Git::Diff::hunks
QList< Hunk > hunks
Definition: Git.h:210
Git::Diff::SubmoduleDetail::item
Git::SubmoduleItem item
Definition: Git.h:212
FileDiffWidget::totalTextLines
int totalTextLines() const
Definition: FileDiffWidget.cpp:142
FileDiffWidget::setSubmodule
bool setSubmodule(const Git::Diff &diff)
Definition: FileDiffWidget.cpp:489
global
ApplicationGlobal * global
Definition: main.cpp:33
ViewType
ViewType
Definition: FileDiffWidget.h:16
FileDiffWidget::viewstyle
ViewStyle viewstyle() const
Definition: FileDiffWidget.cpp:123
Document::Line::Unknown
@ Unknown
Definition: AbstractCharacterBasedApplication.h:38
FileDiffWidget::resetScrollBarValue
void resetScrollBarValue()
Definition: FileDiffWidget.cpp:161
FileDiffWidget::RightOnly
@ RightOnly
Definition: FileDiffWidget.h:63
Git::CommitItem
Definition: Git.h:109
Git::Diff
Definition: Git.h:189
Git::Diff::blob
struct Git::Diff::BLOB_AB_ blob
FileDiffWidget::InitParam_::view_style
ViewStyle view_style
Definition: FileDiffWidget.h:89
FileDiffWidget::DiffData::right
ObjectContentPtr right
Definition: FileDiffWidget.h:45
FileDiffWidget
The FileDiffWidget class サイドバイサイドで2つのファイルのdiffを表示するウィジェット
Definition: FileDiffWidget.h:39
TextDiffLine
Document::Line TextDiffLine
Definition: FileDiffSliderWidget.h:11
dtl::Diff::compose
void compose()
Definition: Diff.hpp:260
MainWindow::git
GitPtr git(const QString &dir, const QString &submodpath, const QString &sshkey) const
Definition: MainWindow.cpp:5199
FileDiffWidget::Private::commit_item_list
Git::CommitItemList commit_item_list
Definition: FileDiffWidget.cpp:29
Git::SubmoduleItem::path
QString path
Definition: Git.h:91
FileDiffWidget::DiffData::original_lines
std::vector< std::string > original_lines
Definition: FileDiffWidget.h:46
dtl::Diff::getSes
Ses< elem > getSes() const
Definition: Diff.hpp:113
FileDiffWidget::isValidID_
bool isValidID_(QString const &id)
コミットIDの検証
Definition: FileDiffWidget.cpp:634
HunkItem::len
size_t len
Definition: MainWindow.h:54
FileDiffWidget::LineFragment::LineFragment
LineFragment()=default
FileViewType::Image
@ Image
misc::isImage
static bool isImage(QString const &mimetype)
Definition: misc.cpp:393
Document::Line::text
QByteArray text
Definition: AbstractCharacterBasedApplication.h:47
Git::Object
Definition: Git.h:72
Document::Line::hunk_number
int hunk_number
Definition: AbstractCharacterBasedApplication.h:44
FileDiffWidget::LineFragment::line_count
int line_count
Definition: FileDiffWidget.h:71
FileDiffSliderWidget.h
BigDiffWindow
Definition: BigDiffWindow.h:12
FileDiffWidget::setViewType
void setViewType(FileViewType type)
Definition: FileDiffWidget.cpp:111
FileDiffWidget::scrollTo
void scrollTo(int value)
Definition: FileDiffWidget.cpp:738
ApplicationGlobal.h
FileDiffWidget::diffObjects
QString diffObjects(QString const &a_id, QString const &b_id)
Definition: FileDiffWidget.cpp:601
Document::Line
Definition: AbstractCharacterBasedApplication.h:36
FileDiffWidget::onHorizontalScrollValueChanged
void onHorizontalScrollValueChanged(int)
横スクロールバーが操作された
Definition: FileDiffWidget.cpp:754
FileDiffWidget::Private::engine_left
TextEditorEnginePtr engine_left
Definition: FileDiffWidget.cpp:31
TextEditorView::moved
void moved(int cur_row, int cur_col, int scr_row, int scr_col)
Document::Line::Add
@ Add
Definition: AbstractCharacterBasedApplication.h:40
FileDiffWidget::git
GitPtr git()
Definition: FileDiffWidget.cpp:128
FileDiffWidget::keyPressEvent
void keyPressEvent(QKeyEvent *event) override
Definition: FileDiffWidget.cpp:724
FileDiffWidget::setTextCodec
void setTextCodec(QTextCodec *codec)
Definition: FileDiffWidget.cpp:908
Git::Diff::BLOB_AB_::a_id_or_path
QString a_id_or_path
Definition: Git.h:207
FileDiffWidget::setRightOnly
void setRightOnly(const Git::Diff &diff, QByteArray const &ba)
Definition: FileDiffWidget.cpp:528
GitDiff.h
FileDiffWidget::refrectScrollBarV
void refrectScrollBarV()
縦スクロールバーの状態を反映
Definition: FileDiffWidget.cpp:868
FileDiffWidget::catFile
Git::Object catFile(QString const &id)
Definition: FileDiffWidget.cpp:137
FileDiffWidget::Private::mainwindow
MainWindow * mainwindow
Definition: FileDiffWidget.cpp:27
FileDiffWidget::scrollToBottom
void scrollToBottom()
Definition: FileDiffWidget.cpp:167
FileDiffWidget::InitParam_::uncommited
bool uncommited
Definition: FileDiffWidget.h:93
FileDiffWidget::setSingleFile
void setSingleFile(QByteArray const &ba, QString const &id, QString const &path)
Definition: FileDiffWidget.cpp:443
HunkItem::lines
std::vector< std::string > lines
Definition: MainWindow.h:55
FileDiffWidget::mainwindow
MainWindow * mainwindow()
Definition: FileDiffWidget.cpp:106
FileDiffWidget.h