# Copyright (c) 2021 rdbende
# Copyright (c) 2020 RedFantom
# Derived from Ubuntu Yaru theme, Copyright (c) 2018-2020 The Yaru theme authors
# See <https://github.com/ubuntu/yaru/blob/master/AUTHORS> for a list of authors for the Yaru theme

package require Tk 8.6

namespace eval ttk::theme::yaru {

    variable version 1.2
    package provide ttk::theme::yaru $version
    variable colors
    array set colors {
        -fg             "#3d3d3d"
        -bg             "#f7f7f7"
        -disabledfg     "#8b8e8f"
        -disabledbg     "#f7f7f7"
        -selectfg       "#f7f7f7"
        -selectbg       "#e95420"
    }

    proc LoadImages {imgdir} {
        variable I
        foreach file [glob -directory $imgdir *.png] {
            set img [file tail [file rootname $file]]
            set I($img) [image create photo -file $file -format png]
        }
    }

    LoadImages [file join [file dirname [info script]] yaru]

    # Settings
    ttk::style theme create yaru -parent default -settings {
        ttk::style configure . \
            -background $colors(-bg) \
            -foreground $colors(-fg) \
            -troughcolor $colors(-bg) \
            -focuscolor $colors(-selectbg) \
            -selectbackground $colors(-selectbg) \
            -selectforeground $colors(-selectfg) \
            -fieldbackground $colors(-selectbg) \
            -font TkDefaultFont \
            -borderwidth 1 \
            -relief flat

        ttk::style map . -foreground [list disabled $colors(-disabledfg)]

        tk_setPalette background [ttk::style lookup . -background] \
            foreground [ttk::style lookup . -foreground] \
            highlightColor [ttk::style lookup . -focuscolor] \
            selectBackground [ttk::style lookup . -selectbackground] \
            selectForeground [ttk::style lookup . -selectforeground] \
            activeBackground [ttk::style lookup . -selectbackground] \
            activeForeground [ttk::style lookup . -selectforeground]
        option add *font [ttk::style lookup . -font]


        # Layouts
        ttk::style layout TButton {
            Button.button -children {
                Button.padding -children {
                    Button.label -side left -expand true
                } 
            }
        }

        ttk::style layout Toolbutton {
            Toolbutton.button -children {
                Toolbutton.padding -children {
                    Toolbutton.label -side left -expand true
                } 
            }
        }

        ttk::style layout TMenubutton {
            Menubutton.button -children {
                Menubutton.padding -children {
                    Menubutton.indicator -side right
                    Menubutton.label -side right -expand true
                }
            }
        }

        ttk::style layout TOptionMenu {
            OptionMenu.button -children {
                OptionMenu.padding -children {
                    OptionMenu.indicator -side right
                    OptionMenu.label -side right -expand true
                }
            }
        }

        ttk::style layout TCheckbutton {
            Checkbutton.button -children {
                Checkbutton.padding -children {
                    Checkbutton.indicator -side left
                    Checkbutton.label -side right -expand true
                }
            }
        }

        ttk::style layout TRadiobutton {
            Radiobutton.button -children {
                Radiobutton.padding -children {
                    Radiobutton.indicator -side left
                    Radiobutton.label -side right -expand true
                }
            }
        }

        ttk::style layout Vertical.TScrollbar {
            Vertical.Scrollbar.trough -sticky ns -children {
                Vertical.Scrollbar.thumb -expand true
            }
        }

        ttk::style layout Horizontal.TScrollbar {
            Horizontal.Scrollbar.trough -sticky ew -children {
                Horizontal.Scrollbar.thumb -expand true
            }
        }

        ttk::style layout TCombobox {
            Combobox.field -children {
                Combobox.downarrow -side right -sticky {}
                Combobox.padding -expand 1 -children {
                    Combobox.textarea
                }
            }
        }

        ttk::style layout TSpinbox {
            Spinbox.field -children {
                null -side right -children {
                	Spinbox.uparrow -side top -sticky e
                	Spinbox.downarrow -side bottom -sticky s
                }
                Spinbox.padding -expand 0 -children {
                    Spinbox.textarea
                }
            }
        }

        ttk::style layout Horizontal.TSeparator {
            Horizontal.separator -sticky nswe
        }

        ttk::style layout Vertical.TSeparator {
            Vertical.separator -sticky nswe
        }

        ttk::style layout TLabelframe {
            Labelframe.border {
                Labelframe.padding -expand 1 -children {
                    Labelframe.label -side right
                }
            }
        }

        ttk::style layout TNotebook.Tab {
            Notebook.tab -children {
                Notebook.padding -side top -children {
                    Notebook.label -side top -sticky {}
                }
            }
        }        

        ttk::style layout Treeview.Item {
            Treeitem.padding -sticky nswe -children {
                Treeitem.indicator -side left -sticky {}
                Treeitem.image -side left -sticky {}
                Treeitem.text -side left -sticky {}
            }
        }

        # Button
        ttk::style configure TButton -padding 4 -width 10 -anchor center

        ttk::style element create Button.button \
            image [list $I(button-basic) \
                disabled $I(button-disabled) \
                pressed $I(button-pressed) \
                active $I(button-basic) \
            ] -border 4 -sticky news

        # Toolbutton
        ttk::style configure Toolbutton -padding 4 -width 10 -anchor center

        ttk::style element create Toolbutton.button \
            image [list $I(empty) \
                disabled $I(empty) \
                pressed $I(button-pressed) \
                active $I(button-pressed) \
            ] -border 4 -sticky news

        # Menubutton
        ttk::style configure TMenubutton -padding 4

        ttk::style element create Menubutton.button \
            image [list $I(button-basic) \
                disabled $I(button-disabled) \
                pressed $I(button-pressed) \
                active $I(button-basic) \
            ] -border 4 -sticky news 

        ttk::style element create Menubutton.indicator image $I(arrow-down-basic) -width 25 -sticky e

        # OptionMenu
        ttk::style configure TOptionMenu -padding 4

        ttk::style element create OptionMenu.button \
            image [list $I(button-basic) \
                disabled $I(button-disabled) \
                pressed $I(button-pressed) \
                active $I(button-basic) \
            ] -border 4 -sticky news

        ttk::style element create OptionMenu.indicator image $I(arrow-down-basic) -width 25 -sticky e

        # Checkbutton
        ttk::style configure TCheckbutton -padding 4

        ttk::style element create Checkbutton.indicator \
            image [list $I(checkbox-basic) \
            	disabled $I(checkbox-basic) \
                {selected disabled} $I(checkbox-selected-dis) \
                {pressed selected} $I(checkbox-selected) \
                {active selected} $I(checkbox-selected) \
                selected $I(checkbox-selected) \
                {pressed !selected} $I(checkbox-basic) \
                active $I(checkbox-basic) \
            ] -width 20 -sticky w

        # Radiobutton
        ttk::style configure TRadiobutton -padding 4

        ttk::style element create Radiobutton.indicator \
            image [list $I(radio-basic) \
            	disabled $I(radio-basic) \
                {selected disabled} $I(radio-selected-dis) \
                {pressed selected} $I(radio-selected) \
                {active selected} $I(radio-selected) \
                selected $I(radio-selected) \
                {pressed !selected} $I(radio-basic) \
                active $I(radio-basic) \
            ] -width 20 -sticky w

        # Scrollbar
        ttk::style element create Horizontal.Scrollbar.trough image $I(scrollbar-hor-trough) \
        	-border 2 -sticky ew

        ttk::style element create Horizontal.Scrollbar.thumb \
             image [list $I(scrollbar-hor-gray) \
                disabled $I(scrollbar-hor-gray) \
                pressed $I(scrollbar-hor-orange) \
                active $I(scrollbar-hor-orange) \
            ] -border 1 -sticky ew

        ttk::style element create Vertical.Scrollbar.trough image $I(scrollbar-vert-trough) \
        	-border 2 -sticky ns

        ttk::style element create Vertical.Scrollbar.thumb \
            image [list $I(scrollbar-vert-gray) \
                disabled $I(scrollbar-vert-gray) \
                pressed $I(scrollbar-vert-orange) \
                active $I(scrollbar-vert-orange) \
            ] -border 1 -sticky ns

        # Scale
        ttk::style element create Horizontal.Scale.trough \
        	image [ list $I(scale-trough) \
        		disabled $I(scale-trough-disabled)
        	] -border 9 -padding 0

        ttk::style element create Horizontal.Scale.slider \
            image [list $I(scale-slider) \
                disabled $I(scale-slider) \
                pressed $I(scale-slider-hover) \
                active $I(scale-slider-hover) \
            ] -sticky news

        ttk::style element create Vertical.Scale.trough \
        	image [ list $I(scale-trough) \
        		disabled $I(scale-trough-disabled)
        	] -border 9 -padding 0

        ttk::style element create Vertical.Scale.slider \
            image [list $I(scale-slider) \
                disabled $I(scale-slider) \
                pressed $I(scale-slider-hover) \
                active $I(scale-slider-hover) \
            ] -sticky news

        # Progressbar
        ttk::style element create Horizontal.Progressbar.trough image $I(progressbar-trough-hor) \
            -border 2 -sticky ew

        ttk::style element create Horizontal.Progressbar.pbar image $I(progressbar-hor) \
            -border 2 -sticky ew

        ttk::style element create Vertical.Progressbar.trough image $I(progressbar-trough-hor) \
            -border 2 -sticky ns

        ttk::style element create Vertical.Progressbar.pbar image $I(progressbar-hor) \
            -border 2 -sticky ns

        # Entry
        ttk::style element create Entry.field \
            image [list $I(entry-basic) \
                {focus hover} $I(entry-focus) \
                invalid $I(entry-focus) \
                disabled $I(entry-disabled) \
                focus $I(entry-focus) \
                hover $I(entry-basic) \
            ] -border 4 -padding 8 -sticky news

        # Combobox
        ttk::style map TCombobox -selectbackground [list \
            {!focus} $colors(-selectbg) \
            {readonly hover} $colors(-selectbg) \
            {readonly focus} $colors(-selectbg)]
            
        ttk::style map TCombobox -selectforeground [list \
            {!focus} $colors(-selectfg) \
            {readonly hover} $colors(-selectfg) \
            {readonly focus} $colors(-selectfg)]

        ttk::style element create Combobox.field \
            image [list $I(entry-basic) \
                {readonly disabled} $I(button-disabled) \
                {readonly pressed} $I(button-pressed) \
                {readonly focus hover} $I(button-basic) \
                {readonly focus} $I(button-basic) \
                {readonly hover} $I(button-basic) \
                {focus hover} $I(entry-focus) \
                readonly $I(button-basic) \
                disabled $I(entry-disabled) \
                focus $I(entry-focus) \
                hover $I(entry-basic) \
            ] -border 4 -padding 8

        ttk::style element create Combobox.downarrow image $I(arrow-down-basic) \
        	-width 25 -sticky e

        # Spinbox
        ttk::style element create Spinbox.field \
            image [list $I(entry-basic) \
                disabled $I(entry-disabled) \
                focus $I(entry-focus) \
                hover $I(entry-basic) \
            ] -border 4 -padding 8 -sticky news

        ttk::style element create Spinbox.uparrow \
            image [list $I(arrow-up-basic) \
                disabled $I(arrow-up-hover) \
                pressed $I(arrow-up-hover) \
                active $I(arrow-up-hover) \
            ] -width 15 -sticky e

        ttk::style element create Spinbox.downarrow \
            image [list $I(arrow-down-basic) \
                disabled $I(arrow-down-hover) \
                pressed $I(arrow-down-hover) \
                active $I(arrow-down-hover) \
            ] -width 15 -sticky e

        # Sizegrip
        ttk::style element create Sizegrip.sizegrip image $I(sizegrip) \
        	-sticky news

        # Separator
        ttk::style element create Horizontal.separator image $I(separator)

        ttk::style element create Vertical.separator image $I(separator)

        # Labelframe
        ttk::style element create Labelframe.border image $I(checkbox-basic) \
            -border 4 -padding 4 -sticky news
        
        # Notebook
        ttk::style element create Notebook.client \
            image $I(checkbox-basic) -border 4

        ttk::style element create Notebook.tab \
            image [list $I(tab-basic) \
                selected $I(tab-current) \
                active $I(tab-hover) \
            ] -border 6 -padding {14 10} -sticky news

        # Treeview
        ttk::style element create Treeview.field image $I(checkbox-basic) \
            -border 4

        ttk::style element create Treeheading.cell \
            image [list $I(tree-basic) \
                pressed $I(tree-pressed)
            ] -border 10 -padding 4 -sticky news
        
        ttk::style element create Treeitem.indicator \
            image [list $I(plus) \
                user2 $I(empty) \
                user1 $I(minus) \
            ] -width 15 -sticky w

        ttk::style configure Treeview -background $colors(-bg)
        ttk::style configure Treeview.Item
        ttk::style map Treeview \
            -background [list selected $colors(-selectbg)] \
            -foreground [list selected $colors(-selectfg)]

        # Sashes
        ttk::style configure TPanedwindow \
            -width 1 -padding 0
        ttk::style map TPanedwindow \
            -background [list hover $colors(-bg)]
    }
}
