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 CommitInfoPanel;
30class GitBase;
31class QPinnableTabWidget;
32class IDiffWidget;
33class QVBoxLayout;
34class FileListWidget;
35class GitCache;
36class QListWidgetItem;
37
38/*!
39 \brief The DiffWidget class creates the layout to display the dif information for both files and commits.
40
41*/
42class DiffWidget : public QFrame
43{
44 Q_OBJECT
45
46signals:
47 /*!
48 \brief Signal triggered when the user wants to see the history and blame of a given file.
49
50 \param fileName The full file name.
51 */
52 void signalShowFileHistory(const QString &fileName);
53 /*!
54 \brief Signal triggered when the user close the last diff opened. This signal is used to disable the button in the
55 Controls widget and return to the last view.
56
57 */
58 void signalDiffEmpty();
59
60public:
61 /*!
62 \brief Default constructor.
63
64 \param git The git object to perform Git operations.
65 \param cache The internal repository cache for the repository.
66 \param parent The parent wiget if needed.
67 */
68 explicit DiffWidget(const QSharedPointer<GitBase> git, QSharedPointer<GitCache> cache, QWidget *parent = nullptr);
69 /*!
70 \brief Destructor
71
72 */
73 ~DiffWidget() override;
74
75 /*!
76 \brief Reloads the information currently shown in the diff.
77
78 */
79 void reload();
80
81 /*!
82 \brief Clears the information in the current diff.
83
84 */
85 void clear() const;
86 /*!
87 \brief Loads a file diff.
88
89 \param sha The current SHA as base.
90 \param previousSha The SHA to compare to.
91 \param file The file to show the diff of.
92 \return bool Returns true if the file diff was loaded correctly.
93 */
94 bool loadFileDiff(const QString &sha, const QString &previousSha, const QString &file, bool isCached);
95 /*!
96 \brief Loads a full commit diff.
97
98 \param sha The base SHA.
99 \param parentSha The SHA to compare to.
100 \return True if the load was successful, otherwise false.
101 */
102 bool loadCommitDiff(const QString &sha, const QString &parentSha);
103
104private:
105 QSharedPointer<GitBase> mGit;
106 QSharedPointer<GitCache> mCache;
107 CommitInfoPanel *mInfoPanelBase = nullptr;
108 CommitInfoPanel *mInfoPanelParent = nullptr;
109 QPinnableTabWidget *mCenterStackedWidget = nullptr;
110 QMap<QString, IDiffWidget *> mDiffWidgets;
111 FileListWidget *fileListWidget = nullptr;
112 QString mCurrentSha;
113 QString mParentSha;
114
115 /*!
116 \brief When the user selects a different diff from a different tab, it changes the information in the commit info
117 panel.
118
119 \param index The new selected index.
120 */
121 void changeSelection(int index);
122
123 /**
124 * @brief onTabClosed Removes the IDiffWidget from the map.
125 * @param index The index to be closed.
126 */
127 void onTabClosed(int index);
128
129 void onDoubleClick(QListWidgetItem *item);
130};
131