From 8ec28be2b621aac09a67bb9b73f47da68cc1cdf1 Mon Sep 17 00:00:00 2001 From: ZioPao Date: Mon, 6 Nov 2023 18:23:34 +0100 Subject: [PATCH] POC for new UI --- media/lua/client/UI/TOC_CutLimbHandler.lua | 4 +- media/lua/client/UI/TOC_HealthPanel.lua | 166 ++++++++++++++---- media/lua/shared/Translate/ContextMenu_EN.txt | 3 +- media/ui/ForeArm_L.png | Bin 0 -> 3748 bytes media/ui/Hand_L.png | Bin 0 -> 3805 bytes media/ui/UpperArm_L.png | Bin 0 -> 3701 bytes media/ui/test.png | Bin 0 -> 3662 bytes media/ui/test_render.png | Bin 0 -> 3527 bytes media/ui/test_render2.png | Bin 0 -> 2029 bytes 9 files changed, 136 insertions(+), 37 deletions(-) create mode 100644 media/ui/ForeArm_L.png create mode 100644 media/ui/Hand_L.png create mode 100644 media/ui/UpperArm_L.png create mode 100644 media/ui/test.png create mode 100644 media/ui/test_render.png create mode 100644 media/ui/test_render2.png diff --git a/media/lua/client/UI/TOC_CutLimbHandler.lua b/media/lua/client/UI/TOC_CutLimbHandler.lua index 047fdde..35c6ea5 100644 --- a/media/lua/client/UI/TOC_CutLimbHandler.lua +++ b/media/lua/client/UI/TOC_CutLimbHandler.lua @@ -5,8 +5,6 @@ local CutLimbAction = require("TimedActions/TOC_CutLimbAction") local CutLimbHandler = BaseHandler:derive("CutLimbHandler") -local contextMenuCutLimb = "Cut" - ---Creates new CutLimbHandler ---@param panel any ---@param bodyPart any @@ -28,7 +26,7 @@ end function CutLimbHandler:addToMenu(context) local types = self:getAllItemTypes(self.items.ITEMS) if #types > 0 then - local option = context:addOption(contextMenuCutLimb, self, self.onMenuOptionSelected) + context:addOption(getText("ContextMenu_Amputate"), self, self.onMenuOptionSelected) end end diff --git a/media/lua/client/UI/TOC_HealthPanel.lua b/media/lua/client/UI/TOC_HealthPanel.lua index e5698c7..4ad8712 100644 --- a/media/lua/client/UI/TOC_HealthPanel.lua +++ b/media/lua/client/UI/TOC_HealthPanel.lua @@ -3,40 +3,43 @@ local CutLimbHandler = require("UI/TOC_CutLimbHandler") -- TODO Use this to replace the sprites once a limb is cut ISHealthBodyPartPanel = ISBodyPartPanel:derive("ISHealthBodyPartPanel") -function ISHealthBodyPartPanel:onMouseUp(x, y) - if self.selectedBp then - local dragging = ISInventoryPane.getActualItems(ISMouseDrag.dragging) - self.parent:dropItemsOnBodyPart(self.selectedBp.bodyPart, dragging) - end -end -function ISHealthBodyPartPanel:prerender() - self.nodeAlpha = 0.0 - self.selectedAlpha = 0.1 - if self.selectedBp then - for index,item in ipairs(self.parent.listbox.items) do - if item.item.bodyPart == self.selectedBp.bodyPart then - self.nodeAlpha = 1.0 - self.selectedAlpha = 0.5 - break - end - end - end - ISBodyPartPanel.prerender(self) -end +--ISBodyPartPanel -function ISHealthBodyPartPanel:cbSetSelected(bp) - if bp == nil then - self.parent.listbox.selected = 0 - return - end - for index,item in ipairs(self.parent.listbox.items) do - if item.item.bodyPart == bp.bodyPart then - self.parent.listbox.selected = index - break - end - end -end +-- function ISHealthBodyPartPanel:onMouseUp(x, y) +-- if self.selectedBp then +-- local dragging = ISInventoryPane.getActualItems(ISMouseDrag.dragging) +-- self.parent:dropItemsOnBodyPart(self.selectedBp.bodyPart, dragging) +-- end +-- end + +-- function ISHealthBodyPartPanel:prerender() +-- self.nodeAlpha = 0.0 +-- self.selectedAlpha = 0.1 +-- if self.selectedBp then +-- for index,item in ipairs(self.parent.listbox.items) do +-- if item.item.bodyPart == self.selectedBp.bodyPart then +-- self.nodeAlpha = 1.0 +-- self.selectedAlpha = 0.5 +-- break +-- end +-- end +-- end +-- ISBodyPartPanel.prerender(self) +-- end + +-- function ISHealthBodyPartPanel:cbSetSelected(bp) +-- if bp == nil then +-- self.parent.listbox.selected = 0 +-- return +-- end +-- for index,item in ipairs(self.parent.listbox.items) do +-- if item.item.bodyPart == bp.bodyPart then +-- self.parent.listbox.selected = index +-- break +-- end +-- end +-- end local og_ISHealthPanel_dropItemsOnBodyPart = ISHealthPanel.dropItemsOnBodyPart @@ -63,4 +66,101 @@ function ISHealthPanel:doBodyPartContextMenu(bodyPart, x, y) local context = getPlayerContextMenu(playerNum) -- To not recreate it but reuse the one that has been created in the original method local cutLimbHandler = CutLimbHandler:new(self, bodyPart) cutLimbHandler:addToMenu(context) -end \ No newline at end of file +end + + + + + + + + + + + + + + + + +--------------------------------------------------------- +local og_ISHealthPanel_render = ISHealthPanel.render + +function ISHealthPanel:render() + + og_ISHealthPanel_render(self) + + -- Left Texture + local handL = getTexture("media/ui/Hand_L.png") + local forearmL = getTexture("media/ui/ForeArm_L.png") + local upperarmL = getTexture("media/ui/UpperArm_L.png") + + self:drawTextureScaled(forearmL, self.healthPanel.x/2 - 2, self.healthPanel.y/2, 123, 302, 1, 1, 0, 0) + + -- Right Texture + + + + + +end + + +function ISCharacterInfoWindow:render() + ISCollapsableWindow.render(self) + + self.backgroundColor.a = 1 + if JoypadState.players[self.playerNum+1] then + for _,view in pairs(self.panel.viewList) do + if JoypadState.players[self.playerNum+1].focus == view.view then + self:drawRectBorder(0, 0, self:getWidth(), self:getHeight(), 0.4, 0.2, 1.0, 1.0); + self:drawRectBorder(1, 1, self:getWidth()-2, self:getHeight()-2, 0.4, 0.2, 1.0, 1.0); + break + end + end + end +end +-- function ISHealthPanel:createChildren() +-- self.healthPanel = ISNewHealthPanel:new(0, 8, self.character) +-- self.healthPanel:initialise() +-- self.healthPanel:instantiate() +-- self.healthPanel:setVisible(true) +-- self:addChild(self.healthPanel) + +-- self.listbox = ISHealthBodyPartListBox:new(180 - 15, 59, self.width - (180 - 15), self.height); +-- self.listbox:initialise(); +-- self.listbox:instantiate(); +-- self.listbox:setAnchorLeft(true); +-- self.listbox:setAnchorRight(true); +-- self.listbox:setAnchorTop(true); +-- self.listbox:setAnchorBottom(false); +-- self.listbox.itemheight = 128; +-- self.listbox.drawBorder = false +-- self.listbox.backgroundColor.a = 0 +-- self.listbox.drawText = ISHealthPanel.drawText; +-- self:addChild(self.listbox) + +-- self.bodyPartPanel = ISHealthBodyPartPanel:new(self.character, 0, 8); +-- self.bodyPartPanel:initialise(); +-- self.bodyPartPanel:setAlphas(0.0, 1.0, 0.5, 0.0, 0.0) +-- -- self.bodyPartPanel:setEnableSelectLines( true, self.bpAnchorX, self.bpAnchorY ); +-- self.bodyPartPanel:enableNodes( "media/ui/Client_Icon_On.png", "media/ui/Client_Icon_On.png" ) +-- self.bodyPartPanel:overrideNodeTexture( BodyPartType.Torso_Upper, "media/ui/BodyParts/bps_node_big", "media/ui/BodyParts/bps_node_big_outline" ); +-- -- self.bodyPartPanel:setColorScheme(self.colorScheme); +-- self:addChild(self.bodyPartPanel); + +-- self.fitness = ISButton:new(self.healthPanel.x + 165, self.healthPanel.y, 100, 20, getText("ContextMenu_Fitness"), self, ISNewHealthPanel.onClick); +-- self.fitness.internal = "FITNESS"; +-- self.fitness.anchorTop = false +-- self.fitness.anchorBottom = true +-- self.fitness:initialise(); +-- self.fitness:instantiate(); +-- -- self.fitness.borderColor = self.buttonBorderColor; +-- self:addChild(self.fitness); +-- if getCore():getGameMode() == "Tutorial" then +-- self.fitness:setVisible(false); +-- end +-- self.blockingAlpha = 0.0; +-- -- print "instant"; + +-- end \ No newline at end of file diff --git a/media/lua/shared/Translate/ContextMenu_EN.txt b/media/lua/shared/Translate/ContextMenu_EN.txt index b680eb8..37df218 100644 --- a/media/lua/shared/Translate/ContextMenu_EN.txt +++ b/media/lua/shared/Translate/ContextMenu_EN.txt @@ -1,3 +1,4 @@ ContextMenu_EN = { - + ContextMenu_Amputate = "Amputate", + } diff --git a/media/ui/ForeArm_L.png b/media/ui/ForeArm_L.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb5406b7e2a1a3ec7c19ac6cac53ca85c32af36 GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/media/ui/UpperArm_L.png b/media/ui/UpperArm_L.png new file mode 100644 index 0000000000000000000000000000000000000000..0203f403e5c12e1fcff7db33081e5a24b2dfbb8a GIT binary patch literal 3701 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 A1poj5 literal 0 HcmV?d00001 diff --git a/media/ui/test.png b/media/ui/test.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e36ee212db38a8de5c001045ee46625e86b52e GIT binary patch literal 3662 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 Q@j(Qb7+M-s>bb@K2k7@QdH?_b literal 0 HcmV?d00001 diff --git a/media/ui/test_render.png b/media/ui/test_render.png new file mode 100644 index 0000000000000000000000000000000000000000..a845b2dfde536129e00040d729d0352542bc7c01 GIT binary patch literal 3527 zcmbtX_dnH-|9z3na4*?gMz&m8$%t$3Rb+)+8VL6qSBT8Wic7dMu4`PgjEhS`Hzlr_ zva-s}9vNNZm;39+;L#+fig2njF#sz_}U zKimEu7(r&aLht4BxL>`%0#R-dDWL{K^p0lip)BJ3*WVuCDQkowCoUiptAIk$no^~IX5Wg{EFgn3tb^BpXevSXXeq$V z!Jy5p9!U@C|ME2sEfPrWMnkm~ey4*vV3Y)jwxByJDsv=9JX^^H!1-_0d1S#{iE84e z>GI7($+^5JS#NG}@6M~b;4ew)_cEBZD6);Ex!)@_n-lxgv2Sg^du(uQH=BtV_9oUP zGC}YKvfw$k27_e9Y?%esg-JUW$OYiC@guH)J4vD{;A=@jY)hgG%fL?~2Dc~Ew`G5N zG4-MXjZKH(;E+aOhc^&)!=jO4a(!!4s zD70C*srj9u)kW1r6sp#KS-}XD`<4jz@R__kpAbZ+BnF)iOp8$^oBd zC?2C~Ky+D!zreSyHdb>@g(Pa-w$z3v4h}hBRF4uH*BK25u6!ow}pC^^4d@%(zhnRi9SGM!?-1J?Dk>vt>2$i!Isz+zo;xirS}uUb?>*mPEC|Hl zaDmf^rZSqfQAco+hEez0B*T9611maSU5L*`qOPRc#lcw9pS-P9ez6qy%VyCqcg_x4 zCJ@a%5heX+OClUb>>~*S!n9tjc->Ab&}D|cTMQspwp(E&?+R||*s9|23Z8$08VrRA zwK}mR7oSV7<0BJhyXnnhD(l&B7x{WFo%cP{`)MCQ-9bAT$MjPmKzteyio5Z1ckBA0 ziYB9W>~Bys2+UiO%q@DU_u{r;NqXq>G@M~_I%64?FSIQ~Ye_;Wc|h3Tn)~uas3A|u zBWrYp)n%q8+9pB!m?{GS1NfV8YgKE{3db=+WuBVE3B##31QK|KCYZAgw1&NvKL-LfTCei6qSC703v?HDGtWyrVG5P%keH?2OoJ^3ZD9@#B2-T` zBB{G{(j|P@*XTu_i+zx|C0?8zkg*lLm1!ha1+GbYrZ4~GN<(I7N@$*%L4;|h2sy*q zXjn|dmyQe~^ONPt;(2BhqBk;2KT+?n1VWCekHAN%G|&%5A53H98gxqxO7uL87Vu)O zHntWmvCz zB_}06rAK+xd9g}dULU3Cp@j>#?pdqY@}39T?Jn8p|ACs9aN2g2vRJ|H-}gfG$M<`G znfQdx5x|Hj%f053i*qo!VZm2UxLfkB*Ovj-zb{^68lN-pMJ_w&)#4|P{-*w!9HgWr zDkRG?XHI-h>dcA?^9Bp5NXOK>&6j)_u=!&%g~4H>YZ2erXeL*k_?%!=V%YLx3n*Q zK=>2=C+2mtQ-xEfQ~nP_5!SJbr9<;~uie)Ku5iQ}GRh(CWzx~!S$kp_& zjPt{42kgYF=7MGvq89OD|AIi{%h*BQLfXQ+ZQL&LevKPiGkoFo=s4FB*VI|~(>rrE zMb%xFQ6%88`{VZzA4TqKVmul=-n`A+FL{PjB2sr!HB!-h54jC_HkCFYr#>F{GCf9o z0_W^Lj!h}gy_?z#f!u`TIHrD=3u?r-AJOj0?{aYQ&voz9D4KAiYKA8UC-`udj$KU+@4%D%Ek|D`NGjj=6W7NA*Ov>H zQ@;?`$JTNYe-Wko!IV3c3;U%kRV-!+v&UO+ zcf;y-H~xwo(NOFtn)~Cs%M=8qJ90L%{X`H)a_+u6OlCbM9EVV}FOgX8uy1(^ODGE0 zOKcgZ`&zkLxhaaPNgNt&t%821kEBzIHHtrw(2D)_EA_wXj{?4JHEs>lFDAml-$Xe? z@fj}GlNI$91ZVXpUv-eN5n0EL$G7u)R71F~ay*jdo?B?ZV5~~g z-P9V#5f5in##A<%pRNCzs&0;w_26=mQ<18@8tL{y8vieqteQO+@dMoD`DUy!_{?I! zVs>!eg{7SZWsF+RN!{F^nz6P}P>_yllJp+RPQK3pM=~JekcKi(W!kHhs}K%^ItyH< z%cAqBL-n0@0wPifIY){lp47li;C=8-mH^i2%7cncAJT&gwM6yYuq|WHJDzhbDgOES zmtQC6Yw<4#@ZRJPZf*Hqg+EGM$Qa>lg-$9xRsOeNp4A}DAI9pbK!{V7!`aecmN@Rc!_`_n9+M$-$x%$&777FrzKcaqN~*9 zkZpUH=FPhEEMY-IgN3HrszF-w$Dx*HLnlmNF2BFD`z+3T_|T(F3Wn*a#Z#EVl#3R; z@7L%4>XhojZ?bjpy}NrYXI|U3l;~w0BD{LlMHS~C%qlOW30YDMJ}qDUYTDA_=h9AC z*#8-@vQ?O|k}-T^?S^fL?M7!SD$IZW^dsF09h4O#=%8s6F}C$~W9V^dPAQh?O#CNA zr`@SN$Q!k9`cYw1k`bL=WM@`orec|AUicbO)VUqJJemX}4{>@kMrEHi?c)b`g(8EF zYob&<5DOR2`ml4RuAjR!_a1z&M&qOLhIO`X3Ikk(jHsYPxy8qG?OP#POpcokn=;xf zkt?SwyW8E^G0URUix+ZtkK1}zM$ZpUh5#eSAOK(j|3|7QFSiT;pguI#*R>0EU7u3$ zzpTqo`;(c5zbsBgH56d1olZc6+XzIjr9)v(&o&ZcOVSt3_++BElA!tqWV(foTb$UjV+ixQIhULz1 zDxRMiNo-;p%8b9gr#2v-jj+iH%~9?wA>NZu=$Wl^%Cim2d+A8mlj>w#<1vHQ?W}x~ zJNT*VAtonp+eF@T#?K4+ON0MZ`_MaS=H>w3orc=}R0eRzdn{@ONDpH@b+FW^~HE?E@bH7W7+V+6)m7Dr3r%F>8GQ$R`Et8{7 qvz&HpK8l(gvp@fr{vQBMC>~QmOvTd0&DDMW+hYv1(67Da9`iqp8F%df literal 0 HcmV?d00001 diff --git a/media/ui/test_render2.png b/media/ui/test_render2.png new file mode 100644 index 0000000000000000000000000000000000000000..bd72e22e5f81955b045d0ec77dcf83960ea30061 GIT binary patch literal 2029 zcmeHI`#aMM9R4z+IF^*9(bS3Xgi(pPrm!$_=_Hr6H05Zyt~N|;or6N04wB1pY3Vpg z`5qm&Ee)}gu!<07!&56}n@h6_JL~*(ems9bKYZTzecsRe)B8N1=X1^952LM#&;$TL z+v})%ppvNopklQ_U8x={#pEk#WBkz&5&*zWzK)7lps^GHG%CH^-Hs=f&+~k);wUPd z1xZN>Hjwb!y`8VKyF>NBfCil#uVyMbhdUBwduIy^z5>=z*>)M zzV5`qEDz%M9f!k+hKmg`SVGwz-+iR0#PC&8mv!z^n}Q_i=C3rCMh>hAH{t!nt%{`< z-|;51uBWx8RZ})(9fHO;_-_X#h>vRPm8s0+*PaI}&rh8#eu*`#8FA^JewNu(_eW8B z!{E!mhPF0nw*ZgW+YDOjG0%x_76p3PwDycsq=jOf?;+lKS~0*^i&cZ0JM%a6S*Yeb z3g%ibG+G{@GAEj^^Xli>6k0Px0^AKAtIeo?F_HH3q>*1jMB1N>XZlRXak>Oj8A9yZ zSVgBOax!*&v2RW}b? z-uA|E=$Gqa8m?!WBVab%*a4}QAL;5T#mI=N9mN*CBKo`zE^o3tdu-CP%UHW{IjInh zB;+wHEYf2jsk-uA(#o+d`^g^LTz4y?b>U5~u)Z%}09tGdXV~D(PGPb5+1^%IlB={} zY)P3yp(NS)I3I8d!yGI?dSobYYOKSEiL`M#k4>@_Mv1av))+`sMMMPmNI7#o z1a9Xz#H67hc*gW>^k5Uus@*iY)F)?`oyv;;O)tB-1Jcc>CA7h|r;LTz)$Q^b8X?^8 z4Kqr;(l0_3TdpBKBUN1CLsH`fZ^9!*;#H*mL4kfyp~=Wz^$P7C@vB|4EdHcgYHg=| zk9d^F&Vl6FKvUsKAF2v$$j$4jtB*VF9qB9D4p%|uCBvkKPWv#LqZ#IX**TGTUS;41 zeWB-Y!q`RI9`PhTgq#>zu*Xco8&}_ch?jy$YI$|i4rq>%b@w3isHZPSxedPn@KExF zcV7(*E&T*y&bxQtY$ocktt{TjBLwyEEnM)};PMSHivdm3E^`&O_K|zh5=(<*r6pA9 z)je;?G&A)c?jP+6BGPLl`+70pB?+$wSpk>pSqCTd;njBC99qiw4Dr!KCa6^0?hM-)!p}n6x9c5gydwZhVij|j$ zSk@)v4__X_yWnQwy