yaru.tcl 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. # Copyright (c) 2021 rdbende
  2. # Copyright (c) 2020 RedFantom
  3. # Derived from Ubuntu Yaru theme, Copyright (c) 2018-2020 The Yaru theme authors
  4. # See <https://github.com/ubuntu/yaru/blob/master/AUTHORS> for a list of authors for the Yaru theme
  5. package require Tk 8.6
  6. namespace eval ttk::theme::yaru {
  7. variable version 1.2
  8. package provide ttk::theme::yaru $version
  9. variable colors
  10. array set colors {
  11. -fg "#3d3d3d"
  12. -bg "#f7f7f7"
  13. -disabledfg "#8b8e8f"
  14. -disabledbg "#f7f7f7"
  15. -selectfg "#f7f7f7"
  16. -selectbg "#e95420"
  17. }
  18. proc LoadImages {imgdir} {
  19. variable I
  20. foreach file [glob -directory $imgdir *.png] {
  21. set img [file tail [file rootname $file]]
  22. set I($img) [image create photo -file $file -format png]
  23. }
  24. }
  25. LoadImages [file join [file dirname [info script]] yaru]
  26. # Settings
  27. ttk::style theme create yaru -parent default -settings {
  28. ttk::style configure . \
  29. -background $colors(-bg) \
  30. -foreground $colors(-fg) \
  31. -troughcolor $colors(-bg) \
  32. -focuscolor $colors(-selectbg) \
  33. -selectbackground $colors(-selectbg) \
  34. -selectforeground $colors(-selectfg) \
  35. -fieldbackground $colors(-selectbg) \
  36. -font TkDefaultFont \
  37. -borderwidth 1 \
  38. -relief flat
  39. ttk::style map . -foreground [list disabled $colors(-disabledfg)]
  40. tk_setPalette background [ttk::style lookup . -background] \
  41. foreground [ttk::style lookup . -foreground] \
  42. highlightColor [ttk::style lookup . -focuscolor] \
  43. selectBackground [ttk::style lookup . -selectbackground] \
  44. selectForeground [ttk::style lookup . -selectforeground] \
  45. activeBackground [ttk::style lookup . -selectbackground] \
  46. activeForeground [ttk::style lookup . -selectforeground]
  47. option add *font [ttk::style lookup . -font]
  48. # Layouts
  49. ttk::style layout TButton {
  50. Button.button -children {
  51. Button.padding -children {
  52. Button.label -side left -expand true
  53. }
  54. }
  55. }
  56. ttk::style layout Toolbutton {
  57. Toolbutton.button -children {
  58. Toolbutton.padding -children {
  59. Toolbutton.label -side left -expand true
  60. }
  61. }
  62. }
  63. ttk::style layout TMenubutton {
  64. Menubutton.button -children {
  65. Menubutton.padding -children {
  66. Menubutton.indicator -side right
  67. Menubutton.label -side right -expand true
  68. }
  69. }
  70. }
  71. ttk::style layout TOptionMenu {
  72. OptionMenu.button -children {
  73. OptionMenu.padding -children {
  74. OptionMenu.indicator -side right
  75. OptionMenu.label -side right -expand true
  76. }
  77. }
  78. }
  79. ttk::style layout TCheckbutton {
  80. Checkbutton.button -children {
  81. Checkbutton.padding -children {
  82. Checkbutton.indicator -side left
  83. Checkbutton.label -side right -expand true
  84. }
  85. }
  86. }
  87. ttk::style layout TRadiobutton {
  88. Radiobutton.button -children {
  89. Radiobutton.padding -children {
  90. Radiobutton.indicator -side left
  91. Radiobutton.label -side right -expand true
  92. }
  93. }
  94. }
  95. ttk::style layout Vertical.TScrollbar {
  96. Vertical.Scrollbar.trough -sticky ns -children {
  97. Vertical.Scrollbar.thumb -expand true
  98. }
  99. }
  100. ttk::style layout Horizontal.TScrollbar {
  101. Horizontal.Scrollbar.trough -sticky ew -children {
  102. Horizontal.Scrollbar.thumb -expand true
  103. }
  104. }
  105. ttk::style layout TCombobox {
  106. Combobox.field -children {
  107. Combobox.downarrow -side right -sticky {}
  108. Combobox.padding -expand 1 -children {
  109. Combobox.textarea
  110. }
  111. }
  112. }
  113. ttk::style layout TSpinbox {
  114. Spinbox.field -children {
  115. null -side right -children {
  116. Spinbox.uparrow -side top -sticky e
  117. Spinbox.downarrow -side bottom -sticky s
  118. }
  119. Spinbox.padding -expand 0 -children {
  120. Spinbox.textarea
  121. }
  122. }
  123. }
  124. ttk::style layout Horizontal.TSeparator {
  125. Horizontal.separator -sticky nswe
  126. }
  127. ttk::style layout Vertical.TSeparator {
  128. Vertical.separator -sticky nswe
  129. }
  130. ttk::style layout TLabelframe {
  131. Labelframe.border {
  132. Labelframe.padding -expand 1 -children {
  133. Labelframe.label -side right
  134. }
  135. }
  136. }
  137. ttk::style layout TNotebook.Tab {
  138. Notebook.tab -children {
  139. Notebook.padding -side top -children {
  140. Notebook.label -side top -sticky {}
  141. }
  142. }
  143. }
  144. ttk::style layout Treeview.Item {
  145. Treeitem.padding -sticky nswe -children {
  146. Treeitem.indicator -side left -sticky {}
  147. Treeitem.image -side left -sticky {}
  148. Treeitem.text -side left -sticky {}
  149. }
  150. }
  151. # Button
  152. ttk::style configure TButton -padding 4 -width 10 -anchor center
  153. ttk::style element create Button.button \
  154. image [list $I(button-basic) \
  155. disabled $I(button-disabled) \
  156. pressed $I(button-pressed) \
  157. active $I(button-basic) \
  158. ] -border 4 -sticky news
  159. # Toolbutton
  160. ttk::style configure Toolbutton -padding 4 -width 10 -anchor center
  161. ttk::style element create Toolbutton.button \
  162. image [list $I(empty) \
  163. disabled $I(empty) \
  164. pressed $I(button-pressed) \
  165. active $I(button-pressed) \
  166. ] -border 4 -sticky news
  167. # Menubutton
  168. ttk::style configure TMenubutton -padding 4
  169. ttk::style element create Menubutton.button \
  170. image [list $I(button-basic) \
  171. disabled $I(button-disabled) \
  172. pressed $I(button-pressed) \
  173. active $I(button-basic) \
  174. ] -border 4 -sticky news
  175. ttk::style element create Menubutton.indicator image $I(arrow-down-basic) -width 25 -sticky e
  176. # OptionMenu
  177. ttk::style configure TOptionMenu -padding 4
  178. ttk::style element create OptionMenu.button \
  179. image [list $I(button-basic) \
  180. disabled $I(button-disabled) \
  181. pressed $I(button-pressed) \
  182. active $I(button-basic) \
  183. ] -border 4 -sticky news
  184. ttk::style element create OptionMenu.indicator image $I(arrow-down-basic) -width 25 -sticky e
  185. # Checkbutton
  186. ttk::style configure TCheckbutton -padding 4
  187. ttk::style element create Checkbutton.indicator \
  188. image [list $I(checkbox-basic) \
  189. disabled $I(checkbox-basic) \
  190. {selected disabled} $I(checkbox-selected-dis) \
  191. {pressed selected} $I(checkbox-selected) \
  192. {active selected} $I(checkbox-selected) \
  193. selected $I(checkbox-selected) \
  194. {pressed !selected} $I(checkbox-basic) \
  195. active $I(checkbox-basic) \
  196. ] -width 20 -sticky w
  197. # Radiobutton
  198. ttk::style configure TRadiobutton -padding 4
  199. ttk::style element create Radiobutton.indicator \
  200. image [list $I(radio-basic) \
  201. disabled $I(radio-basic) \
  202. {selected disabled} $I(radio-selected-dis) \
  203. {pressed selected} $I(radio-selected) \
  204. {active selected} $I(radio-selected) \
  205. selected $I(radio-selected) \
  206. {pressed !selected} $I(radio-basic) \
  207. active $I(radio-basic) \
  208. ] -width 20 -sticky w
  209. # Scrollbar
  210. ttk::style element create Horizontal.Scrollbar.trough image $I(scrollbar-hor-trough) \
  211. -border 2 -sticky ew
  212. ttk::style element create Horizontal.Scrollbar.thumb \
  213. image [list $I(scrollbar-hor-gray) \
  214. disabled $I(scrollbar-hor-gray) \
  215. pressed $I(scrollbar-hor-orange) \
  216. active $I(scrollbar-hor-orange) \
  217. ] -border 1 -sticky ew
  218. ttk::style element create Vertical.Scrollbar.trough image $I(scrollbar-vert-trough) \
  219. -border 2 -sticky ns
  220. ttk::style element create Vertical.Scrollbar.thumb \
  221. image [list $I(scrollbar-vert-gray) \
  222. disabled $I(scrollbar-vert-gray) \
  223. pressed $I(scrollbar-vert-orange) \
  224. active $I(scrollbar-vert-orange) \
  225. ] -border 1 -sticky ns
  226. # Scale
  227. ttk::style element create Horizontal.Scale.trough \
  228. image [ list $I(scale-trough) \
  229. disabled $I(scale-trough-disabled)
  230. ] -border 9 -padding 0
  231. ttk::style element create Horizontal.Scale.slider \
  232. image [list $I(scale-slider) \
  233. disabled $I(scale-slider) \
  234. pressed $I(scale-slider-hover) \
  235. active $I(scale-slider-hover) \
  236. ] -sticky news
  237. ttk::style element create Vertical.Scale.trough \
  238. image [ list $I(scale-trough) \
  239. disabled $I(scale-trough-disabled)
  240. ] -border 9 -padding 0
  241. ttk::style element create Vertical.Scale.slider \
  242. image [list $I(scale-slider) \
  243. disabled $I(scale-slider) \
  244. pressed $I(scale-slider-hover) \
  245. active $I(scale-slider-hover) \
  246. ] -sticky news
  247. # Progressbar
  248. ttk::style element create Horizontal.Progressbar.trough image $I(progressbar-trough-hor) \
  249. -border 2 -sticky ew
  250. ttk::style element create Horizontal.Progressbar.pbar image $I(progressbar-hor) \
  251. -border 2 -sticky ew
  252. ttk::style element create Vertical.Progressbar.trough image $I(progressbar-trough-hor) \
  253. -border 2 -sticky ns
  254. ttk::style element create Vertical.Progressbar.pbar image $I(progressbar-hor) \
  255. -border 2 -sticky ns
  256. # Entry
  257. ttk::style element create Entry.field \
  258. image [list $I(entry-basic) \
  259. {focus hover} $I(entry-focus) \
  260. invalid $I(entry-focus) \
  261. disabled $I(entry-disabled) \
  262. focus $I(entry-focus) \
  263. hover $I(entry-basic) \
  264. ] -border 4 -padding 8 -sticky news
  265. # Combobox
  266. ttk::style map TCombobox -selectbackground [list \
  267. {!focus} $colors(-selectbg) \
  268. {readonly hover} $colors(-selectbg) \
  269. {readonly focus} $colors(-selectbg)]
  270. ttk::style map TCombobox -selectforeground [list \
  271. {!focus} $colors(-selectfg) \
  272. {readonly hover} $colors(-selectfg) \
  273. {readonly focus} $colors(-selectfg)]
  274. ttk::style element create Combobox.field \
  275. image [list $I(entry-basic) \
  276. {readonly disabled} $I(button-disabled) \
  277. {readonly pressed} $I(button-pressed) \
  278. {readonly focus hover} $I(button-basic) \
  279. {readonly focus} $I(button-basic) \
  280. {readonly hover} $I(button-basic) \
  281. {focus hover} $I(entry-focus) \
  282. readonly $I(button-basic) \
  283. disabled $I(entry-disabled) \
  284. focus $I(entry-focus) \
  285. hover $I(entry-basic) \
  286. ] -border 4 -padding 8
  287. ttk::style element create Combobox.downarrow image $I(arrow-down-basic) \
  288. -width 25 -sticky e
  289. # Spinbox
  290. ttk::style element create Spinbox.field \
  291. image [list $I(entry-basic) \
  292. disabled $I(entry-disabled) \
  293. focus $I(entry-focus) \
  294. hover $I(entry-basic) \
  295. ] -border 4 -padding 8 -sticky news
  296. ttk::style element create Spinbox.uparrow \
  297. image [list $I(arrow-up-basic) \
  298. disabled $I(arrow-up-hover) \
  299. pressed $I(arrow-up-hover) \
  300. active $I(arrow-up-hover) \
  301. ] -width 15 -sticky e
  302. ttk::style element create Spinbox.downarrow \
  303. image [list $I(arrow-down-basic) \
  304. disabled $I(arrow-down-hover) \
  305. pressed $I(arrow-down-hover) \
  306. active $I(arrow-down-hover) \
  307. ] -width 15 -sticky e
  308. # Sizegrip
  309. ttk::style element create Sizegrip.sizegrip image $I(sizegrip) \
  310. -sticky news
  311. # Separator
  312. ttk::style element create Horizontal.separator image $I(separator)
  313. ttk::style element create Vertical.separator image $I(separator)
  314. # Labelframe
  315. ttk::style element create Labelframe.border image $I(checkbox-basic) \
  316. -border 4 -padding 4 -sticky news
  317. # Notebook
  318. ttk::style element create Notebook.client \
  319. image $I(checkbox-basic) -border 4
  320. ttk::style element create Notebook.tab \
  321. image [list $I(tab-basic) \
  322. selected $I(tab-current) \
  323. active $I(tab-hover) \
  324. ] -border 6 -padding {14 10} -sticky news
  325. # Treeview
  326. ttk::style element create Treeview.field image $I(checkbox-basic) \
  327. -border 4
  328. ttk::style element create Treeheading.cell \
  329. image [list $I(tree-basic) \
  330. pressed $I(tree-pressed)
  331. ] -border 10 -padding 4 -sticky news
  332. ttk::style element create Treeitem.indicator \
  333. image [list $I(plus) \
  334. user2 $I(empty) \
  335. user1 $I(minus) \
  336. ] -width 15 -sticky w
  337. ttk::style configure Treeview -background $colors(-bg)
  338. ttk::style configure Treeview.Item
  339. ttk::style map Treeview \
  340. -background [list selected $colors(-selectbg)] \
  341. -foreground [list selected $colors(-selectfg)]
  342. # Sashes
  343. ttk::style configure TPanedwindow \
  344. -width 1 -padding 0
  345. ttk::style map TPanedwindow \
  346. -background [list hover $colors(-bg)]
  347. }
  348. }