287 lines
6.4 KiB
Go
287 lines
6.4 KiB
Go
package gui
|
|
|
|
// themeGui.go contains code to generate a custom fyne theme
|
|
|
|
import "fyne.io/fyne/v2"
|
|
import "fyne.io/fyne/v2/theme"
|
|
|
|
import "seekia/internal/imagery"
|
|
|
|
import "image/color"
|
|
import "errors"
|
|
|
|
|
|
// We use this to define a custom fyne theme
|
|
type customTheme struct{
|
|
themeName string
|
|
defaultTheme fyne.Theme
|
|
}
|
|
|
|
func getCustomFyneTheme(themeName string)(fyne.Theme, error){
|
|
|
|
getStandardThemeObject := func()(fyne.Theme, error){
|
|
|
|
if (themeName == "Light" || themeName == "Love" || themeName == "Ocean"){
|
|
result := theme.LightTheme()
|
|
return result, nil
|
|
}
|
|
if (themeName == "Dark"){
|
|
result := theme.DarkTheme()
|
|
return result, nil
|
|
}
|
|
return nil, errors.New("getCustomFyneTheme called with invalid themeName: " + themeName)
|
|
}
|
|
|
|
standardThemeObject, err := getStandardThemeObject()
|
|
if (err != nil){ return nil, err }
|
|
|
|
newTheme := customTheme{
|
|
themeName: themeName,
|
|
defaultTheme: standardThemeObject,
|
|
}
|
|
|
|
return newTheme, nil
|
|
}
|
|
|
|
|
|
// This function is used to define our custom fyne themes
|
|
// It changes a few default colors, while leaving all other colors the same as the default theme
|
|
func (input customTheme)Color(colorName fyne.ThemeColorName, variant fyne.ThemeVariant)color.Color{
|
|
|
|
//TODO: Make these colors better and create more themes
|
|
|
|
themeName := input.themeName
|
|
|
|
switch colorName{
|
|
|
|
case theme.ColorNameForeground:{
|
|
|
|
switch themeName{
|
|
|
|
case "Light", "Love", "Ocean":{
|
|
|
|
newColor := color.Black
|
|
return newColor
|
|
}
|
|
case "Dark":{
|
|
|
|
newColor := color.White
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNameSeparator:{
|
|
|
|
// This is the color used for separators
|
|
|
|
switch themeName{
|
|
|
|
case "Light":{
|
|
newColor, err := imagery.GetColorObjectFromColorCode("b3b3b3")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Ocean":{
|
|
newColor, err := imagery.GetColorObjectFromColorCode("646464")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
default:{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("999999")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNameInputBackground:{
|
|
|
|
// This color is used for the background of input elements such as text entries
|
|
|
|
switch themeName{
|
|
|
|
case "Light":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("b3b3b3")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Love":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("ffbbbe")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Ocean":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("ccd1ef")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
default:{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("999999")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNameBackground:{
|
|
|
|
// This is the color used for the app background
|
|
|
|
switch themeName{
|
|
|
|
case "Love":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("ff7a80")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Ocean":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("7f6fff")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNameOverlayBackground:{
|
|
|
|
// This is the color used for backgrounds of overlays like dialogs.
|
|
|
|
switch themeName{
|
|
|
|
case "Love":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("ffabaf")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Ocean":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("a59aff")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNameButton:{
|
|
|
|
// This is the color used for buttons
|
|
|
|
switch themeName{
|
|
|
|
case "Light":{
|
|
newColor, err := imagery.GetColorObjectFromColorCode("d8d8d8")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Love":{
|
|
newColor, err := imagery.GetColorObjectFromColorCode("7664ff")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Ocean":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("ccd1ef")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
case "Dark":{
|
|
newColor, err := imagery.GetColorObjectFromColorCode("4d4d4d")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case theme.ColorNamePlaceHolder:{
|
|
|
|
// This is the color used for text
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("4d4d4d")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
|
|
case theme.ColorNamePrimary:{
|
|
|
|
// This color is used for high importance buttons
|
|
|
|
switch themeName{
|
|
|
|
case "Love", "Ocean":{
|
|
|
|
newColor, err := imagery.GetColorObjectFromColorCode("1300a8")
|
|
if (err == nil){
|
|
return newColor
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// We will use the default color for this theme
|
|
return input.defaultTheme.Color(colorName, variant)
|
|
}
|
|
|
|
// Our custom themes change nothing about the default theme fonts
|
|
func (input customTheme)Font(style fyne.TextStyle)fyne.Resource{
|
|
|
|
themeFont := input.defaultTheme.Font(style)
|
|
|
|
return themeFont
|
|
}
|
|
|
|
// Our custom themes change nothing about the default theme icons
|
|
func (input customTheme)Icon(iconName fyne.ThemeIconName)fyne.Resource{
|
|
|
|
themeIcon := input.defaultTheme.Icon(iconName)
|
|
|
|
return themeIcon
|
|
}
|
|
|
|
func (input customTheme)Size(name fyne.ThemeSizeName)float32{
|
|
|
|
themeSize := input.defaultTheme.Size(name)
|
|
|
|
if (name == theme.SizeNameText){
|
|
|
|
// After fyne v2.3.0, text labels are no longer the same height as buttons
|
|
// We increase the text size so that a text label is the same height as a button
|
|
// We need to increase text size because we are creating grids by creating multiple VBoxes, and connecting them with an HBox
|
|
//
|
|
// If we could create grids in a different way, we could avoid having to do this
|
|
// Example: Create a new grid type: container.NewThinGrid?
|
|
// -The columns will only be as wide as the the widest element within them
|
|
// -We can add separators between each row (grid.ShowRowLines = true) or between columns (grid.ShowColumnLines = true)
|
|
// -We can add borders (grid.ShowTopBorder = true, grid.ShowBottomBorder = true, grid.ShowLeftBorder = true, grid.ShowRightBorder = true)
|
|
|
|
// Using a different grid type is the solution we need to eventually use
|
|
// Then, we can show the user an option to increase the text size globally, and all grids will still render correctly
|
|
|
|
result := themeSize * 1.08
|
|
|
|
return result
|
|
}
|
|
|
|
return themeSize
|
|
}
|
|
|
|
|