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 <QStyledItemDelegate>
27#include <QDateTime>
28
29class CommitHistoryView;
30class GitCache;
31class GitBase;
32class Lane;
33class CommitInfo;
34class GitServerCache;
35
36namespace GitServer
37{
38struct PullRequest;
39}
40
41const int ROW_HEIGHT = 25;
42const int LANE_WIDTH = 3 * ROW_HEIGHT / 4;
43
44/**
45 * @brief The RepositoryViewDelegate class is the delegate overloads the paint functionality in the RepositoryView. This
46 * class is the responsible of painting the graph of the repository. In addition to paint all the columns, implements
47 * special functionality to paint the tags, the branch names and how they are represented (local or remote)
48 *
49 */
50class RepositoryViewDelegate : public QStyledItemDelegate
51{
52 Q_OBJECT
53
54public:
55 /**
56 * @brief Default constructor.
57 *
58 * @param cache The cache for the current repository.
59 * @param git The git object to execute git commands.
60 * @param view The view that uses the delegate.
61 */
62 RepositoryViewDelegate(const QSharedPointer<GitCache> &cache, const QSharedPointer<GitBase> &git,
63 const QSharedPointer<GitServerCache> &gitServerCache, CommitHistoryView *view);
64
65 /**
66 * @brief Overridden method to paint the different columns and rows in the view.
67 *
68 * @param p The painter device.
69 * @param o The style options of the item.
70 * @param i The index with the item data.
71 */
72 void paint(QPainter *p, const QStyleOptionViewItem &o, const QModelIndex &i) const override;
73 /**
74 * @brief The size hint returns the width and height for rendering purposes.
75 *
76 * @return QSize returns the size of a row.
77 */
78 QSize sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const override;
79
80protected:
81 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
82 const QModelIndex &index) override;
83
84private:
85 QSharedPointer<GitCache> mCache;
86 QSharedPointer<GitBase> mGit;
87 QSharedPointer<GitServerCache> mGitServerCache;
88 CommitHistoryView *mView = nullptr;
89 int diffTargetRow = -1;
90 int mColumnPressed = -1;
91
92 /**
93 * @brief Paints the log column. This method is in charge of painting the commit message as well as tags or
94 * branches.
95 *
96 * @param p The painter device.
97 * @param o The style options of the item.
98 * @param i The index with the item data.
99 */
100 void paintLog(QPainter *p, const QStyleOptionViewItem &o, const CommitInfo &commit, const QString &text) const;
101 /**
102 * @brief Method that sets up the configuration to paint the lane for the commit graph representation.
103 *
104 * @param p The painter device.
105 * @param o The style options of the item.
106 * @param index The index with the item data.
107 */
108 void paintGraph(QPainter *p, const QStyleOptionViewItem &o, const CommitInfo &commit) const;
109
110 /**
111 * @brief Specialization method called by @ref paintGrapth that does the actual lane painting.
112 *
113 * @param p The painter device.
114 * @param type The type of lane to paint.
115 * @param laneHeadPresent Tells the method if the lane contains a head.
116 * @param x1 X coordinate where the painting starts
117 * @param x2 X coordinate where the painting ends
118 * @param col Color of the lane
119 * @param activeCol Color of the active lane
120 * @param mergeColor Color of the lane where the merge comes from in case the commit is a end-merge point.
121 * @param isWip Tells the method if it's the WIP commit so it's painted differently.
122 */
123 void paintGraphLane(QPainter *p, const Lane &type, bool laneHeadPresent, int x1, int x2, const QColor &col,
124 const QColor &activeCol, const QColor &mergeColor, bool isWip = false,
125 bool hasChilds = true) const;
126
127 /**
128 * @brief Specialized method that paints a tag in the commit message column.
129 *
130 * @param painter The painter device.
131 * @param opt The style options of the item.
132 * @param startPoint The starting X coordinate for the tag.
133 * @param sha The SHA reference to paint. It can be local branch, remote branch, tag or it could be detached.
134 */
135 void paintTagBranch(QPainter *painter, QStyleOptionViewItem opt, int &startPoint, const QString &sha) const;
136
137 /**
138 * @brief Specialized method that paints a tag in the commit message column.
139 *
140 * @param painter The painter device.
141 * @param opt The style options of the item.
142 * @param startPoint The starting X coordinate for the tag.
143 * @param pr The PullRequest status.
144 */
145 void paintPrStatus(QPainter *painter, QStyleOptionViewItem opt, int &startPoint,
146 const GitServer::PullRequest &pr) const;
147
148 /**
149 * @brief getMergeColor Returns the color to be used for painting the external circle of the node. This methods
150 * searches the origin of the merge and uses the same lane color.
151 * @param currentLane The current lane type.
152 * @param commit The current commit.
153 * @param currentLaneIndex The current index of the lane.
154 * @param defaultColor The default color in case it's not a merge.
155 * @param isSet Boolean used as a shortcut. If the current iteration is a merge it will change the value for the
156 * following lanes.
157 * @return Returns the color of the lane that merges into the current node, otherwise it returns @p defaultColor.
158 */
159 QColor getMergeColor(const Lane &currentLane, const CommitInfo &commit, int currentLaneIndex,
160 const QColor &defaultColor, bool &isSet) const;
161};
162