From 9ec40f016d1f79b6eb46f14f4086cd7fcb74ca88 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Sun, 15 Jan 2012 13:13:22 -0200 Subject: [PATCH] implement API to save lists in configs file and terminal history --- TODO | 11 ++- modules/addon_terminal/terminal.lua | 7 ++ modules/client_topmenu/topmenu.lua | 11 +++ modules/client_topmenu/topmenu.otui | 42 +++++++++-- modules/core_lib/settings.lua | 10 +++ modules/core_styles/icons/skills.png | Bin 391 -> 646 bytes modules/core_styles/icons/viplist.png | Bin 0 -> 928 bytes modules/core_styles/images/mini_window.png | Bin 40117 -> 40112 bytes modules/core_styles/images/top_button.png | Bin 1190 -> 470 bytes modules/core_styles/images/top_button2.png | Bin 0 -> 426 bytes modules/core_widgets/uicombobox.lua | 18 ++--- modules/core_widgets/uimessagebox.lua | 23 ++++++ modules/core_widgets/uiprogressbar.lua | 25 ++++--- modules/game/game.otmod | 4 +- modules/game_skills/skills.lua | 3 +- modules/game_viplist/viplist.lua | 18 ++--- src/framework/core/configmanager.cpp | 77 ++++++++++++++++++--- src/framework/core/configmanager.h | 14 ++-- src/framework/luafunctions.cpp | 2 + src/framework/luascript/luavaluecasts.h | 19 +++++ 20 files changed, 227 insertions(+), 57 deletions(-) create mode 100644 modules/core_styles/icons/viplist.png create mode 100644 modules/core_styles/images/top_button2.png create mode 100644 modules/core_widgets/uimessagebox.lua diff --git a/TODO b/TODO index 88d525e8..d99b7181 100644 --- a/TODO +++ b/TODO @@ -2,14 +2,13 @@ High priority TODO in order (before first public disclose) [bart] tab widgets -[bart] multiline rich text widget [bart] chat with tabs [bart] scrollbar [bart] scrollable widgets [bart] complete miniwindow (close, minimize, resize) [bart] move windows [bart] add top menu buttons -[bart] console history, scrolling +[bart] console scrolling [bart] modules managment interface [bart] adjust interface design @@ -34,7 +33,6 @@ Low priority TODO [bart] load modules from zip packages [bart] create a class for reading binary files [bart] rework lua/c++ logger -[bart] save lists on config manager [bart] make protocol class compatible with old tibia protocols == Graphics @@ -42,20 +40,19 @@ Low priority TODO [bart] cache renders into framebuffers [bart] use hardware buffer [bart] use indices -[bart] change mouse icon == Lua [bart] make possible to bind non LuaObject derived classes on lua engine (for usage with Point,Rect,Color,Size) -[bart] bind every global lua function in static classes [bart] review usage of x,y/width,height in lua instead of point/size == Platform [bart] port to MacOs and iphone +[bart] KeyDown, KeyText events change win32 mouse cursor icon == UI [bart] fix massive hotkeys when holding down a key -[bart] horizontal box layout +[bart] multiline rich text widget [bart] move layout proprieties to widget style [bart] multiline text editor widget [bart] create UIMessageBox, UIToolTip and UIInputBox @@ -66,7 +63,7 @@ change win32 mouse cursor icon [bart] reapply anchor styles when adding new childs [bart] ui text selection [bart] make set of background/icon/image width alone work -[bart] check for recursive anchors to print a error and avoid crashes +[bart] check for recursive anchors and print a error instead of crashing == Client modules [bart] make possible to reload modules diff --git a/modules/addon_terminal/terminal.lua b/modules/addon_terminal/terminal.lua index 43896b17..4d661b95 100644 --- a/modules/addon_terminal/terminal.lua +++ b/modules/addon_terminal/terminal.lua @@ -6,6 +6,7 @@ local LogColors = { [LogInfo] = 'white', [LogError] = 'red' } local MaxLogLines = 80 local LabelHeight = 16 +local MaxHistory = 1000 -- private variables local terminalWidget @@ -109,6 +110,8 @@ function Terminal.init() terminalButton = TopMenu.addButton('terminalButton', 'Terminal (Ctrl + T)', '/core_styles/icons/terminal.png', Terminal.toggle) Hotkeys.bind('Ctrl+T', Terminal.toggle) + commandHistory = Settings.getList('terminal-history') + commandLineEdit = terminalWidget:getChildById('commandLineEdit') Hotkeys.bind('Up', function() navigateCommand(1) end, commandLineEdit) Hotkeys.bind('Down', function() navigateCommand(-1) end, commandLineEdit) @@ -122,6 +125,7 @@ function Terminal.init() end function Terminal.terminate() + Settings.setList('terminal-history', commandHistory) Hotkeys.unbind('Ctrl+T') Logger.setOnLog(nil) terminalButton:destroy() @@ -186,6 +190,9 @@ function Terminal.executeCommand(command) -- add new command to history table.insert(commandHistory, command) + if #commandHistory > MaxHistory then + table.remove(commandHistory, 1) + end -- add command line Terminal.addLine(">> " .. command, "#ffffff") diff --git a/modules/client_topmenu/topmenu.lua b/modules/client_topmenu/topmenu.lua index d1c5de34..72406cbe 100644 --- a/modules/client_topmenu/topmenu.lua +++ b/modules/client_topmenu/topmenu.lua @@ -4,6 +4,7 @@ TopMenu = {} local topMenu local leftButtonsPanel local rightButtonsPanel +local gameButtonsPanel -- private functions local function onLogout() @@ -19,6 +20,7 @@ function TopMenu.init() topMenu = displayUI('topmenu.otui') leftButtonsPanel = topMenu:getChildById('leftButtonsPanel') rightButtonsPanel = topMenu:getChildById('rightButtonsPanel') + gameButtonsPanel = topMenu:getChildById('gameButtonsPanel') TopMenu.addRightButton('logoutButton', 'Logout (Ctrl+Q)', '/core_styles/icons/logout.png', onLogout) Hotkeys.bind('Ctrl+Q', onLogout) @@ -51,6 +53,15 @@ function TopMenu.addButton(id, description, icon, callback, right) return button end +function TopMenu.addGameButton(id, description, icon, callback) + local button = createWidget('GameTopButton', gameButtonsPanel) + button:setId(id) + button:setTooltip(description) + button:setIcon(resolvepath(icon, 2)) + button.onClick = callback + return button +end + function TopMenu.addLeftButton(id, description, icon, callback) return TopMenu.addButton(id, description, icon, callback, false) end diff --git a/modules/client_topmenu/topmenu.otui b/modules/client_topmenu/topmenu.otui index 6a9b82b3..fdd5cebe 100644 --- a/modules/client_topmenu/topmenu.otui +++ b/modules/client_topmenu/topmenu.otui @@ -1,22 +1,45 @@ TopButton < UIButton size: 26 26 - image-color: white image-source: /core_styles/images/top_button.png image-clip: 0 0 26 26 image-border: 3 + image-color: #ffffffff + icon-color: #ffffffff $hover: - image-source: /core_styles/images/top_button.png + image-color: #ffffff99 image-clip: 26 0 26 26 - image-border: 3 $pressed: - image-source: /core_styles/images/top_button.png image-clip: 52 0 26 26 - image-border: 3 $disabled: - image-color: #ffffff66 + image-color: #ffffff44 + icon-color: #ffffff44 + +GameTopButton < UIButton + size: 26 26 + image-source: /core_styles/images/top_button2.png + image-clip: 26 0 26 26 + image-color: #ffffff22 + icon-color: #ffffffff + image-border: 3 + + $hover: + image-clip: 0 0 26 26 + image-color: #ffffffff + icon-color: #ffffffff + + $first: + anchors.top: parent.top + anchors.left: parent.left + margin-top: 4 + margin-left: 6 + + $!first: + anchors.top: prev.top + anchors.left: prev.right + margin-left: 6 TopLeftButton < TopButton $first: @@ -54,6 +77,13 @@ TopPanel anchors.top: parent.top anchors.bottom: parent.bottom anchors.left: parent.left + width: 150 + + Panel + id: gameButtonsPanel + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: prev.right anchors.right: next.left Panel diff --git a/modules/core_lib/settings.lua b/modules/core_lib/settings.lua index 3a951821..cd2a51b2 100644 --- a/modules/core_lib/settings.lua +++ b/modules/core_lib/settings.lua @@ -10,6 +10,8 @@ local function convertSettingValue(value) return sizetostring(value) elseif value.r then return colortostring(value) + else + return value end elseif value == nil then return '' @@ -30,6 +32,10 @@ function Settings.set(key, value) g_configs.set(key, convertSettingValue(value)) end +function Settings.setList(key, list) + g_configs.setList(key, list) +end + function Settings.setDefault(key, value) if Settings.exists(key) then return false end Settings.set(key, value) @@ -43,6 +49,10 @@ function Settings.get(key, default) return g_configs.get(key) end +function Settings.getList(key) + return g_configs.getList(key) +end + function Settings.getString(key, default) return Settings.get(key, default) end diff --git a/modules/core_styles/icons/skills.png b/modules/core_styles/icons/skills.png index 0c46c9b9fce7d2a75aad4c7150a70e3d56f7359c..52deb107b711b43d0c0c803a17d31ec4e7a452b3 100644 GIT binary patch delta 618 zcmV-w0+s!T1BL}5iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyze+KLT z00!&<9(6c100007bV*G`2iyS<0s%1aZJLn)00IU{L_t(I%bk-kYZO5khM(`-J+rsF zx3@_ynka`z2zX$1S_EuTSX)|077+{m0k(oaLO2CUC$aD+*qcTRF{L6xt~ip5n%vHO z7PoszKt%mu7#QZAdEe)o5r9r-e<>Lb_pSoQ-<5PaOCN{By~BE8!~U^=4S;Yk7*G_2 z2N;izxwmz|QcGx^6XK@OiUL}Zkj@EdBy=;+wbc~B1B8`>F~G44cy>oI0TIPaFad91 z7~WvwgwvX^C<=fKU~=?@M{i=5+e+SqEEd|ak~M`^B=pWZlGp)>0onG>e`Mys1NK_v`ORRY!efb9KecQ%5kGM~V7kANtM00AB-{Y-3t z|M0b>M%p*CcZd5!9=-}$e`zauqU6o#+-@o>xzJk%GiWp#h{$zdr*@D{A;R-bfj}xw zT8;W1Iqe`@f89MBA#NylU%-V7(g>2slg>dJ3CWz0L=ZKEo2%0q z`(}P@=6{%#N9M|7bLGUmE6uz!GhaXDK2J{CICJ>mrKfjExx6T>Kwp7{WXe$h6~UE` zFsx+XPo)3%nI2bE@;uK*qfx(R@rSCvyY904c8xXr1zfxxV8Up@0{{R307*qoM6N<$ Ef=!?c@Bjb+ delta 361 zcmZo;ZD&^O4DfU3<&xrJU|`_&^l%9R(h5Kza|<&ta0@ds%$g$s z6lE{*^mS#w!^kJZptjTE))b(SY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-g zkfN8$4ivxV>EamTas2HSLoa4WiK8F$b9&r2^p$Cb*f@G9HuZ+~WC&MRUw$GW=XhR; zqf9J{`{D$rfO?mWKX0y4IQ>p-^|aslY|CbR-)o+)wrJr(wSaBYZ*9s!1Iz$TX_ft@cQ%*8f+NP8=DacAk;Ppe!!$yuh29pET8_muY z_NITS-*rUr-G<1kjC&riXxH!TFVdQ&MBb@ E0Evr&v;Y7A diff --git a/modules/core_styles/icons/viplist.png b/modules/core_styles/icons/viplist.png new file mode 100644 index 0000000000000000000000000000000000000000..2bedcaff80e378ba0815e01585090cc7e4918119 GIT binary patch literal 928 zcmV;R17G}!P)Px#24YJ`L;w{4IRF-pEy%+F000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyS< z1qmrxkgnVS0022@R9JLFZ*6U5Zgc_CX>@2HRA^-&M@dakY4ojx0008pNklFjg%BbXqXV%j z8ZwwiGnqJ(%;P@h&i_9C*G)1_k@~F;hx2`$b3Q(W1IT5`-mvty4yp2_K=F@g^5;`+ z;df(GyvseH93;mQvCGC-W?Xb0K{icn(~|jxxz&+Gcwuac-2V!E@`~~O6X%{kTl69V zArRI!TFoS0FGrnDO^H;+QDk%jSUR{-Y`-Xp=xoK4G;NbG-b2!L2+aZm6TN>R4m^67KxT3xo2ZTS&n?;* zib7oPWCxXIqlzfq!YnM|RhE&cxNc(wsJ4EPnViT1pDLp^Yj%lnb(m^t5x=*a!NL|s zY5;qE9xaig(LNZtx3_xB&F*!m0ic~Y)&J}1VTVvD^T6>3iS;SeL!I{JQ40T57)q-I z$zyoNF=|z*{5W6K*LIJl(}y$Bt*zXA%LUJO0oYtAVg54C@i$)Q_vz2^f7<3r>oY2{ zi+pnsK~l>HRyAZ+w-Qu^kIx_T;GN6Xe)%PzlvjKTaA(A072v{jP zciY&XN|Dr0g4ab9Nun@71|A>I{>9&0HKM?0_U0-w3{bV!<*2}`OUoVP{%GgV+lK&% zLLY!crHBj!-!87Rys?W6JUVJ6h~$5>u!nf|%q7oz?geB7exZPWxQ~ViTLW#C5~4Rn zET(ba+*fz9um@iR;yvT*nX3S8d(EDEL|I1ioqqw(q*|)N`W9dS0000pB=bXBIixp_p?+#ibK^u@X7 zOiy=JR%V2UyScd;{-^)>e_{Oj`t$YY>(7_@`V|rJzyELl?$4e0^Y!QJ&sX{SAO6RG zOY;*TA|n3p|Lgz!b4UJs{rURy6%i5t&42sfJsHI3>p%U6|L1S=;(z(4e;xn)&;R`A zF8}%Z^Yvfg*T4Vw|Gt(Of3L6q_%HvVlPm#|2h~57KVSb@lf(fy0bP^*0W}1EtNz22 zHUi)gt^vZ+gZ_Lju|9|AzNE!Fc+g{V(>)^X&pfTz>pvp~f#|2e06gCR!~SL= ze*rFI`p)w*!S>!)rGh!R%D_+NM(C^rI{;@%U&G=*+St%E{q_4`Bp2C%!EHMF|U93(K6ASaKN<6-&_#~|$K zifB`GT2tOXk2(O8{Bce}VbDw4auANw} ze}_pNkl9)-O~DXOH~a}zdVwu`Uc-XEiUkZUPCEhnSvv_3{P`>1K&K9U<+W=M6k^0v z_F3f>k*S^k;EBIKV{CV3|D>xzX!%~hBJJEgq9<#$>zUn2Jx4F^{?X3*PpLHU;pKPl>qUVfBM&d zvlq^)G=IMSeEs?Q|3QHG@BhuefBkbu{(SxU`mg-!|M++R>s(^|$A9^kckLbq(b-lw z!9E)A%cc+4{Zj?qIuMC+jnwm9z96EP>K~*DYd~s&WlR!j6=YSgG2J^EE_&FathM?* z@%TZoue&yV-WPG--1|Ofy@H>=_v7gL(XhsJHlxP%Jw9S7G&n?}&I4bPe>HjE&$Li} z?rq`Hpst;ab(2Lw>Rt{^53Ah{q@|W-MQ8>^EWnw5-vH6NPh$JD_=Q5%j-L-%sPd^1 z@t0o}78oaZNWEY#7Kv>9XoR^369VLCDmATuCp5&E#e3@aY^zBAt!>Q@6qZ54pFtz^ z;IPBYWFcl2BCe}Gtk2@oe-`9t1el*eF{R?6zDJmsy*IM3s*ry0zBaa-s$6~2wGZLf zMh-d&s$|5535z@M=QbwWf`3*Q(67nqlVaFd%Ak0HbUe>rz*ZMX_xK{FP@O(`Y}b9n z;khmS6*r1~8-RY{8A?+1J&HCmYbHHjtC{96v73dDbQej$dl? zLl098@H%1cx_`M3f7dtMMqQbr!?oMVX`>)MBis2!e?E-sr=O)|>141IkFaTC9q&g3 zo?u4Xe`5qub0Mtn*|VVBDT^mara;6O)9dOeGoB3KeIKzTI>N_&uAVF3uR93HECqgI zR(DEUVw%H1$u?jgds!xY>z*1yQrj?}YbQ)`qkn>l0A@|Fe_eEcO|I51j!JaD1vq9Y z)V&StcF>$b-1Xy*zYV6W&mx6Vmh@-*oX$khrs(#20|Qe=L;)+nL2$gXa5$UN5goNd>PaM8i4h+f6aadN+A51w&>;lFjgE$95mZb=3 zPwINrEa~x+FPaIb?KAU4dmpIgSrAf7{7-sM8=V!j%BOPX=ij0ruh;vwAo@6?7%@Qn z4H8zme=EJVrxzz6E4EqVmj$rLMN0KaWQ@bH z96c@CGW_MCKqRlQ+jysvbPzm)i@keiI)ANT3|9%_4yl8`@r*g3lyA+v{~~E-Zz`9F z?(-(}0SP_bt}g{UOA;8|rSQQS7USkH!8Q%Bf9Dd#W<7(xpgpBN0A&FgJ7iOV%F~7= z+B58wY6Qo0!5J)R_!pY;X?bB9Azfg$ukRcrdcY9Cn;k#t_b_EWr}~x0U$CWME@7}a z9IoSlU^8|c$f31Rbr=cvqjx8p08P2c)R8bAaX3JVjBAr_?(FNZ?tuxeAUJB4CVQmA ze>#$m!nOZWlIp`TxW|sKQWD9$wt>Ah3(|Df1vTEEH{T|du1pOF+Mdf<1XCKwqU^oy zdhNE@)~LvKRw&U{f&^0Wv+et0hCjxGxjE_F&!UzX{EZSr(+)=_;wC!SHR|%@b@ZFk zwU#}=@94c0xt3qw7^%%<^Ur9b6De=U*P z6yg1m29+y1K=oZ6-vTocyJ_^ZxIiEDOIc;>p3O5K#8#MZ=Y+eMJ;a#HN5^m#L!1iy z)=Z*Jcd}+HG2jdjkB8so{nRwS^NsxTtEFbaw7J`kh?N&HwZcA=y_eL8f}*Z6dpXhWyN z0lzKfE5v?Nii;dNb{`ziNJ4J6?Ib+hOv5K5;p=@*qPD^rhMe?ehKIV_^c-hl*6oy? zDkZut1J>lqH@4WxTL)Q482 zS>zFulD%#?h!4+3Rd9PZO5sl_RP;N23eWNsv>1`<|B%!; z(g@T!30&R_pUHkK^>lN7Lnm8p80zpuD^s}babkB|bQS5F8&l^vaz^mEiBC{qc(f@` zmD0Wj6gI_!mEm6veYs!pTk7;qSM80-BetWs}_i%QeCy2;>pK6_Y|9ip+uOoDS{EVDW9a;=;`Ci>B zO#TiB!~}+%Jl%ebp;<%AGrJn`*sGG(CZbuXf4CT*AuuTawYayST-QygBE9FPv zQu3zaEapt~%aQ1>!8As7O9eWrYs4j zWcb~3K*Qmh*T59cU5n_5qeYX>+tbaRu05?s5ravofB&YTjrZx+E~<|F$?FcU$H5Am zCYQ)viOFLWvsQz<7sXz&^*ULlQi@kZmLIEr>t$UwdwV>fs~g}GuxxM8Gh`VF@N33j zR&}h?wJW%7?t=q}kukhV3n+teJSj$CGyH4rM3~f)!)QZBL^q)0oStPchvpj4$R_qe z*av~0NCb>Rzc~M1o3v$i^p6vp>s~yVNIOLNaxL3}1&1Ib^*d^RKYrW!88ft9 zG!h19@B4wj!*OA$5FSXF#L<1A4*_0r0p59~Cpn@1tF)dwB3{ne3eF)&`aL ze}UDx2juh=&PRs5ZY1r=-uwLU=CEX}roqVF#0!?aSsMCo9ki-F!5<#Pt4G&wIV05S z%3ULmU+hk%;pZcp;7H>tm~5i_jGT0k_x&^o(hYeAUQs4x$Ne)fbFE;LNL#sbCR;u> z!bZpdo0)E1GIp1T(AjgNX@BCxCvpj{f35|JuUKbY!rbF7&>cssaoSKD3QCEk>Q~M^ zZR>NX>C~j2RY~gY_0TYY-eaFF)YvknvxEl9E`DU`oOU%9hy*LeQ9^IUB5*}+sakeu zRVHqosmzhcf;l!<+C)Y`w;<2 zl|fL>Cl-d^qcvGhP-Y$i%h|5fa4za$ZK*z>a4!Ku7G7CoX^x}{^QK~7=e%4Nm&%rM z7#R9|^|H*LTQ+36mZIB0dRFT>;0|7tIB4g&ydt>$xfnN|ew2CAmt2`vAS zP{+WZK1G3-7+D)K>s^|P5YM4^%K(-L?NfBs|IoGnq0%?P7)_SOs?xpF&K$Kz+R~ca zNY_!M+vY3hC%O+DSR<~bD^P*9<7?*7ogrhE7(A4df&`wD8pHHCf28NmvKXIuT> zjHnOw8;zt=wSMm`06HxYJOE{(f)^!f+`NKaDTy+9FZFnC!R`pOn!z;XskHHgU+%O! zFi96`){=(PM)RP}p$W+tmD+xn9i^6JQr*H98rZQwk3mWcierj4*sGLmQXLrUvL#_6 ziIVP>qGF&Y>t7lbf2X6US*_(XbNP|2f8Cq^J~eI=D_XGXIYc|5scST%fS1&|^`oS% z7!sp%5kA+M27Q=or!opJoerk%Kg*^++V$31O9`)BP4twsuR_ry#1q4|WwBv4fHs`+5Of9AE1wb8?U!(!Rf&neZJ zO&Rx_{$Pr3T6?1;*w-jeTId;kqX2u-Dl0#t#HEmtXt=4>4pQHJ_v^ZO2DGR+Ta&V4 zBrMN$T^cy!hxxg*vT|6gWDZW!&ZDl)#rx%{OG=4pCSk3M0UZ4*^H|{HF;xy{Ms1$6Qb2nsqY6nTyLU$+yp0ex0zFNxeVYGOIV%Qzp8lepaLf4)O`=1 z#Z#tFeT%aamL4j%a5m&X$bFOAVpU*-t*UtB2XLdse?R|qCEr=p!K$S<0Y;`IO8H{i znvVM3goFkGWti?5Pr4Y^N^hNdc}%cs6rDo5d+0?FXFlVqb7sQ(!F`)GjC5vHRq1>5 zc!3U=fJPCt0X-H|?ZSJ7L%kkoT~)gR?Rqj58cz_zBgPA*hi9;iY&dIX61H?Ub%DTH zZMt+Cf4Dh_Q8zq9&w*JFlQ^o3H(pI?rM{(fKd#Qp&X;ItGm)~*8ys4t9 zeNq%lcbs={qYoy_Hs?1D!`70bF(CQUU*)JBBeJ}^eSdp4ZcK<>DrfBkn;#^^3`T4o zNGZ$MH5IYR0HW??41S{zo!N)(=hh7YO+{Y^f9$Vfmrttg?w1n;XH2h^vC$`6Ve=)G zOiKiVYFDXdNNB*VrqEbt-&yGldb+_m$`F89|e2?|v2h(ZE z{qoZiW7C~LEc|dScC?<nXMp`p)x2yDV=BU+0ya;L;E^9M5Txt9 z;(r)yeb7BpWYFyd2Wx&Jvc`65Z4Gyt4m`v+0b&w?d1_`|f~P|vYGN|CuXw)snIRxq>RR`}KxgkDeGhRMeZa;r~he~^_R z&$=%qAadc(6vu93TE;X#hv?jVF0(kVXYsVsavxqgd!~fo-KKrr?&Q{H&~*pQxHL-^ z#iz-7Zx9_WV+AjDJvIebXVwEv=+n3WS~JH!f0%YOWE}yb6N*+gulWnFdjD5kK6D@& zz}5)sIthT*9ys#cxtvx5Nn~PBe_BT6)G|0Za$Q|H|@eSY} zBZ*l9lVbs&g51V^%(WW*;7{~f06Zcut<+*Iv!363y?_2yNMP1Ii#7dc4A|t&-B^{I zGlzgF?MER>B~J|Wr!hX40u1(b*6^*|ZArF<#SyI?q`n)&aK4}%yB}=ie>imQ(PIpv zafSw8j9mK$lKN5H{opg93bXH>cxetkEfAUSV*`*NB&{9-+=8YGlUIFCI7oVjmL^Rp zq^XZtyC08|6TKPK>ONoBIv}HJdh+#Z-d8!@espU;4(3S4isdVIq31_r| z*UxNNmvwDykYh1c%GJz(mEs2J&1YKlzQ$aY9EzK9x#npOES&jbM48q1CsWhHive0j z$|`_Oqr^-fW*214a~%CWzrZdq;WW-au4f`S#e61@YnoVF%C=Nc^A;#D${}Ds*E-1LBf-meh$&rxl3qE7Npi3z#zCXCA{u{ zA26@P@`x_&gheTg1^(2KTus3Qh@_GrfHP z@5|2f9_fTP()jn}Vj5Hh^`rsmjl%n*n*KkTHo-Nb#y<2YXeX@1=d{J?KvS#?MvOT38_SM!QJ76ETS+;AV)Jo>zO&F;^XK8H{BBx zD6*2&d^f|W=o-%`F&$Y~9n6X&* zlrz8nKn!;|S0N|NJc}X9SOvg}VJZ}*FHf!QL*1IrhRn!C7vn1tqvZGLbPTz^o($OL z(xjC{xxQ*?lsq3~DSt-ObEH=A6z5`hzQC$OMb91T`MS`M+)xW@_n`%_CzE>J-JDfC zz*ykwe|d_BpJ#@_*4)ygCSAk2i&C{zdW_o%tI}S^s{gqGzMb|%-8fxc0P(ny-PzgTAs=b^Su%*Vk5tgSyAhe z=JOLc_gxX?>9Hb3#n712F3QL~O(#R8c)8fNe}ofZp>IXn^6Q%4@4Ns2AOJ~3K~%dC zUniROKqWG8-Nc|%_P5zK*Rm}F%)@AtOj;(d=oB5hE3OFYKG#s&YF| z42FvKa*)xd>!P49wkgF|j>ME%PX*#;?r}N?hW*;@iN7r&#nw-OI%@Px-gE4rYw4^7= z(Xv-j)WD!EOV@#r?gL#3QQX{RU=8`2Sh@!;AkGbidJT}a?d>+!9N(YD6v}XFm-1ob z0HJjFj@k>yU5vzE$Y9KB{z7jGf5{(49ogGCuAYYH7-SMk$binO4$JMjFcX=*uu#0Y zwzn_s+H2%#Ut*>C&yYP;86n1zlPA)cogrdlzox8)$w#fMrxe__%^V9}`( zGM?*a{90Yq&zoKGHL@aFg%}x_h)J9k&;=+-AXX#fopp9+5~N>Q2sv406^;fzpVQ>k z)O$LI45Dn57hKO+mO?}uIg@h#FJ)0m)*+eN*PWv9cnfnj#U7}TvYti}k?XtL)w^Yc zdTMh5naH`#sn^j||9C2Gf7H;8nw<3B5)aIuYPW2Nj_I{^A5;?EI>Q*9wHPciaoDlJ z#t$SiYfckT<|p=xarRLJRvwE}q^1S=P{7jK4ubhNTqZ-Bmgnw1vYY@qTA~^OwyUI_ z6HG1L-|zgyyf!`mgHc?dbM|eBpZ;FaJTg|7@n+GW847F9tppYdf1pzy2iKVBRFDlP zv>J1}7sqDs(TxHFGq+&|HGL=TvaO|i$i{`%Z+!%ND=n8$z%@3VX_SC`H{!chPWGTM zF~M7&Q%atWEU-hs9Q=!U?y2z9eofe)+$Ik{vUVA#H`(re`(;BVp>5SI8klGQfzt| zCio^Jy{d*)@Tlx1+E*PjmV_yF(wGk0O?fN@hCQwsAada2tm4IWs)O|0r)PTkhtC4M zU^%43ZTeZsBYC0J695S$ozL?jFrY`_YzAYL4`MZ$`V-~DqV3Jo(g1T-$1-Tycd+GC z#5blyULznsf2UW!-#GJ{oZO*~>TX7BIV#67Z$`TL2yHi-G#&$pfR6d5bwTO(h&M(0 z2L&PJ*c@Fa*({BKwiX*EfT6qQJ%3@lIQyW!`WZX!T~P9LBb5u#7yM=sz1x^QDXE)k ziV-d&Da^+kV5$Aj2%f{XvnX-^3T9PL{lYkHm9-?I|T799JGpZ63WEUe1deNl| z)6}R57))aWW!C6*AeX3WLEK;h8ASj7#3y&zs=*vS0sVK(dpWdG%88Vx?&=OG3)U;j zf2lfgR2>8kEkKQshJptmP8*9}IM=illd}@?DSSNxUp)2r1Z>BmEu@8ZAe{+t11!xE zcr+Yl0>Oa-cL^XsIdvIpc)gq`%aYf5B zAoieBK#?&Oc+3y2@8o0Z-z(c z!lNZn#lTdHuYyEBjyzii4sS^!ESH&Q$fm2fV00u9lmCIX;kX&}x&b$46BzEzj@xHd zGT3)O*K;V;#Cz6RV3Ct60z=^lSHcCLdxVqF%L>>3IEJxxK%QuaoBH0_s&Ch@f5`4e z#uO)*y3Djm!-@sDQh$6LzLGi4g1|AUHU64fZ>rprQ^7`CUQ(DTtgg82@^ak;R96Ih zW6DYPls&w8^6~YAq61Xx{DAMCxZhJ5ywb4EKl0xqD6MWf>YAm1)y@Yj3u^Uj zhG~=r^FVaVe&_BW-Qd|KNh-RU99pbXbrciT+SbxPQHYK{gspLUFB4JKg_)uqdEnQ_ zs7lmZhv!MsOJm!4QvYFlm+AT5zc!>1=A!X3eX3YgLLu~Kf!*m7stO?9B z)x$QY5nJyR+6n41Xm@9`@eG==UJE&|Kb#C}^;%@_Dd_84Hju|}2b4L5&+l*9eE6P7 zG|9rX*AS^UhxXIT_2g9ff6Zom@h4-5NQN(L?@=p@Nw$BR9mk}Luq_W3!ZSxdyuu_@ zJF_(+*=JV-mq@U8b!LkbEYEQldfcGc3_QRx6GNQlWm!8eiicrH(`!z;1Qk#3b-{L` zx`FNP(OHSHI8>32?LPETQ?GHq{uJS5{abynS6`?^6djgr+m z#dAM=hrkM~>;N{?{)D?FL$^0;B>oI=t-(q?nQ&dzEi9YQ7_u1US;UP2@mEtHjqdy*~wDuWWRbW}A)h=sinl0mGbq&^w`h_?lW;%X^;8E>#g{ zw|WjG=Q>~w&t_v%e+)vj#eqpG3Qm$+X|1PV+U`j7^_6aFB;Uoyl_;7`eBLlV4Hvny zfF0_Z%9h+mZ^*qP-syDjL5$%IjCl`Mh;CNzZWitc4h4fw6SkkkMzzd zVPEVAjl{mnmMwM3LI$a}0w)ZI<77vmYccm~ERbqAF(WpkE!#uM#eh-0m zFQ+Uf2YW~EdVcOIhPJ&VWc^%u%>I7xSHFJL_9a>&vd*m#VN{xX)I@kaRPC^=oU|JC zUV>v#iFL1de`ZCrD^mSL_cC%23@pTZWiA68Kj;}$K9-!zhBX+oc+wM0EO#IEhPn~u z2YE*7CFhiGuCJ%p)Xdfei|#~K^^KjVY}bQebTz3cZqT232({5GH7O@q9w)`V<0o`= z@>Ou8>*AoA`99<)G?SpVT?Mdfr#N&3yQ^^bsRzNJe^9fIO1*aN;EkfXJ={E4oev=< zKhh}ty~J*?d=!<^W4rHjYZ7J->^I0&5#wR{>+2?~EHbvTz{^}UJH?FTg3pOk0H|D3 zR;~nXyPy~1wCfU2J>D`nb}%Z;@1~%jS;A-D#KMZev6Gqi->qPuH!{CZbCN`RWu!k%@-? zb3gyPiHP__ zUz6(TjctrKsdeGzPieqOHxIFx#G{$yq?vQzf7rO`^}PRp$vg;~C$uDOqGcfwE6F|{ zOy}-K&e<&NL#KD)@5wY`k5WKPVl^7DDy_Tu)dEHR`Dbq3deSQjWVAXh1&`4+?`7*``KE&Ik|@uPDkt(A4lHqyGI|$kdIc0Td??kATc9Y+&N}5>= zN{bFZJc;J+O(ACGbiCb?#GOd3<)U2eyhopU%pQzgU9D--H9WTdo|c$vu1T1mc@8Je zAli7kz~B+_*8~W9|G2`43n4u94f5<6e^&>;(i}#z&C}6@V!HBb4@e1~E4`aZe03#m zJ6r6fhbJWfFxam#lUkzsT&ARmrn}W<8dh#i?CsW?k?yBnM+v{hoJiTkk;b!SHp9na zM2Sc2?Mm;Q;dqM^g7+cj)pJxwZ~j(aBVJ>as^``@#9$f4@yyP!#8@wG8-v$ee*)z1 zC0lmJNHPAb<9pB+aj!%uDV8`UKzjmD{1;sbPV zbyOKvlCmjZFKWHtjv%}b#z=%Le+D-iBEAH4VCI>rPCiW!KuX@E5#wnP>!FI>Jn zzrmfuk_KIzwbr=e)E&-A26bj?txye3UeIr?m3SqaU1)D+O~0elKfC zhsvEH=V3Hs2=;dWwVA_Q27B#~C!_j!-h9@?I?K9dH2ZVyN_9i+kwgES1G<2RpYz1V z29y&JiiD?voB{^%V8rbyjc83*+sT{x5gE`)DDY>k+*+HPMcK!we|IBpiT)ehbRb0A z@x@x>+8}XiMbBpVdyA<`Z$Imf=8xEQLK9H;Vo{8G0y$JJqM3aol!>T8O$NbkomJyO zA@?$G;LP(`7Z0ZcBSmkLGCUNMw$#^ zU5Eimf03ODmw}=de+y#xrqpCH*HN}vD;4Z5?h}kQ+lTxuAEP>0*e-{5x^Ilm zTGO4ZJXSy2e;PQffk%^V1)qCQb(r_z(-y`J_4V|Ex6pH9H!+ibX(0(Dfm8UyQ#bYjqROs#cjjZX|way>SQFp?j)|QRW(1OJY3oS?HY_%u*!RlrB$m0VQTGt}~ zi6P)?e+wlZ%!El5SL5gA9G$zE=pCsxN=ji2h7U|yCqFTj70}G(5nY`fZzu9s84UXf z$#w@R4Gt8sTp1Hj!3hy(b~c5iu4B z41*JfZ#C|~$H{1>lqVm}hO{YG{s}vSmzkxv`g_zA_HJoH#9^xh9U^mWUJ3k7bb150 zE7g6T`9wGm*6hlCuTWM;4c8)_3<|ikSUidl&wDjT^4S|h@uPLN(nKy|;(ClAC5pon ze{7e-`vT@}gG1kq!}dghPk|xsti}xpJrVW;I6*7?jNmTSfTML@dV4m5e0^r5`S(Z_ zgpy%!Xl_z643t?4DhMl7U6gi~t7B;Uh}sIqG!U}j!az1N+&HyeJ8243?H1^|CQ((T zIh^7;Cp3XKlDX*k_*pxZ=O@unauy)pf8BrV#F>XcQHCT%IcvaGt`*w#%=`~7LvE@v z!j4C)qH*zsaKcmqs#PJ@1xYAdm^I8MSGZ^cTX1Px7_UkCzJfvy6rYcXdDwU^9TtDf zFlNDNgQhmyZ6&x^v@qZq&vu6FM~;lItQ1WxF~omjPK~wi^e_RVr$>%KnD?w}-y}yUb?jgxj;~YBtaXRaw82vW6FtJ+Cegf66 zQzO`WBeSYIJ${)OGTUy@1Nc;QIgak)gZO5APFk42-ZF?qK)~YrC!GzFh2W=7(f42H zA+karUR%ZQDB&aaQvC=X1+t{|e{mTaKHKQGu16Fgmx_NBjAO_1U?s6(YF}1q`)Uh8 zZ&IBC$jm&(GXH?IfGd21A#2!ukG2Ch$;Mt|jY(O;P&Ss4&5kOS1=VA`)puSIw<{5y zPIn?haUu6z$AHJQvJ^kC0gv4HD=jr78^G*O7uGU_hXABAo4q&VV;a%vf8a5+j8&#? z;PSI%B&Y#tSwkoJ#Z~HmtA8<>&@> zgrwVzsx1O>A}b`nGM9G1Ypw$pgfCJ`V~Tb8aDuNg)Z z%y)L}wk^kL^8@B*S0EfZD5>%XdAJR=yY&oo4U}R$Ae*W@wU6~#^i2U9g|3~AnyPZP z3F=TKZ^U(>@IF+mf5vijO1#J$Gz#4uf-AA$HmNn6N8{t6d{_#SQ@YxGUGr*Z(M*J< zIT`3H=6+|sln?%p14#v(V)D2&>O*TMF4*3q`h~&)EZ?BfWK6tbD@SNv6L#7Xhxi0G za{3(%n?{B6v?64{X9;Yp)izbf(Kti_ex3$Wwm?fb`gNh*e=^oGFN5zM$mHC#Vc&!Z zGeyaoRyyKo{uz|#%~ccGfL>i3O`oaN-Jk-;Cjmm-MxnSn^y5q)!I_M*OVs5*%K#7u zq>77om&2^KHw#eBy(#U2JqXLK@0}To@=G>??9(um96AO0q>9-!d&NA5t>b5p2ULE7 z;XaJ1Z+3dWe-*Ezh}2RHn5%alTLq5RrX8SN-SwqON zo4F1wVw_Dw6Pqporko8$9fS$Hp?q`=7!|XSqe<}8j-5jtD(gWzO=m~vZ8)idmN`Mr zCsO9!I2^k3{<-$c+0`uz%Q=JiyY^!=vvZx;qpkZPM5X)tt(}BrGBBcxT48uZ_G?Xm zO6gtTe+jD)^LqKy8yon32`(D69XfeOIc{Z{QGlzvgEa;I#F#WwvVGH_`{c;y0w{a-MoJ&AK$xx--SRUWh0FAIDecPHNu*{He+ONHzroj<^mN$4Kx(%+OyvY8nUN8H zJxt^uZl)y>KP~Kh;xVkrF~vA$b?tDcZ0Sy0?HrnR_3DRV%p{8?4!FZ%=)i{PB0kx^dyoBDiquo>I}N%p2&AU8RKr zE|X@E&$lhHDdFrD^VxWxjez3Ghgga8)p+Jz*4Vr>SGY7XF(kGlE>t{)-k>I{B_h|+`ge*k9wWGFWgiNaj6)PB`W6EY8iqM-yLe7=o?{XVK<^Z< z`E)&AH?b}{!_{usg|U!gNlhn|1!OImX9`f+g0O_aR{yC3mfKrvVih?6#KSWme~q^2 z%BUGjyUtF(7-lvFFdj}#bz97*PNk9-#h6;|sMR{6FgrECti;5QHZW$0#ZEJ>yNSkp zccV)=ICM8ho#P=v^ka_hQ9hfXvP(Bv35>vN#s$Qy)R#|axCo<9Te|K}Gl*{gOx-Bc zy@(3XEBzbh*);%MFkP$!kc!fIe_!f0K*Jvd&L^bSTEjj#6|L2~#4(G&&>LE$*wFUb zvn1&tWTv5#aq~g62w9Nb{ou@+p6Z(&eNiq)w$)(r=#soBtj%Z!gO~lsRj$A@-+)Wm z7F>|ay%SnA+dKH~P%afQAoOW&qFohd+=%WdMr|24sUj6b9(_imGAHpPf0Gax8_(kuaSlM1Gb7kQ4g(7M(MfIXs6ncilRh(sMYmlR1*P`0Q0k)A680K@7;% zi38Tb>074g(0>nTPUlDXf-)}Q02cHzrT{V=UN5ZU5>)oBoQN2>Xes2m%!%$)ibC|@ zYi>cSzl!P}47TENrs)|ifAFw4wpW|Rc$1T|H$^Ei<0-X1F5Lx_iOTE9p9QLsR}M>8 z4=~QC`7j3=+T`%u&MrG+yo1+zEm!@4PSLH$VUaR#ByC2chUZao4M}%OO~+n&Hf0gm zz_t#(AMg(Bhf5#BMBx1yJ9kFj=ht;5JG9H7vZ$ml%Q?XaMo#qfe+r`M%U+MVn5)0k zpEZ>hRDO!}`_#{PRRPi?;JFS>o?L#3i+p2ABt8d&!*iEF zvKqz5N}m32j5hFi&<+_>ee|rqAJhSW_i*^+_!62NjQtX(BHEE8nNXI67e(O{^P$gdGehC8(IY1eo zgj+PFpO`!y#=_L%m^{JuIOScu(PatVasZlkm<|Q7aw|*OLH1HjWedyreB9cQI!;{b zT2V{pa*YV#2M@oa#t}%SCfzFOA_Agk%98{d=8E7^f93p0vPxGt^(jNiZGuV^XBe09 z;QXXvl{;>^tSpI|5v_ammyMh;NXJhuKPHt~g7sMxMiA=d4U+NiGShyST~{kPo-T(@ z7M_$EH3F-Q_`V(NGlm*@5tXetZ}MKArr@v}M+pki$x_j98jiGDA#x>-qAQ|6Rfy`zBca!9bxa+0fnn@eAZ zt8jm=FS63>v`K-c$m+8;M?~^thQH%+_`Z@0qM(#c9O-bVOOf)Qzy1IKAOJ~3K~&bK zq*0TCWIbjx)>C9pa;_A1CSq9~(WOB)CLpanf3<@{$2&eNAot8k&~ALxlY5*Sli|A7 zdWW3Q6h93`;!PIe^J+8yT+?v6b{{I(%Y+fs&xtDR0Q6ToHEgnG$7ZW=edOHFaIgr7 z@JZZm_g`Bi69!Czw5E#f8oEhGI5y>(gj)k=v&oL}d3g@#L)-Is#A`Y#PXWO@3jIkr ze>tJ^>9ha%5Bzinvb$LBTmYz95c+{b!5SXjLyjPz?+EmVTzCZ^9ZP5?R@IiDXYO08 zbY@FCvgZ;2rNKM|+OPl-i*Zns;ir~jE~??^s%@XdY;tCX=6m!Vrb;Y%?)+ zv(|g>nvXi+8Mu?!G&txwAw&Nfla|8vf5clI(T{>Nj~Y7k8-}sicwHQ1EUD7qPj0a` zL1WXR{lqPDhOU%-P4juwV5locRTn4*o&%meM2rPR7kA_tfL*@c}-iZ|@5#4tdSUWL-ZLxQAf3{r= zn+q1?bV%#QAaCrM9ZDe_@m%Y7jyt<3M-g9*oXj`z+*K^J3ANMspLj?w_*+HDtp?%sVFZqhy_9) zqYE-mI)^_OJ57?Th647{{$4MjZwzTCb-&TtZLmL{f38^zL~Rwo zfcy|esu0}>inj*ZnyC0#V#*ePJ?#gXxOL+OugnB3_ZiHh)D4%3W z3jX4XHW1-DCbkT`25n3Ke}~$+pfm$09V@f(TR~0_0#3JP(OI+^%Loqk=3X|>-QEhU z$_E+azBAQi__I+GbL*H*Ut*?rU#o1OIUOz@SmoSv-Z&+Fo&{ZO#?n};9J@4i+yQZ# zN}##k9R8jK-+Wu|IlNiYNo)mf1RP!^KQUt{c@yRF>^6fZIs-M+f05oyQc;1Tshq$` zGtTI?B`5Z0{XOTr-5G`Ok0%VHvl{P>Lt#z$8+`=9XEYEKqwoyZTvp$0RE`7oqPEpwG3=M8r!!$~N{)o59C!+T*oS;d4$sE?s3q1O?jueS?nRoST=@CI~eHo;LGo933l zFGRUBzsu?gp)z-m6#^7HDaMY8p{e+fF$uROH>`jk#g^eF@D)6b%dF8`AkuVCcD}QI zuVaAOf2~tvlxR2V{^ir$wX_-mK{me0kdr|ggda?Kp2AH$VOhR{G?nIIMgvBpmo4nwSPH%z>5Z6R+udK|CTSEDKnt=&E(l z+QT$~;GReu7yFd$X=;62&^7&4&05$c$Sj$MrQLiB#G)&8|E$U0^(ojV&7fAOMh4%6 zIF9_1VxU|~GJi&;O4Bnhoku4fhWY6TJVd?W2Y;^X^?I^x_Rd|lf6?sZCtJX%80Gg0 zTOPskvz+2s84^6|Vsx7d<>`;kEEVvItxV$vVGYrsVCC2+rb=cVHfN>ufH=G-hJbbg zPg?UGl`bx$*hJC0Ms)(L|o7PFLXyp*n`4WO#$| zaRD#CC@~t@jnO(Awk}SC@1?TVgE9_`Zh~FG*D4xSgBIk}UB;KOtL=k+mShtc_U%)Y zz{?Y$cYn+xWC6kjDM=;q{zp}i7$YvR>W)D-;5b|GkHAqIDN+wz3l8HjOCU+JL#URwx-f8KCUwB=2@2kMeBKY&t{!J5B9R>_mCV3- zuzzw999C3eI?$<=5N=aIRFW5<(kl41+D|tPXMmG=Qwk}iflnx{b7v2~zHmo+ifSe! z;=Xm_Fey0=47~P!xrLeCu*;Y;d^6LC`t+Kbl8$#E$&%X8H$biV8+Y$LyCXP6o=a&} zB#S5N?BTbnVS4adj)uFow@*)^kHUwUuYZEa3-=&pwZbb-#if=uGxhxN_oGUlYY%Xs zRJ6{5Yss|soB?vKYu-fo3@M)X&zk1K7A|mn3wTgV1$t@pILs*yX9?Jl@$h5zIfyN3 z(2Gwnw{EHL6jd2_pLp&O)t!@qjZ^V?lHd+SVAS`S!^Vuz?Pk$B>3+)jb zU|GmQst>}f6y0Oum|5B&jE_?IC!oKopmLkvc@=}6j+r>IAL+>Ca-=y<8-=ijFEnsz z2uw#Q?{Mmg*w2*dtxAkK8TQl|wX-aKjgeD9MIT^mGu$G!(qA9QYBipq5usv{;+C`% zGi6*oFDKvQd1fDNRscv;T7Ql>Vs1>^013&g%g1kB8;U366Brz2_YuYYuHBl;9OmIF zK3KsklG!cF2kpU_l{(yfM$u*N3(&^I%GA&JdfE9J>}37Q#G|orxUrt9QCV8<1BV63 z9xfJxB@j(CD!Wm}}gxt}OM{5r0~Y=`qHXeyN;e zPk0mAsm@+J3J!`=qnW0P;EEjv6Kw<&As1f64%&`bE>^Y{*bSe|`W zHeMzO>zrM1sY0V?;QC7f9%a3V&=HrU7iq1Ce*LX7&Mec%2Y-|Gr40F;EdfLMQOIQ{ z)PSf4OoJO4rPTYb#DBo>hhdDE(bJ+M7bKDT@+uTqE>NqUv_#>#)C{yC@Yu$0_CH^X zmugw1!mV|YHE&3bH)6@=)rt(#-Bhn<=0V|`d9qVfTJ60* z@9R~Sn?(^D7O;zjPLff97CL{?tt|SQ&X@>E`cBsl#tG*A1%IPA10XHg(pIJyB06hx zrV}gkOPvNsm&Xp`-MrZ$bCy@W^PWN9e7`M9fD`~~+Pn7A4dAudZa!duzbl8Y(>McEq# z$E@v8;~=&|!#)7^i)KSD2CYaN6rSs%$=2$8wWS)DsDCkBi)#Vu5Ma|yF`lM!h*Z@r zHr8>|a}W@sW(^&Hs{srKj29rVcyq#fZTl?D1M=4@t!@P*cu&q{LQP}L#iX+8JRh(w zZ7>{qs1o1a1-I`#GpYM0)Ol@YlKdZo6nXnoImImgZDX{*1M{#(tr zav~+Y>VGC{ew-6_!B4IJDi8Ob5WX%e%fF7;n2yT(Ac#d)RVG*w%e$%TwRBM=h-@fO zGD;tIN|dBe9NHn-S!dmRS>MxS68kQO!59Wj#=@9`ul2cYYd#B^8VOdQt&T9Y3*Dc+y@_=wZ@7;B(-HuY*ku{X4bxLDIk(Tx zIe+GU6=+g5w+%?y@h=!HhBX7x1q`~tC74jZirEgJ*dWqj5H$5Uwo-nyCEtKq4JzDy z&9L)F%rmHS2iMR!dzF#-C$PaD6sTZMpS@{f%aDU91|9o}gyFD{Tq0Dz+NB|)7&XU- zT*f*CmrD(sTserMU@~D^$osEftHZWPoPT{TbD=)7QpZ(bHcy7L9KSGau4=%;0ode# z6R5=4P8Z@iu~r*xn6S4gIl3_E0>9|SOS%7!Hu!jt8DD3@r6>~oUZHz6`T7|C&J(A> zC?m?A0{x$w%%55#Zb@lO03N$t0X}D7*(6Wa^8qU6TQ)T(lre3p~oo!bw9lhZSO(!Gc7YJA0VwGm^;P6s*olK$Ppnp>|y*Hw1 zF%(<9&nf+ChfF!t?%r|?0RZWAha|i7mU8)YZ+97{diew^mUa3F`RY1l%OcC$!K9tT%D@e z)_toJcBwsCf`in`MV4Xqmw=o$0bjb|Q$u5YfQ%g&oMayrGA;obv&Gzc3bh^_8fPdR z1CsBVAm4$wn?cuA*oXwTPaUfdTmaY#O8<=c81=0V+000%KdITJqrPK+HYk3DNwdb;#iU96Ltx~{6aoN}mCsQ3XHl7j{$Oq)lir8vD0#>3pnf*o=l+lr z29Ozxngxg(8@Rj{>+zHurPd^I(P^AY_kcewzqQi(R;oW?o*G;D?4>q8lmi7?gBXIj0P6@eipj8t z`a0Q3`I#z}rrnDZ-NXTgFdiad6bNbAhlLrM{ajLKZGWW&(}A6&NEQzXtZvkgKZzuy z@r(sX%)fsfFo8%>615}brkmh0i0tiLCAbaS%%w4@58jPYyvi@*%_0jg1WHFmEg68> zF|5v5Xz3OU^G`Qu|C1|)7VJtTri=^PDqn2TWuGX}rh>&Lb2u#$24^-LmaS8g>s8jG z2c*gnH-9j&<1;)3IRzcIm8Jp>E`LSIhUlL4$HQXjB{N|+7y)V~o5LSQDMfOB;au0c zDl1`QY#&?q#mI`qC1b$jnx*Lrs}|qg^QH`BHApoBXsoWzrTd6MI{!I!rhd9#=c;rQ zgQJvY8T9p}{5S0=@5u=tZQ?TwTlC;%T9$G`4u7i_0{b`pfPiZY0Ix&g5h6Z7r)o}~ zIBaR4CVL*El-5xylp=Cd*A1czCa-*8YBwuAZ>X!Cvk zOxpW3MPrzHkXful+mUB+-4J?K?HRNZgCAc{_IkG;@G#O{6zH^K0sgdD<+PqXP%=K@ z^nYiK#LgUrqLI~qfe9d#{Wxv>p6ze~(F%Nr?ciMJe@rtpkdszG z%t3vrVGeT7RSNYO>KsW$rW{jejFf?!kFS>j{Zm#5i=_ zjMD|NEJYL?vigB_=DTL8U+a8>jfu&SnQ70o57(77ShFS{N1{!rm)` zHW%%RskG>ZGCSb|NV{^-D=A$;mmR*_>{rqkS;-fcw&G9*W6HAAT8m!3yKHVBBbj6tP6%k;=9(ws5-!p(os~%C z90b$B1FAj+2t@3c0|4Pmg1$iv7N0T_?VRQ6i}Vg$Ent=r`*MPxU=SMUX@A-z!|_Ic zEuWBZ-(0e%+PByzYx}8D*X6-yyx|KVa4t*x#v=E}Io%{`R;$8Xj#pkSgg~U7hkEZ$ zbZxZJf!LYmgeXwQ;AGEOTHj8n9ZUwX$bQ_lT3~blR`yD08~~a=UJzNODJr9w833T8 zBk%w_QK91=Y{@PFgu_LkZhvdL>~!yop;`L0IwldFwmPI4Paoftge+KE;!}4de*oDLxOsy0B(pgD?lioKXwc1Y0OXeNY3-qJ zIve4*Qm+64?41n&{+Ak-agu3-@0I{7v8G3z=`D~;ZJoCajjfWxx_?E~W}`!`?I zd&l+RWitpnhv1$!X6dxYc0T)1sD1zzL=)6T7|laVClTm`L{Lt_BCY}o6~(2aDu0)Z=p>8nnL3mFXgwGy6y@eC5tXvb)A+|;13)#q$VHvZE(sSuGGkRYk^YAI622|GPs&DF zjEs%Ep}dCaP4$H<*EqM4pNs@%D$vbYaM3hC&hgh1?&H(-!GED|j1t0##Y+woph`oQ zH%ERChoLn6ms&P-49=*u0LzBSZKjmKZQVmGr8VTRG)F$ZK$lga`x|dg8uL=^;a9U1 z;f^=N`l(53)iJaOZT$+*3z%UB%N?OGJxjSWa3C1nlD$%Z(`gWc@sDk5xz2{R+jWD=YEIe!2mzrT!S2c96`XT23omuFiOK{t|YG)(p0kcS(GeiQ`gGWr>ue^aB` zFpco#9S}UggsYD!%|R^q{HWyJE&niN!|uAS!>8w4VNw?LF>Ev?)Q83jvpDk1yZV?y zQbQlqxPr-V2PCsF99~d@!H||QnKiB4nWju-1kLtOWPdz867#dzDl|_cv=Wj%N*%<9 zWOJ(w(p}-X~4OAk_|Jzu>OFs3hkh5==!OPi8|=U#oZYB*>_fKHx+umQ2yi3nD`w|79@s&nY=1Iz3h+~>Kx3Kd#+kEL2z6A;G&bO1Mx3LsR2ELal)|{wDN|OpJ%>`(B=@cClW3xTcJj`Q$XoTf6?qjC{Ar{k~q~mBjXeX+?&ocdR6dINN31)cYm6h z;zq9XL`-X1DbiHcCkftK=Ikob*4 zty|5MStn>%)u)u^nKX*F-mI69Ga_CPrnNSW8s`iTQW z9L^1*UFPAll$DemOTcgjKXbW6A%7EnvL|0NuCKO&=-39N9RO6L?7bOZFKaB+7?vD5 zKIC-LuCp}C!9$}^zXB;0*rC}RjkN4^Rj%%E)Z#OfAcd zNU>omkPN_yZ(!*|;ZNarp+Tg4#mM3i=hzit>X$G^N6fRpipu&uZI z%CH7~ujv66I{3$cBh0l}nu+68#<7Jrp#n^Adhx3>^|!9HVpp-PK z(Vxas+tY4!rowA#)_*tmBeh0})oxOlfg~3G0ftjJ>uvzfA2QAckkWnM4k;}p18Aw! z^MY?{KO3^-2JP3u?ETwiuBMkZz2buh0!nsiOfXt&lrt^8)&EHCP%b-ked0juoBS9R-pdQS1S%JtW(0BBEuPq)PQe+@@ylXS001BW zNkl~PBaz-G6K&*V}G*CYZLT~&Qwzb=Q*ms?)Y>- z*heyh6Mv-x3p(~))Xrah&GIM;3Z0zd%jc{gPVtdA$_A%{65@42m9t9@XqttTpB>`- zHAkySr#bBs43nF|@#G-6NGD(K*5Yd(<<^$f>ZFpnfa2y%Z(8H7o{ACJr|o6-0^jfi zZg^?f%#MzYUc3$E4BH4`%r+;Z`YGBvS#7d9aQZ$5W-@K_bOKddmpcAGC?LTtmrtQ)FupNPY_QUa>K-*+%fUBV&{05Fm zI7p`0Pas46Z>|7W91Ux+`WAlDwi`ICs?{KyO2a(G$5Ix6F%oW6q$&Gj=1flE1?Uv# zkXiIzHL9959cA2zgG}8Najp&y?cjE>V1GSam4}cZicqp?ur$B;7!>zl(w(x_kenUN zjYa2Xx$Jo$%EViT7;biq}7Wkk*hZFSj)u}tbPQaj%2iY7fJm*%!OqpJZM?AQac;@fL8V&dV^A0>ZGSkc zDX^Yfpq>=+#A-)^eV|Q8M&&(wd4TRSnNM5DX}vzuUApvD`7`2|9Kg0OU-sDbkBg4Q zSicWt!$20YWf4sVL5Gb!-8sONdX!86v9TOCpM{>A^6Wn!oSG=^H(iVouuxk!=?Zxs z{e0$7KWzq{tmeP!H8>9fLjn=nHGg01K|=lR7Ug171Xd!;>Yg{vH!c9Wp+z>Ca1H4( z4W+jQ6P$M^5DU9Y_gWjD2B+%mOI=gTj}B*Z*twajsXPtLrPD*Idmay`w@%maFl5&r z7(9rib#N=%{93`lCPEt~xAN{bw+s-)NvORI+h(XZ9UGygJ0#OEc7^GVseiMA9(7$= zIq)F#q(yS}f}F5@cm?7J)e+>pP#*mPg~F#@<<*O(NZngz^CF|U=MUNsQwGM^_H&aL zr$b@tQNo2#?~znoZjZAbP_1OH^4&jw^BImH%*#UEh}6c?hGug!adJ#begc zOl4RN6@#WEimg7AA3_r$n7XD=LFyB?VUPV)m_ir*{hmxlOEGs=7Joi3?Vh|ozMHcf z+Z|xhfx&~R{AX=3;ZM{~MDKp&fBTsoj>n6i#YmiY77B8WJlaQQKisgaBuAJQc{ZBaCKb;@( zI*Olb<_7t1>`%EMM1Ocb$8ZV)o^CxcW5@3SQjSLR^#Bwq?L=Q{G+@{acRpn?r1p#M zM8qgsJHfNoy^S^Zj=>Ao5z|(Ke}^DtRWjo1)rMnrd=`lm^r`dj;9zf9Eg1?YoRJiy z*t79*x;TSIBJ9C+yC{prWB_R_h3&-*ex&6+qKW+06U$MW&40c*JY1D-U3596KA1$K zymE9jOM#!M-_QEEw!>^N-We99hFO;|ve6Ko2T-~L#;YUDK%4`TCCgH5h^<_BE9pRLMh3XYJO6Pf6fo;Rb5?$oIO9(4Ei6P;CxZw{XI`jg%z zCfm(L4veR4xeaY&Dfivm(Uyb;$*M#&=R%1?+6ve60!X2n^;9pW)S;w4mYIpR>GF9& z?)w1DfHMn)4`15x!zP54a*XjdTfz@soSe$}w!+GI;^u{_s^i7{# z-UPWUABqNuqscPb#_Z{9E^`V;;zAy&xP@qM+6|%&YFSL-QxhiyztOJfM>!ra^RX}_ zv4QMFIJMj(oppf-!=&fTiMqW`_nbB*3rNdK;(r--jZ4D&D1HLS=>i7U@^TY6P}+wz zob&aXCwQZS%asA%#hjZ2;T!LP{oH8;J)@fqv`T>?e?BrvG_Gf5u60WL5J^U}UW#d{ zt7(+psnS|0x|h0KZg4T&od`KfmEOYNodS*PdZ(@k@^uGGq*^iy+Io#cBwdMK0wMOK zAb<5Zi9p14N@_w^>u%>1+UT-ls(&NlfanTNpE3UCQ)=9e^GRMuelT=I96{)$R zK+$Hf-i4_>OOd$4pblL?w7RLXYBiNKmT(bhxn&ks9;Kfw;b|A+9;nQKV;6(XM2l&| zp~jOU?Y|=1JVL*P947}(*Gt5NL>#sL@LR^9D4EU!X0s2(xk0)zkfxb&od9mv-9Tj? zeBQxncnFwC;OfoJX>Dj4a@k>kIDdIa8ZZ=9E$ubbREPy-b||c#AVZ+Q0t0=w+s1(x z;jUJ~uA_20&A{hjl_|S$N>^EHq95FIgrK1%V67UpNTcaUX8L+SjFkR`xX*(n^{xQg z3BK+a@7aZMAc{i^97EVi$R%TA>B0-`nhuM)rj?R&+SokabTZ(W=abf+Fn@t)&v*CL zyBN|V^)vhu@wAPSw_8fpONr8EFCZ9(Y*iSw*CdO-0wXgYBOAI-4j?ESlBo^4PUE8g zMo})RBKuj~1v@znn^EYAV0AP{U4S~L(aRYamGNk*$~`UieipfVgdrj#r}@y9=2aHA zQ%JInR6}pa2#P-MtI`AB^?z?Z!MV^AjYO08N@z4C0Oi^FGn3I-s~rN<7UUdUdl%#N zns4@Sn_;>id5EbHlkXD|yU?0OAq#1`sv5r1X%J$tp@MUTk(~3j{ zUtPX0gX~HC_vS5_fto_gE}aIs|BafAK}dIzZYRY5=J|&Tqh_0eK7aFo)atrv=^^^1 zxb7nB8LR(*zg4QJh~F}{hnFiNJ{f9Oi0+fT-EXrs$}CG+?HDVw^6_ak>n4|fYUxN8 z%@rn(&F6l9I$EieF@CPmf_D!No`(HJiShBUa2*0BSu33;oA8OwJx6^KO~$L%^c|h= za{6`cqXrEZf+)aL0e>=+Q&aY`Xt+g9DV4|ZoE~yoFAl?Jc7g3wsojHqTwvA45;6{w zoArmkke~M~m@>TXi-t6`@E!@@?Ru_pG|r1f-v7w4EwT=Vv;2c6@D>@sA)An_PG3o9 zy{ag0UAvl4^h|>GH3jQmmSfj-on;Vz8>ARjR0c2xOz$&=J%2WI`Y7w-ZxZ`)t872c z#&!On$=PpCpOzq#??Xm<(RTBQS@1-uMRg5Z4*Hny^;A|i#?T6^BpNJ6AMidyzLcsL z-N)Hi+T0gL8)$lJdX&tOD={3WJf`YUR0gjbgRdHw(C*zGd|quDxO2!VQE3KbvGiry zb&_h3{prrJO@DJ%0QIlVAhrR6z4zPtzj-<^Pqxu_Ts{lqVGtH|NSWJ6Y&p#sGB<*? z!@;3>oX?NUN-Xr`W5+4l$-vTGaB6dlc4iH99XQ3}xq0BP+6?mMd!U1{UvwAhDVNmG zO)Io@1`fIpN4?ClvrH&2bb8U<8yN5^zO470)=qD8eShXn<<_)PCW5}Jq@5EhNw+UQ zuhk;@W+7xAdlBVeBsJj#NWM4ko9AqUq<@M=;6s(2KtyyNY zP1KZBRBNnJ_C6*L`*9q*r|rXYGlmj37ln(i(P4*cYNfGQGG4Rys!F>3=33pi480q9 z|M((bZ+|*@O=%tTv|n=vr4t0wV7Qz3{KytaAR*^=_U|$&r<=c)G1u|m+N_|Qs7;gL zBz-k9_)QR2>Pc!xB$N=7d&NJurWx8~hps#eBJSnRG$`jj2$=_o%mOqMj(P$Vm*`2k z2wO>aq!Xy5pcyv-;%nJBYe4%EX<@~bvOtY$F@F{U+2q4%f?N|QQa(lxdW|l`*qf+EFL##PJtKdWi?)}5$SXN77c zbtrTn4z2WaV-ljyT{;s(54h~LSn|v7{EN3fOw$GZAQ3PW=`)d{^LFz-h#hu%ycF`K3ibj9VPF$u4oArB#71;s5lNR#z8V(A4$98)-0tY3*k#paGiDb=Ds(ZDC0bX zaP$?*WRw?avMn6?~&nW`CXV z3rvbZ$)Gr*E=vo&{Qox1kIlkj*Ab1X*V&#$%(Q3AJhb3p%Bt=)bRy#Vpm_M;8LPmz z>0Z&58sQzrS=zUdRyD`WwWhjR!+)%5tLv2osj}ldd#Pl zp~ipOh=V}m1IP|FaZbY{3)W;_1;+7isD|jB$;DDHL}xv6M$=Py96_ve05)vZ`~JMl zq$S1@Aavc7jFsV3rKox8N4d>)NfN*1XAf{2gr@a!t)sNL*$0+)EU(abY&oh);eOjqsh>Mq?|W8C;j?9|_Gg4xG@iNg>@TA-S6^>-mHwWhkJe#j96viRhFwbYe70Qh3$t?*tBH{Ir|ln z*bYw`@5sh?pm6#fAlGHqk)6gPfvl`UH@eLZ$oQ+j=yg9cfLjN!uznc`zCJN2MbIXi(t6zL|6`C*8Fv^+zm?OUMqCy(e4q1S#&a za%1BB$%;N!kJpo7GnHszp_p`7@GxL5f0j!{^i^WDSCmR01lJ{g7_i`E+#U%ztu|&S zc;@^|MnU8B1C#Q)vm^s=M#{ceGF12OH zGwz|d#(MH&|1~&-(9@M?fuju{TL4o1G<_g)r>l#n&I*yudND8QKJ4bpMzOYRM%AX) zh7p4~h%vXa8+oJ?a!u=q3$@TYPjwVe z$_hzp9plr-e6Of{ou72sQO>W2;ZDm^Dk_X$e(XRY6aZhs-c zF2olvaV6~8w&0&w7O{A|@WF+geWCinD6VD?M)=HaZMfY3o-uVj=9jxpYP+$XoX{+w z)!+;+KLm$Vt4wG{N0G7)r6T#rs1q`oW-2-S?8F+u{thUs0;Dewewqh%hCrX7-7w|I zI(yog?A9qz^bvTIdWVF9NE#H4Q-9jzymJT3V&BWD;QKQ<;6>fkGwxzD2LtLy3_xwi z^I9L&2JXcpUy?S_vJgEGcR9qb^MxG`D{ub`CewKUPteR_5cX%ENz2cJ7i+u>e5K!@ z>PEcVnvU^TX9U=WvV1E24S3cU(IY6znw2fuXH5uo)Fq>BV##$X@h#Hag} zz<`qtkA8+69XRWBq4izas`?An7K z2c8Dv>Pf4vDG%N0CJJJ{Zhu)mWkI$Rs52~^Od?|5v^}>TQ_}2rL1tTlVIIZS!LM!} z#Hz{g^ZC+qH4MTs=(!QR`JK#=L)WMTZ!1t#Ldx^`_>?teKUE2pb}qM>rj?H)d-I{v zlI93{ot+(6-z`X=4Bbku67s74p|ULVbA=%@Wo`q9#g7=!db2t31%H+>W=X@sn@wM6 zra*IlgF^=6OF-8iJTukF#~baq`E#Uu!c76?WV%AHZ5l(*Lr}SvPofC5WcyK8j)m<&K10NlH4@YI zE=7A6!Dizt&CaY673*0eL;ZQu^ueOtwnRstP1u028YYh*I&Xsz0Z>BsWWJ#naJLT45FV%C0{eWc)Un5fJ| zAP$%)}P z%@O0k1$h4_;~>C=XCR$JS7k^pmm<3tFk7R`Y;0$HzOFBSA{3Ilpp*$G`u1B7Z)AK7T$nK>XuB{qvuv@#pjB^XF3o#J~LOzx{a< ge?EUce?H~&-#7rD3!AYoDF6Tf07*qoM6N<$g5t}Wp8x;= delta 30337 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 diff --git a/modules/core_styles/images/top_button.png b/modules/core_styles/images/top_button.png index 6a8ef9d03922a49bc498f40a9f7f76c713ace916..d0480416ae3b3699742cadeb6a174ca659a7d63f 100644 GIT binary patch delta 346 zcmZ3+d5w8O9M>I2ekNYMW!GQ)o0y?pF^;usQf`0dQyxh)PNuIF=@T(%hSDlnax zpyMd$l5)kBStRkv)DsF0CI-3!A18)ce2n5N+bqfS`tAqT?=R+l(P}W@v2T>=4)iLV zr|z&_$D2{$_{QLKCca0{+s7YZ&%301I%vi6ExXpu4VblzaYy!Ad55@ZONISzZ(}G= zK2y(pVzW;1p_jkq76d0s%qxvG=3#!lE2@>n(P7py6W``*vo`6>d_FVx_L`!a`|4dv zx3(RXa1ISU^ZCt}`L{o3NPk*)dE1uqx$FM#WPJ1coTz1A^Z!ZGLW1g#T;_C4?y$hh zSl9o&@_HwC(}Aj=t6lx>e_vZ1SGw!p^K!Wo+vS;S89%9b&M7!n$nv7cu;AdGl@Dey liYxRbFP~%IyybJ_UuoBA4ayVd7p5@)fv2mV%Q~loCIDAkp%4H7 delta 1072 zcmV-01kd}{1EvX(UJBa_5D^dv${BO!k!UM_1N})vK~z}7?O8pK+(a0DW^A7qGGj-I zF3==On{c8@q9jz5QG`ygiV(L_L`j$HC{t6=5E_~^k+@TISw&HP0A)Zy=(LK`BXNm1 zrNH*syXRedXx7K9&tJPcYbbb|)y{{Xd7pVdX5Jx~it9Lc0elBdLI{DBvgi5!uG)To z;oQ0YBuTo^DC5cG;h%?xU#e{m=UV`Fq?9_LwgVyV0{~G;b2--u0xt+)P})n<^s(pr zMc=ZZl7y>|# zxQ-)T&hbUJi(mKmA)-hN$h(~mZd|>JANTg)1pzo?a2Uhw%}x9^7$6)DwcxyC+qic5 zG9Ep70$&Jtz7NJ2KDu%RzaJbRbJa9W0RWWJ6U3`h=GtkR;==j!c>dxAq9}rYsdkDe zf|L?c$`cY2^@nEaLys6EG4Xn%qmPuDc(PO7AB>T zQqB^WUv&06Z-8y0^r~@e+b$(cC8LS8O%ol~%zx-In=Ga&5h{4yoK@pkmQ^`Fv$iTC zs|Yol3@TcjI!^6xs{E>PjFSF;D%Y(dIX~X4+sV8esqLy#c_Qi*YYRtJI-kk&iDMoy zo0@B#Yt7?k{}xUWQIyiTtgn=~Wu(llbjz|hRYa9#+PtMx{4WcMR*PGum8}vdALEML zdtu_59y6*Awf`j?)g|j(x2WG-WS6Tl+p^Zs7EaTIP&Urgp`5z=+4(7d(NNB53#W+- z*Pi3%&0_ig%P7(ojt;9dt76CT={vW(MFCTtC#9@)g|=|Y0)NpBLT#%`7`1oRWa=JG z;>)}-r!AbaV4o+Vj;Og~oVvUDOtwr(s4bjjlR(+s_L#V`+L^k@ri2)Tl*XX8aH;}) zRnTurD9s0Esklv1d{O&<$|?|}_@Z%$c7$ozBPn)G6r1@r9UqTRrVKTL5;L z1{_sH7$TMOx*r6;WW-qjJ_GP5H+HgQAz<6{{rlM;*KsV{w!dAoth+iDisSg<;oG+} q57L~mYXE-MiDOV3y8YKwpT7Za7Icfo`pjqm0000m@OevjN#QTvAdGT1s$GLZ__>9RCtcDpf+aHkrQug%o*-gGdOW5SsS`B z8=N<0$i3aQfcNl+Uy0`|*Y$h<`}a#w^4AZWLhJjz-{%Q9)!EHgvJMRuOg8y!bGcOZ zvdPAEuh&Umi<-4eap{rH=56M;e$Q@io$U8e1dL2tgDpVlGK4GQ2jcGdze0nn^>_BQ ysEg+O)pBos$31CZG9|7ci2Y^mBnbY_{9AvvdhD^J>Z$6WQ1W#3b6Mw<&;$VakfVkG literal 0 HcmV?d00001 diff --git a/modules/core_widgets/uicombobox.lua b/modules/core_widgets/uicombobox.lua index a6f13e7e..ef08dbfa 100644 --- a/modules/core_widgets/uicombobox.lua +++ b/modules/core_widgets/uicombobox.lua @@ -2,16 +2,16 @@ UIComboBox = extends(UIWidget) function UIComboBox.create() local combobox = UIComboBox.internalCreate() - combobox.options = {} - combobox.currentIndex = -1 + combobox.m_options = {} + combobox.m_currentIndex = -1 return combobox end function UIComboBox:setCurrentOption(text) - if not self.options then return end - for i,v in ipairs(self.options) do - if v.text == text and self.currentIndex ~= i then - self.currentIndex = i + if not self.m_options then return end + for i,v in ipairs(self.m_options) do + if v.text == text and self.m_currentIndex ~= i then + self.m_currentIndex = i self:setText(text) self:onOptionChange(text, data) return @@ -20,15 +20,15 @@ function UIComboBox:setCurrentOption(text) end function UIComboBox:addOption(text, data) - table.insert(self.options, { text = text, data = data }) - local index = #self.options + table.insert(self.m_options, { text = text, data = data }) + local index = #self.m_options if index == 1 then self:setCurrentOption(text) end return index end function UIComboBox:onMousePress(mousePos, mouseButton) local menu = createWidget(self:getStyleName() .. 'PopupMenu', self) - for i,v in ipairs(self.options) do + for i,v in ipairs(self.m_options) do menu:addOption(v.text, function() self:setCurrentOption(v.text) end) end menu:setWidth(self:getWidth()) diff --git a/modules/core_widgets/uimessagebox.lua b/modules/core_widgets/uimessagebox.lua new file mode 100644 index 00000000..2c81a7cb --- /dev/null +++ b/modules/core_widgets/uimessagebox.lua @@ -0,0 +1,23 @@ +UIMessageBox = extends(UIWindow) + +function UIMessageBox.create(title, message) + local messagebox = UIMessageBox.internalCreate() + + messagebox:setText(title) + local messageLabel = self:getChildById('messageLabel') + label:setText(message) + label:resizeToText() + + window:setWidth(math.max(label:getWidth() + self:getPaddingLeft() + self:getPaddingRight(), self:getWidth())) + window:setHeight(label:getHeight() + self:getPaddingTop() + self:getPaddingBottom()) + + return messagebox +end + +function UIMessageBox:setTitle(title) +end + +function UIMessageBox:setMessage(message) +end + +function \ No newline at end of file diff --git a/modules/core_widgets/uiprogressbar.lua b/modules/core_widgets/uiprogressbar.lua index 404f50e3..5d7cb3fa 100644 --- a/modules/core_widgets/uiprogressbar.lua +++ b/modules/core_widgets/uiprogressbar.lua @@ -4,19 +4,28 @@ function UIProgressBar.create() local progressbar = UIProgressBar.internalCreate() progressbar:setFocusable(false) progressbar:setPhantom(true) - progressbar.percent = 0 - progressbar:setBackgroundSize({width = 1, height = 1}) + progressbar.m_percent = 0 + progressbar:updateBackground() return progressbar end function UIProgressBar:setPercent(percent) - self:setBackgroundHeight(self:getHeight()) - local width = (percent * self:getWidth())/100 - if width == 0 then width = 1 end - self:setBackgroundWidth(width) - self.percent = percent + self.m_percent = percent + self:updateBackground() end + function UIProgressBar:getPercent() - return self.percent + return self.m_percent +end + +function UIProgressBar:updateBackground() + local width = math.max((self.m_percent * self:getWidth())/100, 1) + local height = self:getHeight() + self:setBackgroundSize({width=width, height=height}) +end + + +function UIProgressBar:onGeometryChange(oldRect, newRect) + self:updateBackground() end diff --git a/modules/game/game.otmod b/modules/game/game.otmod index ec8c8334..cc5d2814 100644 --- a/modules/game/game.otmod +++ b/modules/game/game.otmod @@ -7,9 +7,9 @@ Module dependencies: - game_healthbar - game_inventory - - game_skills + //- game_skills - game_textmessage - //- game_viplist + - game_viplist - game_console - game_outfit - game_containers diff --git a/modules/game_skills/skills.lua b/modules/game_skills/skills.lua index 93f748d7..52f00567 100644 --- a/modules/game_skills/skills.lua +++ b/modules/game_skills/skills.lua @@ -43,8 +43,7 @@ end -- public functions function Skills.create() skillWindow = displayUI('skills.otui', { parent = Game.gameRightPanel }) - --skillsButton = TopMenu.addButton('skillsButton', 'Skills (Ctrl+S)', '/core_styles/icons/skills.png', Skills.toggle) - --skillsButton:setWidth(32) + skillsButton = TopMenu.addGameButton('skillsButton', 'Skills (Ctrl+S)', '/core_styles/icons/skills.png', Skills.toggle) end function Skills.destroy() diff --git a/modules/game_viplist/viplist.lua b/modules/game_viplist/viplist.lua index 4747d1cb..6ec5d994 100644 --- a/modules/game_viplist/viplist.lua +++ b/modules/game_viplist/viplist.lua @@ -7,6 +7,8 @@ local addVipWindow = nil -- public functions function VipList.create() vipWindow = displayUI('viplist.otui', { parent = Game.gameRightPanel }) + vipWindow:hide() + TopMenu.addGameButton('vipListButton', 'VIP list', '/core_styles/icons/viplist.png', VipList.toggle) end function VipList.destroy() @@ -43,21 +45,21 @@ function VipList.onAddVip(id, name, online) end label.vipOnline = online - + local nameLower = name:lower() local childrenCount = vipList:getChildCount() - + for i=1,childrenCount do local child = vipList:getChildByIndex(i) if online and not child.vipOnline then vipList:insertChild(i, label) return end - + if (not online and not child.vipOnline) or (online and child.vipOnline) then local childText = child:getText():lower() local length = math.min(childText:len(), nameLower:len()) - + for j=1,length do if nameLower:byte(j) < childText:byte(j) then vipList:insertChild(i, label) @@ -68,7 +70,7 @@ function VipList.onAddVip(id, name, online) end end end - + vipList:insertChild(childrenCount+1, label) end @@ -77,7 +79,7 @@ function VipList.onVipStateChange(id, online) local label = vipList:getChildById('vip' .. id) local text = label:getText() vipList:removeChild(label) - + VipList.onAddVip(id, text, online) end @@ -89,7 +91,7 @@ function VipList.onVipListMousePress(widget, mousePos, mouseButton) local menu = createWidget('PopupMenu') menu:addOption('Add new VIP', function() VipList.createAddWindow() end) menu:display(mousePos) - + return true end @@ -104,7 +106,7 @@ function VipList.onVipListLabelMousePress(widget, mousePos, mouseButton) menu:addSeparator() menu:addOption('Copy Name', function() g_window.setClipboardText(widget:getText()) end) menu:display(mousePos) - + return true end diff --git a/src/framework/core/configmanager.cpp b/src/framework/core/configmanager.cpp index 410c1851..a88a6365 100644 --- a/src/framework/core/configmanager.cpp +++ b/src/framework/core/configmanager.cpp @@ -27,6 +27,11 @@ ConfigManager g_configs; +ConfigManager::ConfigManager() +{ + m_confsDoc = OTMLDocument::create(); +} + bool ConfigManager::load(const std::string& file) { m_fileName = file; @@ -35,9 +40,9 @@ bool ConfigManager::load(const std::string& file) return false; try { - OTMLDocumentPtr doc = OTMLDocument::parse(file); - for(const OTMLNodePtr& child : doc->children()) - m_confsMap[child->tag()] = child->value(); + OTMLDocumentPtr confsDoc = OTMLDocument::parse(file); + if(confsDoc) + m_confsDoc = confsDoc; return true; } catch(Exception& e) { logError("could not load configurations: ", e.what()); @@ -47,13 +52,65 @@ bool ConfigManager::load(const std::string& file) bool ConfigManager::save() { - OTMLDocumentPtr doc = OTMLDocument::create(); - for(auto it : m_confsMap) { - if(it.second == "") - continue; - OTMLNodePtr node = OTMLNode::create(it.first, it.second); - doc->addChild(node); + if(m_fileName.length() == 0) + return false; + return m_confsDoc->save(m_fileName); +} + +void ConfigManager::set(const std::string& key, const std::string& value) +{ + if(key == "") { + remove(key); + return; + } + + OTMLNodePtr child = OTMLNode::create(key, value); + m_confsDoc->addChild(child); +} + +void ConfigManager::setList(const std::string& key, const std::vector& list) +{ + remove(key); + + if(list.size() == 0) + return; + + OTMLNodePtr child = OTMLNode::create(key, true); + for(const std::string& value : list) { + child->writeIn(value); + dump << "insert" << value; + } + m_confsDoc->addChild(child); +} + +bool ConfigManager::exists(const std::string& key) +{ + return m_confsDoc->hasChildAt(key); +} + +std::string ConfigManager::get(const std::string& key) +{ + OTMLNodePtr child = m_confsDoc->get(key); + if(child) + return child->value(); + else + return ""; +} + +std::vector ConfigManager::getList(const std::string& key) +{ + std::vector list; + OTMLNodePtr child = m_confsDoc->get(key); + if(child) { + for(const OTMLNodePtr& subchild : child->children()) + list.push_back(subchild->value()); } - return doc->save(m_fileName); + return list; } +void ConfigManager::remove(const std::string& key) +{ + OTMLNodePtr child = m_confsDoc->get(key); + if(child) + m_confsDoc->removeChild(child); +} diff --git a/src/framework/core/configmanager.h b/src/framework/core/configmanager.h index 8297b5f2..575836eb 100644 --- a/src/framework/core/configmanager.h +++ b/src/framework/core/configmanager.h @@ -24,21 +24,25 @@ #define CONFIGMANAGER_H #include "declarations.h" +#include class ConfigManager { public: + ConfigManager(); bool load(const std::string& file); bool save(); - bool exists(const std::string& key) { return m_confsMap.find(key) != m_confsMap.end(); } - void set(const std::string& key, const std::string& value) { m_confsMap[key] = value; } - std::string get(const std::string& key) { return m_confsMap[key]; } - void remove(const std::string& key) { m_confsMap[key] = ""; } + void set(const std::string& key, const std::string& value); + void setList(const std::string& key, const std::vector& list); + std::string get(const std::string& key); + std::vector getList(const std::string& key); + bool exists(const std::string& key); + void remove(const std::string& key); private: std::string m_fileName; - std::map m_confsMap; + OTMLDocumentPtr m_confsDoc; }; extern ConfigManager g_configs; diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index d1864bc6..a9daa038 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -366,7 +366,9 @@ void Application::registerLuaFunctions() // ConfigManager g_lua.registerStaticClass("g_configs"); g_lua.bindClassStaticFunction("g_configs", "set", std::bind(&ConfigManager::set, &g_configs, _1, _2)); + g_lua.bindClassStaticFunction("g_configs", "setList", std::bind(&ConfigManager::setList, &g_configs, _1, _2)); g_lua.bindClassStaticFunction("g_configs", "get", std::bind(&ConfigManager::get, &g_configs, _1)); + g_lua.bindClassStaticFunction("g_configs", "getList", std::bind(&ConfigManager::getList, &g_configs, _1)); g_lua.bindClassStaticFunction("g_configs", "exists", std::bind(&ConfigManager::exists, &g_configs, _1)); g_lua.bindClassStaticFunction("g_configs", "remove", std::bind(&ConfigManager::remove, &g_configs, _1)); diff --git a/src/framework/luascript/luavaluecasts.h b/src/framework/luascript/luavaluecasts.h index da0cb0c8..a45d2137 100644 --- a/src/framework/luascript/luavaluecasts.h +++ b/src/framework/luascript/luavaluecasts.h @@ -125,6 +125,9 @@ luavalue_cast(int index, std::function& func); template void push_luavalue(const std::vector& vec); +template +bool luavalue_cast(int index, std::vector& vec); + // deque template void push_luavalue(const std::deque& vec); @@ -249,6 +252,22 @@ void push_luavalue(const std::vector& vec) { } } +template +bool luavalue_cast(int index, std::vector& vec) +{ + if(g_lua.isTable(index)) { + g_lua.pushNil(); + while(g_lua.next(index < 0 ? index-1 : index)) { + T value; + if(luavalue_cast(-1, value)) + vec.push_back(value); + g_lua.pop(); + } + return true; + } + return false; +} + template void push_luavalue(const std::deque& vec) { g_lua.newTable();