From 2d11cb498864be3507138b8df2602e2bb10fe2c4 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Sat, 2 Oct 2010 00:33:35 +0000 Subject: [PATCH] textbox / textzone git-svn-id: http://svn.net-core.org/repos/t-engine4@1354 51575b47-30f0-44d4-a5cc-537603b46e54 --- .../default/data/gfx/ui/button-left-sel.png | Bin 408 -> 467 bytes .../default/data/gfx/ui/button-middle-sel.png | Bin 238 -> 244 bytes .../default/data/gfx/ui/button-right-sel.png | Bin 427 -> 484 bytes .../default/data/gfx/ui/scrollbar-sel.png | Bin 0 -> 295 bytes .../engines/default/data/gfx/ui/scrollbar.png | Bin 0 -> 213 bytes .../data/gfx/ui/selection-left-column.png | Bin 363 -> 339 bytes .../data/gfx/ui/selection-middle-column.png | Bin 248 -> 228 bytes .../data/gfx/ui/selection-right-column.png | Bin 379 -> 358 bytes .../default/data/gfx/ui/textbox-cursor.png | Bin 0 -> 172 bytes .../default/data/gfx/ui/textbox-left-sel.png | Bin 0 -> 416 bytes .../default/data/gfx/ui/textbox-left.png | Bin 0 -> 314 bytes .../data/gfx/ui/textbox-middle-sel.png | Bin 0 -> 222 bytes .../default/data/gfx/ui/textbox-middle.png | Bin 0 -> 207 bytes .../default/data/gfx/ui/textbox-right-sel.png | Bin 0 -> 445 bytes .../default/data/gfx/ui/textbox-right.png | Bin 0 -> 330 bytes game/engines/default/engine/ui/Base.lua | 3 + game/engines/default/engine/ui/Dialog.lua | 2 +- game/engines/default/engine/ui/List.lua | 2 +- .../engines/default/engine/ui/ListColumns.lua | 160 +++++++++++++----- game/engines/default/engine/ui/Textbox.lua | 156 +++++++++++++++++ game/engines/default/engine/ui/Textzone.lua | 99 +++++++++++ .../default/special/mainmenu/class/TestUI.lua | 88 +++++++--- 22 files changed, 449 insertions(+), 61 deletions(-) create mode 100644 game/engines/default/data/gfx/ui/scrollbar-sel.png create mode 100644 game/engines/default/data/gfx/ui/scrollbar.png create mode 100644 game/engines/default/data/gfx/ui/textbox-cursor.png create mode 100644 game/engines/default/data/gfx/ui/textbox-left-sel.png create mode 100644 game/engines/default/data/gfx/ui/textbox-left.png create mode 100644 game/engines/default/data/gfx/ui/textbox-middle-sel.png create mode 100644 game/engines/default/data/gfx/ui/textbox-middle.png create mode 100644 game/engines/default/data/gfx/ui/textbox-right-sel.png create mode 100644 game/engines/default/data/gfx/ui/textbox-right.png create mode 100644 game/engines/default/engine/ui/Textbox.lua create mode 100644 game/engines/default/engine/ui/Textzone.lua diff --git a/game/engines/default/data/gfx/ui/button-left-sel.png b/game/engines/default/data/gfx/ui/button-left-sel.png index 647e3e36c00305138552219ee38885bc5ec880b3..532f8c461f0ee3e525972c049655df5cab07ce48 100644 GIT binary patch delta 401 zcmV;C0dD@71JeVLF_A+ae-kkZwUrsD0000TX;fHrLvL+uWo~o;00000Lvm$dbY)~9 zcWHEJAV*0}P-HG;2LJ#8JV``BR4C77k3UbsP!z>~_x07*l2Sk+#L<Dl1QJYeabR)N zoxy>)k?<+}1nw?wCXNh*-BBktK7*SW>7NvygQZk_%S+Dh-gC|se+tjOz3l;GU?`cO zfk)tOJEXHe7pv!I9A9>kZ2b-3<fc!f-@{}ZV}PLDqIS_?9mY8r0tB5Fn=ocS1GiBl zjbgwcMX-(%#26636hRmvTNT-XO&C+qi&k0izSSlJ#_YA)_WxHmjUu*Q^0!rzPfIa8 zzgo;LTtrAezpxJ7f2@>2Ys*53Agc)5)`<Dd(Fa=NXpL=I*r`F=Hi)3>zW<^`2A<>K zXpK?|Q3`d{Za)W}$C2;T2m+dw3e9pE>wPjwXY=`~h_p(si<4O^AblE*?yIHJY!%0> vl7#O#MvO6azz4jC>9qU0SPVXv%j+NAo@jjo$WxC10000<2SrXqu0mjfEZnp= delta 339 zcmV-Z0j&Ph1DFGlF%Je}OGiWiHvsJb)xE*GL6I&Ye+x4Q>nHVJ0000PbVXQnLvL+u zWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN^GQTOR4C7Nl08lXK@5dIPqHFiM1)e% z(4|0Pr67fdA{XEWDIyx0oQH-6aUI&+ff}s{Gy9V<1+yFPBHUPdpU3Z68o^Yy*{pya zu$3f?e}Na^u^k$x-ihb8*Ie8$k@Wl>;PPS3e7!=`iygr9X2I+(=jh80YyqbEg6K<z z9!%ylnot6YSa1v#q6z}21wJ6Hikv|7B}TWalJRg=Oh9#zs?Gl=ZW99SF6pPLx@ocI z-PNLf^Xjv}P0ms%J%PITBI9?ue_&Np7YAIHIRW5+Hw&A?H;wl=;F)1XWfb@Ok5Qgq l0ZYqV>QBI{1@hnb`2pTUUyDx#c)0)o002ovPDHLkV1jaxmVE#K diff --git a/game/engines/default/data/gfx/ui/button-middle-sel.png b/game/engines/default/data/gfx/ui/button-middle-sel.png index 8b32a9d0b3e0b784c34e1c1360cddb4befeeb94a..306f7cf1d62dd567a18886ce863286f842fe139e 100644 GIT binary patch delta 176 zcmaFI_=RzT;Y4S-dSOGcg;QLgGcYj7W`;zRIOpf)rskCZxeN@>MX8A;sVNHOnI#zt z?w-B@DSD~wK=D{l7sn8e>#3&=`I-U*Tra*3ZsKeVD}R&}VV=FgXrW@g+)PGk>)VrM zc2(N39(cWZj@J7XQ41DJhQ3*$6kzs0(sZ%%A8AQ9arIY57u72EE<9fAa6Z$?`TpXw cZtqK<axYqADx=yu^9RTYp00i_>zopr0I97*T>t<8 delta 168 zcmV;Z09XI?0qy~iF%Je}OGiWiHvsJb)xE*GL6I&Ye+x4zuK1}c0000PbVXQnLvL+u zWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbNNl8ROR0!8)i$My2Fc8GTfN%0KeYel> zyt}2-dQe30l0!n+T3Z5OKaV9>M~*}@3OPG+CK^#c=O{F@o?~R88E?HqN6SXQ2N#J8 WIiZUf4)*f^0000<MNUMnLSTX%Qa!-{ diff --git a/game/engines/default/data/gfx/ui/button-right-sel.png b/game/engines/default/data/gfx/ui/button-right-sel.png index c504f1063aa2791b584275a46bae07dc7d0a2a05..8a2d303027939a896fda6fff73b25fc339732910 100644 GIT binary patch delta 418 zcmV;T0bTy91LOmcF_A+ae-kka!jdUI0000TX;fHrLvL+uWo~o;00000Lvm$dbY)~9 zcWHEJAV*0}P-HG;2LJ#8O-V#SR4C7Fk-bX9KomyLBol)yMrB286;xO-g`(Eh`v|EP z!A2~61m8grY^)UQ6&nlfg)PKK@CU)d!el0!nQO6|U0prpckXxRf5L=OmPweVi(#5R z`^U!@2B;{@gb`=JUhn+83YHHtX4hM_=m4hxYV)-#2)y4v@N#um4{QalusCCBZl_GI zt<+*aaHcQ3vCO2awP<T+N}&J#L^G+yoOZcEsalQD&XlM@Eb6By42r*KXDn)L8bJHP zGOWm0<3DsYSk*7cf7q%z_;r;rgGBJ&j|8??{{X%yP)Z>p=%{ii6du9lhA0g2BIv0= z15nwLDA4p`MOjrJdOn^+MDSsRoruY;#f#kPg(N|M$~p3~Bnm?|mX<DbBaRWE=NuwJ z(rjLx?Cw74FKdU5nMUL0xYIcTD*g8P$$XMr@3dN%hwXM37|4PA8#$_;<Hx&`<NyEw M07*qoM6N<$g3X}4@c;k- delta 358 zcmV-s0h#{f1FHj&F%Je}OGiWiHvsJb)xE*GL6I&Ye+x4hW-s`v0000PbVXQnLvL+u zWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbO21!IgR4C7Fjy+DpKoEt$u{V_bC|rO7 zkdSbJ1RR1RxS~meI8K^07RBBGdZ>d$kuwk^M1@eiYiD;U?8T1Blcss!doz=c@;szj zc9dq>f4g5Smb8*lo(DP=z@*lCogCli99*15a0|=;<nrS!5a9FWmF44e3|u9yv^ZlK zUuW!{pG0t%IMV=cEc@AM1UJf=3TW={jCUhARBmMuiKvrurb1dfNFS62;lGqK78#@g zlrJrRl`v>*lUlc{nnD<?ipIuQ#<Whrd*6RIOx_Th(8jw$AW(n*3>qSMTj8rZ`d@0j zG7v&Dot_lEgFQ`?EoM<`Js*Msm;k8OcmSrg*7KP71p-ihL`zNBa{vGU07*qoM6N<$ Eg4^|$v;Y7A diff --git a/game/engines/default/data/gfx/ui/scrollbar-sel.png b/game/engines/default/data/gfx/ui/scrollbar-sel.png new file mode 100644 index 0000000000000000000000000000000000000000..21ebe87149a225adf15a59dd4d1edbd3b6020ae1 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^96-#<!3HENCaw(yQjEnx?oJHr&dIz4a@dl*-CY>0 z7-lo@7i$OJ0E%!HctjR6FmQK*Fr)d&(`$i(>?NMQuI#tC7==tY12nHC0EJ{TLn2C? z^K)}k^GbkR1_tM%)Wnk16ovB4k_-iRPv3wPy;OFfc%7$<V+hCf*j_`fLk=RW&rh2* zhG;W3uMK^-Z2Curc?VCkwB)*|I6Y|h6)6+^BepDHdF4?X3ClRX-9?cm{W7&a%*j$S zHW@u#@vtT<cI&EbFDt*Z&6E7ybM0%?Tm|U~^2`a}J|)y8Mlb~b6A)zOT(|%0?@Qvn gHLB0L%kFNiWv-MooEO}3eFn&hp00i_>zopr0Dk*nYXATM literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/scrollbar.png b/game/engines/default/data/gfx/ui/scrollbar.png new file mode 100644 index 0000000000000000000000000000000000000000..c20574112f672353bab2e0f58fb4d66fbea4e908 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!3HEBGrV^Oaf*Z7ofy`glX(f`uqAoByD(TW z%x2&()(*S@6yYrJh%9Dc;O+!rM)Q-W*8&CEOFVsD*>7<%3bR?4`0QK;6q3yhi70W- z&&^HED*<vD7@Uhz6H8K46v{J8G8EiBeFIYTQrUsxI-V|$Asp8k6&ddRX9OvneDz}J xhwr~aKYaTg`ta=+h7aF=um14u*XlDVfvZiQiZTTrUhM-?=jrO_vd$@?2>_lzL0JF* literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/selection-left-column.png b/game/engines/default/data/gfx/ui/selection-left-column.png index a19defb42a04feb90f4be8dfcf29749d901ba9a3..2736bd608e340d4a7d7e4e79e85e28108d69095d 100644 GIT binary patch delta 210 zcmV;@04@LP0@DJJVFwZ)H|IDuqLFAUf2v7DK~xyig^V!@!ax*6-``!xFE(k?TBH#? zf#*n-TiALE`#{PRwqC;{1X6p3WjBPih>Bq0z!dXl7~!RH98boWvjZ50;Z~Mq3*h>` zKUG!L#ux!`%d(tfjEKkvRCV`mMFjT_|H0?ud+`JQe~1V!rG$uJjM<!0VqI5qK+XV| z5W)k%T8pY;LI{_fGtN0w6+6%Ky=j_bUDtc>Jr-b^rfb)Az9@>r6T1OO*C$Lyxc~qF M07*qoM6N<$f-2@-<p2Nx delta 234 zcmV<G02Tk!0_y^hVFwX07)7YOj*)0Af5J&bK~xyiZOgH0!cY{(@&CCwDvb_7&_PN! z2e(c>heIDg1jj%pUqau-rQp(8L<I36TnnN}Z0@~DhgL~TzwP|a_X$6F-@nEp!At>G zyXi7)bVdOBwjIY|qdT%b1wf19b7oy~TcR~>Jz8G@>r$%u2P$;{&GYMT$Ws3YSQ2+X z#0Z+D6%awMnMXu01_CvhEb%y3-diTQxFdXjn=QqhPj*rG60I2?no4lkeryKM(XjUv k_M>(kxowy0mpL%`0tDeiO?NAZj{pDw07*qoM6N<$g0QV-tpET3 diff --git a/game/engines/default/data/gfx/ui/selection-middle-column.png b/game/engines/default/data/gfx/ui/selection-middle-column.png index 0ba88ec21c4f790e15f0b1c93faf1198967068cd..d0b9deacc678589f865cb10eb7c906c724c00c8a 100644 GIT binary patch delta 98 zcmV-o0G<E%0ptOYVFwZ)GM7@qEs<y}P&-LPK~xCWO^C4#z(5GZPDclV{WoDXpdcyo z(x<U(BQqa%H$KeFv8wvNoA>Q5C?cSlfe`_^JE*F70lAeX_R;K<=>Px#07*qoM6N<$ Eg2X#1p8x;= delta 118 zcmV-+0Ez$P0r&xsVFwX06ViHR29aniWKT&%K~xCW1;Nn`f<O>J!Ix*mL_Z+VxP94y zZ6LRX-SeE`^?nYs4$R)Ldc*92XYQEQuzrDO2DVS(H#){qIL1IP;<8RSFAu!mHk__A Yf5O)%4?&-~@c;k-07*qoM6N<$f>qBoeE<Le diff --git a/game/engines/default/data/gfx/ui/selection-right-column.png b/game/engines/default/data/gfx/ui/selection-right-column.png index 0a87daeaf0f25a831463cf0957f929e09ccd3be3..12fb9dc2218317c6c466cf33bba1ca63879cc926 100644 GIT binary patch delta 229 zcmV<B02=@M0_FmcVFwZ*1OPUDh>>V4f4xaWK~xyiWsN;*gg_XEpKqK|JFyUi<boDS z74{fg<N^U(k$42jRRUXBq!Gl?(Qk`HVaeOQe>`+u_uaPb3x6_2Q9PGr`Q9|mCxG;Q zuSYu!!>je)AD(U7E@vPjBuVmQz4xdpB7%s>!v)~s0$}HP#u$U@FU&5>@_%s{QvkcJ zE5J#zA%rtfRg8$Bs_grY_g+mL$3#&Cz%)%ao2DruLI{Cz9IwVX2SAo(Uv*tyt#j@t f&-0I}s@?$Z%*$H>I+fx~00000NkvXXu0mjfe3NFt delta 250 zcmV<W00sZ%0{a4xVFwX04JdV3Wsztsf6_@rK~xyiU5>Fz15pq~&&<veLyU^01}yvy z!H@7ev`i}&78Xg7KHnhzf)RTqSPCN8sl*u8?7p{S@!SNw-Q2n7a=CxHe7&1qobo5# z>KycTx`(65^!yq?9-hbEd}oW7GYhe3ZfdXkR)+7yN`__aeG9R`-4PK4l~tnAXsSa* zlTn5*L=3!c5=&sYM#?ZpkhKxx&%e@;Sa*ogQBlDiLRC{Nf@^Lq%u>gER=ruCb<z$k z_<S#in%f2d+uhyUtN!CqRa+mM?Y+Ut(akZyFTnm&*^P1YIsgCw07*qoM6N<$g5^+o A4gdfE diff --git a/game/engines/default/data/gfx/ui/textbox-cursor.png b/game/engines/default/data/gfx/ui/textbox-cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..ec01ddb954443f2762c76fbb92d568fccf89f762 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!Laf*Z7ofy`glX(f`a29w(7Bet# zcY-jZ`N`93fr9KMp1!W^x40O^^*EoMe-{80lFbZ>C~?lu%}vcK0dg4_oQqNuOHxx5 z$}>wc6x=<115)%-*@5Dso-U3d9M_Xg>Z?P$CpIp8XwU4-%pkj#MRoCtCt4t#p00i_ I>zopr048xPZ2$lO literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-left-sel.png b/game/engines/default/data/gfx/ui/textbox-left-sel.png new file mode 100644 index 0000000000000000000000000000000000000000..6084377ca688ef4773c017077cf59839f2686741 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTm!3HFa)Xf(FDaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W=H@#M9T6{T3Iah?uro*;+B6kZfj1M2T~LZf<H`36RUc;9QiNSdyBe zP@Y+mq2TW68<3)x$__M~)6>N<MB;MnL_;s<KmphD#{Rt-PnnKzFh+BCrfyRZo5Y*K zeACUV+VO(h20zVROo7_jsuDUmPyRocoBc8AiS^SnPwyEUce;MHo5y}Y;Dvg_y*Gt9 z5{wUAtmfG9G-x;c`Z{;*N!gp11QPz4EiNwe+`Z~#*cZi(mOGcnUS&wpX1GyV_4BNX zb(72HO{xW(=T77h+QvQ6cN-6%Qj+C~X$As<3Ca4Gq|g5MVz!v&mArv_d9G3m@3EA6 zZU)!D#*?QTTFuKE_2(ViaiIOwyG;iY5{_~?9W2=&&7l;rv820c{bJ@-TSJ#D*jig< zv%U7xt%&EFcOT!g>a?b{x%lH2_X!OD@0Nf6RWl)|@*_V-$C0;B@4a3H3N24pKbLh* G2~7YX?w%C@ literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-left.png b/game/engines/default/data/gfx/ui/textbox-left.png new file mode 100644 index 0000000000000000000000000000000000000000..89fe2cdfdc2fdf4338e4172eebeb9d3bed7c0aec GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTm!3HFa)Xf(FDaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W=H@#M9T6{T3Ia2%C`cMst6lkZfj1M2T~LZf<H`36RUc;9QiNSdyBe zP@Y+mq2TW68<3)x$_^A??CIhdB5`?Y-(JB(20U)_Q=Y%E=69Sb8==U0W>TO;qh!V= z?&(Zy8=aG%KA)ttV&c1(FE_VF#a@qXkbAMTN&174<EoF00ijMDKdPEmO$u^y320Vi zabaQDI%ipCPRxT{d<(ZH&RVwf{Dvt;`eh&HRL=N$-&uM_vE9tf`a5&h=d#K%+^hD| zd@@J;#T?~h9jg`{HmGUbeN$6a=72@t`)#@NO@IAjo*5Zuk|QeM4DyGktDnm{r-UW| D>riam literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-middle-sel.png b/game/engines/default/data/gfx/ui/textbox-middle-sel.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc5a1b979d850afb785c6e41ce24a2c76cb6ba2 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7s5-1LGcVbv~PUa<$!&%@FS<Jw| zEeyhp4727)00r4gJbhi+Z*eh-h?yIee~bhQ$!3N`lsM<-=BDPA0J#hd&PAz-C8;S2 z<(VZJ3hti10V#T^>_BmMPZ!4!j_a*w3<Vnk7!F^E3vA*NJCexCyyGB)wME9M1Ak{e z<&|9Y)b4fDvaeNU-k020`Y5-bYVc7CPC1le?~=x2B42%Xfq0y)!-lq}zZZb)@^tlc JS?83{1OT_gLV*AP literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-middle.png b/game/engines/default/data/gfx/ui/textbox-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..1df1da27dcbc40aa76acb816e68d676a8640b534 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7s5-1LGcVbv~PUa<$!&%@FS<Jw| zEeyhp4727)00r4gJbhi+Z*eh-u<DtAmf!{o$!3N`lsM<-=BDPA0J#hd&PAz-C8;S2 z<(VZJ3hti10V#T^>_Bk~PZ!4!j_avC2RRuGc@DR*pRm?W{a-ofOR&ez-yF>?D_03N tC^4Po*;E@|zCR-Ice?oe>Al9nj4~%>tvOfznUDiA+|$+1Wt~$(698?rIlTY? literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-right-sel.png b/game/engines/default/data/gfx/ui/textbox-right-sel.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb754d41584d646ef17c7f5a0f950eb8cc0799f GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTm!3HFa)Xf(FDaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W=H@#M9T6{T3Iah&abwuD7Z{A=%83h!W@g+}zZ>5+Ij>!MP|ku_QG` zp**uBL&4qCHy}kXl^tlfnx~6nh{WaC3H$Y$3ng0T-@h)uR;#nbU<ZTX$|C{G)RfFR z9evn3cW)?UyyKwn5Waiq><-tCBiFbEgtaE^doHnWJ=^QapP$$I->R!OG+_Dl{q0vq zheXcyGM(7`y|(d8OWysQS<hFta=p%Eh6g*gUCfES@?P%ei#0)8o*m2*=bLPAubG$U z==3m8k$qBRP1RAs2*dfxJ%(F9ns+fcPh(;}dBDZOaT<@r%?Ku+Y0T0a3OSNDIjJ@n z37^<>@Q|MclShhcWJ{~F=#*1FF<QZ_%V)MIR<1H(2x|C$b0!C~<*Me5g<oU!bOnle zWt2XKPx<j~&BYFf4^wrGGtE49+lr_?Y`1xrH|bl|86DjQrrCA#Y;PS8NuII#;=_{) k*-9RAYA^cx{MZ@xr%$@8Ge2(eHc(J{y85}Sb4q9e0I}Dk7ytkO literal 0 HcmV?d00001 diff --git a/game/engines/default/data/gfx/ui/textbox-right.png b/game/engines/default/data/gfx/ui/textbox-right.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8464028bfa4c3e9cdc11615de58c114e44b55f GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTm!3HFa)Xf(FDaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W=H@#M9T6{T3Ia2pf|go4PhoNH#MhqQp5rH#aq}1juDza4t$sEJ;mK zD9<d(P;mG34M@>TWe19H_H=O!k+{5e;zr&>1_G|}JxeuYJsl@%^|lwPNHk~~c`Zv| z<XZ1EktxcGZHF<dp^?CfAD2#E+Fk#B>E~0`@^g!`pWn%xwM@F<;X+1>>i63jT<?Dm z4AtyPdUtuIgfhcRRyJj&6<SJ@9^5-7;c1$kY<xU8EcAYPT_d;kMx{?ob=Km|cE|oR z>}N~;eq@E#DzC_Cow2@B>t9<PY+k#nYguN|^Nicu&Ni1Tws`+KEBL~R!@a@!`+;u$ TjaQe5fc)j@>gTe~DWM4fmq&5Y literal 0 HcmV?d00001 diff --git a/game/engines/default/engine/ui/Base.lua b/game/engines/default/engine/ui/Base.lua index 584ee68258..6c6f9a58fb 100644 --- a/game/engines/default/engine/ui/Base.lua +++ b/game/engines/default/engine/ui/Base.lua @@ -30,6 +30,9 @@ local cache = {} -- Default font _M.font = core.display.newFont("/data/font/Vera.ttf", 12) _M.font_h = _M.font:lineSkip() +_M.font_mono = core.display.newFont("/data/font/VeraMono.ttf", 12) +_M.font_mono_w = _M.font_mono:size(" ") +_M.font_mono_h = _M.font_mono:lineSkip() function _M:init(t, no_gen) self.mouse = Mouse.new() diff --git a/game/engines/default/engine/ui/Dialog.lua b/game/engines/default/engine/ui/Dialog.lua index 9372ffe8e5..5682f154f7 100644 --- a/game/engines/default/engine/ui/Dialog.lua +++ b/game/engines/default/engine/ui/Dialog.lua @@ -88,7 +88,7 @@ function _M:generate() self.mouse:registerZone(0, 0, gamew, gameh, function() self.key:triggerVirtual("EXIT") end) self.mouse:registerZone(self.display_x, self.display_y, self.w, self.h, function(...) self:mouseEvent(...) end) self.key.receiveKey = function(_, ...) self:keyEvent(...) end - self.key:addCommand("__TAB", function(...) self.key:triggerVirtual("MOVE_DOWN") end) + self.key:addCommand("_TAB", function(...) self.key:triggerVirtual("MOVE_DOWN") end) self.key:addBinds{ MOVE_UP = function() self:setFocus(util.boundWrap(self.focus_ui_id - 1, 1, #self.uis)) end, MOVE_DOWN = function() self:setFocus(util.boundWrap(self.focus_ui_id + 1, 1, #self.uis)) end, diff --git a/game/engines/default/engine/ui/List.lua b/game/engines/default/engine/ui/List.lua index 5351bb3197..7358d286df 100644 --- a/game/engines/default/engine/ui/List.lua +++ b/game/engines/default/engine/ui/List.lua @@ -78,7 +78,7 @@ function _M:generate() -- Add UI controls self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event) - self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) + if button ~= "wheelup" and button ~= "wheeldown" then self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) end if button == "left" and event == "button" then self:onUse() elseif button == "wheelup" and event == "button" then self.key:triggerVirtual("MOVE_UP") elseif button == "wheeldown" and event == "button" then self.key:triggerVirtual("MOVE_DOWN") diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua index 055cc2b913..335c3e216d 100644 --- a/game/engines/default/engine/ui/ListColumns.lua +++ b/game/engines/default/engine/ui/ListColumns.lua @@ -29,8 +29,15 @@ function _M:init(t) self.columns = assert(t.columns, "no list columns") self.w = assert(t.width, "no list width") self.h = assert(t.height, "no list height") + self.sortable = t.sortable + self.scrollbar = t.scrollbar self.fct = t.fct - self.display_prop = t.display_prop or "name" + + local w = self.w + if self.scrollbar then w = w - 10 end + for j, col in ipairs(self.columns) do + col.width = w * col.width / 100 + end Base.init(self, t) end @@ -39,6 +46,7 @@ function _M:generate() self.sel = 1 self.scroll = 1 self.max = #self.list + self:selectColumn(1, true) local ls, ls_w, ls_h = self:getImage("ui/selection-left-sel.png") local ms, ms_w, ms_h = self:getImage("ui/selection-middle-sel.png") @@ -54,17 +62,35 @@ function _M:generate() local cm, cm_w, cm_h = self:getImage("ui/selection-middle-column.png") local cr, cr_w, cr_h = self:getImage("ui/selection-right-column.png") - local fw, fh = self.w, ls_h - self.fw, self.fh = fw, fh + + local fh = ls_h + self.fh = fh self.max_display = math.floor(self.h / fh) - 1 + -- Draw the scrollbar + if self.scrollbar then + local sb, sb_w, sb_h = self:getImage("ui/scrollbar.png") + local ssb, ssb_w, ssb_h = self:getImage("ui/scrollbar-sel.png") + + self.scrollbar = { bar = {}, sel = {} } + self.scrollbar.sel.w, self.scrollbar.sel.h, self.scrollbar.sel.tex, self.scrollbar.sel.texw, self.scrollbar.sel.texh = ssb_w, ssb_h, ssb:glTexture() + local s = core.display.newSurface(sb_w, self.h - fh) + s:erase(200,0,0) + for i = 0, self.h - fh do s:merge(sb, 0, i) end + self.scrollbar.bar.w, self.scrollbar.bar.h, self.scrollbar.bar.tex, self.scrollbar.bar.texw, self.scrollbar.bar.texh = ssb_w, self.h - fh, s:glTexture() + end + -- Draw the list columns - for i, col in ipairs(self.columns) do + local colx = 0 + for j, col in ipairs(self.columns) do + local fw = col.width + col.fw = fw local text = col.name local ss = core.display.newSurface(fw, fh) local s = core.display.newSurface(fw, fh) + self.font:setStyle("bold") ss:merge(cls, 0, 0) for i = cls_w, fw - crs_w do ss:merge(cms, i, 0) end ss:merge(crs, fw - crs_w, 0) @@ -74,49 +100,76 @@ function _M:generate() for i = cl_w, fw - cr_w do s:merge(cm, i, 0) end s:merge(cr, fw - cr_w, 0) s:drawColorStringBlended(self.font, text, cl_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - cl_w - cr_w) + self.font:setStyle("normal") col._tex, col._tex_w, col._tex_h = s:glTexture() col._stex = ss:glTexture() - end - -- Draw the list items - for i, item in ipairs(self.list) do - local text = item[self.display_prop] - local ss = core.display.newSurface(fw, fh) - local sus = core.display.newSurface(fw, fh) - local s = core.display.newSurface(fw, fh) - - ss:merge(ls, 0, 0) - for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end - ss:merge(rs, fw - rs_w, 0) - ss:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) - - s:erase(0, 0, 0) - s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) - - sus:merge(l, 0, 0) - for i = l_w, fw - r_w do sus:merge(m, i, 0) end - sus:merge(r, fw - r_w, 0) - sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + -- Draw the list items + for i, item in ipairs(self.list) do + local text = tostring(item[col.display_prop or col.sort]) + local ss = core.display.newSurface(fw, fh) + local sus = core.display.newSurface(fw, fh) + local s = core.display.newSurface(fw, fh) + + ss:merge(ls, 0, 0) + for i = ls_w, fw - rs_w do ss:merge(ms, i, 0) end + ss:merge(rs, fw - rs_w, 0) + ss:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + + s:erase(0, 0, 0) + s:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + + sus:merge(l, 0, 0) + for i = l_w, fw - r_w do sus:merge(m, i, 0) end + sus:merge(r, fw - r_w, 0) + sus:drawColorStringBlended(self.font, text, ls_w, (fh - self.font_h) / 2, 255, 255, 255, nil, fw - ls_w - rs_w) + + item._tex = item._tex or {} + item._stex = item._stex or {} + item._sustex = item._sustex or {} + item._tex[j] = {s:glTexture()} + item._stex[j] = {ss:glTexture()} + item._sustex[j] = {sus:glTexture()} + end - item._tex, item._tex_w, item._tex_h = s:glTexture() - item._stex = ss:glTexture() - item._sustex = sus:glTexture() + self.mouse:registerZone(colx, 0, col.width, self.fh, function(button, x, y, xrel, yrel, bx, by, event) + if button == "left" and event == "button" then self:selectColumn(j) end + end) + colx = colx + col.width end -- Add UI controls - self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event) + self.mouse:registerZone(0, self.fh, self.w, self.h - self.fh, function(button, x, y, xrel, yrel, bx, by, event) + if button == "wheelup" and event == "button" then self.scroll = util.bound(self.scroll - 1, 1, self.max - self.max_display + 1) + elseif button == "wheeldown" and event == "button" then self.scroll = util.bound(self.scroll + 1, 1, self.max - self.max_display + 1) end + self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) - if button == "left" and event == "button" then self:onUse() - elseif button == "wheelup" and event == "button" then self.key:triggerVirtual("MOVE_UP") - elseif button == "wheeldown" and event == "button" then self.key:triggerVirtual("MOVE_DOWN") - end + if button == "left" and event == "button" then self:onUse() end end) self.key:addBinds{ ACCEPT = function() self:onUse() end, MOVE_UP = function() self.sel = util.boundWrap(self.sel - 1, 1, self.max) self.scroll = util.scroll(self.sel, self.scroll, self.max_display) end, MOVE_DOWN = function() self.sel = util.boundWrap(self.sel + 1, 1, self.max) self.scroll = util.scroll(self.sel, self.scroll, self.max_display) end, } + self.key:addCommands{ + _HOME = function() + self.sel = 1 + self.scroll = util.scroll(self.sel, self.scroll, self.max_display) + end, + _END = function() + self.sel = self.max + self.scroll = util.scroll(self.sel, self.scroll, self.max_display) + end, + _PAGEUP = function() + self.sel = util.bound(self.sel - self.max_display, 1, self.max) + self.scroll = util.scroll(self.sel, self.scroll, self.max_display) + end, + _PAGEDOWN = function() + self.sel = util.bound(self.sel + self.max_display, 1, self.max) + self.scroll = util.scroll(self.sel, self.scroll, self.max_display) + end, + } end function _M:onUse() @@ -126,27 +179,58 @@ function _M:onUse() else self.fct(item) end end -function _M:selectColumn(i) +function _M:selectColumn(i, force) + if not self.sortable and not force then return end local col = self.columns[i] - self.cur_col = i + if not col then return end + + if self.cur_col ~= i then + self.cur_col = i + self.sort_reverse = false + else + self.sort_reverse = not self.sort_reverse + end + + local fct = col.sort + if type(fct) == "string" then fct = function(a, b) return a[col.sort] < b[col.sort] end end + if self.sort_reverse then local old=fct fct = function(a, b) return old(b, a) end end + table.sort(self.list, fct) end function _M:display(x, y) + local bx, by = x, y + for j = 1, #self.columns do - local y = y + local col = self.columns[j] + if self.cur_col == j then + col._stex:toScreenFull(x, y, col.fw, self.fh, col._tex_w, col._tex_h) + else + col._tex:toScreenFull(x, y, col.fw, self.fh, col._tex_w, col._tex_h) + end + + local y = y + self.fh local max = math.min(self.scroll + self.max_display - 1, self.max) for i = self.scroll, max do local item = self.list[i] if self.sel == i then if self.focused then - item._stex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + item._stex[j][1]:toScreenFull(x, y, col.fw, self.fh, item._stex[j][2], item._stex[j][3]) else - item._sustex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + item._sustex[j][1]:toScreenFull(x, y, col.fw, self.fh, item._sustex[j][2], item._sustex[j][3]) end else - item._tex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + item._tex[j][1]:toScreenFull(x, y, col.fw, self.fh, item._tex[j][2], item._tex[j][3]) end y = y + self.fh end + + x = x + col.width + end + + if self.focused and self.scrollbar then + local pos = self.sel * (self.h - self.fh) / self.max + + self.scrollbar.bar.tex:toScreenFull(bx + self.w - self.scrollbar.bar.w, by + self.fh, self.scrollbar.bar.w, self.scrollbar.bar.h, self.scrollbar.bar.texw, self.scrollbar.bar.texh) + self.scrollbar.sel.tex:toScreenFull(bx + self.w - self.scrollbar.sel.w, by + self.fh + pos, self.scrollbar.sel.w, self.scrollbar.sel.h, self.scrollbar.sel.texw, self.scrollbar.sel.texh) end end diff --git a/game/engines/default/engine/ui/Textbox.lua b/game/engines/default/engine/ui/Textbox.lua new file mode 100644 index 0000000000..b7652d29e8 --- /dev/null +++ b/game/engines/default/engine/ui/Textbox.lua @@ -0,0 +1,156 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Base = require "engine.ui.Base" +local Focusable = require "engine.ui.Focusable" + +--- A generic UI textbox +module(..., package.seeall, class.inherit(Base, Focusable)) + +function _M:init(t) + self.title = assert(t.title, "no textbox title") + self.text = t.text or "" + self.hide = t.hide + self.max_len = t.max_len or 999 + self.fct = assert(t.fct, "no textbox fct") + self.chars = assert(t.chars, "no textbox chars") + + self.tmp = {} + for i = 1, #self.text do self.tmp[#self.tmp+1] = self.text:sub(i, i) end + self.cursor = #self.tmp + 1 + self.scroll = 1 + + Base.init(self, t) +end + +function _M:generate() + local ls, ls_w, ls_h = self:getImage("ui/textbox-left-sel.png") + local ms, ms_w, ms_h = self:getImage("ui/textbox-middle-sel.png") + local rs, rs_w, rs_h = self:getImage("ui/textbox-right-sel.png") + local l, l_w, l_h = self:getImage("ui/textbox-left.png") + local m, m_w, m_h = self:getImage("ui/textbox-middle.png") + local r, r_w, r_h = self:getImage("ui/textbox-right.png") + local c, c_w, c_h = self:getImage("ui/textbox-cursor.png") + + self.h = r_h + + -- Draw UI + local title_w = self.font:size(self.title:removeColorCodes()) + self.w = title_w + self.chars * self.font_mono_w + ls_w + rs_w + print("titl", self.title, title_w, self.w) + local w, h = self.w, r_h + local fw, fh = w - title_w - ls_w - rs_w, self.font_h + self.fw, self.fh = fw, fh + self.text_x = ls_w + title_w + self.text_y = (h - fh) / 2 + self.max_display = math.floor(fw / self.font_mono_w) + local ss = core.display.newSurface(w, h) + local s = core.display.newSurface(w, h) + self.text_surf = core.display.newSurface(fw, fh) + self.text_tex, self.text_tex_w, self.text_tex_h = s:glTexture() + self:updateText() + + ss:merge(ls, title_w, 0) + for i = title_w + ls_w, w - rs_w do ss:merge(ms, i, 0) end + ss:merge(rs, w - rs_w, 0) + ss:drawColorStringBlended(self.font, self.title, 0, (h - fh) / 2, 255, 255, 255, true) + + s:merge(l, title_w, 0) + for i = title_w + l_w, w - r_w do s:merge(m, i, 0) end + s:merge(r, w - r_w, 0) + s:drawColorStringBlended(self.font, self.title, 0, (h - fh) / 2, 255, 255, 255, true) + + local cursor = core.display.newSurface(c_w, fh) + for i = 0, fh - 1 do cursor:merge(c, 0, i) end + self.cursor_tex, self.cursor_tex_w, self.cursor_tex_h = cursor:glTexture() + self.cursor_w, self.cursor_h = c_w, fh + + -- Add UI controls + self.mouse:registerZone(title_w + ls_w, 0, fw, h, function(button, x, y, xrel, yrel, bx, by, event) + if event == "button" then + self.cursor = util.bound(math.floor(bx / self.font_mono_w) + self.scroll, 1, #self.tmp+1) + self:updateText() + end + end) + self.key:addBind("ACCEPT", function() self.fct(self.text) end) + self.key:addBind("MOVE_LEFT", function() self.cursor = util.bound(self.cursor - 1, 1, #self.tmp+1) self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) self:updateText() end) + self.key:addBind("MOVE_RIGHT", function() self.cursor = util.bound(self.cursor + 1, 1, #self.tmp+1) self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) self:updateText() end) + self.key:addCommands{ + _DELETE = function() + if self.cursor <= #self.tmp then + table.remove(self.tmp, self.cursor) + self:updateText() + end + end, + _BACKSPACE = function() + if self.cursor > 1 then + table.remove(self.tmp, self.cursor - 1) + self.cursor = self.cursor - 1 + self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) + self:updateText() + end + end, + _HOME = function() + self.cursor = 1 + self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) + self:updateText() + end, + _END = function() + self.cursor = #self.tmp + 1 + self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) + self:updateText() + end, + __TEXTINPUT = function(c) + if #self.tmp < self.max_len then + table.insert(self.tmp, self.cursor, c) + self.cursor = self.cursor + 1 + self.scroll = util.scroll(self.cursor, self.scroll, self.max_display) + self:updateText() + end + end, + } + + self.tex, self.tex_w, self.tex_h = s:glTexture() + self.stex = ss:glTexture() +end + +function _M:updateText() + self.text = table.concat(self.tmp) + local text = "" + for i = self.scroll, self.scroll + self.max_display - 1 do + if not self.tmp[i] then break end + if not self.hide then text = text .. self.tmp[i] + else text = text .. "*" end + end + + self.text_surf:erase(0, 0, 0, 0) + self.text_surf:drawStringBlended(self.font_mono, text, 0, 0, 255, 255, 255, true) + self.text_surf:updateTexture(self.text_tex) +end + +function _M:display(x, y) + if self.focused then + self.stex:toScreenFull(x, y, self.w, self.h, self.tex_w, self.tex_h) + else + self.tex:toScreenFull(x, y, self.w, self.h, self.tex_w, self.tex_h) + end + self.text_tex:toScreenFull(x + self.text_x, y + self.text_y, self.fw, self.fh, self.text_tex_w, self.text_tex_h) + self.cursor_tex:toScreenFull(x + self.text_x + (self.cursor-self.scroll) * self.font_mono_w, y + self.text_y, self.cursor_w, self.cursor_h, self.cursor_tex_w, self.cursor_tex_h) +end diff --git a/game/engines/default/engine/ui/Textzone.lua b/game/engines/default/engine/ui/Textzone.lua new file mode 100644 index 0000000000..74699b58ad --- /dev/null +++ b/game/engines/default/engine/ui/Textzone.lua @@ -0,0 +1,99 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Base = require "engine.ui.Base" +local Focusable = require "engine.ui.Focusable" + +--- A generic UI list +module(..., package.seeall, class.inherit(Base, Focusable)) + +function _M:init(t) + self.text = assert(t.text, "no textzone text") + self.w = assert(t.width, "no list width") + self.h = assert(t.height, "no list height") + self.scrollbar = t.scrollbar + + Base.init(self, t) +end + +function _M:generate() + local list = self.text:splitLines(self.w - 10, self.font) + self.scroll = 1 + self.max = #list + self.max_display = math.floor(self.h / self.font_h) + self.can_focus = self.scrollbar and (self.max_display < self.max) + + local fw, fh = self.w, self.font_h + self.fw, self.fh = fw, fh + + -- Draw the list items + self.list = {} + local r, g, b = 255, 255, 255 + for i, l in ipairs(list) do + local s = core.display.newSurface(fw, fh) + r, g, b = s:drawColorStringBlended(self.font, l, 0, 0, r, g, b, true) + + local item = {} + item._tex, item._tex_w, item._tex_h = s:glTexture() + self.list[#self.list+1] = item + end + + -- Draw the scrollbar + if self.scrollbar then + local sb, sb_w, sb_h = self:getImage("ui/scrollbar.png") + local ssb, ssb_w, ssb_h = self:getImage("ui/scrollbar-sel.png") + + self.scrollbar = { bar = {}, sel = {} } + self.scrollbar.sel.w, self.scrollbar.sel.h, self.scrollbar.sel.tex, self.scrollbar.sel.texw, self.scrollbar.sel.texh = ssb_w, ssb_h, ssb:glTexture() + local s = core.display.newSurface(sb_w, self.h - fh) + s:erase(200,0,0) + for i = 0, self.h - fh do s:merge(sb, 0, i) end + self.scrollbar.bar.w, self.scrollbar.bar.h, self.scrollbar.bar.tex, self.scrollbar.bar.texw, self.scrollbar.bar.texh = ssb_w, self.h - fh, s:glTexture() + end + + -- Add UI controls + self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event) + if button == "wheelup" and event == "button" then self.key:triggerVirtual("MOVE_UP") + elseif button == "wheeldown" and event == "button" then self.key:triggerVirtual("MOVE_DOWN") + end + end) + self.key:addBinds{ + MOVE_UP = function() self.scroll = util.bound(self.scroll - 1, 1, self.max - self.max_display + 1) end, + MOVE_DOWN = function() self.scroll = util.bound(self.scroll + 1, 1, self.max - self.max_display + 1) end, + } +end + + +function _M:display(x, y) + local bx, by = x, y + local max = math.min(self.scroll + self.max_display - 1, self.max) + for i = self.scroll, max do + local item = self.list[i] + item._tex:toScreenFull(x, y, self.fw, self.fh, item._tex_w, item._tex_h) + y = y + self.fh + end + + if self.focused and self.scrollbar then + local pos = self.scroll * (self.h - self.fh) / (self.max - self.max_display + 1) + + self.scrollbar.bar.tex:toScreenFull(bx + self.w - self.scrollbar.bar.w, by + self.fh, self.scrollbar.bar.w, self.scrollbar.bar.h, self.scrollbar.bar.texw, self.scrollbar.bar.texh) + self.scrollbar.sel.tex:toScreenFull(bx + self.w - self.scrollbar.sel.w, by + self.fh + pos, self.scrollbar.sel.w, self.scrollbar.sel.h, self.scrollbar.sel.texw, self.scrollbar.sel.texh) + end +end diff --git a/game/engines/default/special/mainmenu/class/TestUI.lua b/game/engines/default/special/mainmenu/class/TestUI.lua index 419c0a2b92..0c7d51c88b 100644 --- a/game/engines/default/special/mainmenu/class/TestUI.lua +++ b/game/engines/default/special/mainmenu/class/TestUI.lua @@ -29,6 +29,8 @@ local DownloadDialog = require "engine.dialogs.DownloadDialog" local ListColumns = require "engine.ui.ListColumns" local Button = require "engine.ui.Button" +local Textzone = require "engine.ui.Textzone" +local Textbox = require "engine.ui.Textbox" local Dialog = require "engine.ui.Dialog" module(..., package.seeall, class.inherit(engine.Game, engine.interface.GameMusic)) @@ -38,34 +40,78 @@ function _M:init() self.refuse_threads = true + local text = Textzone.new{width=390, height=200, scrollbar=true, text=[[Pplopppo +zejkfzejkfh #RED#zmkfhzekhfkjfhkjqerhfgq#LAST# jfh qjzfh qzejfh #BLUE#qjzfh +flkzerjflm qzfj #WHITE#zeklfj qlfjkql ql +zf ze +fze fqefqzfjhjqzkef +fqzef + + +zef qzekjfhqjkzfh + +ze fzef zejkhzfekjh ze +fze + fze + zefze fze zef + + ze fzef zefz e +zlfjklhzqfjkqhzefkhqzefjkqh z + + +zef qzekjfhqjkzfh + +ze fzef zejkhzfekjh ze +fze + fze + zefze fze zef + + ze fzef zefz e +zlfjklhzqfjkqhzefkhqzefjkqh z + + +zef qzekjfhqjkzfh + +ze fzef zejkhzfekjh ze +fze + fze + zefze fze zef + + ze fzef zefz e +zlfjklhzqfjkqhzefkhqzefjkqh z +]]} + local box = Textbox.new{title="Name: ", text="", chars=10, max_len=30, fct=function(text) print("got", text) end} local b1 = Button.new{text="Ok", fct=function() print"OK" end} local b2 = Button.new{text="Cancel", fct=function() print"KO" end} - local list = ListColumns.new{width=200, height=200, columns={ - {name="Name", width=150}, {name="Encumber", width=50}, + local list = ListColumns.new{width=390, height=200, sortable=true, scrollbar=true, columns={ + {name="Name", width=90, display_prop="name", sort="name"}, + {name="Encumber", width=10, display_prop="encumberance", sort="encumberance"}, }, list={ - {name="toto", encumberance="20"}, - {name="tutu", encumberance="50"}, - {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance="20"}, - {name="MOUHAHAHAHAH!", encumberance="20"}, - {name="toto", encumberance="20"}, - {name="tutu", encumberance="50"}, - {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance="20"}, - {name="MOUHAHAHAHAH!", encumberance="20"}, - {name="toto", encumberance="20"}, - {name="tutu", encumberance="50"}, - {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance="20"}, - {name="MOUHAHAHAHAH!", encumberance="20"}, - {name="toto", encumberance="20"}, - {name="tutu", encumberance="50"}, - {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance="20"}, - {name="MOUHAHAHAHAH!", encumberance="20"}, + {name="toto", encumberance=20}, + {name="tutu", encumberance=50}, + {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance=20}, + {name="MOUHAHAHAHAH!", encumberance=20}, + {name="toto", encumberance=20}, + {name="tutu", encumberance=50}, + {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance=20}, + {name="MOUHAHAHAHAH!", encumberance=20}, + {name="toto", encumberance=20}, + {name="tutu", encumberance=50}, + {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance=20}, + {name="MOUHAHAHAHAH!", encumberance=20}, + {name="toto", encumberance=20}, + {name="tutu", encumberance=50}, + {name="plopzor #GOLD#Robe of the Archmage#WHITE#!", encumberance=20}, + {name="MOUHAHAHAHAH!", encumberance=20}, }, fct=function(item) print(item.name) end} - local d = Dialog.new("Test UI", 400, 300) + local d = Dialog.new("Test UI", 800, 300) d:loadUI{ {left=0, top=0, ui=list}, - {left=10, bottom=10, ui=b1}, - {right=10, bottom=10, ui=b2}, + {left=400, top=0, ui=text}, + {left=5, bottom=10 + b1.h, ui=box}, + {left=5, bottom=5, ui=b1}, + {right=5, bottom=5, ui=b2}, } self:registerDialog(d) end -- GitLab