1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
|
package main
// ThemeComponentID represents different components of the display that makes up grv
// The style of each of these components can be customised using themes
type ThemeComponentID int16
// The set of theme components that make up the display of grv
const (
CmpNone ThemeComponentID = iota
CmpAllviewDefault
CmpAllviewSearchMatch
CmpAllviewActiveViewSelectedRow
CmpAllviewInactiveViewSelectedRow
CmpMainviewActiveView
CmpMainviewNormalView
CmpRefviewTitle
CmpRefviewFooter
CmpRefviewLocalBranchesHeader
CmpRefviewRemoteBranchesHeader
CmpRefviewLocalBranch
CmpRefviewHead
CmpRefviewRemoteBranch
CmpRefviewTagsHeader
CmpRefviewTag
CmpCommitviewTitle
CmpCommitviewFooter
CmpCommitviewShortOid
CmpCommitviewDate
CmpCommitviewAuthor
CmpCommitviewSummary
CmpCommitviewTag
CmpCommitviewLocalBranch
CmpCommitviewRemoteBranch
CmpCommitviewGraphCommit
CmpCommitviewGraphMergeCommit
CmpCommitviewGraphBranch1
CmpCommitviewGraphBranch2
CmpCommitviewGraphBranch3
CmpCommitviewGraphBranch4
CmpCommitviewGraphBranch5
CmpCommitviewGraphBranch6
CmpCommitviewGraphBranch7
CmpDiffviewTitle
CmpDiffviewFooter
CmpDiffviewDifflineNormal
CmpDiffviewDifflineDiffCommitAuthor
CmpDiffviewDifflineDiffCommitAuthorDate
CmpDiffviewDifflineDiffCommitCommitter
CmpDiffviewDifflineDiffCommitCommitterDate
CmpDiffviewDifflineDiffCommitMessage
CmpDiffviewDifflineDiffStatsFile
CmpDiffviewDifflineGitDiffHeader
CmpDiffviewDifflineGitDiffExtendedHeader
CmpDiffviewDifflineUnifiedDiffHeader
CmpDiffviewDifflineHunkStart
CmpDiffviewDifflineHunkHeader
CmpDiffviewDifflineLineAdded
CmpDiffviewDifflineLineRemoved
CmpDiffviewFancyDiffLineSeparator
CmpDiffviewFancyDiffLineFile
CmpDiffviewFancyDifflineLineAdded
CmpDiffviewFancyDifflineLineRemoved
CmpDiffviewFancyDifflineLineAddedChange
CmpDiffviewFancyDifflineLineRemovedChange
CmpDiffviewFancyDifflineEmptyLineAdded
CmpDiffviewFancyDifflineEmptyLineRemoved
CmpDiffviewFancyDifflineTrailingWhitespace
CmpGitStatusMessage
CmpGitStatusStagedTitle
CmpGitStatusUnstagedTitle
CmpGitStatusUntrackedTitle
CmpGitStatusConflictedTitle
CmpGitStatusStagedFile
CmpGitStatusUnstagedFile
CmpGitStatusUntrackedFile
CmpGitStatusConflictedFile
CmpHelpViewTitle
CmpHelpViewIndexTitle
CmpHelpViewIndexSubTitle
CmpHelpViewSectionTitle
CmpHelpViewSectionSubTitle
CmpHelpViewSectionDescription
CmpHelpViewSectionCodeBlock
CmpHelpViewSectionTableHeader
CmpHelpViewSectionTableRow
CmpHelpViewSectionTableRowHighlighted
CmpHelpViewSectionTableCellSeparator
CmpHelpViewFooter
CmpStatusbarviewNormal
CmpHelpbarviewSpecial
CmpHelpbarviewNormal
CmpErrorViewTitle
CmpErrorViewFooter
CmpErrorViewErrors
CmpContextMenuTitle
CmpContextMenuContent
CmpContextMenuFooter
CmpCommandOutputTitle
CmpCommandOutputCommand
CmpCommandOutputNormal
CmpCommandOutputError
CmpCommandOutputSuccess
CmpCommandOutputFooter
CmpMessageBoxTitle
CmpMessageBoxContent
CmpMessageBoxSelectedButton
CmpGRVVariableViewTitle
CmpGRVVariableViewVariable
CmpGRVVariableViewValue
CmpGRVVariableViewFooter
CmpRemoteViewTitle
CmpRemoteViewRemote
CmpRemoteViewFooter
CmpSummaryViewHeader
CmpSummaryViewNormal
CmpSummaryViewBranchAhead
CmpSummaryViewBranchBehind
CmpSummaryViewStagedFile
CmpSummaryViewUnstagedFile
CmpSummaryViewNoModifiedFiles
CmpCount
)
// ThemeColor is a color that can be specified for a theme
type ThemeColor interface {
themeColor()
}
// SystemColorValue represents one of the 8 basic system colors
type SystemColorValue int
// The set of SystemColorValues
const (
ColorNone SystemColorValue = iota
ColorBlack
ColorRed
ColorGreen
ColorYellow
ColorBlue
ColorMagenta
ColorCyan
ColorWhite
)
// SystemColor stores the value of a system color
type SystemColor struct {
systemColorValue SystemColorValue
}
// NewSystemColor creates a new instance
func NewSystemColor(systemColorValue SystemColorValue) ThemeColor {
return &SystemColor{
systemColorValue: systemColorValue,
}
}
func (systemColor *SystemColor) themeColor() {}
// ColorNumber stores the terminal color number (0 - 255) for a color
type ColorNumber struct {
number int16
}
// NewColorNumber creates a new instance
func NewColorNumber(number int16) ThemeColor {
return &ColorNumber{
number: number,
}
}
func (colorNumber *ColorNumber) themeColor() {}
// RGBColor stores the red, green and blue components of a color
type RGBColor struct {
red byte
green byte
blue byte
}
// NewRGBColor creates a new instance
func NewRGBColor(red, green, blue byte) ThemeColor {
return &RGBColor{
red: red,
green: green,
blue: blue,
}
}
func (rgbColor *RGBColor) themeColor() {}
// ThemeStyleType represents a type of styling applied to text
type ThemeStyleType int
// The set of supported text styles
const (
TstNormal ThemeStyleType = 0
TstStandout ThemeStyleType = 1 << (iota - 1)
TstUnderline
TstReverse
TstBlink
TstDim
TstBold
TstProtect
TstInvis
TstAltcharset
TstChartext
)
// ThemeStyle contains styles that should be applied to text
type ThemeStyle struct {
styleTypes ThemeStyleType
}
// ThemeComponent stores the color information for a theme component
type ThemeComponent struct {
bgcolor ThemeColor
fgcolor ThemeColor
style ThemeStyle
}
// Theme provides read only access to the style information of a theme
type Theme interface {
GetComponent(ThemeComponentID) ThemeComponent
GetAllComponents() map[ThemeComponentID]ThemeComponent
}
// MutableTheme allows defaults to be set on a theme that has not defined color information for all theme components
type MutableTheme interface {
Theme
CreateOrGetComponent(ThemeComponentID) *ThemeComponent
}
// ThemeComponents stores all of the style information for a theme
type ThemeComponents struct {
components map[ThemeComponentID]*ThemeComponent
}
// GetComponent returns the configured color information for the specified theme component ID
func (themeComponents *ThemeComponents) GetComponent(themeComponentID ThemeComponentID) ThemeComponent {
if themeComponent, ok := themeComponents.components[themeComponentID]; ok {
return *themeComponent
}
return getDefaultThemeComponent()
}
// GetAllComponents returns all configured color information the theme contains
func (themeComponents *ThemeComponents) GetAllComponents() map[ThemeComponentID]ThemeComponent {
components := make(map[ThemeComponentID]ThemeComponent, CmpCount)
for themeComponentID := ThemeComponentID(1); themeComponentID < CmpCount; themeComponentID++ {
themeComponent := themeComponents.GetComponent(themeComponentID)
components[themeComponentID] = themeComponent
}
return components
}
// CreateOrGetComponent returns the configured info if the component has been defined on this theme
// Otherwise a component is created and set on the theme using default values. This default is then returned
func (themeComponents *ThemeComponents) CreateOrGetComponent(themeComponentID ThemeComponentID) *ThemeComponent {
themeComponent, ok := themeComponents.components[themeComponentID]
if !ok {
defultThemeComponent := getDefaultThemeComponent()
themeComponent = &defultThemeComponent
themeComponents.components[themeComponentID] = themeComponent
}
return themeComponent
}
func getDefaultThemeComponent() ThemeComponent {
return ThemeComponent{
bgcolor: NewSystemColor(ColorNone),
fgcolor: NewSystemColor(ColorNone),
}
}
// NewTheme creates a new empty theme
func NewTheme() MutableTheme {
return &ThemeComponents{
components: make(map[ThemeComponentID]*ThemeComponent),
}
}
|