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&#5*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