From aca556d79488bea89329aefb3f54700ce92f3e03 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 16 Mar 2016 16:40:02 +0300 Subject: [PATCH] Implement SwitchWidget - close issue #205 --- examples/example1/src/example1.d | 5 +++ src/dlangui/widgets/controls.d | 43 +++++++++++++++++++++++++ src/dlangui/widgets/styles.d | 2 ++ views/res/mdpi/switch_off.png | Bin 0 -> 946 bytes views/res/mdpi/switch_off_disabled.png | Bin 0 -> 869 bytes views/res/mdpi/switch_on.png | Bin 0 -> 1241 bytes views/res/mdpi/switch_on_disabled.png | Bin 0 -> 1150 bytes views/res/switch.xml | 10 ++++++ views/res/theme_default.xml | 5 +++ views/standard_resources.list | 5 +++ 10 files changed, 70 insertions(+) create mode 100644 views/res/mdpi/switch_off.png create mode 100644 views/res/mdpi/switch_off_disabled.png create mode 100644 views/res/mdpi/switch_on.png create mode 100644 views/res/mdpi/switch_on_disabled.png create mode 100644 views/res/switch.xml diff --git a/examples/example1/src/example1.d b/examples/example1/src/example1.d index cb08fdb0..a30e373e 100644 --- a/examples/example1/src/example1.d +++ b/examples/example1/src/example1.d @@ -567,6 +567,11 @@ extern (C) int UIAppMain(string[] args) { buttons10.addChild(new TextWidget(null, "ImageTextButton widgets: "d)); buttons10.addChild(new ImageTextButton("btn5", "text-plain", "Enabled"d)); buttons10.addChild((new ImageTextButton("btn6", "folder", "Disabled"d)).enabled(false)); + buttons10.addChild(new TextWidget(null, "SwitchWidget widgets: "d)); + buttons10.addChild((new SwitchWidget("SW1")).checked(true)); + buttons10.addChild((new SwitchWidget("SW2")).checked(false)); + buttons10.addChild((new SwitchWidget("SW3")).checked(true).enabled(false)); + buttons10.addChild((new SwitchWidget("SW4")).checked(false).enabled(false)); layout3.addChild(buttons10); WidgetGroup buttons11 = new HorizontalLayout(); diff --git a/src/dlangui/widgets/controls.d b/src/dlangui/widgets/controls.d index 4cace9a1..c20144e2 100644 --- a/src/dlangui/widgets/controls.d +++ b/src/dlangui/widgets/controls.d @@ -159,6 +159,49 @@ class MultilineTextWidget : TextWidget { } } +/// Switch (on/off) widget +class SwitchWidget : Widget { + this(string ID = null) { + super(ID); + styleId = STYLE_SWITCH; + clickable = true; + focusable = true; + trackHover = true; + } + // called to process click and notify listeners + override protected bool handleClick() { + checked = !checked; + return super.handleClick(); + } + override void measure(int parentWidth, int parentHeight) { + DrawableRef img = backgroundDrawable; + int w = 0; + int h = 0; + if (!img.isNull) { + w = img.width; + h = img.height; + } + measuredContent(parentWidth, parentHeight, w, h); + } + + override void onDraw(DrawBuf buf) { + if (visibility != Visibility.Visible) + return; + Rect rc = _pos; + applyMargins(rc); + auto saver = ClipRectSaver(buf, rc, alpha); + DrawableRef img = backgroundDrawable; + if (!img.isNull) { + Point sz; + sz.x = img.width; + sz.y = img.height; + applyAlign(rc, sz); + uint st = state; + img.drawTo(buf, rc, st); + } + } +} + /// static image widget class ImageWidget : Widget { diff --git a/src/dlangui/widgets/styles.d b/src/dlangui/widgets/styles.d index d0aefc11..b84a572b 100644 --- a/src/dlangui/widgets/styles.d +++ b/src/dlangui/widgets/styles.d @@ -49,6 +49,8 @@ immutable string STYLE_BUTTON_IMAGE = "BUTTON_IMAGE"; immutable string STYLE_BUTTON_TRANSPARENT = "BUTTON_TRANSPARENT"; /// style id for Button w/o margins immutable string STYLE_BUTTON_NOMARGINS = "BUTTON_NOMARGINS"; +/// standard style id for Switch +immutable string STYLE_SWITCH = "SWITCH"; /// standard style id for CheckBox immutable string STYLE_CHECKBOX = "CHECKBOX"; /// standard style id for CheckBox image diff --git a/views/res/mdpi/switch_off.png b/views/res/mdpi/switch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..c46f26aeab3d3850c1706a475c6f749ccfca1a65 GIT binary patch literal 946 zcmV;j15NyiP)0J(rs8lNS^z>j=DiuaYN3kr6YPH(3L)*5^$jAu!e4f6(zDR%$!w@MYp66jH zrHIGlgkjk7>98z|dc7W*>M#rg$8ngSpU2uHAC*@zYBCH1U>$T6A0TRqRH7pfS|?hA z)}W)N(EpjqFVA!FvWFiUv}FbvKlK{VA8f<8{Uhhje9GK?>vx}ghjY0F-f!f;^zb@3 z4SJh`5`|Ab;;U;34jdmR*M5_qzMba$hs)USoh6r8qYlvfB(FZzi$sv#?_j9;#=ia- zHrCqpDGJvViNRC6@ycVgTLDk>_`LhY6)yg;z-Vp*hI^RfCmtmM2rGuM+Qiq@(O9+e zZ`=U(9(;t|Z3zq@cHj`*T%q{uBDLIRzXSyJIspPpiu-z}iLXI#FX)Y{X|jn)nC9jw z=w8EI{hYVoTF3JEn;&pyUladGT!U^T*_pxR7yg+0ojXsvB!ptMI7b<9vzHlA2s$dTg%JObMC)Y#%b?5UGTq(X z#A30Q9W)36N~ID~%18kYf&kmLv0T^1^E_5oRxnMoWd~MDQ7V<_=;(+HR literal 0 HcmV?d00001 diff --git a/views/res/mdpi/switch_off_disabled.png b/views/res/mdpi/switch_off_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..4928fe1ac64b904b53c691a26f9fd319fd7dbb72 GIT binary patch literal 869 zcmV-r1DgDaP)7TNge8Ht&!A*?9)2NhAoAc$VPco9MTTH;60lLQH} z?9Ihh@en*D#waArgak*Vo#{-c(^Vdln4mLcRx@!N zW3{`=WHNZ3M>d-kPQ6|?uIo}Nm2e!VZ5N#+3FUH`IF4~$w_{+htgIlVG)^4H3=It- zr6f($wq3ANiejMC!Z1V{V^B(AjA{Et3n9>2cTAdv5V)>Onx;tG zq1~O7^V7CfX+2g0}j(>WHEU&-0M7eYtC`iJ}OlR7U~U zTH`nlPFGhKVHlDmNn3+9#!#=<$>nk#1367o!Z5`5eMFDPRAm&0pL6e>ug*+crb9Edgo1#QR8hhL!lGzGLK>oRp-nW#zW@_mm}ufh zOx(FZqcJXA8O4YnBvckg8WaiJw?et?l?)x4WcUnoU1_l;0?VM!p z;>^7>?|ts?{?2)i{CV{{2R=QnM^604^jwif+`Vudp(~T(<2RladFk!X^zh&a>$dg~ ziZs>54O~0>GY_PTy!FD9WZGJ4cAb}pbG&%qb0(%{kO%u-*Yrb=5@|}-jZ)4W`-Ja5 z*iYx`7F4xn*C`_8re@jx^qY92<9Ryk2r@vqFil6g8Eb7#uTxb?C1a>6-aPqwi&}?# zGi;y&x(*9XEnCJ?QBiai{!=-~qBp|c1Ykb9Boh6f@0O9G?+CP1S{GNqbp@va+$vZV ztm?u!|Kv5GDgj*!7^{d@2fI!cEw>Fh4t)>bF!W$n@PY7TosQ#8WfN80I4`CRz*BB!S#Y}>w; zeY?}hz!<-jiwjq6?oQC1o#K-3BNiwZ@Ir!Xz;y&;wE=oDXxD*|E5uVVcBNqU{8>I6 z0_#k2dLqoL``X#LF3h_~U7tq-PQ75>jG@fNBwt?N7o46-8jTf{jxDpgfsj|IX_KKDY z8L=kFg~GU^7(gQ70Gc(}O6w-#apv?GJ04Ec(>cerO6MVqK8<3yxOY}is}%Bi#%X1B zCPX4zrl1gSNstC6vPI_nFbY`fFgKaycrH!v`Xt8O^w3tCqMcimlvIvZp*T6g@zJ$B z(bdLNI?MTj!@V2hMC~N~7nPZ)#Q^Fn1!9~!IYLiwh7J$P3aUY?=Lo1YtYe7{onkB$ z-3S9;oy6JG&E8E(x&)@jMmaR_2PaGiF$@Ng*s|<5ED(6K4_JxgrZ$mq=I0z>EzFfHBF!{!*a|?gWGRV<(|$j#5}adv4YuH{ zjHr4{s!CuDM)Bwgy5hDX68}ZkN4yd11tGur|x-_fLtO`Tm0bv~-grM_`o{jkMy;DTR zaBSQ8c%#i%-<;!dyN!3@x9c2Ucq2EE0aojEK0W<0g}^6G)3I%5R17)&!Ml9^#g}-G znk^Ozg2yTs45{{Mfd=RHf6{|MR`tO&lfc-COeHs~aEIJH?P z7=sZ=osv2Q0k)tf&XG8Wb8gr7p9n>Z$PjW=3^+DF$E(#6R)l_>aOXjj8;{npp3gfc z4p8!a8ucbu?lw>n-a3AOio$nGcWB3bR3vxMMh3l`VrY%vSwk3j96z#;gHsWW)dp+b zl>N0Tug$-L0q(Us!)q$DWonPRw0b>IP))H`utrdX)a@zyX>TS|bPxvYD;Mds)>yo? zilRK+=yCGRd1j|V8od}1q1WjVgaL;tCAyCiL}F0*O@EVs7)71hLYSqXA%@`1^}PucybyX6FWy#D&Tt-<impkOVXc8?@=s4A+^ z?QC*?eUtJ`iK1tR9Wclw+2t`2#c-gexYy-wYm+0@GA9lR>%D~POcBwP2h9%gR)tdq zhvDA+H4aQiguX{Vjx(!abf3`6>_BT6 + + + + + + + diff --git a/views/res/theme_default.xml b/views/res/theme_default.xml index ceffedeb..3327410f 100644 --- a/views/res/theme_default.xml +++ b/views/res/theme_default.xml @@ -66,6 +66,11 @@ margins="2,2,2,2" align="Center" /> +