From 53c0f728c90d79b6677b0490ffbb517528f6c16e Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:03:08 +0200 Subject: [PATCH 1/6] Add Tkinter Theme --- azure.tcl | 87 +++++ theme/dark.tcl | 539 +++++++++++++++++++++++++++++ theme/dark/box-accent.png | Bin 0 -> 424 bytes theme/dark/box-basic.png | Bin 0 -> 330 bytes theme/dark/box-hover.png | Bin 0 -> 357 bytes theme/dark/box-invalid.png | Bin 0 -> 405 bytes theme/dark/button-hover.png | Bin 0 -> 346 bytes theme/dark/card.png | Bin 0 -> 457 bytes theme/dark/check-accent.png | Bin 0 -> 482 bytes theme/dark/check-basic.png | Bin 0 -> 423 bytes theme/dark/check-hover.png | Bin 0 -> 453 bytes theme/dark/check-tri-accent.png | Bin 0 -> 346 bytes theme/dark/check-tri-basic.png | Bin 0 -> 310 bytes theme/dark/check-tri-hover.png | Bin 0 -> 326 bytes theme/dark/circle-accent.png | Bin 0 -> 484 bytes theme/dark/circle-basic.png | Bin 0 -> 437 bytes theme/dark/circle-hover.png | Bin 0 -> 470 bytes theme/dark/combo-button-basic.png | Bin 0 -> 242 bytes theme/dark/combo-button-focus.png | Bin 0 -> 248 bytes theme/dark/combo-button-hover.png | Bin 0 -> 297 bytes theme/dark/down-accent.png | Bin 0 -> 234 bytes theme/dark/down.png | Bin 0 -> 261 bytes theme/dark/empty.png | Bin 0 -> 130 bytes theme/dark/hor-accent.png | Bin 0 -> 154 bytes theme/dark/hor-basic.png | Bin 0 -> 156 bytes theme/dark/hor-hover.png | Bin 0 -> 154 bytes theme/dark/notebook.png | Bin 0 -> 410 bytes theme/dark/off-basic.png | Bin 0 -> 677 bytes theme/dark/on-accent.png | Bin 0 -> 736 bytes theme/dark/on-basic.png | Bin 0 -> 668 bytes theme/dark/outline-basic.png | Bin 0 -> 587 bytes theme/dark/outline-hover.png | Bin 0 -> 644 bytes theme/dark/radio-accent.png | Bin 0 -> 629 bytes theme/dark/radio-basic.png | Bin 0 -> 561 bytes theme/dark/radio-hover.png | Bin 0 -> 625 bytes theme/dark/radio-tri-accent.png | Bin 0 -> 524 bytes theme/dark/radio-tri-basic.png | Bin 0 -> 505 bytes theme/dark/radio-tri-hover.png | Bin 0 -> 466 bytes theme/dark/rect-accent-hover.png | Bin 0 -> 289 bytes theme/dark/rect-accent.png | Bin 0 -> 319 bytes theme/dark/rect-basic.png | Bin 0 -> 286 bytes theme/dark/rect-hover.png | Bin 0 -> 297 bytes theme/dark/right.png | Bin 0 -> 255 bytes theme/dark/scale-hor.png | Bin 0 -> 161 bytes theme/dark/scale-vert.png | Bin 0 -> 161 bytes theme/dark/separator.png | Bin 0 -> 128 bytes theme/dark/size.png | Bin 0 -> 477 bytes theme/dark/tab-basic.png | Bin 0 -> 249 bytes theme/dark/tab-disabled.png | Bin 0 -> 234 bytes theme/dark/tab-hover.png | Bin 0 -> 260 bytes theme/dark/tick-hor-accent.png | Bin 0 -> 302 bytes theme/dark/tick-hor-basic.png | Bin 0 -> 267 bytes theme/dark/tick-hor-hover.png | Bin 0 -> 280 bytes theme/dark/tick-vert-accent.png | Bin 0 -> 295 bytes theme/dark/tick-vert-basic.png | Bin 0 -> 257 bytes theme/dark/tick-vert-hover.png | Bin 0 -> 277 bytes theme/dark/tree-basic.png | Bin 0 -> 149 bytes theme/dark/tree-pressed.png | Bin 0 -> 168 bytes theme/dark/up-accent.png | Bin 0 -> 242 bytes theme/dark/up.png | Bin 0 -> 271 bytes theme/dark/vert-accent.png | Bin 0 -> 158 bytes theme/dark/vert-basic.png | Bin 0 -> 158 bytes theme/dark/vert-hover.png | Bin 0 -> 158 bytes theme/light.tcl | 539 +++++++++++++++++++++++++++++ theme/light/box-accent.png | Bin 0 -> 346 bytes theme/light/box-basic.png | Bin 0 -> 319 bytes theme/light/box-hover.png | Bin 0 -> 329 bytes theme/light/box-invalid.png | Bin 0 -> 285 bytes theme/light/button-hover.png | Bin 0 -> 326 bytes theme/light/card.png | Bin 0 -> 444 bytes theme/light/check-accent.png | Bin 0 -> 442 bytes theme/light/check-basic.png | Bin 0 -> 390 bytes theme/light/check-hover.png | Bin 0 -> 451 bytes theme/light/check-tri-accent.png | Bin 0 -> 314 bytes theme/light/check-tri-basic.png | Bin 0 -> 281 bytes theme/light/check-tri-hover.png | Bin 0 -> 319 bytes theme/light/circle-accent.png | Bin 0 -> 440 bytes theme/light/circle-basic.png | Bin 0 -> 128 bytes theme/light/circle-hover.png | Bin 0 -> 429 bytes theme/light/combo-button-basic.png | Bin 0 -> 247 bytes theme/light/combo-button-focus.png | Bin 0 -> 254 bytes theme/light/combo-button-hover.png | Bin 0 -> 299 bytes theme/light/down-accent.png | Bin 0 -> 234 bytes theme/light/down.png | Bin 0 -> 271 bytes theme/light/empty.png | Bin 0 -> 130 bytes theme/light/hor-accent.png | Bin 0 -> 153 bytes theme/light/hor-basic.png | Bin 0 -> 157 bytes theme/light/hor-hover.png | Bin 0 -> 154 bytes theme/light/notebook.png | Bin 0 -> 389 bytes theme/light/off-basic.png | Bin 0 -> 547 bytes theme/light/off-hover.png | Bin 0 -> 663 bytes theme/light/on-accent.png | Bin 0 -> 635 bytes theme/light/on-basic.png | Bin 0 -> 538 bytes theme/light/on-hover.png | Bin 0 -> 649 bytes theme/light/outline-basic.png | Bin 0 -> 508 bytes theme/light/outline-hover.png | Bin 0 -> 598 bytes theme/light/radio-accent.png | Bin 0 -> 554 bytes theme/light/radio-basic.png | Bin 0 -> 482 bytes theme/light/radio-hover.png | Bin 0 -> 583 bytes theme/light/radio-tri-accent.png | Bin 0 -> 471 bytes theme/light/radio-tri-basic.png | Bin 0 -> 400 bytes theme/light/radio-tri-hover.png | Bin 0 -> 465 bytes theme/light/rect-accent-hover.png | Bin 0 -> 283 bytes theme/light/rect-accent.png | Bin 0 -> 292 bytes theme/light/rect-basic.png | Bin 0 -> 250 bytes theme/light/rect-hover.png | Bin 0 -> 294 bytes theme/light/right.png | Bin 0 -> 266 bytes theme/light/scale-hor.png | Bin 0 -> 161 bytes theme/light/scale-vert.png | Bin 0 -> 162 bytes theme/light/separator.png | Bin 0 -> 128 bytes theme/light/size.png | Bin 0 -> 471 bytes theme/light/tab-basic.png | Bin 0 -> 219 bytes theme/light/tab-disabled.png | Bin 0 -> 220 bytes theme/light/tab-hover.png | Bin 0 -> 263 bytes theme/light/tick-hor-accent.png | Bin 0 -> 274 bytes theme/light/tick-hor-basic.png | Bin 0 -> 242 bytes theme/light/tick-hor-hover.png | Bin 0 -> 273 bytes theme/light/tick-vert-accent.png | Bin 0 -> 273 bytes theme/light/tick-vert-basic.png | Bin 0 -> 234 bytes theme/light/tick-vert-hover.png | Bin 0 -> 266 bytes theme/light/tree-basic.png | Bin 0 -> 149 bytes theme/light/tree-pressed.png | Bin 0 -> 169 bytes theme/light/up-accent.png | Bin 0 -> 242 bytes theme/light/up.png | Bin 0 -> 270 bytes theme/light/vert-accent.png | Bin 0 -> 152 bytes theme/light/vert-basic.png | Bin 0 -> 158 bytes theme/light/vert-hover.png | Bin 0 -> 157 bytes 127 files changed, 1165 insertions(+) create mode 100644 azure.tcl create mode 100644 theme/dark.tcl create mode 100644 theme/dark/box-accent.png create mode 100644 theme/dark/box-basic.png create mode 100644 theme/dark/box-hover.png create mode 100644 theme/dark/box-invalid.png create mode 100644 theme/dark/button-hover.png create mode 100644 theme/dark/card.png create mode 100644 theme/dark/check-accent.png create mode 100644 theme/dark/check-basic.png create mode 100644 theme/dark/check-hover.png create mode 100644 theme/dark/check-tri-accent.png create mode 100644 theme/dark/check-tri-basic.png create mode 100644 theme/dark/check-tri-hover.png create mode 100644 theme/dark/circle-accent.png create mode 100644 theme/dark/circle-basic.png create mode 100644 theme/dark/circle-hover.png create mode 100644 theme/dark/combo-button-basic.png create mode 100644 theme/dark/combo-button-focus.png create mode 100644 theme/dark/combo-button-hover.png create mode 100644 theme/dark/down-accent.png create mode 100644 theme/dark/down.png create mode 100644 theme/dark/empty.png create mode 100644 theme/dark/hor-accent.png create mode 100644 theme/dark/hor-basic.png create mode 100644 theme/dark/hor-hover.png create mode 100644 theme/dark/notebook.png create mode 100644 theme/dark/off-basic.png create mode 100644 theme/dark/on-accent.png create mode 100644 theme/dark/on-basic.png create mode 100644 theme/dark/outline-basic.png create mode 100644 theme/dark/outline-hover.png create mode 100644 theme/dark/radio-accent.png create mode 100644 theme/dark/radio-basic.png create mode 100644 theme/dark/radio-hover.png create mode 100644 theme/dark/radio-tri-accent.png create mode 100644 theme/dark/radio-tri-basic.png create mode 100644 theme/dark/radio-tri-hover.png create mode 100644 theme/dark/rect-accent-hover.png create mode 100644 theme/dark/rect-accent.png create mode 100644 theme/dark/rect-basic.png create mode 100644 theme/dark/rect-hover.png create mode 100644 theme/dark/right.png create mode 100644 theme/dark/scale-hor.png create mode 100644 theme/dark/scale-vert.png create mode 100644 theme/dark/separator.png create mode 100644 theme/dark/size.png create mode 100644 theme/dark/tab-basic.png create mode 100644 theme/dark/tab-disabled.png create mode 100644 theme/dark/tab-hover.png create mode 100644 theme/dark/tick-hor-accent.png create mode 100644 theme/dark/tick-hor-basic.png create mode 100644 theme/dark/tick-hor-hover.png create mode 100644 theme/dark/tick-vert-accent.png create mode 100644 theme/dark/tick-vert-basic.png create mode 100644 theme/dark/tick-vert-hover.png create mode 100644 theme/dark/tree-basic.png create mode 100644 theme/dark/tree-pressed.png create mode 100644 theme/dark/up-accent.png create mode 100644 theme/dark/up.png create mode 100644 theme/dark/vert-accent.png create mode 100644 theme/dark/vert-basic.png create mode 100644 theme/dark/vert-hover.png create mode 100644 theme/light.tcl create mode 100644 theme/light/box-accent.png create mode 100644 theme/light/box-basic.png create mode 100644 theme/light/box-hover.png create mode 100644 theme/light/box-invalid.png create mode 100644 theme/light/button-hover.png create mode 100644 theme/light/card.png create mode 100644 theme/light/check-accent.png create mode 100644 theme/light/check-basic.png create mode 100644 theme/light/check-hover.png create mode 100644 theme/light/check-tri-accent.png create mode 100644 theme/light/check-tri-basic.png create mode 100644 theme/light/check-tri-hover.png create mode 100644 theme/light/circle-accent.png create mode 100644 theme/light/circle-basic.png create mode 100644 theme/light/circle-hover.png create mode 100644 theme/light/combo-button-basic.png create mode 100644 theme/light/combo-button-focus.png create mode 100644 theme/light/combo-button-hover.png create mode 100644 theme/light/down-accent.png create mode 100644 theme/light/down.png create mode 100644 theme/light/empty.png create mode 100644 theme/light/hor-accent.png create mode 100644 theme/light/hor-basic.png create mode 100644 theme/light/hor-hover.png create mode 100644 theme/light/notebook.png create mode 100644 theme/light/off-basic.png create mode 100644 theme/light/off-hover.png create mode 100644 theme/light/on-accent.png create mode 100644 theme/light/on-basic.png create mode 100644 theme/light/on-hover.png create mode 100644 theme/light/outline-basic.png create mode 100644 theme/light/outline-hover.png create mode 100644 theme/light/radio-accent.png create mode 100644 theme/light/radio-basic.png create mode 100644 theme/light/radio-hover.png create mode 100644 theme/light/radio-tri-accent.png create mode 100644 theme/light/radio-tri-basic.png create mode 100644 theme/light/radio-tri-hover.png create mode 100644 theme/light/rect-accent-hover.png create mode 100644 theme/light/rect-accent.png create mode 100644 theme/light/rect-basic.png create mode 100644 theme/light/rect-hover.png create mode 100644 theme/light/right.png create mode 100644 theme/light/scale-hor.png create mode 100644 theme/light/scale-vert.png create mode 100644 theme/light/separator.png create mode 100644 theme/light/size.png create mode 100644 theme/light/tab-basic.png create mode 100644 theme/light/tab-disabled.png create mode 100644 theme/light/tab-hover.png create mode 100644 theme/light/tick-hor-accent.png create mode 100644 theme/light/tick-hor-basic.png create mode 100644 theme/light/tick-hor-hover.png create mode 100644 theme/light/tick-vert-accent.png create mode 100644 theme/light/tick-vert-basic.png create mode 100644 theme/light/tick-vert-hover.png create mode 100644 theme/light/tree-basic.png create mode 100644 theme/light/tree-pressed.png create mode 100644 theme/light/up-accent.png create mode 100644 theme/light/up.png create mode 100644 theme/light/vert-accent.png create mode 100644 theme/light/vert-basic.png create mode 100644 theme/light/vert-hover.png diff --git a/azure.tcl b/azure.tcl new file mode 100644 index 0000000..3e75502 --- /dev/null +++ b/azure.tcl @@ -0,0 +1,87 @@ +# Copyright © 2021 rdbende + +source [file join [file dirname [info script]] theme light.tcl] +source [file join [file dirname [info script]] theme dark.tcl] + +option add *tearOff 0 + +proc set_theme {mode} { + if {$mode == "dark"} { + ttk::style theme use "azure-dark" + + array set colors { + -fg "#ffffff" + -bg "#333333" + -disabledfg "#ffffff" + -disabledbg "#737373" + -selectfg "#ffffff" + -selectbg "#007fff" + } + + ttk::style configure . \ + -background $colors(-bg) \ + -foreground $colors(-fg) \ + -troughcolor $colors(-bg) \ + -focuscolor $colors(-selectbg) \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -insertcolor $colors(-fg) \ + -insertwidth 1 \ + -fieldbackground $colors(-selectbg) \ + -font {"Segoe Ui" 10} \ + -borderwidth 1 \ + -relief flat + + 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] + + ttk::style map . -foreground [list disabled $colors(-disabledfg)] + + option add *font [ttk::style lookup . -font] + option add *Menu.selectcolor $colors(-fg) + + } elseif {$mode == "light"} { + ttk::style theme use "azure-light" + + array set colors { + -fg "#000000" + -bg "#ffffff" + -disabledfg "#737373" + -disabledbg "#ffffff" + -selectfg "#ffffff" + -selectbg "#007fff" + } + + ttk::style configure . \ + -background $colors(-bg) \ + -foreground $colors(-fg) \ + -troughcolor $colors(-bg) \ + -focuscolor $colors(-selectbg) \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -insertcolor $colors(-fg) \ + -insertwidth 1 \ + -fieldbackground $colors(-selectbg) \ + -font {"Segoe Ui" 10} \ + -borderwidth 1 \ + -relief flat + + 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] + + ttk::style map . -foreground [list disabled $colors(-disabledfg)] + + option add *font [ttk::style lookup . -font] + option add *Menu.selectcolor $colors(-fg) + } +} diff --git a/theme/dark.tcl b/theme/dark.tcl new file mode 100644 index 0000000..333e53d --- /dev/null +++ b/theme/dark.tcl @@ -0,0 +1,539 @@ +# Copyright (c) 2021 rdbende + +# The Azure theme is a beautiful modern ttk theme inspired by Microsoft's fluent design. + +package require Tk 8.6 + +namespace eval ttk::theme::azure-dark { + variable version 2.0 + package provide ttk::theme::azure-dark $version + + ttk::style theme create azure-dark -parent clam -settings { + proc load_images {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] + } + } + + load_images [file join [file dirname [info script]] dark] + + array set colors { + -fg "#ffffff" + -bg "#333333" + -disabledfg "#aaaaaa" + -disabledbg "#737373" + -selectfg "#ffffff" + -selectbg "#007fff" + } + + 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 Accent.TButton { + AccentButton.button -children { + AccentButton.padding -children { + AccentButton.label -side left -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 Switch.TCheckbutton { + Switch.button -children { + Switch.padding -children { + Switch.indicator -side left + Switch.label -side right -expand true + } + } + } + + ttk::style layout Toggle.TButton { + ToggleButton.button -children { + ToggleButton.padding -children { + ToggleButton.label -side left -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 -sticky nswe -children { + Combobox.padding -expand true -sticky nswe -children { + Combobox.textarea -sticky nswe + } + } + Combobox.button -side right -sticky ns -children { + Combobox.arrow -sticky nsew + } + } + + ttk::style layout TSpinbox { + Spinbox.field -sticky nsew -children { + Spinbox.padding -expand true -sticky nswe -children { + Spinbox.textarea -sticky nswe + } + + } + Spinbox.button -side right -sticky ns -children { + null -side right -children { + Spinbox.uparrow -side top + Spinbox.downarrow -side bottom + } + } + } + + ttk::style layout Horizontal.TSeparator { + Horizontal.separator -sticky nswe + } + + ttk::style layout Vertical.TSeparator { + Vertical.separator -sticky nswe + } + + ttk::style layout Horizontal.Tick.TScale { + Horizontal.TickScale.trough -sticky ew -children { + Horizontal.TickScale.slider -sticky w + } + } + + ttk::style layout Vertical.Tick.TScale { + Vertical.TickScale.trough -sticky ns -children { + Vertical.TickScale.slider -sticky n + } + } + + ttk::style layout Card.TFrame { + Card.field { + Card.padding -expand 1 + } + } + + 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 {} + } + } + + + # Elements + + # Button + ttk::style configure TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create Button.button image \ + [list $I(rect-basic) \ + {selected disabled} $I(rect-basic) \ + disabled $I(rect-basic) \ + pressed $I(rect-basic) \ + selected $I(rect-basic) \ + active $I(button-hover) \ + focus $I(button-hover) \ + ] -border 4 -sticky ewns + + # Toolbutton + ttk::style configure Toolbutton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create Toolbutton.button image \ + [list $I(empty) \ + {selected disabled} $I(empty) \ + disabled $I(empty) \ + pressed $I(rect-basic) \ + selected $I(rect-basic) \ + active $I(rect-basic) \ + ] -border 4 -sticky ewns + + # Menubutton + ttk::style configure TMenubutton -padding {8 4 4 4} + + ttk::style element create Menubutton.button \ + image [list $I(rect-basic) \ + disabled $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(button-hover) \ + ] -border 4 -sticky ewns + + ttk::style element create Menubutton.indicator \ + image [list $I(down) \ + active $I(down) \ + pressed $I(down) \ + disabled $I(down) \ + ] -width 15 -sticky e + + # OptionMenu + ttk::style configure TOptionMenu -padding {8 4 4 4} + + ttk::style element create OptionMenu.button \ + image [list $I(rect-basic) \ + disabled $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(button-hover) \ + ] -border 4 -sticky ewns + + ttk::style element create OptionMenu.indicator \ + image [list $I(down) \ + active $I(down) \ + pressed $I(down) \ + disabled $I(down) \ + ] -width 15 -sticky e + + # AccentButton + ttk::style configure Accent.TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create AccentButton.button image \ + [list $I(rect-accent) \ + {selected disabled} $I(rect-accent-hover) \ + disabled $I(rect-accent-hover) \ + pressed $I(rect-accent) \ + selected $I(rect-accent) \ + active $I(rect-accent-hover) \ + focus $I(rect-accent-hover) \ + ] -border 4 -sticky ewns + + # Checkbutton + ttk::style configure TCheckbutton -padding 4 + + ttk::style element create Checkbutton.indicator image \ + [list $I(box-basic) \ + {alternate disabled} $I(check-tri-basic) \ + {selected disabled} $I(check-basic) \ + disabled $I(box-basic) \ + {pressed alternate} $I(check-tri-hover) \ + {active alternate} $I(check-tri-hover) \ + alternate $I(check-tri-accent) \ + {pressed selected} $I(check-hover) \ + {active selected} $I(check-hover) \ + selected $I(check-accent) \ + {pressed !selected} $I(rect-hover) \ + active $I(box-hover) \ + ] -width 26 -sticky w + + # Switch + ttk::style element create Switch.indicator image \ + [list $I(off-basic) \ + {selected disabled} $I(on-basic) \ + disabled $I(off-basic) \ + {pressed selected} $I(on-accent) \ + {active selected} $I(on-accent) \ + selected $I(on-accent) \ + {pressed !selected} $I(off-basic) \ + active $I(off-basic) \ + ] -width 46 -sticky w + + # ToggleButton + ttk::style configure Toggle.TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create ToggleButton.button image \ + [list $I(rect-basic) \ + {selected disabled} $I(rect-accent-hover) \ + disabled $I(rect-basic) \ + {pressed selected} $I(rect-basic) \ + {active selected} $I(rect-accent) \ + selected $I(rect-accent) \ + {pressed !selected} $I(rect-accent) \ + active $I(rect-basic) \ + ] -border 4 -sticky ewns + + # Radiobutton + ttk::style configure TRadiobutton -padding 4 + + ttk::style element create Radiobutton.indicator image \ + [list $I(outline-basic) \ + {alternate disabled} $I(radio-tri-basic) \ + {selected disabled} $I(radio-basic) \ + disabled $I(outline-basic) \ + {pressed alternate} $I(radio-tri-hover) \ + {active alternate} $I(radio-tri-hover) \ + alternate $I(radio-tri-accent) \ + {pressed selected} $I(radio-hover) \ + {active selected} $I(radio-hover) \ + selected $I(radio-accent) \ + {pressed !selected} $I(circle-hover) \ + active $I(outline-hover) \ + ] -width 26 -sticky w + + # Scrollbar + ttk::style element create Horizontal.Scrollbar.trough image $I(hor-basic) \ + -sticky ew + + ttk::style element create Horizontal.Scrollbar.thumb \ + image [list $I(hor-accent) \ + disabled $I(hor-basic) \ + pressed $I(hor-hover) \ + active $I(hor-hover) \ + ] -sticky ew + + ttk::style element create Vertical.Scrollbar.trough image $I(vert-basic) \ + -sticky ns + + ttk::style element create Vertical.Scrollbar.thumb \ + image [list $I(vert-accent) \ + disabled $I(vert-basic) \ + pressed $I(vert-hover) \ + active $I(vert-hover) \ + ] -sticky ns + + # Scale + ttk::style element create Horizontal.Scale.trough image $I(scale-hor) \ + -border 5 -padding 0 + + ttk::style element create Horizontal.Scale.slider \ + image [list $I(circle-accent) \ + disabled $I(circle-basic) \ + pressed $I(circle-hover) \ + active $I(circle-hover) \ + ] -sticky {} + + ttk::style element create Vertical.Scale.trough image $I(scale-vert) \ + -border 5 -padding 0 + + ttk::style element create Vertical.Scale.slider \ + image [list $I(circle-accent) \ + disabled $I(circle-basic) \ + pressed $I(circle-hover) \ + active $I(circle-hover) \ + ] -sticky {} + + # Tickscale + ttk::style element create Horizontal.TickScale.trough image $I(scale-hor) \ + -border 5 -padding 0 + + ttk::style element create Horizontal.TickScale.slider \ + image [list $I(tick-hor-accent) \ + disabled $I(tick-hor-basic) \ + pressed $I(tick-hor-hover) \ + active $I(tick-hor-hover) \ + ] -sticky {} + + ttk::style element create Vertical.TickScale.trough image $I(scale-vert) \ + -border 5 -padding 0 + + ttk::style element create Vertical.TickScale.slider \ + image [list $I(tick-vert-accent) \ + disabled $I(tick-vert-basic) \ + pressed $I(tick-vert-hover) \ + active $I(tick-vert-hover) \ + ] -sticky {} + + # Progressbar + ttk::style element create Horizontal.Progressbar.trough image $I(hor-basic) \ + -sticky ew + + ttk::style element create Horizontal.Progressbar.pbar image $I(hor-accent) \ + -sticky ew + + ttk::style element create Vertical.Progressbar.trough image $I(vert-basic) \ + -sticky ns + + ttk::style element create Vertical.Progressbar.pbar image $I(vert-accent) \ + -sticky ns + + # Entry + ttk::style element create Entry.field \ + image [list $I(box-basic) \ + {focus hover} $I(box-accent) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -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(box-basic) \ + {readonly disabled} $I(rect-basic) \ + {readonly pressed} $I(rect-basic) \ + {readonly focus hover} $I(button-hover) \ + {readonly focus} $I(button-hover) \ + {readonly hover} $I(button-hover) \ + {focus hover} $I(box-accent) \ + readonly $I(rect-basic) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -padding {8} + + ttk::style element create Combobox.button \ + image [list $I(combo-button-basic) \ + {!readonly focus} $I(combo-button-focus) \ + {readonly focus} $I(combo-button-hover) \ + {readonly hover} $I(combo-button-hover) + ] -border 5 -padding {2 6 6 6} + + ttk::style element create Combobox.arrow image $I(down) \ + -width 15 -sticky e + + # Spinbox + ttk::style element create Spinbox.field \ + image [list $I(box-basic) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -padding {8} -sticky news + + ttk::style element create Spinbox.uparrow \ + image [list $I(up) \ + disabled $I(up) \ + pressed $I(up-accent) \ + active $I(up-accent) \ + ] -border 4 -width 15 -sticky e + + ttk::style element create Spinbox.downarrow \ + image [list $I(down) \ + disabled $I(down) \ + pressed $I(down-accent) \ + active $I(down-accent) \ + ] -border 4 -width 15 -sticky e + + ttk::style element create Spinbox.button \ + image [list $I(combo-button-basic) \ + {!readonly focus} $I(combo-button-focus) \ + {readonly focus} $I(combo-button-hover) \ + {readonly hover} $I(combo-button-hover) + ] -border 5 -padding {2 6 6 6} + + # Sizegrip + ttk::style element create Sizegrip.sizegrip image $I(size) \ + -sticky ewns + + # Separator + ttk::style element create Horizontal.separator image $I(separator) + + ttk::style element create Vertical.separator image $I(separator) + + # Card + ttk::style element create Card.field image $I(card) \ + -border 10 -padding 4 -sticky news + + # Labelframe + ttk::style element create Labelframe.border image $I(card) \ + -border 5 -padding 4 -sticky news + + # Notebook + ttk::style element create Notebook.client \ + image $I(notebook) -border 5 + + ttk::style element create Notebook.tab \ + image [list $I(tab-disabled) \ + selected $I(tab-basic) \ + active $I(tab-hover) \ + ] -border 5 -padding {14 4} + + # Treeview + ttk::style element create Treeview.field image $I(card) \ + -border 5 + + ttk::style element create Treeheading.cell \ + image [list $I(tree-basic) \ + pressed $I(tree-pressed) + ] -border 5 -padding 4 -sticky ewns + + ttk::style element create Treeitem.indicator \ + image [list $I(right) \ + user2 $I(empty) \ + user1 $I(down) \ + ] -width 26 -sticky {} + + ttk::style configure Treeview -background $colors(-bg) + ttk::style configure Treeview.Item -padding {2 0 0 0} + ttk::style map Treeview \ + -background [list selected $colors(-selectbg)] \ + -foreground [list selected $colors(-selectfg)] + + # Panedwindow + # Insane hack to remove clam's ugly sash + ttk::style configure Sash -gripcount 0 + } +} diff --git a/theme/dark/box-accent.png b/theme/dark/box-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e186b7c743bdfc42cb76bab554cd5e09100f39 GIT binary patch literal 424 zcmV;Z0ayNsP)8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10X0cP zK~y-6?bI<#0&y6}@$cQ=%fq@T(;9RLg!FKfrlNMonq1PYB76tEidx!=UPHAsgdhaI z0c~gyyyMUu!cMfif7c`hLFBbG^cx?Z=flG@JW8QZ2u5?OSZ0+$VjU@BOcNo87`+Cm z<|(?{M#*pQ2Ca>Aq-IP7eSy6Jxq5|&Wmb`zf%5iB>fwxd=LT*3^drQJCg`V&*x5s* zW?RbUJBeSTJqBib_20zcL z-}HsbKll&+DbR~1LL;8O`~eC%1fZWTh6X3I!hbV>;X<@4^K}{u~`x)Q^sD~ z2VlN?kCNZo30j*MzkaY0?-{dJLegcyqV(DCY@~pSu6w#ThFJ8zy=vHXR6(Tm;p86y z8!jJHlDHtsar3`i5c?JnogAUv2PU8J`I;ahF+(NyA8XB>=(%YUZTjad*K8GVY7l5L zz8W>L*o}kn_rAwRE!&Iv4BdP#w*;NioDjsdRAf%E#Bo9WY~7@u8P9);d|5fADK+wf z32%>KMyr5_X6&K5X+cd>gme|3e3@Mz>&4+%9sTPnv)u#cf81-fHU(8lC-pqE;M-!E zuCX+)*-JC$cAHrX!&=iV*AjYScddC}T@uUw-gee`7KvnqrF%>mU++3p-T(b}Z~o%+ Wz}NFSuDk?#k-^i|&t;ucLK6VlnShZ1 literal 0 HcmV?d00001 diff --git a/theme/dark/box-hover.png b/theme/dark/box-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca7c196d39ce8bd5b0bda7fb73eda737fcf2920 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSK6$!0hFJ8zJ!9DC=D@&qAwS2l zy({SCeLuscPA&@70Hr$DYsfd4LG(rN=K%OYeIq{ZHGb zk9pN9yS|dx8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10U}96 zK~y-6?Ub=f!%!54zvMI}R8rEkwL>~MwuDZ_+1ZYDaT`u?kIR6>0*6;V#-fG3z_t{@8sH7=*Sc)*QEUsLascFKI z=c&1fQt+!Y7g0mcQ`)m_tAp8$4^89Rb-8yO-V9@-=^9DGAd0vM0t}^iv~9FlL{-w1 z%XXWaRx4NCj8Pae_I+Xz^lWE$j#Eema9ghfu#=|f*=4k0&F@&x>OZ_I#8$W!{wrZ4 zNeWAL*RuLj1b{&l6&7aMcMgcyqV(DCY@~pSo_o4DhFJ8zJ!5#z&47XJfjDz1 z<1salsO)}4ws%SY)73XvG#<&Ud8xGWYTCpwrC)FFf9bwj+;Cjb>4rsL;B`}pES>P&GUopG#GXnSsbm2b#yiI^_nX%oHvbb|A;Zq0*uU6-XW`a1 z?WHVBzZ80C9)13~v3%b1_{eD=Z1{igdu($)T2PTCa+;#2P)RJiJ4fPT4X4o12XmA; nnxYpPvRyVwlwixb-KPIxYvdcBAIG-=z0Bb0>gTe~DWM4f?;wTq literal 0 HcmV?d00001 diff --git a/theme/dark/card.png b/theme/dark/card.png new file mode 100644 index 0000000000000000000000000000000000000000..3978e9f3191e9f338632a44dfb1309d6ad6782f4 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-&H|6fVg?4j!ywFfJby(BP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_s73PZ!6KjK;UOHg-KW5OI5G zJk4pAg#`Q7vdJra1y6i_`}?Wrl^ZNUDjF^;d4keb$1a<7S5~Zs{oQw#|Bfpr-Q#ON zY~4`Yx9|PR*HXzmlcolFXd3b`Z@CGPX?bF$^i@{~2%MBE>t=&3Va1flQ*AE9>?K*N0z=DmoW( z{`ur>xzF!?PMv+WZHmxU1D-c!)@!yF=l@FYKFajo_OV6MtYtqp#^`;#XY4C{+2mu@ z-e>oIXlCo4v;6kkcKYeo&p*%HKHi@mdp+>_)*qKoT22m1k~w}~{(K$N$@eA71`a~y Qz-VCbboFyt=akR{0L{|F{r~^~ literal 0 HcmV?d00001 diff --git a/theme/dark/check-accent.png b/theme/dark/check-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..9854ec312e50f29108f5077c636ce93a0f11ce1e GIT binary patch literal 482 zcmV<80UiE{P)8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10dGk} zK~y-6t69BLVrR-v<3YUjSUe< zVi65N1x-PUze>tZPwu{5dnR@2XM7%>7kqfMWHRYmLoxEk4)w8FlpMrMq-qeVToHLV zBw#+H%`C3Ej|(R#U&s^G2HSNKnGHnV*y$MqP`(iP#1@)No37WIogy6*(Ju@@=|M!d z$G+Ap!_{2dT<-?+H;crxDKz(syQS0KK)+QYp4~*ZKX{ruYTJ9N?6*q9FH`9DJ5O^* znBnQaL7!DYb5&Q^ub`1xXDYXiP?l%xSMbHyWvF_?#xw z5l*1DYUob=Ul?@wa&3GW%~iy1(;x?UoIj=!HvYsqf&g!k6@+Ti3P%5pL5Iq{L`c=> z8z!AkM5uDrH*mO|MMNGBk#@ajOt;^O-X9E#IK#MD!*7-O Y1~tu_)VBhLi2wiq07*qoM6N<$f(Ss$NdN!< literal 0 HcmV?d00001 diff --git a/theme/dark/check-basic.png b/theme/dark/check-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..529718e511840e2bc9404c2606a482b23e99927b GIT binary patch literal 423 zcmV;Y0a*TtP)8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10W?WO zK~y-6rPIBt!Y~+s;kQW#DF{|XaWt!gqW6CX608Wt!CruZ*@|fs>r@cz@$}~%19`{~ zU$Ecrt0;<4N)g8~QcAkyy~h|smSyC5P8dZIyWNg33_C$}Qc7mC8I#Ebtu;a^)f@XP z3`16{6(Ww~!C2jNIz@DSvtLOm5q&ooMS(HqYrPlvd_K`ybGclGgVtJ-B*8hydc7V7 zT5CBTkCbJ}X0u^D9{&$oYpJTL7uE=BtvQ`ec<(!7ji6ErV+`l>8Si~34B%@-7K;Tz z5Rj%RNs>?$18FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10a8gs zK~y-6t<#~Z!cZ8%@&9&3WkECuwpF|0OITz+gw-HeZ&QPUK}<_VVQ*nuSdrl)Slm!{ z+*#Oe_ipGm|M7$KgO87+^m@Id)9GLs2HkF#TCGN&q?EX>i)C3{uUC}eaG1>Jb2LrM z1-&MOV7XkP8ir9C1JE>$(P)HnI-QcdYi1ROA?mjq<=3$1^NE`FAB%QApHVH#LI_bB3xa^-@yJi3(fD;7 vhi0=$tJR`X$-Gl)VHn~#4*UHc-}m_ga*V3oM+04n00000NkvXXu0mjf(Dup_ literal 0 HcmV?d00001 diff --git a/theme/dark/check-tri-accent.png b/theme/dark/check-tri-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..c0539f94998fafbf70c9837272b76da1418725ba GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSo_o4DhFJ8zJ-;#QP=Ls>kM-|5 zU2nOG?7F!y+3EO|lLy5Mii?WH?=QIE{^9}i7u8**8mtQy-bU@Va&b}b3~zZ-w7X<8 z*TLO4^KIHcKdy=`6(Sv0h5Ta=FKm9FA$puO=&|+8*7VTl%K_GiNXtm!oyT zG@-t#6)I9Py^J%09E84od=htik?D8WqTZrbMv4DSPkny(?#~yrzb|X^C#U|8W%<8{ z_7z+UjyG@BbNoK_XwIC(N$Ud-7QNwFqjN9t>q&u=mlhk^M;HG6+M)GY^Wh5j(tlk~ ob{VMbTxM3SSoOMSTkHqs6-v&n+NUjzfnH|tboFyt=akR{04Y9?UjP6A literal 0 HcmV?d00001 diff --git a/theme/dark/check-tri-basic.png b/theme/dark/check-tri-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..d0188f5ea05fff709a88d3a0b63feb7938ca2f39 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS4tu&dhFJ8zo#e>XY#`uTZycGL zdW3t1@(Wg*UF;L?9FTE1_=YK|t!(iH*R3mVZq2te=>K`R{z~cJ5U+z0%xg_MIMNf+ zD&9YwyL~U$%u(O}LH`fy!#w`)Ro{BQOq^*sQ|B1R!@d4$bCz))vTT=l zoO^SV&Wqo2N-Yf8y2lESO#N}DCsE=;sqC}LW88<>oE2^4&PW5j!{F)a=d#Wzp$PyC CyLmbQ literal 0 HcmV?d00001 diff --git a/theme/dark/check-tri-hover.png b/theme/dark/check-tri-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3e19f92f0aa8c2a8e23cb6bd1ffd77062e82cf GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSE_=E-hFJ8zy|R$E#XzF%;d)yk z4_3zG92Lh7Owc>Xabt3h!;Hoy(GLVnml!`Vm=gB&%u4PUrxm-aQ)mD8tPc(nX+6D( zXHM~x%02_0Le*^DDM12G36WwGHtED(Hc9A-ZL+%@wKz9A;M~t#9tMfz6|1;XWZcV3 z&u;E9T(Hl8p<@xpmD%6)EOxJW{p)qY{qOD1@5TRMuV+-bY+^Zo!T+gix8B=Od*5+t z(7gkd^Bh|RE=1iwwk`Lt0Z+w|!aq}jlstu&WOgZ7{MF|(KIY)nx$gCbb=q-9_}w8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10dYx0 zK~y-6t(8qq!ax{6UngL-nm7xUM(Rd4h)WKDdJgpj1`-cq48#Kn_fYT%CJGx?(m>UO zvVc$^j0-4|Vpx>E)qI(mH{WD_J}r~UC;})E$2Bi-%`E-h6vNE}05%3+7~MLuT|u@h zXp>QJDq2w3F)y*xc|0SzG8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10YXVc zK~y-6t<}x0f-n#T;KSr5`~+4`+_7=k>CX3m6Rim>J8Y~;#Rc4jfe75hTE@7AxV=k9^ zCrCsPk&m%4RaJqAK+KFZO}_?{B*A90d4i$B%%D8agMmd+fX1Q?kvNX$br>S_cszn( zUDtt}bHPC897t7zfvO6!*1~)LHFm$>(Y7sU7zP+)z6MXH6Z*b??y|KOP1Agg)pd>W z*G*+(j6q%3|Hhi8!R2z9#?u8mF8zAFLPXx4Z|^Zy2EubihSqpH^ fO)X#;R^0=?ezb%N(M(*p00000NkvXXu0mjfqC~xQ literal 0 HcmV?d00001 diff --git a/theme/dark/circle-hover.png b/theme/dark/circle-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b439cd6fdfb277165f7799960b67144acc5e94e2 GIT binary patch literal 470 zcmV;{0V)28P)8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10b@x- zK~y-6t<}4Z;xHJ7;Wx(ALE=y#aVY2=i)(-$1#vxlJqQt6d=bH>qa&1oBBD-U3&iX! zjF1NMb(ZbNzh%qzhQr~Nhe#>WTBDSr+wD@T)d0w{jKkr8wH9kFd7eK`#d`#`)=Z~U z8jZ%&;O{vek1Ur<;yC^p^gNF+3>l3^FQLa6V~C=N%jE)qxOcpR0gT6ECX>lmTfl9b z?_l52AP8=tl#(zE-^T8l&1Og`5n5}S&F05oyKA%g&vMfU+Nm3fP-|rFD+R{Mh9AdNCkf!O!*y(g)yWJv+q9BT*kHPtT zPM+ttQ;y>pW6aywdcDRu2SBCWZvO$;?RHeFRR)8>uP|c_tJR9@_4cejJ+MI#5QZVG zR_i5{rYVcX;;XWIommtT}V`<;yxP*J_7i(`mI@7t?}e9VeGE*Ixd z5bI=C;HvW5ZqBwn&nGu`mxkBQfF(C94@_P<@mT+33qQSMcV`wG9dig}tcW|x;KZ?H zO2*p2Y}N-`nd+8LX_~n<_Q&iwpW_UU?GWcte8ZZ!@u~ElgY_(TYxQ^3=DMWF->7yE kz0P*+uA#BZlg~`|Cdg?YQCiUlbT|Wpr>mdKI;Vst07M8^h5!Hn literal 0 HcmV?d00001 diff --git a/theme/dark/combo-button-focus.png b/theme/dark/combo-button-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1e0fff360d0c3ae5559ea304d1215a3d1c8d19 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP*JO=i(`mI@7t?}e1{cy94_9! zB-+WWz*gpW{oP*e4Vz}H3ELGKxSfMv_7neyl#`QcAMbt7aQ^Mln;}yz)z_LHlVG^x zuiZYUxJ5u?>4ajo2OF8>yfqb-vW5SNC2wKf`+eJj;&WmxM|I;Lu>MnCv1;3bpIcw< rz1_Gq?3hG0dswKTVAcEk;vX1QIdzX*y}E-R=pY79S3j3^P6mmtT}V`<;yxP|-F|7sn8b-nUoxa<&>UxITP* z_yyOpVwRI!P283RGuI3(oyyUOFWr`)@;_$igX3*?)8RTLnBc1HCSq q@E((BQWt+P=WtZ_HK}AC2K%mkp4oqI*oFXoz~JfX=d#Wzp$PzaMsivJ literal 0 HcmV?d00001 diff --git a/theme/dark/down-accent.png b/theme/dark/down-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb987d378c4fd897a7728eed14d556e36f23411 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe0z_jGX#;h0%^Y9p6pqRg>}&#h;> zx;;(vD>IXvvgyXzu6*ODCw6xjgeM>D^@v>ZB;Tr344$rjF6*2UngHg*SBwAv literal 0 HcmV?d00001 diff --git a/theme/dark/down.png b/theme/dark/down.png new file mode 100644 index 0000000000000000000000000000000000000000..d83f92db46356a8b058aaed687736696a3188d4f GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe23(RtFu*M-oecsu6c?P+1p+J9f~^?rqjCNPk!G+gOzuLDbRR&$PWnA$7_srsVPMcQ0-u2tVdQyAPsYBKE&wre=^!L_GXE2}S zZ+v^jt4*1+*cm=pizd$r2`x1><~eM@uej&fTi);Bu@q4;BhGFVdQ&MBb@04Hc4rvLx| literal 0 HcmV?d00001 diff --git a/theme/dark/hor-accent.png b/theme/dark/hor-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..e59a1c65e43f532cc614aafaf7f7b42ee67fb67a GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W=!3HF^gw{O+Qk(@Ik;M!Qe1}1p@p%4<6riAF ziEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0xOo-U3d8WWRE%*_6scW^!6 u;(J&E1SDVm=g$-Glk%`kkoodbfFZq?b^r6c6-$9y7(8A5T-G@yGywq9Q!QTr literal 0 HcmV?d00001 diff --git a/theme/dark/hor-basic.png b/theme/dark/hor-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc2e504aa02b47cd5dac358ed0b83f3fb8b7793 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W=!3HF^gw{O+Qk(@Ik;M!Qe1}1p@p%4<6riAF ziEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wTo-U3d8WWRE%*_6scW^!6 x;(J&E2qI);WL9J;T#dEJQh3@>cwxCS1K$r8*0p~ZaRW6mc)I$ztaD0e0stjkEsp>I literal 0 HcmV?d00001 diff --git a/theme/dark/hor-hover.png b/theme/dark/hor-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..56216f40a6da9de8aeed5d5d31e625ca433ba8f0 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W=!3HF^gw{O+Qk(@Ik;M!Qe1}1p@p%4<6riAF ziEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0xOo-U3d8WWRE%*_6scW^!6 u;(J&E1kTT~G~N+wk)`moq42_TXNI+WY)e1v{22k%!rt+?n?*|NAr3OReUnDJd(p z2z(ukuQV ze%370IlaS~;oW!Z$Z1FAm6VobO4Xk*=e~H%Y0E}|Tpbr_qM1U12X|`NTQ*#eKV{;p zqR8^eCcf(Yd{I|Nj>aR^=kvCAf6_W<`R%vu^wX{VXVX4go;Pkk+*l|hd3@sY&pW>y z+dii_XM1$tapil}yVfO#UjNFoA#T0q=}9`LJua8LT$}HE`OD`DGahD!_~%O#b=eN@ R*aQq$22WQ%mvv4FO#n`=tE>P3 literal 0 HcmV?d00001 diff --git a/theme/dark/off-basic.png b/theme/dark/off-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca539a5725549233ba4b858c0ebe75819deecd7 GIT binary patch literal 677 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 literal 0 HcmV?d00001 diff --git a/theme/dark/outline-hover.png b/theme/dark/outline-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce52909676bbc4516c3aa5a95e4d407db2cc561 GIT binary patch literal 644 zcmV-~0(8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10uf0> zK~y-6t<}#?;y@h0@h_#PYEu3sBqoRl8okXlz>~D`24~cl@F|G*dNL}$hf-QkQb-UJ zF9NZc;Hkwu5O!DDm>~PT&u3;b$!`+na`}TVsj7-;ng}7--Q6XXN&ygtAx}?Fc%Fyn zc|=k4bt#FjplO=ew#{fX;_mK_Uavn^}Tp+LXi-xv&nfW5sv6kXSuPNy4#VHl$8`r?)U zXUf~#8@jG<45ia)!Z1V`4u=?qu`yUGm3Vx7MDaY2YPGsCSgBO-eIKRM>5$1}I5;@? zF=iMBxm=F>`+Jl)j%l@8)a!M&x3|~EG)<#kuXAy6K@>%cS9V>OcDqfZ(LmF*wXoyk zV>+D16E3j zWm!xn6I|D&*X!~6`U?CRu;p@@OeVwS<>l{_En5KrlF1}eN`w#;i^Wf0z;HOk^E`at eCywKllm7y7+TaG&nYUX20000r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10s=`y zK~y-6rIo#I(_j>a9~(Ok2{ax^ZCayBbZNpEsS=Z01Q&q>TmfwbSHV(1t+)W%A$L&{ z7MK`Nn`8+~VIRL&nK&)4coS zub{Au>LFHTAG`?wvTw`-18A;3#aVkEtYw%Ua~_zl#_BU%b7KnhWECg7JvYo(?cPf~ zSw(TpP5KE-m=xr~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10lrB@ zK~y-6ot4e5sxTCVmqh|JFu=2A#)LA%nY{lC_y`~-Fr;V{6GRQ%fsrWGd(U;vx_>?> zU3AaZ>vfNj7-JwJ5D{$KhG7^0fVORMKA$0_gp?9p*Ns~-9|wpCVHm@V9#P-B|2;y($x~>waunEEdXm+qPhJT`QA85J1=UNnF?Uk2b688ca&5OmfZ< z$1#@6B{WTgrfKjz@8byr4;ReKvP9D~N-r9QfhdZU&0}3I7gSXR*7rTKEc;c{-;|~) zx~_Yia#@xrisEZnp67Uey1_PCmLbpc|ArMsf!%I5tcMHsx%JcO1R=!7|NE(?X|UaH zF+SAEjV+}_RaL_Xa2)4t1k`msjDWtMOb`44OJuM?#`VfV00000NkvXXu0mjfa!&3e literal 0 HcmV?d00001 diff --git a/theme/dark/radio-hover.png b/theme/dark/radio-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3eab8c1803429d7ec0922a3ca8625bdc2f6ca2 GIT binary patch literal 625 zcmV-%0*?KOP)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10scuu zK~y-6ot3d_@=zFtpTy&&V5M52XxqU>9Fib-2X?PfFTufk5K8aHR@B9zxd@Gdg1D%o z3XwuPCAEX-Z_R1>>$BzizW2#FNjOn*x!jf$gb)~pfu?EP+}v<+aRI<)vthAVVB0pf zZR5J`X%yvDXcz{iQi)hB<{Lg{wOY|?wdnPFa-pIqn5IdgQ214Jie*`}+igBSKLJqp zjdNrG_xJZaJUkq(RoHFw9NDo{*Y%xH2!UyuXUq0fDiwqf2*WUl$K%o=$8l&h8jQzd z05X{j#bS{}BH^38yu3uyG{kH`};dDFE7%}-Q68(BodJ}_uG^)8jYm&NF?&_v-t~(qWsuX-`?J&jZ7xr_B$LUvs^B@y1McWM59rv)v7dn%6h$KI2@vSo=3ag{;$w)JU>63`ufUXFaRKMeSQ51FqupU27{#2=|9OV%c9fiu-)#CRo?-t>pG@sN}uU5 z%jJ@0vw2wA9-j~(5D1{_I+~_&dwcus7cigCv2B~dV1Va&z8if3?((-tw(A>a00000 LNkvXXu0mjfwb3PC literal 0 HcmV?d00001 diff --git a/theme/dark/radio-tri-accent.png b/theme/dark/radio-tri-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..8084141d0293f23cb4f10cf5ae8a4b86a2b1f991 GIT binary patch literal 524 zcmV+n0`vWeP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10hvie zK~y-6t(Cz_<3JpTzZqInqu>Z?gGLW}u-1cz9z9fj4&B3^MPczdL==yESbYz-UGN12 zZ9Nne8`^kj1Y4|?&K_#2B(-4L?=+KN=F1E-nZL+nGMWHd#__C8JS$6MBE@TB27r;5 zN6e=ps+vPpbBJ~;I1~{S)~qd@^gc~6<<(zk8Ap27CQZ{G zSlAq$#Y<+9{#1v7XJwJ~iPX@94V5O=GNyWl%a=bHuU+-bo+sD1UH=_={%TBr9Gftr zPt-dTXhh=RUcZbjd_DLZB%be(=2KxPG62)NL8@wQXhP-Yk*e|+qy8|k%xE|$_a9Q| zx6aQ!AolekqTTB3vZ`E=ES*P|S*1THHxGQeZS3L+$pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10ftFL zK~y-6t<^h@>M$6F;Wxq5LE=&%agm^RBGv#sGGZyzr)4V$5h^6Ih~UuCAVP%#1q(>v z6o{EQ2{T6nd|muIkN+r^ZFD-FE2#(}a2y9ICG~opLZJY_`Fv)--=nogYfT)-=~pq* zpyN0U1_Mf^QfBhk9FIq4vl+hcKL!oMKq*DH+x-zr$MZZ~*X44#0ASt=&tL$(UXOmi z|M6_X?K7XjzM{5m-#{S*N~x!@dxpayLI_O9aVVF|FN4Km5h*3+z14R_N{Lyk)!qg+ zn@xmeSr3cj@tEy)`>@t(wHS>?nQ_aqKDSLehGBf$$&ah2$0L= vux%SDC5=YopDQ2?L$uZeK|qounT7rWKp2cK7sI-Q00000NkvXXu0mjfK*iT8 literal 0 HcmV?d00001 diff --git a/theme/dark/radio-tri-hover.png b/theme/dark/radio-tri-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..86f1b59831ad5bfa7bdd8a7eec101229538801d4 GIT binary patch literal 466 zcmV;@0WJQCP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10bfZ( zK~y-6t(Cj3fNsu0icU%Q6H(Fnc(PB1BPy z?RE?29JJOj#*C902F#4Z;jk#15{4o6`#qQ$p6AVl%#1Wm--@QBX^P!$Hx?4nN3x-m zh+aaa6qxyASx1&-P)b1&5yCM1S{MWYHk-{$_$!DADvsly36mtjs%zRQ=kpm=RW0tV z*J~V)$Jx5?`{O-CChQD--{h@dRXegq^*G8zHa+I|GI?QDAB51Al}zd&HH>;M1&07*qo IM6N<$f@oUBKmY&$ literal 0 HcmV?d00001 diff --git a/theme/dark/rect-accent-hover.png b/theme/dark/rect-accent-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4912911f1369b26f2be1e98b34b4b6da38ce27 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS)_J-(hFJ8zy`so4oV{Rzlb6ux-PC|#iaxB}>?!!2p f`OWo!JC)2gMRY>SIj literal 0 HcmV?d00001 diff --git a/theme/dark/rect-accent.png b/theme/dark/rect-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7c72c56dcb7f49827ec4310f4c0ca447bdd239 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS&Um^whFJ8zJ#XlBI6$W1qyGE* z9v9uTc3fSU+>~5U^g&?mu2lWKj_)5#V6G5g*JNptIj|$mV`AE*A5IFDOS)%^@SL3S zp27Zy&i(JVv$m;x-X^l0Ut;GH?=EG zQ7Vc-;(IrG{yls5xN+91;5!-#|Gu`F>@rsAefI1_*Y^10Kv_#h{W3dt-kuHtpuZSA MUHx3vIVCg!0BC@JeEgcyqV(DCY@~pSR(rZQhFJ8zy>PI%*+9hgqICWG zJ%>8j3OFy+v!9TCz~peq+MA<3)l67(^~DJro`@AJ`7Za^!ftMHi@=9_%1U!QLr+>x z4q7y&sq~y75A(HK!56dz7rwTdwM_9?2d839&))R4OW#-beE*mICiM2U8Jp+-o!XJ0 zce!r&LFqjQ>l;^9Nrq(~eKJR%d3)~RB~w;xt?QLNe$eLpj36#Uw`-+OC;wb^YLkx7 egcyqV(DCY@~pSwt2cZhFJ8zJ-?B&#el)#V!mHM zP)Au`!g~p`NvS#OOPJdQHnrADo#ZJqJGSK0tkryce&;UPA83}pT3S0LwKJ$|)hdrk zEyk?^8?G(dnieUxXjx|8y4Mqe<~7+BpS$?o)=BfLIh(@LCArayGH3N|o_+t*J>_+W z7%rK(#w^>r`=IomgYypv97?^h?>$HM+tdd(=Q-Azp4+*9WA1H<;}hMdrTQoHRL%<) pVJ(!I-?ZnuM6yI%V`*$9;}ksypLe^q9s>G+!PC{xWt~$(698@nb{GHv literal 0 HcmV?d00001 diff --git a/theme/dark/right.png b/theme/dark/right.png new file mode 100644 index 0000000000000000000000000000000000000000..bc840c23de8ff83f6c7c1ada247e328e6a1f18f2 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g!3HF2ETBu^?15ChH%V`?NQ`&G8ADcpS_L! zz~c+1zP641OWYljJq-#N4pj|We_{in$l-zxBLn_uerf=tt-CEf$n1PboFyt=akR{0HEt!Y5)KL literal 0 HcmV?d00001 diff --git a/theme/dark/scale-hor.png b/theme/dark/scale-hor.png new file mode 100644 index 0000000000000000000000000000000000000000..570530e6056afbe0b2e3dec6ed35900a84397ac9 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP?4Uei(`mIZ?cJ**}wA+t_NIv z54-WoXtHhEv13QT)dL6Lr>>GdVKHmEJFg528xzA4eHPVypLfp!>SXYA^>bP0l+XkK D;0Z80 literal 0 HcmV?d00001 diff --git a/theme/dark/scale-vert.png b/theme/dark/scale-vert.png new file mode 100644 index 0000000000000000000000000000000000000000..c6fcf6f0287c4f6d43db2b26f7cf7be4a029e28b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP?4Uei(`mIZ?cJ**}wA*>^pYs zSn%Qdo14x4mdwI&kwynrG%jZAld{Nqu%glVr~?BRC(D5=L6hbKbuxIm`njxgN@xNA DJ6kdw literal 0 HcmV?d00001 diff --git a/theme/dark/separator.png b/theme/dark/separator.png new file mode 100644 index 0000000000000000000000000000000000000000..411c9709114270e979c396b110060a3975925f02 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVj#^5!i>l77lTwumbgZg z1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!5%>*?Yc!Z9;hLr?D?KLaa2QzY}# Rf_p#-22WQ%mvv4FO#qkL9_#=B literal 0 HcmV?d00001 diff --git a/theme/dark/size.png b/theme/dark/size.png new file mode 100644 index 0000000000000000000000000000000000000000..51c682ea61c020fa2c7fda6cc9c8fcbdbfe07910 GIT binary patch literal 477 zcmV<30V4j1P)E-JRT444IT(l7rJ}4 z7JTfz7TenGc7OSDq?E*QjMkbYNpQXeg%B*4ODxNx-|w?pt>}FV+qR8mS)Fzq=X zIfui6qA1vIw+JBs7!HS@;UEa!v{I@A0mkF;=faAjc+*u?p_J;p$K&yHVUx*(AP6Xm zf;`W=%u-6U)?BaG|7Qy!ux*>Fs$RA!rCz+cuDRWA7-KNT;7BRE&&jfkH7K;Tvt@TURwrw%S zym(scH?M75Y~T0)_`VOo`Fy4gcyqV(DCY@~pS+B{txLo9leP0Y;x{cm<}e7G`A z?{KgcyqV(DCY@~pS$~|2iLo9mVUf9UXtjOc`(Ei3$ z?VbpReum%c4{)q;aBqJ%Yt9rcp_4DQ?lHuFj9WUz*(D(@AXGpwY*z82?|s*#j!7g4 zI-Zj}vxg;CP%x?I!@b4VxYE62YD5&`ej}w>eLWj`%PD=X}53n_Jh261{QQZIl literal 0 HcmV?d00001 diff --git a/theme/dark/tab-hover.png b/theme/dark/tab-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..213e82bf44c65399929a260e34c5df40df115a13 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSCVIL!hFJ8zJ+n}-O@X1|qCeLz z#)}CKtCDZrX;r;(P&B6fk!+YcL-(J%#|poz-(y%GJxx`6>5Xl?YfXc^yll=lf1mf* zV#oX0d9l}X);_iIU-w$+ScC}Q;R6Rcu+s zqtMb|$fmedWod})vMDcq%LUrjZrRYPoAa>#kbKm4!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIa=o-U3d8WZ21+RJw^fWhJ6 z`G_xcSPF*E?9Q$}wCkZLf_!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIYmo-U3d8WZ34Y~*b=5Ma>% z=B*c#cvAWgTgP7`d0E|i3@zR&EsB{=f~xO=p53y(yEgZB`**oe)fNVab2Fz1z22pC zuX@)yXO|rvhL=ouYwstAeD#g%;8@kQbK89m#e_9muR6FGg#Lac|3}B7Z?TrQ=8QST zrV-OvCkHK>@=5V~ZMuwmPR~a>U*U6>bBgCYKWTHG=kS4Txi*YPewqqMG_IQobR&bO LtDnm{r-UW|BHUx4 literal 0 HcmV?d00001 diff --git a/theme/dark/tick-hor-hover.png b/theme/dark/tick-hor-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..bc859f47194c55f9dda84199845e2678e30b5a24 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^96&6>!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIaIo-U3d8WZ21TFBdCz~FGv z-`_!t!@})=F}#c}nYX{a`YoradcX3$WE!V)NTnltCgQu&X%Q~loCID4nJ@ErzW#^d=bQh9gP2NC6dX@pN$v(U_QQVrKU5f3thz z!zopr0C-P&e*gdg literal 0 HcmV?d00001 diff --git a/theme/dark/tick-vert-basic.png b/theme/dark/tick-vert-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0a5ee1bda0c055eac9987fcae5f91cbc834801 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W+!3HFM&b|K@NO2Z;L>4nJ@ErzW#^d=bQh9gP2NC6e~dAc};XiQvt#+IwaK%n8` z`IKEDd=GHc*y=&d#+~}kp3*+5${|XD9;aR?_fAi#3kK%6E#hm-OH77Pa#;Y^x z_2ZoT<;yY;O%3WW+@y1Q?T%}wY|i&QKCvyghVi|xrOL4x0-ZpYF?hQAxvX4nJ@ErzW#^d=bQh9gP2NC6cs@^o4p4*gZjVr`RCqVv~}5Q zt5vI%mcQQh;a>9E)cfUKi4vDgd_6QbFSzf-A(1Q)_4>9%!<0#dGMd*)eRt0O-({#I zH*w$6DFXL?A3un(8pk?{`zq&I_BHd{ XpRqM5@G;#FbS;CYtDnm{r-UW|6<=-v literal 0 HcmV?d00001 diff --git a/theme/dark/tree-basic.png b/theme/dark/tree-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..c71808d64cbf1bcc2ffb13cfa39e9e23ae5f4ab3 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSlssJ=Lo9leb@cWBpLcLQ;NpAO ojaSCB;L3qOW_Mm0FE%EI`RAE>Qty?!0#!43y85}Sb4q9e00B8D8UO$Q literal 0 HcmV?d00001 diff --git a/theme/dark/tree-pressed.png b/theme/dark/tree-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..96d3a53e8eaeb53f92c97498921ec8cc80756d1b GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSOg&v3Lo9leQ&#-{Kfkf7p|!EG zap50#)=-|;PhKP>Eb8*~NVsw!klCGA#Yb{=5h-P{ jpSqjA^__@%@|16dsk-;F#c#QRPGRtL^>bP0l+XkK1sGWd literal 0 HcmV?d00001 diff --git a/theme/dark/up.png b/theme/dark/up.png new file mode 100644 index 0000000000000000000000000000000000000000..069d440f22b42b74f10d651fbea960ea64b996b4 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe23_vVDV}}a~|8J{z={y?22FdgBNz^SACeKKI6gO`KgiL zq}muYmu@Y7XKiNc)l-<)v-5lHe})3HV>Zql-5a?Xu9WT#@w)4>ba4#Pn3!y0X7=y=fddB$ xu07{rHcQxZw51UQI9Kb48LTP@dH5lWgJG`&%Yn}3Cm?$nJYD@<);T3K0RTY~G93T_ literal 0 HcmV?d00001 diff --git a/theme/dark/vert-basic.png b/theme/dark/vert-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..4f6c46ecfb4fe3bc143750e756659b54b6c7048d GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrkx8<5=cZcP}F;wba4#Pn3!y0X7=y=fddB~ xJa}-Rfmg<&prH{2I9Kb48LTP@dH5lWgJIzbmIEgHWI(nvc)I$ztaD0e0svA3G6ett literal 0 HcmV?d00001 diff --git a/theme/dark/vert-hover.png b/theme/dark/vert-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..142cccef862050ace1fe197cc58f3db46cfe7d1b GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrkx8<5=cZcP}F;wba4#Pn3!y0X7=y=fddB& xil6zg + +# The Azure theme is a beautiful modern ttk theme inspired by Microsoft's fluent design. + +package require Tk 8.6 + +namespace eval ttk::theme::azure-light { + variable version 2.0 + package provide ttk::theme::azure-light $version + + ttk::style theme create azure-light -parent clam -settings { + proc load_images {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] + } + } + + load_images [file join [file dirname [info script]] light] + + array set colors { + -fg "#000000" + -bg "#ffffff" + -disabledfg "#737373" + -disabledbg "#ffffff" + -selectfg "#ffffff" + -selectbg "#007fff" + } + + 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 Accent.TButton { + AccentButton.button -children { + AccentButton.padding -children { + AccentButton.label -side left -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 Switch.TCheckbutton { + Switch.button -children { + Switch.padding -children { + Switch.indicator -side left + Switch.label -side right -expand true + } + } + } + + ttk::style layout Toggle.TButton { + ToggleButton.button -children { + ToggleButton.padding -children { + ToggleButton.label -side left -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 -sticky nswe -children { + Combobox.padding -expand true -sticky nswe -children { + Combobox.textarea -sticky nswe + } + } + Combobox.button -side right -sticky ns -children { + Combobox.arrow -sticky nsew + } + } + + ttk::style layout TSpinbox { + Spinbox.field -sticky nsew -children { + Spinbox.padding -expand true -sticky nswe -children { + Spinbox.textarea -sticky nswe + } + + } + Spinbox.button -side right -sticky ns -children { + null -side right -children { + Spinbox.uparrow -side top + Spinbox.downarrow -side bottom + } + } + } + + ttk::style layout Horizontal.TSeparator { + Horizontal.separator -sticky nswe + } + + ttk::style layout Vertical.TSeparator { + Vertical.separator -sticky nswe + } + + ttk::style layout Horizontal.Tick.TScale { + Horizontal.TickScale.trough -sticky ew -children { + Horizontal.TickScale.slider -sticky w + } + } + + ttk::style layout Vertical.Tick.TScale { + Vertical.TickScale.trough -sticky ns -children { + Vertical.TickScale.slider -sticky n + } + } + + ttk::style layout Card.TFrame { + Card.field { + Card.padding -expand 1 + } + } + + 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 {} + } + } + + + # Elements + + # Button + ttk::style configure TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create Button.button image \ + [list $I(rect-basic) \ + {selected disabled} $I(rect-basic) \ + disabled $I(rect-basic) \ + selected $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(button-hover) \ + focus $I(button-hover) \ + ] -border 4 -sticky ewns + + # Toolbutton + ttk::style configure Toolbutton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create Toolbutton.button image \ + [list $I(empty) \ + {selected disabled} $I(empty) \ + disabled $I(empty) \ + selected $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(rect-basic) \ + ] -border 4 -sticky ewns + + # Menubutton + ttk::style configure TMenubutton -padding {8 4 4 4} + + ttk::style element create Menubutton.button \ + image [list $I(rect-basic) \ + disabled $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(button-hover) \ + ] -border 4 -sticky ewns + + ttk::style element create Menubutton.indicator \ + image [list $I(down) \ + active $I(down) \ + pressed $I(down) \ + disabled $I(down) \ + ] -width 15 -sticky e + + # OptionMenu + ttk::style configure TOptionMenu -padding {8 4 4 4} + + ttk::style element create OptionMenu.button \ + image [list $I(rect-basic) \ + disabled $I(rect-basic) \ + pressed $I(rect-basic) \ + active $I(button-hover) \ + ] -border 4 -sticky ewns + + ttk::style element create OptionMenu.indicator \ + image [list $I(down) \ + active $I(down) \ + pressed $I(down) \ + disabled $I(down) \ + ] -width 15 -sticky e + + # AccentButton + ttk::style configure Accent.TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create AccentButton.button image \ + [list $I(rect-accent) \ + {selected disabled} $I(rect-accent-hover) \ + disabled $I(rect-accent-hover) \ + selected $I(rect-accent) \ + pressed $I(rect-accent) \ + active $I(rect-accent-hover) \ + focus $I(rect-accent-hover) \ + ] -border 4 -sticky ewns + + # Checkbutton + ttk::style configure TCheckbutton -padding 4 + + ttk::style element create Checkbutton.indicator image \ + [list $I(box-basic) \ + {alternate disabled} $I(check-tri-basic) \ + {selected disabled} $I(check-basic) \ + disabled $I(box-basic) \ + {pressed alternate} $I(check-tri-hover) \ + {active alternate} $I(check-tri-hover) \ + alternate $I(check-tri-accent) \ + {pressed selected} $I(check-hover) \ + {active selected} $I(check-hover) \ + selected $I(check-accent) \ + {pressed !selected} $I(rect-hover) \ + active $I(box-hover) \ + ] -width 26 -sticky w + + # Switch + ttk::style element create Switch.indicator image \ + [list $I(off-basic) \ + {selected disabled} $I(on-basic) \ + disabled $I(off-basic) \ + {pressed selected} $I(on-hover) \ + {active selected} $I(on-hover) \ + selected $I(on-accent) \ + {pressed !selected} $I(off-hover) \ + active $I(off-hover) \ + ] -width 46 -sticky w + + # ToggleButton + ttk::style configure Toggle.TButton -padding {8 4 8 4} -width -10 -anchor center + + ttk::style element create ToggleButton.button image \ + [list $I(rect-basic) \ + {selected disabled} $I(rect-accent-hover) \ + disabled $I(rect-basic) \ + {pressed selected} $I(rect-basic) \ + {active selected} $I(rect-accent) \ + selected $I(rect-accent) \ + {pressed !selected} $I(rect-accent) \ + active $I(rect-basic) \ + ] -border 4 -sticky ewns + + # Radiobutton + ttk::style configure TRadiobutton -padding 4 + + ttk::style element create Radiobutton.indicator image \ + [list $I(outline-basic) \ + {alternate disabled} $I(radio-tri-basic) \ + {selected disabled} $I(radio-basic) \ + disabled $I(outline-basic) \ + {pressed alternate} $I(radio-tri-hover) \ + {active alternate} $I(radio-tri-hover) \ + alternate $I(radio-tri-accent) \ + {pressed selected} $I(radio-hover) \ + {active selected} $I(radio-hover) \ + selected $I(radio-accent) \ + {pressed !selected} $I(circle-hover) \ + active $I(outline-hover) \ + ] -width 26 -sticky w + + # Scrollbar + ttk::style element create Horizontal.Scrollbar.trough image $I(hor-basic) \ + -sticky ew + + ttk::style element create Horizontal.Scrollbar.thumb \ + image [list $I(hor-accent) \ + disabled $I(hor-basic) \ + pressed $I(hor-hover) \ + active $I(hor-hover) \ + ] -sticky ew + + ttk::style element create Vertical.Scrollbar.trough image $I(vert-basic) \ + -sticky ns + + ttk::style element create Vertical.Scrollbar.thumb \ + image [list $I(vert-accent) \ + disabled $I(vert-basic) \ + pressed $I(vert-hover) \ + active $I(vert-hover) \ + ] -sticky ns + + # Scale + ttk::style element create Horizontal.Scale.trough image $I(scale-hor) \ + -border 5 -padding 0 + + ttk::style element create Horizontal.Scale.slider \ + image [list $I(circle-accent) \ + disabled $I(circle-basic) \ + pressed $I(circle-hover) \ + active $I(circle-hover) \ + ] -sticky {} + + ttk::style element create Vertical.Scale.trough image $I(scale-vert) \ + -border 5 -padding 0 + + ttk::style element create Vertical.Scale.slider \ + image [list $I(circle-accent) \ + disabled $I(circle-basic) \ + pressed $I(circle-hover) \ + active $I(circle-hover) \ + ] -sticky {} + + # Tickscale + ttk::style element create Horizontal.TickScale.trough image $I(scale-hor) \ + -border 5 -padding 0 + + ttk::style element create Horizontal.TickScale.slider \ + image [list $I(tick-hor-accent) \ + disabled $I(tick-hor-basic) \ + pressed $I(tick-hor-hover) \ + active $I(tick-hor-hover) \ + ] -sticky {} + + ttk::style element create Vertical.TickScale.trough image $I(scale-vert) \ + -border 5 -padding 0 + + ttk::style element create Vertical.TickScale.slider \ + image [list $I(tick-vert-accent) \ + disabled $I(tick-vert-basic) \ + pressed $I(tick-vert-hover) \ + active $I(tick-vert-hover) \ + ] -sticky {} + + # Progressbar + ttk::style element create Horizontal.Progressbar.trough image $I(hor-basic) \ + -sticky ew + + ttk::style element create Horizontal.Progressbar.pbar image $I(hor-accent) \ + -sticky ew + + ttk::style element create Vertical.Progressbar.trough image $I(vert-basic) \ + -sticky ns + + ttk::style element create Vertical.Progressbar.pbar image $I(vert-accent) \ + -sticky ns + + # Entry + ttk::style element create Entry.field \ + image [list $I(box-basic) \ + {focus hover} $I(box-accent) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -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(box-basic) \ + {readonly disabled} $I(rect-basic) \ + {readonly pressed} $I(rect-basic) \ + {readonly focus hover} $I(button-hover) \ + {readonly focus} $I(button-hover) \ + {readonly hover} $I(button-hover) \ + {focus hover} $I(box-accent) \ + readonly $I(rect-basic) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -padding {8} + + ttk::style element create Combobox.button \ + image [list $I(combo-button-basic) \ + {!readonly focus} $I(combo-button-focus) \ + {readonly focus} $I(combo-button-hover) \ + {readonly hover} $I(combo-button-hover) + ] -border 5 -padding {2 6 6 6} + + ttk::style element create Combobox.arrow image $I(down) \ + -width 15 -sticky e + + # Spinbox + ttk::style element create Spinbox.field \ + image [list $I(box-basic) \ + invalid $I(box-invalid) \ + disabled $I(box-basic) \ + focus $I(box-accent) \ + hover $I(box-hover) \ + ] -border 5 -padding {8} -sticky news + + ttk::style element create Spinbox.uparrow \ + image [list $I(up) \ + disabled $I(up) \ + pressed $I(up-accent) \ + active $I(up-accent) \ + ] -border 4 -width 15 -sticky e + + ttk::style element create Spinbox.downarrow \ + image [list $I(down) \ + disabled $I(down) \ + pressed $I(down-accent) \ + active $I(down-accent) \ + ] -border 4 -width 15 -sticky e + + ttk::style element create Spinbox.button \ + image [list $I(combo-button-basic) \ + {!readonly focus} $I(combo-button-focus) \ + {readonly focus} $I(combo-button-hover) \ + {readonly hover} $I(combo-button-hover) + ] -border 5 -padding {2 6 6 6} + + # Sizegrip + ttk::style element create Sizegrip.sizegrip image $I(size) \ + -sticky ewns + + # Separator + ttk::style element create Horizontal.separator image $I(separator) + + ttk::style element create Vertical.separator image $I(separator) + + # Card + ttk::style element create Card.field image $I(card) \ + -border 10 -padding 4 -sticky news + + # Labelframe + ttk::style element create Labelframe.border image $I(card) \ + -border 5 -padding 4 -sticky news + + # Notebook + ttk::style element create Notebook.client \ + image $I(notebook) -border 5 + + ttk::style element create Notebook.tab \ + image [list $I(tab-disabled) \ + selected $I(tab-basic) \ + active $I(tab-hover) \ + ] -border 5 -padding {14 4} + + # Treeview + ttk::style element create Treeview.field image $I(card) \ + -border 5 + + ttk::style element create Treeheading.cell \ + image [list $I(tree-basic) \ + pressed $I(tree-pressed) + ] -border 5 -padding 4 -sticky ewns + + ttk::style element create Treeitem.indicator \ + image [list $I(right) \ + user2 $I(empty) \ + user1 $I(down) \ + ] -width 26 -sticky {} + + ttk::style configure Treeview -background $colors(-bg) + ttk::style configure Treeview.Item -padding {2 0 0 0} + ttk::style map Treeview \ + -background [list selected #ccc] \ + -foreground [list selected $colors(-fg)] + + # Panedwindow + # Insane hack to remove clam's ugly sash + ttk::style configure Sash -gripcount 0 + } +} diff --git a/theme/light/box-accent.png b/theme/light/box-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..89f1fafe972debe066bc380eb6ce10d35123114f GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|tQh(I7M#-%?8@R->?ebBcUFU<@!sI_( zn6G_p-JuoCtmk>GTpsu*Y-?W68u8BIiH!4w=0%ES-U3dU9P^mJy-oKtY%@k1J>XV{tI5eDC(G`?6|^sHskKlYlr8nI5!LYS@|wsbi+3HiO1|ka^4AEo1bv~ p)2%JmmtT}V`<;yxP|+Dr7sn8b-nUmbcC{D?9Q)`$ z(`2J}SA)KQ$HedTLI*>%j_6I>IO9M}p^gqW`}14B>Ko*Z&-$nZTg46=EKpx`I{Tlgrr^T;y0u>#_rsJTJ9(!C z70gpVQQe<=o8iyA1^IkAnyjyPDIM$Zb4j^he&%z{Yt|zYiEEGYAJvTEz0-a`ALuUz MPgg&ebxsLQ06=ki0RR91 literal 0 HcmV?d00001 diff --git a/theme/light/box-hover.png b/theme/light/box-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e691da47523a201a84d09b0428a715a91632c934 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|-C{7sn8b-nUm5Zfr3SX?@77 zW>^@&pybRLz+h**g=Ojm)?a)T84VgT3xuYw*qwKD)$zlh#6O%ZR8LH^J1_j$;!sq# zgz`I;mWFFm$0VLq^2r=OSbN`CaAR@b`)6~Kl^(5o{lmuJuPyPxB8>|sXV<3g7Zm(f z>z=jNH8ix}fMLaJsoUEWdkvj5ze}6@sD{C) XcJ|G)Z1<)CeaPVH>gTe~DWM4f_4|RJ literal 0 HcmV?d00001 diff --git a/theme/light/box-invalid.png b/theme/light/box-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..1f16f5c5c466d5c1253eafe703bdab6edae989b8 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|+$+7sn8b-nUl_`3@QIv_8E4 z&hzlh2@_WFH49;N(vq9ev|o9!`&Vnax{;sFy!O@@x# z<|(fhUiaeka_m`b&%^x2`l?~`zH;UCFMpOr+I~Cn_L*CciHFChgY}-5Jtp0{Kjpj3 z14g+A=?NV7-v0jHHFJLK^04QdmmtT}V`<;yxP|;;i7sn8b-nUl`*R?2!v_4es ze0VEczw^irF`@8BRXTTDvllind2bch;JNH;c=hweU-}PDzx10J^ zWQ*q$f}Av4mt_XL`91GhrQ7w=jN4+Np|(tWzZaZ4DAAlbD?sP;q*I%Y81VEjxWDDv zj`z}MqPP`Z#Ml^|I3$t}B=smP%9+q1;KXoxT3yva@tTA7jdO}C-fv#`dY6MsLXelm z^GyeHZ(sOsJ0pneT2#i`|68wA^RG4SF_bti=<208_xaDg4FZRhCv@x+54dh>cl|(8 VTU7X|89?tbc)I$ztaD0e0st5RgsuPp literal 0 HcmV?d00001 diff --git a/theme/light/card.png b/theme/light/card.png new file mode 100644 index 0000000000000000000000000000000000000000..09152f5f9cef96928b0a31da82fa6c1458202ba2 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-&H|6fVg?4j!ywFfJby(BP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_nk?PZ!6KjK;UO46_b92(&(2 zK3Apn=}~Sr&OJN6*Ve3hqI0q~Mtyf{$Xl-yu8*!R;acLA$Ru^JM!mxRvft4&`V8kZ zmnPr;-hbI7abCJdT90Gw^^951PFsFwe6TesjZabGInR6BHCq)HE#3Za<&>sE8NuY1 zV!nITHcO^VC_eVGL`eQabH{@@&0EE$pJu)NR&3e(>WcT_!XKpt4_5cDd!4W>vuSJD zOW*R%*B({vJ#^;to>SR>6qKd}B}|k16mQ}p#XHf>dC5hAOrn{F$0Vi%O}kgPJ&3D= zW7)dwp2s`B%-hX-xZ!LX^JNp>q@LA#PQ5L2=3vady(lTI&roUUmR07<6D0(k4%F>G z{;UxvCAAzES!PC{xWt~$(696*a By^H_= literal 0 HcmV?d00001 diff --git a/theme/light/check-accent.png b/theme/light/check-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..4aea79b82accc6946e5670e2279340631b9d5a72 GIT binary patch literal 442 zcmV;r0Y(0aP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Y^zh zK~y-6t<=3r13?sq;dhtlCaarO6G6l%(INzIK(Vk$&{8yDAxJDlyaB<^PAt6ut^5N! zu~H;yg@6bmrV%T#h@fa=Ab2c>G-g9~lKsm0d1lTG979B;{0`eUPo@J`hUX9e7=Xc!i2voSV>(uFm>UK&lMD`=p8%s=5t$00!NzR3-vl!iSDkh- kt@@d6q82PqDr_VQf3k00=>uGdU;qFB07*qoM6N<$f@R{d4gdfE literal 0 HcmV?d00001 diff --git a/theme/light/check-basic.png b/theme/light/check-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0061245e2ff351a044aa0b2fcef31c431f2d16 GIT binary patch literal 390 zcmV;10eSw3P)8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10TW3? zK~y-6t<}4Z!Y~kp;ooD&q9A^OL_(3czW>WaLZZSQg2Ey|VVNqstKG09B&VFwd^+8z zlv29i?|APCArNC^NVL}Ec}`Ij%w{vx?RHCbT@Qx3;O%ycc<)DJ05L|q_ecm~G}b1B zfK1V@O^gxw^f=2hoO6HXAA#0dHk%EL#bP{Yt!2GlV~pW&IE({-V*CA`>-G8`%(4un z)JIq+xZCYmtyYM9uli!0;PH55KA*E(E)kJI7=ZabIG@j?l&Gre3+jt?f&iDx1*H^K zRgqGnu4|g6d5gUS+omGIPx# literal 0 HcmV?d00001 diff --git a/theme/light/check-hover.png b/theme/light/check-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3811696bcffb6c440fda0c378d0c739e0afa24ac GIT binary patch literal 451 zcmV;!0X+VRP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Z>Uq zK~y-6rPVQt!ax*&;or%|WJD!}o$*?#uRzCf z=ytm_8jbXz<2d-fPcD~ZJRYY5|6`-ki1m8?87vly2=RPR5-b+%_xp4@9Zb{I#$v(A zWJ0AmmtT}V`<;yxP|~d zXm)tnp+&Ad$@vQ^lSFIVMDHKip<>r^H%EMPSa-JF0iH!imnKVy6&`w)`|Ilb&xL$4 zb*f5}<|J-we9M_9xwJrs!+L{6!}~_7WlDclW8OV=S#Oei!*zk1_QcXpbKjg)VR(AR z_0+t`mh46|RpuRO3(meQ%5rTyGM_!vF|X$E{tx0Ut@SIC4?C@V=4>5y^rX2-&V|I| za|&*-PFmdK II;Vst0NE{lfB*mh literal 0 HcmV?d00001 diff --git a/theme/light/check-tri-basic.png b/theme/light/check-tri-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..e92bea5561e55fce09f712cd03098caa5581706c GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSmU+53hFJ8zow||thyssmy@8X- z1_qu9cE9@_=Cj%~a$kywDSmlq?xG#LtC#B9*LqLe(_?t7P$nU*gCj(=TtR8clmIWs z9zpN-wQqjcMVF|?T^H?}DSw*5A@tyx0;Nw8WlBl~VlVwdM9-c1cI>>=?QOL(IcsCD zofZDqx?f?=y@zkk?MvKmBslYA2Z!F$6ty#!ho=T5OuSUxAEhnUEk2>xZLO#x%N~YC XIrp;ozT>-qE@tp_^>bP0l+XkK(A#KJ literal 0 HcmV?d00001 diff --git a/theme/light/check-tri-hover.png b/theme/light/check-tri-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d611d76c85ac64fb6f2f767d4ca2cd4b57009547 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS&Um^whFJ8zy=utSY#`D0@cfnu zM~d2A7Mdt1bHQ;sTsug*<6g_>QD%yJ-$gN;oQ#4 zH#YBkf6(dv8;$q25hiahe!cB>*`&R>G`2pbzwVIz5AKAZP|>3-kK<<+%kc_3HE1qf z)EJd*kj%4W%JPjSzKLsHfmWaY{F?j2J$6SYj*PWHk!h(rn9KUz_Ph=~CpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Yynf zK~y-6t<^hE!cZ8-@qb@}8zy$MaZ(cMDo)^L&`r=d_&E%h_ytTb=m#+&rK8HsB#vAX zFN?w^32vBLhZ90AqJj2FI-Fj9dE1`z9?f-K7hgsWSZ%Po@X&|Xp*p{|3|p&^Gu5#a z@jnTgAFQ^Zcn8me>6^XT(BUEjN1HQ1=L<@8xNQ6l`IApUIRm1pv5YS)f&o+-a8~zK zSZ%@a_57GO)`|MAGICUPL34Veex_J$czO>Gz6`+bfYds{v2pA!NV6Xvc;5r*e}o6V z4L#E)jEDwe#KHrO7)a6x58O6Da%Om7)&w~;A+86<)>q&l0TPX<#T_(P`>LG@s1}q@ zEsm9T)a!z0+LSX;NY9TI({R2!8BaCXS_cZZ@c7UAj_Xj_n^ZOv1o(6mYlHuk|nMY zCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+>Bu@p`&AhH%VG-ckGeTRj8EcIJs* TN}JvQB^W$i{an^LB{Ts5?#3bM literal 0 HcmV?d00001 diff --git a/theme/light/circle-hover.png b/theme/light/circle-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea1803a1c50a4b188b8c69eaa7e885b4a8568c6 GIT binary patch literal 429 zcmV;e0aE^nP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Xj)U zK~y-6t<^z}!XOxi;TPD~MZ2sgfZn0qih5WhZq+MTdIGyt6LpQ9MN`M9<4ijJb_93= z`3b*hnx^3?Aq2{@q^c_Fy5@X7127tmNYfN!48|CgQqNlv&){yi!#T(Cczjv>m^hA^ zPN!s9_8z?5ZaC-IZnqzy=j3^gwH6@+0J59tg8^(d8&<2;eJr89W*@A}dcDSb--00o zoO8XgE{ny25CXC+%U=udmz+)~y!XiNs6(WxDr8;PgMs_~9(lc92Lmsc%lESxB0>mc z6h(u9Q4}H5G#v~akH<)3%wV9_x&@OY`8O8FaSJM?u-5(?oX_VdrP?ZISw^1cy|JPw z&{_izzm2uF7g`hrlgZ>he)(X%_biu74u``>C`l4#v)TP*KZ4M<0Pp?B7NE6$+XB7- X?E#M&T1q`j00000NkvXXu0mjf)#bFZ literal 0 HcmV?d00001 diff --git a/theme/light/combo-button-basic.png b/theme/light/combo-button-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..b7daa04e0dc7a5d636fea3fcac79da582469d676 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP*IDgi(`mI@7t?}T+E6Btq<*I zWr=PH+Vj73Pt(!`TN9Rh3Nk4^&DwZ$Ur|>-JF{`W#N+PCf=&yj9I|ZR`pww7oAHcg z=GuutO3!%?6tn*E)nr}!HR|yHD^cH@_I}^{Kq6V6qdR)vLFqk88cXkR%N^e+{^j0# pW@iqGmmtT}V`<;yxP*Jz1i(`mI@7t?}T!#&K94_8p z5-c=9om+lY`YYDU$|)u{iWO$h=|mU%CJQ literal 0 HcmV?d00001 diff --git a/theme/light/combo-button-hover.png b/theme/light/combo-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..1d06c577dc158a8cbba0de6709dbd5e52e7767a8 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|*%g7sn8b-nUowa<&*Sv^~78 ze1wzbU`OtTtwLMMncWLD$_togKj31lHw$1czk2ZMtXCgoA3R*WZ^7$b=Hios7EM{S zO6!viyMn~=k47)%B*%s?%Uq}&#h;> zx;;(vD>IXvvgyXzu6*ODCw6xjgeM>D^@v>ZB;Tr344$rjF6*2UngHg*SBwAv literal 0 HcmV?d00001 diff --git a/theme/light/down.png b/theme/light/down.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd7e4f4586ff8ebdc2067c0b672f80296f53e09 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe23arwaJd&@KZq|gZ^TepMUE4tr4k=@hq;@PzON1HnC|Jrx__$D2FmF6$M4alxls1%yW-rzbdHTeBsS%x2TH(leK66DU{q1l_Bu@q4;BhGFVdQ&MBb@04Hc4rvLx| literal 0 HcmV?d00001 diff --git a/theme/light/hor-accent.png b/theme/light/hor-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..145b10e0b635d7724f7067974c8b9aec242461e5 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W=!3HF^gw{O+Qk(@Ik;M!Qe1}1p@p%4<6riAF ziEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v&o-U3d8WWTM{Qv*Io=uBM uElcXy0U$ULV1FXkB1_?EL*a$x&J0B+TbP0l+XkKaILbWV6cuvKT-nC{dD#ixJL`Q)>+)t_w>fXlwRmfrA=_bt z1(~y+^D->UJZ1G}eFujk%bM3+>s~*YQ|;unc#6~QZ5ys7MT%W1?bZ6e;(vfwqKv!D z@xU?;hKOvzWF31K&DJSFKNat*v`BM4baUDhs67@m)&GSb v0v*ZlV3(fE@kR;dAg`U<_kF#6e6#)rmyk2nd--<&gOI_~)z4*}Q$iB}_41#M literal 0 HcmV?d00001 diff --git a/theme/light/off-basic.png b/theme/light/off-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..cf383f0af6c145dac522457fa7115a2265b4475a GIT binary patch literal 547 zcmV+;0^I$HP)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10kBC# zK~zYI&6dHgqA(OdPn(ej+%yCtiR@(O|9^@*+(9BC!LEw1ptB(QgfWiK(RrQ~y}7wL zX>aKj&N;^n=N!fuj4@bi>HD5x80KmJgp?A`^9X_ftu#x~_Yv z(BDu>k)|nH>)V3PIm)u6s;d7gHfOb3k*4WoEzcjHAO}!Y6=hjo*1upp*14RNk|>G@ z!w}#10chKnrfI0_nj5YAG7g6W%jI(H%V8MYZnvBCoacFDS#}Yd)3z;np40dJ+a#4z zY`0saF=iqsrMxQ#;QKyVmfgH{ucGTZj4`9&HBl7Zl{@46K5-ns%MV}_wAN07VHiGK z;5)g`V68>Y`{rqfCbqPA>$n*TJq_vhj&)?dEN~!TB zan3no4Ez0lk|2a2j^iJB>Hs#I&6glRQ4}9BEC3`)!g{?1uBMqZO-YjE$E40&%fXF- l)fhuj6rVS+Uh_#K|8EO<@sy`G&7%MS002ovPDHLkV1g@J_;UaN literal 0 HcmV?d00001 diff --git a/theme/light/off-hover.png b/theme/light/off-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..893b39cb40feb6c232d9da5768fc39272523c622 GIT binary patch literal 663 zcmV;I0%-k-P)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10whU9 zK~zYI&6YiG;!qTYKRZvP;zz;~0a>ts=Y|eCpd-k8K!Po>iR=N1MF1_(xuOX63W6+< zpnxusfhiDS>@WlvoSD=4yyN>m`RCoM>~^~y0c|!LCX)${<1n30S*=!le0&6Bf2Bwy zLOdQv*L4iTz%UFR9v;5rlpx^i>npupkL7ZCSD^2dOeQf+6T>i018%oldc7W_(db9P zf-03t)M_;pMFBuPEc_2}0K?&se!u^DEnxpzgK$C!ip3)Ne4eMLCje%%8RPL7%d+r1 zFEq%(U_dUH!!QgK&+~RKFE74tE*_85Y&J=!(uIPN(Aw2q7pG3V&>MVZtejLcLx;0s?fqU53M9Xq#T6N~OZ{ z^E2?0)+jEP)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10tiV& zK~zYI&6Yt=6G0S!za48OQ80m^w84{-78OY>p5SJ^8H>h));k_NQ{)F2Nr*QuaF;|A zQZ~_xaMhD*P_(6q@uU?s(FFC-+A*=z5ti|z40x< z>IO_K!M*2uD`ql23{y!^maLWgp%vr+rk}y&Qf+N%t@V5ku09HO_9`g55S$#yZ*3&!GS~xS32)3UfO3k#h`FQ(n$LYv1XcXu zuaL>f?!V7HeZ;%|xL#LgT7eCtrzs0mv_05Ob6=a!jkJRriux;L^5Avzx#yywQgMHU zOlBOZbGxy;2D6SgmWqQKjZ32ric&?2a3jg(%|czS)?$5Kkcw@#x@;b*|Px>?67X8{Y>;Zm$_n#n9mqizLmkHFoeyl<76sU&2E|Cf?r0TUx|=X_nv z99S1tVf?A|!o8%gO9oc+(ryz3_+1rIy8up6ri`CHkNk(iaO^N7A|jQF!Tuda{y*-i Vt@sM7SnB`)002ovPDHLkV1ioTBNhMv literal 0 HcmV?d00001 diff --git a/theme/light/on-basic.png b/theme/light/on-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..23ec72fa727e4cd496d1ee4e7042203847988866 GIT binary patch literal 538 zcmV+#0_FXQP)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10jEhs zK~zYI&6dH6qd*WqpUuWbb7@405O498|NoTS%uOL8m_D`9gS`hyMxB{#n2o!>lT{S> z=q{~tthJUI)>^dIXst2E&~+Vs-_Ohb3Lylp>*D)9N-305IF9qF&Y25duUCqqpl#c? z3jGNwB}tN?l=@oGT1!zBlx6u(#pdjGJCY=M#Nz(2204JTEGdfO5&weWT9=j+LJ)=_ zK@i}19so_#P}en8RWa_g%jLp$yB+$n?|XYXofhpm*L6wL^dUBfwrH&f!6ga9@TuG#&+~|)Xp+-fBaAUixd9La!H;W= zF^KWKFTpFP_g!t*bsxW(H83A)j^iL)*Io3bP1C$wd%N8x@n*9@_`d&crwMgk|G3uo zeZ+kBy_>44UOGi%3{_Q4a!RQ|P)fO!AJ$s3EPE(^b literal 0 HcmV?d00001 diff --git a/theme/light/on-hover.png b/theme/light/on-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d55f7ae0df5c1afb4026a8de6da27e6f7f7bba59 GIT binary patch literal 649 zcmV;40(Sk0P)r~Gynhq8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10v1U` zK~zYI&6drs>0lUzpH{=jPojyRG+e;fi5WA@5ceSA7Tkn;khlm;G3&^H_6kTt!hjhm z&OoqrJNAyF`|LIA`c~2>{dwOdold6{E*%aBrqd~wWig-6*=#oK_j`BjpXB%Z35UaI znuf0H=(>*2=lhhC+<=qGgkG=5dcA%t&{v8^qg1O^bX|W8csw5I^?Hm(qaOuxE1%C( zsZ@|82>|(W@EhO&hQlHKe*b!{!1=X$4W}pyxm=D+CPO?P2Vk*SFdmOF3856^AerrmC{*=(+!s;V@bP2}lx>M5L}C{N)4 zlF20XdL2bkuHI_3!Zb}}%d$L!1IXoaPvI^~CX-~d**nj&Eadro?iCvVnM~&8>})ne z-fp+=X1Y@>7W;Pg^7CA@-EMDV<~PW_)Feql4uwLV-gLQKzMKsPgUFhuy_@My|a;iM>t86sMTsWK!9$y%WydK6!N<&7K@b2W#B`bsZ=Ty3Wfg$ z1?MMMC=@7_N;l74SWVNU+wHPit$q|vRaL6hDnf`m{}UjbE5B))ca?v)+r1Si5C{;7 jM9?%1Ap}B*hn4>iGX(J0!$+Lu00000NkvXXu0mjfD^w=D literal 0 HcmV?d00001 diff --git a/theme/light/outline-basic.png b/theme/light/outline-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..2e798741af582c306ee95d06b5c966006fa560ae GIT binary patch literal 508 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10f|XO zK~y-6t<}w{t1uXa;a8;!)?(6WrFP)`Ur`+dblODx0iz{*AeNqXv-j!ota%<2zPRE! z=NvC_&S8wf7{f3OSZe_Y!;mV6m5e5(h0Yy=uwZ<5;fa_7u=krI{GkUpPsHzI*9KJDzD2g~7 z4j*G{*1;KL7Ent0&)Ayd@wk9}-~T$%zuo094EWPDJ?`0-gkgxacA4`3h;t6l^YB-B zYo=*px7*>zaZJ~Bo58ki+3)xGLI||hn?bELX__wJIF7V!yJ>gUT7(ezp68Ke8A>VU zdHxui=NY9GS(YtB0UrHUmgPt2JkOM6iInnDV}JBvUDs%>$@BczU$Jdllu}43A5HTH y0vKbcs){fSIUbMS7VPbI!&>`u!9Hip6YvGtJMIAU<2DKa0000pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10pm$T zK~y-6rIo#ovOpAuU!aFIv{;}eOz=AV>-3KNxd5$=HC6`h17xrQEVNe9hz)wa!qx1j z8+TowawhZ4$(+o41R^5baXOt41OdV@#A>xdnx+5%MNyz>8cfrKX_}BE>Ha8$d*N(0 zgX_9bRTY+Hp;RhCQ4|2ccDu!5v4H1!Sg+Tp*Xv-6eJ?zp&v0EA^Z6X@b{o2`KivM6 zIF4c4HcZn*tyY5|2$v1|WICPFa5$ta%jmacSw@4wfE>rUt$~Qh_kHU3`!C6^91aKS z^?DQp!9|$oId!{TilXRc*_Akssnh9Dp64V6K>$@%Q7)ICzS%QMr4m$C1?Lc@`$w#wyl330#QLzd;Yg^HqJx7$H{+w=($K@bFpvMgh_+r2GJ z(-g8SL)0`4Ns_!ROp*k}ViBTgn(#dDZK3b`Fbv}&+-x?8qUg`EIF7N|Y%W4cl2EJF zVB0nhhr`RVEX!cqHk!>QBuTn-nK1^&7{=oqFmve9S+#uyC40PrQghzPFhf^&{m ztM%hojG_pW$pnlsRIAlnd_4p#=NyjXpin5lvMlJjj*pKI0RIQo>zN&o-= literal 0 HcmV?d00001 diff --git a/theme/light/radio-accent.png b/theme/light/radio-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7329d737b0fff716e9aa3e3278c8e3373f5d46 GIT binary patch literal 554 zcmV+_0@eMAP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10k=s+ zK~y-6rIkHPTTvLtfA^?`3|5-WONCMeql;jiw9ui%I~v8IAHl&%H0l>9D5*}R{R|d~ z8LQXTNlTZQT-0RIWKjcg5Tohs@DOsn_uRJ8ADrPlFMrO4x*8kZF&gazk!jjty1!mbwC|e^n#n#W3eXD2y9sT zoWnAx%8lOH+@=m|KySaOdCI08f^SPu1}L*z@7yni3))4!-RuSxH}%dH8>+WK`}M8d zw2mjH zY*^CH6i5qN9Dlml@;lisc*0^+8$si{He(tH7b0OV(s26<|ZivR!s07*qoM6N<$f>DO}&;S4c literal 0 HcmV?d00001 diff --git a/theme/light/radio-basic.png b/theme/light/radio-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..793531e8943c861c9cf804d514432e8d3c275354 GIT binary patch literal 482 zcmV<80UiE{P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10dGk} zK~y-6t(DEHvoH{b--t~hlrlSo&JFbb@1^d#GEi3;Diuu|@-2#ftiq5kV<6Z-tr*z4vg=VHk$D;%AI8U}g}}vM{9t z=Ny`*`B5~dC<-w1w9dwdPhVY}U;s;X&}o)Hmb*Xwmr$jmRY zkvz{|PW73t>yX`Ux5ebR&EMog2>-|CFHlM$(^@Yk+qPY8yj(7e@y%v~%v!scbj~5h z_!ht4@2g{GtwlEf7DxKN$MJZC_Z~4u#2DedM^#m;V@5>Ci3rA+#i9@bPN&mi^BiLg zhzOZdYIO{L12aDkWqj45C_a{zWjS4A)7UWcN7Aw^vET2f_1gt2BB<;7`wRA&Z+-#) Y08+8fU7Crx_5c6?07*qoM6N<$g1D^HssI20 literal 0 HcmV?d00001 diff --git a/theme/light/radio-hover.png b/theme/light/radio-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d6faa74d8e7ffbfccdbe4be5a8e25f37f8392a8e GIT binary patch literal 583 zcmV-N0=WH&P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10n|xE zK~y-6t(CvdqCgbI4}TiJ0!<)RSX<0c*;+s=!o&Ck`vNw;f^R?^TlEQyG8TqX3KP@> zO$ZITh0!%Inq9M}n|tp0WriVlq}%OwLrFzZAPhrnHXFooj5JLF0QGturfGsw3Q8#y zMJY!im4WN^8jLX$t8`sQzu$*tSz_SzdIe()i^bw2s4UyI;kqs)Ndf@K591pc z0LWY&HYu{0=ON0*tY*VGjjCfTAd%hGF>j0ve45eBVdA-39qk|e40o=zul&Y^U>-Cz6tUI-fu1~5$%s;WX&RWzGTbUGa@mrLY%UdgDc3OSBr z;qH9j$Is7CrCzJm;CY@fv)k<;UoID+`8ejkc<1x^&u{ZTBuNrvP1A&C6h&`?+wE3Z z*E9{XX_`WlF@`M5D)lVO5CnlR(`vOKQ%Z$qk|Y=ohghvv$nzX|o+AuHj7Fp9uqcZV z0+mtNpO1z20+O8L*slOePcIH+_|181OvrxwE%G;Qj<~&Obf@gb?8q@Eew+ V%yYh|vQq#6002ovPDHLkV1n(^^Gg5# literal 0 HcmV?d00001 diff --git a/theme/light/radio-tri-accent.png b/theme/light/radio-tri-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..86dd4cb5b9a3d0d991f0ab17a5e9afffa93f15a1 GIT binary patch literal 471 zcmV;|0Vw{7P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10c1%; zK~y-6t(Ch@0znjpza7NVL}DY+Mv1JgSOJ|uJ3(V%?;98{@dZpUXyF6+044;sRB53S zOD@JsViYPR!49*o#e}f#vKm{29_vm}tiXH?(l_wbu`f1j*#{>v*j;r1>fewl!D;1hkX6YrWMd!{ITwA$I52=* z1&&IV2=g`AyBr;6R$*V>tLW)6I=4E!l8-40b$I-64}9)`)&Nm#xQF$nH9=I{lLOwi zV5*r`&-xaZLG5AkICm?7YZmV=Z10r?!0*vsdFGg{>i`q*8Lz7 z>g0fN6~vAT0iS!=(kyHTL3lkfx!vk)OO`VMvIHf=pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Ub$1 zK~y-6t(Cowg&+_{zcE)yh{bf8NbmbUj=dyWIfWX3irK>G-m7NsMm-fUa54lKNL3X( zR23ou5kcSgn5GE;5JeHJwP0p2Gl*!v6tovMO#|;e#&JAMe#aOC=Ny>%T&Sw>-lMMT zKSg_zB!P2o>j!J&iVOhix`y}uQ`j`kCD}?Wm!U15s1jw1NaZ)I6_1g z;ZukRg0AZx6ZUbZCeyYaTuSb>G#?^0TJO9MG=N!I0Vl!_(m9p z2&}bFBnJSn)*{%y#XB(bA~eR_mKkFfArXB%?yETGKt#(aGc%GTxhzZ5bSq=qwQj=%Cfv)VBfj(1^fWfdzy`&3c88_0000pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10bWT& zK~y-6t(7~D!Y~j(U*fGpk(5EAw{wT2#lT584ktmF7Pta&dL+{Ek$~E;MFhKoEV~LSBWm$4K8~|vwTEuaTQVOLMLWujVc=y8Pa)~j9-EQ}= z_&Z@3((Cm|lB8aEKA$nhuvjdfitb6%6s-|w;3;$KsJ2Srifmu2}j;d;I1<8(UJ28Y8T zold7Vwpy(ijYbdi$K&zq+Wd!_#|41rd3*#xz-F^~2-aor8$l4@$8r4cjX%+DxAB!y zZxc!>D`6BxFU!I(tb{@cwAL>R2ZI4Zh^op-l8~lpV_BAENGXADzm3+qku=LPy4~(= z{P4kAYnemmtT}V`<;yxP|*rc7sn8b-nUma@-{h0v^|{e zt-xjybyMJxn82Mwf-((W9yD6p~b9X`;Q(ycBrE9(>=y{kF@tWxIDS! zxOSoGhnj~WGEVcHLJwpy9{j1c$@bvh^5%WBT?_6stomBOv!*b^VQZSjH&5w+b+iAz zy4Wn$zq#^4v)muFVdQ&MBb@0QVJc`~Uy| literal 0 HcmV?d00001 diff --git a/theme/light/rect-accent.png b/theme/light/rect-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0867428b8d3fe2ecb6963729486045250cc5c2 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|-$D7sn8b-nUm2xtJU!+8&lK zJEQbQYsbY+64Q=yXT%-Ukg{n!s9eGHQJ`#d>>0P&w`~qcxpdF2JDecM!mj?Vx`BP) zCr!bLkGM|T%IJMqQJ`fqL4AXqlT@?SbfsqAJM;1`q_1V@D-L+P_Qbj${MF`X9a^;o zug|>S#gh>)abPdg+y2d06L_yZ@K4D2lX#Y)WZn;E_t*ee%}d`4HoRqmmtT}V`<;yxP*J<5i(`mI@7t>z1(_9jTrRS* z#wbY%uwJM)HCezV;;`sor+)E+*}*6DADm5_{q0`$TGr6knFsHFR8e9wc6KR<6~8p6 zxZhCDdH;iZ)|*!CJH~L}?!r|k(!NRUHa33JQCj}4Pi9%I^#ex!AL1S^i4uZ}#>Em5 s*{))OE^Abjwp^RANN>T`wjeIMB4sCzT5<88KqoPHy85}Sb4q9e0I&R3&j0`b literal 0 HcmV?d00001 diff --git a/theme/light/rect-hover.png b/theme/light/rect-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..9252c4faeab9f329e24eec475af8b00fb6add029 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|;>j7sn8b-nUmb=C&G0xISzS zmI%IR(8QV~%I%ie_U3@jykqMoHuSMgnDFnq%31AsP79v!d=TBfv$NxbiEqXGPQy*_ ztC9ged=^iMe^4P-b{`WPntGKGpOE_OIt+`tI*Ouq7D$fH8zGBuP4{$h4B?oWds>n2kb_9e!msJ!yNgbXtK#TXkq?aHuWUKb6P3SLJ!G zd%|w&Ir;g|Wv_Rc-`*C>V9_oxt@i$YhJ;0{mP;hhWnkEs6=Hhl#2>*Tpc5H9UHx3v IIVCg!0GXp=@Bjb+ literal 0 HcmV?d00001 diff --git a/theme/light/scale-hor.png b/theme/light/scale-hor.png new file mode 100644 index 0000000000000000000000000000000000000000..d11f5087d5493467b85dc522ac7d161527f83bb0 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP?4Uei(`mIZ}Ol2|NqysX)&o~ zNttCm@GzY4^v%u9A*KZ%s%O4pGwOTxG?1CSv610^5m(2F47Hm;oeZ9?elF{r5}E*E CeKT+X literal 0 HcmV?d00001 diff --git a/theme/light/scale-vert.png b/theme/light/scale-vert.png new file mode 100644 index 0000000000000000000000000000000000000000..f78595dc4e0a85cb4d68a30518f17ea38608a71c GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`kNVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP?5f;i(`mIZ}Ol2|Nqys**ti2 zbF)TGa&mIbDajchPEBHTl77lTwumbgZg z1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!5%>*?Yc!Z9=1qWIaFdIk;y=9Fbm SxAFre7(8A5T-G@yGywp;h#-If literal 0 HcmV?d00001 diff --git a/theme/light/size.png b/theme/light/size.png new file mode 100644 index 0000000000000000000000000000000000000000..bde3adebe74a153b0c026906ca09e70d59b636b1 GIT binary patch literal 471 zcmV;|0Vw{7P)-JJtZ z&dE*GJkK*9PEi!(d5(yXWf|&IxbJ&Tr_-XXwFIB0j^p^EpU>y#a1=#sHX8txQf#-| z&ujlo+qQ@Z#+bj8z4v^5ec`=dysqmg%aX_A!8A?plfCy`uh&H%4hPojHRto0VHf~# z&Y|C>)^+_$hheyYKi=EgaUB2B)>@1)FW#RE^WIa}HE|r{oO`*mh>#@7H{AC<<2VvU z(E?A?MBBFCpCR~PuxT1ZgfI-zMNx3S-vQWcHthF%x~}7LxiAa^#u$#rBdgVl+wDeG zRVbxM)0803^X1g4s%YDmq9~T-48uTKmNZR6RaF4Y^Gu%S1R}D)N-0DHtzREOL=X{_ zQj4dxCdjf3Yb{!9(lo^wLy{yo=LmuT=Nw6r5QZUXnxeJFTFY*?;~#xqs!OlVh@t=h N002ovPDHLkV1oBe)T00Z literal 0 HcmV?d00001 diff --git a/theme/light/tab-basic.png b/theme/light/tab-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..365fdffacc6dd334f2f7bcbef2bb9eb0e29d91b0 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSGCW-zLo9mVp4%vRL_vf(P*O-p zYXRf0^=)h+jZ7XU|0fkcJCfY5ysg2!+QntfRtKR;3DV`KEEiwvx+dkNY4L21;jtaO zu?P2-t4!)QWZ1wv$zzgSa{8nR_jXus?)@_BTYj_jod<0D8S5*!3_h=@u{QwP$>8bg K=d#Wzp$P!gcyqV(DCY@~pSGCf@!Lo9mVUNGchQ50~w_{z<| z=+i%UlUFMOcA3reHItYiY4%C}0qcF0%(bl@44xi`{L99; zcVzdLSGd?5V^A;_6fBt3zcF9s;qLSACb87}?zVcs$X{{be}nvaVZ+XjhZ6iiOBp;} L{an^LB{Ts5OsGm% literal 0 HcmV?d00001 diff --git a/theme/light/tab-hover.png b/theme/light/tab-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..500380649a9e64ee6ac01cd8e903f786437c6b0c GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSrg*wIhFJ8zJ+qLv)j-7IA~)N` zU2TE_HlCL>BU&pb+-=h2ka85)U~68m>i%P?N$acFEJD3B=RQBVNvGm{r{Sc@2dM5f$n4QboFyt=akR{ E0CWpq`Tzg` literal 0 HcmV?d00001 diff --git a/theme/light/tick-hor-accent.png b/theme/light/tick-hor-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..6940b1cc15b46176dfc022df8382744c39a97f1b GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^96&6>!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIbHo-U3d8WZ16GUPj$z~FZO z{?gths)<`nR35RNnR-R7kgZv{fN|rF#=AM;n=dXC}leo-mmI|>4 zH%d?1|A>6ByDakifljAtf${@OW}2*!SQgp*S*AxNwm3p!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIZyPZ!4!jfrn3ZRB-U=-Us;}~TFWVrYY?!3HEZNY`WoDb50q$YKTtzQZ8Qcszea3Q$n8 z#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIZxo-U3d8WZ16GURGDU~rxP zGU3sqC%jF1mL3Y`A4P0i!!Pb$v3Wsqn}EQjrB0c%*CyZpC0GB;)k{4nJ@ErzW#^d=bQh9gP2NC6ei^K@|x(U`dQq9PZQqe%P5 z_qmdSWde6HB6&_fVl`QxAi_KEzym>>#)^)&X}f3ink}zvFy#>QJ#P@fa`?d?z7Geh z>jOhe%_HO=RJ0!NR#@4n)&5qZi|5Iu6@6Jd><>HLx6-xHbzEkBb?^WzOI+N$r4nJ@ErzW#^d=bQh9gP2NC6d*sA`k0D z{v-*Zm5hN0zQ*(Nu3%!FkWrA7?w6OqU2$>Q-tTeQ2hTis*TJ!;v*W;-fY2@1COn%{ z-SbiE7rXuW=A5+S5)3XZXLxSj?cW&xuCK=T_q3TmrPP#8tm0C#I_9PMVz2Vu8*VNa ds@>O$%JVB*e|}lcG#Tgw22WQ%mvv4FO#qdRR<-~D literal 0 HcmV?d00001 diff --git a/theme/light/tick-vert-hover.png b/theme/light/tick-vert-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..18cbec55f6d541559da489b18782d9eb74023171 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W+!3HFM&b|K@NO2Z;L>4nJ@ErzW#^d=bQh9gP2NC6d1_jGX#(U`dQ(nj7E1qO$U z{NWNgYwk2;JXTQ2IV57NX>!qo))SNhEjvt)7 zYL!!VuVLG^TtUsHHhs#!_t`hq1$#Z5^Vpc@u=%lw7REWxPj1USA>d?KW`5rIlPRx& zlfu?(>l{EbZF3Yu(0cO7C*_eAhYs>AG3%{p7VvGo|$IU9om8N;skgbRvVN LtDnm{r-UW|EgWaU literal 0 HcmV?d00001 diff --git a/theme/light/tree-basic.png b/theme/light/tree-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..755062b10eafc9d5daff1daa4ff664795df7be2d GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSlssJ=Lo9leYreg?S4boFyt=akR{07Qu@CIA2c literal 0 HcmV?d00001 diff --git a/theme/light/tree-pressed.png b/theme/light/tree-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ee284160ac1ba69c75c3f4b73cdc9f02bf02a1eb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F_2CHVaAGyU%i10$r9Iy zlHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pS%sgEjLo9mVUNID8FyJ}tuvPrn zF~KuuCoE;KiDIa`GVzN+7{er;i1K3HOW_9^7@67baDCgdjxBZ(yY>u!?>L|d44$rj JF6*2Ung9?fGBN-F literal 0 HcmV?d00001 diff --git a/theme/light/up-accent.png b/theme/light/up-accent.png new file mode 100644 index 0000000000000000000000000000000000000000..54a20f851fe6beb86caef6c4af98976eb9e37c13 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe2J_jGX#;h0%^MlsJRQH1s3d-WN! z*g2OiYMZ-f1H&P%2^A`woZ=#Vxf2u&6%L4oUfg=+!48cR+MLSgXZl=BnI*54{vkaf zcwPVMuTzwEYq1{Yb{=5h-P{ jpSqjA^__@%@|16dsk-;F#c#QRPGRtL^>bP0l+XkK1sGWd literal 0 HcmV?d00001 diff --git a/theme/light/up.png b/theme/light/up.png new file mode 100644 index 0000000000000000000000000000000000000000..16568f232d00441c737f829ddbc0d49bb09b8a5c GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#X#B!gc<#oKLK$hOI#yL zg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpe23?djqe!Z91h`=VjcqrzIbh88o_*+%~ZmtXZ|{)vkAv$3GrF^DR)swD$h~ z8P9*-xhq|MzfC}Izh>k#UDdZ|a#YLhC*JuppFyFefOUgfY(Q{~ sjcv^X`;a-DyG_(2LM>JmRA{p>=xt_G;WS)Y2h_me>FVdQ&MBb@0IPE=od5s; literal 0 HcmV?d00001 diff --git a/theme/light/vert-basic.png b/theme/light/vert-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f61ec929dce1436a301c89dfb475313334a923 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrkx8<5=cZcP}F;wba4#Pn3(+M|NsB>Y;0_8 xo72x5B`_a5c8muEd?HdeHUzdV=4#*W#E@ISuJUUaH_##m22WQ%mvv4FO#lw1Ff9N8 literal 0 HcmV?d00001 diff --git a/theme/light/vert-hover.png b/theme/light/vert-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdc9d02278550b9e8542460a0453cc3e6bc09ea GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrkx8<5=cZcP}F;wW40e_3CGI>xT@0SCelF{r5}E*GcPy^} literal 0 HcmV?d00001 From 551ad9eaacb81b511850369cfd80dc46f0da4cee Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:04:01 +0200 Subject: [PATCH 2/6] Add LogText class, imporve version of Text --- logtext.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 logtext.py diff --git a/logtext.py b/logtext.py new file mode 100644 index 0000000..bd10fbd --- /dev/null +++ b/logtext.py @@ -0,0 +1,50 @@ +from enum import Enum +from datetime import datetime + +import tkinter as tk +from tkinter import ttk + +class LogType(Enum): + INFO = "INFO", + WARNING = "WARNING", + ERROR = "ERROR" + + +class LogText(tk.Text): + def __init__(self, **kw): + super().__init__(**kw) + self.tag_configure(LogType.INFO, foreground="#000000") + self.tag_configure(LogType.WARNING, foreground="#FFB54C") + self.tag_configure(LogType.ERROR, foreground="#FF6961") + + def log(self, type: LogType, text: str, print_time: bool = True): + final_msg = "" + + self.configure(state=tk.NORMAL) + + if print_time: + final_msg = "[{}] {}".format(datetime.now().strftime("%H:%M:%S.%f"), text) + else: + final_msg = text + + super().insert(tk.END, final_msg, type) + super().see(tk.END) + self.configure(state=tk.DISABLED) + + def log_error(self, text: str, print_time: bool = True, add_newline: bool = True): + if add_newline : + text += "\n" + + self.log(LogType.ERROR, text, print_time) + + def log_warning(self, text: str, print_time: bool = True, add_newline: bool = True): + if add_newline : + text += "\n" + + self.log(LogType.WARNING, text, print_time) + + def log_info(self, text: str, print_time: bool = True, add_newline: bool = True): + if add_newline : + text += "\n" + + self.log(LogType.INFO, text, print_time) \ No newline at end of file From 5e43bc23904224339e97cb5d8dddfe334aab9142 Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:13:46 +0200 Subject: [PATCH 3/6] Change PySimpleGUI to TKinter --- easy_daplink.py | 410 ++++++++++++++++++++++++------------------------ 1 file changed, 208 insertions(+), 202 deletions(-) diff --git a/easy_daplink.py b/easy_daplink.py index 2b5db74..5a1b183 100644 --- a/easy_daplink.py +++ b/easy_daplink.py @@ -1,181 +1,178 @@ -from datetime import datetime -from sys import stderr import time import os +import sys import threading import subprocess import shutil import psutil import re -import PySimpleGUI as sg +import tkinter as tk +import tkinter.filedialog as tkFileDialog +import tkinter.messagebox as tkMessageBox +from tkinter import ttk from settings import Settings +from logtext import LogText SCRIPT_FOLDER = "-SCRIPT_FOLDER-" BOOTLOADER = "-BOOTLOADER-" FIRMWARE = "-FIRMWARE-" PROGRAM = "-TEST_PROGRAM-" -START_BUTTON = "-START-" TIMEOUT_MOUNT = "-TIMEOUT_MOUNT_POINT-" MAINTENACE_MOUNT_NAME = "-MAINTENANCE_MOUNT_POINT-" -PROGRAM_MOUNT_NAME = "-PROGRAMMING_MOUNT_POINT-" +TARGET_MOUNT_NAME = "-PROGRAMMING_MOUNT_POINT-" + + +def ask_open_file(title_dialog, stringvar: tk.StringVar, setting_key: str | None): + file_path = tkFileDialog.askopenfilename(filetypes=[("BIN files", "*.bin"), ("HEX files", "*.hex"), ("All Files", "*.* *")], title=title_dialog, initialdir=os.path.dirname(stringvar.get())) + + if file_path != () and file_path != "": + stringvar.set(file_path) + + if setting_key != None: + settings.set_value(setting_key, file_path) + +def ask_open_folder(title_dialog, stringvar: tk.StringVar, setting_key: str | None): + directory_path = tkFileDialog.askdirectory(mustexist=True, title=title_dialog, initialdir=stringvar.get()) + + if directory_path != () and directory_path != "": + stringvar.set(directory_path) + + if setting_key != None: + settings.set_value(setting_key, directory_path) + +GRID_PADS = {'padx': '4px', 'pady': '2px'} +MAIN_PADS = {'padx': '4px', 'pady': '2px'} settings = Settings("settings.dat") -sg.theme("BlueMono") - -layout = [ - [ - sg.Text("OpenOCD 'scripts' folder:"), - sg.Input(enable_events=True, key=SCRIPT_FOLDER, default_text=settings.get_value_or_default(SCRIPT_FOLDER, "/usr/share/openocd/scripts/") ), - sg.FolderBrowse(initial_folder=settings.get_value(SCRIPT_FOLDER)) - ], - [ - sg.Text("Select the BOOTLOADER file:"), - sg.Input(enable_events=True, key=BOOTLOADER, default_text=settings.get_value(BOOTLOADER)), - sg.FileBrowse(file_types=(("Compatible files", "*.bin *.hex"), ("BIN files", "*.bin"), ("HEX files", "*.hex"), ("All Files", "*.* *"),), initial_folder=os.path.dirname(settings.get_value_or_default(BOOTLOADER, ""))) - ], - [ - sg.Text("Select the FIRMWARE file:"), - sg.Input(enable_events=True, key=FIRMWARE, default_text=settings.get_value(FIRMWARE)), - sg.FileBrowse(file_types=(("Compatible files", "*.bin *.hex"), ("BIN files", "*.bin"), ("HEX files", "*.hex"), ("All Files", "*.* *"),), initial_folder=os.path.dirname(settings.get_value_or_default(FIRMWARE, ""))) - ], - [ - sg.Text("Select the TEST PROGRAM file (skip if empty):"), - sg.Input(enable_events=True, key=PROGRAM, default_text=settings.get_value(PROGRAM)), - sg.FileBrowse(file_types=(("Compatible files", "*.bin *.hex"), ("BIN files", "*.bin"), ("HEX files", "*.hex"), ("All Files", "*.* *"),), initial_folder=os.path.dirname(settings.get_value_or_default(PROGRAM, ""))) - ], - [ - sg.Text("\"MAINTENANCE\" mount point name: "), - sg.Input(enable_events=True, key=MAINTENACE_MOUNT_NAME, default_text=settings.get_value_or_default(MAINTENACE_MOUNT_NAME, "MAINTENANCE") ) - ], - [ - sg.Text("\"DAPLINK\" programming mount point name: "), - sg.Input(enable_events=True, key=PROGRAM_MOUNT_NAME, default_text=settings.get_value_or_default(PROGRAM_MOUNT_NAME, "DIS_L4IOT" ) ) - ], - [ - sg.Text("Timeout (in milliseconds) for mount points: "), - sg.Input(enable_events=True, key=TIMEOUT_MOUNT, default_text=settings.get_value_or_default(TIMEOUT_MOUNT, "10000" ) ) - ], - [ - sg.Button(button_text="Start !", enable_events=True, key=START_BUTTON, expand_x=True, disabled=True) - ], - [ - sg.Multiline(disabled=True, expand_x=True, autoscroll=True, size=(None, 30), key="-LOG-", font="monospace 8") - ] -] - -window = sg.Window(title="Simple DapLink board", layout=layout, margins=(32, 32)) +window = tk.Tk() +window.title("Easy Flash DapLink") -def main(): - default_bg_input = sg.theme_input_background_color() - running_thread = None - while True: - event, values = window.read(100) +window.tk.call("source", "azure.tcl") +# window.tk.call("set_theme", "dark") +# ttk.Style().theme_use('azure-dark') +window.tk.call("set_theme", "light") +ttk.Style().theme_use('azure-light') - if event == sg.WIN_CLOSED or event == "Quit": - break +string_script_folder = tk.StringVar(value=settings.get_value_or_default(SCRIPT_FOLDER, "/usr/share/openocd/scripts/")) +string_file_bootloader = tk.StringVar(value=settings.get_value_or_default(BOOTLOADER, "")) +string_file_firmware = tk.StringVar(value=settings.get_value_or_default(FIRMWARE, "")) +string_file_test = tk.StringVar(value=settings.get_value_or_default(PROGRAM, "")) - elif event == SCRIPT_FOLDER : - if is_valid_dir(values[SCRIPT_FOLDER]): - window[SCRIPT_FOLDER].update(background_color=default_bg_input) - settings.set_value(SCRIPT_FOLDER, values[SCRIPT_FOLDER]) - else: - window[SCRIPT_FOLDER].update(background_color="#DD5555") - - elif event == BOOTLOADER : - if is_valid_file(values[BOOTLOADER]): - window[BOOTLOADER].update(background_color=default_bg_input) - settings.set_value(BOOTLOADER, values[BOOTLOADER]) - else: - window[BOOTLOADER].update(background_color="#DD5555") - - elif event == FIRMWARE : - if is_valid_file(values[FIRMWARE]): - window[FIRMWARE].update(background_color=default_bg_input) - settings.set_value(FIRMWARE, values[FIRMWARE]) - else: - window[FIRMWARE].update(background_color="#DD5555") - - elif event == PROGRAM : - if is_valid_file(values[PROGRAM]) or len(values[PROGRAM]) == 0: - window[PROGRAM].update(background_color=default_bg_input) - settings.set_value(PROGRAM, values[PROGRAM]) - else: - window[PROGRAM].update(background_color="#DD5555") - - elif event == TIMEOUT_MOUNT : - if is_valid_number(values[TIMEOUT_MOUNT]): - window[TIMEOUT_MOUNT].update(background_color=default_bg_input) - settings.set_value(TIMEOUT_MOUNT, values[TIMEOUT_MOUNT]) - else: - window[TIMEOUT_MOUNT].update(background_color="#DD5555") - - elif event == MAINTENACE_MOUNT_NAME : - if len(values[MAINTENACE_MOUNT_NAME]) > 0: - window[MAINTENACE_MOUNT_NAME].update(background_color=default_bg_input) - settings.set_value(MAINTENACE_MOUNT_NAME, values[MAINTENACE_MOUNT_NAME]) - else: - window[MAINTENACE_MOUNT_NAME].update(background_color="#DD5555") - - elif event == PROGRAM_MOUNT_NAME : - settings.set_value(PROGRAM_MOUNT_NAME, values[PROGRAM_MOUNT_NAME]) - - elif event == START_BUTTON: - running_thread = threading.Thread(target=openocd_procedure, args=(values,)) - running_thread.start() - - # elif event != None : - # print(event) - - update_start_button_state(values, running_thread != None) +string_maintenant_mount = tk.StringVar(value=settings.get_value_or_default(MAINTENACE_MOUNT_NAME, "MAINTENANCE")) +string_target_mount = tk.StringVar(value=settings.get_value_or_default(TARGET_MOUNT_NAME, "DIS_L4IOT" )) +string_timeout = tk.StringVar(value=settings.get_value_or_default(TIMEOUT_MOUNT, "10000" )) - if running_thread != None and not running_thread.is_alive(): - running_thread = None +log_text: LogText +running_thread: threading.Thread = None - window.close() +def validate_number(num): + return num.isdigit() +def main(): + global running_thread + global log_text + str_validate_number = (window.register(validate_number), '%P') -################################################################### -#### LOG FUNCTIONS ############################################# -############################################################# + ### + # Panel files & folder + ### + layout_files = ttk.Frame(master=window) + layout_files.grid_columnconfigure(1, weight=1) + + ttk.Label(master=layout_files, text="OpenOCD 'scripts' folder").grid(column=0, row=0, sticky='NE', **GRID_PADS) + ttk.Entry(master=layout_files, textvariable=string_script_folder, state=tk.NORMAL).grid(column=1, row=0, sticky='EW', **GRID_PADS) + ttk.Button(master=layout_files, text="Browse...", command=lambda: ask_open_folder("Select the script directory", string_script_folder, SCRIPT_FOLDER)).grid(column=2, row=0, sticky='E', **GRID_PADS) + + ttk.Label(master=layout_files, text="Bootloader file").grid(column=0, row=1, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_files, textvariable=string_file_bootloader, state=tk.NORMAL).grid(column=1, row=1, sticky='EW', **GRID_PADS) + ttk.Button(master=layout_files, text="Browse...", command=lambda: ask_open_file("Select the Bootloader file", string_file_bootloader, BOOTLOADER)).grid(column=2, row=1, sticky='E', **GRID_PADS) + + ttk.Label(master=layout_files, text="Firmware file").grid(column=0, row=2, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_files, textvariable=string_file_firmware, state=tk.NORMAL).grid(column=1, row=2, sticky='EW', **GRID_PADS) + ttk.Button(master=layout_files, text="Browse...", command=lambda: ask_open_file("Select the firmware file", string_file_firmware, FIRMWARE)).grid(column=2, row=2, sticky='E', **GRID_PADS) + + ttk.Label(master=layout_files, text="Test file (skip if empty)").grid(column=0, row=3, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_files, textvariable=string_file_test, state=tk.NORMAL).grid(column=1, row=3, sticky='EW', **GRID_PADS) + ttk.Button(master=layout_files, text="Browse...", command=lambda: ask_open_file("Select the test file", string_file_test, PROGRAM)).grid(column=2, row=3, sticky='E', **GRID_PADS) + + ### + # Panel Mount points & timeout + ### + layout_params = ttk.Frame(master=window) + layout_params.grid_columnconfigure(1, weight=1) + + ttk.Label(master=layout_params, text="'MAINTENANCE' mount point name").grid(column=0, row=0, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_params, textvariable=string_maintenant_mount).grid(column=1, row=0, sticky='EW', **GRID_PADS) -def log(msg, level, no_time=False): - log = window["-LOG-"] + ttk.Label(master=layout_params, text="Target mount point name").grid(column=0, row=1, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_params, textvariable=string_target_mount).grid(column=1, row=1, sticky='EW', **GRID_PADS) - if no_time: - final_msg = msg - else: - final_msg = "[{}] {}".format(datetime.now().strftime("%H:%M:%S.%f"), msg) + ttk.Label(master=layout_params, text="Timeout (in ms) for mount points").grid(column=0, row=2, sticky='E', **GRID_PADS) + ttk.Entry(master=layout_params, textvariable=string_timeout, validate='all', validatecommand=str_validate_number).grid(column=1, row=2, sticky='EW', **GRID_PADS) + + ### + # Panel Log + ### + layout_log = ttk.Frame(master=window) - if level == "error": - log.print(final_msg, text_color="red") - elif level == "warning": - log.print(final_msg, text_color="orange") - elif level == "info": - log.print(final_msg) + text_scroll_v = ttk.Scrollbar(master=layout_log, orient='vertical') + text_scroll_v.pack(side=tk.RIGHT, fill=tk.Y) + log_text = LogText(master=layout_log, yscrollcommand=text_scroll_v.set) -def log_error(msg, no_time=False): - log(msg, "error", no_time) + text_scroll_v.config(command=log_text.yview) + log_text.pack(fill=tk.BOTH) + ### + # Pack the layout + ### + layout_files.pack(fill=tk.X, **MAIN_PADS) + layout_params.pack(fill=tk.X, **MAIN_PADS) + ttk.Button(master=window, style='Accent.TButton', text="Flash DAPLink", command=run_flash).pack(fill=tk.X, **MAIN_PADS) + layout_log.pack(fill=tk.BOTH, **MAIN_PADS) -def log_warning(msg, no_time=False): - log(msg, "warning", no_time) + sys.stdout.write = redirector_stdout + sys.stderr.write = redirector_stderr + window.mainloop() + + settings.set_value(MAINTENACE_MOUNT_NAME, string_maintenant_mount.get()) + settings.set_value(TARGET_MOUNT_NAME, string_target_mount.get()) + settings.set_value(TIMEOUT_MOUNT, string_timeout.get()) -def log_info(msg, no_time=False): - log(msg, "info", no_time) +def run_flash(): + global running_thread + (check_ok, msg) = check_entries() + if running_thread != None and running_thread.is_alive() == False: + running_thread = None + + if running_thread != None: + tkMessageBox.showwarning(title="Already running", message="Flash process is already running...", icon=tkMessageBox.WARNING) + return + elif not check_ok: + tkMessageBox.showerror(title="Invalid entry", message=msg, icon=tkMessageBox.ERROR ) + return + else: + running_thread = threading.Thread(target=openocd_procedure, args=(string_script_folder.get(), string_file_bootloader.get(), string_file_firmware.get(), string_file_test.get(), string_maintenant_mount.get(), string_target_mount.get(), string_timeout.get())) + running_thread.start() ################################################################### #### UTILS FUNCTIONS ########################################### ############################################################# +def redirector_stdout(input_str): + log_text.log_info(input_str, False, False) + +def redirector_stderr(input_str): + log_text.log_error(input_str, False, False) + def is_valid_file(filepath): if len(filepath) == 0: return False @@ -188,87 +185,91 @@ def is_valid_dir(dirpath): return os.path.isdir(dirpath) +def check_entries() -> tuple[bool, str]: + if not is_valid_dir(string_script_folder.get()): + return (False, "Invalid path to OpenOCD script folder") + + if not is_valid_file(string_file_bootloader.get()): + return (False, "Invalid path to bootloader file") + + if not is_valid_file(string_file_firmware.get()): + return (False, "Invalid path to firmware file") + + if len( string_file_test.get() ) > 0 and len( string_target_mount.get() ) > 0 and not is_valid_file(string_file_test.get()): + return (False, "Invalid path to test file") + + if len( string_maintenant_mount.get() ) == 0: + return (False, "Maintenace mount name can't be empty") + + if len( string_target_mount.get() ) == 0: + return (False, "Target mount name can't be empty") -def is_valid_number(num): - return num.isdigit() - - -def update_start_button_state(values, is_thread_running): - if is_valid_dir(values[SCRIPT_FOLDER]) and \ - is_valid_file(values[BOOTLOADER]) and \ - is_valid_file(values[FIRMWARE]) and \ - is_valid_number(values[TIMEOUT_MOUNT]) and \ - len(values[MAINTENACE_MOUNT_NAME]) > 0 and \ - len(values[PROGRAM_MOUNT_NAME]) > 0 and \ - not is_thread_running: - window[START_BUTTON].update(disabled=False) - else: - window[START_BUTTON].update(disabled=True) - - + return (True, "") ################################################################### #### OPENOCD FUNCTIONS ######################################### ############################################################# -def openocd_procedure(values): - log_info("------------------ START ------------------", True) +def openocd_procedure(path_script: str, path_bootloader: str, path_firmware: str, path_program: str, mount_maintenance: str, mount_program: str, timeout: str): + global running_thread + + log_text.log_info("------------------ START ------------------", True) start = time.time() is_ok = True - steps(values) + steps(path_script, path_bootloader, path_firmware, path_program, mount_maintenance, mount_program, timeout) duration = int((time.time() - start) * 1000) - log_info("------------------ FINISH ------------------", True) - log_info("Duration: {} s".format(duration / 1000.0), True) - log_info("--------------------------------------------\n\n", True) - + log_text.log_info("------------------ FINISH ------------------", True) + log_text.log_info("Duration: {} s".format(duration / 1000.0), True) + log_text.log_info("--------------------------------------------\n\n", True) + running_thread = None -def steps(values): +def steps(path_script: str, path_bootloader: str, path_firmware: str, path_program: str, mount_maintenance: str, mount_program: str, timeout: str): - log_info("Unlocking the target (RDP)") - if not openocd_unlock(values[SCRIPT_FOLDER]) : - log_error("Failed to unlock the target... Abort") + log_text.log_info("Unlocking the target (RDP)") + if not openocd_unlock(path_script) : + log_text.log_error("Failed to unlock the target... Abort") return - log_info("Mass erase the target") - if not openocd_mass_erase(values[SCRIPT_FOLDER]) : - log_error("Failed to erase the target... Abort") + log_text.log_info("Mass erase the target") + if not openocd_mass_erase(path_script) : + log_text.log_error("Failed to erase the target... Abort") return - log_info("Flash the target") - if not openocd_flash(values[BOOTLOADER], values[SCRIPT_FOLDER]) : - log_error("Failed to flash the target... Abort") + log_text.log_info("Flash the target") + if not openocd_flash(path_bootloader, path_script) : + log_text.log_error("Failed to flash the target... Abort") return - log_info("Wait for device '{}' mount point".format(values[MAINTENACE_MOUNT_NAME])) - if not openocd_wait_mountpoint(int(values[TIMEOUT_MOUNT]), values[MAINTENACE_MOUNT_NAME]) : - log_error("Failed to open the target... Abort") + log_text.log_info("Wait for device '{}' mount point".format(mount_maintenance)) + if not openocd_wait_mountpoint(int(timeout), mount_maintenance) : + log_text.log_error("Failed to open the target... Abort") return - log_info("Search for 'Git SHA' from DETAILS.TXT in '{}' mount point: ".format(values[MAINTENACE_MOUNT_NAME])) - openocd_read_SHA(values[MAINTENACE_MOUNT_NAME]) + log_text.log_info("Search for 'Git SHA' from DETAILS.TXT in '{}' mount point: ".format(mount_maintenance)) + openocd_read_SHA(mount_maintenance) - log_info("Send firmware to device") - if not openocd_copy_firmware(values[FIRMWARE], values[MAINTENACE_MOUNT_NAME]) : - log_error("Failed to copy the firmware to the target... Abort") + log_text.log_info("Send firmware to device") + if not openocd_copy_firmware(path_firmware, mount_maintenance) : + log_text.log_error("Failed to copy the firmware to the target... Abort") return - log_info("Wait for device {} mount point".format(values[PROGRAM_MOUNT_NAME])) - if not openocd_wait_mountpoint(int(values[TIMEOUT_MOUNT]), values[PROGRAM_MOUNT_NAME]) : - log_error("Failed to open the target... Abort") + log_text.log_info("Wait for device {} mount point".format(mount_program)) + if not openocd_wait_mountpoint(int(timeout), mount_program) : + log_text.log_error("Failed to open the target... Abort") return else: - log_info("Search for 'Git SHA' from DETAILS.TXT of '{}' mount point: ".format(values[PROGRAM_MOUNT_NAME])) - openocd_read_SHA(values[PROGRAM_MOUNT_NAME]) + log_text.log_info("Search for 'Git SHA' from DETAILS.TXT of '{}' mount point: ".format(mount_program)) + openocd_read_SHA(mount_program) - if len(values[PROGRAM]) == 0: - log_warning("Skipping programming steps") + if len(path_program) == 0: + log_text.log_warning("Skipping programming steps") return else: - log_info("Send program to device") - if not openocd_copy_firmware(values[PROGRAM], values[PROGRAM_MOUNT_NAME]) : - log_error("Failed to copy the program to the target... Abort") + log_text.log_info("Send program to device") + if not openocd_copy_firmware(path_program, mount_program) : + log_text.log_error("Failed to copy the program to the target... Abort") return @@ -278,8 +279,8 @@ def openocd_unlock(script_folder): if proc.returncode == 0: return True - log_info(proc.stdout, True) - log_error(proc.stderr, True) + log_text.log_info(proc.stdout, False) + log_text.log_error(proc.stderr, False) return False @@ -289,8 +290,8 @@ def openocd_mass_erase(script_folder): if proc.returncode == 0: return True - log_info(proc.stdout, True) - log_error(proc.stderr, True) + log_text.log_info(proc.stdout, False) + log_text.log_error(proc.stderr, False) return False @@ -301,8 +302,8 @@ def openocd_flash(bootloader, script_folder): if proc.returncode == 0: return True - log_info(proc.stdout, True) - log_error(proc.stderr, True) + log_text.log_info(proc.stdout, False) + log_text.log_error(proc.stderr, False) return False @@ -319,7 +320,7 @@ def openocd_wait_mountpoint(timeout, mount_point): return True if (time.time() - tmp) * 1000 > 1000: - log_info("Waiting...") + log_text.log_info("Waiting...") tmp = time.time() if (time.time() - start) * 1000 >= timeout: @@ -339,7 +340,11 @@ def openocd_copy_firmware(file, mount_point): if target == None: return False - shutil.copy(file, target, follow_symlinks=True) + try: + shutil.copy(file, target, follow_symlinks=True) + except Exception as e: + log_text.log_error("Failed to copy firmware file.\nError: {}".format(e)) + return False return True @@ -354,20 +359,21 @@ def openocd_read_SHA(mount_point): break if path == None : - log_error("Failed to find the '{}' mountpoint".format(path)) + log_text.log_error("Failed to find the '{}' mountpoint".format(path)) + return + + try: + with open("{}/DETAILS.TXT".format(path), "r") as f: + content = f.read() + except Exception as e: + log_text.log_error("Unable to open read the Git SHA.\nError: {}".format(e)) return - with open("{}/DETAILS.TXT".format(path), "r") as f: - content = f.read() - res = re.search(r'Git SHA: ([a-zA-Z0-9]*)$', content, re.MULTILINE) if res != None: - log_info(res.group(0)) + log_text.log_info(res.group(0)) else: - log_warning("No SHA found in file...") + log_text.log_warning("No SHA found in file...") - -window["-LOG-"].reroute_stdout_to_here() -window["-LOG-"].reroute_stderr_to_here() main() From 161f44d11fd28724fecefc0217e491127adc9595 Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:29:01 +0200 Subject: [PATCH 4/6] Update install script --- install.sh | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/install.sh b/install.sh index 101a042..9a0d752 100755 --- a/install.sh +++ b/install.sh @@ -5,27 +5,25 @@ NC='\033[0m' # No Color echo -e "${GREEN}=> Installing system dependency${NC}" -sudo apt install openocd python3 python3-pip python3-tk +sudo apt install openocd python3 python3-pip python3-venv -echo -e "\n\n\n${GREEN}=> Virtual env.${NC}" -echo -e "\n\n ${ORANGE}Installing virtualenv (pip)${NC}" -pip install virtualenv | sed 's/^/ /' +echo -e "\n${GREEN}=> Virtual env.${NC}" -echo -e "\n\n ${ORANGE}Create virtual env${NC}" -virtualenv venv | sed 's/^/ /' +echo -e "\n ${ORANGE}Create virtual env${NC}" +python3 -m venv venv | sed 's/^/ /' -echo -e "\n\n\n${GREEN}=> Enter in venv${NC}" +echo -e "\n${GREEN}=> Enter in venv${NC}" source ./venv/bin/activate -echo -e "\n\n\n${GREEN}=> Python depencies${NC}" -pip install pysimplegui psutil +echo -e "\n${GREEN}=> Python depencies${NC}" +pip install tk psutil -echo -e "\n\n ${ORANGE}pip freeze${NC}" +echo -e "\n ${ORANGE}pip freeze${NC}" pip freeze | sed 's/^/ /' -echo -e "\n\n\n${GREEN}=> Exit venv${NC}" +echo -e "\n${GREEN}=> Exit venv${NC}" deactivate -echo -e "\n\n\n${GREEN}========= Done ! =========${NC}" +echo -e "\n${GREEN}========= Done ! =========${NC}" read -s -p "Press any key to close ..." echo -e "\n\n" \ No newline at end of file From c5ec98e7907081ef5b807d92f7e933d10cc93a81 Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:31:19 +0200 Subject: [PATCH 5/6] Update readme --- README.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 2f518a2..8f5ead1 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ - [Introduction](#introduction) - [Requirements](#requirements) - [:computer: System](#computer-system) + - [Linux](#linux) + - [Windows](#windows) + - [MacOs](#macos) - [:snake: Python](#snake-python) - [:floppy\_disk: Bootloader \& Firmware](#floppy_disk-bootloader--firmware) - [Usage](#usage) @@ -34,26 +37,26 @@ With OpenOCD, the program steps are : ## Requirements ### :computer: System +#### Linux + - [OpenOCD](https://openocd.org/): `sudo apt install openocd` + - Python 3.x: `sudo apt install python3` + - Python3 pip: `sudo apt install python3-pip` + +:bulb: All in one: `sudo apt install openocd python3 python3-pip` + +#### Windows - [OpenOCD](https://openocd.org/): - - Linux: `sudo apt install openocd` - - Windows: - - [https://github.com/openocd-org/openocd/releases/latest](https://github.com/openocd-org/openocd/releases/latest) + - Download lastest release form [https://github.com/openocd-org/openocd/releases/latest](https://github.com/openocd-org/openocd/releases/latest) - add the `bin` folder to your [path](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/) (e.g `C:/openOCD/bin`). - - Python 3.x: - - Linux: `sudo apt install python3` - - Windows: [https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/) - - Python3 pip: - - Linux: `sudo apt install python3-pip` - - Windows (If not installed with Python): [https://packaging.python.org/en/latest/tutorials/installing-packages/#requirements-for-installing-packages](https://packaging.python.org/en/latest/tutorials/installing-packages/#requirements-for-installing-packages) - - python3 tk: - - Linux: `sudo apt install python3-tk` - - Windows: [https://www.geeksforgeeks.org/how-to-install-tkinter-in-windows/](https://www.geeksforgeeks.org/how-to-install-tkinter-in-windows/) - -:bulb: All in one (Linux only): `sudo apt install openocd python3 python3-pip python3-tk` + - Python 3.x: Download it from [https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/) + - Python3 pip: If not installed with Python, here are the instructions: [https://packaging.python.org/en/latest/tutorials/installing-packages/#requirements-for-installing-packages](https://packaging.python.org/en/latest/tutorials/installing-packages/#requirements-for-installing-packages) +#### MacOs + Untested, but certainly identical to Linux. + ### :snake: Python - [virtual-env](https://docs.python-guide.org/dev/virtualenvs/#lower-level-virtualenv): `pip install virtualenv` _(optionnal)_ - - [PySimpleGUI](https://pysimplegui.readthedocs.io/en/latest/): `pip install pysimplegui` + - [Tkinter](https://docs.python.org/fr/3/library/tkinter.html): `pip install tkinter` - [psutil](https://psutil.readthedocs.io/en/latest/): `pip install psutil` :bulb: You can install everything (virtual env include), with the `install.sh` script (Linux only). From 12ac8a7710f0fdc099b5a75a16e0cafcb3f286c4 Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 22 Apr 2024 17:32:51 +0200 Subject: [PATCH 6/6] Update screenshot --- doc/screenshot.png | Bin 48489 -> 41482 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/screenshot.png b/doc/screenshot.png index 59d8ac5023f4232e97ff577f51072eb524c17fcf..b0edb78f99d06c556b01acf48b1cfeec069e955a 100644 GIT binary patch literal 41482 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 literal 48489 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 z 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