From 1b5fc0cbdfcb4718fc63175343bdeb8eead17496 Mon Sep 17 00:00:00 2001
From: Thomas Geymayer <tomgey@gmail.com>
Date: Wed, 11 Jun 2014 00:00:55 +0200
Subject: [PATCH] canvas.gui: allow disabling widgets.

---
 Nasal/canvas/gui/Widget.nas                   |  15 ++++++++++++
 Nasal/canvas/gui/styles/DefaultStyle.nas      |  22 ++++++++++++------
 Nasal/canvas/gui/widgets/Button.nas           |   6 ++---
 Nasal/canvas/gui/widgets/ScrollArea.nas       |  18 +++++++++++---
 gui/styles/AmbianceClassic/style.xml          |   6 +++++
 .../backdrop-button-active-disabled.png       | Bin 0 -> 748 bytes
 .../widgets/backdrop-button-disabled.png      | Bin 0 -> 448 bytes
 .../widgets/button-active-disabled.png        | Bin 0 -> 769 bytes
 .../widgets/button-disabled.png               | Bin 0 -> 459 bytes
 9 files changed, 54 insertions(+), 13 deletions(-)
 create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button-active-disabled.png
 create mode 100644 gui/styles/AmbianceClassic/widgets/backdrop-button-disabled.png
 create mode 100644 gui/styles/AmbianceClassic/widgets/button-active-disabled.png
 create mode 100644 gui/styles/AmbianceClassic/widgets/button-disabled.png

diff --git a/Nasal/canvas/gui/Widget.nas b/Nasal/canvas/gui/Widget.nas
index 81051b5da..e3a19b824 100644
--- a/Nasal/canvas/gui/Widget.nas
+++ b/Nasal/canvas/gui/Widget.nas
@@ -13,6 +13,7 @@ gui.Widget = {
       _focused: 0,
       _focus_policy: gui.Widget.NoFocus,
       _hover: 0,
+      _enabled: 1,
       _view: nil,
       _pos: [0, 0],
       _size: [32, 32]
@@ -32,6 +33,17 @@ gui.Widget = {
     me.setSizeHint([x, y]);
     me.setMaximumSize([x, y]);
   },
+  setEnabled: func(enabled)
+  {
+    if( me._enabled == enabled )
+      return me;
+
+    me._enabled = enabled;
+    me.clearFocus();
+
+    me._onStateChange();
+    return me;
+  },
   # Move the widget to the given position (relative to its parent)
   move: func(x, y)
   {
@@ -72,6 +84,9 @@ gui.Widget = {
     if( canvas._focused_widget != nil )
       canvas._focused_widget.clearFocus();
 
+    if( !me._enabled )
+      return me;
+
     me._focused = 1;
     canvas._focused_widget = me;
 
diff --git a/Nasal/canvas/gui/styles/DefaultStyle.nas b/Nasal/canvas/gui/styles/DefaultStyle.nas
index 0e20a714e..887997428 100644
--- a/Nasal/canvas/gui/styles/DefaultStyle.nas
+++ b/Nasal/canvas/gui/styles/DefaultStyle.nas
@@ -79,16 +79,24 @@ DefaultStyle.widgets.button = {
       me._label.setTranslation(w / 2, h / 2 + 5);
 
 
-    if( model._focused and !backdrop )
-      file ~= "-focused";
-
-    if( model._hover and !model._down )
+    if( model._enabled )
     {
-      file ~= "-hover";
-      me._bg.set("fill", me._style.getColor("button_bg_color_hover"));
+      if( model._focused and !backdrop )
+        file ~= "-focused";
+
+      if( model._hover and !model._down )
+      {
+        file ~= "-hover";
+        me._bg.set("fill", me._style.getColor("button_bg_color_hover"));
+      }
+      else
+        me._bg.set("fill", me._style.getColor("button_bg_color"));
     }
     else
-      me._bg.set("fill", me._style.getColor("button_bg_color"));
+    {
+      file ~= "-disabled";
+      me._bg.set("fill", me._style.getColor("button_bg_color_insensitive"));
+    }
 
     me._border.set("src", file ~ ".png");
   }
diff --git a/Nasal/canvas/gui/widgets/Button.nas b/Nasal/canvas/gui/widgets/Button.nas
index 5da879a95..769ec43ac 100644
--- a/Nasal/canvas/gui/widgets/Button.nas
+++ b/Nasal/canvas/gui/widgets/Button.nas
@@ -62,9 +62,9 @@ gui.widgets.Button = {
   _setView: func(view)
   {
     var el = view._root;
-    el.addEventListener("mousedown", func me.setDown(1));
-    el.addEventListener("mouseup",   func me.setDown(0));
-    el.addEventListener("click",     func me.toggle());
+    el.addEventListener("mousedown", func if( me._enabled ) me.setDown(1));
+    el.addEventListener("mouseup",   func if( me._enabled ) me.setDown(0));
+    el.addEventListener("click",     func if( me._enabled ) me.toggle());
 
     el.addEventListener("mouseleave",func me.setDown(0));
     el.addEventListener("drag", func(e) e.stopPropagation());
diff --git a/Nasal/canvas/gui/widgets/ScrollArea.nas b/Nasal/canvas/gui/widgets/ScrollArea.nas
index cc434f6ba..64528525c 100644
--- a/Nasal/canvas/gui/widgets/ScrollArea.nas
+++ b/Nasal/canvas/gui/widgets/ScrollArea.nas
@@ -126,18 +126,30 @@ gui.widgets.ScrollArea = {
     view.vert.addEventListener
     (
       "drag",
-      func(e) me.moveTo(me._scroll_pos[0], me._drag_offsetY + e.clientY)
+      func(e)
+      {
+        if( me._enabled )
+          me.moveTo(me._scroll_pos[0], me._drag_offsetY + e.clientY);
+      }
     );
     view.horiz.addEventListener
     (
       "drag",
-      func(e) me.moveTo(me._drag_offsetX + e.clientX, me._scroll_pos[1])
+      func(e)
+      {
+        if( me._enabled )
+          me.moveTo(me._drag_offsetX + e.clientX, me._scroll_pos[1]);
+      }
     );
 
     view._root.addEventListener
     (
       "wheel",
-      func(e) me.moveTo(me._scroll_pos[0], me._scroll_pos[1] - e.deltaY)
+      func(e)
+      {
+        if( me._enabled )
+          me.moveTo(me._scroll_pos[0], me._scroll_pos[1] - e.deltaY);
+      }
     );
 
     call(gui.Widget._setView, [view], me);
diff --git a/gui/styles/AmbianceClassic/style.xml b/gui/styles/AmbianceClassic/style.xml
index 6ec09432d..42ef16fa8 100644
--- a/gui/styles/AmbianceClassic/style.xml
+++ b/gui/styles/AmbianceClassic/style.xml
@@ -78,6 +78,12 @@
 			<blue  type="float">0.988</blue>
 		</button_bg_color_hover>
 
+		<button_bg_color_insensitive>
+			<red   type="float">0.89</red>
+			<green type="float">0.89</green>
+			<blue  type="float">0.89</blue>
+		</button_bg_color_insensitive>
+
 	</colors>
 
 </PropertyList>
diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button-active-disabled.png b/gui/styles/AmbianceClassic/widgets/backdrop-button-active-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ed947c2eca39eb650e776c923ae582a1f70d129
GIT binary patch
literal 748
zcmV<I0u%j-P)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0008BNkl<Zc-pO%
z-)mA~9LA5+ZMvjw^h2_6!?x8;gBXi03cRSRf-Zt0h}eCQqrbq5yod&_kYNQ4^~MV?
z0udbwQ`8H8v8hwhg{(=iF4lB`MXl_4#&MhpwTsSy&pGFP-|zc8=X>5?!fvy1h<3ZJ
zkdnz{dh7MNMoO_*>|@*C=+=~q_ms=!iF`i4n9Jqjg+if<_Z`rd@DqF&pTEI3&;Xx7
z9esk}2|i+sdQuY_sL*I#U0q$rm%oifA`hHS=cL2o7`Ip~2D90$o0^&$6a+yFj`3+U
z8V6a=cE&M28jar1X0r}_WDTb8sJm}M$7;1|MCI<>+}sER`hg1c07VA|cOz{V<5lbr
zV?Fem$mkCBY0`@<EXd#m1K9b0!PS>cCZDaXtvRVr6E#ed;c)mi8kI7cD3_L&ZbCN>
z{eGGZpil}1gV&j|OeQ@(pYIBE^VFw_7XNS4>-A2`Xrget-4|f8Nqw3O!sLtHZXaQz
zTqahlRmZ`H{&AWNqwr&9W@d;1a-rAj2cWwL{SyLjTxf9D$Z3L0&4t@)wa(Jy6brMn
zv$AG_#oNi`w7?q*TP~N&AlI0X`T2Q{NrOr3n_$sY{C@u>IS1b3@l0TLeLOIMV|sac
z`I?+l7>j$lfa|~n@1aB@aZAp{7>mVj;19(+CMU7Qzrhatk{g^%CaRT{mFL{MI#YOH
zV`Jkkepw4!f#K*K_~@M&tNjf0zSe5Bd(hW(PQr7@<`o(~AtP5hoqiMwg)U>0yBG)r
zM%ig$VPV*0GN~cb%csp|8)7}%8OQikD)kT<Eb;(@-fQX}I<$bH*=$Z%DwW4b^F3JS
z?BMhUJD>&jKpXsGne~X-65~FUN+loqKi%HmzDhlyq<;7Lt_C_WU=*AO<NsicF(O9x
e6Z>nWx_<zy)=bUWga_FG0000<MNUMnLSTaVTx-t&

literal 0
HcmV?d00001

diff --git a/gui/styles/AmbianceClassic/widgets/backdrop-button-disabled.png b/gui/styles/AmbianceClassic/widgets/backdrop-button-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..27285e28c1650c67494481c8df29abe45635f42b
GIT binary patch
literal 448
zcmV;x0YCnUP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0004pNkl<Zc-p;{
zJ4?e*6o3U41w{o#2VaYiMRe57pI|3(a&{0L99;Ydf{WdBQgG<%qzD05i)q@X0V@P6
z_<~}LLn5{6cZSGSIw;;`__#eu&-rq>kJIEod%wmoj272*+q2nh>tFJ|1-5OE6bgkE
z%d(F0`FsT)z=Htl@CG5&;2i?+;1O=%gxodij5U<-a!U#$*@eYiE;qqA%vbl3)G4!2
z6Em4iGdUgdo^ePDlb?b#T=8sQm55+YzL3I$691QSx!gs)sz|>i1ly37-@2gQCLF3W
zku_M*DWT>pHP6+VoWZ<i$s}ufsY<M3u{fhsf?z;)rz*KFl}e*JB`kg$bzfD9$5!mt
zD2eI@a(JU4lpqF)XPRbD6!=NZ<Tmy-k*$`*?z%|goEWj6c#P{w++F=Vc#*4Jhd_2J
z^`4?zST%2e3kOJ-5l*wm$E8=OJw@#$j^p%3y@YWJmS9i%l8g;Iqa^T$9XJIG?w|%A
qKd3_pK2+fzDsT*|(Q!~EvGWPqklz_w`kYAs0000<MNUMnLSTYh-NqUK

literal 0
HcmV?d00001

diff --git a/gui/styles/AmbianceClassic/widgets/button-active-disabled.png b/gui/styles/AmbianceClassic/widgets/button-active-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dc66703683047faba6b99e0196c2de29cd6b6f2
GIT binary patch
literal 769
zcmV+c1OEJpP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0008WNkl<Zc-pO%
zPiT^19LLqUxm+--!IqGVRZjXN#HffCENT_iVFeLE#10<n)Fr%Tph+ZbUL^A%CU_XK
zO%EzajA?6AhnubuWOlFxc1c}gQ7ij?2aXpH?a(WHczNF6@A-ax-sgFKKgoKfyhXiU
zmo~Gyy4tq5xTqA8%jFb^$plE75$X!XTeI1$E}2Za!Rv*Eh4-KY>H>Zx5{Vytf<NFp
zD1$HH6JilOA7nC_e(1@mD>P9+_{seId@dG?xx(S_ZI{cXx7+Q9OeT}YU@&wK3=DKi
zB$Az=gU`OczD~YpoO#R-g+jOD@%VG-e1w^sx|=3+%;)o3yj(Y%&Akv%06CBWX#*xV
zBaAbj^ElsVG^(LjSzcbgL4BHZ;5$E_ot=Hg1Wx{6@N1iynK9$*c%iSPNhb!0U@&+M
z!4{EBS|%qahq<@Zr%4wE@201x&vMBknaCz4CQd?k1^Rnv(t}e`@cDdt5ly5Hhohgm
z)TfCCoAlLYv-L74mWjn;>4r%K`uk{d046_2Mn+Uj5DT?ht%U9d^bgXcpBD}8JH#}>
zubmgSTCM77a+rhB(NR%Xg3H@j$q||yg-OxrbZW%f6EZ$N&OIq}5t}BgQ#f+R#N2p~
z$D`%x+A_g;PN7~6ig|=_xlg20skd7uC@Zg`(dbn%FJmMUxd4+l4HF$ovuAE@&dvfS
zl8GF8PnVXKe9+g@q-$+$?LPLUhJDd&UxBx;#9ps=FZ8|@3Wa;n-`!|fr_r!pAn+Og
z;3X>Z-9R94-0%16rlzL$bCT6+-8D2c)DDqWKF7w!RD91k^O%obbO-a@Y+%r1KRHGH
zM$>8sXKJ<Db+p@u>2x}X@A(1A1yBSfPy-vF4t{ft(^CRPP+&ghh0&THmCNOu&>L(t
zt>zxD0(u&PbKoMl@((V9OJEqB2NdS~9-;1ER_{e-)gQ3R00000NkvXXu0mjfz({G-

literal 0
HcmV?d00001

diff --git a/gui/styles/AmbianceClassic/widgets/button-disabled.png b/gui/styles/AmbianceClassic/widgets/button-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dde0945111b79e76bb1b61e2f06bd3fa1670406
GIT binary patch
literal 459
zcmV;+0W|)JP)<h;3K|Lk000e1NJLTq000>P000#T1^@s6vnxdy0004!Nkl<Zc-p;{
z&nrYx6vvejMJQrnu<>IfmhAiqtYl?vp)4$H{0GX09V^P>ZPgU1S88V7kICz8CnZl|
z)Z`fpGzOoe8C}yX$bE0|dFP&c-Z|g<?vHnyN{`{MF-<c8ZMj^o<u7?Z9Fm7@+g{FQ
zvqzR?1yFzxo}mJ7#9y#wc(3+{^xb2x;RIGQnaoH-5rUf#kg$u$0(Q)CoI!+p8GQ#N
z)I`HDntk7ImpFMzDNN2h?H%j|c3%|{ff*SgFAj+RU#Qm!MG^fLVdPsf0%_}lnj6$S
zR7GSB<}`~;Q`1$a>x`+I)hXh-?l^Vxs)*10P3aV&W<M0v>AFg%)5AJNQmIrcBCqO~
zglxqwY3oGJksRJHN4Bpx5r~AI=XKYdQsiHPa}&p!<Rjl*2%N`pPRuw?{95GyE*8Cy
zjwkuG>kyEgO1+2LUszRMCvXV|1edUrFbYZaPEqd?-s`E|C9J^&?M3SBVFR%ZZ$?QV
zxDBVYeYk}(eAH2?-jF3I!W{%~O#e##agaykd;+3k&CMP-h0y>2002ovPDHLkV1i@^
B&Ex<8

literal 0
HcmV?d00001