From a13add166bc31a213fe7a90bbc46081b4d9228dc Mon Sep 17 00:00:00 2001 From: Thomas Geymayer <tomgey@gmail.com> Date: Sat, 27 Jul 2013 11:54:41 +0200 Subject: [PATCH] Canvas GUI: Basic widget, focus and theming support. --- Nasal/canvas/gui.nas | 142 +++++++++++++++--- Nasal/canvas/gui/Style.nas | 50 ++++++ Nasal/canvas/gui/Widget.nas | 83 ++++++++++ Nasal/canvas/gui/styles/DefaultStyle.nas | 87 +++++++++++ Nasal/canvas/gui/widgets/Button.nas | 86 +++++++++++ .../{ => decoration}/close_focused_normal.png | Bin .../close_focused_prelight.png | Bin .../close_focused_pressed.png | Bin .../decoration/close_unfocused.png | Bin 0 -> 528 bytes .../decoration/close_unfocused_prelight.png | Bin 0 -> 882 bytes gui/styles/AmbianceClassic/style.xml | 83 ++++++++++ .../widgets/backdrop-button-active-hover.png | Bin 0 -> 909 bytes .../widgets/backdrop-button-active.png | Bin 0 -> 799 bytes .../widgets/backdrop-button-hover.png | Bin 0 -> 909 bytes .../widgets/backdrop-button.png | Bin 0 -> 848 bytes .../widgets/button-active-focused.png | Bin 0 -> 1032 bytes .../AmbianceClassic/widgets/button-active.png | Bin 0 -> 848 bytes .../widgets/button-focused-hover.png | Bin 0 -> 1132 bytes .../widgets/button-focused.png | Bin 0 -> 977 bytes .../AmbianceClassic/widgets/button-hover.png | Bin 0 -> 934 bytes gui/styles/AmbianceClassic/widgets/button.png | Bin 0 -> 858 bytes 21 files changed, 510 insertions(+), 21 deletions(-) create mode 100644 Nasal/canvas/gui/Style.nas create mode 100644 Nasal/canvas/gui/Widget.nas create mode 100644 Nasal/canvas/gui/styles/DefaultStyle.nas create mode 100644 Nasal/canvas/gui/widgets/Button.nas rename gui/styles/AmbianceClassic/{ => decoration}/close_focused_normal.png (100%) rename gui/styles/AmbianceClassic/{ => decoration}/close_focused_prelight.png (100%) rename gui/styles/AmbianceClassic/{ => decoration}/close_focused_pressed.png (100%) create mode 100644 gui/styles/AmbianceClassic/decoration/close_unfocused.png create mode 100644 gui/styles/AmbianceClassic/decoration/close_unfocused_prelight.png create mode 100644 gui/styles/AmbianceClassic/style.xml create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button-active-hover.png create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button-active.png create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button-hover.png create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button.png create mode 100644 gui/styles/AmbianceClassic/widgets/button-active-focused.png create mode 100644 gui/styles/AmbianceClassic/widgets/button-active.png create mode 100644 gui/styles/AmbianceClassic/widgets/button-focused-hover.png create mode 100644 gui/styles/AmbianceClassic/widgets/button-focused.png create mode 100644 gui/styles/AmbianceClassic/widgets/button-hover.png create mode 100644 gui/styles/AmbianceClassic/widgets/button.png diff --git a/Nasal/canvas/gui.nas b/Nasal/canvas/gui.nas index bab83e092..e1847d993 100644 --- a/Nasal/canvas/gui.nas +++ b/Nasal/canvas/gui.nas @@ -1,3 +1,46 @@ +var gui = { + widgets: {}, + focused_window: nil +}; + +var gui_dir = getprop("/sim/fg-root") ~ "/Nasal/canvas/gui/"; +var loadGUIFile = func(file) io.load_nasal(gui_dir ~ file, "canvas"); +var loadWidget = func(name) loadGUIFile("widgets/" ~ name ~ ".nas"); + +loadGUIFile("Style.nas"); +loadGUIFile("Widget.nas"); +loadGUIFile("styles/DefaultStyle.nas"); +loadWidget("Button"); + +var style = DefaultStyle.new("AmbianceClassic"); +var WindowButton = { + new: func(parent, name) + { + var m = { + parents: [WindowButton, gui.widgets.Button.new(parent, nil, {"flat": 1})], + _name: name + }; + m._focus_policy = m.NoFocus; + m._setRoot( parent.createChild("image", "WindowButton-" ~ name) ); + return m; + }, +# protected: + _onStateChange: func + { + var file = style._dir_decoration ~ "/" ~ me._name; + file ~= me._window._focused ? "_focused" : "_unfocused"; + + if( me._active ) + file ~= "_pressed"; + else if( me._hover ) + file ~= "_prelight"; + else if( me._window._focused ) + file ~= "_normal"; + + me._root.set("file", file ~ ".png"); + } +}; + var Window = { # Constructor # @@ -7,7 +50,10 @@ var Window = { var ghost = _newWindowGhost(id); var m = { parents: [Window, PropertyElement, ghost], - _node: props.wrapNode(ghost._node_ghost) + _node: props.wrapNode(ghost._node_ghost), + _focused: 0, + _focused_widget: nil, + _widgets: [] }; m.setInt("content-size[0]", size[0]); @@ -15,6 +61,7 @@ var Window = { # TODO better default position m.move(0,0); + m.setFocus(); # arg = [child, listener_node, mode, is_child_event] setlistener(m._node, func m._propCallback(arg[0], arg[2]), 0, 2); @@ -26,6 +73,8 @@ var Window = { # Destructor del: func { + me.clearFocus(); + if( me["_canvas"] != nil ) { var placements = me._canvas.texture.getChildren("placement"); @@ -93,6 +142,42 @@ var Window = { { return wrapCanvas(me._getCanvasDecoration()); }, + addWidget: func(w) + { + append(me._widgets, w); + w._window = me; + if( size(me._widgets) == 2 ) + w.setFocus(); + w._onStateChange(); + return me; + }, + # + setFocus: func + { + if( me._focused ) + return me; + + if( gui.focused_window != nil ) + gui.focused_window.clearFocus(); + + me._focused = 1; +# me.onFocusIn(); + me._onStateChange(); + gui.focused_window = me; + return me; + }, + # + clearFocus: func + { + if( !me._focused ) + return me; + + me._focused = 0; +# me.onFocusOut(); + me._onStateChange(); + gui.focused_window = nil; + return me; + }, setPosition: func(x, y) { me.setInt("tf/t[0]", x); @@ -114,6 +199,26 @@ var Window = { # on writing the z-index the window always is moved to the top of all other # windows with the same z-index. me.setInt("z-index", me.get("z-index", 0)); + + me.setFocus(); + }, +# protected: + _onStateChange: func + { + if( me._getCanvasDecoration() != nil ) + { + # Stronger shadow for focused windows + me.getCanvasDecoration() + .set("image[1]/fill", me._focused ? "#000000" : "rgba(0,0,0,0.5)"); + + var suffix = me._focused ? "" : "-unfocused"; + me._title_bar_bg.set("fill", style.getColor("title" ~ suffix)); + me._title.set( "fill", style.getColor("title-text" ~ suffix)); + me._top_line.set( "stroke", style.getColor("title-highlight" ~ suffix)); + } + + foreach(var w; me._widgets) + w._onStateChange(); }, # private: _propCallback: func(child, mode) @@ -188,28 +293,25 @@ var Window = { var group_deco = canvas_deco.getGroup("decoration"); var title_bar = group_deco.createChild("group", "title_bar"); - title_bar - .rect( 0, 0, - me.get("size[0]"), - me.get("size[1]"), #25, - {"border-top-radius": border_radius} ) - .setColorFill(0.25,0.24,0.22) - .setStrokeLineWidth(0); - - var style_dir = "gui/styles/AmbianceClassic/"; + me._title_bar_bg = + title_bar.rect( 0, 0, + me.get("size[0]"), + me.get("size[1]"), + {"border-top-radius": border_radius} ); + me._top_line = title_bar.createChild("path", "top-line") + .moveTo(border_radius - 2, 2) + .lineTo(me.get("size[0]") - border_radius + 2, 2); # close icon var x = 10; var y = 3; var w = 19; var h = 19; - var ico = title_bar.createChild("image", "icon-close") - .set("file", style_dir ~ "close_focused_normal.png") - .setTranslation(x,y); - ico.addEventListener("click", func me.del()); - ico.addEventListener("mouseover", func ico.set("file", style_dir ~ "close_focused_prelight.png")); - ico.addEventListener("mousedown", func ico.set("file", style_dir ~ "close_focused_pressed.png")); - ico.addEventListener("mouseout", func ico.set("file", style_dir ~ "close_focused_normal.png")); + + var button_close = WindowButton.new(title_bar, "close") + .move(x, y); + button_close.onClick = func me.del(); + me.addWidget(button_close); # title me._title = title_bar.createChild("text", "title") @@ -223,10 +325,8 @@ var Window = { me._node.getNode("title", 1).alias(me._title._node.getPath() ~ "/text"); me.set("title", title); - title_bar.addEventListener("drag", func(e) { - if( !ico.equals(e.target) ) - me.move(e.deltaX, e.deltaY); - }); + title_bar.addEventListener("drag", func(e) me.move(e.deltaX, e.deltaY)); + me._onStateChange(); } }; diff --git a/Nasal/canvas/gui/Style.nas b/Nasal/canvas/gui/Style.nas new file mode 100644 index 000000000..244177c26 --- /dev/null +++ b/Nasal/canvas/gui/Style.nas @@ -0,0 +1,50 @@ +gui.Style = { + new: func(name) + { + var root_node = props.globals.getNode("/sim/gui/canvas", 1) + .addChild("style"); + var path = getprop("/sim/fg-root") ~ "/gui/styles/" ~ name; + + var m = { + parents: [gui.Style], + _path: path, + _node: io.read_properties(path ~ "/style.xml", root_node), + _colors: {} + }; + + # parse theme colors + var comp_names = ["red", "green", "blue", "alpha"]; + var colors = m._node.getChild("colors"); + if( colors != nil ) + { + foreach(var color; colors.getChildren()) + { + var str = "rgba("; + for(var i = 0; i < size(comp_names); i += 1) + { + if( i > 0 ) + str ~= ","; + var val = color.getValue(comp_names[i]); + if( val == nil ) + val = 1; + if( i < 3 ) + str ~= int(val * 255 + 0.5); + else + str ~= int(val * 100) / 100; + } + m._colors[ color.getName() ] = str ~ ")"; + } + } + + m._dir_decoration = + m._path ~ "/" ~ (m._node.getValue("folders/decoration") or "decoration"); + m._dir_widgets = + m._path ~ "/" ~ (m._node.getValue("folders/widgets") or "widgets"); + + return m; + }, + getColor: func(name, def = "#00ffff") + { + return me._colors[name] or def; + } +}; diff --git a/Nasal/canvas/gui/Widget.nas b/Nasal/canvas/gui/Widget.nas new file mode 100644 index 000000000..a6b37e707 --- /dev/null +++ b/Nasal/canvas/gui/Widget.nas @@ -0,0 +1,83 @@ +gui.Widget = { +# enum FocusPolicy: + NoFocus: 0, + TabFocus: 1, + ClickFocus: 2, + StrongFocus: 1 + 2, + + # + new: func(derived) + { + return { + parents: [derived, gui.Widget], + _focused: 0, + _focus_policy: gui.Widget.NoFocus, + _hover: 0, + _root: nil + }; + }, + # Move the widget to the given position (relative to its parent) + move: func(x, y) + { + me._root.setTranslation(x, y); + return me; + }, + # + setFocus: func + { + if( me._focused ) + return me; + + if( me._window._focused_widget != nil ) + me._window._focused_widget.clearFocus(); + + me._focused = 1; + me._window._focused_widget = me; + + me.onFocusIn(); + me._onStateChange(); + + return me; + }, + # + clearFocus: func + { + if( !me._focused ) + return me; + + me._focused = 0; + me._window._focused_widget = nil; + + me.onFocusOut(); + me._onStateChange(); + + return me; + }, + onFocusIn: func {}, + onFocusOut: func {}, + onMouseEnter: func {}, + onMouseLeave: func {}, +# protected: + _onStateChange: func {}, + _setRoot: func(el) + { + me._root = el; + el.addEventListener("mouseenter", func { + me._hover = 1; + me.onMouseEnter(); + me._onStateChange(); + }); + el.addEventListener("mousedown", func { + if( bits.test(me._focus_policy, me.ClickFocus / 2) ) + { + me.setFocus(); + me._window.setFocus(); + } + }); + el.addEventListener("mouseleave", func { + me._hover = 0; + me.onMouseLeave(); + me._onStateChange(); + }); + } +}; diff --git a/Nasal/canvas/gui/styles/DefaultStyle.nas b/Nasal/canvas/gui/styles/DefaultStyle.nas new file mode 100644 index 000000000..01799d147 --- /dev/null +++ b/Nasal/canvas/gui/styles/DefaultStyle.nas @@ -0,0 +1,87 @@ +var DefaultStyle = { + new: func(name) + { + return { parents: [gui.Style.new(name), DefaultStyle] }; + }, + createWidget: func(parent, type, cfg) + { + var factory = me.widgets[type]; + if( factory == nil ) + { + debug.warn("DefaultStyle: unknown widget type (" ~ type ~ ")"); + return nil; + } + + return factory.new(parent, me, cfg); + }, + widgets: {} +}; + +# A button +DefaultStyle.widgets.button = { + padding: [6, 8, 6, 8], + new: func(parent, style, cfg) + { + var button = { + parents: [DefaultStyle.widgets.button], + element: parent.createChild("group", "button"), + size: cfg.get("size", [26, 26]), + _style: style + }; + + button._bg = + button.element.rect( 3, + 3, + button.size[0] - 6, + button.size[1] - 6, + {"border-radius": 5} ); + button._border = + button.element.createChild("image", "button") + .set("slice", "10 12") #"7") + .setSize(button.size); + button._label = + button.element.createChild("text") + .setFont("LiberationFonts/LiberationSans-Regular.ttf") + .set("character-size", 14) + .set("alignment", "center-baseline"); + return button; + }, + setText: func(text) + { + me._label.set("text", text); + }, + update: func(active, focused, hover, backdrop) + { + var file = me._style._dir_widgets ~ "/"; + if( backdrop ) + { + file ~= "backdrop-"; + me._label.set("fill", me._style.getColor("backdrop_fg_color")); + } + else + me._label.set("fill", me._style.getColor("fg_color")); + file ~= "button"; + + if( active ) + { + file ~= "-active"; + me._label.setTranslation(me.size[0] / 2 + 1, me.size[1] / 2 + 6); + } + else + me._label.setTranslation(me.size[0] / 2, me.size[1] / 2 + 5); + + + if( focused and !backdrop ) + file ~= "-focused"; + + if( hover and !active ) + { + file ~= "-hover"; + me._bg.set("fill", me._style.getColor("button_bg_color_hover")); + } + else + me._bg.set("fill", me._style.getColor("button_bg_color")); + + me._border.set("file", file ~ ".png"); + } +}; diff --git a/Nasal/canvas/gui/widgets/Button.nas b/Nasal/canvas/gui/widgets/Button.nas new file mode 100644 index 000000000..08e3ccb51 --- /dev/null +++ b/Nasal/canvas/gui/widgets/Button.nas @@ -0,0 +1,86 @@ +var Config = { + new: func(cfg) + { + var m = { + parents: [Config], + _cfg: cfg + }; + if( typeof(m._cfg) != "hash" ) + m._cfg = {}; + + return m; + }, + get: func(key, default = nil) + { + var val = me._cfg[key]; + if( val != nil ) + return val; + + return default; + } +}; + +gui.widgets.Button = { + new: func(parent, style, cfg) + { + var cfg = Config.new(cfg); + var m = gui.Widget.new(gui.widgets.Button); + m._focus_policy = m.StrongFocus; + m._active = 0; + m._flat = cfg.get("flat", 0); + + if( style != nil and !m._flat ) + { + m._button = style.createWidget(parent, "button", cfg); + m._setRoot(m._button.element); + } + + return m; + }, + setText: func(text) + { + me._button.setText(text); + return me; + }, + setActive: func + { + if( me._active ) + return me; + + me._active = 1; + me._onStateChange(); + return me; + }, + clearActive: func + { + if( !me._active ) + return me; + + me._active = 0; + me._onStateChange(); + return me; + }, + onClick: func {}, +# protected: + _onStateChange: func + { + if( me._button != nil ) + me._button.update(me._active, me._focused, me._hover, !me._window._focused); + }, + _setRoot: func(el) + { + el.addEventListener("mousedown", func me.setActive()); + el.addEventListener("mouseup", func me.clearActive()); + + # Use 'call' to ensure 'me' is not set and can be used in the closure of + # custom callbacks. TODO pass 'me' as argument? + el.addEventListener("click", func call(me.onClick)); + + el.addEventListener("mouseleave",func me.clearActive()); + el.addEventListener("drag", func(e) e.stopPropagation()); + + call(gui.Widget._setRoot, [el], me); + } +}; + +return; diff --git a/gui/styles/AmbianceClassic/close_focused_normal.png b/gui/styles/AmbianceClassic/decoration/close_focused_normal.png similarity index 100% rename from gui/styles/AmbianceClassic/close_focused_normal.png rename to gui/styles/AmbianceClassic/decoration/close_focused_normal.png diff --git a/gui/styles/AmbianceClassic/close_focused_prelight.png b/gui/styles/AmbianceClassic/decoration/close_focused_prelight.png similarity index 100% rename from gui/styles/AmbianceClassic/close_focused_prelight.png rename to gui/styles/AmbianceClassic/decoration/close_focused_prelight.png diff --git a/gui/styles/AmbianceClassic/close_focused_pressed.png b/gui/styles/AmbianceClassic/decoration/close_focused_pressed.png similarity index 100% rename from gui/styles/AmbianceClassic/close_focused_pressed.png rename to gui/styles/AmbianceClassic/decoration/close_focused_pressed.png diff --git a/gui/styles/AmbianceClassic/decoration/close_unfocused.png b/gui/styles/AmbianceClassic/decoration/close_unfocused.png new file mode 100644 index 0000000000000000000000000000000000000000..03eb5a69534fc8bfa1f03b4025054d54576a5f3a GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S3?yCqj{O5tCj)#!Tw|g`@7}%p|Nnm*Yjetx zy1KHKmb$jKI?yNwdn*TfYbQq=CnsBHCp#Axdsi2GcQ;25cPCE|XD?3|UmtfrUk`sj z&j5d~;2@viAm5N+-_Q`h&=CKyQ2+3-fQazGsL0@`$dKqLAPS9+3In<}CORxOCM+&C zJT5jOJ`RW?6XGM25~CebcJBsyN~$EtFBnL3^6>iwhDW7k=2ukLZP~u}z`ZBWU%mZV zbMea>pzIw_7srr_Td^0SgAW-9v?T_ea%^&#DrPAbvO*|C>fG&PV*md4e~LEV`Ec(m zo6WO5g9Xbg=cTW`_3G>Lzj3RzTv!cF4=wfbUm4}boBlRpvhVT!Yp*^|j5)sJ<g@nO zb7Fq#eM&51^%70^%pBtxv7vSC@h-E;{x`mHip6$F+;@B-bFhuIFn@9Qqcanp8`UHh zHkS51pI6FvXi?G`)A`r`9r*NJO88ax3J;Yv---;L{JQ%8yD)!o@PxGn-|SmnocnS$ zWy;Le^GfgRHeo-xZ_m`<NA_|*KdmsQt?^6i*4+;E%l2t~+nfF8GSHt4p00i_>zopr E0E3d$0ssI2 literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/decoration/close_unfocused_prelight.png b/gui/styles/AmbianceClassic/decoration/close_unfocused_prelight.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5ec3d9e9f9f95788aba16a915c3504b1be04f4 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S3?yCqj{O5tk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7-t9ggt)3GE8e|(7f6zXw6)ZAv^9Z9Pgl#-#1M$gOd-g~ z%oK{u&5R((!ra*0%os=_BP&Z&AQwVfT9^RYii&bNI$FBAT6%ig`uaLR5eEkwCr3MX zHy1BYcOP#LUmwqi@X*ABxRm6C?Ci{(oXp&u%&Mx&>guYRnyT8`n)>?M=H{lB=BD1> z-v0i+Ns}f{o;-Q#)G1S^PMtn|+VttuXUqVi8M9{1oHc9K?Absxd(NEMbLY;PH*fBI zAeujK{`~n1768$Lg$oxhUc7ke(j`lmE?u>1)#}x&*Q^1eHEY)b(b{$EfN0(N_3Jil zSifPzhK(D6Xyc|$o3?J<x^3IG?c2BS*s)_L5bfN#d-v`=d-m+zyLaEdef#(CKXBl{ z!Gl0_@X(<{hYue<a^%R-qeqV&J9hl|@e?OboIH8*)TvXaPoF+>=FHi%XXQ^NRRH5s zuO!GX7#Lkl%q*;I>>ND2`~rf)BBC<#3d)JenK|WE)eRk8z55OxJAU%<ix;n7zy0vb zmaoelsKeOP#W6%eQuLsw{~-qvh6k1TX;B*90!o1gJZuE^RyaStIX^$?(WH*50O6P{ zLx+glmEFH;8Q2(PBUnVkghU_nEZAJA`E9G~iS3q?1-oC=E-k%bYkj}iG=b4HVQ+p( zo2@Aq+p+NZmj%{*_WZwT<)Z&t?2}6cq}A7UFYD@B75Mmc<iU=mW$iy-`$fpzpHaP5 z;-Z^ulIQ&V(k~M@gSY3%9*bqOU3>4$GxcVMP46!@b~81|)Gm4JxK8UHqn0nX($4=k z=f)U|9-VT<jq_cH&0abF#TS<;ewwrvXq~Ni-na0tEO*=Pt7pHykl6b8*(9@0?zB1Q znq39oPvqj8BEIK`Uw8`dhM<lvd&f;WvxTDrCg-b)ByBq#Iqh7hD8q$YMVjBPrk>a? nohHb@+`uQ(#HHEU^^^74vZGyI*Xx!61D?Ut)z4*}Q$iB}3|Dtk literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/style.xml b/gui/styles/AmbianceClassic/style.xml new file mode 100644 index 000000000..6ec09432d --- /dev/null +++ b/gui/styles/AmbianceClassic/style.xml @@ -0,0 +1,83 @@ +<?xml version="1.0"?> + +<PropertyList> +<!-- + <folders> + <decoration type="string">decoration</decoration> + <widgets type="string">widgets</widgets> + </folders> +--> + <colors> + + <!-- Window decoration colors --> + <title> + <red type="float">0.275</red> + <green type="float">0.271</green> + <blue type="float">0.251</blue> + </title> + <title-unfocused> + <red type="float">0.235</red> + <green type="float">0.231</green> + <blue type="float">0.216</blue> + </title-unfocused> + <title-text> + <red type="float">0.875</red> + <green type="float">0.859</green> + <blue type="float">0.824</blue> + </title-text> + <title-text-unfocused> + <red type="float">0.502</red> + <green type="float">0.490</green> + <blue type="float">0.471</blue> + </title-text-unfocused> + <title-highlight> + <red type="float">0.365</red> + <green type="float">0.361</green> + <blue type="float">0.341</blue> + </title-highlight> + <title-highlight-unfocused> + <red type="float">0.278</red> + <green type="float">0.275</green> + <blue type="float">0.259</blue> + </title-highlight-unfocused> + + <!-- default colors for all GUI objects --> + <bg_color> + <red type="float">0.949</red> + <green type="float">0.945</green> + <blue type="float">0.941</blue> + </bg_color> + + <fg_color> + <red type="float">0.298</red> + <green type="float">0.298</green> + <blue type="float">0.298</blue> + </fg_color> + + <text_color> + <red type="float">0.235</red> + <green type="float">0.235</green> + <blue type="float">0.235</blue> + </text_color> + + <backdrop_fg_color> + <red type="float">0.428</red> + <green type="float">0.427</green> + <blue type="float">0.427</blue> + </backdrop_fg_color> + + <button_bg_color> + <red type="float">0.949</red> + <green type="float">0.945</green> + <blue type="float">0.941</blue> + </button_bg_color> + + <button_bg_color_hover> + <red type="float">0.996</red> + <green type="float">0.992</green> + <blue type="float">0.988</blue> + </button_bg_color_hover> + + </colors> + +</PropertyList> diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button-active-hover.png b/gui/styles/AmbianceClassic/widgets/backdrop-button-active-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff22c80bbe5aaba6d8355a46e4b55fba9e45b33 GIT binary patch literal 909 zcmV;819JR{P)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy000A2Nkl<Zc-pO% zT}YEr7{_1dUd?QqnnpKK_xV*;G9t<wgCN3-3aX3fLN6*JWDBi?Ac=xXLWt0;Vdzp5 zonLdZFHt8-VuRF+*g%~h1Eqbn52x$@z?mFI5XA<+y`1NH&i{GOdCqxW!Rz_C3w|je z6-YV6IF*%^d(~>SjGmlb%ERVMcwJsxIzB$GoSmI*w%Ke>tJNB`SS%s4*}P>knYKZU zp0GvvG5INu;wL939WygCO&BX#!W2G<hyWv!c<1KkzOSsT=)GQVYakG4jzl7FL1Qcy zYXGmnOL}f^Z#R&g{D^z+_xoE{S6B5ke{5{bH#Ie7CS9g4NG2vGs_;f3OlX2YHMj!G zfD)8|Vo(5%auhK835sL!SAhyT8muNfJw1J!^noBEiFJN{ejEXJz;SRG8~`~W3n+m6 z4=9*Fhs7UZN$)Q#EPTc8*jU|!H0-BieSQ5CoEN|$AOq<@1X4z7BAicT@pATpm)vgm zm(kJDMbZaCItsY9v9a+E&NCnnqyY&?;o(nAqL0O=vlW#=?;}d!CVe36F&GRUpU?Li z&XXV;h@9x(;FF4M>y*%I92pt$l0FbJhK7d1!C<f+&LXzY(*H~%Wi>h$3Wc7NF6j%U zrKR$Lfq@+y$w%ze$U!Pi{8v~K1t@@C9qH!f<?RzxD%HWhzP>0N50a21l_kjsHU0hl z(Ta+S{X$7ei9)B-(Mr@wUP%q<=H}+gs3w`cy}etgNiCd(NvcUP^y-i#O!@--VGzKP zdqNj6NvG@7=H})zl)<~31cS|`rKJ~emL}<*oOZcfZ%}wQzY>?j;h-jXE=f1O-05_F z7#tj2j3>!38jU)1U=y5|lhnJeqi;>%l24L85X9l(;foy|9bu2h^B4iwKsnce3t7j_ zPw2w=%w9xsEdD&Wf!qERdJ(-|e~<Lz-xC=Oecj#NUaaaHe%j^b<$5%^S{#UKB)^Lr zTosK*Z$acHJ!wpK@~^F}J;XPt-fp*l#(aBMSC=1KWg%Vuqa^`yjYd<3`WS$-r>AG5 zv$OM8dwcs%TU%R<hiqD{HVPtm;}GHk5cc8n{lFGAwY0RHB|XxOC)tIy<xCc!U}Q0} j6XARchMdh$<8^-ngh5xna~8Th00000NkvXXu0mjf19zjA literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button-active.png b/gui/styles/AmbianceClassic/widgets/backdrop-button-active.png new file mode 100644 index 0000000000000000000000000000000000000000..c71f92074744c8d029e9f28ec407c10cfe1dbb23 GIT binary patch literal 799 zcmV+)1K|9LP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0008!Nkl<Zc-pO% zT}V@59LA4dYq@kfy%0m8z_7H{MX;nAyQme>LXe_cg>H5uK{o>j(uF~kbRjyu(tS0j zQ}&_GwG_RWv^!(Fvyd=G3F3B96KCsr;2b$DB8oHkZR36a|KGEB?>Xlca@qZ3ip64C zDd}`t6%L21<!}sh<uZQjlY8azD!<=<(dBY^-EQ}L@X_P(WW8Q*QN|(2i=RjQ&Kj@_ zzBrxEcaxKoPchz3AHDJrHHuz?Er-J~H8eEzxUaA8dQVT!6|>pgX)qYtbUIy&APCJ8 zc(rnz^Q>b%``C{kxDA~2($9d(xw*MZNY9!~rgjK);1p1U6F?<WS&D3qb!xFsXEYkm z!<PdO>1T+>=kvW9A0K~#f;zFe0+h=r`x7N~?5hIxV`F145%Pw9hG?-DAF$MWm^>*- zxy*k-7RsRN!NI}q>FMbW`WezVJ3G6LK_izf1^h4Kk5mr~447tSX43RCqzQYn+uz@> z=Ta32DFZ62)p|J)2<*_$kk<M6`R^8s<qY>jp^!@Y;LXu5<n#G+!C>&HwzgKsr79Fs zQBzaX0B-^QHeqjXPag_}^1LDx3@N9NUiyWDgM-dUBvPouOUV$eR$EUm{oIp|g@uJ| zZ*Ol4m#Ng>MIS<P^fRP$adGi8F5wGGhS=@)4tnVq_!f;uQ=_A!S2@W-C9bZKk&&*Y zrKR+7$nx@X0uMB^k|FfPVzCV=q<wXD)sJ)HId39`LR9pvtgQIxXGmizm3k77$Fta% zW)?_$Bk?z>4ECw$p>K0@(@MW|V0Eppue&hu2}^X~CVDh6G0}m2Iy*c(eA;HSHR$zv zjqLHS#yO(lIOkc%diJrOp0%~LDSGKYKD5BKOeXUnkx1C^_r1kZcfeP$4}O53;1J}+ z&m)eD^WRtxaXgt!K7)tn$PMYxDm~-1K+iy60%mYm0*{FMxVgFug@Q#Ky8~{6Ti_<e dVt<p|`wLdMeNJjJ#gza6002ovPDHLkV1gUBhPnU% literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button-hover.png b/gui/styles/AmbianceClassic/widgets/backdrop-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff22c80bbe5aaba6d8355a46e4b55fba9e45b33 GIT binary patch literal 909 zcmV;819JR{P)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy000A2Nkl<Zc-pO% zT}YEr7{_1dUd?QqnnpKK_xV*;G9t<wgCN3-3aX3fLN6*JWDBi?Ac=xXLWt0;Vdzp5 zonLdZFHt8-VuRF+*g%~h1Eqbn52x$@z?mFI5XA<+y`1NH&i{GOdCqxW!Rz_C3w|je z6-YV6IF*%^d(~>SjGmlb%ERVMcwJsxIzB$GoSmI*w%Ke>tJNB`SS%s4*}P>knYKZU zp0GvvG5INu;wL939WygCO&BX#!W2G<hyWv!c<1KkzOSsT=)GQVYakG4jzl7FL1Qcy zYXGmnOL}f^Z#R&g{D^z+_xoE{S6B5ke{5{bH#Ie7CS9g4NG2vGs_;f3OlX2YHMj!G zfD)8|Vo(5%auhK835sL!SAhyT8muNfJw1J!^noBEiFJN{ejEXJz;SRG8~`~W3n+m6 z4=9*Fhs7UZN$)Q#EPTc8*jU|!H0-BieSQ5CoEN|$AOq<@1X4z7BAicT@pATpm)vgm zm(kJDMbZaCItsY9v9a+E&NCnnqyY&?;o(nAqL0O=vlW#=?;}d!CVe36F&GRUpU?Li z&XXV;h@9x(;FF4M>y*%I92pt$l0FbJhK7d1!C<f+&LXzY(*H~%Wi>h$3Wc7NF6j%U zrKR$Lfq@+y$w%ze$U!Pi{8v~K1t@@C9qH!f<?RzxD%HWhzP>0N50a21l_kjsHU0hl z(Ta+S{X$7ei9)B-(Mr@wUP%q<=H}+gs3w`cy}etgNiCd(NvcUP^y-i#O!@--VGzKP zdqNj6NvG@7=H})zl)<~31cS|`rKJ~emL}<*oOZcfZ%}wQzY>?j;h-jXE=f1O-05_F z7#tj2j3>!38jU)1U=y5|lhnJeqi;>%l24L85X9l(;foy|9bu2h^B4iwKsnce3t7j_ zPw2w=%w9xsEdD&Wf!qERdJ(-|e~<Lz-xC=Oecj#NUaaaHe%j^b<$5%^S{#UKB)^Lr zTosK*Z$acHJ!wpK@~^F}J;XPt-fp*l#(aBMSC=1KWg%Vuqa^`yjYd<3`WS$-r>AG5 zv$OM8dwcs%TU%R<hiqD{HVPtm;}GHk5cc8n{lFGAwY0RHB|XxOC)tIy<xCc!U}Q0} j6XARchMdh$<8^-ngh5xna~8Th00000NkvXXu0mjf19zjA literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button.png b/gui/styles/AmbianceClassic/widgets/backdrop-button.png new file mode 100644 index 0000000000000000000000000000000000000000..d357ed68cd18f31354bddd0769dc83b82d9b0836 GIT binary patch literal 848 zcmV-W1F!svP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0009QNkl<Zc-pO% zT}V@57{{mE91+bF>MrU&r`FOK5#)_RH(gawT|^L3w2P1mt%RTvC6$B_Vo^~SC2nkE zenQ*)*rvj!Ybe_SFM@PT+xOaBo9q9`dk$x#BI6wRaX9buy#N3E`5Z|i9xDM)#h(}$ z7^ng}=>506a?KL)g@uJ?uh-i@Gc&V1F)@*`+wEDK&Gyr3wH82;-e}7UzbQ_6lu!LU z9#8-L{Ctzpj5nB_o&Dr=IulDvON%QjE2F7Y>Rl$2d6~=QUVz?WvDgEif+zGY6be1m zPVsa){fhEeS64@=zr*23&dtr)IHN5Cx7&RgBgvveKLpyr8PEbWKn)s!3LF%mV(mvL zkL8~QH=*-(a&mG5t8$g}w@lz_4+H`ZBwPoF!G5q8)Pmih8Yq85HH+7>`~%GNMlcw3 zL)XQbRAQNy*VfkFBX|<*1G|6%$bpO@Ek_WOvwS5R;HmZXb-l~w`bzp+Cezc?p-3ds zhv0Fr2ULMdP$5KkV#;GIU%_V75{*XRKsU^rOifM2lgZ>W1e-t&kaME{3Nw<krPDyK z7yFXnOr+TK4Lmvo8`wI_{?kOp_UKSHn|(yOq%YBGwF;c|O&rO)?9?cMlsaw~W>O7Q z(CZ>ywOTEgSS*$reB=?hErN-Znbd&}((Uf<-YJ~PEs<x^!Ow)&j7kIcq!Yn<k@ln! zdR_dUu#Hd0<MI1+5k)#(&9PYQA)PMX1RoJx#>WUA73rQF!)1I<_k=gW$2UAw1W$-` z<6BWIU(=1}O;BS@DDzeXPm5H$&ii~mCrZDI^tt~?+sMes25#v+B%A}Sf(l#@RG_Y` z3fHmr2FhdkZQue*|AVoyu^a|}jr6(yi42=>9v&V}VClSmzyCuh6w+Z`J5ht$VXnmu zzLL-9FG1uYz3H3UDUQ55;c!@of5}JuOFly<Wy3?dB|j}{z-%<*<Kv@vmWPIhz8j6k zA9}rhb8v95D1_P!216d?kdrl;Olh;(oW$tAV6c7Y-%NU>%bD=7VkV^ohI|{y7*f&^ a>iz;nRc`!x{h|E;0000<MNUMnLSTa9UzLXd literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button-active-focused.png b/gui/styles/AmbianceClassic/widgets/button-active-focused.png new file mode 100644 index 0000000000000000000000000000000000000000..71e24eb5b47d2b42451d0c7222f0bab1d773d0a7 GIT binary patch literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoV!3-o@zHZfGU|`%I;1lBd>Ej2W$bTRPk_`<Y zGBgy-b^ww<@V^1X1%mqx4nXp8p(Tg|6fbcDlCR6GRfL3q3}ZpTcjYes%U#|VIJ|EN z_)y{fvC#cvgZrmSXQ1q-Vuw!+zCgz3N>3ok!@!WCr+lZx>T`+Py?p1FKvd=YrOKI` zf#FrD!<SMopu4Z7+1}1|$TC%an&p;nqjWdl<$i$&P_LW3I3GI$A3J-qtEQPWuZa|| zoDff+m#&T&cczh|witK1q2l>e2V*JzdA^#V%924!67xN@=eVoci3v5?syEoExyy^h zYe~mwO7%NwWg1AO>q+d2vYhCkw#45cLsv3gM{-Z3MVqC<a(}~mbNN~``952fc5C^K zp(Z;b%&X00HiVkATgk5vF=@4s@3B?h9%0^OA-^WbaDu%`vxVG52bEO;Myvb{CpoFM zTFSRr%5MobYqeCE?4-8bPk(!)`BZ0hpg2%hi-p`YXLS(6QohStajB2)=1|j48^xI} z8Z%urfZ{-9^F6h<M*y{h)X#C(UgWI{WY2Ne0&*b=gbe>}1qRBLk|4ie21Z6ECT3<9 z7FISkb`B0sPA+b49$r3vAP^7`6cQ2^5fKp;6$1frAdrxdkd%~>m6elIP*hY=RaH~h z*45L~*EcXSGB!0ev$D2vbawR&2nmgdO3x^&=;-e4n>=&YqD6}rFJHcM-_hfzE?vHI z_0HXU4<0;v{N(A&*RMZ(1cFbWzJ34k<HzscfByXa`}g0jyy{wDQcLl4aSW-rm3!f5 zFe9VLfsfm_<re3#d(IY{XzZftDlS{1xpav$`>yx1gLX~4^pO9Y-+qbLzc0`Jd1g=L zXNCCI29e-f-)f>(wk*;JI>5TisHo`qi${vnPp1aWTz}>8-M9Zvt=OTX&nx|WqU-wO zZ(nS@nX{K~`|;f(J8xw%Jn*yOTjgTP(%*c!u)?L+!}QOl1FR2!WeN8!)ad#%eZE22 z=UeLpPCT}>>vBls2(zyDaC-ce$I&@4<LaA8Wsi5qEsi#QIF_%XQ2qM2WE20MQwKiW z?J{D?{++|<9d%SBWa_pC#npO>uhuY%_?PwUJo|46LuAQ{Bdp4Sk{<rc3N*yNeOW28 zf?0mHqRf3p)+cEb5;z3!s4cwo|BmB>FZPXn|1|wdY<_Dus`AITF`ctpy{zy2^Xu7b zYR@^mFw#k9oT43jx_V=U($C)?|9zb7b0oR?v|g&^h0yM&R(mg|ynFS|WOh&0+?W_% ahI)@bPUR|6vv&j21B0ilpUXO@geCxyGL16; literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button-active.png b/gui/styles/AmbianceClassic/widgets/button-active.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d5a7f4fb388799f5d03b4b5dabe52aa415eb9f GIT binary patch literal 848 zcmV-W1F!svP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0009QNkl<Zc-pO% zTS(JU9LKkLnQd!Al$20lXd#m3wtOgiXpxsJ=phgWk~Yc|L4pzrkxhLF=e*R5Q@l;Y z;c()-p%0qi!%BP!%$HKZ%Y(kSp()H|-*5aUe+E7j|A!A}|8sul^W8cB%aH~AyC)nU zAIpJ4%*4cm(&==n#jp=!Q6dx($i-f<Jg&RD`({&9(?DZm<5#=g{uB7Yv4|iz6xxvR z+mHGkw3}#W8X6j^dU|@&=%ZI0a<;j-`J>Hd`(d?OofQ=ouL=qZ?ir27+j_lTmz<oO zrqybbWinY(7+j~YpX01!J?C*gJZr73txkIBXMl2KWW><Y(&E?Ybm<TzfOwz+aX<-T zL3AWSzf!1E3G)&%Gcz;b3t(qV^fTmKdwY9ReSN(R1?PpyQ9vO=ei{*VoEHNw)YjJ8 z+uGV(^fM&U;c$GzQlDT@9hP#L|AHu#L7MXN@}~&#(a(^ij*gBsv)O!~%MJ(pFT$TZ zQ(Rp906VlqKSNRxvSTut^xR_!LgYYMSXg)q-VOR0lG)YO^(!kY>l*KeL?O`zgW-B- zXJ>$ZSuhy9i>Dx@R;w>^sS<@msZ^><@E*aRE!*4M%kAy$J>;V&VTgi0dg<p%a{K!F zjx-vLq#^Xt3x6K(N#4M~fIlZECyC3HYP;xjxm<qw8S-#&aB#h>tSnv18(&&ln&Ec4 z*XjQo;_-Nv@P^*uAPXf3iLqEL*~7!b-@_sKV`F1Jd_nU$C{ai(edFWfU+8CuaejW@ z+uz^+fp5G-A#wE0&dz%1XUNs9tt~sg#Qu_!lFKXr(UBj<(}W@v!n`<o=v!S~wbIWJ z1$efwu;3mY9bFk38gk(DGvV;MQCC-&QdwDfrKqSV0cVF60(BUiBk}C#IO|x?d7SU{ zdRKftpNn4lPYx|$4g>=47Z(@nvCNt2>FG@zv)i~|yWjx)20?Hrv?1*I!Q|xRF4&%$ zn%bC~oBO=Hy!>f@f4>^Om-NyfdB!J#N8mZA0B=FHh?-C+WC1n8^*c}n-hkKO1$Ycn a#oj-hVP@0!^jJ0k0000<MNUMnLSTaU-J#Y1 literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button-focused-hover.png b/gui/styles/AmbianceClassic/widgets/button-focused-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6e27690c2a1ac74409c5d339eab1acc9699648 GIT binary patch literal 1132 zcmV-y1e5!TP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy000CtNkl<Zc-pO% ze@t6d6vrO}oQV;1iTZ~z^AC-GjBUlKY-q*N_Px%{5hh3{&`sumFo#=H`U^*4Y~6@) zG&r+miAGIEB)V+b##rj&l+iJm0|!J0BBg+IKzV)d^#_zb`aFl+X~RE8(?34Fx#xWE z_q_M+xwn+SbAQ7cm8q<SPU8*AjXop&I%iNRc%zzm0BdBnvc@fM;fQn2K&v>DQpuU< zY@dPIEEwrbKdcW}6i>zaF8#Q6zwxkOR=vvFE6OInsB0d#A8?Nz**)i~*M>*x3L~!C zcNa%$G?J^XaB;L=E8>XrrFdOY1a&UZkJ~?VPknCvmbI6cu~m#5eV2+z5|tnrm9I^l z)H%l+D+TYBuLgsIJslCwdsPhhE{mbyMJW=#AVs6+B}qC5e1{{>F^+jLz+Xmv@b}&h zTtC)W>7O{Mzlpx+PvNV1KGl6ZT(6yv&V!*O*?<y&0p!3dz>B~-U`-6`NIU~|M85|( zCe8)gz%T4MV>yogl+U7)xlZiwnsGGW20;y3xEgp8SOq)=qyj0+!8pmUBKl{6mw?0G zYb|}FO}ab2DwT{9%<4@;NB6jbBLnyrJAh|^M}d_<GLS?_Tuw|bndno<18Rb<UmZiX z(h2mZ{Ln@BtVL6yiQyJVDu5?|hkzA8LM*Wzvph%iE6E!%p+EmPf3LQ92K^~)!2xqV zAD;Dm3CT^s<3RE<(|?5&N+zF99`;V29Wdt!=nrRu-tx=Atzj|9pMqpM`OZoIvq%!z zqYYxve+GTgpAxE>oZI^pQAnI1U6TSN;==z5DUu4T1?=bx=Wjd3AI{TsS13gY9*;wj zL{cOTXz1Rj6sN0H`IOI~-qHEKJi55Jcr>1G0)EFj_sXL_y(*Uys_1Rbz4Ayz;IPR0 zIPFP#L|_{_OS8i0Pw^&3-BFqq3b}_GaKqx%T^RxQP@}U#A)r6S>6OYGWt)B8-WzsE zX2$89$l1G{r=0uMGw4sjvCnERS9m6Wx^Nnj*>O7Y>M3XI*UkgmCeWYa&2+}kHN}p; zM*VfX4&rooY5PC3batBxdeEN=RcAj9*SzkkMivfw+*S}20Su5y_Gmrn`?O`Za2kor zP)GD?ED*duW^?S6E&O(*<P-F#q}tjQcq+S$`PaVJZWOw#yY3F2ZTe=q=SQ2jzpI)X z?$`S#-Ien!TP`jv;8p$}jyT6S=Dh>mA5HhR+XkDPT5i?s>T?vo9OyWha|<^e{g*cJ zzMg)Bg;pCq^p3v$1NF@x%2jShiJZNnk%cbhJRiNd{W&QXj9tooL2S)iv(TEqcD_xM z9&9Vz5V&5!xb9fB=f(~d=+F;+(f^-rp{Rtp>Ni*8|NAUFfna2Ed?r;cXJX#w;MC4m y(FMGb*6=3PP8@NLam=F*^|%h#qYwH$@cs+Y53mHn%Sj*r0000<MNUMnLSTZ&rYT7P literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button-focused.png b/gui/styles/AmbianceClassic/widgets/button-focused.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e976f37ac465f327b990c1510083168252ad84 GIT binary patch literal 977 zcmV;?11|iDP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy000A+Nkl<Zc-pO% zZAepL6vwYGvx3qR>RZ(JOe@1u5TZWlr=n;S5kUr02KhyzQ1tq?IebY3-&a#9^EJx^ zha~fZA(Z6HoY%cDb!IL#op)~D&E4J3xjv3Lf++Ukx4V1JdH!eTdCqf2u^ToY0!4)g zG#x5PrC~w`Kwk>?XQ4uRV7WTuAU*?q8UWXb>jf&rU)T2q1Li(9Cz|_Ol!muev(qnS zThq#7PS;Slt*g)Hr|M`y*HFMS%3=>b@g42x$2g2Pv{jiwqj9!ZbrJRUBte6zqju2H zTE+hOtk$#h#$lJ;rrvgJ_IWsGuh+BvUJ$%Jf*^DQUE<U0?Lj;GJzI{x?M<7SwHSw& zV7>lrmEF`?tJzINVQI5{P3g=lIp=k8y&xb1(ts2o8At%m0kOa-KVpgf0>+W}2Y}qe zas7-+?y~f^W}rSLNU@5VA?p{-R|v=@3r_&YfN0<_5CudAf_CDMCh;eM^FYDR(V<CG zcf$zki%ImaE6k3id930Fa2z-U>;oh~I3X+$Kc9reN0J|Sd(&zeFtk=$P+vR`eM_0u zxw6;}&MUxCAOZ*lLj3XXm_Q$i-$yD+;a06Z`j+x#)Tglh7*)xJn_X`LXCiO}kOYYS z6_Q9owl3MVvG#^hDOl7OljxL1E}q+}1?O3^&*A@>B%GX4JkN0r)1bSPL`CnPs?Ya= zqk?ozBtUxn-ylh%fYU&ws7p&Ds0Fn$TGv?Q0b@xJl7x{YF@Rzkba6t6mFOTN&-2B> ztOWGrzDjV<a5V5+4ongkq%%3ob54ctOz;Edj)PnMslWpZQg>Z&u2^6Ax{I{%+Q$4$ zB{-9UbWf7)-%Yi6PsAiRqGy^*7uT3?b>O@lq#K{QZq&BmjYoZPte89NKUmbQ8XN~f znqBu620BJe?bSQ8i>9g2ADVZm+OkZSYkegT0`8KDnncbhj`V#@z!Z)l_A?kq;!`n! z%eE@hmS?&x-E|qLkNYd0i=mP3)s{SDO--_irB7XLtbR;ppPR{cE}FAo4n1+(Z4W(e zH;(fA_{4X#qaWgOSmT6jX|Su^)FhwO%F{OuHQ5@}MSb7jE*j=u79=vIkJXIgk$I{x z?bk&1E$3L)HSbu~Rl%Qeu#G>x?iqh}(>?KA%1!3nc4%|&*qPD{qp2~kexbQ20rgOK zH;E4cO2a+G0Aw^hUb2hu2ln{M8eES${<^;bzxv4<V{NOh00000NkvXXu0mjfcnR0f literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button-hover.png b/gui/styles/AmbianceClassic/widgets/button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..abf23dc55298ef4a52c94dd2f2b4f7bead1c2354 GIT binary patch literal 934 zcmV;X16lluP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy000ARNkl<Zc-pO% zT}YE*6vtoP<}jS|BegE1F1!#l&5A~bH$~}ffzU++7Kk@>5#1GqK`t-+{z$}+IZYjY z#hf}nr;sk_DnUgEhhmT)={C3A_xc|>i<c2ZvB8gb?>XoBpXYtf^PESp+pNFAFA7M3 z48$<<5XHsCaiyiDN_vXyF=BXpv{+Xx9y2vHb=_<>x6RGXS&T;G@x;W0YkYj%YcLr6 zAc+5d-~%V`WG6qxQM}1y+E`jzYMY##%;yP2iId0?Fo&OgWo2c3XJ_Z5)9Ez2TrPv# z?bZhZfe*o8a0Cp2L3+YALU!^~-0|_Tk;c(@=p4<@&zne>^##f7>}(lk<nnsGdI(g2 zhoBG?fUDpV$N^a*a@ek-IF5e=)JQx5JvS0PCVe2tXJ%#=R##U)Bj6<uJO@%i5=a0_ z5dR01>`&tO^WX}2y|%Wtj4v|tvI((cV`Ce8dwcX1cR@N(06CBWDI*C-<dboHJWuf6 z{{H?HYPCiBKscq>>%Siy9O&S@2~t1|hz3z*S3$MJIhqQb+&!;#U^(OuF9Lfr81 zunmRQz<CWM0$G^oU*SYDUb+H@!|@)vcG3reLZ{QYJs!_HIP-X&rT>{k$~C$Sy;jmC zeIYY5Gr6ayCjdt^$l`UC(7=C%lPJLjP)oW>r7}?{DJe<Eix0-P5lAB8B-x;nbX6)< znvju^k)qLP0)D^$O(eerdTP>DC=|(5lSI6DabhV+ZiH%*hb~ar)z#%DeIO)sbaXhe zuPdow5!ziUoVyw%v6KEulFrV~gU!v&S~&9~bWRGkx3}MEwc6cK5+#y+LmOy;^G1YD ze9`*)x)z1sB7Gpl4-5>9qE(xy9Ym;iJ(!-JHuv}Ue<FP#$ou;G?ld+wx@|VwD+Ju< zj+)Ok%H@5Z9oB`j*?y7YIKGGySgqEIrluxOZ*T8Y(hpr&bRZ2aEiLw;p`kB}i;Mjh zi=_hV`W$z}GxVV+Xgg&-pO0F32|ekZ?Bqw>3)Hj%7nW{taB#V~x!KX(-Mv7%q#wGp zBp^ktR^M)KZ=VL1*4EY^4Gj%HtE;O6RaI3%F=VT$sqxj-)p_dc>s?p{CuV+x+J43C zJIc$;Z;>A9l79FdAIrPpG)M($%o*ma2)1zy;(1&G>4<fI0pFcPdYHDtj{pDw07*qo IM6N<$g4avCXaE2J literal 0 HcmV?d00001 diff --git a/gui/styles/AmbianceClassic/widgets/button.png b/gui/styles/AmbianceClassic/widgets/button.png new file mode 100644 index 0000000000000000000000000000000000000000..c9090ae767a17ceef956510f14e828d0bda7e767 GIT binary patch literal 858 zcmV-g1Eu_lP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0009aNkl<Zc-pO% zT}V@L7{=9YN<^AM-9_DNnynNAZ|Y)RchyA%6+s1d)m>2#G!>z|ai3mfIBin6>2x#A z<rhPT7YPa@@M4(EX}O(k?R)Ea<voXORAe0C=h^wc?|Gi{|9Ib1CWJ#p;II5ojE;_0 zf@5_3TVAPVk+|3EZCP1aF}vOFEtks`cRHPksi~>7!{Nw+Jbq_E1{~hgIK?TC^65E` z$75byUA<grCK=4n&woOau(7e>+uhw=ip65CL?YoxCX?g2T+Wuy=f}VY@Sd(18>4ZG zQ(inCcLjsNrOnMv-`w0>WMN^!EgBsfEH5wL!<!`1>GU`RwBQcVfOgOVE`ml-UqB;| zw^APG-vwPTc0w<S89g9<aTcF_KA#r}&-lT!;54WMCqWIU{tY!8ujBl4;1YNNz4gV# zMUQAwF*`fEwZFelv$zh<fD@n!sDP4Dlu{5=aeg(w;EjWWgO6A?Kj|Nu%*@OLLZOfq z!E4|Ys00<Dynv!pQySy^DxQ%BdSlQHN+#3O(_w7%8wA@xEl`P~{|Xzac<I`s(WnKw zf@q?^F-)dXDLsPCyw1x1G*R*%sWX|3iF8T7th2MTYI1TihrlaP&+Dq72agJy)PVD# zk95^)wW`cwvD8w5VX#{U69t<zfF9EA?d?4-%_N)6zLaw&(Cd<B!h4cN0g*|QOncG{ zy&h>#=pTAdOb~<~+Ax_;S8F&Neod!KGQrJ{Kp@bE;1!wbq<wF1Pfv9snc(J|-|sgd zcvYr~@7USdc}o>9nV@6Z(dOOM4rJ<Gx7OCyJm~5k(WD&T5RKJpO-3S-=Sa8-G`w_b z(8TAyp`;5p@c0GF<NOXXK(%Y3m%>aQlD_yoQBF)ujH6}*wCFE*i+5N)EvEbgYx@|R z_y}$1KB|~n`E9z=J&jWwc~7^ux3zfAibJ$MG&B^o*=%moE&6ED06wd2!^6WaBy9~2 z4t_V8Oh0uxU9P{sKVJxq>Gk@I!C*)kjmCu8Y>o{K3`9moM!wqZb|Z9JNRM<y6A5l+ k3QAy9M?lFaNT*Qu7tw)cJUckJHvj+t07*qoM6N<$f^IpK^8f$< literal 0 HcmV?d00001