1#pragma once
2
3/****************************************************************************************
4 ** GitQlient is an application to manage and operate one or several Git repositories. With
5 ** GitQlient you will be able to add commits, branches and manage all the options Git provides.
6 ** Copyright (C) 2021 Francesc Martinez
7 **
8 ** LinkedIn: www.linkedin.com/in/cescmm/
9 ** Web: www.francescmm.com
10 **
11 ** This program is free software; you can redistribute it and/or
12 ** modify it under the terms of the GNU Lesser General Public
13 ** License as published by the Free Software Foundation; either
14 ** version 2 of the License, or (at your option) any later version.
15 **
16 ** This program is distributed in the hope that it will be useful,
17 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ** Lesser General Public License for more details.
20 **
21 ** You should have received a copy of the GNU Lesser General Public
22 ** License along with this library; if not, write to the Free Software
23 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 ***************************************************************************************/
25
26#include <QFrame>
27#include <QMap>
28
29class GitBase;
30class QVBoxLayout;
31class QPushButton;
32class MergeInfoWidget;
33class QLineEdit;
34class QTextEdit;
35class FileDiffWidget;
36class RevisionFiles;
37class GitCache;
38class QListWidget;
39class QListWidgetItem;
40class QStackedWidget;
41
42/**
43 * @brief The MergeWidget class creates the layout for when a merge happens. The layout is composed by two lists of
44 * ConflictButton in the left side: one for the conflict files and the other for the auto-merged files. Below this lists
45 * appears the description for the merge message and two buttons: abort merge and commit.
46 *
47 * In the center and right part of the view, there are shown the files that the user selects using the ConflictButton
48 * buttons.
49 *
50 */
51class MergeWidget : public QFrame
52{
53 Q_OBJECT
54
55signals:
56 /**
57 * @brief Signal triggered when the merge ends. It can be by aborting it or by committing it.
58 *
59 */
60 void signalMergeFinished();
61
62public:
63 enum class ConflictReason
64 {
65 Merge,
66 CherryPick,
67 Pull
68 };
69
70 /**
71 * @brief Default constructor.
72 *
73 * @param gitQlientCache The internal cache for the current repository.
74 * @param git The git object to perform Git operations.
75 * @param parent The parent widget if needed.
76 */
77 explicit MergeWidget(const QSharedPointer<GitCache> &gitQlientCache, const QSharedPointer<GitBase> &git,
78 QWidget *parent = nullptr);
79
80 /**
81 * @brief Configures the merge widget by giving the current revisions files that are part of the merge.
82 *
83 * @param files The RevisionFiles data.
84 */
85 void configure(const RevisionFiles &files, ConflictReason reason);
86
87 /**
88 * @brief Configures the merge widget by giving the current revisions files that are part of the merge.
89 *
90 * @param files The RevisionFiles data.
91 */
92 void configureForCherryPick(const RevisionFiles &files, const QStringList &pendingShas = QStringList());
93
94private:
95 QSharedPointer<GitCache> mGitQlientCache;
96 QSharedPointer<GitBase> mGit;
97 QListWidget *mConflictFiles = nullptr;
98 QListWidget *mMergedFiles = nullptr;
99 QLineEdit *mCommitTitle = nullptr;
100 QTextEdit *mDescription = nullptr;
101 QPushButton *mMergeBtn = nullptr;
102 QPushButton *mAbortBtn = nullptr;
103 ConflictReason mReason = ConflictReason::Merge;
104 QStackedWidget *mStacked = nullptr;
105 FileDiffWidget *mFileDiff = nullptr;
106 QStringList mPendingShas;
107
108 /**
109 * @brief Fills both lists of ConflictButton.
110 *
111 * @param files The RevisionFiles data that contains the list of files.
112 */
113 void fillButtonFileList(const RevisionFiles &files);
114 /**
115 * @brief Changes the current diff view of a file when a file in the list is clicked.
116 *
117 * @param item The selected item of the list.
118 */
119 void changeDiffView(QListWidgetItem *item);
120 /**
121 * @brief Aborts the current merge.
122 *
123 */
124 void abort();
125 /**
126 * @brief Commits the current merge.
127 *
128 */
129 void commit();
130 /**
131 * @brief This method removes all the handmade components before closing the merge view.
132 *
133 */
134 void removeMergeComponents();
135 /**
136 * @brief When a conflict is marked as resolved the button is moved to the solved list. This action is triggered by a
137 * ConflictButton.
138 * @param fileName The file name of the file whose conflict is resolved.
139 */
140 void onConflictResolved(const QString &fileName);
141
142 void cherryPickCommit();
143};
144