From fd0eb2bcbf31eccfc2b853dc406e0cfd247f7fb2 Mon Sep 17 00:00:00 2001
From: Thomas Charbonnel <thomascharbonnel@users.noreply.github.com>
Date: Tue, 26 Jul 2022 12:36:21 +0800
Subject: This closes #1283, support set and get color index, theme and tint
 for sheet tab

This commit renames `TabColor` into `TabColorRGB` (but keeps an alias for backwards compatibility), as well as adds support for more tab color options (Theme, Indexed and Tint).

Signed-off-by: Thomas Charbonnel <github@charbonnel.email>
---
 sheetpr.go      | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 sheetpr_test.go | 42 +++++++++++++++++++++------
 2 files changed, 118 insertions(+), 14 deletions(-)

diff --git a/sheetpr.go b/sheetpr.go
index 73fb5b0..cc4e4a9 100644
--- a/sheetpr.go
+++ b/sheetpr.go
@@ -33,14 +33,37 @@ type (
 	Published bool
 	// FitToPage is a SheetPrOption
 	FitToPage bool
-	// TabColor is a SheetPrOption
-	TabColor string
+	// TabColorIndexed is a TabColor option, within SheetPrOption
+	TabColorIndexed int
+	// TabColorRGB is a TabColor option, within SheetPrOption
+	TabColorRGB string
+	// TabColorTheme is a TabColor option, within SheetPrOption
+	TabColorTheme int
+	// TabColorTint is a TabColor option, within SheetPrOption
+	TabColorTint float64
 	// AutoPageBreaks is a SheetPrOption
 	AutoPageBreaks bool
 	// OutlineSummaryBelow is an outlinePr, within SheetPr option
 	OutlineSummaryBelow bool
 )
 
+const (
+	TabColorThemeLight1 int = iota // Inverted compared to the spec because that's how Excel maps them
+	TabColorThemeDark1
+	TabColorThemeLight2
+	TabColorThemeDark2
+	TabColorThemeAccent1
+	TabColorThemeAccent2
+	TabColorThemeAccent3
+	TabColorThemeAccent4
+	TabColorThemeAccent5
+	TabColorThemeAccent6
+	TabColorThemeHyperlink
+	TabColorThemeFollowedHyperlink
+
+	TabColorUnsetValue int = -1
+)
+
 // setSheetPrOption implements the SheetPrOption interface.
 func (o OutlineSummaryBelow) setSheetPrOption(pr *xlsxSheetPr) {
 	if pr.OutlinePr == nil {
@@ -129,9 +152,28 @@ func (o *FitToPage) getSheetPrOption(pr *xlsxSheetPr) {
 	*o = FitToPage(pr.PageSetUpPr.FitToPage)
 }
 
+// setSheetPrOption implements the SheetPrOption interface and sets the
+// TabColor Indexed.
+func (o TabColorIndexed) setSheetPrOption(pr *xlsxSheetPr) {
+	if pr.TabColor == nil {
+		pr.TabColor = new(xlsxTabColor)
+	}
+	pr.TabColor.Indexed = int(o)
+}
+
+// getSheetPrOption implements the SheetPrOptionPtr interface and gets the
+// TabColor Indexed. Defaults to -1 if no indexed has been set.
+func (o *TabColorIndexed) getSheetPrOption(pr *xlsxSheetPr) {
+	if pr == nil || pr.TabColor == nil {
+		*o = TabColorIndexed(TabColorUnsetValue)
+		return
+	}
+	*o = TabColorIndexed(pr.TabColor.Indexed)
+}
+
 // setSheetPrOption implements the SheetPrOption interface and specifies a
 // stable name of the sheet.
-func (o TabColor) setSheetPrOption(pr *xlsxSheetPr) {
+func (o TabColorRGB) setSheetPrOption(pr *xlsxSheetPr) {
 	if pr.TabColor == nil {
 		if string(o) == "" {
 			return
@@ -143,12 +185,50 @@ func (o TabColor) setSheetPrOption(pr *xlsxSheetPr) {
 
 // getSheetPrOption implements the SheetPrOptionPtr interface and get the
 // stable name of the sheet.
-func (o *TabColor) getSheetPrOption(pr *xlsxSheetPr) {
+func (o *TabColorRGB) getSheetPrOption(pr *xlsxSheetPr) {
 	if pr == nil || pr.TabColor == nil {
 		*o = ""
 		return
 	}
-	*o = TabColor(strings.TrimPrefix(pr.TabColor.RGB, "FF"))
+	*o = TabColorRGB(strings.TrimPrefix(pr.TabColor.RGB, "FF"))
+}
+
+// setSheetPrOption implements the SheetPrOption interface and sets the
+// TabColor Theme. Warning: it does not create a clrScheme!
+func (o TabColorTheme) setSheetPrOption(pr *xlsxSheetPr) {
+	if pr.TabColor == nil {
+		pr.TabColor = new(xlsxTabColor)
+	}
+	pr.TabColor.Theme = int(o)
+}
+
+// getSheetPrOption implements the SheetPrOptionPtr interface and gets the
+// TabColor Theme. Defaults to -1 if no theme has been set.
+func (o *TabColorTheme) getSheetPrOption(pr *xlsxSheetPr) {
+	if pr == nil || pr.TabColor == nil {
+		*o = TabColorTheme(TabColorUnsetValue)
+		return
+	}
+	*o = TabColorTheme(pr.TabColor.Theme)
+}
+
+// setSheetPrOption implements the SheetPrOption interface and sets the
+// TabColor Tint.
+func (o TabColorTint) setSheetPrOption(pr *xlsxSheetPr) {
+	if pr.TabColor == nil {
+		pr.TabColor = new(xlsxTabColor)
+	}
+	pr.TabColor.Tint = float64(o)
+}
+
+// getSheetPrOption implements the SheetPrOptionPtr interface and gets the
+// TabColor Tint. Defaults to 0.0 if no tint has been set.
+func (o *TabColorTint) getSheetPrOption(pr *xlsxSheetPr) {
+	if pr == nil || pr.TabColor == nil {
+		*o = 0.0
+		return
+	}
+	*o = TabColorTint(pr.TabColor.Tint)
 }
 
 // setSheetPrOption implements the SheetPrOption interface.
diff --git a/sheetpr_test.go b/sheetpr_test.go
index 91685d8..000b33a 100644
--- a/sheetpr_test.go
+++ b/sheetpr_test.go
@@ -13,7 +13,10 @@ var _ = []SheetPrOption{
 	EnableFormatConditionsCalculation(false),
 	Published(false),
 	FitToPage(true),
-	TabColor("#FFFF00"),
+	TabColorIndexed(42),
+	TabColorRGB("#FFFF00"),
+	TabColorTheme(TabColorThemeLight2),
+	TabColorTint(0.5),
 	AutoPageBreaks(true),
 	OutlineSummaryBelow(true),
 }
@@ -23,7 +26,10 @@ var _ = []SheetPrOptionPtr{
 	(*EnableFormatConditionsCalculation)(nil),
 	(*Published)(nil),
 	(*FitToPage)(nil),
-	(*TabColor)(nil),
+	(*TabColorIndexed)(nil),
+	(*TabColorRGB)(nil),
+	(*TabColorTheme)(nil),
+	(*TabColorTint)(nil),
 	(*AutoPageBreaks)(nil),
 	(*OutlineSummaryBelow)(nil),
 }
@@ -37,7 +43,10 @@ func ExampleFile_SetSheetPrOptions() {
 		EnableFormatConditionsCalculation(false),
 		Published(false),
 		FitToPage(true),
-		TabColor("#FFFF00"),
+		TabColorIndexed(42),
+		TabColorRGB("#FFFF00"),
+		TabColorTheme(TabColorThemeLight2),
+		TabColorTint(0.5),
 		AutoPageBreaks(true),
 		OutlineSummaryBelow(false),
 	); err != nil {
@@ -55,7 +64,10 @@ func ExampleFile_GetSheetPrOptions() {
 		enableFormatConditionsCalculation EnableFormatConditionsCalculation
 		published                         Published
 		fitToPage                         FitToPage
-		tabColor                          TabColor
+		tabColorIndexed                   TabColorIndexed
+		tabColorRGB                       TabColorRGB
+		tabColorTheme                     TabColorTheme
+		tabColorTint                      TabColorTint
 		autoPageBreaks                    AutoPageBreaks
 		outlineSummaryBelow               OutlineSummaryBelow
 	)
@@ -65,7 +77,10 @@ func ExampleFile_GetSheetPrOptions() {
 		&enableFormatConditionsCalculation,
 		&published,
 		&fitToPage,
-		&tabColor,
+		&tabColorIndexed,
+		&tabColorRGB,
+		&tabColorTheme,
+		&tabColorTint,
 		&autoPageBreaks,
 		&outlineSummaryBelow,
 	); err != nil {
@@ -76,7 +91,10 @@ func ExampleFile_GetSheetPrOptions() {
 	fmt.Println("- enableFormatConditionsCalculation:", enableFormatConditionsCalculation)
 	fmt.Println("- published:", published)
 	fmt.Println("- fitToPage:", fitToPage)
-	fmt.Printf("- tabColor: %q\n", tabColor)
+	fmt.Printf("- tabColorIndexed: %d\n", tabColorIndexed)
+	fmt.Printf("- tabColorRGB: %q\n", tabColorRGB)
+	fmt.Printf("- tabColorTheme: %d\n", tabColorTheme)
+	fmt.Printf("- tabColorTint: %f\n", tabColorTint)
 	fmt.Println("- autoPageBreaks:", autoPageBreaks)
 	fmt.Println("- outlineSummaryBelow:", outlineSummaryBelow)
 	// Output:
@@ -85,7 +103,10 @@ func ExampleFile_GetSheetPrOptions() {
 	// - enableFormatConditionsCalculation: true
 	// - published: true
 	// - fitToPage: false
-	// - tabColor: ""
+	// - tabColorIndexed: -1
+	// - tabColorRGB: ""
+	// - tabColorTheme: -1
+	// - tabColorTint: 0.000000
 	// - autoPageBreaks: false
 	// - outlineSummaryBelow: true
 }
@@ -101,7 +122,10 @@ func TestSheetPrOptions(t *testing.T) {
 		{new(EnableFormatConditionsCalculation), EnableFormatConditionsCalculation(false)},
 		{new(Published), Published(false)},
 		{new(FitToPage), FitToPage(true)},
-		{new(TabColor), TabColor("FFFF00")},
+		{new(TabColorIndexed), TabColorIndexed(42)},
+		{new(TabColorRGB), TabColorRGB("FFFF00")},
+		{new(TabColorTheme), TabColorTheme(TabColorThemeLight2)},
+		{new(TabColorTint), TabColorTint(0.5)},
 		{new(AutoPageBreaks), AutoPageBreaks(true)},
 		{new(OutlineSummaryBelow), OutlineSummaryBelow(false)},
 	}
@@ -154,7 +178,7 @@ func TestSheetPrOptions(t *testing.T) {
 
 func TestSetSheetPrOptions(t *testing.T) {
 	f := NewFile()
-	assert.NoError(t, f.SetSheetPrOptions("Sheet1", TabColor("")))
+	assert.NoError(t, f.SetSheetPrOptions("Sheet1", TabColorRGB("")))
 	// Test SetSheetPrOptions on not exists worksheet.
 	assert.EqualError(t, f.SetSheetPrOptions("SheetN"), "sheet SheetN is not exist")
 }
-- 
cgit v1.2.1