From 7717072fd7365de269af41eb70f9c61dda9aa41b Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 4 Jun 2024 17:49:43 +0300 Subject: [PATCH] Dependencies: Updated `GLFW`, `libdeflate`, `imgui` --- extern/lib/glfw3.lib | Bin 1564026 -> 1019910 bytes extern/lib/glfw3.pdb | Bin 217088 -> 192512 bytes extern/lib/glfw3d.lib | Bin 771078 -> 892026 bytes extern/lib/glfw3d.pdb | Bin 184320 -> 192512 bytes extern/lib/libdeflatestatic.lib | Bin 289892 -> 324262 bytes extern/lib/libdeflatestatic.pdb | Bin 94208 -> 94208 bytes extern/src/GLFW/glfw3.h | 959 ++++- extern/src/GLFW/glfw3native.h | 213 +- extern/src/imgui/imconfig.h | 31 +- extern/src/imgui/imgui.cpp | 3870 ++++++++++++------ extern/src/imgui/imgui.h | 1073 +++-- extern/src/imgui/imgui_draw.cpp | 613 ++- extern/src/imgui/imgui_impl_glfw.cpp | 103 +- extern/src/imgui/imgui_impl_glfw.h | 15 +- extern/src/imgui/imgui_impl_opengl3.cpp | 127 +- extern/src/imgui/imgui_impl_opengl3.h | 16 +- extern/src/imgui/imgui_impl_opengl3_loader.h | 137 +- extern/src/imgui/imgui_internal.h | 905 ++-- extern/src/imgui/imgui_tables.cpp | 589 ++- extern/src/imgui/imgui_widgets.cpp | 1089 +++-- extern/src/imgui/imstb_textedit.h | 150 +- extern/src/imgui/imstb_truetype.h | 2 +- extern/src/libdeflate.h | 4 +- src/ReDIVA/imgui_helper.cpp | 41 +- thirdparty.txt | 26 - 25 files changed, 6859 insertions(+), 3104 deletions(-) diff --git a/extern/lib/glfw3.lib b/extern/lib/glfw3.lib index 54cd8b142db827d95f4882e3f6d693a96a7fae57..b9cbf770abd873b45659028bb721724709a80ab6 100644 GIT binary patch literal 1019910 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�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 z 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

3Ke1%Hw>YD$Z9a*7U03e2qiHDY0gpf1ort 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 S-?sQaV*O6;JpYKp_WuX7%?&dE diff --git a/extern/lib/glfw3.pdb b/extern/lib/glfw3.pdb index 074345997d35c31efeb465a22fb7a3538f287bc5..8a4652427f56908b2c43600235041879c7839c21 100644 GIT binary patch literal 192512 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 literal 217088 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 Oj;ZJ^lgfxaPi_YSVQY`@fIXA>*^3 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 diff --git a/extern/lib/glfw3d.lib b/extern/lib/glfw3d.lib index d1a51229ad2d389729c785221ba20110b56988df..55dd22b8b4589c66566f4a02189d6a3fa5b0aa0b 100644 GIT binary patch literal 892026 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�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

Q#bZ0=bk=OFAH>0)KG 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�ixl;1XCIO-4MyL$hNLD1<|;^H-k~BNFJ1e&bcBQZnMz%EEzPmPd*ew)fAN- zh*E}Yl+!cmEN-NI9h;dnY0f@cr;I=-_rjrYQ4pfMJe z^^SEMyo(uBnz-1tns@_VGR=yh8DyhCJxHeahxWB?aEyaYkB1yy%S4nV$NEWoD(C>v zYCucos{_<|byF?uNm1DV`L=;M1emQzqNj9+JqMBpTKfXX=RGnbQcr3*N#G4JnIkag zlbCaspQOJW>91Y_Gr`P&Q)&P+QdQ0=jCAQnJQXOCCm0QxUit&;5B2m#+xzMVx-xKG z1=ndE-S{AyviSyASc-!Z%BU%Yk&3IAqO!h`N;$v`tAXgePQ(eGxHYYIg zqtq;Fcl#*6amTW-~OS+FQbsV9^J`w5@oL$Lc8Un-ONVChJ@ zXcGbPm_zCAtQOjcyp0bAvq+|YV8lpTk8UJPyKAPrxeQX8Epd5CRh1&ktwlXXERyHj zOtF1NEmgyZ@u1?Vy;Kczx*BY8#mDlNz7I<(CW7&-y11%4c0j%;0SSD^z=|M5-L=Q) zP$aJc`QP-x6X7P#=Zebsq`MANJPas&!mZ}BR71Vm(y_pcfiu;vvbYbZe5wxRwedtX z9sws|rK5QI3E3$r0VK^)oq?@vSC$8RA?lD;jjvg-MC2U{X&0wdGRraeZBc>@2em-qaXdn{afF@;H~vT`|bX{^G`xy zzlrpG0dY>~=%w(5w-UaB%Ees23?!zp)ookv`gH#Xl-ZAADbv1md24?r z+u!~Hg-KRT0@r>xdG1<@*8sb-A4t*_-EyO>?{e6VTJGJQ8?op0YG=5k<$2rc% z4Eh`lsqYEuWQ3gP9AEaW$+QA$#GL2^%VJQgeAVs-!xSuA$YjW|Gsg8vrRDmH0dt^_ z>HsEDWo3NVoDvfOBXNG&E*cWpopa{|()9)?`t4?kE63mK@MGTinmG?xph2di4k3+W zJwoOyfsmM4_>IR~Kkc`uHL@tFIEj z=r*gb5fhLJsJsh-3OJmO_^a-yVO3Y`oJd#y&LJ4Kwq1>-x*91v5m2({ml^lPOLkM0 z$SO?YXAY*FRX7g6uqIALRgn*+F$lG++Cj7dJi~Ja5y#4tsziPVndjO1nw6@mmS@Gz zGW=CERSfBmSTFgzl1amRx+@`Fx%I*{=hh1hrqm01n$!zEZ;;-EPXq>;w__2qK4;*k zdJoTvomNX@4Jq1cOJfZw+BYrjJC=5zrLl$-4mA z_&r!Er}*O^l(6#2U-s_kQy_i7u;+vreOT5-Ap6Z0mGbzzzpSS!s{Cd8Sk{~^vK)CV zKmr*Cb(zk@xhhkh70b6@ipJ7aw2SrGc-ik=(QdLd+9pM#z0n0oW67kr1$Y&%a)$*D zC_D=BbH{ss0n!2d$d<(|#lr2BA}t9^F?S57ZXU*xyn%CXAu^4*g}6i);z_y?=K!M$ zk!Quua{N`a75c2$x!lrN5(>wnQ@A@U&EE)*1l=veM{u>RM!2vH06F|+2nQb9Z-ksO zag7;p*0gpGWW*pW;=n3L@pg)Lcq3(jvr|xJB4A|BFEb7I{oTx@NsNTI%=0zeh%WP5 zUFIBCRhjclHC#nw!&S78>9g_9S(f%QOJiv&+>4g>ilyZ==0g$TR>U>9%AKNm8*|kN z6`?jb_@8Xf$^v@}H(!HJ>%v9RiKU&3{Hem_nVNzs+A3Tt+Liijyu;E^G&W;}+iYop zv16REGsjE^0gcx^VD(`++5Oa65ze^FNrB_#;CNvUaw`sXMvk!1yd34An1dh6DGqf; zj)g+=a?sM7gP)}-4s}M3q|mUiuAF&vx%vdTJlj)lz9cVijHk-6>c)*Z=BC-1GG)ZNBsRr0%2*8iz6^TjK7KD&D99t(akY3$TP%d#~W&DyE#gd9H76jN@nV!w}Ui_Ega@bz6 zcbiAfxM6a*aw!O~XHm|&iIZRxdFIU*bAw$VJ#y4Ou-^30k`x4pB=s0HsmRx7R%P$>DN1UoQwei@!$BF2m&TR>JnuBO_9PUm~0ODj6n+ z#(R6|nIxF!J?SYEIUtA?V90~*OnpHsC-|c%n1|UzQBJhi2D4@u<(y%ZFAk%8eHi5j zmQt>@Kd31?Ifn9kP1)H}{;nzGEu{pd#-qeixC!M!6@Z{ihi(DD$BZ-2napt}1W zHb+14WtZz}%_SJ0t|`Lh)#dJ(yhU>f#-|IDACIoXGpXBMuHS1e!T5CTK1^4EZFOT* zGr|J^)`$1o_C0*MnwPJ6&*eH$a|y<$YtLc2lqCV#3283D_;l^%)3xW?C%@%#Wi*#y zd^;+BM7Sy_8pn0d|Lg?Q2T)&{ix~eNRb0~)1eTJ;cTDqqZ@v#=3IZ?s;(4(dQq{&M z+|8o{_b*S+gy2{h57|5Y+dhdy>-4&ypl-38@z-*LRhoqJ^ZloWecoQS>jP%qoXXkdJm>>vg7|>xj<_R}cmBlw!P(PW+79tr zjyyhK?#7h;1oWjTK?PxFt;*vAhU534z|8gF^7(AJ0k}oLysL4X7v=L|LVH_T?KsEa z$0LB>Nb(}UysmMaujP|ROSWeScQWwfF_OHu5O*vv)58Lj*@(!?<0E8HV-%8l^ZOh* z54g{3EJruNdG_KXKdsz%bLHjnt+5QaiKtiKfvFBE{y*JeZw*Y6=!Rp|w+6q$hAWOy-x`kcqcQ4RW7M|> z+>rcl@vSk**`=(8w=?9B$+WyHJnC;lTw#p*+mKIa%@=Rt)x+ohLcC-cM+xTBH-VY2 zr|`zJ4`jZ86A(T&F*pI4ud2<5aKjba4-iNFZO9i0=F2koOKS7IxA~^dEknO24f7SZ z`NYmth#zI@)_h;*O7nQiFwQj0=XC-a^|vwVZ=>A%`LlfHIO=c1`aM#fKE#E`sJ{&{ z8KeF-M*VHzD=BFU)*r{HzYXL5Xw=`vsK1R-e;cFzHsqVqQGXkw{x(MaZDTg3levJCtNTumr%;CMM|F!-$__6;*cxx>Q=lG4{5P^;p;>vRZy-o}w zGM>b~XyOzduf-LW^%zopa|B<2(|1TwSqj8hxC3AMX4MNwD^}oCJYG;fKEhTi_+fb+ z2u5P8z9!Kk-{AiiuiQ}+?gAyXgHC>L{<*w@o3qP1@vbPoFb5aCKZ_%fCSWNdj2#Ey zM70in%#?h7S-#q%RnS|&>P>Puv!szBv!c_lWi2}drm&}?^h~KInh_i63wsRyr&Jf=jx@caIiB9{bJ zG|X%UG!%rJEM36#^KiVD<*8J<5BP{CE6J+K&}qaBp`&cP$&=?0RQ`xt3{nfMm-|5z zXKr+uBn{~;K~aXAdltzlknL+-tZbGOE7670S4NFao~}OAtW_szfdMNjd)#V~rmr%u z94UvejY>Hn@4LyhRq7(>t>FOa`pUBj-OKE*^|FFg(RiwcB3pEF{oT!^s{)9lhl@b* zqD#^5j_oJ+ved#c<+z~*zKV*<5@7U~yPH-zv6w7^QLNrNW1<%!B44i-i@_dvfxoC+ zu{06~;4x>o5>C_UIFSTaDAOzT$y&c%7o$lmX}7BM3m5jm5Kl7S)Hu4%jMZWj6jgh+ z1jQxJjU#|CQw!FmTHrmZsO%@en38Z4%jS8W=C(aUselDz3EhcUTd1lJD1ldLHkAVt z!?OFVj&XaWO>T=AG-fm$v-zackjsRpwh4Y^*r^+EnXIW#CsK8p{#Nxur0h4oE*s3k zrNnYoS0^ID{$jXRST!HTn_ zMqkSGim-Ptg= zc_}KZaO3J)Ps`{?@rv>%h>q6A8$yzj6MZRxoN%T$yQ+EsLuQ}2x{;6KQ~~yM!=+DF zsKfoSun`2bu*}L%ohP$FG)K?BKryQWu}p7I_lk~{svhteV^LY9Vs5F8tFcU6xGl#0 zRr+sC1skei$3s%{Gx2Ez{j#j=?CtAm!{>haG@H_7X?W6=THD&Ia@Q}iavXfIQ*L$B z>1#8R@#k1E)ZNmh~nA}EpCxY~9&+|du8SL?;`5rt=A1`*lOot1e>uE#Ityc_z{izV0C`l(v)(ePpU z0^_K>+M}TsUWk)H)d!zI%C%yQyTR&M9B$v>eu&+cJUY&>u$^BH7Ip)?yAH27@a@$f z?(GP!g(DgG^n#-=)yX)Y?9jz3CX{&`mPL+~B}B15qx4x@EPdDNp{G$xP*s66dG=@& zs4i!*>!%=1%7;`BzA@}-EHrMB!B5s9qZ*!(GOgXx2hP{X#WLq+ z4{z;lUEa}&FBRacj1JAN)resGsRR94=z#m52F%PO>uP%XPzX}Loy?AD9mo5zNV+{6Biq$NEUzVb>Y2ZZ0VL)oJPr_n&!l(26lyYQe`XVdlGyuabb?NGOQ$uwG z%IK{c!@T0pH(W$u_Sn!4(Gc{66kY$sv4J!Fekjjqwef-F>$4dVR;ZCEH`U)&c1;#& zmC}GHe_R;U;S3iEg>zUL=~p6(TS7>O=R~p}MQ3}65@kC`70e+#pwZJ8X9>qCUg-@| zg&7e1!;+9`E}+9}E7<5h0E%@*0N+!{(-@-?TU1_F7M1#cMkMbXI7!nsO-xEaep+!CgtLb zHF&*dLgP!V@6Tqs>M|JS+xm6$VnJT%LeSz6p{3CZnx3Ol@9j1$*FS*M*j$+~-R35d zt(_*d<8*O+Dd#fS(s(J`MFsn?Y|-_VA@wR?Ve3AX>Be4BROoYc$7%X^T!l5A1O2OH zq+be|(si-@WM6CFdS$}#&0tX(ClT~d&6fMN=2dw!eVSCQ+sN|>{gJJ8#$MrG>=pL;m0kSrUn|xsN$&5BY92@u0 zQc!04OC@a~S)e~+GL?g6aUU0Kq4PqxTNab~Ys4l}+P@)JQjx_iQY)NUi$hDXIGkR2 z=T1#a7OgS{ets7VaIhc_Za`L?Hu61?Ld72}-0g3!Ibx%}rTjrmw4` zn-xs`2cmQaFx>WL>2i}pFl$Tu{5uSnM<}(b1&G^sHE~x{HEdO==W0y)Y+$|36HJn& zi(KvKJo1T{sJaUDIJ{@V;IOdEz}|cs%x|WBnf()2%E7GW$x`tSNM^7;7z|(5 zX$h@r?OvHtRt3wB{??TlIK4yDkF1kAo1hAhv)~g3GJWe);@eKjWMWQP!QjiBbCa1* ztytbBvt}7#?$QeL&m$yTgMh@7X3HJ+rn@y0%3PVhIyK;n!C{`6MLJy*g0f!P0U~Y1 z3nnF9nvG@iJILgqfVRdlf>N4z2aokPva?(^(q-giXOZmZ^Nu^Bk4U!aBCw-X|4VLj zIX^XR&r@>An9RUra?K{9XIiR-upiTwU}lhGOjss-BiY-+Wii8D8a=*aNAS$c8sQAm zG)UhRlC5>P+g>hMF9i#`y=vz5J>8+s4lezAJ5p`)cmvIDt+4gsQsZ zbe!|W2eh?~_K+PmO}SLXPv zMdJ;bY;lu7ab{_k0V6v|X0ASJOz2u!|46R3?=+e1a*^R|%dXRP%kII!`Cs>?%+~VX z=pUKgiR};z8fl2kIQO=I0rGl8X2$8M_(OJZ%nHi&XiPgy1LLwq!R)9Dds)JpTLXEez+d* z+^^4yo#>`rmK9<$t(-y@AeM+iaUFz*P&h-Zcs%YxnCqF3E)RInJhY0;piHL$5h7|WC%Z3;@E8p&Xr>~ zo)tSC_^W8lfufylY3Es5bZDn#$m0-QuX6^Q_o8 z1Ai55P@kc`H@q@6x+z{UT{&cp4uvbG!&&asE%Z&rnZH}%R9lskZTgU4v9M_bx07w< z+=V_DIi@+*=VG-unx-c!CXz)mRnCX~@wla?1h0oh`b^?s+6s$}KK9JPbTa)+E4_*F zn2BQI^(=(cJ{uwPF$W{;^ZR(p}efw|AHvIVT_QSvP zf772Gy|J+SyNB0b8@owCfM$Z2tG+S!zTtk>SkeUndSSslP!8oQ$}5Lnx|DaV0M6b# z=VCM(o_YPpkz2{3L>?pgvttV&_XB~M-x@B5ZJ;3V7XI>#hwD$uNG4U~`T(BlLs6>r zmFuCbSyNmOWvewsc|(KuG2}-bG$4M@V(eS4XR$}-|D?oC&u283V0>P&=xfgPEan{c zR-4Q9J--ac|2ZCKvY3snIC|wU*f0SOUWIwWTtOLPhVFn zR-d7s0p3L(A=Wj}@@;s|$mMgsWNfH3bRPPM;<>&tKf6z3gC8bP(Zf6e14E# z0ev4}c1|fA+e$vaMHA3j+kolO&Glf)D=n?|_CrcwpMJT8XYP?t-m{4QGjIRz&ja(UZj2l&^2uY-T?c1UH)(gAEarUjmLlRu!0eR< z00(r^2y3^U3Q) zL%0-}U3wL+Vgz{?LEZoiUU9#|(W>T?Hv#!Q5ttPN3O7>yJ_+2kHL%L-6^>J?eDbPL zQLh4XJ7zobnBOJ93~1c8%I{2IhPESb56JsE zFn4L(w&Xnk%;Oq2QhsT7-UepRi&bv7CGS9Bj?%c1z;x_@ynbNL+>X3GAn#IO zZr%ZTcLMXkcI446z68uacR=2_FJl#nACHmp%k<3vCZ=)QD!&vk>Fvm4fBP6PSMPwl z8-clfJM!2+p41qe$}v*^cn-K%cR=3wuNX<&mbWW#`)RB#zrOa?Y^%%9{&w6jc~w=@ za&R1P>vjOQCvYe20FLsqJAh+*{=^R8Xg|NY12~R9-`)Wn_5NfBaC-sw+z#N_&;Pyy zxC4RP?-Km+995;m>w~!J9l&w?$qd6`{K%RU62kBq{&;XY0tQwJRQvBSIG>B!VzLs(M!fP}T&y|5*D}Qo2;YbbZ1bI{NPVz69>M+nak8=bm~DdVf{WAD z!TNAZEZi7%j?_Gb+vEwSLdkSvuoh2dl!|fNgyRd2QQw-QzBNaEYu4gxx^bhvHJeiD zrW8DciYrTemYH0F&j3`pjQ6?@Ou%Ip<-Ij>4=*wt2_;zN*n3vh^`73?cw*GI=BRH?%$)G% zuWBBLc$-HkG3r|r&pM`g%VgBI=BRJYQQw+5zD4K58HKVRqrNpqeQS>T)*SV%IqF-p zAuj7Hexf!-PaqmF5yxj>@WT*{i~A$4ie#lmlvxl63ZD)yUV=qkq``+Vs{juMH;q#* z2{>M%hc?PF^MAoa@X=XAvLTkj_h(_e2&y1v5g?FoB9v}IYI)n4-?KPQeIm@y)#NUd zB?lBaqFqJquF+!@S$$v&uTyfDl41%}#Her0QQw+uEA%Nj>RVHl!>Dh~QQw-8h9&9P zsBg_W@p|$9tZz+zCO_&I#!SiSoO>WJU8capP3T_@1Q4ijmw^l4n&;N6>2-U5j z*Igz%qpgN6crDkx1#Zgd+1zx-zoI1dT*>26bGYM7mih<|GMTqrmzabv)A?1dxmNVF z4M-c{%%#m2B`NF9_P4cmW|*#j!Jp=T(t+lGi^oiFSt=)Us6TwguiF4W)P=9){}yMO zwD2eTs+W$tm{@6%y199rMS9$Ii^IsVIemKs-<$r{)qyqyXNy$B)hWxw`rc&wT%%Le z4wt6{v2Ohmx?0zDbm^4-+m1Im&uI2#UVJ`2hb+m8z`D8T6fvKNPR^~a*$r=fC-BHE zfoEOH&F=qV$DPdjW2Q+cQ=&Xij(YTLN{J8LlYI@Yt+S_Jy4&`heX^_Wm{(6$!u4pD z*s>#)j0cyb)qW&u>yS>Z|Fn$sKX#t|(f{NDuPk|N?frk@0hC>rWszGH9DsZAdH$N# zbSE6yOVzBhul+ht=ay2Nae@f?doOw74O44f|g8;(X< zqxp9q;HdjAxFDqwWeQQxb$GJgB4(^Z=cd1{ucxz<8KFL!E8IrNu~?j)px&Ky&x#e= z?=?U5OvO%&q#NkQ`l1Y}yg)*z~_su#rYh{lMSCVq}Ct$&D&#Nm-!n7GR zanUL`uk~B4zRU`2YO;#@X)>-ra{X;el9l5kmW|Z6)d5Sc9L?un_Zj;t${Pw%L7Nxp)s-h>G2|~OG&KMWN1LrHC=*RW3Yhu#thiJj%3*?Sa;rr=65d3rbH{3PIG4h@!-t%`4^pJd<0h;kt!gY z>vo@P6I3!&OHu-0(a~vbTzRc!W1xkhv-ETlNo2go)jlsh?(mt?T;H^WyuzN#Efe_- z-pEdASssL@HJ0LzM*29*^LlewRYL3I-_I%$vZy`a0@PdK=@G)EQ+1n=W_QId9 z|J3JxQFiT&uG26k2>r5k6F1E~I#GGcJ$t0K++Vx5(T1Giju)q%;2k2&n? z&0l+Wwd1@d^qTs%y?(#=ts{2s-TT=yXaDt1IE{dU(m=<-mpt2c?29M8`}||4oxj(Y z);P{5g}(0>+qazc)(L0-^Vr(!zj@90_Z;UbpJN@{ve55L&OIh{ za`8XM%zozho$kJJt>fG%^n(2_-E+Si4xQNWQrQ);7iTYklLn!G{iTO8h2MGM%3G(M z{z}a~e>e&bM&Kc#G%)$Lv0qzx{b$-9Xm?(_X8&?{9~lsOeqX*@=vCnZd82LX%Pwu} z!5*T0+4NfWfN85fxIo+lgnRxELy}2aSEj42cYV751Ip~@Zbt1(m$&w3vi}mTjB$=$P{cuX}zs$|B6xLeKrasiN;@yRw4^v`)w!Nb#4YAm@@57XfT7}>b zLt_8>{-yocrsxC8(p>>FOmXWEX*EYL?Sk+*vzE4ZV6D`i>0L^PkxTpg+Li)_?NW@# zk`LSUv-mHeBP05L?!{P4kI%ov^?2uJ`V78+H!iIxif+tSl()bwaCvO#uhF45qC-zc z&v`Uku;BnFdd}8tVQ@pa6RF%B+>|WXw6Nesh;Yu?oIN5AAHr3YkH$BJE9OOq9@si% zDwH6iF1l$7F}D_BI1}{C*~q#0SB7` zVg8HRa90=kSytg=L14rLlSfCwO&8Ip)oB%QzcWs5-K!O186nV+gIoyU<+ zUaRal&JXqVCLM3Cjq9afBi`fx{5lO|!1lySV5J!N@d0OW4_pTk?t>6n9xO)~LU<6u zFhaUatU-7zLX`Ai6GAkf!4(M6Dh5{}gxo>azzGP?LfC-ta|lxi*{qro-iWXT;TD98 z5#EPz2|~8-6A>PP@MQdy7jm8zJ6)EBsj0*kJM3EuM@?4ns$n%ooZ>_mbNpRrsCa2 zpA|cMTG~FAcBrKtX=(EW?fVVTr<$Z7 zWE$DLktax1$8t0)p0(-bbqdZ^^WvHE(ynOiZ;Ez{J{#}cVQC!f_GpQo^~!W~dHDKA zgcGg2JG$}gigKa+EmC=Zbkl`J(2wyB`yvowMy30rn;I+1?Z71?9^-FA`9RvkFY+Qf zG>)$I%Wq>ngol0{-n8(HlF~p)nNw04D=jIDmX?$T%S+0t%5gm%*VA!bh3hI@Cvly` z^)g&9ixu1jQg5u_eo$YFZFn&-@crmeZBca7`4#0To%qm?KUBe`A{fd3Fr-E|{0Yh3 zR2_&8A+;>q$_I7%TvCzb^;vhb64F~>yJgi|NZLYxZ+wWV?DY(=EF= zvsbtS>j5%YaojurS}{BYIMTg1iRYe?j&|5P(lNud)ExI;lwlG3T@K)mFZ)>ORjLQez&xI>143g`a5$KfjqDl?G?NG3S)l|u}5>unae zJMH|kIa>Cuh~TwKsN=k#uai3dPF$PqD^_V51C~E~G~5U}OEvu!^kkOKYY15ouOqBO z_y)pegl{2iL--EDyAZyMa4*P!|J}h}gnvWG`usaW4mj=jDT~0fVwuP(8e58@oojKQ zva~N)8Xb5l-1jW)2bQ+Q((bi1`tnvfmg%!%r_<7yN+s_MOJnO)G?t0trH5=qiw zgK}Pi0@($CX5O7z?t`dUPRpJ^D2{RXT|08i&NIc_ZW|xxnGNQhK2GoeJkv#1v^pl( z2FqFRzcWCvMbbR5`T8bkoa!i|*6f)oP1WiduzZ*x?^v=9ErxOHb<0_XbJcQqR_v_C zU!IMZsU6RXozLPg&&E4!FFY%D*h+Xd-eD`@S+O$gbxa2nzYiS8A4w}n=qqK=p6e&~W-j5ONaKi?9vhYJ?pKQHO)w2w^w}S>suRG@cw#RTtn{u|wmnXr213*jZ<3 zXIL83qHy$(t9Y-qv~O72J(l)UOZ%0jJ!NT}KP!1`ZA#vGmUh0SRi&C+g3Y*HvDn+2 z!dT`j3yS*y(VNMT??sQHS&;b~ZY+dL%EA>Dv7y(|^>{i<^`)W4idl8& zPX)n^yA8#0O9S^6#%wI%eTO3St78xUF+16><)Z5FyEYa?fr{Ebw&Cu@!Bf(woU}zI zjYw>vlY-I){0f~5@z>v>4uVmN5j`r*-iD#$eHOW>N7rjCI0&dYJZF3V?bMNU@-fFXIvgjtMpk|4uEqjh7q zT`9DKeO=qzo603#{^+h9#f9nGgE$}FwOKhiUHdbZB;_>;UHeOxq{@V2+2xj|^KEPZ z^MiE}@1V>tI{_#jmsuMiTcGtSs*1v28iDZ$+ch0?;X$^Yvk$75q_Lv;wWi;klF>g<3+R6G1 z`LHyYN3DYowOWOjy_09f&aswOWofdG)Hh8>8rGvjf5UCmA8|~V0X;l)PwtqWt!Vd; z=0j&!JP3SzQ=$|j_#d-zK<@Y>95_tk{f+ZWR#Tp*e!P@K42u zUaH*6u8`dS=-?gf7nP4jhVG73ZjDsFBQ1GFcw^@C>=DVjO;;B|M&+Zip$FCAe9q>Q zvq_Q;HB|T4;MRLLyjN24iTfaDDDn?^6oH|AI@ymMipW?$4}@7mks=QHqM-7f`IR5v zFWPnwX9Clsn<6?1 zS|L2}BiHy9%IK*K#0|Js2I5|vaV}ZtypO;2a#jvL4mnss;7sxM;7l7Aobg_Bq4PzY zu?ZDAH{h&K&IZw-4R1mf^A-` z@hjpghEt+RAYX?cdp`HLRJ4H5IIrUDiL0F?&bVUYn{Al)(WsHkve^qan|Obew)6A& zeFMLG{AliJOWA(RG0&XXn@`gbYiCh7_uEp=kIn;C&7xGf)0i?j)|hh1#Dp+y+Te0_ zl+n6qUwQoxef>+hKBa6wN!L!2R>pIf=b`YYh+ew6DFDsftdb5RC~nWF%=2Ejrj6q9 zX_#Fm1zl%wCc-ZxWZV7t7Tr;Z3k?u=kjOd? z-~I0-=KG4t%$3~4=g_eT5Op*JreT(v_vr&3so`*+vnxA!h^)=G`Sig&Z2vHxJ}}|i zd-||c=f*sJFb3T`eORO8y-y!{b^aN!9+LQt$9cP^zYjymx*0RZ89W4GA;NhG$09rq zAs*ij(!>=bd>i3-ge+A&%pGLGO+?724@rEwThw07uMysPwCF>mZ?8e6Tx;XZ(-v9&7NC6;!%rA3GE zJajQ$3F!zON`(S7$9b;NG?eIQc#yue`^?mdT=ISOg$cKsEBn}5AUGJ-Z|$c zARv*e9;`enHzTBD>|1?kHC^M?hhCXv=NbES#kz5x0ZpsKP;Bb-pVf4Q{=A#QX+_9`k4T zoRY0uQ5(+>WU*jT84a6^9*T?>Nk$thD&mJfqOv)mEO_`MCY$%0Y;M-s9QX2FlFi65 z_nfi6DqWk4?5Vjq2yT_<7!^`glIY;jFIi8x7prOsC+4Lv6vH{CSk$mG$}4}3RQ{IL zu?rG@+ZYs!Dy*$rV#oaEjNiFW+BdP`86(fz9&DMo?J*s)q8%ClY<5 zM12V>o?uyLARzYuF;ALkm)TynGyon}zMIz1&>fJVbI!Psg~W#}RB$ z1T=XB=t33&+~ruFWC<#}zBeN&pNz{3gcJ@;aQ=dn2FoU+NuMvYd1K(u6|3?X9+vNm zR}W4s8wWbqZ2ThZ)1Hv$)%bB8$1Y=zspiD4<2EDKtmDcN%MSq)0h3q0TEL_#s>#4a z=M?=KoLXgZ6~^I;$AjSKH3wuK_v`D;`r5>IOARW#`y6bUMv;?knNrxRc|(c^)?9;Z z-xngRLikyP5rm&d$ToKoLiSS(vV-R!yaFN1?ka>_+gywAD+q5ucoRZ2@xf;heiz}N z5Z;XNErdTnI2Ag1JsTm0>cOKC{tzJ_qx=}*NeF*}kS*;Vgj|t4h!D5oore(OHoJ2@ z!p|V2zN-*Y-$Mw0fe>prT9UzM5I&9&Qw_P^8{w~U&0E#aB0L!3?-9;K_&mb72$9x7 z_6g>53BoH7o`LYs2sa>n4Ix)5uOqxz)7fX<#`O`%---CCX$;Sb<$jN%vGf#ey~TaZ z(ol|?_c}{sIV#>;Ebad=_vV37R@dM7Gg%-6Fo}XJq6`=iP%sd77c!ZdWCkXgF_REh zhmZv#AqiOkmDXt7XvAG>U2)e|ty){LY7GU&tzWl(-CL=(ibXA;RjdoY&*$9x+<9ga zl=toX$M1nB_dMsGd+vJ9J@?%EJo9IRqq(j4q3oKD%3k5v)++6OgG)nuC|rhyGOe)& zH^Jc8AByf&gR3*RGYsx-gZq`i?KHR#4DJhq+i!3eqRmtuKhsdAb*;f&Z*X@R+%FC8 zcLs+UPPk-R&lnuFH#uioI}PpwgTvag^OL;J$6iE9U^2YbHb(m>)ugV@32@SXRT&?h zw=2rd?Rks0v4cx-$4{0#fv05G+bO_NGf3fG`x)mFH|Z7?_vZiRco;9fR34tU0@ z(;!35&QSqM>9nNJ&&?CeTa*EDIm2=Og6+}`biF|fFHa(AISvA`*-nswV_)}5m z{_o>YGduTx6Mve}x&J`?X+-D#@8VB~b?$fB#&(t;{`A4f(DAlG0PBBgNPXszrXid9 zAUk5?ka#6-b?&fQAWj>~&0PhkO>j`dT5_OBsf3Z@KluAsf!JDq6X-}lRA*^cE})MD zngWPZNSeih(13yQ2?(kfP$i(x1*!tHLLfS`S_DeNU#MzpCKN!jNylj<7jd-+%ai03 z-i1S!(c{1aDo5PiaTz^MOsJF5ye_%ZZ z0fYVsF=`@srcpz7@SH)32(J>9oD#^x=F}m|7p*_rBMGS^cqmd;&*3wN2_xOWnV+^H z&*iWo=ph+|1O?fIQSj=P`sTL!rbhh4mO8$?j}bU1JOB!0IPP({r{nhFF2hYas*vx6 zZUry{&=dpk8!7{!$Ohod)BrexGV$ieP!5yv8*^gZOe)| zC8{}ER&+HuImy^M%13Uu8Fl3U>I|Jaa#y?%+~pS?IUKlmH6CMGydh{s z(S@+2<)Jj?%7hlx&4tZ*bQd-1P?csKGsMaPJ%3hX#i_YJRMN z%44FzO*Xiw!BO@V-Ps0rj=@cZ%&YQI`W0Qs;35X6yf#CV_F^A|w}yi&Ykcz-=RD)j z3w3>sH@pH}&*N>cV3zMCxHi-lX{c+DcqP6`D|?8bI))?&U6w&!zS)(IaXRWAuh=%D({ z9N+hMJq_OpJXTUPgeb6pp06(Qp%rjtv}Nw-d=@Yt16{A7@`2;uz_xYPqprG*=Vwy) z2Q~#$>fjvuB!rjgW(GEOUJPWYYX=|mp8EJZ`g7b!?&*B-fN$f5+;QN6jcK>P>qXm6 z<4Lo*p-n|;p|010T`!j$|8mx&DRrKW=N}%B49X;f-F61|FavT23*ngms^+O$v8&`p zJxg{~Yz}q3uo1h>sU_bcz@D&``uxW7Tpu1noW=`mS4^O5n{&sQQzu6drp|~bYh3Fd zhf9Uq#$!+;wn`e#vf*_g+-c%lR5RvJ@f;T1#rXTCKr~E>1;X-2zmE4fprGKMHxTDd zS}AEVTdLTh$VuU#Lv)H6fC5722Xux&Eb)ASwgM^_C>ye(py7b1zffjC%1KiWs6}v8 z=X-I#2TZQDvEu+q+chK zZl%j5Z28gvr$NObzNU7%^-mTKG#^eD4zp7@ukwQzs03UsGHVv#!M4fc4iFZF$8N&7 zE$cgB6f{{6O`Of`t>h3$hoH(9W>x#dT?9{DgIbo`%f#n^2Rj^gx6IE=aAz1C z9g~XgB7Em;LbL82Gxc3b13xnHlaBz`~>pTTbjCXXi^Iv_;1%C zPS1EPeB3s=1!yj(%X`o(0L5J+x8rG6k{5lvP^e`Wzt*L$4thp#7)hKV9_bRh&6NMTp%?Vt(0a#0 zmWThpY3PxdY~dm$Hm zEUN<}S-pk{XNLOVz&ut-u2EvduqHI6?hvjrv6E-qg2)rHZcT>iADP!wwN+_5$`&^D zqS0xFyYiCo%Ym@O>V=0JAopK3Bebs!8!*-h+lyWTO8$d@SzROfv^iK}+D>p1RLfgN z-9WJT+Ag7~@+?p+Dri_#CUfJF#W61((0b=(UOL!^hlrrmANC2`p)W$8#!p0}vY$>w zI1S+xgkgk$IA!J|9Mo4W$<6CJOLYd+kRk&q37B5n2sJ{$;MYqx5HW@m$ zic0&4!M$N{?-(4H6N-*jmEw09>Z5QRg$hS)rEvEd+^`t~t+8$ITVrefW{sV?6Ap;C zt)Y94+&Spw!@IL}BXwgMaf36=5;_6AM7{E}|{1ilfHwbRnuyiZ)wmv)4np2ml8bGliCL4FW9d5yseVqkBl}$n9 zb*tcpP3Uipm^uZ{r*T&Hp2KzycsaA%Sw^<+2vElPzTjxzvkhMbk?-A#uk_b(=&!Np zuhFKzde-@2(A(Dr0IHk{BES0uH*6%%a7}&Q8t8h)>eH;~-55)Wb-vnBwx1YY3L>xH zC|*aUTK&MsZaeZBfS7n4uW|6<;#`$ULFDt8;v;1mf-(&h`r)HO#NCU1tRw@$!Csjk~U)YDKG6+)~xNvc9_2 z%_G+C#-=v6`IQJm*<6JKe6>76kVsuuRo?)&dyxe0wkG$wmio3@0xh*G@ZsH-Gc9k^ z>gIN&1O}h5YH35brd^!%VvWvr#}nfVZSJ*vEk}wn+dZb$>Or%ny|(2{#LJNhw=WX3 zN#v}eo97JOJpArn-QL>fUS8{-GHtq*pZ|i#vbqbYfgQa$tQas{At?`SJiFRZ*+Y>{Q9l)A0Ae12u0#b@{5^Y-;$uibOR$2*r5KegxH>;E$K^Fe1!nYDS`%wvbYI=E%P zO=nI&a!3D}Y2GPQ``)=?bkVjswMUizd{5on8`@9^JV)UP?^`VXF~Jg2&I zdtm>_*FXOK2UG9-*XviO-1fqn_wKr>=78?mMy&bi(eEBLyW_mQo-KcU>y_a{-&*&t{E`3o>7{Gu zU0dnxzy0(ZR=D5(WBrZmJ~}O@cHryJ?Jm0e=!XY(?T(E6b;YLDv+|z$bKNEByPuhH zXWc*dz5aRI_1V80`19iRd(XJ=shoeFy!4!1owrV&xTm^l%?JIeju`XAjP6C_TP9p` z(}7nPPu}$KClfDTv1i=pH~)LQ>%5oueRu1X$A4H{9J~ASse|u3`)@ZFeLrmK z2VVyZ2mF5ScV9gC=BBgnU-tNKtg}zes~lYHy=MJ4cdhy^{6^swz6*z@eR^Qew1L?h z?!4lO_h!HH#nL~(Y*AN1H3Vx?ea(*cG}nOx)E@d=_AO%0P)*TA0w z&$Q4?s-fYyww64oZc|-L2_{^VYVZ~16}eF&nKIS2(yyR6*(CnRR_*Op&dU98 zS50a7Uh#JFq2#5y27q)dAYQ4m1@7dNPOOXEcugui{>q+wFlm5hC;k%RmEMC7t-w?l zXC*?TPQDeDU|pT%p$<)TeG4>g0bYH3@L_FGX8e`ZU%YZfPd=GKvjhZ$c=hYSr$4Z% zE?OCEh1YJ|4#O|GJj@040{U=3y!!XxGZ5HR*Dd^ud-k{|=k?@sn9$sZ8qB(K2D_-x*$x=1%6r+N8R84l5TB zubduyX#S_VIQz3#HVuCLn4WytOXv&K%kD3pFGrs`#^GS0;n}MpfY#l2@|!*R94Ryf z=!gk`cn$8shpAItv`<-^bIOlKv6AaGRA{n+w)=fZ4?e?$hL$l~D*C{xr+V@kE;Lio zKIF)2SPwo&0h{Wg)xjEGnYMLWPd@DJRM(%uX9^%*NA=)yG_a{I+9F_OZS(#8>7IPh z^q|>;zqWiG-Gk3ap|SZad*<-so_yRr_>AnqXOz&~iNBPKiqW}PswKDcXrb8;v@I8- zgb&b?iXku7C_Xj_E6lM3^`$T~>_>zOqYXX5D@=V4n)V);3wmJg=z&3pn@e$i*F4*~ zf7t^wfQ_Ipl?t26=1Q@u<@>WX!i`$sd+oLMvt<#3O&@-wRwIewRbcqonCc!Fx@UO} z7CwY-)|g=i^IMG>VlXdjOsc``)tGdH$y9}aX0vnWi|oAm84R7{yapOfy~gAi%=sFV zWiU5uOkac9qA^Dp%&Qus+J|}Y%$mCF^3YYAi0KE3O2oK(V5aoI@Cy?3so1jpwLX!2+S!OV}z13b|N3n4uUb| zp&m=bP$TuRCao725?~z9z@3WKwbCfp%$Vj?dY*Al>lPCl3+6i=PjYdNQZqhDj@j_1 zOXI0N(5ZwbA+Ir#iW=C3d)R`7W0elagOx(nhD&G?@)`?lJg>X1yrd?cYLreTGzobf zC#g73^6IQU>B+geD;`&a3gfCgq)jNhw{iuLFC;emMsrKtsLX(i!L`lW@mi_go;Y)8(HWD7J;ku|olaSXW#K!Bj^sdcc##0sQ zR6>)G7p63%%Ee#ibwW-)zO`?+M!g1vCLu3MXFRX}jXZvCJk=#SmCz*QMd?g+*==}2 zLX(i! z$q9M=<_sNiu4O+sF$0vm5b<`qu`x29Y|W63#h zg^<4~)})rW4xa;DTx*@QZ~1O$VNE?p^C3-Qssc%6uXX{RP?D$*pT@<=Mq zn7sPl_C_q8>K8f{X%bTv0+Wh!HR`(Z!(ZPUPsOjG^CC@RDlaffx*0#_x+7nXr`oMk zktQ*fPg2>o^MPwVbL4f5?jq78rt(Xw!T8IoK6)zDyxkgpor*MxsfvJ!moW7gw|pH> z)vQyICNWj9q~bb=*Db-8N8+jO(5Xn1m?{8_(yL7MM$N4-0qhd~S*IdRVyd8|I+jUr zO}b!hb3D~y{S=loiK*rSlj^clJ-O8TU_4bory@;as(F%1PeN9DYu%^uRGm5%X%bU~ z5>oB^YFsp)>MEUzG^(z*YYY&;#OfN_;OMR46EAR9o}6+%mEcZwEg_h2O{!kG3O@iK zxKjMZYTa%~L-$+c6N}ZaZjO27G?~v^sh@ptg|^lDy!sJm41Dr4YTl~m)?{4#ZF0p6 zN5BKIOR+1u4X3nj$_8?iH?yH9Zu zjK8G?Z(~YPyepgV3yw)yaYqB6HZ)jWHV+rv3ETuDd3st}s?OAOQT(!3TVW((zxQd5 z3?!b^?Cr>o6K8UY6-U)?khOSM)>f~A)V0>)w0(WsnXzgj@XIDmtLkg5-1f$G7+txl zjeCruTv-PlG}f88=U8(l?j_clxc3*doD2>^;bamYdCuXbq{PYU2kD#)?LiVxz#;8q zbr6alW?}~R4|9r>9fX}@tQ~}tlj6si9IRf3N77i)dH`(`7odX_!$HtnDH3F`Hx`Km zn#F4UDMhV4ymO|>4zHmo zoLk_Z8x9ot0)YbT`p%iAwteSJ+{cZfOZ&W)57i2j(9KWCaVv({SFb}e_MRsG{BeJEX^&|4ZV?meY! zRWp(7RnM8`OzAK7`y)kxqIgP?925{6*l1nsU?U~Au;)x$4yXWHoi5#isgtXh=i@TZ zQ>yXHlX-awT3_k=6Q|_Qa67Ka(`QYYF=OiF{5%H|;N-l#>C>mX-BV}gO`jrB%Q9;& zTx#um;2$+_U5BH4^jzR_ZXNP@DefEXRSXflGP7-?6Nan0+OR758g#46)H6-u0xP@F zxpl*st+=lN&3v7bR=hhqZ<%x3j&$4%xC=BlSMW(~oD^jDYz(+{9Zxal~p*azFf!-%8#39_k!lPdZBP6$a~|*_P?UmvVMV^ z7mCqq`R)V$cF=_DNTs%AdgJ#D;?{xYlodiI2X=a^FORnU1vDG$6&;6IZ~U-!vj(4m zZwKS%MY`VjJqvz0t8nD4LC6l;AD@D5(`w5)t4Y!IKM22j(0;o>b9sxRYJ>KX&OVJe^gx>=2JN+k?^}C-cx;_Yc z3NL`~8pbqn>yZ zG;2>dPu z&GkRRkNv&{G&>K0-#yCfo7(r z`=R<4f~GW?pTh~uoY;O1nnvY}ac>nAIGwe`Q_pTlro#s#lj%l*?xI7WI|6j~90DCT zN*+H1I_mc~4uS3%(Cs}0I<`yJRruq$3VNw8-O3{mfo=%sW*!0^$4mGS=#Bv0;zOY0 zeA{@4bQ=zVj_vZZL!e{6*B>I?J%>O?`{#FuK$iu&7Y~7s~-B{3VJp{VrLHE%i(2WP(;n(1gOp`s$$Y~j4v3C zc*?y2yw|TH(shJ4>%ApeK&)tFaZO!Eh-~hW5?LkUsT#V_u)%8ldSD^(O5n^7q$ zsx(|`$FS`fld57kc!OT)oKGc(`JS>^#9tOHMNBC=hoxtX%VLZsXHyZGB1mr-#4&uCQ|^x~m^nQb z^_R`}mq}B8EWCXFs8>cDs^AylBHm>gJgd$JX${8VGfs9IlvtuDlZ;A@M^UW3;gX2u z)^Ta^xL`>n6!ZqmJ&{PbaITDt0q826FkTpqRR&8ZPd7N1jl&tdY;Yo7ir`8-UJrphjaw_>y!8?2h;eVIAZ0VVtf)tm8b6yl1r1u zib9^^C{D)r%{d?)?eV!0RBsM=BLg(Y9Ta`sZ9g>q3h0DDD z81!U0q)>W;s>!31W;pBf<4Mus(Qr|D%j-#3Txsm}N^SSx5WAsC|x(wqc^{$k{VjtGUJOQBXwVbYysHU%CGF z2@!P*OVrm%l#n4O4aiw(c@)D|5ob7wW#SBlkgJ1oyr%5uq;%x%Af*k;5@b3_E28A* z@do@pZ#c5h8m)=?JBgxT2(mK&X%&9V$DAF=Xn>PO>?f%9`B2`XAMF+%=%lj8RGf?& zi_8vll1YI$Fgal2wAAsW&2rL88%7tFqWGA2WMZ-lnC+xP9TKVR_Q-Kk3Ac)f83446 zndRY5A{B3UzfE$4lLWarxY$_@a*{w+%ER7pNVlBW$;@i7lL!lgFxy_H4#pnojD_$7 zi-LY%&t|np&=4oN%8B+@C=?2NRb$Z-AmgDSBi|8DO3`FqPpL8`%Y(Eh z?BRB_lQ5_iYkUaNEFr&RoMcKZaAjr`$4F;8pwW!Hvw3EUc4$lkvVX0zzu+_z}i3BAP7`3rT7*^y$P5^$GENV-HHHYGbrbw%EgXj z*5eOK81j3f0kL#QH{qakRKLY#SRRI8xbprA~T(wkU)?hi3Pa4C^Nk=(HS2_ zt8(Vj-DY}Yl5V_7PGab$XfR4?=s|CH^@&dUMCQ>LBsN@$KD38co|9PAr8ZA3JNwBA z6g?!-)~;x1)z?#;^fKIG6+}XwU};G(S|Y1vTN&g#Nh1}7p8J%l zo`s1T-PY98oRraMsA55^)HA;jN@|{739zrHCs4_PE@lg6Ja?`eNIfHgx-=7D*=7UUW!o1(tQP ze4@R^wDxL4V&Tq4$YC~FTA*eixO0asAcva)<7 zjlEn@MM0BtUCRi2Z6FartVLj9O0d6}XUTNcY? zYE)9$3j(29;46z^{9yHH#)iEbka&9~2jL%*_6{I zK{o<%X$t3+VGyN}4euj6f|2-1Rwe**$}g-re;LM{U)(c{@8gV@PA0am!lJ$CouY7a zF;P~bc-wW#&>4qIr0|pvChn)uwl~z2Gcyq%qbpdtn~C}-MHZELiiIl$dM^m@Y1@(z z+lk3yc7xFs&sbMNtTd0EFeM=hdR5p`6EIZ5l?WB}SJk4-sS16Jp>VWq0hB zqC`Ap7#UcB!MzF{8eF8dS{R8PD2Xg83t|l%T4++iJ0}t7zY0;cRD?E5Y&}V&76WlI z%UB^xY&uD#DLcD|5!i5&2y7<=puRYgiN;2gphfjyL`E?^z;W-(vIUsU?M(TYCy9xtsG(0dR9`Op2 z`Y;yNs zHm!)+zroC9!TD3R5YuubsHb9xqhHhz<5P4z=jT|sC`R)*ru_LL0;EaRG}tAP3dH1+OSe8Hc%H{Z7M`y#;D$4gRKz0M5v}=Wov;$L&S@v8<=D4 zRL#rLsqE~dG+J?1LuLfJHK9@a`oDxsk=a^5hx$k11nSDsrhPKUTb@_oFxrc2`# zhk;_WNV-p!I3w{qMCZ#6QcdIN8nUd^#Z449yIi@TnB9{FninEvFA7CYcCgiaK^`Rt zmsUbKX5@sCFtOd^WgUX}LBbf#>g+QXdLANrlWNfzl)%dpn<~zhN@6sWxGx{OG+e0> z!4744r9V039@oui7nZokRQV+pw)e52m63D5rsG;YSd6nBs`pF_VouM<`Sn4FU|M-f zqLrAgGIE{PJC^DkL|d-8xiLkATG4-7_ntqgk8sgrfNHb=8)pGj&-+vy9XP z>sB=2)lF}EOG|AdU#utJ+<06`)v8(@36mlt=bxA=1I3{-FHEkCoJ9$_fRC@Xxou@( zJEpr9ne9>`Rk}5r8u>Lo!DfOv0cFwse$*qK+W5+R9n?-U$m zWSLepG`HZ}XuX%nZb7z^qrA~|Rn4l_t-@ec+1ZnG$@@up7EN>4=08JxtR&zyB3)4{sQ(20pm85uxiS$Qbt#af7KDEPY6+OyZ5 z^ENd!wdkH>-77U~)qBoiz~rOi8OKMD-8k&7TVORx7q6&oV|!NB;M=0Dt#$2m zU_3_gm5bUCzVh6PRYgXQ8^tURwJ+xfFUTxSQ$n28$VEl5IIs&wTc*`HMpU#65jI9G zk|%0DF^G>MSGF#*c+4JxP&>7a{9=ZAEt$iR<=q!=Q=?Q`Mcr(*6XO>QsXDc?u*dHW zjwYsH7GtYOGN$O*V?wDa=YXIF<>*#}o3uyATP$htu+?n*@GKkrr1s@uR(=;PT%K`KUl)5PCkX6IzE_v>HRt?x+{+7Gt%bQ6y7FW+DN#PylltJA&G>S8XA~_Y6{U zE{521Y?;YA$Cr4MPYRwqPBksI4utE(DnSzy{s|A`m4 zytZX^eItGuPP&Kh478)|n%i1pZP*USx=a;F4G3}kD@#gEw>T2(m~W@qmC{3$^DQfT zO*}h{eDzrsc0>;7=dXfBQ8EkhX|8Q)tFLX9xq%W<91?+WRv2yHiXV1n|FSxqMHD5= z?bNl-@iH4F;CRuhR$6d?su|6U)A%uY^%Wi|@L@?6;aou_vM8Zt`EovsKtbz+3`EfM z2$88Tv5)EzRbO`|Q_$jOp;=_SAD||`wVHVin!#p^uLNrORUZ$K@teqYHBTq%lF(B? zz7$y*?amRMEbCFU5AZz75{Ao5#uU%N zI#0-oyN$#diV0UjkgEAI(esc#7?6gijYaUl(+a^EhqKtyq#Zy6^@lFR*rl4}0L3Sf z&ZDCL`xhv3o*H#3V=+v5+ShSXw#Qjtb*h%S?M)`v*!VNxoDDb*rP<;2is3wwIH*oVGKZ{iDAEpmL31l>Yrt2jFp%}PsrWT4 zv23}igEDXxw{&}o}4cf3wrTwkzgZ!BBG%oh7Vdy zmXX>F^C<8GmnMwg>IQtUiDjqid=**BQC%5)^a0WXPk$s_fYRtM z2?aESt-AQ)jwqKVG*FT;s%UW9ogcS2smD&mXhqAEM2n?DT&A%9)~=f0R9{on-dHWJR+d5}7h4}uy?j3r zSoB;H|`vmi|8;eH6f+SOvxdC)*jiC~H??YLju>SY2xyf|3mgEO9H7{1Q#R zK%B+2M5~&sme=D;V4U{oP`O)EcxukTXJ1eb*ve&aDf`zKHMKx?MFQ$|+u%pT@c}P3 z3pH&6YiAEUl#k<+23G(&5AQexixx^1WPIw^o!B3%kjz(E5-SW1g4WKut?&I}En^YF}+#J(^tvP5eqS(m7?vz*xV9A;&S%hS(F8 z@woy~X8K?=7oeF#5igsWTIm!OFB(t^O?$t{gKcD({G`v}kcwibu3VHBl_vN(H6~kx zzkloKRcR5H5mTbp>QZc-xi=uJ+2bfmB_27&*pq%8fBHt7%X+@$u;uToLTJS~Px)xk zT|*s#?<9#;M!Ii+hqXkXlMD;4c>&b|msylt{Dt=I~wgvW>J(hYik0?{KFc3o# z>WZ;=;zajj^Bjk{T^TilG&f1{>~S)Gm7S?H)Kb(eU{C2W8DablcM1u-(Vf5`4B^_xX(_)gs@j@^}+Y6U4ngg-N9 z7f%Y}MnP~a2S++fW$NKe1Lzs`)_}~2kJ=p9tyYs_VMBXMVeLu?nG!VVe`@OrHMF>N zpjKuxb3C1mPL%Pa+D}Rz1XIC@DKBe=U+R1y-%)3&X>rItZdhKVl1{k> zZfT$+c(<-x8nX?2LlJh1DD^8eW266~ZCra$KoA4ntn5E7yp9CIHVRM)dP3Cq4V78I z1q9#GqDJ5wTIQ`RY|lq!Akuv6VZE720VW9sEX@hN4u~?x-v>0RObi$4__<2I%=0fS z4C8e@kzh8usTem#!NjpAD%LV9X6qB`HfHZry!fIJ)i2L;ASL$GOCeImHAbIDY~2#Fv`kO0DoGTB9-{ zQ*mCev&E-c@jY23V{qxWR;{Qls&Bv|)4yJ_W}E1Bhj;~avfeEa=^u)Mk^?F;zI=!( z7l*=ycmpm1e{le>Z=qaKDOd-hLlOJPJR1@Up6i6S~E+`;gjqyDl+AN$C^&tAy-v4rS`~`0)@CUh-6jkJ$Ci zAQYWJCBSnbvh3gq8NKje(P_zrA{_4QY`)S8R`%&d6y6w4Qe4S;U;M0~IyX}@cj*a}{qzU)Vzx}H<_(rtgi%P49|9!z1 zC-iF`vGbg1`=7F`PXu2-_QsvnC+}MP)dzoGb;W^yx5qK0Fa0&=P!mYu3_zzvy$=1DCvW{ojK*$oF!= zzk2p-&mH*pWnY}xHFC&rE?JBw`jX|u&C87j$wPP;^86g(Uy;W0&Rzmbas})TH^yRZ zt9#t~nbXHFQG>MAJ+Hp4b;;zsCBeq(hW46TfRpkjP07ojI&)IqlJ@GBwk7aqVwpE- z<$uqq8ZH-bjH%xhiM9ThJX`59u354izn<6DTJv8rld7)9daLX3_2MS5*I3gGgtKCWYr=MI*Acti8DT zF|0mTD2J=;Pw{1wEqLy4?bT4GH39^W3(l>fO#Hm__Q1vk8G((>_@U{}PYME^%k}`d z7vU}|)U~y9*-p#T`P>0Kzlk55e(dA#@T+%&!Ndww@4ukCeQ;otJUx~Hm9vX@{M!0r z{Ot7aA$$rE=&Z?|shQN|=7H-o8#m;R)64=J@l(}-t~c$Usct{22gg9y3&MH#9f7WG zfvzRFkw8~l?gIS8ctLF2bYxSC8!z+Y?=i>~hf)FY!;@(iRbp76F8oz=*8);>n*k}h zdjLgn$A1X^3~&l0{Sf?CP*BM{gnKNMjJi71SFPov;s^T@Ie!ZiJIS%KdgVuAn&s)b;zJO}Z-QJyF2XO~qb&uN$$PL-KR z&9oAYxr4vRj4M^1nb#@u+=+Q=Q4YV;!cC4+5Hc)8$X~235E}Id1INDf@6)r{ShcXr zRBcwyR815)lBeTN&pBP5(~&WsXXU6;qsAO&PRx!bnaj~{Sx6-2=VpHjyn)Ofbc$qzee}~!iN#EFPZKH zgiNb`rkYTu)nst38p^cJF}O~H+iY;mMWubv;2tr!ZiCxyaPJx1-wp0x2FK}3@hd`K ztMbj&5ME?AxJ3q6XK)BbAJo%X3`DRk2~cB3@)XS;X1a-M9zfZoth8Lsdi^ z1GR(Yz5wA2g!l!$jsU`+BMc$D1R>k$QiS*}t93cTOA%g)@LGgdA-oRZwFudlOviD= z(V|40kP>l)V{sLZBCc>0afRD#a1?Qcd(hx0;tJPoa1?Qc+i7qg7~CF%`@-P(aa*S7 zZ_U$Crd4Thiw$mt!EpquJSgHSEk#`60vng)4y_EF`$+^X9Oz01Yb%hC`TqRe0>Ql9 z^>zNMflZg>7Nl90XA3)CM3~4>ZUHdB3r6bz%;b5n0(@DIc0b0GIe|@J1)3ec+;OD! zJjTBw_VE-mLFUVaWg(M)atcu~lEPtIgqVE@lf5!7x?Yk(1iDaC7Ciq&{d{9?GoR1h z&KkzHVT4*^Q2jJ(8lV-p)2w0xQHAh_mC{6qdj$F&{wk~BX+WbS?Tdhx;ZC#O#os!C zP%AO9_~Wg!ldOWhh#QIfW!#)L)umKM{I@TZlCVYAMGsR`i-@dAV&%#+r{!E>@*-B| zr;0b%W#K?YbxS?IW!BUvR8$P3h3Xl3=8#d>XwfWXkUD%{Ez-^!iyHu5i0=E)4 zr7xVtJ_0c;1&bDT>7orH63JPtu*)tMZ3He=c`XDvpDE_ND)lpkj+bpi>?14~^@sh^ zjT`o_*oFwKEl>k&+s6>jLI^9hgZVsxkiz~n!rvp@fsp-)?_7)8psG=7gHWc74~472 zv%)oNsJ}Fa!d+`{*BiRK4DOc(*M_!N{MKtI)1n|N+{FgRA7EBEjzpCQtQ(Dc(BKN9 z6ni`-i9Ik`k8V}+od?VN1kaWMz(Ic9BS;M(7oP*P^4}2&^E{ZkDVmc1oDybvas|4c zbv&k-$52=Irf6R(4)=koCQp<(1wd2qD{JLCr{7>~WH=*OUw^MT1Zr!+@ zl5<3g)xowLgpfM*NQA7`5QLP0p$IvJjzGxvJ{sW(2p8a1l0!&MxC%#Vg}c+x-D_|u zsJx=}wYusIJ@>^$>O_c`Epj+SrQ`b}8+A>`D6->Qn?)W6 zA!e+^-X_n>P+oP7{Xdk?GbP#oy?m+)aW-6uGK>N@Ol4AuEZ~|A4h27m5K|a<*+P1r zdNj{hBt74zpKT%Dhi9hN4SJ>2wC$Cgcl?1hmeYOAVT)d(~Vn7rSZ$q69lUeGXF;1GcmxbX9#6l8}L`*Iy3|i zU*{*|{Q1v?Hl=S#g9du_G0Sbc@H~%k)$Y&l2G(V;qR23LpMNeQD_6B@MI<74% zuw(1D2XGC38A@RH4Dj%5illCun`%=G6y660yN^Kpko;Fcv1x7}JGRe(!CR2fejIKC zIReO^E$9(zcS?RYoB-ptQBf#8H3U!ycN$j2HZ%oLmEh*!Z?!-^{9Pmvbs-hLatA6d z&3NX>P>TVD$KoD`n|2EoEpMK@%*A~QZk{Zop+3&$ml$GnWm+r6q~~@B z?S#RaVwJWNj!$}Cs-HJ&dfVRKs-J1g^5QW;Gjb`}_QiU3<3^8Lci`rQU!(89u(QS^ zr1@|>!pR6HA;jmGt;qAJvSrxiM%6aW zO)=!%AQu`WZAJ$P9REWZ`k0*i;#MOYL{<^*G@K={ak+p3f*X&&U*V!TizUcSK0PQBOQl` zjbjffYsAL6gl?SBrE5BuMLGx=uD<_=@|i8E;N6yz&64*DiQ>^y$}d$LFUqfxzYamE zKWwvZ+yim9;pP>l4>BRmaZB|?tWg$UVe zix9F;mLgn*a0x=n6MI_86QNA&CWE_GLz%K|qUe5Wa8Db$=M3&GgZqoYWuaSC+9NcS zX^k|vV-4;^gX5@DWeFG@7Xca<-}ee^Tt76lahbaUUn;8%Y`SMArZudd9|Wy)O>n_x z6oxD3lFiEc--TyE3_K45!?WcT3^l<8Hf_i)c-)QHz`6fo>xVX-lF^UBn9&13nf26+ z&hHOoolg(-x!)AvZ`OI#ZRdVd3V7X5u&gLphG&GnDisFU_IM6aju1v_R9IfC!Uc6I zT*AIV{IZoQtf^Pw%0?A7a50Ve<}*~-wpxYj*_Xbq8N0J(->&O_lw$F9?Sa>B97TQD1#v1w$fUpj1 z3wCZ#4|MKG3wG{EIrp0-Y^Y2B@I88`Ytv>B*dB$@rWFWp9EraTQkKy0Ek*-%g_Y=Oa1fD~?>fw;b$Cn@}Z<_g4}6$RY_h~`Ba zJw-{&r@g?OnxxkFduTI2|0F`r?&?yeKm~u}s&-!OnWZ=zsbBCM01c%?8E2wpkuwNM z*x5L`kDog~HK$sX4UTx@Qtg9X9$SS5z?i|lh1ZiwFyxpW#A#rRw+XVXt`Qzmo#fvK{9!r7cGaR0BEz{2{lb&zV&$bg1 z#QSh>mPG0g`@9<Z7Uqhsc>5j4(+CK zXfaKPHqyAi864YOrKJ=qepu#e9Dl7*;R@*e=|<6=S=o|n=N-A%Ap-j-SLa@i5YPAV8EYzSDSn=H&iT0lJSaOIA~^QpMgEDkR^ z?9%XcPJA*=paww265EQuO4V|>50%)BfM`3W$?j`Vpxf~Gae=nuuS)STAiv=D7~FS& z3I&$|US5H+0I3vQ-Ba~r2N@8Dc6`M~XWdMzh|+1UV&IO#(hl66h<#28=#qLsOqo zPb~w?T;NqgF2s-@a|pYb12xsr!0?&?ET7L%kJdQ-{0se@r=LI4&-wcK8~yCn&vd); z^6O_#guG71GtEz`IjSi8Vw-j2;V|4AG!iOFR(-I$Iyj}yN65GZ2sa^Igpgx2hLFl- z1wyXk>Jff{unFOp2-hG)Q(&gDI=Ej!{0Ru#5wefg@)>kBxRp91lqp+s3ioFnn`!OT zP=D(KgX1_-bj($y#T=(`X&TDJNktn+Wvu8pW2m$oWeS&Pa2#C*o9%-sUSq$a>j8nWykGEe;27{;dH`|^fb_T;8)p^PTQ{#Ce)7fTtHqN zSlN-D0mz57>5lYIkiw63Hh&;1b&(w>AL`(2G7op^gV#ep<{NWyFs@IUZEZ7LjfIUEdw+HP`PUfpq-$b zh_g{U(({0ugq@om>E8pl)N;9Yq_+Wgn{@)94}eQ`r2uL`b<Alf<#HwVx-uul`KTE$ixIxcS%jtdn9oo%3t40M%& zs5TTGZ4w3XuY#U3(2IbMmwc%TRO~wjqDWDZq*1c%KAjBzF*=xlJl#QFw2yX{|EJE7lSQ&I|Lx^$N@g72`{th@; zt&f1AKuNNNt-Q{IL|v+nYg2qo~I@~7bQI}NP4zS zWb!i})r&O|1NK`tZl_IqH-wRWc@IJs=w5_u5==khQN0f#n+|paegpdV# z7$KYH5rizzZxOOt9!1CkVXSqqNwAm{;ad(^2_KdsS8Z@u9cVhbG!)%BgX=W7iwy26gZsI`(G8-~-feKdF*r&uV>7K64en)w z!?CK)PnJ1-1#ra%HVs4q#~ND{*FhHe=chnpsZ)(+mCyYjrqSq)>D(IC%k$)@?t@1? zd+?~24<5x&4ICt|o$)AD#lXh&U2)vT^bR}(F6eF>Vi(=^TY&Il#)*eSw@+YWD0iIR zayKaWlZnsEf5)IgxicMbLA;eVrmKmhyFDw=<$HHr;J`Ly-u~C!Q+j0IHBd-RgKl<~ z`W}`nsn678)7`eR7giEySnZFq>Kd3B#f?wXl!;Lp@u-dI*_^eK3ZUk;?zZ0QB5|ew z+)&rKY)l{53oA7#_TDQzm$wDO8Oz8JMy`D%uXFpd#oPJ;t-Rzz0l`MG((qYL%PJ6P z4E{nj0XG?cw+cj?WuZVp{M{~48UD@@h%qX~GC(^7M=M6*Rs&LWZ3cHXpyzR?S?3uX z)v=jISr?P!(aAwcZyG>dKA+DV1$7_6H`} zVEhYkFiNcF5%M&Mx;h$~s%jDq#*t!;HFC$u;`Wall*xX^Wh%A&&4|NZb(T8$eqN;>&GUsx&$lK$KauqOM$+@Xq-S;)FFSuMa^$k} zhwo1=JO0+B_$QK{Ih*sc=|4$|?~5kqW%D1M^n6Ov^J)6o=C?X2{^F$P8TN!WhE+2$v%~0(n&<9Ez|O;fV;**|MLs4q+#r*CV_bVLQTW z^fOJZv+zvw3ajys=MbKckozeq#E9KuZq=_9xTA^ieZBCJMu zHNsYe*CMf}TZiT_EGPrdHcecS@WN=*u$9}8==l<3W26wl?{mS4THMqwO zZim6WU~q33+&c#Mk-_aYxUUTE8-t@zR!Lc?EeT~>ZiC}|p>VG3K2~;3KP!7`hLv45 zpc#Z*n3-!Opj3;RS3y*VErL@i`y(aX{4FZwR>as>Jph$bK}?C!58SYk>DIuhCt3qt z6RbXxBjz2KdW{fr!>vGEugG8Zhs!+0OF`uIQ^5^8Dit%(1S=&^QIgL9fN?%|s0jJH z3V#(J1(6RV&6Md<*Fe|LT&7H5l#SRpFWLb1)c`>8QV@ClOmM?y47A2>KgAl`cCt0L z<|J$E)YbIdbQqh)Ta1<#Yp#^X3k$ebLraycI;=mkZ97=CaZX72Pu`kiU%* z%YIT2Q$Y5?#hIcR82f4hpz=@#M|3j@5U9|^+P3-?- zN4wS-J_;fqxD~+r;fiBQn)bewbMXts;O};K1J(Rp8#>! z;jL*mUYnjcv*%F6OH)o#3{FKjrggS^OskbYDSy%ow`AbP_i)|#l&o8QE7?82zO}uo z!HdP|6d2P}u>~+42d!pWqg}_ka$RFwV_nC&#<|A3Cb>>@<+&!irnvH5Q(e9L}rZr!As`j#bSwfKy9Ypo#i zYbG_-`V@xcAsqeFCMsQf|Ke&PmA$)^pK*We z@MrFPuX@jw4-TGn-tLBb_k6zY>L))OyJEl}KK<>)XRa83{p8etoOEwV_w&=&{NuuX zbAR&bKi7@F_itCu|E}fM+uDZunyxzg>pQ=@vAFmrYjzf`SUkV+p^K_^5A68m;U9h5 zY&~=K8LpeooRszGnGd^eK5^m1i&yL!_xa8LKK-pDqNjZ~Xtw=)%#(9pdT7YI>%N~k zapJd^oV=xe(4e#1ZvN-}cKo&ei6{MJ)n_No@-N8^z4qt7p8Lv(lz+}2KK10UU%$ER zwkNN=X4~w)?!3JGlctL%bzHKo{nE&qYv;Um!jY9P*S`B@<`ZWRs#t&1{r%7SYTu@9vo`$X!?yBAYFyLKt{C&6JKX=oZA+fM z`HQ`y+joBc`&m!@^^+09PP<`PRYvJ&MVGy_EM;~|zljs-XZ`HP`@ef)LeA;^AN%Z~ zkM~afZkKMWJny-san)TqyCnuh9|Aea|=ik2jj=S=&p8K!pzg~R&dC#t*Q(D^o zbH|xuu8*Gg&2MfVf8!N*y?U&5@h!0#$6fOKAs4!;MwM)+F2ClBk#Cf}e(H6LmpngX z@80Kz3_7zS`ow#)U-@F`AErY@8GHswyJGXUf$&{SBJ)| zZEBdby2j!xs4$c8%LdhLYdI5JoYPWWScD{9lWOph$Q8L*#n3@dnl>*N*3N4Ze;*@v zHSGlCOq#9u%c=0=Hx^(nCT}MnrcQP32YM(VUa4|M%E>34Se%Mfe3pLt#G5_&^br~- zpY$Gl`U(xrtbVws{`oUljLGF;NmE^Pm)Pt4zCHLbb*k$Q{3XZm`&ZuElTW75+z39@ zUA+4B;L{)2R2NNA^7%*0+pxKk%R_S`)x{%nM*`y2zXzXzz^1xba;APQGR)JH&tXDy zAO70?HLwStETN&{$1-OeJ#~9eK8#6q-G_|Gkylm^J}_}W(~Q5QdG?gz&wKJ=>!!M% z1s}Veb9(SOLTG5ZvZc=2k+QrepFu)%587uqAYMoG;KQYPs*9!?^O|$UAh5$j!Z>8> zrn=~ju*);J2cIEAL({PU(C&LriuB~eQJm^p06rX%yoU7PGYr^N7Y$eT?w3I?yr9YD zVQo@f+?F2)=>KEyUEt%Ys`lYCP1=T(HVL#)?g0XnTbo{KxiyoSNoLwfX2>K>3&k{T z(l+*zkPB_OrnFUJsDO%q%8LjnHvwNzK~c+1Kv5A4sUax z%Tac|W_F()hZtTzvs^Cb4?{5AJgb*WQ=-g3x|nGOGumSC4T)R@7Sm@i<1FTCgW1Dk zeqbZH<wp05g#VBD()bFf)H&oug^Vl&3GO4`1EU2 zE}?PY1Y0ila*Qebi~G0#JnCJK%QXr@6G-b2;d0Z8zVX_5I#L7e9Aiw0&;-&d7cMug zn``&{j>pwxxP&H<)}g{hTN=V$J*DYyI_lxUxzKP4O(3nq5bKreqO-sI6OZdw!zDC< zvqw0U=QoB+XaZ?fAl6Ik?44t$dR*MJ$xCPgX&nJf;TU&;-&tQn=hYd}`wTGd->ahD&GyX&oh896eaB-yHnK&+5pC2ZwtRc?nG* zEz*1CDm>|HKlHdhZMcLckk-+{RYZ}vemU>q67>rB^bNx$G=a2^L9Cb7o%N61=W*R{ zxP&H<*0I9nPfI-qruAFHB{YGwjtiu9+2!fmJg)Z*m(T>#I$pS_^Q^-k-}KN8-srin z8Q_H`kk-^dS}$~ey4d47-f#&`AgyV_RM2fwbsBcAL8}zibFo{aqTc%qzQ6W15<#H{Pc=V-2by4*Pjd*X@Xo4;c{#K z{ZSRY9#ou3BIULiCGxow%mx9FOZt!$q1PR~#6xFTecMqK7=Ldkq(9f?NsV z;z-TwrW+pqo5%Hx;UZ0tYXL9?ArtL$74RS36*6WqWYSYpAXlAmxt4AABgfw4acwkQqzQ7>3zyr!E_lE2`ySVo zhKn>ou9R@mYvpy>+fV=9<9fhwktWEM2BsinqMg}eo(ge90fGG$~!Czjhnt%SR$925nB2ADh1B};Ge*2AU@9?-THC&_#ay1Iq zk@(B&3m^Q)Qy$m-hKn>ot|nj#LdTK?*W|kY_Subp8ZOcVxfTIa5IUMHxE{IgU0+(W z_Eaosf?QA_a2eC=^gLSF>g8~q;UZ0tYq4v|3~Bbz?oTt}EJ=e*+6_vZ!Ulz3TUpoI zTc_tuy3CE;t?PT%;+u7YH?;h@&DP!(tFx%n?d@x_Pz~*?@Y`1H-O={5J67QL*m^rw zcC3&eWpR^eTHl?Q#w6$e3Dwv}m(l!+GF~(B15d4$%<9e!0YqbG(|Y^}VOzT)sB7(7 z)Y09GcTo7A#FeD4Ez|sI;&$YUx#QgmX=~T>tAZySiwGsjch0$xB;2DF z%~@DkM=J(tav#5_Gh7?srQ+YJ_o)cZfU8_Xz%KdtZrYy z?%C6h-+b!m-PE#zh?W(doohPUor=Eo8=#jJlK$|mRUzvyBcdECG++A;6`GgQFLXB= z;g`BQ(wt&*D^X6dc}N3dv-B)DQkkr( ztxG2(kwl_OH?+*3g?$iJZgix&Djr{us9g|WSS2Q9{>=HabtBCD*}a|fXS4kCXM3!c zvpQN8t4~Dg)5*Fj-yRIJKgJ`gt4c*`)5&Okq-vNwGamiIs``boXl;FceO2ClG#+)T zDjBa!R;Q8+{h1iLx5ncLS0!s})3InOUS;=)sOk4;7F5+$hr_isk=m+!dvHABcvU>T zu)YRA#z}!W_T^YoR7HI%7ELTjRhg|i!Nx$9CKf~@;ktNj)zJMrRt(BqUz1!IsjI1S zH|ER=3QAQi4A-O+NxNx8ozCe6zvuv|HdI(taMdPBobQ?k3>8|*-K<8l2tX~NNT~t z^n$83*30bv#~$jYGM9=F5tjn~v4hS10PCq?BDqHmZ7IRlKflVO!ElRWA~RWcfmCee{V3+ntDZ&?uNxB}L$||uL)h*FH=t#|iYIIN8`jnMeO;s{gn@p#p(W+egpAU?f13Gc{%rnT$3N}-(_{a%GPKG@DB%V^ci0qCRf+0))L$x+H-VYt zsB}3hQGvt_ zHHn&fbgB=>I48Owo=T)ywn$A6t*Zn)!O^NXY!QA|vbqX=6#q|{KU)hm8&2)~+3;iM z&(cr8kT4w*rbEJXNSHozI&S=C@{Ee>Ln|T5Nu4Tn-pL*DN>-N92-G(I{_wxY%_7_gqIF0+AyW&X% zui{d7I>_0*T))Gb-8{VYnuMt`FV6d_oYHFl_7&py#eKA);WMxD(#mE2tuVx076L!$ zo>fAXonQJ^js~`TZKD<#6qbA7l+&x#V2}d1r%e)Y-$!`w`mhJD};?q;v-WZO~jJ!%pC8PNRF(B+ed-#>6(2hF(8sk~BvT=I?t{#MZZ($Ik|XZuoL{sNj`V;Pp$ z7~Hw!O#{B{3y8zbi+Yu-{@ww8HE5PzL8|=nSbtZ6<^e;Oue@ETzvn@dzEZ^DyPVwl zqrAI8^IwK8pFG-we}Sg=>fze^U`%4Vo@PmoI;l zk-yJ^=IdWkdHM8@{q66dDZNJN^2vJ@(NjUQ|9>dmaQRyVnyrQ|pS%O9&!G7s2QXa2 zQajGS5Uis`5%e((|7`Jfq$|vtm#5I6s)YpV;Sb4{QCTi&N z$z%I22hF1ERbIaOWBxt|n%fLrK6z}9pMd5&Hw-VY647sg=CB);ZWKVS{>Jfq4ro60 zb*0PKKj>z>44TY0lx}n$dGA2pHqdOkS?TiGmxmF(-!15GxOt7mohyI*9JS(B$Jy~s zA(M@`x$FzeyX68UQZ&80h(E}y-kef|Sz#^0}W`P$>FkasL-e)@pYl>+3` z=QR&vs|{{m`RXqYd3S*3-G`JeU;R}g`V4fsL3TV``Q%amt_962KUTVY^7cb?>JjJ* zZeIE19S3>mf##-1l`dcX9g67pK(pUtN|&$xxCQwH&|LcyrOTH;mbc)i@ZE9q%9lTu zw-z*?e_ZME$)j0$7c@8iOzHCJ%L_>8kDz(@38iB{&DFldKlV$<`7>@_`N~^?{Dq!` zPyQ>V%U6Gt*9V$Q4PCzSQlGB}&99ysUS0&zhyNNIBXRTMxSFefuzf!Zn(zHa$c7!y zi=Rdx#?32Vd2d5pHE90Z&@tUy^_K#EpJ(u;EN));+M^WtyACwpdRFQ3)!znWDD+!= zGyQv|I~E{UdG7<=k$=D$D1TDAeEPB+(KUaD-s9%QbaTmDi~PL@nzp|PSziD22t+>$ zn%4|nzV>|wbfFg==Wn=qv0kM9e4C_+XMU#tl_Bq{Dy^*YZ;NKkp19|ME@o&^e8>Y` zmOR?o6`;A$(4kmL=i6otl*k(Z%@w{UcRlFt z7=gT>jZogNLHEbq$eW0!*fm0Vd%ueQft%NG?Qx2sQOf+|WejwujX+-K2<2@6-Ifu^ zyKaQ?ZU)`AM9qad81!*YffRl@nbyb_A|7@wZ{n~ls6xA3r8TYV}$a~ z0^Ru|koV;g%DWzPcVx@+eNw{O;{4-hL*!Le`9D1&-2u4&Is&@GKsV~Y$>Cj9r9TBcPiMx`#$U$Mu5Wjew5xrdNm1!EeuMw<6HJF@$bt zJu}_+hR~&l$Rl0R>-gils!DUyP0mH<+g?l&OL0%hrsMl$-xg!iO~FKGYZe_RQ+UBW zEgGu{HzgaBiRu#%>+9=io4U4R`C%hMgC$bem_?hy{;60H@cKBeL4@>ExE$GVPl zI@Yf$kKl9*oR!p#w3(NCPr=098C$l`Ui?O{I#C~uhwG!sSmTm(EQ6hC=~#UOQtd0*pz9hPc_tqljzVI9dfdwW6hRzR90NNA(l+k;iPP3Ey#+F zHiT;$okLA*VODISKHZS2ZHQ$uFcKv2sG62oeN!DyvQ%WqARA(lR72FFM;UZoD%zBc;aCo(E->hXyVDPQ8Z-t! zHYviRiA*}&7>VPg3XK?TA|k0sGK_LgH25(FA5JF19(Jt3Hq|Fm_4w9#Y*~@CX(ZAT ziN+#H$skdq9H8nlk#sl{LCfuBCcefVupg9k`z!$Pe3NtD0UQ| zg=;L7GY}h1MVjhj^=w&m02&3#fUbH}wXynG161f>6A7L5A`|tC(4(Sg6Prcot{1Pt zns6eCHa!j!LQ)f`&e~*kOKfo@mS)N=QS20LYylt4XiH7F(OAa`QkQkn#+F!3O^mG{ zYl)^4&asfRL?kUpRkxt#5!X^5Yiwztc0kD*8&XMFo^Um+$qYk0${CKhF1)y<8tFGD zqK$F<&W9#YI4n;T2BD=fT#K{Olzi;4 zTO#2!)PB7DvMxIV-tX|7H0gH-qS-KNb#7?yZo-j-b*&pa*7dE!sXb%M{weCasIet6 z!#)={e4ZsehVeywuFf0N4`S>%KpReMF|o0RhE#)?C8G8u3jI70u5Yx+@kBP& zFRV{B*V{x(iA+ql&lBZ&u5@Kes^GI3!Z`2{H>w}!>=G+>Nr$$*M132VWMDvABFPN4 zsdE4$8UvxCYtS`fiyOtPG6F-PM${$h#G|k=7!5rZc5AVHUVd7z_5gy0B6Q0OP9j@2R^G(<85%LgN1Gc(#x=29S` z0MQsf5nM2rPKanRn4__NqCkQ)@#sDEjTsz&q{KyjVj1R=Nu=tdJlat1;ivSa?IWef z$Q%^=Nt-g17mmbZ(MT%2#5v3mjq?*_AP{5?vD2Dj7(HprDQHhWjd(jS#EW2R#p<~= zJl;>`>Xb)DJ49g<{A7|LDkc@iqdn5lmiTF<4l_&Yk$nskGK{zxEcMf&3_&WlKFa)5 zBCRQH6@Z>Bv$vO@NaNk+cS-j4lOQ#p6gR1feiHPR##AJgG&Lt)Et8t$CxRQFV%^Jt zz}S8KvFJRBnnWx*v|3#a+SgC6DbZU>CX=a%Ru;!?3ZCqzgzu@zx>dfPKbEzFJTX-r zF&kuPrIh{sbQ}kv&$NxHOoB}lZfu0ES^Yl1PmT6&gu#rZQw@!7fy51?+yniTV#y-m zdUgC76CC|rbvwvUm@tObQz1GLly|V7Ow9u4QPyxA;*W0#H`@%k9i-e(fTmo$Bnn?h zjSHP6CUU5shND}$v4Or-#wK%^pCXb*EZJwj@5;nx>8(G3Bc?nU6 zb?HVVsYxH5moOO%XX4_&FpJ0JrK9<+ZGbaxYx`I~t*J!#`!#krIW9mjGu;yBWT3&e z#_|663~H4lmuWWJ8dFUPruvCtn=*+Ed&3ZVx2dQ3>4U<>DM~e?4PDi$^b?D@G)|}E zCO0~%jUzf<#$sE^ho0)#nbW?RQk%`0hTGQ_;+AKdE ztw1uoBxuoHOFi39naL!Z7Pr)g7gfVZ;oCH8T;>F*Wct`&(9e@$HrIXj6cD~hjYfywei(CS6CN>zaR@BjKgFdarLq0nCFSd7Q;|wED2`p zAi;v@P!cxBQ+*~}6KiQqwS=qTKFE}Xu~?j9 z&SL2K4YBG}s!_(uQp`RunMq@wm`qk_eiHa1EL;NwTr-q(fqxFs+m6 z6a6*vy0Z<5#o}A0nG2enTrt+2W+-pCC7oCtOJ=NScVgj2!wtnml~YMFyORltO=YB) z5bw?$lnWVZ;hat<1dMkl4H9qa!*yWQ=OL9lZ4fFrhVF5#p((NH%fA60X`b5F`T}T#`XV&2CW)vK&Qa6sF}`_#GM2P ziJMz4JO34t_~oBe6y&-fCkxj^hZK#KLN4=3GZ8&X(U=c3B&wU>zjKw65d|92$R!Cb zBM?`pxQM7hhE6ut3fT~h9BmS)$Kox0;+j|kbS@^#GmIbOkC#R!cC2DiUtDuy=jLRh zp-E-CWhycWr|Km0>>p&_L(%TqrOjt?5Z}UuTWM}GjmwIxX$aSfRCee$L4XsD>yoS| zvbDGs#)Wgnh61rtJuc&@Kosn%h@~YUV?iL+=9xYXqYH!4jk-d_n9+e4EPApzUXiS% z!wt|3%)nAOkpSzjr^lpW8Hx8r5?Rxbz#KTa#ByQHO(M{KO=448ROFg#$rJZu_+Bt@=B&U1yt5U@^3 zu!kXFk8P>J)Wq6t#ul4c6hR}UWAo(+W5=0Tx~9?(h}_d4&07Pv2;*HeR$%JFvMNaG z2`)N;uHn*_7-Te62d~^#PpLuM89jRjg_OBM+!{BGuDrcWyeT^0wlra6#M{736W$`q z3svc6e}k})gT{NN{1}Ue>cghTM5`Dx))g17=X4@b%M80|6`4pF zOS}+`HDdT&Xl3qUBB49FI3{+TGK;+!vmh6PPu19o;h67hrc7lkCM6oc4g?)Kz1<$&u z>?o52Ux!EVlCu$dE3xYS$g5uZ!cuuXnxtD#%;FNmujCwx@#+Ta0vNfA%Eq~gngm%{ z$GHh26}7&lz%CQXC@1W32Krf4whkCfTZR;!aife36KP)bYC&I+YDYnR_09%e?xuj6 z^fD_I_urT7m8I z7;xfT(twL1y(3hV;gz0M@(IWeXcrrs^~6T>NDl?J#$?YlpR3l|Nt$86iprk0sfg-p z;dNm*f~_9qAo;+{u5D6}Vge`*ldd0?8PFkk-q)nd2GXkWH4Q~Jo9qU=o13o+P@Fha z1gaNZ%AGSxKY4_;7EN$pK&rkOwzH@#1;${#dwJa#@e@Tbs@30S%=AJ;k%QRy&D=K>!G;U3JnWcJOY`AUD&?I2NSVKQTtgTe-11j(a z!=@#0V_0{eGcjI|wApQzhGIdZ30qE%7uO0;Z4)Lq?9>f-OxM)6=+Q5FupJJp3NGS&`#R5=c(84>5g|Q{oDQqhdV|0iSvSHO)9-7qG z-QB*vH_ELjMP(IUTwUv$b`vRSpB_k?XCJk9^{%e&!yws>)r6ul9^%bvYhSh2pBDy>btjVLOcsmwTcM@J+x$<|q6CfrcX`B|Q1+zMa; ze3{5>XzkMM^+>~SL=sq^#=CfN(%6r7d6^0{vlyGBZI&|4;k0-u*fznXaAt+Z9maue6DMlZW+B9`3xSisY^aGb@TEAvJd@oS|_MBErh#hlH zjmD{hp?EpTg+s@DmEctdS{OA8iEiptJKRl)1y-VRKu zS-_Wo!4XOIIOz23b{>|xwslkErml8z!Fr*%i0oM3E8`67zQtGhEZTbF7E7_PIjq{e zv873=Vcv4p9lXKnrdlyOedHd7hGXJcz7%S)CYcUv4|oPSHwk0Z3s)zSXd=9eW2YgH ziE~+~pIzIHZUir%Fgwn{0@ndfA%S!h81`3q8btoGqQ$ z0t{@ZP*cy6)qj~hp~F>UQz>**^c>qrNmay{?nx`I zWu{#nK*oLfa=W^Vio=d$A624e36|Z8%BF%7#Y6Y5#kBc{W*MxrV8O-hQmp

+!Vx-_Y~z79hW9+ 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

    ;1Hv`Wr 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 z zLs&TOaIV=1*mm`+>LOg`-3tKcJhQUkpcWsy6>t}yC?Phwb8zd_i-6l1l~*wNV18=O zPgWP}_Qvvd;Pz#_J$xzP`=cQo$7|`jSGWrBk+A%MQ*=9q{&ZIJFLsN7cmg+>fnmtOeNiqZ4I5^dM`2IE~hQOKNQz?sM3#^byr& zum#k3pxb5dGr!bczJpL+bn$f~Jwxm62?~}-fIb?8fYP#Aw?%vU-jl<4zI}^G>e_q3g<7#Ji0chc&2S56VdZyLRkFjG4qZc9`vaA&;I9>p_V@j9r_!{cnUY3A7$)drd^Iy&P$ z6k=x7G7-p&^FpJ&G^%+9f(gp*k7{`=;si{a;QD7*psTAQ(bbwZv8Ell@zReOniT!9 zukS$_oU^mcXz6)UuF#v(U;N4KN?+(Y-`F2~+fJVusHx?mx}c%3l*g1g5wJ!3Br zZQ!z~Z9N^b_C>AZO^rGdy~5t`p2A9F)&a+=OR}zH+rTbYhwF=I{kUze1#CdRY8cDG zedx|;K7X>Yj8G8QUWDyYSoNfXao*b(&GCie#QWZRA=my08xlB?FicVw-hGDjjemhC&_$0ORrjgW;lVScn{ ziEOd|f$O#|$o%X;=A{3@*h(+X5(XCZ2>lnj?vZw-x_LiO`w`&V1g;@4LEByhU87{# z9MLwYZ^W4`-(f7|il4Iu;&$eMQ#OLK{>XOjp-l}94Yu$FAl+kfuQJlJI>QkCN&MP6 zoA8?yZhj>8-{%JU8SUvOq$8^bF*KmCjb$9*AlopR)>`xO%Z^a2yvOkUBF$#`99N+f`b;h2} zmS&mb&)(GdJ&FsGh^J#W@_m?d83#>|KpSza%Au@*pe*=tZFF)|hozuTTkCS|m$iQx z1e|tX#J}PGh4fsbQny^u4=de>(q)gC(xM1#lW6oApMo4L<0j2(>qC}t0Kf5CI2Vl~ zP1-S~y(zPgo8{<7@bvPYQ}h}*k)f+^0(@*Tod zv$Z|jg5}Tg-;VvshNuBJ>vXH;%We@9Q9lcuf{-V;GY|;nSx8wSMF8U>eOxHiIvj3-^(N|2WJLCl=y59|F~fW@|+ zi+)?ndV|ukU612$Yu7g_JhU&$`@4W=jbFb9INRt=nr|)p;$;9+vy ztNg4ke}Hsa*KYxgWxrKvLz%h8`a{i=)c1zyk2K%gG#`1eY}#0w2lKuixHOMHQ6BHm zd|^9tkIwRwd3vHh(>#B!d9wEi9P8!9M|sSf_rcse?3ZfU*!}FIxxRNQZ_^uX|6TYE zZQ$KVllDDIyI12Chmc;&pHu=a?Z+l8?N1s9OyU&_op-Ab0q1;5Sgm5*GoR8Cz{RJ8 zH9xL{we5T5Rls-Zz1a|61AJeUclWn+%}dz+Xa=7Km0Ml1PCW*g#3#CK4}DdBZ*UuM z5|`+3vXJNA~0l$TCc>yZCS?1Q^tH93@Uud!phzdDTAFZG8{;wYd zeu*)TuIfJ4=B0q2B;3j2;pBIE4PV+119xYJFYPA*ze|02I? zeb$v>4KH&24rtyL6%k;vwj^UUtbMFi4wIlb)YlQN8z9uh!d`3!{Sci#YE~dfc z7Yf_+tK8xK`5BNalvn&spxcqdK6?m9`C^u_o~{+R0I{!b&aVV_JUh2q#0x)* zIA@h{hOp=6a9?Pt*=pkw6Ze=Gpe;TSw8eh3g_{H(-5xW0zZ%-B>nfQZsTj52_J1FQ zOm02zVlw_lWQ_e$T>o}K_P-5ePx_-A(~h3uz*0{38oG0iTx)hb1TLKG{!V3mWZ$&w zcX2n5eJb>c)($r6tLpcpz0$W+vxu6&X2o}(KM99^oS(K{o18cp!q{KaeoyjcUv+RC z4d|Hq_ozd^`2M|g`BtlXigw1ah`z1+0$n49(hTKMuO-&hd%WjO?ncva)%!oH-Yqth zb?X@00HHq#lYTt>hxB7JrZ3uo{?=xoq;{DrC1hU~fm5FivO#Dq(!tOW*-=wmCO870&N$!2MlryXg z_287l#Mp{uL;@EJJNmJdQBP*i+n{&mx;cj_Gk-6+5q={B}>UB?D(+_X``qP07xbO9depcErb^^S=eWcrcvDsW9I& zplx!V`&^*MS)R+KcE#(h2iEkjj2|qHPQ>mNO^RN*hIjyFvah}9|La)0qL=T3F+|3S zaKsF7?32TI}j#X4Q1Mg{>JeH@v1dGxS~4`;m3Z8_Z*gFmPrwq z4UIr<>{(ja1JktR9EoSIUkKWGQu}Mc1zy-@MB3)W8T3`$OT-@5?Z~ZM_EiU$qb=Vb z*d{~h+Ts5F3iKWsBLNp`v=i-!WB7jta&DuX>)4U`FzGwYI`jH6;Iy@`;9uGr{Bv8o zP&Vo5!=W7Xl0B$&4=J7bpGdcspZmWw&(}4N`G_PBV4;ubn@amFrKLja zDb9;`n>FuuGU&M;O4EN&=^xIZCvBR(3nL=s$>Cq>C@wqJOOMC7yT+^|{g*LqF50Mk zHf7NM7U)CTbCh!Sj$B;I zxcFVboxhAXByeFE0Y$Xw2(meUSrXn2IPUhchY1~L6x`|MMRl?HUZllO=E|Y_0JlNh zm_b_fJ-quckC%)cJz3)j z-ZIvef8&%$;$w0s=lr0YUfvB^V}7*$#QBl!%khc*sSo*SQy1c2XH(8@h)>eyqQ@xh zHl=00TOp9^uerX9132$n8Jyp3+d zwsD8|)OhEfW$|w`WAs$bcde(5_h7Ja{|$7uNxEI0rg?X2UK^)a2EQlOMjn<0(ecwA z?Na*PL0JXRk*_N&E*p24an6_P<6SV*74LxY?{J@ZsovjP0uS=JJe3Aa)@X)*ZYq7X zq@C@ZhTds^aa-h~=c>%lQ<*8#vTrk&kM%UYq8|9kMFX0z5afHJZ$sEj@b_gI{DzT_ za*+4`W$!(pvnrav@45HVMA3+%@TwRP6%`OrQBgD@1PD?>5~@f@10rdpP*p65h+?mR zG!-nMSh4pGs3;aJD2if3MNw1~zu)ZLeV&_#=->DIzvq1Ce8(Iv&%L{|yR);iv$M0i zvzlLTn_osGKZS9$Q6HNjZCn~p98dJKaPj;+aXdC45~uXjzjm~V)^lJif6w6S){3%Y z;r6T_lXZn36bUzH`fT`+Nch#{tv-bnepnag!0Myr z=&#bQ%EDGBz?yu4P*|7m1PeQ{4p@bW!cMlZQ|f}Xea+>2mW4e#1{*)8+uQcrR^+ez zaAd;w$b@h0=UVq%I|iuCaA|XFT#=1axcoZc4zqA0>WIT1o{=jq&+Zm>SRJs*39ut9 zY<3;6`zFAud{g|2Ev&xl{XeeX>wQ@vAH-$n0XEHr5x7)n?b7I7F^Oq9*>atn#0GB4 zRevNd-Ml)|DIF9iy%Wd5QQue}pI=8?wzFyU?yW>T4z_XE#NtB!?nC`+kH7e?vHWtY zEkp6pd$}AQEh6E1FP95n7{cqaqGyaKrg7|mPbv_B36PQP_r(QlPaE)S)Jwx>REd;)nO0&^Mla`-5W z(oRR&mA0JlJG_(D$wy#8wZ3kmUwYuDFFt9-iF=Hd9q>Afo3-mo}1K6}%q zS!dHkWmyHh8vUMb`;Xp*E@>8S19)zTFUiPd3{0pG4BPvhpZS8&BN*#h*psieh>DNw-Db?~1(N8F|0ozDIS$ z{S8e*+%!Ke^AUcvMYmYozUBA#<$(-X>B)27`O;!kApN@qGU4VxJ{uWG%k6>Ox6zk& zH;Gie=E)0pd9rFP{CA-*1AYzUa>iKfyH2f>gV6R^V`tJ3C9N0RLKZdb(`9L5? zpDXgtq(E-Dm3`9ld>L}O$gR9fU-HTlxnQcuSw{!5Z43VVQhfR9cVEtH=*i{Rupf{~ zSKo6yNna}R{w*SZoaf2(Hk3iW547=R;|U_;I|Nd7x5(VnJ!$b%An%?Y$gNd@9C|xx zQvykuAIQgTJ!yL$<9%)*8?xA!HOP}=miux+7m-=VioAEF$hBXwUO&r|oQ;7T)0jOD zzXkHe%Yoc+FFM#dPY#;_kA5lg;UDZLcsh_F!1r9`%WXqFx&0RWAYaKHwD8T$95UZ;N_$fbEA$A99>;~$GG?dHjM->?_$LTuW<`Em)ge5y2%q(eQ) z>dskH3|qUs?o0FSzMQ%ncOPy-ZhnYu;ulZed`~0=Y5vUFp5*;3vh!f06Dj18F~m`9C|bSHI%RfA;X?^RXfWe)Qy* zIqYHk(3985dw9n{zJ8lF%<$z!=#+dGzRwXZ$N%8T5_sdNNz8@s_he=+R_EOV$v)nf z<{vE=X#$NeZ|=)M%RG5!zAuLl_vPo$ zp~d7t&iXWvU!LQ}i+enI@2f!Gnn3xBe0k|<_H14wavc2A{}WG+{v6$wOGwV2DRSK! z@a-H(qhmdp_B?H!0e#7L)dEjO!NccJ-aWK!y%Vveq43P=5=h&DBFj4B`{QF@KCcX9 zS#M7+1Hbx*d9wONPZq(KH?_n!bE+q6kAtUDefc9fkjuY@zD<0&ojx&QIX>VH1%G&X z{EdP1Xc5R%1m?J6U)mnvOX>z+HV^b=%9A4BCi(K?6~62}Gmvlhflkw)C$LMF_%f&~ zGy~t&(6v2+a0Tu9>pbQf@cz7uJvnrR$lIN;5zU77ABfDm5k6e#$z^vFQ5)b za_>BKD7curBU6yyw8Pg|`*QNZwCQcop8nhCBwuP8`qHdDJamI6SJCc^*7=fM_gOHKkED28So>xUb4xTyJ~#taJa~f_3#vJ(e=_metiMFkriKW_vB%|Z#%=2w~q^C z)RTc^wesYH9lmUWUz@iTc@?@pOJ8U_3|{)flU4=Pv#T$eHw1F*Y3!kC?aQC=UIqL+ zd$1={Zzcayk)ICsG1&(tZ8 zc7?Xd-vzSsJ!HZSB7@p+cX|`(@&WXu>=O>h?{@?4qG%%W*csIE8pf){o_w@jjGK$W+3k%A5MK9IknoCF?)M* z8ucGG86Nlsi{stCJYD9=0Lmyp?iTzBU65TrzasMJuZ$fnkjpcu|NenAhySno6CT(C zJmv0q$CKli`Z5h%zIung;RVv}JWrPW2(5v+>=GZlr6=`kJUNp-mb5{PkHcRIMHbvf zKL)=C9}^iiN@Ra%kpB?-#rk=&un+quZ{^V0EMVy8zYL=-UISm+bP;s#d5b51tYl1~ z%r)Nxl70?j#dF9Y`oOioordhV?2$XzsgFUsLq$Gd%v*jEd^0wXo6qs(TE?%<)OR?zH-bLL!N03_cyin0fqZu& z^&5ljr-n1xj1|kT_2p&S@XO)Q6n=V|zIo$_K$=09OBuiC!B5MYbM^_D(;Qhn<&i)J zLf7S+M5c}OW$j+b)LFiq!GvSpV8+Z;#+b_)Z{h!`mw7U!e;~u?hxv2yV#U~)NnYKP zeYyWqk%p9Y)OyB|MT~Eq>5r{|$su2O>E!u%6uHimZ)nH&T2QCYkqLj|Ba<;Yc_Vlq z5y-}`JlTi-`0?X2#nvDMNdfM-sCV?zyk8ZLDy7oZ$ac|Di(@w7z(w~q^v%4T~U+^WTFT6p&-IPn8 z1ozLY0x5qOJpegfp)&MNWD@Pr;1tGd#@3D>`SSZSfgJWQdA=3M6^uh?ed^0L`1mX2 z%PiXDjDrJtd@oM|#>;Vw19@V3AfLSC%lL1R4XYSS{|KZP@-LfyeIdMh5%qZQd&Z#( zU#?#uviIKbD)_y8FZM0^^qI?`&1ar$Mlbp>$&)LX$Uad|WIlOZx0^4Mku^2hjImjP zj9~mJd@(tb&}TE@A9$|8XWVJB6TejVA|k>^-22n;nc4yvicC2PU?I`M7`8elJS}`s^;mNkQu{#|Q$Wr)sNLe7iQ&w6!e1IME4UW=YY zf38et41h1n92yCj~O7 zguS(l8Euafc@Ew_9opT08Ew*s_8HGOLO;HfF@L`oJ-KHGlvSn;zuO2*#N`4x~+Y`f~1<*h1j%dy$PV z-QmgZhr$cLaz^V!V9*1qwgz%Fa;Kry$$aX0G;OfqeeRb#(36Su&HBipj!o&ytKqY? z*pBI2W8ujIkncYZME;^rmcs*gw)5l?czOi=;U@U>`uhUui=MWfF}NG}UVelxXCX88 zK{h@}ANvuyE_xZg0lu6{TQv9-*>n^3yL)_jtCz@`&@a25FAp?E|GWtKjSh6soIn@~ zq~`~Wk&J0u&Sac}CmPoeWXZ+MsnF?ed)=1_UkCCwa`A^(n1dX}_DXBK=O{t~7Y-mED=QY(q~!%agLF(H)A=-2&_jM?w3O&;jU|t=G`z@X$3wIs4KT z-054lp?h>Aj|W?MvI1FhZ%dI;XZv#L)96z_`mzN*{=Tb_AD@Y2Axo}7#vajzJ~I;~ja)BQbZh;H=LcJAM$uN}BQHWQ~RWbZCQ1{FB?X%e;sD&h@9}z1s1>ytLZzBp%eVn0y$1y_CAsE8y%{69yq*# zOzKXbTZ&x&7@YupPdZ* zPot#GCg1R0GmTeT>z}Scxw>fBu6YEq8+o|%Ls6JrVe8B8z((^+0VjRpIB^fI#VNG8 zhPEL`Z_Ph(Z7|8gYk1t26xx~8wx)UOug2|TU_-m0!&T!QU7Ojw!tY(nP9c{#uILE{ zK5p}GXZg&m57rC$_yAy(ADutqu#MO{X7>>Ef%f0-`}-&NPU)Gp zmZVYpsPgo|yfgH(??P>p@iqTT;V11gtt?&&TLGNH6125$KUjmu;R7+;$8XOo>Ftra zWM5}YN{T6?jV;5qxwdHy?Q|&NiW8lUKlEF^6{o{3d=#hd;N{YQ7%k6^w!PLX2GaN~t?ysI#C$|5GdW5{BxGK($FWXt1+t-0}N6QC_uaiZN z#srzQ8ole@$*hs~Jz8(XrD;c(Zb-uS2?^hb;9Bs1FD@Wgcz$W4dn5nPBxzOS<*upA5W=7s8Mcz9`-jic^`$?-K;iDqu zKNEq;q+o~Fz{vZ6$osfRK0_nn%_Dg}Z}U{1adkjlGHvowq`b9}_je-i8zS!;Bk!B+ zyX&($zNOFt`WQLFulCsj@N#llVRW2|$NN%5yc-wH7(^=VJ1Tdz?G#pj_1@tzCNH-> z6R!Wb@)btY>sneo|3Jy zs`$E`hR1PaUT@*G&JMmcYnl!DQhdx9#Ji)9`;F((P$rl>;$UG*X(m2CW^}Xt$jPbx3E!ASYsr<-3Exa_YsC*t z_(ttFJl)RnrS{9C?YrWoG*i5K5TMaVe2< zdq&=S*O8{4P1897cYNgi#K`+ek@r*VdsO~|x~cbR5xC8f_q!tX(SD^exjAWEpXf{m zQ+S-;&yY^oTA+{8X`!W4RDMjdWqujKN7HHE3yD)$R~G7htSs&SuDp1gFi*5)4UOPE zDDs{edC!i#pKjlyxG}BR>f}jcU#?xp`f`^k7k!9)+y1D^wh)qF>BT4T$3 zH3sJ==~%DzKeE=|cRV$*`CfJB_#RpH(qsa;pDpyyw3d9_U!#9;kFYyi)Y>Ha`!clL zH%$IDW}mJh6~1xv3PT)}M#zQ+ZvumFsDDJGDDMxpeb0^aJ#9OOxW#$&9r9QDMCo`p z?Wb+KJ{A|(7ed(^pBp&X4`Q$(A80vl+;Q@D12CHJM;6w#qxyK(^20HheFqlqlNg+z zq%e+;mB;km^$jgc{YZQUe7qikd~WmE9LYyvTt25n@=T4qr$ye=Bkz48@BJe0M?~H` zN8XQ*yk|w;b0Y7{->p(>>sC_7kO8@Yx(M1yw3Ai+z^=7H#IxkUDnK&^GHxi z*tfl;dgSTkZv9yPq3mhEx3;VDvO+cFTluJwg{%AQSMTmwgR*|I((6;s~IJU36*aQtiL z16?az`L}uKhtW6&R9T>e$1iE@?ppnBD`V5l<+Zk)-6_ALjLkQG(#KSm*Wg4#(`p-> z0A5v7`W2Pcm?^H2YZ|U+in!HN?}U!ceKqgiVOiOwXa*{}+^mDRB z!?g6h3D-QE+B_8(k2>vc;uS{QvTj`5oJ8}|^5Qaty#hAh{cOHY=4ko)D4s@k@lJ>| zx9}}2yq?3`wO`=&eQ<8~tO2P#(o%7n-@8Y6IoGbiP%88xcYw{W_83!`UobYeN-y?Q zK2TgZf2(1I#_Mo3hs`YSXdLIbG_KO!v8uSidHzA31ytZp=o36}`<6*nU{rGCyMuKBtb#7_vtnw^+KZ?>w z*@5%0=IEX4r%Ib-saCg*rr+qf&^A(0t?^nvn$~Ya`R>o$^;Kv6ydAI*jHiN1 zGoSGz!4E-xK|vjSR`54`RuJbi!<$r$^MaaBfeIsY@Y>olJ5Wc?y=z<<=d`%fIXo|T zG~w<~{Sf?pHS8hlzXvjPb$-#6XSD5g+|+)rex_^p{|3?t9JGx(+jfZR&MZM~Jq+2! zyvFdZ=B2Vr^Uyt*`fKv$J>Kq(Cv@ZIqwl*zW-`N2nC)={S)sY`I22<9-rmaGqP-&zbaSQVZr9-Ms7p0-XTuHp6 zpMJ;d+d$H6nLTV;&8MX;L*IKwa7iYu(t%E7=8ldh2{+%m#-s5k^X+7@erx@JG3A={ z$l}v%xqV~hhWdokI*uPU84EYS!u6@Mul2~x$W0xRnw8!^Jv%!Wx8FHj&1uKAzlcjo zF*F+($(J@u7?b`YtzqZCh$CNDcdd(i;&lon$JS|(EnDfV!cWI(Cy(?yo`yY}Hq9`b z#*K^0(>mtHVcBu$8iBF`7w$rX~f8S27ZB(u&w#_8lHj{1J)IBfB?U%2p z6om~G`!ce^OPWer$FpbIe7e@MUE~fa;Pzoh->|)MyHCbtpN_No-9U1)wFHGx90F)@ z4tcph>A$PT@8BKEO+QKNpzn3x?@~L@$dori9zvne=vr<1zp1CvLvf`qOzB}J0D2#5 zs7qZEsr%T3y8j)Xb=MO=BH5XJQ-`TemXVh3^vv3UF+P}W+xGl~I=l8#oa;%5v6-Y= z*>M(a+rx(23k!^#(e~}(85R$lI0E0>3-fXQSTv8`ei)_~mTG+v z^-;dn{FNWnW+=P(pRxL}%1uk7LenlLAV#07ZGLW?ar5762#@y__LA|fWnO3D>z;e% zniKtf!$Br|r=UzYjh&y@GUE$3=0xl+$&zh!(rqKzg zZ37MK8G{ea9-5D~8U9O3dlna!6k5Mc`It<-wch!;(7N45c=zJ!Dtwn^;oh_}M8u;IOn%#AfM`1=XBG^*8)HI2sguZiD<@=ydeb|J28NoJ^bJ~G9LaM;r)sVi}Q?wuXy-Nrkv`rMU^HZhU;p=A#+jXgrdSuk$hf{ zgm;dFuOpm$o%E{bkQ@82v51c59FW74=+jOhtnD6TG`-qW|bxG znMa(;liA2DmAE(Yt@32PO{4QpZFkjiNydCDwB;+j>Y{O3#5o0K^n7G=6Ry=}{P_8F!5 zJA~<+OV_-W{;hdeI=)G`67^kvwY}EcwEC`jYJaWUeq9T%$n__6go9(<^I>4KdUYQ- zD7A;vz3nF{!u^OJf`hiZ?vZfow;vG3=vG=BIu$fy*apJdYM2=?s|+oDX#bIcRe07r zRp*UU&J`ICp;XsLl{fWKn(5=tf`{~~FB{2MY4i!dp-l4)E%m)_p2^i~;$m$W`=U(E z=d)Nop?&IezO{XfFeA^+w!AMaob#_5_My?SHKW$xT2ChRF0ZbtD39EO+ejwY3e$Qd zv5r*QFRyBx9kVoyHK}~7beMT#eQ5X<;qDI`>|fTS?)ATryn~O6ut@D7C=jkc?W#M| zUQ8{94jZ16m66#uyvrdWjMUxz=snl@gO4-HXgHp$OvN%Z__&Bps9}vX%#OUO1L>Hz zhlXXAa1&$v-tav&3`HmLj^HE>$0=t8D=CToSNGL8#liTG40R(dv$=*3RqY6^2`$Cl z$)#}zYTU40VcR zC=KtGhsS#mir`on3pWUveynAVjfE>haU4rD+-h-JrovWe80)a=1HY@;;m$c@2%0;l zWHcA&RcDT!Tvd$jAI|5*jRz}i>DC2N40p>*qgX{Yt z+{RfxQM;c3!tNC2^YJb)11j%HVwUZ5hTrw#XvjUu5++>S?A8s z$>G9qSS~Wh;NP?Bh|;RbRb7r9QCK`758bh1gi>NeRb|15GOCJAueiEH0dg+bufB9* z#M2#ElgasHe!KGgp!=mvUb=T_Oi}gV;=-cxerooEkC5a4ten!&KtoaF7cJ|oI?H;6 z(7cL@lF8a{`WBZmwNP1X%DM-vMi*D-fJA8Y0gq^$y~o1E){3hPZ;p<|F(#Tkb+1%` z-Z);=-`qbDwxjMD|A+OPXd0gCDK63aT~Moj=vk(`7x=#?-L7wOeq~T7`+(uV&Kd{;R%t60~Vj|0(@J?U>GLsI4g}+Lit@YvH%2G}uq~AO+|J<$;bl z4fb1Szt7~`@t*Fd8dy_QIT_J4nt7sbS}-yZA?A3#E*R=OzNVQ#Sxh_J))kF6a;W`!JyX$@OF0Jl| zB5f+ys2Utx{WNXd^W?7Sqh<6h%A2rD5!5FNlTJUcOw0xthllQw0uQ82Scm_Deq&+n z!d=_`hFbK~wr+yl{)4vv*33Z~?6)u9ukp>kN$f9SUr6gZ0{$F>|IB2)7o;k=?W7aB z95Ev7GF8c^(N{-w>Np~!te~W(u!z?V9XoXH+@*7;4jo6-l#VFOukJ8b+fvJGN&fS| zVjcPG_o24@OcoyXyQ7W27{yt?vn@WTK(Rh^4C&RMX4o&(gcFwsM}zz5SU=k}F6{GI z0dw;5sfsvxpnIFf7L{OZ3ae$d_JFgC*D}Mjy(3WSe>dc}T+*8{C(Q^Iv<-*RyyKTNEQmXNlhQ={`Rau+ffJz2pQrfH?{D58HJ9RWS!X&^unXI(3xEAXG zsr7brjNzD5R9RZgO(8`gfUCoYE-gJbM9z+zHXlci`yz0$0m{NSykmG|Tk#CFvAc` zc{-1Bw2yHXhW%1u{tI0GdM#2(aYcSP4*Ww7+9m(G^^XwDwLvOnaF6id;>v0amaqbK zarnLO$_f$dSzZ8bEHxZVtPUnN1Pn{i{V*ZU%UwRSl^tMp35Ht<@WH zwh+YOo5CEm7P;ut4wt(1o-nn_!C8^=}}Zr zj*oIjxJX@fPltBoG}h=)S}-RUo3%N|<2Sjypc^fNqE}X+s{^i|I{Nlo=|nSc=Y6u z4q^TdrcV7i1c}K2-7heRE3L;ASLpz#TY-kC9CP(vGz$hDf?_ZVE$DZavSb%qycsDj`vb33PVwyXI>oeL>>a8Om=aWsmR9U|Dfd_oa5tDRo=Q0cl!UUiJhF+P4XLYFWLQwg2n zgqcv5qsMv&OYaL|okR`CPlwZ*UEo-G3UiC~FWsjWlR7!&P87v-;H55)xZI9q;`nU2 z(U|6@hQ=>4>Vi3%uNH%F(0HVGwBaZ%wl9Xfe; zHOn2nFMa#sA#z#i&`l`|il>Y_xpT*x_1xUiWvU9P7Kue!O{L*4KjsfJm-+i(;4%2o zI2!#j86RC^@WFtegq!Zf=LQ@74!{ukCzj^qao9V~_vOul@awP*zbE+Y*yj}d%Uq4G ziX2b83-C*jkAEMO+~SKw_PSo=`6-_9D|q{QUydu}`+`8`wquVLerLwvOJQp{z9*Ih za=jmjf3+{g`0QC*fghZk@UMsOlnYzokKu7_j!Q&tzTB6g9K5{=-yb{Q#TVbBo_t@* znkhbJQt-hr>{#|!9mpP^&A$AG@1!~SaAOJb=Wb{lh^U(@Nj?+ z3w*F#`zyY>@L7|OACOJ>o!K296vOa+a>!er9DIu}w>|?c@d2`L3;fv3Wk1!WoU`nQ z&y)#)9Pj|XtElTx{G|-Wx5Mx=@fm^Nk*{7vPol18kK`OLH2#XZJc-YVl$Y^WxC37} z+wp~jKb%L;PzoE*s3t@!r14nIuzoH-CbJ8SylV}o|hp>8c`i!J!f zx#T@~03RjgHLT5mm$#AlZJta%0}BlPP#RM2?}I>2nU2pHxN{`<+(Dfm!e7khu7R{k zhGzJa`INF|;^U`kF0}d-KOgh)Vb=z~m!-ZeSm+r)gBSh+Z7%Yq{*laIp+`G>OZLXU zQ3w1S4PAksRq8$+e=pbp@2H*lo;skX z$l;ISAEgEU504gF-U%13>kMjkwick+dgxN}>Q^;Jqc9N}iwqlgxd9ZHZP7KW zroe?ZA6){<)ZG&?o9x-dfo~Yi-jsqO?nP%`kF$Ty4&#jxwQqUZn9S-*W1n>OnHR>V zax7+owN1v>(bVQXprWWOW@E+X?&{Q;bOT0@t}3cFSB#pqyVZm>AUc>rMfYGU94sQ z4J};y)DX_B3`N^d`Ki0Ed4~Dsl;?13BJJzaO$yV69Wr8PZA`ec;l~JQ&Pc@9XYU7w z`ovn$-7oF({*^lEUJ1Ll6ywi&q|-!Uc)ZV^NqCRSyfHo54^zeczAhhIx3s*9>Y7US z9y#8;7kFs%m*xLV`5NzhH8{SQVarJ^C@89^Hp}NRJ~%MUGo+SwUSy3+_dEH8^@ZI{ z7mU+U>6}qDyu7@W?Nrdw@y^v@eg@jvUDXeeS&IxA$Sf8h)aZEebSU4t-X zx-{Bfv%-BlyR?JW9XcaVi$d=gmWN&Ym650Nf!TT&p=Uu94{e5sTo37KOv!f7N!SH9FBXDpSF)_?}WG;!Z;2mvG`gMQtO}Z-I!=P<*s`-mQwTh-WQcEZ&8lQ zmfrXic6R&qgpDQ#b6_J}mV+pCcKvQPFk@=% zj|%JH;jxk%(^Y}1>L=bnlG;8Q%+mz(iH ze(_9^_Lp-1(AA!Fy1xZdbW7o zmygJ&TPxOdHsj;^EBsSm&%Fwx@heV!hqB)B?mTSu*xC1C4e91*MGk(5b%eQmuf>1) zamex0x!-_whR*rW`*`AVxPOGTiv!t!HM_gWyR0uvtP%Mr&zCEJIgY;mV=?Ol_;P=a z^^ko0XgA!559ZULBkKou4#$sq5AGfsjC~yY{fMtw2I!SGYYQhGgTMaq ztaouA!sP?FX9pV1&Olcz!LtPAd_}!7?uQr0_%bVxI^}WC&-wUAzd>ZG%VFokf7ko+D=>#Frj6it? zJah;C;TLj0*LcoG;PXCz9(NJ2zSsSEc&r~h!+J(j){p}F$ZNL*QZWj@>zi4FIRtD&ngFPziCm+$DaTc`SRAnmz@c3hOodKLce@5I-7#%u69?J)8e)^>W+{@lIbvqrbq z5h7h4W4+}G?lI#~#PuiPkDm3r8!qc8k^!?$~?{(H6v$*G?HEVWnyv_X|^sT(zxbt8& zcNP5(AK`p=;T-NaWzFVY`0&iB-03h5UZNe+cCcPZo2MXSTF@7}2EH7P47kwaegoG2 zo;w|xeRo6X%kcXMyp?W_|*;{%t7d^dwN z#Sd6#{f@J?+qjow6MUP&ePi@H_5Xbvv|qmgpL##jruA6MLS}uDL_J^RE}>bzG=&d4 zvc@{Ii?&_|zrJdkIf31n~uBR=ayf$oDr{zq>Vu z@shFWeAb<_;l2OWdfWfk_5{>Gc8$cxb@iuY_KD~zS2r<7e{=J`$o?00e(2=T%)`QL zB5=>4iyHlz!8}wobBe3c9^GCor^~Exa43bb{fKsBhSSY<-J6nCR8>4hH=^#6-z$;) z!gAw#DxB`oL+e;RsH|9bk5PA5&ebk$sFb6JmKCy_Fw|AUlD0a$BXlS!v0F~uei8?> zD=xe4-MFH5nYGGtG@t8Wppo13raM$al;ZeD%ZqILi4%bKar&G3btF5EC$QPQHx(@@ z(j8ziTI{+vB~=~1S7+%_^8{KX>@68wTvZ%v8b^!Rey!eY@CzFz%q7AzpGWG+-WjX~ z)uY)W6oYelJ?7xxt=L(U1e{{!!7BK>s8yuf^K^&H#}L9CkuZv`Jwp;J*YU^e4nD@y zO4{(yMF<>k3!NLr_v-DsQ!YAJyeN`y$N;-|R0BqNjot3$ z+CIj+@x8=m?%?P<%jH8oLwxiUOIVyME1}KZF22~_V3*e|E-y86)!Lf%-<)f(hi~AO z+IoHcT6%rf|6<>LL1py_4g!s+!l?q=?{&U70eR7ol29wm_eA^6aAv-z@vY+l>Ye$% zh;Ka`up4@+roYsFAI|sx=xo45tVM;z7QZXVU+1%WpOBU}$A0UbFmB%cEBNG2D41BG zz8FU5mPF^|32{}##^#|3aTOZp_$NPmG0QY<7urux9XQFceFBI=<3Sl zujji-5(<%+z>Dw6Rli-iI{Pgy=l@d38*gcCXJ_Yn6dssZP*qS`Vf?>QE9SDKg$zB? zptbVO8oplx4iz_M-~7A$bIHr$xtz4=Wi`$(g(XAPKg$Q3vE!@xnKBci0Q47M<4U8@`>$^=KE{DRX*O!oJ`?$&zZ&- z+W02u*&09nq%i(u`+dnC;dh4pe%{KvzVop%OUkH+htyJ|@^+YU*^Z#bGHp5C30`OQjW$ani zSe)x)ny#o!rwO%Bc4*mAn8MsMOqh(*7=GEO#? zOpeQ2J->xQ0S0<_E8cF;gI{#q3$cvr2Ky6_+zf;5I*jt$ON48G-he*j#)fT_ky?0W zjXSBKYZvMGVsiK&8s??PdW`!$M_=XZa6NQT8OKVEpE{T4dh)d6L`L^)GE^s6(BGxK zojlQ`-C|y?^Gc{Jg6 z&4!UI*l@;prel$xuZcWhn2B@~a0W?l$I7(9&H%a5ruZ%M%`l0%+peX-a z@^pV^No_|J#$ib9pcM68(HI{|h$MN9wCb~?waI`z`FyKy50yje7XJeOFHvKiV|PXPPGJ17xU;)3wGhE`Hy}i7F>!{z9-pT3B5djl!yLAoZ&hFO&Nr zEv)jA!Ya<{|2i?4cvQ3liO;g!6pi<=CA9rnx<~wg6bD0bx214 z%t1M!cR}Z?rFJOPhxSPg$jkY@X=w9BS8U2KERFcaBy65I?%Y2}xZzA;V zHiOhu4bqcdnLM+#;F{Omh1RS{VLVQwVoVd%hh#sSFYYs=iYTb7?u;ZiPm4sQ=E1fg898s24vP}wE&2k)k3 zrKjekXXj)MO3MlTS|$djSlO6#0(rasd7>@H`5zAPD5(g?KeNZctg~xhQh(F*C3lq2 z_=ib?UidB2OD@c}(hHwO^f%J#=wM~M(jr+;8?X-Ra24$zG4^Ho&xAkK{*sbeE=j*zh#+P+4JQ zMnrCCnBHyJk9aMszb(u4dA$Qn`PGf#I>u?A&$RG5M^Rq*OJ8#RGWz#R9UAjP2F2nb zwtm?*k8^C>=@`MPD%+5(x@7y5hBqP{qp4|D?Xwz|6o#QyhAvTEcykReE;C!-qI{rf zlEXB$;)Z*=6)C!+He7}v*iKB6?L+jlM$$<7!a^EIaLmM+6> zy4IF1;dmC8Df(T{${gpDa6|<6M#`Umk#`|htiQ&I%V7q@ybXr$7N^`uUFzV)I@7uF zaujKm-_)nQ{%SuC`45k2#3}#jzNt{QgyWN@sjY`_XQzeLyF#aj-b0;4(`o)8 zzj{(^)0}D3M14N8#X;xrs!EzMK;^CCRc#-KYdCf^kW!nM?)?gJjo)RbcMT{$Iyccc zS9kR!)!}cu+9Vgp< ztYP(JbV=Tr(C?jogoDRe%dw)F}UlL1VmXmj!}A?Pgs;57x1loFg*tAcrmWm&WOY*Pk?4j zKbmRd9RFy1l!vq|{Z>lOvSq1#NolWfhiDY}HG_{758bz|agNWm4K>fiCtimJa=Fb{ z_xx&FH8K$kwAuD)Dl)9L$f_$G4W{ z`t|j;tQ#!c`SxzL)~5ai`A+{*nWOipC5|Z?o@);2e~#WO~d^HBF%VcK5z;1ZOLyd9?ZXt*y=@9TVHS3QTv4mTdn8=Iy##>(v4oP ze9)H1taMaX=VA-OF?p_WnOIaA-i^*0$gVM#{zxg)hIP-IYo){oRG#TZyM)@j8r!_; zzPmk4RjS@=^0`?eHzB*)5#$)kraf$)&R6U1N=UqQ6%?~+*tS&@!nmg^--T)UKAmGv z1FP^#|5{l8cl2RToAxm+Tlt-}N}4WF&#RTcRxY=qCcmV(pl*`c$XGp_+Pt+K&%Tee zGIn26k66A$Ln8^6@XzN_2_WPif7e$Dw+Iy!jMIS5PQiOU)GU|RSCEWDEu4K3V0{HoMG z$ilUZ!TCu_vuGI(A7lSVzUa61q*gX<>sVUP$R0Nqw26ebHl-Q+T$1+V5XLh)P87cJ zxmr)p$Y>X?eOC3y2IwKYhV|4A&Y!#6x4kVZF8|_jYR}jDDE$mhGrs{)ZFckF)SyEWFlXJbAi0oM6M7q)kJ=adT{ z91k}(yncKu4J$~i6dB65)^k`KE-9H9m;Q7c?r1fD?+W7MJjXsr!ZeSO7FKDcc{rR$ z#lsB_1NqkUT3^K>-=;5!!}zd)f1zJR>6g(TUAuo;Xm!Y~ zE5_z|eL{V1;5)HCHxj1xnPXuaOZ}#;4F~F2Xy3i~drSX^tv#*oGLJNz5a2Lc&ziDu zCDPbDZ!+OH|E*G|eQ`VM{4kuGf!Jq@tkt;%boCdQa6@2p;*)F2)c;mtdki3_7^>9@ zp>8d0`HH7GooMHx3r#-g#oUGNqhc@OyN>*F67zeeR(`ebEV`UL8nL2U&K@wGUtGy| z5~l=4iCh`jZA)!Z%wbiTFy#-wVa16 zoRbr(@93kjq3-F+BNp~i3+wc)`nIgcZMe(h3BL7-=J6!oTHaF@mOKnzwaW_c$W*vz z6X0s+=gIRnzZWc=D_ip$PYvU=^5rE9`*H%T=ILNVx^Ujb!mdt$b-G|Q-&ZZ{YYDKL zm&4cPyVk%}AJ`Lm^j09>g*mjIBr`_+#NbI*g&%&SGVb~yE z3}odK?ER|3=N;$s?&r+Ui=4d}$9bCFp7-QN(iDT~YmfSJ&JDgC#MzO(Zzf;Py8Tei z`rW;rbbi~DtG?&F+d$5#ohvfsQO>1s)=pg*-pP5R^_Gnm@qzrg9(x2UzAX>ueAJViWvgUvH;QvH;Bm!|oafnwVBPA; zlEL^MkA3+R3@2>pl{BuMm6=Or5)IU*kt_wt%RKIQjT&dO}$cQcQc zy$1%GTR8XDnBQw?vp%PKlEiz}%Yp34?||n#*_Yp@Jl8*r4*IGuCDT3m=?riv<{o## zkLAqIe*Av)t|#?N@mY5QHXXiqE`_H2CiAr9dHGUb+VESyBWK1?Oz%C3`ziR|jYrEE z$}^Uy56?iJ!8~ViM(wpGo($uC(B6S8y^^y@ydQj$C-2o~UHmp*F2h&eNWxZ(ARPEs z_}jafb85T6ONE4w;h6^y6!Cir&%3nk#r$>~#hE64H}RxSg&zFAIUN3@qwK}ggl8X~ zy?I{T20!q-AJ2h2|KUmIX~~m42wwl#m#g917Z32HIbm&h2J?*O>C2PDb2`s3o|?Nw zM)5oAYHu^oNM=XdcIaOJo6fAE3G@8i$1R|Q_a>}2rfy9wviF6Z~0 z1%X__?`1rrYd90h?>wFxc^2@@;d!LclUw**%(Ikd3D3(sYk1z|d55PB{p&4$KjhiK zvx(;uo|c?#{G8v_Jg@U~rOjNrb$q|U^ES_Vo{c=sF#73!h5zuh;c3fr7?1AR)b+sE zd0ypN$MY`F2RtA1e9E(tXEV>|Jga$L;ZfK(coeodM#}woW@T`e5#!)BoZCAT+4A7c z$l+-sN8u}T^%i8|ag=icXBB$~l6r_I1Lt~@f)R5B?egerzBFQzvg06MrXkF0F5p}$ z#?YypC42!IBozg+gMn-syfS?_XCK>g{%jb2N9i9Y_D9|@s*lOx-0x!ei}P>YNWbr% z$PD^Q-|Rpx`<=68XX0z~OU_Q7$5}NtVGdc#-Cdk%%Y`57(Qn>GRvkotKZyOVzf5QE zHU2UC+>3tNjXr?Ub>LZ?tNYcLSE=XO$9i%RxIev)e(@CT!+FE=8*=V#GGhSw-O-A3 z!WdG&KZh|c8Cmm#FYn#Y8O+i^n!e}BJ#(Q~0q5g5OFC#X=OsDo_iQD;F&DyL$jWh? zRsCeSFWWf>dHd;{Kj!S=THs5c!mlfu$H_IQHxnaGaWPoi(#jt|U9oW&gIN$-xF zt2>W#h7aMt@u zah`VFAHJ-(nzPxQ@td~Alc!HaM&5(0-GmOyxyw1wdTJy3{o&j%#ktSNe<1%}w1Y=K zUB>Tr&RjAcWM?wIJO(`F?0^RK&f^R>=R-Rbb7qw@z}XORAovVJb?$QZO|FBkyg#rZkf)G;jp4Tu zo$;$Wi?i520mJz48s{dfTKlr;I{dKK=bYtfzHDgd$?4!xFbf%ZC9*6Vf1ZqiKX0f1 z9FN@LOl9MI#*G7LU(Q1=OCmqcDK15>XLCkTR3^0#qzF2cUBS8KRh*NCR?mIz$%?(< z_ZflIaNctS){H)kH9O$1=lb~40K@%-N77dGC z{e<=QuAF({>6gu!*taP2Qu^&xp8T;8-@4GhY7;o#DzZEU-GTDnr*Ga5PJNJbUo6JA zDQ7olw8XFK5?@k=1XB79{SI0A);FGPgco{W%pSDQkvHJ93VJoV2ih>!^|?5Zww#0A z9l6k{$TPC6U_4{L_GftDDAqcrwc$MbN3=(GUmokqcux7}c#LC<=|8j44``b|doey; z#F^4B0_nv#+UhDj-|Wd716ik7h2B9w{0`nq`jolJZJzwxPvlI_N~_M232*;A6klzk4fwk?G^-rQzE)pZ!U|}PM;o> z?8}Yt>q_Lo0j)jx@-WUD-x0`Jw9Sl}ocUeJddi2$>tV^ZYaz-ESXw<6y=p#_kO0Fym-=U^jd*lXtfZ(9hZ+_t4{pQr`>V za4>QZ z9y;K4x`#JgyvUT&5zEm>~y!9da z6nvmQmot)lIT9Yc?twra8G_I2XBlIEgl22;t*{b(ctIfjS9|iv6Yv~uR8Aeg+~1SO zrv>uk!;J3_vYvUACynm)<&Q7vSBxw3HX#Qega;O*L(D-AQLm;oteI7FX8L*RIuRe$ z*ZQ*TEs;gE_kxXql;ca{n)8u0-{QmJQ_i9@{)~XvznJOCRNCPZYFZ%R=`{|^>c5?0;{cY~I^n*t|si0pawfE$T(VSU_C#E%JEa=Y~`$l|Q+`QY%E7^pS};{Jmbk9<2-rxKH92` zHrtaiw1&1M&k@M59lvrWz(+?w7WRgRM*hg$1Uihp1YPnYPevW$$-;)ny-CO=(rg)o z4{&JvE;Rd;dN(HBB`sO=7~{#Heeokc3OQY0}A0@fi;6%5wtrXU_M}r5%WC#aOlgUL3+Wv4J|h ziwyaev18F6_;P?(Zi3#a$eNAEGH*GCI>XDqy+j>{GDhtgNI^5&7T8tr@k0=C{cY$c zofxYR#CO4!oSFKa{zSb#r+=O_3>i(o+;=!_&v!@(%GBdrg zCENp}>5o;|I>JvN92Zh0F+XvUGEdexvy&#iZ#+dN#!ow2Sky=9E(Q5+|AV_XI=O-F zBaQEiaN%l~%apO%)!eM1mxOB_HEgH}vp0uF?2)5PxVb0F?Dv4h{5i}u+}~LFKkxTY zTZ`^X(Z6=^uG*vKk%!s=-98wNZw(%bxBhCHYLlX#%m-G}ET}6DFv&bh=V+QmHqBz2 zM)!qjzd^0gJsX@83!2?RoPHWC&={snIf|ds8WPH#HlJlN*q~X3h3jJQi|>VTHq5(Yu;Cs$%~$h_=6jFL_ud$+ zE0b~0(q4Vwh4{tGL^XgWVZNHD=B@eauj0GX=KGLM%eld3yV`FDkK-WFF`ez*Lg8L) zJ(qe~?<`~1{hRod6lmuqJwpC&efLpYmg5n{>oLN%!Gwp{dUKeUzk2dG;Y#}_Y?{m1 zFXY49_0C-#XK#56y|C{qxU1r|n8(_6M`rH>jV|vx_ur#x&g5 ze)SY>GZ?*C_Re{mT{$ys+XFe-17&3=E`s=SQK;6H2f)x1^a{|&GH176m?6UsdH z4KYsFy?)6uR$7MMOKftCeNl0@j`o7Vsi3%M(&Q<6>#fRb4ckM)u<*v)aE#FK<~H2i zcnjV2JX%2AUX0YOjqV@*2lpYLV%NS*7qj`geR3Mc9%X}<8!I)ekqsLTZ)lyh?3W{D z@1bS?MV~ ztCw9F+`Ft{@oSgCOV^CqN9eDL(9G;r56=s#h>Bc*4J{MH;T_jck|`H!_?Udd3?VKW z=4n{SIEFqN=4+TTn5B(|1z}k1Y@?o2s0Zkp2yXSXJ^$wJb=_;W>o`H0%#5MweR~eb z>X*vVyzDgY<<1!p4ibMANzKCbz}F~0syoc4FRNV9ey{dZ?R!plSj)G{5VetNnvwR7 zZ{-P*GQ(op9{R1`?sQ>V&uY6iN<3GR3|u2AHvSlm0E*CSHz_c;#=~c^vquWwSPG!5 z360TvcN3O9ws>?XvlNa#ZCWKUeG?lVLdV;2PbturHQm%!1{PN2QlK|x`#n$po1#(8sfNb8(ps_k4nwN`QmA$W#R;; zFybp`v~`N4eqHoD{m;ORBJCjzOzsSR+d9%!h3;BRnqPsstH_FhxZf#Hm6wlxJ)_uM|c;WX>`~9o^)*ZMS{~_Owwz>zSq^i0SCqTvOTW1aH zufJf=${B^tZ)zYr4`cmrZ~R7Lvns~^TT{+?uM%uDKLm2#H`sY+GIvIBTzM|`?&oa20lG?7^pu@FeXXY;c2Fj-c@)R!)#U4!i~^9a_Aj^bXqQ&+?RSi zSUxiyl=Yn5 zSPR6yyZk5Cq}#GK`eGorvqrExHb?&jPiAAYKfNzDGi?3~Y67`$T_6WxgPXM#8$9bM zbFW7qV@)O3BmeoV)qlsjUJ?5lSbrIZ?X3}XeQ^i)oJt+iSs!WTOVwhL&WEz5guS>a z`Hh*w+S`}FHDLX*p)Yf=Ee=0DkmIpucG=Ts(I$|tCD=FbWZiBnVbFImwBBAnkV{!J zX)3Czro{TgK~JzZVLWRKj|b8oI-GwMzhplAIzKS)En|wJFe$3eh z&)v!11pJDA3%!2p>dB}#J!$t0cSll}N8W%}Srgf_kuO0LY?hs&{r%YIo3XAjF_5u2 z*kn(@?urfgjtNN5a@Gv)MXt?&*9WmKkc&)bO+xns9sP13J+YNmW8>|72zF*@yQv9w z(o1|fe78UjJsnyZxCa}56>FtKStp&t+UH5^H^|~%(2vyvTF z;ZDAcp>0_kOU&WUH6nju8v))wZ zG^}0y{1LJMIdK0p))u~C-H5VJqFoPpk+rlJ@gol2du~Oic#(C(Gr;R(^u>dGx#uc) z;8^4%Z9MC9bj2iOawfdqigi)=VPY!lPt^0IVXSj~!y0l0>(lMw%V&_E^tl^eV(kXr z>aseJpRd5z2kR6+E%oJzVT==GWgU-QFN=F)_rkaFmB_M`Ko-J>%@;6EBMWDKiHy6= zlYT$L|97&!ev2npL&vU+pVuS94!t{&MfAa0H<1>()$LsP48Hsnd7x`5&8LaX=;h0! zd5lxYy2-51OovCWxhxPb;O^AHtn)NropKFrhm7t2B=EG6?m>GD*)SKmIHfT%pp7Tz z()Jt9!_I%8wZ1F42blHU`a?<6i!~+2l=DAl-`i=(gioL&?Ynyg zd+KJgZcdvmoXuVb_8L5V0B)UovxkrVcP-=Q{6knDAIzF2ePS(Z!{2>Id{5S1!TDkO z_PY0wJ?C>KX`Lq%`f?{Qb^6!;|G)nK8*cp9|Np=K|JnO=-oO6;|MmaRUW1f>?*IQ= zbexr4*#mV7dQd<17QM_Eg?`-$z2@C(xU-@=gFkxCg%>m45I15p`f?e2$C(cbx=Pz) z(Sew29Q+zKICT7jE@b>i7dV#1(86)-otVp>>N7>|`N@;yMeGA=63EHu4No^>AK3+r z*%O%4pwrD~%zFs^@Qi%st9!FA`(y4mNB3BSK2^Vry;ev0a>N(xMdJOp8SEXqin}7% zgB7s%qv>w=zd_gd{dja_#?_C}aa+%3y^-;F(Ie<%=y{#f*jJ2BUN(sRgUoNf6Xwkm zsaGF#&)3=GHG+No$20%?hCGkPw!nD1dJHU?anS8dK&%6*l z?U-%oe9X=FIR*U?-TRds=AIWYX6O6z%{t}}7h&7Io_#7)&{rzZ;np*!L$`hY0`>y6 zW8Mdi$L-C0s~p?G66oqP|G65Q1?{mG_#4oTZbHw#5WVjr_L4MS!hVv=eHl7H4v`#g3qXKaGrhu(XCJEr2$ddEcOMXBf| z=wUOM16}(oeDOBA`bF#~JHeOTXM)EFbfvf8ja%6JgI+q9x%$2>n4ir>FTa#~J^C@% zn1DYxbj1wnI`ju$1}{bbVlUd;FMIOUi<}pru4j*A4grn7qApMFA4tl}%qMnuvU)rE z>l4^A&Sjq}^RH$fGDlb+$f(WeTra@4%q5qPg+H0Y`{-c9!Mjy&bVYQn4~W~?nLXg^ znR6`mr(>@E(RX5!LuR)Ju<~zq<&za8K zxMzd%wl71U>%}}`av)o`qN85tOUD_|mbuHCzRZhg*Bt8Bg0|Q~f4c--?s*@csPW}- z@bWeizm0o+&R~8BuQ#OL-v^wrp3Xe3KJ!ZOxq~`C^d)@)lY+FXQwdL+J#p+`IBjJ=r$cjyMqSFk^vx=*JM zj(?atQ|NEAhpPB*X(+ao#^*ifyk}R84wQi@=9l&?zB7RCdc{_>2i@S! zZ8+zcQ+6H4y@+-8J-EkShtBc08!)F}k3oK|_XWZHcK8#*@zFi7&t8l5_K_fX4ad>1 z;my=KWPJ$#ug4nx1Z*$m_yYEaup_%Fz}k5ej@xk!@J9rQ01+SpM1Tko0U|&Ih``$p zfz?k97Di=M&>zlXPye}(33u1|^DB^a9((ul`!)1;3Af;X;RKYQ*e-W)v^Fka{-q<;$p9|0!M47W4Xw%lVa>&S4uj{Ux5E*F_u3|qOq7{&mPm( zD%aKpxN)*2dkFg+rJSU?y2$_M`4=yWH&4#_T7S;T|0nm4Sey5f}wZ9W?6|F;# zVmW)Gt7EsXgZzJT4U_**u1NbFBmbY}3{^bt@b`*MSMELX|A8COtu4s^w`>jh|I9-M z-y7xF`OF$Omx61C{C`v8?!GcZe>=5q9btSf$Y6B&+7%DthSgAcfSN75g3|I`29vNggzr}o}rZ%O}u_SyZrp1JmM z#MNFw{ug`G|Cj&2durgI0#DPG2pjPo_uV+&g>WCj?nWVa633n3DYz2fZC{Nrfp8dM z8sT1qZ{u6{`<}=5#kax-&zq0%sUF(Y{$&9-R1D zA?SM<9QNS+`g@GsN~1%A{~4TE!FKu&lpO{AQU3>jIrcABgERRzr@&i$625pZ14sNZ z@Y93iZp&J5v+ctE3pkRea4l^*0i^XLRp-8xj#>NvC%_GUd>;EFJ^X*C-wWSI2;0%| z6_?xI!-q5&!{3^p$k}q-DVAGtgd_8vn0!bkY0+iZKnAtLc-UHk_weiHF7EJgd7F^65_hY~}#ekV_%E#Z8F$%XjO zHe(&XvDip%Pe!gUR%&yluoAV4)Aee%2(OmKTC)?y%~D;l8^QjT_+6&au|I$9re%$#!KY&D7~-zF=BsIp5ykNT!_1T(O*Nrl&m!eLuY{ zEqF%#bBY~rW_;dnr>46i9`m@Toh%++riC(CeL3IG$n}|VsmvA2$-dgt9)x~eUX~X0 zt)Tn}T+pNu+VvvC|XJL9z}T-RG&yTY^csfm3D4}Ipd;rPUXo5IQcHxCa5XY{)N zE97BlI7FS-S?6rF)$YLYw(*;-zG)ZcH4bJ&&8pY=i&E!Ywd-oCXU}<$EWyp=$I&Be zi%iF^GTUO^UtjrjsV==YUN!wlnrTN;*(*IVDXIN;<+NBi+s7VRZftKDEaws}xJX}A zlpA+Xoo3wHm)C4R%UUp7XRk~ODqhPlH-_j+FJAfdJYMgxWtzTF=6>vvnf_~Amzi?v zr8vbgpPp|kFO#09*T0i#*ZuX8OPA_0{afeyp1tO@e^=#X=`|(kb4k+{$+W-C=J!?U zxo~Z`^!#}8GCLkE*OzNQG}x)^{Z>}?jb+BvBg=o3s`HbHPvAK3?x zSGsmn>1d?=vU6tO^PF^f()rZoMBnwCX*~zKrM7yv*KwV2BE3#9wmp296>ZUr5rwpQ3+yjqOI7y^osh z+0MQ=Zp9|=KU`V3G&AvkA};4|6m2bu&eMR#(-5cbrFP9-BmY7h$Iu4co(6}PK*vaC zN^w*vc00GXqa@=${w&%_&<uBREXk#Zn{*yM}KwR$YvpAm;f78X`qTR#`$S3mW7eC*%NsO2JKlOj=|88%< z>8;tl0o6m@enU>jSD7o8lcjp9-EW}&Z}&BzT2udTcB)>f$8%4gP1OH`phs8F>7dmA z<-(!@urHH^Pbm~!rPa~}VxYgm$;TwQH z#5aR?LG1mv;s5IpK7b(k--Q5EoB-w#;ByRu_aNZ&fIvPCfVn|{EtWv|iSao>Ao~g% z5H=xfMv!_z+YszPxE4V+5I~&?U#Ifjf!ODOix5F<;9)8PTM@Cr2!d-6b|LUb1c(3; zAOb{y2oM1xKm>>Y5g-CYfCyYX0w2EkA}m1!hyW2F0z`la5CI}U1c(3;AOb{y2oM1x fKm>>Y5g-CYfCvx)B0vO)01+SpM1TlfVhH>PHOsa3 literal 184320 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 F_Ipt{Mwl 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 z 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 diff --git a/extern/lib/libdeflatestatic.lib b/extern/lib/libdeflatestatic.lib index 2c457d1d77fe01c630179976426039c1b3fd3aa2..7b9d664c5e0e70806a794f99312f9485ce8d6943 100644 GIT binary patch delta 77286 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 delta 46923 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
    F-Z96QB`a<%ej|#d-2FJOK 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 delta 3111 zcmeHJYfMyE5dP*~SU?w8#N{E%yKF6ju;4RRS)oWxTUTR!M4NS4R@nf8y9=6D1f>43 zDdlmRU|O4CV$xcnKDG%pRnY!0^^y8$ZH$@*n>N-osAwxzZRs3#*Pzk*hcjC<^=piy0;ZX@u33Kw8mY zT25b!i>6=21yhu`H1~UPbZ%J4IG?UY9LtZZliqAj8~bvVJ8brB>CLYZ!Px4`@)App z-Dat>l~+`kBi?WQz;46zseX`c{rF>SWwh`|s`vUXEU{Esoo*!Cu&lSfFCg2YM{x4H-!p8<;&D42a*K>+KSdsXZh zP+&?V^siLWwH2Ut!kSA82HqmHwGu4*6~r|XKB^$kiDgrQTFtBWuj&|0yF5F}_Ne;% z5x^l%G@TRi*IpwIRK{skKA1Ij(Nh*x;V#BJ!pFj?76cn8*COQq-f$T-j6frs8Zu_A}B}$Vp;4A22QFXxqg1i!d}8^E_H1S;qEw~K?BVB3V7uru+2tj?NL3= z^$un7l?lMQP{Nfu6~DJCShACFJyAu)$11Y7D0suohDC&wA63-0LCk5?I|lOK1I6%~C^ zgf5Qx)Hz^&EjN%I1aP|YIm+(<&*jDhZL4_}C#&zs_5$xd=S_Aa8-C$QYWeWlzB?VW z;$tO$`X!eF_^yJ+NbX+a`E}-QwC)B=QbXPrS#;6Tvt9oiPk;*Jl&KDjV>$*x^;{ld z>W$Rj9*N`_A(27h=rzzC(b^lC@y7_f+K1mAxi&Qy$e$X_BZs77XRyb3`km-!u|NMSx!;(nd#cT( z?rAoYyyHMvJTQI}vw8+#e^Eu#32rXc{GkkBp6pWji~N|56T|e#xXyrvj2ChIg>gApZHhVJwA_agg@aIp*z`3 HKP3DOnlb-g diff --git a/extern/src/GLFW/glfw3.h b/extern/src/GLFW/glfw3.h index 4a2b7e23..3c20563a 100644 --- a/extern/src/GLFW/glfw3.h +++ b/extern/src/GLFW/glfw3.h @@ -1,5 +1,5 @@ /************************************************************************* - * GLFW 3.3 - www.glfw.org + * GLFW 3.4 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard @@ -262,13 +262,12 @@ extern "C" { /* We are building GLFW as a Win32 DLL */ #define GLFWAPI __declspec(dllexport) #elif defined(_WIN32) && defined(GLFW_DLL) - /* We are calling GLFW as a Win32 DLL */ + /* We are calling a GLFW Win32 DLL */ #define GLFWAPI __declspec(dllimport) #elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a shared / dynamic library */ + /* We are building GLFW as a Unix shared library */ #define GLFWAPI __attribute__((visibility("default"))) #else - /* We are building or calling GLFW as a static library */ #define GLFWAPI #endif @@ -292,14 +291,14 @@ extern "C" { * features are added to the API but it remains backward-compatible. * @ingroup init */ -#define GLFW_VERSION_MINOR 3 +#define GLFW_VERSION_MINOR 4 /*! @brief The revision number of the GLFW header. * * The revision number of the GLFW header. This is incremented when a bug fix * release is made that does not contain any API changes. * @ingroup init */ -#define GLFW_VERSION_REVISION 7 +#define GLFW_VERSION_REVISION 0 /*! @} */ /*! @brief One. @@ -344,10 +343,15 @@ extern "C" { * @ingroup input */ #define GLFW_REPEAT 2 + +/*! @ingroup input + */ +#define GLFW_KEY_UNKNOWN -1 + /*! @} */ -/*! @defgroup keys Keyboard keys - * @brief Keyboard key IDs. +/*! @defgroup keys Keyboard key tokens + * @brief Keyboard key tokens. * * See [key input](@ref input_key) for how these are used. * @@ -357,7 +361,7 @@ extern "C" { * * The naming of the key codes follow these rules: * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * - Names of printable alphanumeric characters are used (e.g. "A", "R", * "3", etc.) * - For non-alphanumeric characters, Unicode:ish names are used (e.g. * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not @@ -370,9 +374,6 @@ extern "C" { * @{ */ -/* The unknown key */ -#define GLFW_KEY_UNKNOWN -1 - /* Printable keys */ #define GLFW_KEY_SPACE 32 #define GLFW_KEY_APOSTROPHE 39 /* ' */ @@ -630,7 +631,7 @@ extern "C" { * GLFW could not find support for the requested API on the system. * * @analysis The installed graphics driver does not support the requested - * API, or does not support it via the chosen context creation backend. + * API, or does not support it via the chosen context creation API. * Below are a few examples. * * @par @@ -696,6 +697,66 @@ extern "C" { * @analysis Application programmer error. Fix the offending call. */ #define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @brief The specified cursor shape is not available. + * + * The specified standard cursor shape is not available, either because the + * current platform cursor theme does not provide it or because it is not + * available on the platform. + * + * @analysis Platform or system settings limitation. Pick another + * [standard cursor shape](@ref shapes) or create a + * [custom cursor](@ref cursor_custom). + */ +#define GLFW_CURSOR_UNAVAILABLE 0x0001000B +/*! @brief The requested feature is not provided by the platform. + * + * The requested feature is not provided by the platform, so GLFW is unable to + * implement it. The documentation for each function notes if it could emit + * this error. + * + * @analysis Platform or platform version limitation. The error can be ignored + * unless the feature is critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNAVAILABLE 0x0001000C +/*! @brief The requested feature is not implemented for the platform. + * + * The requested feature has not yet been implemented in GLFW for this platform. + * + * @analysis An incomplete implementation of GLFW for this platform, hopefully + * fixed in a future release. The error can be ignored unless the feature is + * critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNIMPLEMENTED 0x0001000D +/*! @brief Platform unavailable or no matching platform was found. + * + * If emitted during initialization, no matching platform was found. If the @ref + * GLFW_PLATFORM init hint was set to `GLFW_ANY_PLATFORM`, GLFW could not detect any of + * the platforms supported by this library binary, except for the Null platform. If the + * init hint was set to a specific platform, it is either not supported by this library + * binary or GLFW was not able to detect it. + * + * If emitted by a native access function, GLFW was initialized for a different platform + * than the function is for. + * + * @analysis Failure to detect any platform usually only happens on non-macOS Unix + * systems, either when no window system is running or the program was run from + * a terminal that does not have the necessary environment variables. Fall back to + * a different platform if possible or notify the user that no usable platform was + * detected. + * + * Failure to detect a specific platform may have the same cause as above or be because + * support for that platform was not compiled in. Call @ref glfwPlatformSupported to + * check whether a specific platform is supported by a library binary. + */ +#define GLFW_PLATFORM_UNAVAILABLE 0x0001000E /*! @} */ /*! @addtogroup window @@ -771,6 +832,25 @@ extern "C" { */ #define GLFW_FOCUS_ON_SHOW 0x0002000C +/*! @brief Mouse input transparency window hint and attribute + * + * Mouse input transparency [window hint](@ref GLFW_MOUSE_PASSTHROUGH_hint) or + * [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib). + */ +#define GLFW_MOUSE_PASSTHROUGH 0x0002000D + +/*! @brief Initial position x-coordinate window hint. + * + * Initial position x-coordinate [window hint](@ref GLFW_POSITION_X). + */ +#define GLFW_POSITION_X 0x0002000E + +/*! @brief Initial position y-coordinate window hint. + * + * Initial position y-coordinate [window hint](@ref GLFW_POSITION_Y). + */ +#define GLFW_POSITION_Y 0x0002000F + /*! @brief Framebuffer bit depth hint. * * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). @@ -846,9 +926,10 @@ extern "C" { * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). */ #define GLFW_REFRESH_RATE 0x0002100F -/*! @brief Framebuffer double buffering hint. +/*! @brief Framebuffer double buffering hint and attribute. * - * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER_hint) and + * [attribute](@ref GLFW_DOUBLEBUFFER_attrib). */ #define GLFW_DOUBLEBUFFER 0x00021010 @@ -890,10 +971,15 @@ extern "C" { #define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 /*! @brief Debug mode context hint and attribute. * - * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and - * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). + * Debug mode context [hint](@ref GLFW_CONTEXT_DEBUG_hint) and + * [attribute](@ref GLFW_CONTEXT_DEBUG_attrib). */ -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +#define GLFW_CONTEXT_DEBUG 0x00022007 +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_OPENGL_DEBUG_CONTEXT GLFW_CONTEXT_DEBUG /*! @brief OpenGL profile hint and attribute. * * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and @@ -922,8 +1008,15 @@ extern "C" { * [window hint](@ref GLFW_SCALE_TO_MONITOR). */ #define GLFW_SCALE_TO_MONITOR 0x0002200C -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). +/*! @brief Window framebuffer scaling + * [window hint](@ref GLFW_SCALE_FRAMEBUFFER_hint). + */ +#define GLFW_SCALE_FRAMEBUFFER 0x0002200D +/*! @brief Legacy name for compatibility. + * + * This is an alias for the + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for + * compatibility with earlier versions. */ #define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 /*! @brief macOS specific @@ -942,6 +1035,16 @@ extern "C" { * [window hint](@ref GLFW_X11_CLASS_NAME_hint). */ #define GLFW_X11_INSTANCE_NAME 0x00024002 +#define GLFW_WIN32_KEYBOARD_MENU 0x00025001 +/*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint). + */ +#define GLFW_WIN32_SHOWDEFAULT 0x00025002 +/*! @brief Wayland specific + * [window hint](@ref GLFW_WAYLAND_APP_ID_hint). + * + * Allows specification of the Wayland app_id. + */ +#define GLFW_WAYLAND_APP_ID 0x00026001 /*! @} */ #define GLFW_NO_API 0 @@ -965,6 +1068,7 @@ extern "C" { #define GLFW_CURSOR_NORMAL 0x00034001 #define GLFW_CURSOR_HIDDEN 0x00034002 #define GLFW_CURSOR_DISABLED 0x00034003 +#define GLFW_CURSOR_CAPTURED 0x00034004 #define GLFW_ANY_RELEASE_BEHAVIOR 0 #define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 @@ -974,17 +1078,31 @@ extern "C" { #define GLFW_EGL_CONTEXT_API 0x00036002 #define GLFW_OSMESA_CONTEXT_API 0x00036003 +#define GLFW_ANGLE_PLATFORM_TYPE_NONE 0x00037001 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGL 0x00037002 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGLES 0x00037003 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D9 0x00037004 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D11 0x00037005 +#define GLFW_ANGLE_PLATFORM_TYPE_VULKAN 0x00037007 +#define GLFW_ANGLE_PLATFORM_TYPE_METAL 0x00037008 + +#define GLFW_WAYLAND_PREFER_LIBDECOR 0x00038001 +#define GLFW_WAYLAND_DISABLE_LIBDECOR 0x00038002 + +#define GLFW_ANY_POSITION 0x80000000 + /*! @defgroup shapes Standard cursor shapes * @brief Standard system cursor shapes. * - * See [standard cursor creation](@ref cursor_standard) for how these are used. + * These are the [standard cursor shapes](@ref cursor_standard) that can be + * requested from the platform (window system). * * @ingroup input * @{ */ /*! @brief The regular arrow cursor shape. * - * The regular arrow cursor. + * The regular arrow cursor shape. */ #define GLFW_ARROW_CURSOR 0x00036001 /*! @brief The text input I-beam cursor shape. @@ -992,31 +1110,106 @@ extern "C" { * The text input I-beam cursor shape. */ #define GLFW_IBEAM_CURSOR 0x00036002 -/*! @brief The crosshair shape. +/*! @brief The crosshair cursor shape. * - * The crosshair shape. + * The crosshair cursor shape. */ #define GLFW_CROSSHAIR_CURSOR 0x00036003 -/*! @brief The hand shape. +/*! @brief The pointing hand cursor shape. * - * The hand shape. + * The pointing hand cursor shape. */ -#define GLFW_HAND_CURSOR 0x00036004 -/*! @brief The horizontal resize arrow shape. +#define GLFW_POINTING_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize/move arrow shape. * - * The horizontal resize arrow shape. + * The horizontal resize/move arrow shape. This is usually a horizontal + * double-headed arrow. */ -#define GLFW_HRESIZE_CURSOR 0x00036005 -/*! @brief The vertical resize arrow shape. +#define GLFW_RESIZE_EW_CURSOR 0x00036005 +/*! @brief The vertical resize/move arrow shape. * - * The vertical resize arrow shape. + * The vertical resize/move shape. This is usually a vertical double-headed + * arrow. */ -#define GLFW_VRESIZE_CURSOR 0x00036006 +#define GLFW_RESIZE_NS_CURSOR 0x00036006 +/*! @brief The top-left to bottom-right diagonal resize/move arrow shape. + * + * The top-left to bottom-right diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NWSE_CURSOR 0x00036007 +/*! @brief The top-right to bottom-left diagonal resize/move arrow shape. + * + * The top-right to bottom-left diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NESW_CURSOR 0x00036008 +/*! @brief The omni-directional resize/move cursor shape. + * + * The omni-directional resize cursor/move shape. This is usually either + * a combined horizontal and vertical double-headed arrow or a grabbing hand. + */ +#define GLFW_RESIZE_ALL_CURSOR 0x00036009 +/*! @brief The operation-not-allowed shape. + * + * The operation-not-allowed shape. This is usually a circle with a diagonal + * line through it. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HRESIZE_CURSOR GLFW_RESIZE_EW_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_VRESIZE_CURSOR GLFW_RESIZE_NS_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HAND_CURSOR GLFW_POINTING_HAND_CURSOR /*! @} */ #define GLFW_CONNECTED 0x00040001 #define GLFW_DISCONNECTED 0x00040002 +/*! @brief ANGLE rendering backend init hint. + * + * ANGLE rendering backend [init hint](@ref GLFW_ANGLE_PLATFORM_TYPE_hint). + */ +#define GLFW_ANGLE_PLATFORM_TYPE 0x00050002 +/*! @brief Platform selection init hint. + * + * Platform selection [init hint](@ref GLFW_PLATFORM). + */ +#define GLFW_PLATFORM 0x00050003 /*! @brief macOS specific init hint. * * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). @@ -1027,6 +1220,30 @@ extern "C" { * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). */ #define GLFW_COCOA_MENUBAR 0x00051002 +/*! @brief X11 specific init hint. + * + * X11 specific [init hint](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint). + */ +#define GLFW_X11_XCB_VULKAN_SURFACE 0x00052001 +/*! @brief Wayland specific init hint. + * + * Wayland specific [init hint](@ref GLFW_WAYLAND_LIBDECOR_hint). + */ +#define GLFW_WAYLAND_LIBDECOR 0x00053001 +/*! @} */ + +/*! @addtogroup init + * @{ */ +/*! @brief Hint value that enables automatic platform selection. + * + * Hint value for @ref GLFW_PLATFORM that enables automatic platform selection. + */ +#define GLFW_ANY_PLATFORM 0x00060000 +#define GLFW_PLATFORM_WIN32 0x00060001 +#define GLFW_PLATFORM_COCOA 0x00060002 +#define GLFW_PLATFORM_WAYLAND 0x00060003 +#define GLFW_PLATFORM_X11 0x00060004 +#define GLFW_PLATFORM_NULL 0x00060005 /*! @} */ #define GLFW_DONT_CARE -1 @@ -1100,6 +1317,157 @@ typedef struct GLFWwindow GLFWwindow; */ typedef struct GLFWcursor GLFWcursor; +/*! @brief The function pointer type for memory allocation callbacks. + * + * This is the function pointer type for memory allocation callbacks. A memory + * allocation callback function has the following signature: + * @code + * void* function_name(size_t size, void* user) + * @endcode + * + * This function must return either a memory block at least `size` bytes long, + * or `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `malloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The size will always be greater than zero. Allocations of size zero are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] size The minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated memory block, or `NULL` if an + * error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWallocatefun)(size_t size, void* user); + +/*! @brief The function pointer type for memory reallocation callbacks. + * + * This is the function pointer type for memory reallocation callbacks. + * A memory reallocation callback function has the following signature: + * @code + * void* function_name(void* block, size_t size, void* user) + * @endcode + * + * This function must return a memory block at least `size` bytes long, or + * `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `realloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The block address will never be `NULL` and the size will always be greater than zero. + * Reallocations of a block to size zero are converted into deallocations before reaching + * the custom allocator. Reallocations of `NULL` to a non-zero size are converted into + * regular allocations before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to reallocate. + * @param[in] size The new minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated or resized memory block, or + * `NULL` if an error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWreallocatefun)(void* block, size_t size, void* user); + +/*! @brief The function pointer type for memory deallocation callbacks. + * + * This is the function pointer type for memory deallocation callbacks. + * A memory deallocation callback function has the following signature: + * @code + * void function_name(void* block, void* user) + * @endcode + * + * This function may deallocate the specified memory block. This memory block + * will have been allocated with the same allocator. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * The block address will never be `NULL`. Deallocations of `NULL` are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to deallocate. + * @param[in] user The user-defined pointer from the allocator. + * + * @pointer_lifetime The specified memory block will not be accessed by GLFW + * after this function is called. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void (* GLFWdeallocatefun)(void* block, void* user); + /*! @brief The function pointer type for error callbacks. * * This is the function pointer type for error callbacks. An error callback @@ -1415,7 +1783,7 @@ typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffse * * @param[in] window The window that received the event. * @param[in] key The [keyboard key](@ref keys) that was pressed or released. - * @param[in] scancode The system-specific scancode of the key. + * @param[in] scancode The platform-specific scancode of the key. * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future * releases may add more actions. * @param[in] mods Bit field describing which [modifier keys](@ref mods) were @@ -1613,6 +1981,39 @@ typedef struct GLFWimage unsigned char* pixels; } GLFWimage; +/*! @brief Custom heap memory allocator. + * + * This describes a custom heap memory allocator for GLFW. To set an allocator, pass it + * to @ref glfwInitAllocator before initializing the library. + * + * @sa @ref init_allocator + * @sa @ref glfwInitAllocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef struct GLFWallocator +{ + /*! The memory allocation function. See @ref GLFWallocatefun for details about + * allocation function. + */ + GLFWallocatefun allocate; + /*! The memory reallocation function. See @ref GLFWreallocatefun for details about + * reallocation function. + */ + GLFWreallocatefun reallocate; + /*! The memory deallocation function. See @ref GLFWdeallocatefun for details about + * deallocation function. + */ + GLFWdeallocatefun deallocate; + /*! The user pointer for this custom allocator. This value will be passed to the + * allocator functions. + */ + void* user; +} GLFWallocator; + + /************************************************************************* * GLFW API functions *************************************************************************/ @@ -1630,16 +2031,36 @@ typedef struct GLFWimage * Additional calls to this function after successful initialization but before * termination will return `GLFW_TRUE` immediately. * + * The @ref GLFW_PLATFORM init hint controls which platforms are considered during + * initialization. This also depends on which platforms the library was compiled to + * support. + * * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_PLATFORM_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. * * @remark @macos This function will change the current directory of the * application to the `Contents/Resources` subdirectory of the application's * bundle, if present. This can be disabled with the @ref * GLFW_COCOA_CHDIR_RESOURCES init hint. * + * @remark @macos This function will create the main menu and dock icon for the + * application. If GLFW finds a `MainMenu.nib` it is loaded and assumed to + * contain a menu bar. Otherwise a minimal menu bar is created manually with + * common commands like Hide, Quit and About. The About entry opens a minimal + * about dialog with information from the application's bundle. The menu bar + * and dock icon can be disabled entirely with the @ref GLFW_COCOA_MENUBAR init + * hint. + * + * @remark __Wayland, X11:__ If the library was compiled with support for both + * Wayland and X11, and the @ref GLFW_PLATFORM init hint is set to + * `GLFW_ANY_PLATFORM`, the `XDG_SESSION_TYPE` environment variable affects + * which platform is picked. If the environment variable is not set, or is set + * to something other than `wayland` or `x11`, the regular detection mechanism + * will be used instead. + * * @remark @x11 This function will set the `LC_CTYPE` category of the * application locale according to the current environment if that category is * still "C". This is because the "C" locale breaks Unicode text input. @@ -1647,6 +2068,8 @@ typedef struct GLFWimage * @thread_safety This function must only be called from the main thread. * * @sa @ref intro_init + * @sa @ref glfwInitHint + * @sa @ref glfwInitAllocator * @sa @ref glfwTerminate * * @since Added in version 1.0. @@ -1721,6 +2144,85 @@ GLFWAPI void glfwTerminate(void); */ GLFWAPI void glfwInitHint(int hint, int value); +/*! @brief Sets the init allocator to the desired value. + * + * To use the default allocator, call this function with a `NULL` argument. + * + * If you specify an allocator struct, every member must be a valid function + * pointer. If any member is `NULL`, this function will emit @ref + * GLFW_INVALID_VALUE and the init allocator will be unchanged. + * + * The functions in the allocator must fulfil a number of requirements. See the + * documentation for @ref GLFWallocatefun, @ref GLFWreallocatefun and @ref + * GLFWdeallocatefun for details. + * + * @param[in] allocator The allocator to use at the next initialization, or + * `NULL` to use the default one. + * + * @errors Possible errors include @ref GLFW_INVALID_VALUE. + * + * @pointer_lifetime The specified allocator is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref init_allocator + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitAllocator(const GLFWallocator* allocator); + +#if defined(VK_VERSION_1_0) + +/*! @brief Sets the desired Vulkan `vkGetInstanceProcAddr` function. + * + * This function sets the `vkGetInstanceProcAddr` function that GLFW will use for all + * Vulkan related entry point queries. + * + * This feature is mostly useful on macOS, if your copy of the Vulkan loader is in + * a location where GLFW cannot find it through dynamic loading, or if you are still + * using the static library version of the loader. + * + * If set to `NULL`, GLFW will try to load the Vulkan loader dynamically by its standard + * name and get this function from there. This is the default behavior. + * + * The standard name of the loader is `vulkan-1.dll` on Windows, `libvulkan.so.1` on + * Linux and other Unix-like systems and `libvulkan.1.dylib` on macOS. If your code is + * also loading it via these names then you probably don't need to use this function. + * + * The function address you set is never reset by GLFW, but it only takes effect during + * initialization. Once GLFW has been initialized, any updates will be ignored until the + * library is terminated and initialized again. + * + * @param[in] loader The address of the function to use, or `NULL`. + * + * @par Loader function signature + * @code + * PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance instance, const char* name) + * @endcode + * For more information about this function, see the + * [Vulkan Registry](https://www.khronos.org/registry/vulkan/). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref vulkan_loader + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitVulkanLoader(PFN_vkGetInstanceProcAddr loader); + +#endif /*VK_VERSION_1_0*/ + /*! @brief Retrieves the version of the GLFW library. * * This function retrieves the major, minor and revision numbers of the GLFW @@ -1751,15 +2253,18 @@ GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); /*! @brief Returns a string describing the compile-time configuration. * * This function returns the compile-time generated - * [version string](@ref intro_version_string) of the GLFW library binary. It - * describes the version, platform, compiler and any platform-specific - * compile-time options. It should not be confused with the OpenGL or OpenGL - * ES version string, queried with `glGetString`. + * [version string](@ref intro_version_string) of the GLFW library binary. It describes + * the version, platforms, compiler and any platform or operating system specific + * compile-time options. It should not be confused with the OpenGL or OpenGL ES version + * string, queried with `glGetString`. * * __Do not use the version string__ to parse the GLFW library version. The * @ref glfwGetVersion function provides the version of the running library * binary in numerical format. * + * __Do not use the version string__ to parse what platforms are supported. The @ref + * glfwPlatformSupported function lets you query platform support. + * * @return The ASCII encoded GLFW version string. * * @errors None. @@ -1856,6 +2361,51 @@ GLFWAPI int glfwGetError(const char** description); */ GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); +/*! @brief Returns the currently selected platform. + * + * This function returns the platform that was selected during initialization. The + * returned value will be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @return The currently selected platform, or zero if an error occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwPlatformSupported + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwGetPlatform(void); + +/*! @brief Returns whether the library includes support for the specified platform. + * + * This function returns whether the library was compiled with support for the specified + * platform. The platform must be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @param[in] platform The platform to query. + * @return `GLFW_TRUE` if the platform is supported, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwGetPlatform + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwPlatformSupported(int platform); + /*! @brief Returns the currently connected monitors. * * This function returns an array of handles for all currently connected @@ -1939,7 +2489,7 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); * This function returns the position, in screen coordinates, of the upper-left * corner of the work area of the specified monitor along with the work area * size in screen coordinates. The work area is defined as the area of the - * monitor not occluded by the operating system task bar where present. If no + * monitor not occluded by the window system task bar where present. If no * task bar exists then the work area is the monitor resolution in screen * coordinates. * @@ -1970,10 +2520,11 @@ GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, * This function returns the size, in millimetres, of the display area of the * specified monitor. * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. + * Some platforms do not provide accurate monitor size information, either + * because the monitor [EDID][] data is incorrect or because the driver does + * not report it accurately. + * + * [EDID]: https://en.wikipedia.org/wiki/Extended_display_identification_data * * Any or all of the size arguments may be `NULL`. If an error occurs, all * non-`NULL` size arguments will be set to zero. @@ -2020,6 +2571,9 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_ERROR. * + * @remark @wayland Fractional scaling information is not yet available for + * monitors, so this function only returns integer content scales. + * * @thread_safety This function must only be called from the main thread. * * @sa @ref monitor_scale @@ -2216,11 +2770,11 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] gamma The desired exponent. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_INVALID_VALUE, + * @ref GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -2240,11 +2794,11 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); * @return The current gamma ramp, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE while * returning `NULL`. * * @pointer_lifetime The returned structure and its arrays are allocated and @@ -2279,8 +2833,8 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] ramp The gamma ramp to use. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark The size of the specified gamma ramp should match the size of the * current ramp for that monitor. @@ -2288,7 +2842,7 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); * @remark @win32 The gamma ramp size must be 256. * * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. * * @pointer_lifetime The specified gamma ramp is copied before this function * returns. @@ -2431,10 +2985,10 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value); * OpenGL or OpenGL ES context. * * By default, newly created windows use the placement recommended by the - * window system. To create the window at a specific position, make it - * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window - * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) - * it. + * window system. To create the window at a specific position, set the @ref + * GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints before creation. To + * restore the default behavior, set either or both hints back to + * `GLFW_ANY_POSITION`. * * As long as at least one full screen window is not iconified, the screensaver * is prohibited from starting. @@ -2460,8 +3014,8 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value); * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref - * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref - * GLFW_PLATFORM_ERROR. + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. * * @remark @win32 Window creation will fail if the Microsoft GDI software * OpenGL implementation is the only one available. @@ -2474,40 +3028,44 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value); * @remark @win32 The context to share resources with must not be current on * any other thread. * - * @remark @macos The OS only supports forward-compatible core profile contexts - * for OpenGL versions 3.2 and later. Before creating an OpenGL context of - * version 3.2 or later you must set the - * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and - * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. - * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. + * @remark @macos The OS only supports core profile contexts for OpenGL + * versions 3.2 and later. Before creating an OpenGL context of version 3.2 or + * later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) + * hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all + * on macOS. * * @remark @macos The GLFW window has no icon, as it is not a document * window, but the dock icon will be the same as the application bundle's icon. * For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. + * [Bundle Programming Guide][bundle-guide] in the Mac Developer Library. * - * @remark @macos The first time a window is created the menu bar is created. - * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu - * bar. Otherwise a minimal menu bar is created manually with common commands - * like Hide, Quit and About. The About entry opens a minimal about dialog - * with information from the application's bundle. Menu bar creation can be - * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ * * @remark @macos On OS X 10.10 and later the window frame will not be rendered * at full resolution on Retina displays unless the - * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the * application bundle's `Info.plist`. For more information, see - * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) - * in the Mac Developer Library. The GLFW test and example programs use - * a custom `Info.plist` template for this, which can be found as - * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * [High Resolution Guidelines for OS X][hidpi-guide] in the Mac Developer + * Library. The GLFW test and example programs use a custom `Info.plist` + * template for this, which can be found as `CMake/Info.plist.in` in the source + * tree. + * + * [hidpi-guide]: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html * * @remark @macos When activating frame autosaving with * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified * window size and position may be overridden by previously saved values. * + * @remark @wayland GLFW uses [libdecor][] where available to create its window + * decorations. This in turn uses server-side XDG decorations where available + * and provides high quality client-side decorations on compositors like GNOME. + * If both XDG decorations and libdecor are unavailable, GLFW falls back to + * a very simple set of window decorations that only support moving, resizing + * and the window manager's right-click menu. + * + * [libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor + * * @remark @x11 Some window managers will not respect the placement of * initially hidden windows. * @@ -2524,20 +3082,6 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value); * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to * override this. * - * @remark @wayland Compositors should implement the xdg-decoration protocol - * for GLFW to decorate the window properly. If this protocol isn't - * supported, or if the compositor prefers client-side decorations, a very - * simple fallback frame will be drawn using the wp_viewporter protocol. A - * compositor can still emit close, maximize or fullscreen events, using for - * instance a keybind mechanism. If neither of these protocols is supported, - * the window won't be decorated. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size or refresh rate. - * - * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol - * to be implemented in the user's compositor. - * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_creation @@ -2620,6 +3164,38 @@ GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); */ GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); +/*! @brief Returns the title of the specified window. + * + * This function returns the window title, encoded as UTF-8, of the specified + * window. This is the title set previously by @ref glfwCreateWindow + * or @ref glfwSetWindowTitle. + * + * @param[in] window The window to query. + * @return The UTF-8 encoded window title, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The returned title is currently a copy of the title last set by @ref + * glfwCreateWindow or @ref glfwSetWindowTitle. It does not include any + * additional text which may be appended by the platform or another program. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetWindowTitle or @ref glfwSetWindowTitle, or until the library is + * terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * @sa @ref glfwSetWindowTitle + * + * @since Added in version 3.4. + * + * @ingroup window + */ +GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* window); + /*! @brief Sets the title of the specified window. * * This function sets the window title, encoded as UTF-8, of the specified @@ -2637,6 +3213,7 @@ GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); * @thread_safety This function must only be called from the main thread. * * @sa @ref window_title + * @sa @ref glfwGetWindowTitle * * @since Added in version 1.0. * @glfw3 Added window handle parameter. @@ -2666,21 +3243,23 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); * @param[in] images The images to create the icon from. This is ignored if * count is zero. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). * * @pointer_lifetime The specified image data is copied before this function * returns. * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, so this function does nothing. The dock icon will be the same as + * @remark @macos Regular windows do not have icons on macOS. This function + * will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as * the application bundle's icon. For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. + * [Bundle Programming Guide][bundle-guide] in the Mac Developer Library. + * + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ * * @remark @wayland There is no existing protocol to change an icon, the * window will thus inherit the one defined in the application's desktop file. - * This function always emits @ref GLFW_PLATFORM_ERROR. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -2706,12 +3285,12 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* i * @param[out] ypos Where to store the y-coordinate of the upper-left corner of * the content area, or `NULL`. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark @wayland There is no way for an application to retrieve the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -2740,12 +3319,12 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); * @param[in] xpos The x-coordinate of the upper-left corner of the content area. * @param[in] ypos The y-coordinate of the upper-left corner of the content area. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark @wayland There is no way for an application to set the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -2900,9 +3479,6 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_ERROR. * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size. - * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_size @@ -2992,7 +3568,7 @@ GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int * regardless of their DPI and scaling settings. This relies on the system DPI * and scaling settings being somewhat correct. * - * On systems where each monitors can have its own content scale, the window + * On platforms where each monitors can have its own content scale, the window * content scale will depend on which monitor the system considers the window * to be on. * @@ -3057,8 +3633,11 @@ GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); * @param[in] window The window to set the opacity for. * @param[in] opacity The desired opacity of the specified window. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way to set an opacity factor for a window. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -3077,16 +3656,17 @@ GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); * previously restored. If the window is already iconified, this function does * nothing. * - * If the specified window is a full screen window, the original monitor - * resolution is restored until the window is restored. + * If the specified window is a full screen window, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. * * @param[in] window The window to iconify. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_ERROR. * - * @remark @wayland There is no concept of iconification in wl_shell, this - * function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated + * @remark @wayland Once a window is iconified, @ref glfwRestoreWindow won’t + * be able to restore it. This is a design decision of the xdg-shell * protocol. * * @thread_safety This function must only be called from the main thread. @@ -3108,8 +3688,8 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow* window); * (minimized) or maximized. If the window is already restored, this function * does nothing. * - * If the specified window is a full screen window, the resolution chosen for - * the window is restored on the selected monitor. + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. * * @param[in] window The window to restore. * @@ -3233,8 +3813,8 @@ GLFWAPI void glfwHideWindow(GLFWwindow* window); * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_ERROR. * - * @remark @wayland It is not possible for an application to bring its windows - * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. + * @remark @wayland The compositor will likely ignore focus requests unless + * another window created by the same application already has input focus. * * @thread_safety This function must only be called from the main thread. * @@ -3339,9 +3919,6 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); * @remark @wayland The desired window position is ignored, as there is no way * for an application to set this property. * - * @remark @wayland Setting the window to full screen will not attempt to - * change the mode, no matter what the requested size or refresh rate. - * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_monitor @@ -3377,6 +3954,9 @@ GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int * errors. However, this function should not fail as long as it is passed * valid arguments and the library has been [initialized](@ref intro_init). * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_attribs @@ -3398,6 +3978,7 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_attrib) * * Some of these attributes are ignored for full screen windows. The new * value will take effect if the window is later made windowed. @@ -3410,11 +3991,15 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark Calling @ref glfwGetWindowAttrib will always return the latest * value, even if that value is ignored by the current mode of the window. * + * @remark @wayland The [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) window attribute is + * not supported. Setting this will emit @ref GLFW_FEATURE_UNAVAILABLE. + * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_attribs @@ -3668,9 +4253,6 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @remark @wayland The wl_shell protocol has no concept of iconification, - * this callback will never be called when using this deprecated protocol. - * * @thread_safety This function must only be called from the main thread. * * @sa @ref window_iconify @@ -3958,6 +4540,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual * and unlimited cursor movement. This is useful for implementing for * example 3D camera controls. + * - `GLFW_CURSOR_CAPTURED` makes the cursor visible and confines it to the + * content area of the window. * * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are @@ -3983,7 +4567,7 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, - * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref + * attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref * glfwRawMouseMotionSupported to check for support. * * @param[in] window The window whose input mode to set. @@ -3993,7 +4577,8 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); * @param[in] value The new value of the specified input mode. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * GLFW_INVALID_ENUM, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see above). * * @thread_safety This function must only be called from the main thread. * @@ -4083,8 +4668,8 @@ GLFWAPI int glfwRawMouseMotionSupported(void); * @param[in] scancode The scancode of the key to query. * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. * * @remark The contents of the returned string may change when a keyboard * layout change event is received. @@ -4106,15 +4691,18 @@ GLFWAPI const char* glfwGetKeyName(int key, int scancode); * * This function returns the platform-specific scancode of the specified key. * - * If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this - * method will return `-1`. + * If the specified [key token](@ref keys) corresponds to a physical key not + * supported on the current platform then this method will return `-1`. + * Calling this function with anything other than a key token will return `-1` + * and generate a @ref GLFW_INVALID_ENUM error. * - * @param[in] key Any [named key](@ref keys). - * @return The platform-specific scancode for the key, or `-1` if an - * [error](@ref error_handling) occurred. + * @param[in] key Any [key token](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if the key is + * not supported on the current platform or an [error](@ref error_handling) + * occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. * * @thread_safety This function may be called from any thread. * @@ -4131,8 +4719,7 @@ GLFWAPI int glfwGetKeyScancode(int key); * * This function returns the last state reported for the specified key to the * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to - * the key callback. + * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback. * * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns * `GLFW_PRESS` the first time you call it for a key that was pressed, even if @@ -4256,11 +4843,11 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); * @param[in] ypos The desired y-coordinate, relative to the top edge of the * content area. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). * * @remark @wayland This function will only work when the cursor mode is - * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. + * `GLFW_CURSOR_DISABLED`, otherwise it will emit @ref GLFW_FEATURE_UNAVAILABLE. * * @thread_safety This function must only be called from the main thread. * @@ -4293,8 +4880,8 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); * @return The handle of the created cursor, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. * * @pointer_lifetime The specified image data is copied before this function * returns. @@ -4313,19 +4900,44 @@ GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot) /*! @brief Creates a cursor with a standard shape. * - * Returns a cursor with a [standard shape](@ref shapes), that can be set for - * a window with @ref glfwSetCursor. + * Returns a cursor with a standard shape, that can be set for a window with + * @ref glfwSetCursor. The images for these cursors come from the system + * cursor theme and their exact appearance will vary between platforms. + * + * Most of these shapes are guaranteed to exist on every supported platform but + * a few may not be present. See the table below for details. + * + * Cursor shape | Windows | macOS | X11 | Wayland + * ------------------------------ | ------- | ----- | ------ | ------- + * @ref GLFW_ARROW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_IBEAM_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_CROSSHAIR_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_POINTING_HAND_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_EW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NS_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NWSE_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_NESW_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_ALL_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_NOT_ALLOWED_CURSOR | Yes | Yes | Maybe2 | Maybe2 + * + * 1) This uses a private system API and may fail in the future. + * + * 2) This uses a newer standard that not all cursor themes support. + * + * If the requested shape is not available, this function emits a @ref + * GLFW_CURSOR_UNAVAILABLE error and returns `NULL`. * * @param[in] shape One of the [standard shapes](@ref shapes). * @return A new cursor ready to use or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * GLFW_INVALID_ENUM, @ref GLFW_CURSOR_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. * * @thread_safety This function must only be called from the main thread. * - * @sa @ref cursor_object + * @sa @ref cursor_standard * @sa @ref glfwCreateCursor * * @since Added in version 3.1. @@ -4399,9 +5011,9 @@ GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); * [character callback](@ref glfwSetCharCallback) instead. * * When a window loses input focus, it will generate synthetic key release - * events for all pressed keys. You can tell these events from user-generated - * events by the fact that the synthetic ones are generated after the focus - * loss event has been processed, i.e. after the + * events for all pressed keys with associated key tokens. You can tell these + * events from user-generated events by the fact that the synthetic ones are + * generated after the focus loss event has been processed, i.e. after the * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. * * The scancode of a key is specific to that platform or sometimes even to that @@ -4682,8 +5294,6 @@ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun ca * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * - * @remark @wayland File drop is currently unimplemented. - * * @thread_safety This function must only be called from the main thread. * * @sa @ref path_drop @@ -4705,6 +5315,11 @@ GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_ERROR. * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * * @pointer_lifetime The specified string is copied before this function * returns. * @@ -4733,6 +5348,11 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * * @pointer_lifetime The returned string is allocated and freed by GLFW. You * should not free it yourself. It is valid until the next call to @ref * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library @@ -4760,7 +5380,7 @@ GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); * * The resolution of the timer is system dependent, but is usually on the order * of a few micro- or nanoseconds. It uses the highest-resolution monotonic - * time source on each supported platform. + * time source on each operating system. * * @return The current time, in seconds, or zero if an * [error](@ref error_handling) occurred. @@ -4855,12 +5475,15 @@ GLFWAPI uint64_t glfwGetTimerFrequency(void); * thread. * * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context must only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. + * current on the calling thread. It can also detach the current context from + * the calling thread without making a new one current by passing in `NULL`. * - * When moving a context between threads, you must make it non-current on the - * old thread before making it current on the new one. + * A context must only be made current on a single thread at a time and each + * thread can have only a single current context at a time. Making a context + * current detaches any previously current context on the calling thread. + * + * When moving a context between threads, you must detach it (make it + * non-current) on the old thread before making it current on the new one. * * By default, making a context non-current implicitly forces a pipeline flush. * On machines that support `GL_KHR_context_flush_control`, you can control @@ -4875,6 +5498,10 @@ GLFWAPI uint64_t glfwGetTimerFrequency(void); * @param[in] window The window whose context to make current, or `NULL` to * detach the current context. * + * @remarks If the previously current context was created via a different + * context creation API than the one passed to this function, GLFW will still + * detach the previous one from its API before making the new one current. + * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. * @@ -4971,7 +5598,7 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. * * @remark This function is not called during context creation, leaving the - * swap interval set to whatever is the default on that platform. This is done + * swap interval set to whatever is the default for that API. This is done * because some swap interval extensions used by GLFW do not allow the swap * interval to be reset to zero once it has been set to a non-zero value. * @@ -5271,6 +5898,13 @@ GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhys * @remark @macos This function creates and sets a `CAMetalLayer` instance for * the window content view, which is required for MoltenVK to function. * + * @remark @x11 By default GLFW prefers the `VK_KHR_xcb_surface` extension, + * with the `VK_KHR_xlib_surface` extension as a fallback. You can make + * `VK_KHR_xlib_surface` the preferred extension by setting the + * [GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init + * hint. The name of the selected extension, if any, is included in the array + * returned by @ref glfwGetRequiredInstanceExtensions. + * * @thread_safety This function may be called from any thread. For * synchronization details of Vulkan objects, see the Vulkan specification. * @@ -5307,6 +5941,7 @@ GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window */ #ifndef GLAPIENTRY #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED #endif /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ diff --git a/extern/src/GLFW/glfw3native.h b/extern/src/GLFW/glfw3native.h index fe74c733..92f0d324 100644 --- a/extern/src/GLFW/glfw3native.h +++ b/extern/src/GLFW/glfw3native.h @@ -1,5 +1,5 @@ /************************************************************************* - * GLFW 3.3 - www.glfw.org + * GLFW 3.4 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard @@ -74,6 +74,16 @@ extern "C" { * and which platform-specific headers to include. It is then up your (by * definition platform-specific) code to handle which of these should be * defined. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode */ @@ -81,44 +91,71 @@ extern "C" { * System headers and types *************************************************************************/ -#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) - // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for - // example to allow applications to correctly declare a GL_KHR_debug callback) - // but windows.h assumes no one will define APIENTRY before it does - #if defined(GLFW_APIENTRY_DEFINED) - #undef APIENTRY - #undef GLFW_APIENTRY_DEFINED - #endif - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) - #if defined(__OBJC__) - #import - #else - #include - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) - #include - #include -#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) - #include -#endif +#if !defined(GLFW_NATIVE_INCLUDE_NONE) -#if defined(GLFW_EXPOSE_NATIVE_WGL) - /* WGL is declared by windows.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_NSGL) - /* NSGL is declared by Cocoa.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_GLX) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_EGL) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_OSMESA) - #include -#endif + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #endif + + #if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ /************************************************************************* @@ -132,7 +169,8 @@ extern "C" { * of the specified monitor, or `NULL` if an [error](@ref error_handling) * occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -149,7 +187,8 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -165,7 +204,8 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); * @return The `HWND` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @remark The `HDC` associated with the window can be queried with the * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) @@ -191,8 +231,8 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); * @return The `HGLRC` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. * * @remark The `HDC` associated with the window can be queried with the * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) @@ -218,7 +258,8 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); * @return The `CGDirectDisplayID` of the specified monitor, or * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -234,7 +275,8 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); * @return The `NSWindow` of the specified window, or `nil` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -244,6 +286,23 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); * @ingroup native */ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); + +/*! @brief Returns the `NSView` of the specified window. + * + * @return The `NSView` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.4. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaView(GLFWwindow* window); #endif #if defined(GLFW_EXPOSE_NATIVE_NSGL) @@ -252,8 +311,8 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); * @return The `NSOpenGLContext` of the specified window, or `nil` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -271,7 +330,8 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); * @return The `Display` used by GLFW, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -287,7 +347,8 @@ GLFWAPI Display* glfwGetX11Display(void); * @return The `RRCrtc` of the specified monitor, or `None` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -303,7 +364,8 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); * @return The `RROutput` of the specified monitor, or `None` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -319,7 +381,8 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); * @return The `Window` of the specified window, or `None` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -334,8 +397,8 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* window); * * @param[in] string A UTF-8 encoded string. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. * * @pointer_lifetime The specified string is copied before this function * returns. @@ -360,8 +423,8 @@ GLFWAPI void glfwSetX11SelectionString(const char* string); * @return The contents of the selection as a UTF-8 encoded string, or `NULL` * if an [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. * * @pointer_lifetime The returned string is allocated and freed by GLFW. You * should not free it yourself. It is valid until the next call to @ref @@ -387,8 +450,8 @@ GLFWAPI const char* glfwGetX11SelectionString(void); * @return The `GLXContext` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -404,8 +467,8 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); * @return The `GLXWindow` of the specified window, or `None` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -423,7 +486,8 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); * @return The `struct wl_display*` used by GLFW, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -439,7 +503,8 @@ GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); * @return The `struct wl_output*` of the specified monitor, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -455,7 +520,8 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); * @return The main `struct wl_surface*` of the specified window, or `NULL` if * an [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -475,6 +541,9 @@ GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * * @thread_safety This function may be called from any thread. Access is not * synchronized. * @@ -489,8 +558,8 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void); * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -506,8 +575,8 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -532,8 +601,8 @@ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -556,8 +625,8 @@ GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. @@ -573,8 +642,8 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height * @return The `OSMesaContext` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * - * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref - * GLFW_NOT_INITIALIZED. + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. diff --git a/extern/src/imgui/imconfig.h b/extern/src/imgui/imconfig.h index 876cf32f..d556cbaf 100644 --- a/extern/src/imgui/imconfig.h +++ b/extern/src/imgui/imconfig.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// COMPILE-TIME OPTIONS FOR DEAR IMGUI +// DEAR IMGUI COMPILE-TIME OPTIONS // Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. // You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. //----------------------------------------------------------------------------- @@ -9,7 +9,7 @@ // You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp // files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. // Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. -// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. +// Call IMGUI_CHECKVERSION() from your .cpp file to verify that the data structures your files are using are matching the ones imgui.cpp is using. //----------------------------------------------------------------------------- #pragma once @@ -26,21 +26,21 @@ //#define IMGUI_API __declspec( dllexport ) //#define IMGUI_API __declspec( dllimport ) -//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. +//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names. //#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS -//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions. +//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87+ disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This is automatically done by IMGUI_DISABLE_OBSOLETE_FUNCTIONS. //---- Disable all of Dear ImGui or don't implement standard windows/tools. // It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp. //#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. //#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. -//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowStackToolWindow() will be empty (this was called IMGUI_DISABLE_METRICS_WINDOW before 1.88). +//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty. //---- Don't implement some functions to reduce linkage requirements. //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) //#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) -//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). +//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, IME). //#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). //#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) //#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. @@ -50,21 +50,24 @@ //#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available //---- Include imgui_user.h at the end of imgui.h as a convenience +// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included. //#define IMGUI_INCLUDE_IMGUI_USER_H +//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h" //---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) //#define IMGUI_USE_BGRA_PACKED_COLOR -//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) +//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) //#define IMGUI_USE_WCHAR32 //---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version // By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. //#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" //#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" -//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if enabled +//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if IMGUI_USE_STB_SPRINTF is defined. //#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION //#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION // only disabled if IMGUI_USE_STB_SPRINTF is defined. //---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) // Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h. @@ -75,6 +78,12 @@ // On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. //#define IMGUI_ENABLE_FREETYPE +//---- Use FreeType+lunasvg library to render OpenType SVG fonts (SVGinOT) +// Requires lunasvg headers to be available in the include path + program to be linked with the lunasvg library (not provided). +// Only works in combination with IMGUI_ENABLE_FREETYPE. +// (implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement) +//#define IMGUI_ENABLE_FREETYPE_LUNASVG + //---- Use stb_truetype to build and rasterize the font atlas (default) // The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. //#define IMGUI_ENABLE_STB_TRUETYPE @@ -105,7 +114,7 @@ //typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); //#define ImDrawCallback MyImDrawCallback -//---- Debug Tools: Macro to break in Debugger +//---- Debug Tools: Macro to break in Debugger (we provide a default implementation of this in the codebase) // (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) //#define IM_DEBUG_BREAK IM_ASSERT(0) //#define IM_DEBUG_BREAK __debugbreak() @@ -113,10 +122,10 @@ //---- Debug Tools: Enable slower asserts //#define IMGUI_DEBUG_PARANOID -//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. +//---- Tip: You can add extra functions within the ImGui:: namespace from anywhere (e.g. your own sources/header files) /* namespace ImGui { - void MyFunction(const char* name, const MyMatrix44& v); + void MyFunction(const char* name, MyMatrix44* mtx); } */ diff --git a/extern/src/imgui/imgui.cpp b/extern/src/imgui/imgui.cpp index 400dcb22..d8ca1da2 100644 --- a/extern/src/imgui/imgui.cpp +++ b/extern/src/imgui/imgui.cpp @@ -1,30 +1,37 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (main code and documentation) // Help: -// - Read FAQ at http://dearimgui.com/faq -// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. +// - See links below. // - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. +// - Read top of imgui.cpp for more details, links and comments. // Resources: -// - FAQ http://dearimgui.com/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/6478 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues +// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md) +// - Homepage ................... https://github.com/ocornut/imgui +// - Releases & changelog ....... https://github.com/ocornut/imgui/releases +// - Gallery .................... https://github.com/ocornut/imgui/issues/7503 (please post your screenshots/video there!) +// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code) +// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more) +// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools +// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui +// - Issues & support ........... https://github.com/ocornut/imgui/issues +// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps) -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// For first-time users having issues compiling/linking/running/loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there. +// Copyright (c) 2014-2024 Omar Cornut // Developed by Omar Cornut and every direct or indirect contributors to the GitHub. // See LICENSE.txt for copyright and licensing details (standard MIT License). // This library is free but needs your support to sustain development and maintenance. -// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com". -// Individuals: you can support continued development via donations. See docs/README or web page. +// Businesses: you can support continued development via B2B invoiced technical support, maintenance and sponsoring contracts. +// PLEASE reach out at omar AT dearimgui DOT com. See https://github.com/ocornut/imgui/wiki/Funding +// Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine. // It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. // Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without @@ -70,8 +77,10 @@ CODE // [SECTION] RENDER HELPERS // [SECTION] INITIALIZATION, SHUTDOWN // [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +// [SECTION] ID STACK // [SECTION] INPUTS // [SECTION] ERROR CHECKING +// [SECTION] ITEM SUBMISSION // [SECTION] LAYOUT // [SECTION] SCROLLING // [SECTION] TOOLTIPS @@ -85,7 +94,7 @@ CODE // [SECTION] PLATFORM DEPENDENT HELPERS // [SECTION] METRICS/DEBUGGER WINDOW // [SECTION] DEBUG LOG WINDOW -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL) */ @@ -107,9 +116,10 @@ CODE - Portable, minimize dependencies, run on target (consoles, phones, etc.). - Efficient runtime and memory consumption. - Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: + Designed primarily for developers and content-creators, not the typical end-user! + Some of the current weaknesses (which we aim to address in the future) includes: - - Doesn't look fancy, doesn't animate. + - Doesn't look fancy. - Limited layout features, intricate layouts are typically crafted in code. @@ -133,7 +143,7 @@ CODE - CTRL+X, CTRL+C, CTRL+V: Use OS clipboard. - CTRL+Z, CTRL+Y: Undo, Redo. - ESCAPE: Revert text to its original value. - - On OSX, controls are automatically adjusted to match standard OSX text editing shortcuts and behaviors. + - On OSX, controls are automatically adjusted to match standard OSX text editing 2ts and behaviors. - KEYBOARD CONTROLS - Basic: @@ -188,9 +198,11 @@ CODE READ FIRST ---------- - Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki) - - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or - destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs. + - Your code creates the UI every frame of your application loop, if your code doesn't run the UI is gone! + The UI can be highly dynamic, there are no construction or destruction steps, less superfluous + data retention on your side, less state duplication, less state synchronization, fewer bugs. - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. + Or browse https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html for interactive web version. - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki. @@ -198,18 +210,38 @@ CODE For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI, where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. - Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right. - - This codebase is also optimized to yield decent performances with typical "Debug" builds settings. - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected). If you get an assert, read the messages and comments around the assert. - - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace. - - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. - See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. - However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. - - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). + - This codebase aims to be highly optimized: + - A typical idle frame should never call malloc/free. + - We rely on a maximum of constant-time or O(N) algorithms. Limiting searches/scans as much as possible. + - We put particular energy in making sure performances are decent with typical "Debug" build settings as well. + Which mean we tend to avoid over-relying on "zero-cost abstraction" as they aren't zero-cost at all. + - This codebase aims to be both highly opinionated and highly flexible: + - This code works because of the things it choose to solve or not solve. + - C++: this is a pragmatic C-ish codebase: we don't use fancy C++ features, we don't include C++ headers, + and ImGui:: is a namespace. We rarely use member functions (and when we did, I am mostly regretting it now). + This is to increase compatibility, increase maintainability and facilitate use from other languages. + - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. + See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. + We can can optionally export math operators for ImVec2/ImVec4 using IMGUI_DEFINE_MATH_OPERATORS, which we use internally. + - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction + (so don't use ImVector in your code or at our own risk!). + - Building: We don't use nor mandate a build system for the main library. + This is in an effort to ensure that it works in the real world aka with any esoteric build setup. + This is also because providing a build system for the main library would be of little-value. + The build problems are almost never coming from the main library but from specific backends. HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI ---------------------------------------------- + - Update submodule or copy/overwrite every file. + - About imconfig.h: + - You may modify your copy of imconfig.h, in this case don't overwrite it. + - or you may locally branch to modify imconfig.h and merge/rebase latest. + - or you may '#define IMGUI_USER_CONFIG "my_config_file.h"' globally from your build system to + specify a custom path for your imconfig.h file and instead not have to modify the default one. + - Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h) - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master". - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. @@ -218,11 +250,12 @@ CODE from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it. Please report any issue to the GitHub page! - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. - - Try to keep your copy of Dear ImGui reasonably up to date. + - Try to keep your copy of Dear ImGui reasonably up to date! GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE --------------------------------------------------------------- + - See https://github.com/ocornut/imgui/wiki/Getting-Started. - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. @@ -330,7 +363,7 @@ CODE To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application, you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! - Please read the FAQ and example applications for details about this! + Please read the FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" about this. HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE @@ -397,6 +430,70 @@ CODE When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. You can read releases logs https://github.com/ocornut/imgui/releases for more details. + - 2024/05/27 (1.90.7) - commented out obsolete symbols marked obsolete in 1.88 (May 2022): + - old: CaptureKeyboardFromApp(bool) + - new: SetNextFrameWantCaptureKeyboard(bool) + - old: CaptureMouseFromApp(bool) + - new: SetNextFrameWantCaptureMouse(bool) + - 2024/05/22 (1.90.7) - inputs (internals): renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more explicit and reduce confusion with the default it is a non-zero value and cannot be the default value (never made public, but disclosing as I expect a few users caught on owner-aware inputs). + - inputs (internals): renamed ImGuiInputFlags_RouteGlobalLow -> ImGuiInputFlags_RouteGlobal, ImGuiInputFlags_RouteGlobal -> ImGuiInputFlags_RouteGlobalOverFocused, ImGuiInputFlags_RouteGlobalHigh -> ImGuiInputFlags_RouteGlobalHighest. + - inputs (internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures: + - old: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); + - new: Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); + - inputs (internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(): swapped last two parameters order in function signatures. + - old: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + - new: IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); + - old: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); + - new: IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); + for various reasons those changes makes sense. They are being made because making some of those API public. + only past users of imgui_internal.h with the extra parameters will be affected. Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. + - 2024/05/16 (1.90.7) - inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent() as this naturally align with how macOS X uses those keys. + - it shouldn't really affect you unless you had custom shortcut swapping in place for macOS X apps. + - removed ImGuiMod_Shortcut which was previously dynamically remapping to Ctrl or Cmd/Super. It is now unnecessary to specific cross-platform idiomatic shortcuts. (#2343, #4084, #5923, #456) + - 2024/05/14 (1.90.7) - backends: SDL_Renderer2 and SDL_Renderer3 backend now take a SDL_Renderer* in their RenderDrawData() functions. + - 2024/04/18 (1.90.6) - TreeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282) + - old: TreeNode("##Hidden"); SameLine(); Text("Hello"); // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise). + - new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values. + with the fix, IF you were successfully using TreeNode("")+SameLine(); you will now have extra spacing between your TreeNode and the following item. + You'll need to change the SameLine() call to SameLine(0,0) to remove this extraneous spacing. This seemed like the more sensible fix that's not making things less consistent. + (Note: when using this idiom you are likely to also use ImGuiTreeNodeFlags_SpanAvailWidth). + - 2024/03/18 (1.90.5) - merged the radius_x/radius_y parameters in ImDrawList::AddEllipse(), AddEllipseFilled() and PathEllipticalArcTo() into a single ImVec2 parameter. Exceptionally, because those functions were added in 1.90, we are not adding inline redirection functions. The transition is easy and should affect few users. (#2743, #7417) + - 2024/03/08 (1.90.5) - inputs: more formally obsoleted GetKeyIndex() when IMGUI_DISABLE_OBSOLETE_FUNCTIONS is set. It has been unnecessary and a no-op since 1.87 (it returns the same value as passed when used with a 1.87+ backend using io.AddKeyEvent() function). (#4921) + - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) + - 2024/01/15 (1.90.2) - commented out obsolete ImGuiIO::ImeWindowHandle marked obsolete in 1.87, favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'. + - 2023/12/19 (1.90.1) - commented out obsolete ImGuiKey_KeyPadEnter redirection to ImGuiKey_KeypadEnter. + - 2023/11/06 (1.90.1) - removed CalcListClipping() marked obsolete in 1.86. Prefer using ImGuiListClipper which can return non-contiguous ranges. + - 2023/11/05 (1.90.1) - imgui_freetype: commented out ImGuiFreeType::BuildFontAtlas() obsoleted in 1.81. prefer using #define IMGUI_ENABLE_FREETYPE or see commented code for manual calls. + - 2023/11/05 (1.90.1) - internals,columns: commented out legacy ImGuiColumnsFlags_XXX symbols redirecting to ImGuiOldColumnsFlags_XXX, obsoleted from imgui_internal.h in 1.80. + - 2023/11/09 (1.90.0) - removed IM_OFFSETOF() macro in favor of using offsetof() available in C++11. Kept redirection define (will obsolete). + - 2023/11/07 (1.90.0) - removed BeginChildFrame()/EndChildFrame() in favor of using BeginChild() with the ImGuiChildFlags_FrameStyle flag. kept inline redirection function (will obsolete). + those functions were merely PushStyle/PopStyle helpers, the removal isn't so much motivated by needing to add the feature in BeginChild(), but by the necessity to avoid BeginChildFrame() signature mismatching BeginChild() signature and features. + - 2023/11/02 (1.90.0) - BeginChild: upgraded 'bool border = true' parameter to 'ImGuiChildFlags flags' type, added ImGuiChildFlags_Border equivalent. As with our prior "bool-to-flags" API updates, the ImGuiChildFlags_Border value is guaranteed to be == true forever to ensure a smoother transition, meaning all existing calls will still work. + - old: BeginChild("Name", size, true) + - new: BeginChild("Name", size, ImGuiChildFlags_Border) + - old: BeginChild("Name", size, false) + - new: BeginChild("Name", size) or BeginChild("Name", 0) or BeginChild("Name", size, ImGuiChildFlags_None) + - 2023/11/02 (1.90.0) - BeginChild: added child-flag ImGuiChildFlags_AlwaysUseWindowPadding as a replacement for the window-flag ImGuiWindowFlags_AlwaysUseWindowPadding: the feature only ever made sense for BeginChild() anyhow. + - old: BeginChild("Name", size, 0, ImGuiWindowFlags_AlwaysUseWindowPadding); + - new: BeginChild("Name", size, ImGuiChildFlags_AlwaysUseWindowPadding, 0); + - 2023/09/27 (1.90.0) - io: removed io.MetricsActiveAllocations introduced in 1.63. Same as 'g.DebugMemAllocCount - g.DebugMemFreeCount' (still displayed in Metrics, unlikely to be accessed by end-user). + - 2023/09/26 (1.90.0) - debug tools: Renamed ShowStackToolWindow() ("Stack Tool") to ShowIDStackToolWindow() ("ID Stack Tool"), as earlier name was misleading. Kept inline redirection function. (#4631) + - 2023/09/15 (1.90.0) - ListBox, Combo: changed signature of "name getter" callback in old one-liner ListBox()/Combo() apis. kept inline redirection function (will obsolete). + - old: bool Combo(const char* label, int* current_item, bool (*getter)(void* user_data, int idx, const char** out_text), ...) + - new: bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...); + - old: bool ListBox(const char* label, int* current_item, bool (*getting)(void* user_data, int idx, const char** out_text), ...); + - new: bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...); + - 2023/09/08 (1.90.0) - commented out obsolete redirecting functions: + - GetWindowContentRegionWidth() -> use GetWindowContentRegionMax().x - GetWindowContentRegionMin().x. Consider that generally 'GetContentRegionAvail().x' is more useful. + - ImDrawCornerFlags_XXX -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details + grep commented names in sources. + - commented out runtime support for hardcoded ~0 or 0x01..0x0F rounding flags values for AddRect()/AddRectFilled()/PathRect()/AddImageRounded() -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details + - 2023/08/25 (1.89.9) - clipper: Renamed IncludeRangeByIndices() (also called ForceDisplayRangeByIndices() before 1.89.6) to IncludeItemsByIndex(). Kept inline redirection function. Sorry! + - 2023/07/12 (1.89.8) - ImDrawData: CmdLists now owned, changed from ImDrawList** to ImVector. Majority of users shouldn't be affected, but you cannot compare to NULL nor reassign manually anymore. Instead use AddDrawList(). (#6406, #4879, #1878) + - 2023/06/28 (1.89.7) - overlapping items: obsoleted 'SetItemAllowOverlap()' (called after item) in favor of calling 'SetNextItemAllowOverlap()' (called before item). 'SetItemAllowOverlap()' didn't and couldn't work reliably since 1.89 (2022-11-15). + - 2023/06/28 (1.89.7) - overlapping items: renamed 'ImGuiTreeNodeFlags_AllowItemOverlap' to 'ImGuiTreeNodeFlags_AllowOverlap', 'ImGuiSelectableFlags_AllowItemOverlap' to 'ImGuiSelectableFlags_AllowOverlap'. Kept redirecting enums (will obsolete). + - 2023/06/28 (1.89.7) - overlapping items: IsItemHovered() now by default return false when querying an item using AllowOverlap mode which is being overlapped. Use ImGuiHoveredFlags_AllowWhenOverlappedByItem to revert to old behavior. + - 2023/06/28 (1.89.7) - overlapping items: Selectable and TreeNode don't allow overlap when active so overlapping widgets won't appear as hovered. While this fixes a common small visual issue, it also means that calling IsItemHovered() after a non-reactive elements - e.g. Text() - overlapping an active one may fail if you don't use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem). (#6610) + - 2023/06/20 (1.89.7) - moved io.HoverDelayShort/io.HoverDelayNormal to style.HoverDelayShort/style.HoverDelayNormal. As the fields were added in 1.89 and expected to be left unchanged by most users, or only tweaked once during app initialization, we are exceptionally accepting the breakage. - 2023/05/30 (1.89.6) - backends: renamed "imgui_impl_sdlrenderer.cpp" to "imgui_impl_sdlrenderer2.cpp" and "imgui_impl_sdlrenderer.h" to "imgui_impl_sdlrenderer2.h". This is in prevision for the future release of SDL3. - 2023/05/22 (1.89.6) - listbox: commented out obsolete/redirecting functions that were marked obsolete more than two years ago: - ListBoxHeader() -> use BeginListBox() (note how two variants of ListBoxHeader() existed. Check commented versions in imgui.h for reference) @@ -475,7 +572,7 @@ CODE - Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only] note: for all calls to IO new functions, the Dear ImGui context should be bound/current. read https://github.com/ocornut/imgui/issues/4921 for details. - - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. + - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. - IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX) - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes). @@ -799,11 +896,12 @@ CODE Q: Where is the documentation? A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++. - - Run the examples/ and explore them. + - Run the examples/ applications and explore them. + - Read Getting Started (https://github.com/ocornut/imgui/wiki/Getting-Started) guide. - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. - The demo covers most features of Dear ImGui, so you can read the code and see its output. - See documentation and comments at the top of imgui.cpp + effectively imgui.h. - - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the + - 20+ standalone example applications using e.g. OpenGL/DirectX are provided in the examples/ folder to explain how to integrate Dear ImGui with your own engine/application. - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. @@ -819,14 +917,14 @@ CODE ================ Q: How to get started? - A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. + A: Read https://github.com/ocornut/imgui/wiki/Getting-Started. Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application? A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! >> See https://www.dearimgui.com/faq for a fully detailed answer. You really want to read this. - Q. How can I enable keyboard controls? - Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) + Q. How can I enable keyboard or gamepad controls? + Q: How can I use this on a machine without mouse, keyboard or screen? (input share, remote display) Q: I integrated Dear ImGui in my engine and little squares are showing instead of text... Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around... Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries... @@ -841,7 +939,7 @@ CODE - How can I have multiple widgets with the same label? - How can I have multiple windows with the same label? Q: How can I display an image? What is ImTextureID, how does it work? - Q: How can I use my own math types instead of ImVec2/ImVec4? + Q: How can I use my own math types instead of ImVec2? Q: How can I interact with standard C++ types (such as std::string and std::vector)? Q: How can I display custom shapes? (using low-level ImDrawList API) >> See https://www.dearimgui.com/faq @@ -854,7 +952,7 @@ CODE Q: How can I easily use icons in my application? Q: How can I load multiple fonts? Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? - >> See https://www.dearimgui.com/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md + >> See https://www.dearimgui.com/faq and https://github.com/ocornut/imgui/blob/master/docs/FONTS.md Q&A: Concerns ============= @@ -869,12 +967,12 @@ CODE ============== Q: How can I help? - A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui! + A: - Businesses: please reach out to "omar AT dearimgui DOT com" if you work in a place using Dear ImGui! We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. - This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project. - - Individuals: you can support continued development via PayPal donations. See README. - - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt - and see how you want to help and can help! + This is among the most useful thing you can do for Dear ImGui. With increased funding, we sustain and grow work on this project. + >>> See https://github.com/ocornut/imgui/wiki/Funding + - Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine. + - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, and see how you want to help and can help! - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers. But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions. @@ -900,11 +998,7 @@ CODE // System includes #include // vsnprintf, sscanf, printf -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif // [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled #if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) @@ -927,7 +1021,8 @@ CODE #else #include #endif -#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES) +// The UWP and GDK Win32 API subsets don't support clipboard nor IME functions #define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS #define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS #endif @@ -967,6 +1062,7 @@ CODE #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) // We disable -Wpragmas because GCC doesn't provide a has_warning equivalent and some forks/patches may not follow the warning/version association. #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -983,27 +1079,29 @@ CODE // Debug options #define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL #define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window -#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) // When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear +static const float NAV_ACTIVATE_HIGHLIGHT_TIMER = 0.10f; // Time to highlight an item activated by a shortcut. + // Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow(). static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 0.70f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. +// Tooltip offset +static const ImVec2 TOOLTIP_DEFAULT_OFFSET = ImVec2(16, 10); // Multiplied by g.Style.MouseCursorScale + //------------------------------------------------------------------------- // [SECTION] FORWARD DECLARATIONS //------------------------------------------------------------------------- static void SetCurrentWindow(ImGuiWindow* window); -static void FindHoveredWindow(); static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list); static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window); // Settings @@ -1020,6 +1118,9 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport namespace ImGui { +// Item +static void ItemHandleShortcut(ImGuiID id); + // Navigation static void NavUpdate(); static void NavUpdateWindowing(); @@ -1039,7 +1140,6 @@ static ImVec2 NavCalcPreferredRefPos(); static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); static void NavRestoreLayer(ImGuiNavLayer layer); -static void NavRestoreHighlightAfterMove(); static int FindWindowFocusIndex(ImGuiWindow* window); // Error Checking and Debug Tools @@ -1047,6 +1147,7 @@ static void ErrorCheckNewFrameSanityChecks(); static void ErrorCheckEndFrameSanityChecks(); static void UpdateDebugToolItemPicker(); static void UpdateDebugToolStackQueries(); +static void UpdateDebugToolFlashStyleColor(); // Inputs static void UpdateKeyboardInputs(); @@ -1056,14 +1157,16 @@ static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt); // Misc static void UpdateSettings(); -static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); +static int UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); static void RenderWindowOuterBorders(ImGuiWindow* window); static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); static void RenderDimmedBackgrounds(); +static void SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect); // Viewports +const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHashStr("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter. static void UpdateViewportsNewFrame(); } @@ -1116,49 +1219,59 @@ static void* GImAllocatorUserData = NULL; ImGuiStyle::ImGuiStyle() { - Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. - DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. - WindowPadding = ImVec2(8,8); // Padding within a window - WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. - WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. - WindowMinSize = ImVec2(32,32); // Minimum window size - WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text - WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. - ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows - ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. - PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows - PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. - FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) - FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). - FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. - ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines - ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) - CellPadding = ImVec2(4,2); // Padding within a table cell - TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). - ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar - ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar - GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar - GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. - TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. - TabBorderSize = 0.0f; // Thickness of border around tabs. - TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. - ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. - ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. - SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. - SeparatorTextBorderSize = 3.0f; // Thickkness of border in SeparatorText() - SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). - SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. - DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. - DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. - MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. - AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). - AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). - CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. + DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + WindowPadding = ImVec2(8,8); // Padding within a window + WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. + WindowMinSize = ImVec2(32,32); // Minimum window size + WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text + WindowMenuButtonPosition = ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. + ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows + ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. + PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows + PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. + FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) + FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). + FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. + ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines + ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) + CellPadding = ImVec2(4,2); // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows. + TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar + ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar + GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar + GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + TabBorderSize = 0.0f; // Thickness of border around tabs. + TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + TabBarBorderSize = 1.0f; // Thickness of tab-bar separator, which takes on the tab active color to denote focus. + TableAngledHeadersAngle = 35.0f * (IM_PI / 180.0f); // Angle of angled headers (supported values range from -50 degrees to +50 degrees). + TableAngledHeadersTextAlign = ImVec2(0.5f,0.0f);// Alignment of angled headers within the cell + ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. + SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + SeparatorTextBorderSize = 3.0f; // Thickkness of border in SeparatorText() + SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). + SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. + DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. + MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. + AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). + CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + + // Behaviors + HoverStationaryDelay = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary. + HoverDelayShort = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay. + HoverDelayNormal = 0.40f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). " + HoverFlagsForTooltipMouse = ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse. + HoverFlagsForTooltipNav = ImGuiHoveredFlags_NoSharedDelay | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad. // Default theme ImGui::StyleColorsDark(this); @@ -1168,30 +1281,30 @@ ImGuiStyle::ImGuiStyle() // Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. void ImGuiStyle::ScaleAllSizes(float scale_factor) { - WindowPadding = ImFloor(WindowPadding * scale_factor); - WindowRounding = ImFloor(WindowRounding * scale_factor); - WindowMinSize = ImFloor(WindowMinSize * scale_factor); - ChildRounding = ImFloor(ChildRounding * scale_factor); - PopupRounding = ImFloor(PopupRounding * scale_factor); - FramePadding = ImFloor(FramePadding * scale_factor); - FrameRounding = ImFloor(FrameRounding * scale_factor); - ItemSpacing = ImFloor(ItemSpacing * scale_factor); - ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); - CellPadding = ImFloor(CellPadding * scale_factor); - TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); - IndentSpacing = ImFloor(IndentSpacing * scale_factor); - ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); - ScrollbarSize = ImFloor(ScrollbarSize * scale_factor); - ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); - GrabMinSize = ImFloor(GrabMinSize * scale_factor); - GrabRounding = ImFloor(GrabRounding * scale_factor); - LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor); - TabRounding = ImFloor(TabRounding * scale_factor); - TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; - SeparatorTextPadding = ImFloor(SeparatorTextPadding * scale_factor); - DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); - DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); - MouseCursorScale = ImFloor(MouseCursorScale * scale_factor); + WindowPadding = ImTrunc(WindowPadding * scale_factor); + WindowRounding = ImTrunc(WindowRounding * scale_factor); + WindowMinSize = ImTrunc(WindowMinSize * scale_factor); + ChildRounding = ImTrunc(ChildRounding * scale_factor); + PopupRounding = ImTrunc(PopupRounding * scale_factor); + FramePadding = ImTrunc(FramePadding * scale_factor); + FrameRounding = ImTrunc(FrameRounding * scale_factor); + ItemSpacing = ImTrunc(ItemSpacing * scale_factor); + ItemInnerSpacing = ImTrunc(ItemInnerSpacing * scale_factor); + CellPadding = ImTrunc(CellPadding * scale_factor); + TouchExtraPadding = ImTrunc(TouchExtraPadding * scale_factor); + IndentSpacing = ImTrunc(IndentSpacing * scale_factor); + ColumnsMinSpacing = ImTrunc(ColumnsMinSpacing * scale_factor); + ScrollbarSize = ImTrunc(ScrollbarSize * scale_factor); + ScrollbarRounding = ImTrunc(ScrollbarRounding * scale_factor); + GrabMinSize = ImTrunc(GrabMinSize * scale_factor); + GrabRounding = ImTrunc(GrabRounding * scale_factor); + LogSliderDeadzone = ImTrunc(LogSliderDeadzone * scale_factor); + TabRounding = ImTrunc(TabRounding * scale_factor); + TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImTrunc(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; + SeparatorTextPadding = ImTrunc(SeparatorTextPadding * scale_factor); + DisplayWindowPadding = ImTrunc(DisplayWindowPadding * scale_factor); + DisplaySafeAreaPadding = ImTrunc(DisplaySafeAreaPadding * scale_factor); + MouseCursorScale = ImTrunc(MouseCursorScale * scale_factor); } ImGuiIO::ImGuiIO() @@ -1208,16 +1321,10 @@ ImGuiIO::ImGuiIO() IniSavingRate = 5.0f; IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables). LogFilename = "imgui_log.txt"; - MouseDoubleClickTime = 0.30f; - MouseDoubleClickMaxDist = 6.0f; #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO for (int i = 0; i < ImGuiKey_COUNT; i++) KeyMap[i] = -1; #endif - KeyRepeatDelay = 0.275f; - KeyRepeatRate = 0.050f; - HoverDelayNormal = 0.30f; - HoverDelayShort = 0.10f; UserData = NULL; Fonts = NULL; @@ -1226,6 +1333,12 @@ ImGuiIO::ImGuiIO() FontAllowUserScaling = false; DisplayFramebufferScale = ImVec2(1.0f, 1.0f); + MouseDoubleClickTime = 0.30f; + MouseDoubleClickMaxDist = 6.0f; + MouseDragThreshold = 6.0f; + KeyRepeatDelay = 0.275f; + KeyRepeatRate = 0.050f; + // Miscellaneous options MouseDrawCursor = false; #ifdef __APPLE__ @@ -1247,12 +1360,12 @@ ImGuiIO::ImGuiIO() // Note: Initialize() will setup default clipboard/ime handlers. BackendPlatformName = BackendRendererName = NULL; BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL; + PlatformLocaleDecimalPoint = '.'; // Input (NB: we already have memset zero the entire structure!) MousePos = ImVec2(-FLT_MAX, -FLT_MAX); MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); MouseSource = ImGuiMouseSource_Mouse; - MouseDragThreshold = 6.0f; for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; } AppAcceptingEvents = true; @@ -1327,13 +1440,15 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) } } -// FIXME: Perhaps we could clear queued events as well? -void ImGuiIO::ClearInputCharacters() +// Clear all incoming events. +void ImGuiIO::ClearEventsQueue() { - InputQueueCharacters.resize(0); + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + g.InputEventsQueue.clear(); } -// FIXME: Perhaps we could clear queued events as well? +// Clear current keyboard/mouse/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons. void ImGuiIO::ClearInputKeys() { #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -1354,8 +1469,18 @@ void ImGuiIO::ClearInputKeys() MouseDownDuration[n] = MouseDownDurationPrev[n] = -1.0f; } MouseWheel = MouseWheelH = 0.0f; + InputQueueCharacters.resize(0); // Behavior of old ClearInputCharacters(). } +// Removed this as it is ambiguous/misleading and generally incorrect to use with the existence of a higher-level input queue. +// Current frame character buffer is now also cleared by ClearInputKeys(). +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +void ImGuiIO::ClearInputCharacters() +{ + InputQueueCharacters.resize(0); +} +#endif + static ImGuiInputEvent* FindLatestInputEvent(ImGuiContext* ctx, ImGuiInputEventType type, int arg = -1) { ImGuiContext& g = *ctx; @@ -1378,7 +1503,7 @@ static ImGuiInputEvent* FindLatestInputEvent(ImGuiContext* ctx, ImGuiInputEventT // - bool down: Is the key down? use false to signify a key release. // - float analog_value: 0.0f..1.0f // IMPORTANT: THIS FUNCTION AND OTHER "ADD" GRABS THE CONTEXT FROM OUR INSTANCE. -// WE NEED TO ENSURE THAT ALL FUNCTION CALLS ARE FULLFILLING THIS, WHICH IS WHY GetKeyData() HAS AN EXPLICIT CONTEXT. +// WE NEED TO ENSURE THAT ALL FUNCTION CALLS ARE FULFILLING THIS, WHICH IS WHY GetKeyData() HAS AN EXPLICIT CONTEXT. void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) { //if (e->Down) { IMGUI_DEBUG_LOG_IO("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); } @@ -1386,9 +1511,19 @@ void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) if (key == ImGuiKey_None || !AppAcceptingEvents) return; ImGuiContext& g = *Ctx; - IM_ASSERT(ImGui::IsNamedKeyOrModKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. + IM_ASSERT(ImGui::IsNamedKeyOrMod(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. IM_ASSERT(ImGui::IsAliasKey(key) == false); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events. - IM_ASSERT(key != ImGuiMod_Shortcut); // We could easily support the translation here but it seems saner to not accept it (TestEngine perform a translation itself) + + // MacOS: swap Cmd(Super) and Ctrl + if (g.IO.ConfigMacOSXBehaviors) + { + if (key == ImGuiMod_Super) { key = ImGuiMod_Ctrl; } + else if (key == ImGuiMod_Ctrl) { key = ImGuiMod_Super; } + else if (key == ImGuiKey_LeftSuper) { key = ImGuiKey_LeftCtrl; } + else if (key == ImGuiKey_RightSuper){ key = ImGuiKey_RightCtrl; } + else if (key == ImGuiKey_LeftCtrl) { key = ImGuiKey_LeftSuper; } + else if (key == ImGuiKey_RightCtrl) { key = ImGuiKey_RightSuper; } + } // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data. #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -1467,7 +1602,7 @@ void ImGuiIO::AddMousePosEvent(float x, float y) return; // Apply same flooring as UpdateMouseInputs() - ImVec2 pos((x > -FLT_MAX) ? ImFloorSigned(x) : x, (y > -FLT_MAX) ? ImFloorSigned(y) : y); + ImVec2 pos((x > -FLT_MAX) ? ImFloor(x) : x, (y > -FLT_MAX) ? ImFloor(y) : y); // Filter duplicate const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MousePos); @@ -1481,7 +1616,7 @@ void ImGuiIO::AddMousePosEvent(float x, float y) e.EventId = g.InputEventsNextEventId++; e.MousePos.PosX = pos.x; e.MousePos.PosY = pos.y; - e.MouseWheel.MouseSource = g.InputEventsNextMouseSource; + e.MousePos.MouseSource = g.InputEventsNextMouseSource; g.InputEventsQueue.push_back(e); } @@ -1493,19 +1628,43 @@ void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down) if (!AppAcceptingEvents) return; + // On MacOS X: Convert Ctrl(Super)+Left click into Right-click: handle held button. + if (ConfigMacOSXBehaviors && mouse_button == 0 && MouseCtrlLeftAsRightClick) + { + // Order of both statements matterns: this event will still release mouse button 1 + mouse_button = 1; + if (!down) + MouseCtrlLeftAsRightClick = false; + } + // Filter duplicate const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MouseButton, (int)mouse_button); const bool latest_button_down = latest_event ? latest_event->MouseButton.Down : g.IO.MouseDown[mouse_button]; if (latest_button_down == down) return; + // On MacOS X: Convert Ctrl(Super)+Left click into Right-click. + // - Note that this is actual physical Ctrl which is ImGuiMod_Super for us. + // - At this point we want from !down to down, so this is handling the initial press. + if (ConfigMacOSXBehaviors && mouse_button == 0 && down) + { + const ImGuiInputEvent* latest_super_event = FindLatestInputEvent(&g, ImGuiInputEventType_Key, (int)ImGuiMod_Super); + if (latest_super_event ? latest_super_event->Key.Down : g.IO.KeySuper) + { + IMGUI_DEBUG_LOG_IO("[io] Super+Left Click aliased into Right Click\n"); + MouseCtrlLeftAsRightClick = true; + AddMouseButtonEvent(1, true); // This is just quicker to write that passing through, as we need to filter duplicate again. + return; + } + } + ImGuiInputEvent e; e.Type = ImGuiInputEventType_MouseButton; e.Source = ImGuiInputSource_Mouse; e.EventId = g.InputEventsNextEventId++; e.MouseButton.Button = mouse_button; e.MouseButton.Down = down; - e.MouseWheel.MouseSource = g.InputEventsNextMouseSource; + e.MouseButton.MouseSource = g.InputEventsNextMouseSource; g.InputEventsQueue.push_back(e); } @@ -1808,13 +1967,15 @@ const char* ImStrSkipBlank(const char* str) // and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are // designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) #ifdef IMGUI_USE_STB_SPRINTF +#ifndef IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_IMPLEMENTATION +#endif #ifdef IMGUI_STB_SPRINTF_FILENAME #include IMGUI_STB_SPRINTF_FILENAME #else #include "stb_sprintf.h" #endif -#endif +#endif // #ifdef IMGUI_USE_STB_SPRINTF #if defined(_MSC_VER) && !defined(vsnprintf) #define vsnprintf _vsnprintf @@ -1856,21 +2017,9 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) { - ImGuiContext& g = *GImGui; va_list args; va_start(args, fmt); - if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) - { - const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" - *out_buf = buf; - if (out_buf_end) { *out_buf_end = buf + strlen(buf); } - } - else - { - int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); - *out_buf = g.TempBuffer.Data; - if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } - } + ImFormatStringToTempBufferV(out_buf, out_buf_end, fmt, args); va_end(args); } @@ -1880,9 +2029,23 @@ void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) { const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" + if (buf == NULL) + buf = "(null)"; *out_buf = buf; if (out_buf_end) { *out_buf_end = buf + strlen(buf); } } + else if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '*' && fmt[3] == 's' && fmt[4] == 0) + { + int buf_len = va_arg(args, int); // Skip formatting when using "%.*s" + const char* buf = va_arg(args, const char*); + if (buf == NULL) + { + buf = "(null)"; + buf_len = ImMin(buf_len, 6); + } + *out_buf = buf; + *out_buf_end = buf + buf_len; // Disallow not passing 'out_buf_end' here. User is expected to use it. + } else { int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); @@ -1975,11 +2138,18 @@ ImFileHandle ImFileOpen(const char* filename, const char* mode) // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); - ImVector buf; - buf.resize(filename_wsize + mode_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); - return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); + + // Use stack buffer if possible, otherwise heap buffer. Sizes include zero terminator. + // We don't rely on current ImGuiContext as this is implied to be a helper function which doesn't depend on it (see #7314). + wchar_t local_temp_stack[FILENAME_MAX]; + ImVector local_temp_heap; + if (filename_wsize + mode_wsize > IM_ARRAYSIZE(local_temp_stack)) + local_temp_heap.resize(filename_wsize + mode_wsize); + wchar_t* filename_wbuf = local_temp_heap.Data ? local_temp_heap.Data : local_temp_stack; + wchar_t* mode_wbuf = filename_wbuf + filename_wsize; + ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_wbuf, filename_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, mode_wbuf, mode_wsize); + return ::_wfopen(filename_wbuf, mode_wbuf); #else return fopen(filename, mode); #endif @@ -2211,6 +2381,32 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e } return bytes_count; } + +const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr) +{ + while (in_text_curr > in_text_start) + { + in_text_curr--; + if ((*in_text_curr & 0xC0) != 0x80) + return in_text_curr; + } + return in_text_start; +} + +int ImTextCountLines(const char* in_text, const char* in_text_end) +{ + if (in_text_end == NULL) + in_text_end = in_text + strlen(in_text); // FIXME-OPT: Not optimal approach, discourage use for now. + int count = 0; + while (in_text < in_text_end) + { + const char* line_end = (const char*)memchr(in_text, '\n', in_text_end - in_text); + in_text = line_end ? line_end + 1 : in_text_end; + count++; + } + return count; +} + IM_MSVC_RUNTIME_CHECKS_RESTORE //----------------------------------------------------------------------------- @@ -2406,11 +2602,9 @@ void ImGuiStorage::SetInt(ImGuiID key, int val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_i = val; + else + it->val_i = val; } void ImGuiStorage::SetBool(ImGuiID key, bool val) @@ -2422,22 +2616,18 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_f = val; + else + it->val_f = val; } void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_p = val; + else + it->val_p = val; } void ImGuiStorage::SetAllInt(int v) @@ -2497,16 +2687,15 @@ void ImGuiTextFilter::Build() input_range.split(',', &Filters); CountGrep = 0; - for (int i = 0; i != Filters.Size; i++) + for (ImGuiTextRange& f : Filters) { - ImGuiTextRange& f = Filters[i]; while (f.b < f.e && ImCharIsBlankA(f.b[0])) f.b++; while (f.e > f.b && ImCharIsBlankA(f.e[-1])) f.e--; if (f.empty()) continue; - if (Filters[i].b[0] != '-') + if (f.b[0] != '-') CountGrep += 1; } } @@ -2519,9 +2708,8 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const if (text == NULL) text = ""; - for (int i = 0; i != Filters.Size; i++) + for (const ImGuiTextRange& f : Filters) { - const ImGuiTextRange& f = Filters[i]; if (f.empty()) continue; if (f.b[0] == '-') @@ -2630,8 +2818,6 @@ void ImGuiTextIndex::append(const char* base, int old_size, int new_size) //----------------------------------------------------------------------------- // [SECTION] ImGuiListClipper -// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed -// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) //----------------------------------------------------------------------------- // FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. @@ -2642,54 +2828,6 @@ static bool GetSkipItemForListClipping() return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); } -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -// Legacy helper to calculate coarse clipping of large list of evenly sized items. -// This legacy API is not ideal because it assumes we will return a single contiguous rectangle. -// Prefer using ImGuiListClipper which can returns non-contiguous ranges. -void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - *out_items_display_start = 0; - *out_items_display_end = items_count; - return; - } - if (GetSkipItemForListClipping()) - { - *out_items_display_start = *out_items_display_end = 0; - return; - } - - // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect - // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly. - ImRect rect = window->ClipRect; - if (g.NavMoveScoringItems) - rect.Add(g.NavScoringNoClipRect); - if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) - rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel - - const ImVec2 pos = window->DC.CursorPos; - int start = (int)((rect.Min.y - pos.y) / items_height); - int end = (int)((rect.Max.y - pos.y) / items_height); - - // When performing a navigation request, ensure we have one item extra in the direction we are moving to - // FIXME: Verify this works with tabbing - const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) - start--; - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) - end++; - - start = ImClamp(start, 0, items_count); - end = ImClamp(end + 1, start, items_count); - *out_items_display_start = start; - *out_items_display_end = end; -} -#endif - static void ImGuiListClipper_SortAndFuseRanges(ImVector& ranges, int offset = 0) { if (ranges.Size - offset <= 1) @@ -2751,9 +2889,6 @@ static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int it ImGuiListClipper::ImGuiListClipper() { memset(this, 0, sizeof(*this)); - Ctx = ImGui::GetCurrentContext(); - IM_ASSERT(Ctx != NULL); - ItemsCount = -1; } ImGuiListClipper::~ImGuiListClipper() @@ -2763,6 +2898,9 @@ ImGuiListClipper::~ImGuiListClipper() void ImGuiListClipper::Begin(int items_count, float items_height) { + if (Ctx == NULL) + Ctx = ImGui::GetCurrentContext(); + ImGuiContext& g = *Ctx; ImGuiWindow* window = g.CurrentWindow; IMGUI_DEBUG_LOG_CLIPPER("Clipper: Begin(%d,%.2f) in '%s'\n", items_count, items_height, window->Name); @@ -2788,10 +2926,10 @@ void ImGuiListClipper::Begin(int items_count, float items_height) void ImGuiListClipper::End() { - ImGuiContext& g = *Ctx; if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData) { // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user. + ImGuiContext& g = *Ctx; IMGUI_DEBUG_LOG_CLIPPER("Clipper: End() in '%s'\n", g.CurrentWindow->Name); if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0) ImGuiListClipper_SeekCursorForItem(this, ItemsCount); @@ -2809,7 +2947,7 @@ void ImGuiListClipper::End() ItemsCount = -1; } -void ImGuiListClipper::IncludeRangeByIndices(int item_begin, int item_end) +void ImGuiListClipper::IncludeItemsByIndex(int item_begin, int item_end) { ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet. @@ -2892,7 +3030,7 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); if (is_nav_request) data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0)); - if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1) + if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && g.NavTabbingDir == -1) data->Ranges.push_back(ImGuiListClipperRange::FromIndices(clipper->ItemsCount - 1, clipper->ItemsCount)); // Add focused/active item @@ -2910,26 +3048,28 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) // - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping. // - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list, // which with the flooring/ceiling tend to lead to 2 items instead of one being submitted. - for (int i = 0; i < data->Ranges.Size; i++) - if (data->Ranges[i].PosToIndexConvert) + for (ImGuiListClipperRange& range : data->Ranges) + if (range.PosToIndexConvert) { - int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight); - int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f); - data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1); - data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, clipper->ItemsCount); - data->Ranges[i].PosToIndexConvert = false; + int m1 = (int)(((double)range.Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight); + int m2 = (int)((((double)range.Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f); + range.Min = ImClamp(already_submitted + m1 + range.PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1); + range.Max = ImClamp(already_submitted + m2 + range.PosToIndexOffsetMax, range.Min + 1, clipper->ItemsCount); + range.PosToIndexConvert = false; } ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo); } // Step 0+ (if item height is given in advance) or 1+: Display the next range in line. - if (data->StepNo < data->Ranges.Size) + while (data->StepNo < data->Ranges.Size) { clipper->DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted); clipper->DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, clipper->ItemsCount); if (clipper->DisplayStart > already_submitted) //-V1051 ImGuiListClipper_SeekCursorForItem(clipper, clipper->DisplayStart); data->StepNo++; + if (clipper->DisplayStart == clipper->DisplayEnd && data->StepNo < data->Ranges.Size) + continue; return true; } @@ -2996,13 +3136,14 @@ const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) return style.Colors[idx]; } -ImU32 ImGui::GetColorU32(ImU32 col) +ImU32 ImGui::GetColorU32(ImU32 col, float alpha_mul) { ImGuiStyle& style = GImGui->Style; - if (style.Alpha >= 1.0f) + alpha_mul *= style.Alpha; + if (alpha_mul >= 1.0f) return col; ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; - a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. + a = (ImU32)(a * alpha_mul); // We don't need to clamp 0..255 because alpha is in 0..1 range. return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); } @@ -3014,7 +3155,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) backup.Col = idx; backup.BackupValue = g.Style.Colors[idx]; g.ColorStack.push_back(backup); - g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); + if (g.DebugFlashStyleColorIdx != idx) + g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); } void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) @@ -3024,7 +3166,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) backup.Col = idx; backup.BackupValue = g.Style.Colors[idx]; g.ColorStack.push_back(backup); - g.Style.Colors[idx] = col; + if (g.DebugFlashStyleColorIdx != idx) + g.Style.Colors[idx] = col; } void ImGui::PopStyleColor(int count) @@ -3032,7 +3175,7 @@ void ImGui::PopStyleColor(int count) ImGuiContext& g = *GImGui; if (g.ColorStack.Size < count) { - IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times: stack underflow."); + IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times!"); count = g.ColorStack.Size; } while (count > 0) @@ -3046,34 +3189,38 @@ void ImGui::PopStyleColor(int count) static const ImGuiDataVarInfo GStyleVarInfo[] = { - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextBorderSize) },// ImGuiStyleVar_SeparatorTextBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBorderSize) }, // ImGuiStyleVar_TabBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBarBorderSize) }, // ImGuiStyleVar_TabBarBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersAngle)}, // ImGuiStyleVar_TableAngledHeadersAngle + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersTextAlign)},// ImGuiStyleVar_TableAngledHeadersTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, SeparatorTextBorderSize)}, // ImGuiStyleVar_SeparatorTextBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding }; const ImGuiDataVarInfo* ImGui::GetStyleVarInfo(ImGuiStyleVar idx) @@ -3094,7 +3241,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) *pvar = val; return; } - IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); + IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!"); } void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) @@ -3108,7 +3255,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) *pvar = val; return; } - IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); + IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!"); } void ImGui::PopStyleVar(int count) @@ -3116,7 +3263,7 @@ void ImGui::PopStyleVar(int count) ImGuiContext& g = *GImGui; if (g.StyleVarStack.Size < count) { - IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times: stack underflow."); + IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times!"); count = g.StyleVarStack.Size; } while (count > 0) @@ -3351,7 +3498,7 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con // Render text, render ellipsis RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); - ImVec2 ellipsis_pos = ImFloor(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y)); + ImVec2 ellipsis_pos = ImTrunc(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y)); if (ellipsis_pos.x + ellipsis_width <= ellipsis_max_x) for (int i = 0; i < font->EllipsisCharCount; i++, ellipsis_pos.x += font->EllipsisCharStep * font_scale) font->RenderChar(draw_list, font_size, ellipsis_pos, GetColorU32(ImGuiCol_Text), font->EllipsisChar); @@ -3405,22 +3552,22 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding; ImRect display_rect = bb; display_rect.ClipWith(window->ClipRect); - if (flags & ImGuiNavHighlightFlags_TypeDefault) + const float thickness = 2.0f; + if (flags & ImGuiNavHighlightFlags_Compact) { - const float THICKNESS = 2.0f; - const float DISTANCE = 3.0f + THICKNESS * 0.5f; - display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness); + } + else + { + const float distance = 3.0f + thickness * 0.5f; + display_rect.Expand(ImVec2(distance, distance)); bool fully_visible = window->ClipRect.Contains(display_rect); if (!fully_visible) window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); - window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness); if (!fully_visible) window->DrawList->PopClipRect(); } - if (flags & ImGuiNavHighlightFlags_TypeThin) - { - window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); - } } void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) @@ -3428,13 +3575,12 @@ void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCurso ImGuiContext& g = *GImGui; IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor. ImVec2 offset, size, uv[4]; if (!font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) continue; - ImGuiViewportP* viewport = g.Viewports[n]; const ImVec2 pos = base_pos - offset; const float scale = base_scale; if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale))) @@ -3510,6 +3656,7 @@ void ImGui::DestroyContext(ImGuiContext* ctx) // IMPORTANT: ###xxx suffixes must be same in ALL languages static const ImGuiLocEntry GLocalizationEntriesEnUS[] = { + { ImGuiLocKey_VersionStr, "Dear ImGui " IMGUI_VERSION " (" IM_STRINGIFY(IMGUI_VERSION_NUM) ")" }, { ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" }, { ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" }, { ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" }, @@ -3549,9 +3696,18 @@ void ImGui::Initialize() // Create default viewport ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); + viewport->ID = IMGUI_VIEWPORT_DEFAULT_ID; g.Viewports.push_back(viewport); g.TempBuffer.resize(1024 * 3 + 1, 0); + // Build KeysMayBeCharInput[] lookup table (1 bool per named key) + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + if ((key >= ImGuiKey_0 && key <= ImGuiKey_9) || (key >= ImGuiKey_A && key <= ImGuiKey_Z) || (key >= ImGuiKey_Keypad0 && key <= ImGuiKey_Keypad9) + || key == ImGuiKey_Tab || key == ImGuiKey_Space || key == ImGuiKey_Apostrophe || key == ImGuiKey_Comma || key == ImGuiKey_Minus || key == ImGuiKey_Period + || key == ImGuiKey_Slash || key == ImGuiKey_Semicolon || key == ImGuiKey_Equal || key == ImGuiKey_LeftBracket || key == ImGuiKey_RightBracket || key == ImGuiKey_GraveAccent + || key == ImGuiKey_KeypadDecimal || key == ImGuiKey_KeypadDivide || key == ImGuiKey_KeypadMultiply || key == ImGuiKey_KeypadSubtract || key == ImGuiKey_KeypadAdd || key == ImGuiKey_KeypadEqual) + g.KeysMayBeCharInput.SetBit(key); + #ifdef IMGUI_HAS_DOCK #endif @@ -3561,8 +3717,11 @@ void ImGui::Initialize() // This function is merely here to free heap allocations. void ImGui::Shutdown() { - // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) ImGuiContext& g = *GImGui; + IM_ASSERT_USER_ERROR(g.IO.BackendPlatformUserData == NULL, "Forgot to shutdown Platform backend?"); + IM_ASSERT_USER_ERROR(g.IO.BackendRendererUserData == NULL, "Forgot to shutdown Renderer backend?"); + + // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) if (g.IO.Fonts && g.FontAtlasOwnedByContext) { g.IO.Fonts->Locked = false; @@ -3600,6 +3759,7 @@ void ImGui::Shutdown() g.FontStack.clear(); g.OpenPopupStack.clear(); g.BeginPopupStack.clear(); + g.NavTreeNodeStack.clear(); g.Viewports.clear_delete(); @@ -3651,9 +3811,9 @@ void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) { ImGuiContext& g = *ctx; IM_ASSERT(hook_id != 0); - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].HookId == hook_id) - g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; + for (ImGuiContextHook& hook : g.Hooks) + if (hook.HookId == hook_id) + hook.Type = ImGuiContextHookType_PendingRemoval_; } // Call context hooks (used by e.g. test engine) @@ -3661,9 +3821,9 @@ void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) { ImGuiContext& g = *ctx; - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].Type == hook_type) - g.Hooks[n].Callback(&g, &g.Hooks[n]); + for (ImGuiContextHook& hook : g.Hooks) + if (hook.Type == hook_type) + hook.Callback(&g, &hook); } @@ -3704,50 +3864,12 @@ ImGuiWindow::~ImGuiWindow() ColumnsStorage.clear_destruct(); } -ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); - return id; -} - -ImGuiID ImGuiWindow::GetID(const void* ptr) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); - return id; -} - -ImGuiID ImGuiWindow::GetID(int n) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&n, sizeof(n), seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); - return id; -} - -// This is only used in rare/specific situations to manufacture an ID out of nowhere. -ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) -{ - ImGuiID seed = IDStack.back(); - ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); - ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); - return id; -} - static void SetCurrentWindow(ImGuiWindow* window) { ImGuiContext& g = *GImGui; g.CurrentWindow = window; g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; + g.CurrentDpiScale = 1.0f; // FIXME-DPI: WIP this is modified in docking if (window) { g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); @@ -3832,6 +3954,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) g.ActiveIdNoClearOnFocusLoss = false; g.ActiveIdWindow = window; g.ActiveIdHasBeenEditedThisFrame = false; + g.ActiveIdFromShortcut = false; if (id) { g.ActiveIdIsAlive = id; @@ -3868,22 +3991,13 @@ ImGuiID ImGui::GetHoveredID() return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame; } -// This is called by ItemAdd(). -// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). -void ImGui::KeepAliveID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId == id) - g.ActiveIdIsAlive = id; - if (g.ActiveIdPreviousFrame == id) - g.ActiveIdPreviousFrameIsAlive = true; -} - void ImGui::MarkItemEdited(ImGuiID id) { // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit(). // ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need to fill the data. ImGuiContext& g = *GImGui; + if (g.LockMarkEdited > 0) + return; if (g.ActiveId == id || g.ActiveId == 0) { g.ActiveIdHasBeenEditedThisFrame = true; @@ -3923,6 +4037,24 @@ bool ImGui::IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flag return true; } +static inline float CalcDelayFromHoveredFlags(ImGuiHoveredFlags flags) +{ + ImGuiContext& g = *GImGui; + if (flags & ImGuiHoveredFlags_DelayNormal) + return g.Style.HoverDelayNormal; + if (flags & ImGuiHoveredFlags_DelayShort) + return g.Style.HoverDelayShort; + return 0.0f; +} + +static ImGuiHoveredFlags ApplyHoverFlagsForTooltip(ImGuiHoveredFlags user_flags, ImGuiHoveredFlags shared_flags) +{ + // Allow instance flags to override shared flags + if (user_flags & (ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal)) + shared_flags &= ~(ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal); + return user_flags | shared_flags; +} + // This is roughly matching the behavior of internal-facing ItemHoverable() // - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() // - this should work even for non-interactive items that have no ID, so we cannot use LastItemId @@ -3930,12 +4062,17 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT((flags & ~ImGuiHoveredFlags_AllowedMaskForIsItemHovered) == 0 && "Invalid flags for IsItemHovered()!"); + if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride)) { if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) return false; if (!IsItemFocused()) return false; + + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipNav); } else { @@ -3943,6 +4080,10 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags; if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) return false; + + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse); + IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function // Done with rectangle culling so we can perform heavier checks now @@ -3952,12 +4093,13 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was // the test that has been running for a long while. if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) - if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByWindow) == 0) return false; // Test if another item is active (e.g. being dragged) + const ImGuiID id = g.LastItemData.ID; if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) - if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) return false; // Test if interactions on this window are blocked by an active popup or modal. @@ -3971,48 +4113,61 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) // Special handling for calling after Begin() which represent the title bar or tab. // When the window is skipped/collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. - if (g.LastItemData.ID == window->MoveId && window->WriteAccessed) + if (id == window->MoveId && window->WriteAccessed) return false; + + // Test if using AllowOverlap and overlapped + if ((g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap) && id != 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByItem) == 0) + if (g.HoveredIdPreviousFrame != g.LastItemData.ID) + return false; } // Handle hover delay // (some ideas: https://www.nngroup.com/articles/timing-exposing-content) - float delay; - if (flags & ImGuiHoveredFlags_DelayNormal) - delay = g.IO.HoverDelayNormal; - else if (flags & ImGuiHoveredFlags_DelayShort) - delay = g.IO.HoverDelayShort; - else - delay = 0.0f; - if (delay > 0.0f) + const float delay = CalcDelayFromHoveredFlags(flags); + if (delay > 0.0f || (flags & ImGuiHoveredFlags_Stationary)) { ImGuiID hover_delay_id = (g.LastItemData.ID != 0) ? g.LastItemData.ID : window->GetIDFromRectangle(g.LastItemData.Rect); - if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverDelayIdPreviousFrame != hover_delay_id)) - g.HoverDelayTimer = 0.0f; - g.HoverDelayId = hover_delay_id; - return g.HoverDelayTimer >= delay; + if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverItemDelayIdPreviousFrame != hover_delay_id)) + g.HoverItemDelayTimer = 0.0f; + g.HoverItemDelayId = hover_delay_id; + + // When changing hovered item we requires a bit of stationary delay before activating hover timer, + // but once unlocked on a given item we also moving. + //if (g.HoverDelayTimer >= delay && (g.HoverDelayTimer - g.IO.DeltaTime < delay || g.MouseStationaryTimer - g.IO.DeltaTime < g.Style.HoverStationaryDelay)) { IMGUI_DEBUG_LOG("HoverDelayTimer = %f/%f, MouseStationaryTimer = %f\n", g.HoverDelayTimer, delay, g.MouseStationaryTimer); } + if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverItemUnlockedStationaryId != hover_delay_id) + return false; + + if (g.HoverItemDelayTimer < delay) + return false; } return true; } // Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). -bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) +// (this does not rely on LastItemData it can be called from a ButtonBehavior() call not following an ItemAdd() call) +// FIXME-LEGACY: the 'ImGuiItemFlags item_flags' parameter was added on 2023-06-28. +// If you used this in your legacy/custom widgets code: +// - Commonly: if your ItemHoverable() call comes after an ItemAdd() call: pass 'item_flags = g.LastItemData.InFlags'. +// - Rare: otherwise you may pass 'item_flags = 0' (ImGuiItemFlags_None) unless you want to benefit from special behavior handled by ItemHoverable. +bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags) { ImGuiContext& g = *GImGui; - if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) - return false; - ImGuiWindow* window = g.CurrentWindow; if (g.HoveredWindow != window) return false; - if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) - return false; if (!IsMouseHoveringRect(bb.Min, bb.Max)) return false; + if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) + return false; + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) + if (!g.ActiveIdFromShortcut) + return false; + // Done with rectangle culling so we can perform heavier checks now. - ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) { g.HoveredIdDisabled = true; @@ -4022,29 +4177,51 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level // hover test in widgets code. We could also decide to split this function is two. if (id != 0) + { + // Drag source doesn't report as hovered + if (g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) + return false; + SetHoveredID(id); + // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. + // This allows using patterns where a later submitted widget overlaps a previous one. Generally perceived as a front-to-back hit-test. + if (item_flags & ImGuiItemFlags_AllowOverlap) + { + g.HoveredIdAllowOverlap = true; + if (g.HoveredIdPreviousFrame != id) + return false; + } + + // Display shortcut (only works with mouse) + if (id == g.LastItemData.ID && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasShortcut)) + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal)) + SetTooltip("%s", GetKeyChordName(g.LastItemData.Shortcut)); + } + // When disabled we'll return false but still set HoveredId if (item_flags & ImGuiItemFlags_Disabled) { // Release active id if turning disabled - if (g.ActiveId == id) + if (g.ActiveId == id && id != 0) ClearActiveID(); g.HoveredIdDisabled = true; return false; } +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (id != 0) { // [DEBUG] Item Picker tool! - // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making - // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered - // items if we performed the test in ItemAdd(), but that would incur a small runtime cost. + // We perform the check here because reaching is path is rare (1~ time a frame), + // making the cost of this tool near-zero! We could get better call-stack and support picking non-hovered + // items if we performed the test in ItemAdd(), but that would incur a bigger runtime cost. if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); if (g.DebugItemPickerBreakId == id) IM_DEBUG_BREAK(); } +#endif if (g.NavDisableMouseHover) return false; @@ -4053,12 +4230,13 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) } // FIXME: This is inlined/duplicated in ItemAdd() +// FIXME: The id != 0 path is not used by our codebase, may get rid of it? bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (!bb.Overlaps(window->ClipRect)) - if (id == 0 || (id != g.ActiveId && id != g.NavId)) + if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId)) if (!g.LogEnabled) return true; return false; @@ -4102,20 +4280,51 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) // IM_ALLOC() == ImGui::MemAlloc() void* ImGui::MemAlloc(size_t size) { + void* ptr = (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations++; - return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); + DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, size); +#endif + return ptr; } // IM_FREE() == ImGui::MemFree() void ImGui::MemFree(void* ptr) { - if (ptr) +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (ptr != NULL) if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations--; + DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, (size_t)-1); +#endif return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); } +// We record the number of allocation in recent frames, as a way to audit/sanitize our guiding principles of "no allocations on idle/repeating frames" +void ImGui::DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size) +{ + ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[info->LastEntriesIdx]; + IM_UNUSED(ptr); + if (entry->FrameCount != frame_count) + { + info->LastEntriesIdx = (info->LastEntriesIdx + 1) % IM_ARRAYSIZE(info->LastEntriesBuf); + entry = &info->LastEntriesBuf[info->LastEntriesIdx]; + entry->FrameCount = frame_count; + entry->AllocCount = entry->FreeCount = 0; + } + if (size != (size_t)-1) + { + entry->AllocCount++; + info->TotalAllocCount++; + //printf("[%05d] MemAlloc(%d) -> 0x%p\n", frame_count, size, ptr); + } + else + { + entry->FreeCount++; + info->TotalFreeCount++; + //printf("[%05d] MemFree(0x%p)\n", frame_count, ptr); + } +} + const char* ImGui::GetClipboardText() { ImGuiContext& g = *GImGui; @@ -4158,33 +4367,33 @@ int ImGui::GetFrameCount() return GImGui->FrameCount; } -static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) +static ImDrawList* GetViewportBgFgDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) { // Create the draw list on demand, because they are not frequently used for all viewports ImGuiContext& g = *GImGui; - IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); - ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; + IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->BgFgDrawLists)); + ImDrawList* draw_list = viewport->BgFgDrawLists[drawlist_no]; if (draw_list == NULL) { draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); draw_list->_OwnerName = drawlist_name; - viewport->DrawLists[drawlist_no] = draw_list; + viewport->BgFgDrawLists[drawlist_no] = draw_list; } // Our ImDrawList system requires that there is always a command - if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) + if (viewport->BgFgDrawListsLastFrame[drawlist_no] != g.FrameCount) { draw_list->_ResetForNewFrame(); draw_list->PushTextureID(g.IO.Fonts->TexID); draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); - viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; + viewport->BgFgDrawListsLastFrame[drawlist_no] = g.FrameCount; } return draw_list; } ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) { - return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); + return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 0, "##Background"); } ImDrawList* ImGui::GetBackgroundDrawList() @@ -4195,7 +4404,7 @@ ImDrawList* ImGui::GetBackgroundDrawList() ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) { - return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); + return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); } ImDrawList* ImGui::GetForegroundDrawList() @@ -4332,6 +4541,9 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() { ImGuiContext& g = *GImGui; ImGuiIO& io = g.IO; + + // FIXME-DPI: This storage was added on 2021/03/31 for test engine, but if we want to multiply WINDOWS_HOVER_PADDING + // by DpiScale, we need to make this window-agnostic anyhow, maybe need storing inside ImGuiWindow. g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING)); // Find the window hovered by mouse: @@ -4339,7 +4551,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. bool clear_hovered_windows = false; - FindHoveredWindow(); + FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow); // Modal windows prevents mouse from hovering behind them. ImGuiWindow* modal_window = GetTopMostPopupModal(); @@ -4393,17 +4605,37 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() } // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app) - if (g.WantCaptureKeyboardNextFrame != -1) - io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); - else - io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); + io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)) io.WantCaptureKeyboard = true; + if (g.WantCaptureKeyboardNextFrame != -1) // Manual override + io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); // Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; } +// Calling SetupDrawListSharedData() is followed by SetCurrentFont() which sets up the remaining data. +static void SetupDrawListSharedData() +{ + ImGuiContext& g = *GImGui; + ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (ImGuiViewportP* viewport : g.Viewports) + virtual_space.Add(viewport->GetMainRect()); + g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); + g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; + g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); + g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; + if (g.Style.AntiAliasedLines) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; + if (g.Style.AntiAliasedLinesUseTex && !(g.IO.Fonts->Flags & ImFontAtlasFlags_NoBakedLines)) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; + if (g.Style.AntiAliasedFill) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; + if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; +} + void ImGui::NewFrame() { IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); @@ -4446,30 +4678,13 @@ void ImGui::NewFrame() // Setup current font and draw list shared data g.IO.Fonts->Locked = true; + SetupDrawListSharedData(); SetCurrentFont(GetDefaultFont()); IM_ASSERT(g.Font->IsLoaded()); - ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - virtual_space.Add(g.Viewports[n]->GetMainRect()); - g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); - g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; - g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); - g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; - if (g.Style.AntiAliasedLines) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; - if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; - if (g.Style.AntiAliasedFill) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; - if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; // Mark rendering data as invalid to prevent user who may have a handle on it to use it. - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataP.Clear(); - } + for (ImGuiViewportP* viewport : g.Viewports) + viewport->DrawDataP.Valid = false; // Drag and drop keep the source ID alive so even if the source disappear our state is consistent if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) @@ -4534,21 +4749,33 @@ void ImGui::NewFrame() } #endif + // Record when we have been stationary as this state is preserved while over same item. + // FIXME: The way this is expressed means user cannot alter HoverStationaryDelay during the frame to use varying values. + // To allow this we should store HoverItemMaxStationaryTime+ID and perform the >= check in IsItemHovered() function. + if (g.HoverItemDelayId != 0 && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay) + g.HoverItemUnlockedStationaryId = g.HoverItemDelayId; + else if (g.HoverItemDelayId == 0) + g.HoverItemUnlockedStationaryId = 0; + if (g.HoveredWindow != NULL && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay) + g.HoverWindowUnlockedStationaryId = g.HoveredWindow->ID; + else if (g.HoveredWindow == NULL) + g.HoverWindowUnlockedStationaryId = 0; + // Update hover delay for IsItemHovered() with delays and tooltips - g.HoverDelayIdPreviousFrame = g.HoverDelayId; - if (g.HoverDelayId != 0) + g.HoverItemDelayIdPreviousFrame = g.HoverItemDelayId; + if (g.HoverItemDelayId != 0) { - //if (g.IO.MouseDelta.x == 0.0f && g.IO.MouseDelta.y == 0.0f) // Need design/flags - g.HoverDelayTimer += g.IO.DeltaTime; - g.HoverDelayClearTimer = 0.0f; - g.HoverDelayId = 0; + g.HoverItemDelayTimer += g.IO.DeltaTime; + g.HoverItemDelayClearTimer = 0.0f; + g.HoverItemDelayId = 0; } - else if (g.HoverDelayTimer > 0.0f) + else if (g.HoverItemDelayTimer > 0.0f) { // This gives a little bit of leeway before clearing the hover timer, allowing mouse to cross gaps - g.HoverDelayClearTimer += g.IO.DeltaTime; - if (g.HoverDelayClearTimer >= ImMax(0.20f, g.IO.DeltaTime * 2.0f)) // ~6 frames at 30 Hz + allow for low framerate - g.HoverDelayTimer = g.HoverDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer. + // We could expose 0.25f as style.HoverClearDelay but I am not sure of the logic yet, this is particularly subtle. + g.HoverItemDelayClearTimer += g.IO.DeltaTime; + if (g.HoverItemDelayClearTimer >= ImMax(0.25f, g.IO.DeltaTime * 2.0f)) // ~7 frames at 30 Hz + allow for low framerate + g.HoverItemDelayTimer = g.HoverItemDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer. } // Drag and drop @@ -4603,9 +4830,8 @@ void ImGui::NewFrame() // Mark all windows as not visible and compact unused memory. IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size); const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; window->WasActive = window->Active; window->Active = false; window->WriteAccessed = false; @@ -4621,9 +4847,9 @@ void ImGui::NewFrame() for (int i = 0; i < g.TablesLastTimeActive.Size; i++) if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); - for (int i = 0; i < g.TablesTempData.Size; i++) - if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time) - TableGcCompactTransientBuffers(&g.TablesTempData[i]); + for (ImGuiTableTempData& table_temp_data : g.TablesTempData) + if (table_temp_data.LastTimeActive >= 0.0f && table_temp_data.LastTimeActive < memory_compact_start_time) + TableGcCompactTransientBuffers(&table_temp_data); if (g.GcCompactAll) GcCompactTransientMiscBuffers(); g.GcCompactAll = false; @@ -4641,15 +4867,22 @@ void ImGui::NewFrame() g.GroupStack.resize(0); // [DEBUG] Update debug features +#ifndef IMGUI_DISABLE_DEBUG_TOOLS UpdateDebugToolItemPicker(); UpdateDebugToolStackQueries(); + UpdateDebugToolFlashStyleColor(); if (g.DebugLocateFrames > 0 && --g.DebugLocateFrames == 0) - g.DebugLocateId = 0; - if (g.DebugLogClipperAutoDisableFrames > 0 && --g.DebugLogClipperAutoDisableFrames == 0) { - DebugLog("(Auto-disabled ImGuiDebugLogFlags_EventClipper to avoid spamming)\n"); - g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper; + g.DebugLocateId = 0; + g.DebugBreakInLocateId = false; } + if (g.DebugLogAutoDisableFrames > 0 && --g.DebugLogAutoDisableFrames == 0) + { + DebugLog("(Debug Log: Auto-disabled some ImGuiDebugLogFlags after 2 frames)\n"); + g.DebugLogFlags &= ~g.DebugLogAutoDisableFlags; + g.DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None; + } +#endif // Create implicit/fallback window - which we will only render it if the user has added something to it. // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. @@ -4661,10 +4894,12 @@ void ImGui::NewFrame() // [DEBUG] When io.ConfigDebugBeginReturnValue is set, we make Begin()/BeginChild() return false at different level of the window-stack, // allowing to validate correct Begin/End behavior in user code. +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (g.IO.ConfigDebugBeginReturnValueLoop) g.DebugBeginReturnValueCullDepth = (g.DebugBeginReturnValueCullDepth == -1) ? 0 : ((g.DebugBeginReturnValueCullDepth + ((g.FrameCount % 4) == 0 ? 1 : 0)) % 10); else g.DebugBeginReturnValueCullDepth = -1; +#endif CallContextHooks(&g, ImGuiContextHookType_NewFramePost); } @@ -4697,53 +4932,17 @@ static void AddWindowToSortBuffer(ImVector* out_sorted_windows, Im } } -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list) -{ - if (draw_list->CmdBuffer.Size == 0) - return; - if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) - return; - - // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. - // May trigger for you if you are using PrimXXX functions incorrectly. - IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); - IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); - if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); - - // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) - // If this assert triggers because you are drawing lots of stuff manually: - // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. - // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. - // - If you want large meshes with more than 64K vertices, you can either: - // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. - // Most example backends already support this from 1.71. Pre-1.71 backends won't. - // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. - // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. - // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: - // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); - // Your own engine or render API may use different parameters or function calls to specify index sizes. - // 2 and 4 bytes indices are generally supported by most graphics API. - // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching - // the 64K limit to split your draw commands in multiple draw lists. - if (sizeof(ImDrawIdx) == 2) - IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); - - out_list->push_back(draw_list); -} - static void AddWindowToDrawData(ImGuiWindow* window, int layer) { ImGuiContext& g = *GImGui; ImGuiViewportP* viewport = g.Viewports[0]; g.IO.MetricsRenderWindows++; - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); - for (int i = 0; i < window->DC.ChildWindows.Size; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; + if (window->DrawList->_Splitter._Count > 1) + window->DrawList->ChannelsMerge(); // Merge if user forgot to merge back. Also required in Docking branch for ImGuiWindowFlags_DockNodeHost windows. + ImGui::AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[layer], window->DrawList); + for (ImGuiWindow* child : window->DC.ChildWindows) if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active AddWindowToDrawData(child, layer); - } } static inline int GetWindowDisplayLayer(ImGuiWindow* window) @@ -4757,42 +4956,41 @@ static inline void AddRootWindowToDrawData(ImGuiWindow* window) AddWindowToDrawData(window, GetWindowDisplayLayer(window)); } -void ImDrawDataBuilder::FlattenIntoSingleLayer() +static void FlattenDrawDataIntoSingleLayer(ImDrawDataBuilder* builder) { - int n = Layers[0].Size; - int size = n; - for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) - size += Layers[i].Size; - Layers[0].resize(size); - for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) + int n = builder->Layers[0]->Size; + int full_size = n; + for (int i = 1; i < IM_ARRAYSIZE(builder->Layers); i++) + full_size += builder->Layers[i]->Size; + builder->Layers[0]->resize(full_size); + for (int layer_n = 1; layer_n < IM_ARRAYSIZE(builder->Layers); layer_n++) { - ImVector& layer = Layers[layer_n]; - if (layer.empty()) + ImVector* layer = builder->Layers[layer_n]; + if (layer->empty()) continue; - memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); - n += layer.Size; - layer.resize(0); + memcpy(builder->Layers[0]->Data + n, layer->Data, layer->Size * sizeof(ImDrawList*)); + n += layer->Size; + layer->resize(0); } } -static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector* draw_lists) +static void InitViewportDrawData(ImGuiViewportP* viewport) { ImGuiIO& io = ImGui::GetIO(); ImDrawData* draw_data = &viewport->DrawDataP; + + viewport->DrawDataBuilder.Layers[0] = &draw_data->CmdLists; + viewport->DrawDataBuilder.Layers[1] = &viewport->DrawDataBuilder.LayerData1; + viewport->DrawDataBuilder.Layers[0]->resize(0); + viewport->DrawDataBuilder.Layers[1]->resize(0); + draw_data->Valid = true; - draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; - draw_data->CmdListsCount = draw_lists->Size; + draw_data->CmdListsCount = 0; draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; draw_data->DisplayPos = viewport->Pos; draw_data->DisplaySize = viewport->Size; draw_data->FramebufferScale = io.DisplayFramebufferScale; - for (int n = 0; n < draw_lists->Size; n++) - { - ImDrawList* draw_list = draw_lists->Data[n]; - draw_list->_PopUnusedDrawCmd(); - draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; - draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; - } + draw_data->OwnerViewport = viewport; } // Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. @@ -4831,14 +5029,14 @@ static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 ImDrawList* draw_list = window->RootWindow->DrawList; if (draw_list->CmdBuffer.Size == 0) draw_list->AddDrawCmd(); - draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged + draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // FIXME: Need to stricty ensure ImDrawCmd are not merged (ElemCount==6 checks below will verify that) draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); ImDrawCmd cmd = draw_list->CmdBuffer.back(); IM_ASSERT(cmd.ElemCount == 6); draw_list->CmdBuffer.pop_back(); draw_list->CmdBuffer.push_front(cmd); - draw_list->PopClipRect(); draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command. + draw_list->PopClipRect(); } } @@ -4874,7 +5072,7 @@ static void ImGui::RenderDimmedBackgrounds() { // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); - RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); + RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(modal_window->DC.ModalDimBgColor, g.DimBgRatio)); } else if (dim_bg_for_window_list) { @@ -4918,18 +5116,7 @@ void ImGui::EndFrame() { IMGUI_DEBUG_LOG_IO("[io] Calling io.SetPlatformImeDataFn(): WantVisible: %d, InputPos (%.2f,%.2f)\n", ime_data->WantVisible, ime_data->InputPos.x, ime_data->InputPos.y); ImGuiViewport* viewport = GetMainViewport(); -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - if (viewport->PlatformHandleRaw == NULL && g.IO.ImeWindowHandle != NULL) - { - viewport->PlatformHandleRaw = g.IO.ImeWindowHandle; - g.IO.SetPlatformImeDataFn(viewport, ime_data); - viewport->PlatformHandleRaw = NULL; - } - else -#endif - { - g.IO.SetPlatformImeDataFn(viewport, ime_data); - } + g.IO.SetPlatformImeDataFn(viewport, ime_data); } // Hide implicit/fallback "Debug" window if it hasn't been used @@ -4969,9 +5156,8 @@ void ImGui::EndFrame() // We cannot do that on FocusWindow() because children may not exist yet g.WindowsTempSortBuffer.resize(0); g.WindowsTempSortBuffer.reserve(g.Windows.Size); - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it continue; AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); @@ -4986,6 +5172,7 @@ void ImGui::EndFrame() g.IO.Fonts->Locked = false; // Clear Input data for next frame + g.IO.MousePosPrev = g.IO.MousePos; g.IO.AppFocusLost = false; g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; g.IO.InputQueueCharacters.resize(0); @@ -5003,32 +5190,30 @@ void ImGui::Render() if (g.FrameCountEnded != g.FrameCount) EndFrame(); - const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount); + if (g.FrameCountRendered == g.FrameCount) + return; g.FrameCountRendered = g.FrameCount; - g.IO.MetricsRenderWindows = 0; + g.IO.MetricsRenderWindows = 0; CallContextHooks(&g, ImGuiContextHookType_RenderPre); - // Add background ImDrawList (for each active viewport) - for (int n = 0; n != g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.Clear(); - if (viewport->DrawLists[0] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); - } - // Draw modal/window whitening backgrounds - if (first_render_of_frame) - RenderDimmedBackgrounds(); + RenderDimmedBackgrounds(); + + // Add background ImDrawList (for each active viewport) + for (ImGuiViewportP* viewport : g.Viewports) + { + InitViewportDrawData(viewport); + if (viewport->BgFgDrawLists[0] != NULL) + AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); + } // Add ImDrawList to render ImGuiWindow* windows_to_render_top_most[2]; windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); - for (int n = 0; n != g.Windows.Size; n++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[n]; IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) AddRootWindowToDrawData(window); @@ -5038,22 +5223,25 @@ void ImGui::Render() AddRootWindowToDrawData(windows_to_render_top_most[n]); // Draw software mouse cursor if requested by io.MouseDrawCursor flag - if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None) + if (g.IO.MouseDrawCursor && g.MouseCursor != ImGuiMouseCursor_None) RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); // Setup ImDrawData structures for end-user g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.FlattenIntoSingleLayer(); + FlattenDrawDataIntoSingleLayer(&viewport->DrawDataBuilder); // Add foreground ImDrawList (for each active viewport) - if (viewport->DrawLists[1] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); + if (viewport->BgFgDrawLists[1] != NULL) + AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); - SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); + // We call _PopUnusedDrawCmd() last thing, as RenderDimmedBackgrounds() rely on a valid command being there (especially in docking branch). ImDrawData* draw_data = &viewport->DrawDataP; + IM_ASSERT(draw_data->CmdLists.Size == draw_data->CmdListsCount); + for (ImDrawList* draw_list : draw_data->CmdLists) + draw_list->_PopUnusedDrawCmd(); + g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; } @@ -5084,22 +5272,24 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex // FIXME: Investigate using ceilf or e.g. // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html - text_size.x = IM_FLOOR(text_size.x + 0.99999f); + text_size.x = IM_TRUNC(text_size.x + 0.99999f); return text_size; } // Find window given position, search front-to-back -// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically -// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is -// called, aka before the next Begin(). Moving window isn't affected. -static void FindHoveredWindow() +// - Typically write output back to g.HoveredWindow and g.HoveredWindowUnderMovingWindow. +// - FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically +// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is +// called, aka before the next Begin(). Moving window isn't affected. +// - The 'find_first_and_in_any_viewport = true' mode is only used by TestEngine. It is simpler to maintain here. +void ImGui::FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window) { ImGuiContext& g = *GImGui; - ImGuiWindow* hovered_window = NULL; - ImGuiWindow* hovered_window_ignoring_moving_window = NULL; - if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) + ImGuiWindow* hovered_window_under_moving_window = NULL; + + if (find_first_and_in_any_viewport == false && g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) hovered_window = g.MovingWindow; ImVec2 padding_regular = g.Style.TouchExtraPadding; @@ -5114,12 +5304,8 @@ static void FindHoveredWindow() continue; // Using the clipped AABB, a child window will typically be clipped by its parent (not always) - ImRect bb(window->OuterRectClipped); - if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) - bb.Expand(padding_regular); - else - bb.Expand(padding_for_resize); - if (!bb.Contains(g.IO.MousePos)) + ImVec2 hit_padding = (window->Flags & (ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) ? padding_regular : padding_for_resize; + if (!window->OuterRectClipped.ContainsWithPad(pos, hit_padding)) continue; // Support for one rectangular hole in any given window @@ -5128,21 +5314,30 @@ static void FindHoveredWindow() { ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); - if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) + if (ImRect(hole_pos, hole_pos + hole_size).Contains(pos)) continue; } - if (hovered_window == NULL) + if (find_first_and_in_any_viewport) + { hovered_window = window; - IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. - if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) - hovered_window_ignoring_moving_window = window; - if (hovered_window && hovered_window_ignoring_moving_window) break; + } + else + { + if (hovered_window == NULL) + hovered_window = window; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (hovered_window_under_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) + hovered_window_under_moving_window = window; + if (hovered_window && hovered_window_under_moving_window) + break; + } } - g.HoveredWindow = hovered_window; - g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; + *out_hovered_window = hovered_window; + if (out_hovered_window_under_moving_window != NULL) + *out_hovered_window_under_moving_window = hovered_window_under_moving_window; } bool ImGui::IsItemActive() @@ -5204,6 +5399,9 @@ bool ImGui::IsItemToggledSelection() return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; } +// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, +// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! +// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. bool ImGui::IsAnyItemHovered() { ImGuiContext& g = *GImGui; @@ -5234,17 +5432,28 @@ bool ImGui::IsItemEdited() return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0; } +// Allow next item to be overlapped by subsequent items. +// This works by requiring HoveredId to match for two subsequent frames, +// so if a following items overwrite it our interactions will naturally be disabled. +void ImGui::SetNextItemAllowOverlap() +{ + ImGuiContext& g = *GImGui; + g.NextItemData.ItemFlags |= ImGuiItemFlags_AllowOverlap; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. -// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. +// FIXME-LEGACY: Use SetNextItemAllowOverlap() *before* your item instead. void ImGui::SetItemAllowOverlap() { ImGuiContext& g = *GImGui; ImGuiID id = g.LastItemData.ID; if (g.HoveredId == id) g.HoveredIdAllowOverlap = true; - if (g.ActiveId == id) + if (g.ActiveId == id) // Before we made this obsolete, most calls to SetItemAllowOverlap() used to avoid this path by testing g.ActiveId != id. g.ActiveIdAllowOverlap = true; } +#endif // FIXME: It might be undesirable that this will likely disable KeyOwner-aware shortcuts systems. Consider a more fine-tuned version for the two users of this function. void ImGui::SetActiveIdUsingAllKeyboardKeys() @@ -5280,40 +5489,105 @@ ImVec2 ImGui::GetItemRectSize() return g.LastItemData.Rect.GetSize(); } -bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) +// Prior to v1.90 2023/10/16, the BeginChild() function took a 'bool border = false' parameter instead of 'ImGuiChildFlags child_flags = 0'. +// ImGuiChildFlags_Border is defined as always == 1 in order to allow old code passing 'true'. Read comments in imgui.h for details! +bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) +{ + ImGuiID id = GetCurrentWindow()->GetID(str_id); + return BeginChildEx(str_id, id, size_arg, child_flags, window_flags); +} + +bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) +{ + return BeginChildEx(NULL, id, size_arg, child_flags, window_flags); +} + +bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) { ImGuiContext& g = *GImGui; ImGuiWindow* parent_window = g.CurrentWindow; + IM_ASSERT(id != 0); - flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; - flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag + // Sanity check as it is likely that some user will accidentally pass ImGuiWindowFlags into the ImGuiChildFlags argument. + const ImGuiChildFlags ImGuiChildFlags_SupportedMask_ = ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_FrameStyle; + IM_UNUSED(ImGuiChildFlags_SupportedMask_); + IM_ASSERT((child_flags & ~ImGuiChildFlags_SupportedMask_) == 0 && "Illegal ImGuiChildFlags value. Did you pass ImGuiWindowFlags values instead of ImGuiChildFlags?"); + IM_ASSERT((window_flags & ImGuiWindowFlags_AlwaysAutoResize) == 0 && "Cannot specify ImGuiWindowFlags_AlwaysAutoResize for BeginChild(). Use ImGuiChildFlags_AlwaysAutoResize!"); + if (child_flags & ImGuiChildFlags_AlwaysAutoResize) + { + IM_ASSERT((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0 && "Cannot use ImGuiChildFlags_ResizeX or ImGuiChildFlags_ResizeY with ImGuiChildFlags_AlwaysAutoResize!"); + IM_ASSERT((child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY)) != 0 && "Must use ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY with ImGuiChildFlags_AlwaysAutoResize!"); + } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (window_flags & ImGuiWindowFlags_AlwaysUseWindowPadding) + child_flags |= ImGuiChildFlags_AlwaysUseWindowPadding; +#endif + if (child_flags & ImGuiChildFlags_AutoResizeX) + child_flags &= ~ImGuiChildFlags_ResizeX; + if (child_flags & ImGuiChildFlags_AutoResizeY) + child_flags &= ~ImGuiChildFlags_ResizeY; - // Size - const ImVec2 content_avail = GetContentRegionAvail(); - ImVec2 size = ImFloor(size_arg); - const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); - if (size.x <= 0.0f) - size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too many issues) - if (size.y <= 0.0f) - size.y = ImMax(content_avail.y + size.y, 4.0f); + // Set window flags + window_flags |= ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoTitleBar; + window_flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag + if (child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize)) + window_flags |= ImGuiWindowFlags_AlwaysAutoResize; + if ((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0) + window_flags |= ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; + + // Special framed style + if (child_flags & ImGuiChildFlags_FrameStyle) + { + PushStyleColor(ImGuiCol_ChildBg, g.Style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, g.Style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, g.Style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.FramePadding); + child_flags |= ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding; + window_flags |= ImGuiWindowFlags_NoMove; + } + + // Forward child flags + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasChildFlags; + g.NextWindowData.ChildFlags = child_flags; + + // Forward size + // Important: Begin() has special processing to switch condition to ImGuiCond_FirstUseEver for a given axis when ImGuiChildFlags_ResizeXXX is set. + // (the alternative would to store conditional flags per axis, which is possible but more code) + const ImVec2 size_avail = GetContentRegionAvail(); + const ImVec2 size_default((child_flags & ImGuiChildFlags_AutoResizeX) ? 0.0f : size_avail.x, (child_flags & ImGuiChildFlags_AutoResizeY) ? 0.0f : size_avail.y); + const ImVec2 size = CalcItemSize(size_arg, size_default.x, size_default.y); SetNextWindowSize(size); // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. + // FIXME: 2023/11/14: commented out shorted version. We had an issue with multiple ### in child window path names, which the trailing hash helped workaround. + // e.g. "ParentName###ParentIdentifier/ChildName###ChildIdentifier" would get hashed incorrectly by ImHashStr(), trailing _%08X somehow fixes it. const char* temp_window_name; + /*if (name && parent_window->IDStack.back() == parent_window->ID) + ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s", parent_window->Name, name); // May omit ID if in root of ID stack + else*/ if (name) ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s_%08X", parent_window->Name, name, id); else ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%08X", parent_window->Name, id); + // Set style const float backup_border_size = g.Style.ChildBorderSize; - if (!border) + if ((child_flags & ImGuiChildFlags_Border) == 0) g.Style.ChildBorderSize = 0.0f; - bool ret = Begin(temp_window_name, NULL, flags); + + // Begin into window + const bool ret = Begin(temp_window_name, NULL, window_flags); + + // Restore style g.Style.ChildBorderSize = backup_border_size; + if (child_flags & ImGuiChildFlags_FrameStyle) + { + PopStyleVar(3); + PopStyleColor(); + } ImGuiWindow* child_window = g.CurrentWindow; child_window->ChildId = id; - child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. // While this is not really documented/defined, it seems that the expected thing to do. @@ -5321,11 +5595,11 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b parent_window->DC.CursorPos = child_window->Pos; // Process navigation-in immediately so NavInit can run on first frame - // Can enter a child if (A) it has navigatable items or (B) it can be scrolled. - const ImGuiID temp_id_for_activation = (id + 1); + // Can enter a child if (A) it has navigable items or (B) it can be scrolled. + const ImGuiID temp_id_for_activation = ImHashStr("##Child", 0, id); if (g.ActiveId == temp_id_for_activation) ClearActiveID(); - if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY)) + if (g.NavActivateId == id && !(window_flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY)) { FocusWindow(child_window); NavInitWindow(child_window, false); @@ -5335,88 +5609,49 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b return ret; } -bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); -} - -bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - IM_ASSERT(id != 0); - return BeginChildEx(NULL, id, size_arg, border, extra_flags); -} - void ImGui::EndChild() { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; + ImGuiWindow* child_window = g.CurrentWindow; IM_ASSERT(g.WithinEndChild == false); - IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls + IM_ASSERT(child_window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls g.WithinEndChild = true; - if (window->BeginCount > 1) + ImVec2 child_size = child_window->Size; + End(); + if (child_window->BeginCount == 1) { - End(); - } - else - { - ImVec2 sz = window->Size; - if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f - sz.x = ImMax(4.0f, sz.x); - if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) - sz.y = ImMax(4.0f, sz.y); - End(); - ImGuiWindow* parent_window = g.CurrentWindow; - ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); - ItemSize(sz); - if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavWindowHasScrollY) && !(window->Flags & ImGuiWindowFlags_NavFlattened)) + ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + child_size); + ItemSize(child_size); + if ((child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY) && !(child_window->Flags & ImGuiWindowFlags_NavFlattened)) { - ItemAdd(bb, window->ChildId); - RenderNavHighlight(bb, window->ChildId); + ItemAdd(bb, child_window->ChildId); + RenderNavHighlight(bb, child_window->ChildId); // When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying) - if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow) - RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); + if (child_window->DC.NavLayersActiveMask == 0 && child_window == g.NavWindow) + RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_Compact); } else { // Not navigable into - ItemAdd(bb, 0); + // - This is a bit of a fringe use case, mostly useful for undecorated, non-scrolling contents childs, or empty childs. + // - We could later decide to not apply this path if ImGuiChildFlags_FrameStyle or ImGuiChildFlags_Borders is set. + ItemAdd(bb, child_window->ChildId, NULL, ImGuiItemFlags_NoNav); // But when flattened we directly reach items, adjust active layer mask accordingly - if (window->Flags & ImGuiWindowFlags_NavFlattened) - parent_window->DC.NavLayersActiveMaskNext |= window->DC.NavLayersActiveMaskNext; + if (child_window->Flags & ImGuiWindowFlags_NavFlattened) + parent_window->DC.NavLayersActiveMaskNext |= child_window->DC.NavLayersActiveMaskNext; } - if (g.HoveredWindow == window) + if (g.HoveredWindow == child_window) g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; } g.WithinEndChild = false; g.LogLinePosY = -FLT_MAX; // To enforce a carriage return } -// Helper to create a child window / scrolling region that looks like a normal widget frame. -bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); - PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); - PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); - PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); - bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); - PopStyleVar(3); - PopStyleColor(); - return ret; -} - -void ImGui::EndChildFrame() -{ - EndChild(); -} - static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) { window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); @@ -5438,9 +5673,9 @@ ImGuiWindow* ImGui::FindWindowByName(const char* name) static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) { - window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); + window->Pos = ImTrunc(ImVec2(settings->Pos.x, settings->Pos.y)); if (settings->Size.x > 0 && settings->Size.y > 0) - window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); + window->Size = window->SizeFull = ImTrunc(ImVec2(settings->Size.x, settings->Size.y)); window->Collapsed = settings->Collapsed; } @@ -5473,6 +5708,7 @@ static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* s // Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); window->Pos = main_viewport->Pos + ImVec2(60, 60); + window->Size = window->SizeFull = ImVec2(0, 0); window->SetWindowPosAllowFlags = window->SetWindowSizeAllowFlags = window->SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; if (settings != NULL) @@ -5521,13 +5757,37 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) return window; } +static inline ImVec2 CalcWindowMinSize(ImGuiWindow* window) +{ + // We give windows non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) + // FIXME: Essentially we want to restrict manual resizing to WindowMinSize+Decoration, and allow api resizing to be smaller. + // Perhaps should tend further a neater test for this. + ImGuiContext& g = *GImGui; + ImVec2 size_min; + if ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup)) + { + size_min.x = (window->ChildFlags & ImGuiChildFlags_ResizeX) ? g.Style.WindowMinSize.x : 4.0f; + size_min.y = (window->ChildFlags & ImGuiChildFlags_ResizeY) ? g.Style.WindowMinSize.y : 4.0f; + } + else + { + size_min.x = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.x : 4.0f; + size_min.y = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.y : 4.0f; + } + + // Reduce artifacts with very small windows + ImGuiWindow* window_for_height = window; + size_min.y = ImMax(size_min.y, window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); + return size_min; +} + static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) { ImGuiContext& g = *GImGui; ImVec2 new_size = size_desired; if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) { - // Using -1,-1 on either X/Y axis to preserve the current size. + // See comments in SetNextWindowSizeConstraints() for details about setting size_min an size_max. ImRect cr = g.NextWindowData.SizeConstraintRect; new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; @@ -5541,19 +5801,13 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s g.NextWindowData.SizeCallback(&data); new_size = data.DesiredSize; } - new_size.x = IM_FLOOR(new_size.x); - new_size.y = IM_FLOOR(new_size.y); + new_size.x = IM_TRUNC(new_size.x); + new_size.y = IM_TRUNC(new_size.y); } // Minimum size - if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) - { - ImGuiWindow* window_for_height = window; - new_size = ImMax(new_size, g.Style.WindowMinSize); - const float minimum_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f); - new_size.y = ImMax(new_size.y, minimum_height); // Reduce artifacts with very small windows - } - return new_size; + ImVec2 size_min = CalcWindowMinSize(window); + return ImMax(new_size, size_min); } static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) @@ -5570,10 +5824,10 @@ static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_cur return; } - content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); - content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); - content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); - content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); + content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); + content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); + content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); + content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); } static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) @@ -5592,19 +5846,22 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont else { // Maximum window size is determined by the viewport size or monitor size - const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; - const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; - ImVec2 size_min = style.WindowMinSize; - if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) - size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); + ImVec2 size_min = CalcWindowMinSize(window); + ImVec2 size_max = ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup)) ? ImVec2(FLT_MAX, FLT_MAX) : ImGui::GetMainViewport()->WorkSize - style.DisplaySafeAreaPadding * 2.0f; + ImVec2 size_auto_fit = ImClamp(size_desired, size_min, size_max); - ImVec2 avail_size = ImGui::GetMainViewport()->WorkSize; - ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); + // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one axis may be auto-fit when calculating scrollbars, + // we may need to compute/store three variants of size_auto_fit, for x/y/xy. + // Here we implement a workaround for child windows only, but a full solution would apply to normal windows as well: + if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && !(window->ChildFlags & ImGuiChildFlags_ResizeY)) + size_auto_fit.y = window->SizeFull.y; + else if (!(window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->ChildFlags & ImGuiChildFlags_ResizeY)) + size_auto_fit.x = window->SizeFull.x; // When the window cannot fit all contents (either because of constraints, either because screen is too small), // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); - bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); + bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_h_without_scrollbars < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); if (will_have_scrollbar_x) size_auto_fit.y += style.ScrollbarSize; @@ -5647,7 +5904,7 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co *out_size = size_constrained; } -// Data for resizing from corner +// Data for resizing from resize grip / corner struct ImGuiResizeGripDef { ImVec2 CornerPosN; @@ -5665,9 +5922,9 @@ static const ImGuiResizeGripDef resize_grip_def[4] = // Data for resizing from borders struct ImGuiResizeBorderDef { - ImVec2 InnerDir; - ImVec2 SegmentN1, SegmentN2; - float OuterAngle; + ImVec2 InnerDir; // Normal toward inside + ImVec2 SegmentN1, SegmentN2; // End positions, normalized (0,0: upper left) + float OuterAngle; // Angle toward outside }; static const ImGuiResizeBorderDef resize_border_def[4] = { @@ -5713,7 +5970,7 @@ ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir) // Handle resize for: Resize Grips, Borders, Gamepad // Return true when using auto-fit (double-click on resize grip) -static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) +static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) { ImGuiContext& g = *GImGui; ImGuiWindowFlags flags = window->Flags; @@ -5723,10 +5980,9 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (window->WasActive == false) // Early out to avoid running this code for e.g. a hidden implicit/fallback Debug window. return false; - bool ret_auto_fit = false; - const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; - const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); - const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); + int ret_auto_fit_mask = 0x00; + const float grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const float grip_hover_inner_size = (resize_grip_count > 0) ? IM_TRUNC(grip_draw_size * 0.75f) : 0.0f; const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f; ImRect clamp_rect = visibility_rect; @@ -5759,11 +6015,11 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (hovered || held) g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; - if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0) + if (held && g.IO.MouseDoubleClicked[0]) { - // Manual auto-fit when double-clicking + // Auto-fit when double-clicking size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); - ret_auto_fit = true; + ret_auto_fit_mask = 0x03; // Both axises ClearActiveID(); } else if (held) @@ -5781,8 +6037,16 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (resize_grip_n == 0 || held || hovered) resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); } - for (int border_n = 0; border_n < resize_border_count; border_n++) + + int resize_border_mask = 0x00; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + resize_border_mask |= ((window->ChildFlags & ImGuiChildFlags_ResizeX) ? 0x02 : 0) | ((window->ChildFlags & ImGuiChildFlags_ResizeY) ? 0x08 : 0); + else + resize_border_mask = g.IO.ConfigWindowsResizeFromEdges ? 0x0F : 0x00; + for (int border_n = 0; border_n < 4; border_n++) { + if ((resize_border_mask & (1 << border_n)) == 0) + continue; const ImGuiResizeBorderDef& def = resize_border_def[border_n]; const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y; @@ -5791,22 +6055,77 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID() ItemAdd(border_rect, border_id, NULL, ImGuiItemFlags_NoNav); ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); - //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); - if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) - { + //GetForegroundDrawList(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); + if (hovered && g.HoveredIdTimer <= WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) + hovered = false; + if (hovered || held) g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; - if (held) - *border_held = border_n; - } - if (held) + if (held && g.IO.MouseDoubleClicked[0]) { + // Double-clicking bottom or right border auto-fit on this axis + // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one side may be auto-fit when calculating scrollbars. + // FIXME: Support top and right borders: rework CalcResizePosSizeFromAnyCorner() to be reusable in both cases. + if (border_n == 1 || border_n == 3) // Right and bottom border + { + size_target[axis] = CalcWindowSizeAfterConstraint(window, size_auto_fit)[axis]; + ret_auto_fit_mask |= (1 << axis); + hovered = held = false; // So border doesn't show highlighted at new position + } + ClearActiveID(); + } + else if (held) + { + // Switch to relative resizing mode when border geometry moved (e.g. resizing a child altering parent scroll), in order to avoid resizing feedback loop. + // Currently only using relative mode on resizable child windows, as the problem to solve is more likely noticeable for them, but could apply for all windows eventually. + // FIXME: May want to generalize this idiom at lower-level, so more widgets can use it! + const bool just_scrolled_manually_while_resizing = (g.WheelingWindow != NULL && g.WheelingWindowScrolledFrame == g.FrameCount && IsWindowChildOf(window, g.WheelingWindow, false)); + if (g.ActiveIdIsJustActivated || just_scrolled_manually_while_resizing) + { + g.WindowResizeBorderExpectedRect = border_rect; + g.WindowResizeRelativeMode = false; + } + if ((window->Flags & ImGuiWindowFlags_ChildWindow) && memcmp(&g.WindowResizeBorderExpectedRect, &border_rect, sizeof(ImRect)) != 0) + g.WindowResizeRelativeMode = true; + + const ImVec2 border_curr = (window->Pos + ImMin(def.SegmentN1, def.SegmentN2) * window->Size); + const float border_target_rel_mode_for_axis = border_curr[axis] + g.IO.MouseDelta[axis]; + const float border_target_abs_mode_for_axis = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; // Match ButtonBehavior() padding above. + + // Use absolute mode position + ImVec2 border_target = window->Pos; + border_target[axis] = border_target_abs_mode_for_axis; + + // Use relative mode target for child window, ignore resize when moving back toward the ideal absolute position. + bool ignore_resize = false; + if (g.WindowResizeRelativeMode) + { + //GetForegroundDrawList()->AddText(GetMainViewport()->WorkPos, IM_COL32_WHITE, "Relative Mode"); + border_target[axis] = border_target_rel_mode_for_axis; + if (g.IO.MouseDelta[axis] == 0.0f || (g.IO.MouseDelta[axis] > 0.0f) == (border_target_rel_mode_for_axis > border_target_abs_mode_for_axis)) + ignore_resize = true; + } + + // Clamp, apply ImVec2 clamp_min(border_n == ImGuiDir_Right ? clamp_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down || (border_n == ImGuiDir_Up && window_move_from_title_bar) ? clamp_rect.Min.y : -FLT_MAX); ImVec2 clamp_max(border_n == ImGuiDir_Left ? clamp_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? clamp_rect.Max.y : +FLT_MAX); - ImVec2 border_target = window->Pos; - border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; border_target = ImClamp(border_target, clamp_min, clamp_max); - CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); + if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent + { + ImGuiWindowFlags parent_flags = window->ParentWindow->Flags; + ImRect border_limit_rect = window->ParentWindow->InnerRect; + border_limit_rect.Expand(ImVec2(-ImMax(window->WindowPadding.x, window->WindowBorderSize), -ImMax(window->WindowPadding.y, window->WindowBorderSize))); + if ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar)) + border_target.x = ImClamp(border_target.x, border_limit_rect.Min.x, border_limit_rect.Max.x); + if (parent_flags & ImGuiWindowFlags_NoScrollbar) + border_target.y = ImClamp(border_target.y, border_limit_rect.Min.y, border_limit_rect.Max.y); + } + if (!ignore_resize) + CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); } + if (hovered) + *border_hovered = border_n; + if (held) + *border_held = border_n; } PopID(); @@ -5832,7 +6151,7 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s g.NavWindowingToggleLayer = false; g.NavDisableMouseHover = true; resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaSize); + ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaSize); if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) { // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. @@ -5843,19 +6162,24 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s } // Apply back modified position/size to window - if (size_target.x != FLT_MAX) - { - window->SizeFull = size_target; + const ImVec2 curr_pos = window->Pos; + const ImVec2 curr_size = window->SizeFull; + if (size_target.x != FLT_MAX && (window->Size.x != size_target.x || window->SizeFull.x != size_target.x)) + window->Size.x = window->SizeFull.x = size_target.x; + if (size_target.y != FLT_MAX && (window->Size.y != size_target.y || window->SizeFull.y != size_target.y)) + window->Size.y = window->SizeFull.y = size_target.y; + if (pos_target.x != FLT_MAX && window->Pos.x != ImTrunc(pos_target.x)) + window->Pos.x = ImTrunc(pos_target.x); + if (pos_target.y != FLT_MAX && window->Pos.y != ImTrunc(pos_target.y)) + window->Pos.y = ImTrunc(pos_target.y); + if (curr_pos.x != window->Pos.x || curr_pos.y != window->Pos.y || curr_size.x != window->SizeFull.x || curr_size.y != window->SizeFull.y) MarkIniSettingsDirty(window); - } - if (pos_target.x != FLT_MAX) - { - window->Pos = ImFloor(pos_target); - MarkIniSettingsDirty(window); - } - window->Size = window->SizeFull; - return ret_auto_fit; + // Recalculate next expected border expected coordinates + if (*border_held != -1) + g.WindowResizeBorderExpectedRect = GetResizeBorderRect(window, *border_held, grip_hover_inner_size, WINDOWS_HOVER_PADDING); + + return ret_auto_fit_mask; } static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_rect) @@ -5867,27 +6191,40 @@ static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_ window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); } +static void RenderWindowOuterSingleBorder(ImGuiWindow* window, int border_n, ImU32 border_col, float border_size) +{ + const ImGuiResizeBorderDef& def = resize_border_def[border_n]; + const float rounding = window->WindowRounding; + const ImRect border_r = GetResizeBorderRect(window, border_n, rounding, 0.0f); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); + window->DrawList->PathStroke(border_col, ImDrawFlags_None, border_size); +} + static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) { ImGuiContext& g = *GImGui; - float rounding = window->WindowRounding; - float border_size = window->WindowBorderSize; - if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) - window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); - - int border_held = window->ResizeBorderHeld; - if (border_held != -1) + const float border_size = window->WindowBorderSize; + const ImU32 border_col = GetColorU32(ImGuiCol_Border); + if (border_size > 0.0f && (window->Flags & ImGuiWindowFlags_NoBackground) == 0) + window->DrawList->AddRect(window->Pos, window->Pos + window->Size, border_col, window->WindowRounding, 0, window->WindowBorderSize); + else if (border_size > 0.0f) { - const ImGuiResizeBorderDef& def = resize_border_def[border_held]; - ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); - window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual + if (window->ChildFlags & ImGuiChildFlags_ResizeX) // Similar code as 'resize_border_mask' computation in UpdateWindowManualResize() but we specifically only always draw explicit child resize border. + RenderWindowOuterSingleBorder(window, 1, border_col, border_size); + if (window->ChildFlags & ImGuiChildFlags_ResizeY) + RenderWindowOuterSingleBorder(window, 3, border_col, border_size); + } + if (window->ResizeBorderHovered != -1 || window->ResizeBorderHeld != -1) + { + const int border_n = (window->ResizeBorderHeld != -1) ? window->ResizeBorderHeld : window->ResizeBorderHovered; + const ImU32 border_col_resizing = GetColorU32((window->ResizeBorderHeld != -1) ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered); + RenderWindowOuterSingleBorder(window, border_n, border_col_resizing, ImMax(2.0f, window->WindowBorderSize)); // Thicker than usual } if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) { float y = window->Pos.y + window->TitleBarHeight() - 1; - window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize); + window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), border_col, g.Style.FrameBorderSize); } } @@ -6005,18 +6342,18 @@ void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& titl ImVec2 collapse_button_pos; if (has_close_button) { - pad_r += button_sz; - close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y); + pad_r += button_sz + style.ItemInnerSpacing.x; } if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) { - pad_r += button_sz; - collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y); + pad_r += button_sz + style.ItemInnerSpacing.x; } if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) { - collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); - pad_l += button_sz; + collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y + style.FramePadding.y); + pad_l += button_sz + style.ItemInnerSpacing.x; } // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) @@ -6086,18 +6423,43 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags } } +// [EXPERIMENTAL] Called by Begin(). NextWindowData is valid at this point. +// This is designed as a toy/test-bed for +void ImGui::UpdateWindowSkipRefresh(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + window->SkipRefresh = false; + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasRefreshPolicy) == 0) + return; + if (g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_TryToAvoidRefresh) + { + // FIXME-IDLE: Tests for e.g. mouse clicks or keyboard while focused. + if (window->Appearing) // If currently appearing + return; + if (window->Hidden) // If was hidden (previous frame) + return; + if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnHover) && g.HoveredWindow && window->RootWindow == g.HoveredWindow->RootWindow) + return; + if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnFocus) && g.NavWindow && window->RootWindow == g.NavWindow->RootWindow) + return; + window->DrawList = NULL; + window->SkipRefresh = true; + } +} + // When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing) // should be positioned behind that modal window, unless the window was created inside the modal begin-stack. // In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent. -// - Window // FindBlockingModal() returns Modal1 -// - Window // .. returns Modal1 +// - WindowA // FindBlockingModal() returns Modal1 +// - WindowB // .. returns Modal1 // - Modal1 // .. returns Modal2 -// - Window // .. returns Modal2 -// - Window // .. returns Modal2 +// - WindowC // .. returns Modal2 +// - WindowD // .. returns Modal2 // - Modal2 // .. returns Modal2 +// - WindowE // .. returns NULL // Notes: // - FindBlockingModal(NULL) == NULL is generally equivalent to GetTopMostPopupModal() == NULL. -// Only difference is here we check for ->Active/WasActive but it may be unecessary. +// Only difference is here we check for ->Active/WasActive but it may be unnecessary. ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) { ImGuiContext& g = *GImGui; @@ -6105,20 +6467,18 @@ ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) return NULL; // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal. - for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--) + for (ImGuiPopupData& popup_data : g.OpenPopupStack) { - ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window; + ImGuiWindow* popup_window = popup_data.Window; if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal)) continue; if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows. continue; if (window == NULL) // FindBlockingModal(NULL) test for if FocusWindow(NULL) is naturally possible via a mouse click. return popup_window; - if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed. - break; - for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow) - if (IsWindowWithinBeginStackOf(window, parent)) - return popup_window; // Place window above its begin stack parent. + if (IsWindowWithinBeginStackOf(window, popup_window)) // Window may be over modal + continue; + return popup_window; // Place window right below first block modal } return NULL; } @@ -6144,6 +6504,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (window_just_created) window = CreateNewWindow(name, flags); + // [DEBUG] Debug break requested by user + if (g.DebugBreakInWindow == window->ID) + IM_DEBUG_BREAK(); + // Automatically disable manual moving/resizing when NoInputs is set if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; @@ -6172,6 +6536,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { UpdateWindowInFocusOrderList(window, window_just_created, flags); window->Flags = (ImGuiWindowFlags)flags; + window->ChildFlags = (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasChildFlags) ? g.NextWindowData.ChildFlags : 0; window->LastFrameActive = current_frame; window->LastTimeActive = (float)g.Time; window->BeginOrderWithinParent = 0; @@ -6192,7 +6557,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->IDStack.push_back(window->ID); // Add to stack - // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() g.CurrentWindow = window; ImGuiWindowStackData window_stack_data; window_stack_data.Window = window; @@ -6200,21 +6564,24 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window_stack_data.StackSizesOnBegin.SetToContextState(&g); g.CurrentWindowStack.push_back(window_stack_data); if (flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount++; + g.BeginMenuDepth++; // Update ->RootWindow and others pointers (before any possible call to FocusWindow) if (first_begin_of_the_frame) { UpdateWindowParentAndRootLinks(window, flags, parent_window); window->ParentWindowInBeginStack = parent_window_in_stack; + + // There's little point to expose a flag to set this: because the interesting cases won't be using parent_window_in_stack, + // e.g. linking a tool window in a standalone viewport to a document window, regardless of their Begin() stack parenting. (#6798) + window->ParentWindowForFocusRoute = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window_in_stack : NULL; } // Add to focus scope stack - PushFocusScope(window->ID); + PushFocusScope((flags & ImGuiWindowFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID); window->NavRootFocusScopeId = g.CurrentFocusScopeId; - g.CurrentWindow = NULL; - // Add to popup stack + // Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[] if (flags & ImGuiWindowFlags_Popup) { ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; @@ -6248,6 +6615,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); + if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0) // Axis-specific conditions for BeginChild() + g.NextWindowData.SizeVal.x = window->SizeFull.x; + if ((window->ChildFlags & ImGuiChildFlags_ResizeY) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0) + g.NextWindowData.SizeVal.y = window->SizeFull.y; SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); } if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) @@ -6274,8 +6645,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (window->Appearing) SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); + // [EXPERIMENTAL] Skip Refresh mode + UpdateWindowSkipRefresh(window); + + // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() + g.CurrentWindow = NULL; + // When reusing window again multiple times a frame, just append content (don't need to setup again) - if (first_begin_of_the_frame) + if (first_begin_of_the_frame && !window->SkipRefresh) { // Initialize const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) @@ -6347,15 +6724,21 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) else window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; window->WindowPadding = style.WindowPadding; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !(window->ChildFlags & ImGuiChildFlags_AlwaysUseWindowPadding) && window->WindowBorderSize == 0.0f) window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; + // Depending on condition we use previous or current window size to compare against contents size to decide if a scrollbar should be visible. + // Those flags will be altered further down in the function depending on more conditions. bool use_current_size_for_scrollbar_x = window_just_created; bool use_current_size_for_scrollbar_y = window_just_created; + if (window_size_x_set_by_api && window->ContentSizeExplicit.x != 0.0f) + use_current_size_for_scrollbar_x = true; + if (window_size_y_set_by_api && window->ContentSizeExplicit.y != 0.0f) // #7252 + use_current_size_for_scrollbar_y = true; // Collapse window by double-clicking on title bar // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing @@ -6363,8 +6746,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar. ImRect title_bar_rect = window->TitleBarRect(); - if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2) - window->WantCollapseToggle = true; + if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max)) + if (g.IO.MouseClickedCount[0] == 2 && GetKeyOwner(ImGuiKey_MouseLeft) == ImGuiKeyOwner_NoOwner) + window->WantCollapseToggle = true; if (window->WantCollapseToggle) { window->Collapsed = !window->Collapsed; @@ -6382,7 +6766,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // SIZE // Outer Decoration Sizes - // (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations). + // (we need to clear ScrollbarSize immediately as CalcWindowAutoFitSize() needs it and can be called from other locations). const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes; window->DecoOuterSizeX1 = 0.0f; window->DecoOuterSizeX2 = 0.0f; @@ -6470,7 +6854,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow)) if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) ClampWindowPos(window, visibility_rect); - window->Pos = ImFloor(window->Pos); + window->Pos = ImTrunc(window->Pos); // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) // Large values tend to lead to variety of artifacts and are not recommended. @@ -6503,13 +6887,19 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) #endif // Handle manual resize: Resize Grips, Borders, Gamepad - int border_held = -1; + int border_hovered = -1, border_held = -1; ImU32 resize_grip_col[4] = {}; - const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. - const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const int resize_grip_count = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) ? 0 : g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. + const float resize_grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); if (!window->Collapsed) - if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) - use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; + if (int auto_fit_mask = UpdateWindowManualResize(window, size_auto_fit, &border_hovered, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) + { + if (auto_fit_mask & (1 << ImGuiAxis_X)) + use_current_size_for_scrollbar_x = true; + if (auto_fit_mask & (1 << ImGuiAxis_Y)) + use_current_size_for_scrollbar_y = true; + } + window->ResizeBorderHovered = (signed char)border_hovered; window->ResizeBorderHeld = (signed char)border_held; // SCROLLBAR VISIBILITY @@ -6564,24 +6954,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->DecoOuterSizeY2; // Inner clipping rectangle. - // Will extend a little bit outside the normal work region. - // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. - // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. + // - Extend a outside of normal work region up to borders. + // - This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. + // - It also makes clipped items be more noticeable. + // - And is consistent on both axis (prior to 2024/05/03 ClipRect used WindowPadding.x * 0.5f on left and right edge), see #3312 + // - Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. // Affected by window/frame border size. Used by: // - Begin() initial clip rect float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); - window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + window->WindowBorderSize); window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); - window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - window->WindowBorderSize); window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); window->InnerClipRect.ClipWithFull(host_rect); // Default item width. Make it proportional to window size if window manually resizes if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) - window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); + window->ItemWidthDefault = ImTrunc(window->Size.x * 0.65f); else - window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); + window->ItemWidthDefault = ImTrunc(g.FontSize * 16.0f); // SCROLLING @@ -6642,14 +7034,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2))); const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2))); - window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); - window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); + window->WorkRect.Min.x = ImTrunc(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); + window->WorkRect.Min.y = ImTrunc(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; window->ParentWorkRect = window->WorkRect; // [LEGACY] Content Region // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. + // Unless explicit content size is specified by user, this currently represent the region leading to no scrolling. // Used by: // - Mouse wheel scrolling + many other things window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x + window->DecoOuterSizeX1; @@ -6698,6 +7091,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->DC.TextWrapPos = -1.0f; // disabled window->DC.ItemWidthStack.resize(0); window->DC.TextWrapPosStack.resize(0); + if (flags & ImGuiWindowFlags_Modal) + window->DC.ModalDimBgColor = ColorConvertFloat4ToU32(GetStyleColorVec4(ImGuiCol_ModalWindowDimBg)); if (window->AutoFitFramesX > 0) window->AutoFitFramesX--; @@ -6732,7 +7127,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). // This is useful to allow creating context menus on title bar only, etc. - SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + SetLastItemDataForWindow(window, title_bar_rect); // [DEBUG] #ifndef IMGUI_DISABLE_DEBUG_TOOLS @@ -6748,11 +7143,17 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) } else { + // Skip refresh always mark active + if (window->SkipRefresh) + window->Active = true; + // Append SetCurrentWindow(window); + SetLastItemDataForWindow(window, window->TitleBarRect()); } - PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); + if (!window->SkipRefresh) + PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) window->WriteAccessed = false; @@ -6760,20 +7161,22 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) g.NextWindowData.ClearFlags(); // Update visibility - if (first_begin_of_the_frame) + if (first_begin_of_the_frame && !window->SkipRefresh) { - if (flags & ImGuiWindowFlags_ChildWindow) + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ChildMenu)) { // Child window can be out of sight and have "negative" clip windows. // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? - { - const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (!g.LogEnabled && !nav_request) - if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (!g.LogEnabled && !nav_request) + if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + { + if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + window->HiddenFramesCannotSkipItems = 1; + else window->HiddenFramesCanSkipItems = 1; - } + } // Hide along with parent or if parent is collapsed if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) @@ -6804,19 +7207,33 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) skip_items = true; window->SkipItems = skip_items; } + else if (first_begin_of_the_frame) + { + // Skip refresh mode + window->SkipItems = true; + } // [DEBUG] io.ConfigDebugBeginReturnValue override return value to test Begin/End and BeginChild/EndChild behaviors. // (The implicit fallback window is NOT automatically ended allowing it to always be able to receive commands without crashing) - if (!window->IsFallbackWindow && ((g.IO.ConfigDebugBeginReturnValueOnce && window_just_created) || (g.IO.ConfigDebugBeginReturnValueLoop && g.DebugBeginReturnValueCullDepth == g.CurrentWindowStack.Size))) - { - if (window->AutoFitFramesX > 0) { window->AutoFitFramesX++; } - if (window->AutoFitFramesY > 0) { window->AutoFitFramesY++; } - return false; - } +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (!window->IsFallbackWindow) + if ((g.IO.ConfigDebugBeginReturnValueOnce && window_just_created) || (g.IO.ConfigDebugBeginReturnValueLoop && g.DebugBeginReturnValueCullDepth == g.CurrentWindowStack.Size)) + { + if (window->AutoFitFramesX > 0) { window->AutoFitFramesX++; } + if (window->AutoFitFramesY > 0) { window->AutoFitFramesY++; } + return false; + } +#endif return !window->SkipItems; } +static void ImGui::SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect) +{ + ImGuiContext& g = *GImGui; + SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(rect.Min, rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, rect); +} + void ImGui::End() { ImGuiContext& g = *GImGui; @@ -6837,9 +7254,16 @@ void ImGui::End() // Close anything that is open if (window->DC.CurrentColumns) EndColumns(); - PopClipRect(); // Inner window clip rectangle + if (!window->SkipRefresh) + PopClipRect(); // Inner window clip rectangle PopFocusScope(); + if (window->SkipRefresh) + { + IM_ASSERT(window->DrawList == NULL); + window->DrawList = &window->DrawListInst; + } + // Stop logging if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging LogFinish(); @@ -6850,7 +7274,7 @@ void ImGui::End() // Pop from window stack g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup; if (window->Flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount--; + g.BeginMenuDepth--; if (window->Flags & ImGuiWindowFlags_Popup) g.BeginPopupStack.pop_back(); g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithContextState(&g); @@ -6963,8 +7387,9 @@ void ImGui::FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags) g.NavMousePosDirty = true; g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId g.NavLayer = ImGuiNavLayer_Main; - g.NavFocusScopeId = window ? window->NavRootFocusScopeId : 0; + SetNavFocusScope(window ? window->NavRootFocusScopeId : 0); g.NavIdIsAlive = false; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; // Close popups if any ClosePopupsOverWindow(window, false); @@ -7012,7 +7437,6 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind { // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user. ImGuiWindow* window = g.WindowsFocusOrder[i]; - IM_ASSERT(window == window->RootWindow); if (window == ignore_window || !window->WasActive) continue; if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) @@ -7210,9 +7634,14 @@ bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_b return false; } +// Is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options. +// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, +// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! +// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) { - IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function + IM_ASSERT((flags & ~ImGuiHoveredFlags_AllowedMaskForIsWindowHovered) == 0 && "Invalid flags for IsWindowHovered()!"); + ImGuiContext& g = *GImGui; ImGuiWindow* ref_window = g.HoveredWindow; ImGuiWindow* cur_window = g.CurrentWindow; @@ -7240,6 +7669,17 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId) return false; + + // When changing hovered window we requires a bit of stationary delay before activating hover timer. + // FIXME: We don't support delay other than stationary one for now, other delay would need a way + // to fulfill the possibility that multiple IsWindowHovered() with varying flag could return true + // for different windows of the hierarchy. Possibly need a Hash(Current+Flags) ==> (Timer) cache. + // We can implement this for _Stationary because the data is linked to HoveredWindow rather than CurrentWindow. + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse); + if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverWindowUnlockedStationaryId != ref_window->ID) + return false; + return true; } @@ -7304,7 +7744,7 @@ void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) // Set const ImVec2 old_pos = window->Pos; - window->Pos = ImFloor(pos); + window->Pos = ImTrunc(pos); ImVec2 offset = window->Pos - old_pos; if (offset.x == 0.0f && offset.y == 0.0f) return; @@ -7342,18 +7782,22 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + // Enable auto-fit (not done in BeginChild() path unless appearing or combined with ImGuiChildFlags_AlwaysAutoResize) + if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0) + window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; + if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0) + window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; + // Set ImVec2 old_size = window->SizeFull; - window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; - window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; if (size.x <= 0.0f) window->AutoFitOnlyGrows = false; else - window->SizeFull.x = IM_FLOOR(size.x); + window->SizeFull.x = IM_TRUNC(size.x); if (size.y <= 0.0f) window->AutoFitOnlyGrows = false; else - window->SizeFull.y = IM_FLOOR(size.y); + window->SizeFull.y = IM_TRUNC(size.y); if (old_size.x != window->SizeFull.x || old_size.y != window->SizeFull.y) MarkIniSettingsDirty(window); } @@ -7387,7 +7831,7 @@ void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const I window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); } -void ImGui::SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window) +void ImGui::SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window) { window->Hidden = window->SkipItems = true; window->HiddenFramesCanSkipItems = 1; @@ -7453,6 +7897,10 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; } +// For each axis: +// - Use 0.0f as min or FLT_MAX as max if you don't want limits, e.g. size_min = (500.0f, 0.0f), size_max = (FLT_MAX, FLT_MAX) sets a minimum width. +// - Use -1 for both min and max of same axis to preserve current size which itself is a constraint. +// - See "Demo->Examples->Constrained-resizing window" for examples. void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) { ImGuiContext& g = *GImGui; @@ -7468,7 +7916,7 @@ void ImGui::SetNextWindowContentSize(const ImVec2& size) { ImGuiContext& g = *GImGui; g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; - g.NextWindowData.ContentSizeVal = ImFloor(size); + g.NextWindowData.ContentSizeVal = ImTrunc(size); } void ImGui::SetNextWindowScroll(const ImVec2& scroll) @@ -7500,6 +7948,14 @@ void ImGui::SetNextWindowBgAlpha(float alpha) g.NextWindowData.BgAlphaVal = alpha; } +// This is experimental and meant to be a toy for exploring a future/wider range of features. +void ImGui::SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasRefreshPolicy; + g.NextWindowData.RefreshFlagsVal = flags; +} + ImDrawList* ImGui::GetWindowDrawList() { ImGuiWindow* window = GetCurrentWindow(); @@ -7530,35 +7986,89 @@ void ImGui::SetWindowFontScale(float scale) g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); } -void ImGui::ActivateItem(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.NavNextActivateId = id; - g.NavNextActivateFlags = ImGuiActivateFlags_None; -} - void ImGui::PushFocusScope(ImGuiID id) { ImGuiContext& g = *GImGui; - g.FocusScopeStack.push_back(id); + ImGuiFocusScopeData data; + data.ID = id; + data.WindowID = g.CurrentWindow->ID; + g.FocusScopeStack.push_back(data); g.CurrentFocusScopeId = id; } void ImGui::PopFocusScope() { ImGuiContext& g = *GImGui; - IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? + if (g.FocusScopeStack.Size == 0) + { + IM_ASSERT_USER_ERROR(g.FocusScopeStack.Size > 0, "Calling PopFocusScope() too many times!"); + return; + } g.FocusScopeStack.pop_back(); - g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back() : 0; + g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back().ID : 0; +} + +void ImGui::SetNavFocusScope(ImGuiID focus_scope_id) +{ + ImGuiContext& g = *GImGui; + g.NavFocusScopeId = focus_scope_id; + g.NavFocusRoute.resize(0); // Invalidate + if (focus_scope_id == 0) + return; + IM_ASSERT(g.NavWindow != NULL); + + // Store current path (in reverse order) + if (focus_scope_id == g.CurrentFocusScopeId) + { + // Top of focus stack contains local focus scopes inside current window + for (int n = g.FocusScopeStack.Size - 1; n >= 0 && g.FocusScopeStack.Data[n].WindowID == g.CurrentWindow->ID; n--) + g.NavFocusRoute.push_back(g.FocusScopeStack.Data[n]); + } + else if (focus_scope_id == g.NavWindow->NavRootFocusScopeId) + g.NavFocusRoute.push_back({ focus_scope_id, g.NavWindow->ID }); + else + return; + + // Then follow on manually set ParentWindowForFocusRoute field (#6798) + for (ImGuiWindow* window = g.NavWindow->ParentWindowForFocusRoute; window != NULL; window = window->ParentWindowForFocusRoute) + g.NavFocusRoute.push_back({ window->NavRootFocusScopeId, window->ID }); + IM_ASSERT(g.NavFocusRoute.Size < 100); // Maximum depth is technically 251 as per CalcRoutingScore(): 254 - 3 +} + +// Focus = move navigation cursor, set scrolling, set focus window. +void ImGui::FocusItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IMGUI_DEBUG_LOG_FOCUS("FocusItem(0x%08x) in window \"%s\"\n", g.LastItemData.ID, window->Name); + if (g.DragDropActive || g.MovingWindow != NULL) // FIXME: Opt-in flags for this? + { + IMGUI_DEBUG_LOG_FOCUS("FocusItem() ignored while DragDropActive!\n"); + return; + } + + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavHighlight | ImGuiNavMoveFlags_NoSelect; + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + SetNavWindow(window); + NavMoveRequestSubmit(ImGuiDir_None, ImGuiDir_Up, move_flags, scroll_flags); + NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); +} + +void ImGui::ActivateItemByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavNextActivateId = id; + g.NavNextActivateFlags = ImGuiActivateFlags_None; } // Note: this will likely be called ActivateItem() once we rework our Focus/Activation system! +// But ActivateItem() should function without altering scroll/focus? void ImGui::SetKeyboardFocusHere(int offset) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; IM_ASSERT(offset >= -1); // -1 is allowed but not below - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); + IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); // It makes sense in the vast majority of cases to never interrupt a drag and drop. // When we refactor this function into ActivateItem() we may want to make this an option. @@ -7566,14 +8076,15 @@ void ImGui::SetKeyboardFocusHere(int offset) // is also automatically dropped in the event g.ActiveId is stolen. if (g.DragDropActive || g.MovingWindow != NULL) { - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere() ignored while DragDropActive!\n"); + IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere() ignored while DragDropActive!\n"); return; } SetNavWindow(window); + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavHighlight; ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; - NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. if (offset == -1) { NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); @@ -7615,6 +8126,69 @@ ImGuiStorage* ImGui::GetStateStorage() return window->DC.StateStorage; } +bool ImGui::IsRectVisible(const ImVec2& size) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); +} + +bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); +} + +//----------------------------------------------------------------------------- +// [SECTION] ID STACK +//----------------------------------------------------------------------------- + +// This is one of the very rare legacy case where we use ImGuiWindow methods, +// it should ideally be flattened at some point but it's been used a lots by widgets. +ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetID(const void* ptr) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetID(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); +#endif + return id; +} + +// This is only used in rare/specific situations to manufacture an ID out of nowhere. +ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) +{ + ImGuiID seed = IDStack.back(); + ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); + ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); + return id; +} + void ImGui::PushID(const char* str_id) { ImGuiContext& g = *GImGui; @@ -7652,29 +8226,35 @@ void ImGui::PushOverrideID(ImGuiID id) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL); +#endif window->IDStack.push_back(id); } // Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call -// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. +// (note that when using this pattern, ID Stack Tool will tend to not display the intermediate stack level. // for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) { ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS ImGuiContext& g = *GImGui; if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); +#endif return id; } ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed) { ImGuiID id = ImHashData(&n, sizeof(n), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS ImGuiContext& g = *GImGui; if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); +#endif return id; } @@ -7703,22 +8283,11 @@ ImGuiID ImGui::GetID(const void* ptr_id) return window->GetID(ptr_id); } -bool ImGui::IsRectVisible(const ImVec2& size) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); -} - -bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); -} - - //----------------------------------------------------------------------------- // [SECTION] INPUTS //----------------------------------------------------------------------------- +// - GetModForModKey() [Internal] +// - FixupKeyChord() [Internal] // - GetKeyData() [Internal] // - GetKeyIndex() [Internal] // - GetKeyName() @@ -7748,6 +8317,7 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) // - IsMouseDragPastThreshold() [Internal] // - IsMouseDragging() // - GetMousePos() +// - SetMousePos() [Internal] // - GetMousePosOnOpeningCurrentPopup() // - IsMousePosValid() // - IsAnyMouseDown() @@ -7779,13 +8349,35 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) // - Shortcut() [Internal] //----------------------------------------------------------------------------- +static ImGuiKeyChord GetModForModKey(ImGuiKey key) +{ + if (key == ImGuiKey_LeftCtrl || key == ImGuiKey_RightCtrl) + return ImGuiMod_Ctrl; + if (key == ImGuiKey_LeftShift || key == ImGuiKey_RightShift) + return ImGuiMod_Shift; + if (key == ImGuiKey_LeftAlt || key == ImGuiKey_RightAlt) + return ImGuiMod_Alt; + if (key == ImGuiKey_LeftSuper || key == ImGuiKey_RightSuper) + return ImGuiMod_Super; + return ImGuiMod_None; +} + +ImGuiKeyChord ImGui::FixupKeyChord(ImGuiKeyChord key_chord) +{ + // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified. + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (IsModKey(key)) + key_chord |= GetModForModKey(key); + return key_chord; +} + ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key) { ImGuiContext& g = *ctx; // Special storage location for mods if (key & ImGuiMod_Mask_) - key = ConvertSingleModFlagToKey(ctx, key); + key = ConvertSingleModFlagToKey(key); #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END); @@ -7798,6 +8390,7 @@ ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key) } #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO +// Formally moved to obsolete section in 1.90.5 in spite of documented as obsolete since 1.87 ImGuiKey ImGui::GetKeyIndex(ImGuiKey key) { ImGuiContext& g = *GImGui; @@ -7816,11 +8409,13 @@ static const char* const GKeyNames[] = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket", "Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen", "Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6", "Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply", "KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual", + "AppBack", "AppForward", "GamepadStart", "GamepadBack", "GamepadFaceLeft", "GamepadFaceRight", "GamepadFaceUp", "GamepadFaceDown", "GamepadDpadLeft", "GamepadDpadRight", "GamepadDpadUp", "GamepadDpadDown", @@ -7834,10 +8429,12 @@ IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames)); const char* ImGui::GetKeyName(ImGuiKey key) { - ImGuiContext& g = *GImGui; + if (key == ImGuiKey_None) + return "None"; #ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); + IM_ASSERT(IsNamedKeyOrMod(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); #else + ImGuiContext& g = *GImGui; if (IsLegacyKey(key)) { if (g.IO.KeyMap[key] == -1) @@ -7846,28 +8443,34 @@ const char* ImGui::GetKeyName(ImGuiKey key) key = (ImGuiKey)g.IO.KeyMap[key]; } #endif - if (key == ImGuiKey_None) - return "None"; if (key & ImGuiMod_Mask_) - key = ConvertSingleModFlagToKey(&g, key); + key = ConvertSingleModFlagToKey(key); if (!IsNamedKey(key)) return "Unknown"; return GKeyNames[key - ImGuiKey_NamedKey_BEGIN]; } -// ImGuiMod_Shortcut is translated to either Ctrl or Super. -void ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size) +// Return untranslated names: on macOS, Cmd key will show as Ctrl, Ctrl key will show as super. +// Lifetime of return value: valid until next call to same function. +const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); - ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s", + + const ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (IsModKey(key)) + key_chord &= ~GetModForModKey(key); // Return "Ctrl+LeftShift" instead of "Ctrl+Shift+LeftShift" + ImFormatString(g.TempKeychordName, IM_ARRAYSIZE(g.TempKeychordName), "%s%s%s%s%s", (key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "", (key_chord & ImGuiMod_Shift) ? "Shift+" : "", (key_chord & ImGuiMod_Alt) ? "Alt+" : "", - (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "", - GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_))); + (key_chord & ImGuiMod_Super) ? "Super+" : "", + (key != ImGuiKey_None || key_chord == ImGuiKey_None) ? GetKeyName(key) : ""); + size_t len; + if (key == ImGuiKey_None && key_chord != 0) + if ((len = strlen(g.TempKeychordName)) != 0) // Remove trailing '+' + g.TempKeychordName[len - 1] = 0; + return g.TempKeychordName; } // t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) @@ -7934,19 +8537,24 @@ static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt) for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex) { routing_entry = &rt->Entries[old_routing_idx]; + routing_entry->RoutingCurrScore = routing_entry->RoutingNextScore; routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry - routing_entry->RoutingNext = ImGuiKeyOwner_None; + routing_entry->RoutingNext = ImGuiKeyOwner_NoOwner; routing_entry->RoutingNextScore = 255; - if (routing_entry->RoutingCurr == ImGuiKeyOwner_None) + if (routing_entry->RoutingCurr == ImGuiKeyOwner_NoOwner) continue; rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer // Apply routing to owner if there's no owner already (RoutingCurr == None at this point) + // This is the result of previous frame's SetShortcutRouting() call. if (routing_entry->Mods == g.IO.KeyMods) { ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); - if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner) + { owner_data->OwnerCurr = routing_entry->RoutingCurr; + //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X) via Routing\n", GetKeyName(key), routing_entry->RoutingCurr); + } } } @@ -7962,7 +8570,7 @@ static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt) static inline ImGuiID GetRoutingIdFromOwnerId(ImGuiID owner_id) { ImGuiContext& g = *GImGui; - return (owner_id != ImGuiKeyOwner_None && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId; + return (owner_id != ImGuiKeyOwner_NoOwner && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId; } ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) @@ -7976,12 +8584,10 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) ImGuiContext& g = *GImGui; ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; ImGuiKeyRoutingData* routing_data; - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); if (key == ImGuiKey_None) - key = ConvertSingleModFlagToKey(&g, mods); + key = ConvertSingleModFlagToKey(mods); IM_ASSERT(IsNamedKey(key)); // Get (in the majority of case, the linked list will have one element so this should be 2 reads. @@ -8004,20 +8610,18 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) } // Current score encoding (lower is highest priority): -// - 0: ImGuiInputFlags_RouteGlobalHigh -// - 1: ImGuiInputFlags_RouteFocused (if item active) -// - 2: ImGuiInputFlags_RouteGlobal +// - 0: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverActive +// - 1: ImGuiInputFlags_ActiveItem or ImGuiInputFlags_RouteFocused (if item active) +// - 2: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused // - 3+: ImGuiInputFlags_RouteFocused (if window in focus-stack) -// - 254: ImGuiInputFlags_RouteGlobalLow +// - 254: ImGuiInputFlags_RouteGlobal // - 255: never route // 'flags' should include an explicit routing policy -static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputFlags flags) +static int CalcRoutingScore(ImGuiID focus_scope_id, ImGuiID owner_id, ImGuiInputFlags flags) { + ImGuiContext& g = *GImGui; if (flags & ImGuiInputFlags_RouteFocused) { - ImGuiContext& g = *GImGui; - ImGuiWindow* focused = g.NavWindow; - // ActiveID gets top priority // (we don't check g.ActiveIdUsingAllKeys here. Routing is applied but if input ownership is tested later it may discard it) if (owner_id != 0 && g.ActiveId == owner_id) @@ -8029,65 +8633,136 @@ static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputF // - When Window/ChildB is focused -> Window scores 4, Window/ChildB scores 3 (best) // Assuming only WindowA is submitting a routing request, // - When Window/ChildB is focused -> Window scores 4 (best), Window/ChildB doesn't have a score. - if (focused != NULL && focused->RootWindow == location->RootWindow) - for (int next_score = 3; focused != NULL; next_score++) - { - if (focused == location) - { - IM_ASSERT(next_score < 255); - return next_score; - } - focused = (focused->RootWindow != focused) ? focused->ParentWindow : NULL; // FIXME: This could be later abstracted as a focus path - } + // This essentially follow the window->ParentWindowForFocusRoute chain. + if (focus_scope_id == 0) + return 255; + for (int index_in_focus_path = 0; index_in_focus_path < g.NavFocusRoute.Size; index_in_focus_path++) + if (g.NavFocusRoute.Data[index_in_focus_path].ID == focus_scope_id) + return 3 + index_in_focus_path; return 255; } - - // ImGuiInputFlags_RouteGlobalHigh is default, so calls without flags are not conditional - if (flags & ImGuiInputFlags_RouteGlobal) - return 2; - if (flags & ImGuiInputFlags_RouteGlobalLow) + else if (flags & ImGuiInputFlags_RouteActive) + { + if (owner_id != 0 && g.ActiveId == owner_id) + return 1; + return 255; + } + else if (flags & ImGuiInputFlags_RouteGlobal) + { + if (flags & ImGuiInputFlags_RouteOverActive) + return 0; + if (flags & ImGuiInputFlags_RouteOverFocused) + return 2; return 254; + } + IM_ASSERT(0); return 0; } +// We need this to filter some Shortcut() routes when an item e.g. an InputText() is active +// e.g. ImGuiKey_G won't be considered a shortcut when item is active, but ImGuiMod|ImGuiKey_G can be. +static bool IsKeyChordPotentiallyCharInput(ImGuiKeyChord key_chord) +{ + // Mimic 'ignore_char_inputs' logic in InputText() + ImGuiContext& g = *GImGui; + + // When the right mods are pressed it cannot be a char input so we won't filter the shortcut out. + ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); + const bool ignore_char_inputs = ((mods & ImGuiMod_Ctrl) && !(mods & ImGuiMod_Alt)) || (g.IO.ConfigMacOSXBehaviors && (mods & ImGuiMod_Ctrl)); + if (ignore_char_inputs) + return false; + + // Return true for A-Z, 0-9 and other keys associated to char inputs. Other keys such as F1-F12 won't be filtered. + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + return g.KeysMayBeCharInput.TestBit(key); +} + // Request a desired route for an input chord (key + mods). // Return true if the route is available this frame. // - Routes and key ownership are attributed at the beginning of next frame based on best score and mod state. // (Conceptually this does a "Submit for next frame" + "Test for current frame". // As such, it could be called TrySetXXX or SubmitXXX, or the Submit and Test operations should be separate.) -// - Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default) -// - Using 'owner_id == ImGuiKeyOwner_None': allows disabling/locking a shortcut. -bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) { ImGuiContext& g = *GImGui; - if ((flags & ImGuiInputFlags_RouteMask_) == 0) - flags |= ImGuiInputFlags_RouteGlobalHigh; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut() + if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0) + flags |= ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut() else - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteTypeMask_)); // Check that only 1 routing flag is used + IM_ASSERT(owner_id != ImGuiKeyOwner_Any && owner_id != ImGuiKeyOwner_NoOwner); + if (flags & (ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused)) + IM_ASSERT(flags & ImGuiInputFlags_RouteGlobal); + + // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified. + key_chord = FixupKeyChord(key_chord); + + // [DEBUG] Debug break requested by user + if (g.DebugBreakInShortcutRouting == key_chord) + IM_DEBUG_BREAK(); if (flags & ImGuiInputFlags_RouteUnlessBgFocused) if (g.NavWindow == NULL) return false; - if (flags & ImGuiInputFlags_RouteAlways) - return true; - const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags); + // Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this? + if (flags & ImGuiInputFlags_RouteAlways) + { + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> always, no register\n", GetKeyChordName(key_chord), flags, owner_id); + return true; + } + + // Specific culling when there's an active item. + if (g.ActiveId != 0 && g.ActiveId != owner_id) + { + if (flags & ImGuiInputFlags_RouteActive) + return false; + + // Cull shortcuts with no modifiers when it could generate a character. + // e.g. Shortcut(ImGuiKey_G) also generates 'g' character, should not trigger when InputText() is active. + // but Shortcut(Ctrl+G) should generally trigger when InputText() is active. + // TL;DR: lettered shortcut with no mods or with only Alt mod will not trigger while an item reading text input is active. + // (We cannot filter based on io.InputQueueCharacters[] contents because of trickling and key<>chars submission order are undefined) + if (g.IO.WantTextInput && IsKeyChordPotentiallyCharInput(key_chord)) + { + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> filtered as potential char input\n", GetKeyChordName(key_chord), flags, owner_id); + return false; + } + + // ActiveIdUsingAllKeyboardKeys trumps all for ActiveId + if ((flags & ImGuiInputFlags_RouteOverActive) == 0 && g.ActiveIdUsingAllKeyboardKeys) + { + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (key == ImGuiKey_None) + key = ConvertSingleModFlagToKey((ImGuiKey)(key_chord & ImGuiMod_Mask_)); + if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) + return false; + } + } + + // Where do we evaluate route for? + ImGuiID focus_scope_id = g.CurrentFocusScopeId; + if (flags & ImGuiInputFlags_RouteFromRootWindow) + focus_scope_id = g.CurrentWindow->RootWindow->ID; // See PushFocusScope() call in Begin() + + const int score = CalcRoutingScore(focus_scope_id, owner_id, flags); + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> score %d\n", GetKeyChordName(key_chord), flags, owner_id, score); if (score == 255) return false; // Submit routing for NEXT frame (assuming score is sufficient) // FIXME: Could expose a way to use a "serve last" policy for same score resolution (using <= instead of <). ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); - const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); //const bool set_route = (flags & ImGuiInputFlags_ServeLast) ? (score <= routing_data->RoutingNextScore) : (score < routing_data->RoutingNextScore); if (score < routing_data->RoutingNextScore) { - routing_data->RoutingNext = routing_id; + routing_data->RoutingNext = owner_id; routing_data->RoutingNextScore = (ImU8)score; } // Return routing state for CURRENT frame - return routing_data->RoutingCurr == routing_id; + if (routing_data->RoutingCurr == owner_id) + IMGUI_DEBUG_LOG_INPUTROUTING("--> granting current route\n"); + return routing_data->RoutingCurr == owner_id; } // Currently unused by core (but used by tests) @@ -8095,6 +8770,7 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI bool ImGui::TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id) { const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); + key_chord = FixupKeyChord(key_chord); ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); // FIXME: Could avoid creating entry. return routing_data->RoutingCurr == routing_id; } @@ -8118,11 +8794,11 @@ bool ImGui::IsKeyDown(ImGuiKey key, ImGuiID owner_id) bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) { - return IsKeyPressed(key, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); + return IsKeyPressed(key, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any); } // Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. -bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id) { const ImGuiKeyData* key_data = GetKeyData(key); if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) @@ -8131,13 +8807,28 @@ bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) if (t < 0.0f) return false; IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + if (flags & (ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_)) // Setting any _RepeatXXX option enables _Repeat + flags |= ImGuiInputFlags_Repeat; bool pressed = (t == 0.0f); - if (!pressed && ((flags & ImGuiInputFlags_Repeat) != 0)) + if (!pressed && (flags & ImGuiInputFlags_Repeat) != 0) { float repeat_delay, repeat_rate; GetTypematicRepeatRate(flags, &repeat_delay, &repeat_rate); pressed = (t > repeat_delay) && GetKeyPressedAmount(key, repeat_delay, repeat_rate) > 0; + if (pressed && (flags & ImGuiInputFlags_RepeatUntilMask_)) + { + // Slightly bias 'key_pressed_time' as DownDuration is an accumulation of DeltaTime which we compare to an absolute time value. + // Ideally we'd replace DownDuration with KeyPressedTime but it would break user's code. + ImGuiContext& g = *GImGui; + double key_pressed_time = g.Time - t + 0.00001f; + if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChange) && (g.LastKeyModsChangeTime > key_pressed_time)) + pressed = false; + if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone) && (g.LastKeyModsChangeFromNoneTime > key_pressed_time)) + pressed = false; + if ((flags & ImGuiInputFlags_RepeatUntilOtherKeyPress) && (g.LastKeyboardKeyPressTime > key_pressed_time)) + pressed = false; + } } if (!pressed) return false; @@ -8177,10 +8868,10 @@ bool ImGui::IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id) bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) { - return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); + return IsMouseClicked(button, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any); } -bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); @@ -8189,7 +8880,7 @@ bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInput const float t = g.IO.MouseDownDuration[button]; if (t < 0.0f) return false; - IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsMouseClicked) == 0); // Passing flags not supported by this function! // FIXME: Could support RepeatRate and RepeatUntil flags here. const bool repeat = (flags & ImGuiInputFlags_Repeat) != 0; const bool pressed = (t == 0.0f) || (repeat && t > g.IO.KeyRepeatDelay && CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0); @@ -8223,6 +8914,13 @@ bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any); } +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), owner_id); +} + int ImGui::GetMouseClickedCount(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; @@ -8242,9 +8940,8 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c if (clip) rect_clipped.ClipWith(g.CurrentWindow->ClipRect); - // Expand for touch input - const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); - if (!rect_for_touch.Contains(g.IO.MousePos)) + // Hit testing, expanded for touch input + if (!rect_clipped.ContainsWithPad(g.IO.MousePos, g.Style.TouchExtraPadding)) return false; return true; } @@ -8275,6 +8972,17 @@ ImVec2 ImGui::GetMousePos() return g.IO.MousePos; } +// This is called TeleportMousePos() and not SetMousePos() to emphasis that setting MousePosPrev will effectively clear mouse delta as well. +// It is expected you only call this if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) is set and supported by backend. +void ImGui::TeleportMousePos(const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + g.IO.MousePos = g.IO.MousePosPrev = pos; + g.IO.MouseDelta = ImVec2(0.0f, 0.0f); + g.IO.WantSetMousePos = true; + //IMGUI_DEBUG_LOG_IO("TeleportMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); +} + // NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() { @@ -8410,7 +9118,9 @@ static void ImGui::UpdateKeyboardInputs() GetKeyData(ImGuiMod_Super)->Down = io.KeySuper; } } +#endif + // Import legacy ImGuiNavInput_ io inputs and convert to gamepad keys #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active) @@ -8433,7 +9143,6 @@ static void ImGui::UpdateKeyboardInputs() MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown); #undef NAV_MAP_KEY } -#endif #endif // Update aliases @@ -8442,15 +9151,20 @@ static void ImGui::UpdateKeyboardInputs() UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH); UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel); - // Synchronize io.KeyMods and io.KeyXXX values. + // Synchronize io.KeyMods and io.KeyCtrl/io.KeyShift/etc. values. // - New backends (1.87+): send io.AddKeyEvent(ImGuiMod_XXX) -> -> (here) deriving io.KeyMods + io.KeyXXX from key array. // - Legacy backends: set io.KeyXXX bools -> (above) set key array from io.KeyXXX -> (here) deriving io.KeyMods + io.KeyXXX from key array. // So with legacy backends the 4 values will do a unnecessary back-and-forth but it makes the code simpler and future facing. + const ImGuiKeyChord prev_key_mods = io.KeyMods; io.KeyMods = GetMergedModsFromKeys(); io.KeyCtrl = (io.KeyMods & ImGuiMod_Ctrl) != 0; io.KeyShift = (io.KeyMods & ImGuiMod_Shift) != 0; io.KeyAlt = (io.KeyMods & ImGuiMod_Alt) != 0; io.KeySuper = (io.KeyMods & ImGuiMod_Super) != 0; + if (prev_key_mods != io.KeyMods) + g.LastKeyModsChangeTime = g.Time; + if (prev_key_mods != io.KeyMods && prev_key_mods == 0) + g.LastKeyModsChangeFromNoneTime = g.Time; // Clear gamepad data if disabled if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) @@ -8466,6 +9180,14 @@ static void ImGui::UpdateKeyboardInputs() ImGuiKeyData* key_data = &io.KeysData[i]; key_data->DownDurationPrev = key_data->DownDuration; key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f; + if (key_data->DownDuration == 0.0f) + { + ImGuiKey key = (ImGuiKey)(ImGuiKey_KeysData_OFFSET + i); + if (IsKeyboardKey(key)) + g.LastKeyboardKeyPressTime = g.Time; + else if (key == ImGuiKey_ReservedForModCtrl || key == ImGuiKey_ReservedForModShift || key == ImGuiKey_ReservedForModAlt || key == ImGuiKey_ReservedForModSuper) + g.LastKeyboardKeyPressTime = g.Time; + } } // Update keys/input owner (named keys only): one entry per key @@ -8475,10 +9197,11 @@ static void ImGui::UpdateKeyboardInputs() ImGuiKeyOwnerData* owner_data = &g.KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; owner_data->OwnerCurr = owner_data->OwnerNext; if (!key_data->Down) // Important: ownership is released on the frame after a release. Ensure a 'MouseDown -> CloseWindow -> MouseUp' chain doesn't lead to someone else seeing the MouseUp. - owner_data->OwnerNext = ImGuiKeyOwner_None; + owner_data->OwnerNext = ImGuiKeyOwner_NoOwner; owner_data->LockThisFrame = owner_data->LockUntilRelease = owner_data->LockUntilRelease && key_data->Down; // Clear LockUntilRelease when key is not Down anymore } + // Update key routing (for e.g. shortcuts) UpdateKeyRoutingTable(&g.KeysRoutingTable); } @@ -8496,7 +9219,7 @@ static void ImGui::UpdateMouseInputs() // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well) if (IsMousePosValid(&io.MousePos)) - io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos); + io.MousePos = g.MouseLastValidPos = ImFloor(io.MousePos); // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev)) @@ -8504,11 +9227,17 @@ static void ImGui::UpdateMouseInputs() else io.MouseDelta = ImVec2(0.0f, 0.0f); + // Update stationary timer. + // FIXME: May need to rework again to have some tolerance for occasional small movement, while being functional on high-framerates. + const float mouse_stationary_threshold = (io.MouseSource == ImGuiMouseSource_Mouse) ? 2.0f : 3.0f; // Slightly higher threshold for ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen, may need rework. + const bool mouse_stationary = (ImLengthSqr(io.MouseDelta) <= mouse_stationary_threshold * mouse_stationary_threshold); + g.MouseStationaryTimer = mouse_stationary ? (g.MouseStationaryTimer + io.DeltaTime) : 0.0f; + //IMGUI_DEBUG_LOG("%.4f\n", g.MouseStationaryTimer); + // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) g.NavDisableMouseHover = false; - io.MousePosPrev = io.MousePos; for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) { io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f; @@ -8624,8 +9353,8 @@ void ImGui::UpdateMouseWheel() } ImVec2 wheel; - wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_None) ? g.IO.MouseWheelH : 0.0f; - wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_None) ? g.IO.MouseWheel : 0.0f; + wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheelH : 0.0f; + wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheel : 0.0f; //IMGUI_DEBUG_LOG("MouseWheel X:%.3f Y:%.3f\n", wheel_x, wheel_y); ImGuiWindow* mouse_window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; @@ -8645,8 +9374,8 @@ void ImGui::UpdateMouseWheel() { const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; SetWindowPos(window, window->Pos + offset, 0); - window->Size = ImFloor(window->Size * scale); - window->SizeFull = ImFloor(window->SizeFull * scale); + window->Size = ImTrunc(window->Size * scale); + window->SizeFull = ImTrunc(window->SizeFull * scale); } return; } @@ -8682,15 +9411,17 @@ void ImGui::UpdateMouseWheel() { LockWheelingWindow(window, wheel.x); float max_step = window->InnerRect.GetWidth() * 0.67f; - float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); + float scroll_step = ImTrunc(ImMin(2 * window->CalcFontSize(), max_step)); SetScrollX(window, window->Scroll.x - wheel.x * scroll_step); + g.WheelingWindowScrolledFrame = g.FrameCount; } if (do_scroll[ImGuiAxis_Y]) { LockWheelingWindow(window, wheel.y); float max_step = window->InnerRect.GetHeight() * 0.67f; - float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); + float scroll_step = ImTrunc(ImMin(5 * window->CalcFontSize(), max_step)); SetScrollY(window, window->Scroll.y - wheel.y * scroll_step); + g.WheelingWindowScrolledFrame = g.FrameCount; } } } @@ -8710,7 +9441,7 @@ void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse) #ifndef IMGUI_DISABLE_DEBUG_TOOLS static const char* GetInputSourceName(ImGuiInputSource source) { - const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Clipboard" }; + const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT); return input_source_names[source]; } @@ -8723,8 +9454,8 @@ static const char* GetMouseSourceName(ImGuiMouseSource source) static void DebugPrintInputEvent(const char* prefix, const ImGuiInputEvent* e) { ImGuiContext& g = *GImGui; - if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (%.1f, %.1f) (%s)\n", prefix, e->MousePos.PosX, e->MousePos.PosY, GetMouseSourceName(e->MouseWheel.MouseSource)); return; } - if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseButton %d %s (%s)\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up", GetMouseSourceName(e->MouseWheel.MouseSource)); return; } + if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (%.1f, %.1f) (%s)\n", prefix, e->MousePos.PosX, e->MousePos.PosY, GetMouseSourceName(e->MousePos.MouseSource)); return; } + if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseButton %d %s (%s)\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up", GetMouseSourceName(e->MouseButton.MouseSource)); return; } if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseWheel (%.3f, %.3f) (%s)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY, GetMouseSourceName(e->MouseWheel.MouseSource)); return; } if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("[io] %s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; } if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("[io] %s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; } @@ -8756,6 +9487,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs) ImGuiInputEvent* e = &g.InputEventsQueue[event_n]; if (e->Type == ImGuiInputEventType_MousePos) { + if (g.IO.WantSetMousePos) + continue; // Trickling Rule: Stop processing queued events if we already handled a mouse button change ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY); if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted)) @@ -8859,8 +9592,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs) ImGuiID ImGui::GetKeyOwner(ImGuiKey key) { - if (!IsNamedKeyOrModKey(key)) - return ImGuiKeyOwner_None; + if (!IsNamedKeyOrMod(key)) + return ImGuiKeyOwner_NoOwner; ImGuiContext& g = *GImGui; ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); @@ -8868,7 +9601,7 @@ ImGuiID ImGui::GetKeyOwner(ImGuiKey key) if (g.ActiveIdUsingAllKeyboardKeys && owner_id != g.ActiveId && owner_id != ImGuiKeyOwner_Any) if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) - return ImGuiKeyOwner_None; + return ImGuiKeyOwner_NoOwner; return owner_id; } @@ -8879,7 +9612,7 @@ ImGuiID ImGui::GetKeyOwner(ImGuiKey key) // All paths are also testing for key not being locked, for the rare cases that key have been locked with using ImGuiInputFlags_LockXXX flags. bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) { - if (!IsNamedKeyOrModKey(key)) + if (!IsNamedKeyOrMod(key)) return true; ImGuiContext& g = *GImGui; @@ -8898,7 +9631,7 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) { if (owner_data->LockThisFrame) return false; - if (owner_data->OwnerCurr != ImGuiKeyOwner_None) + if (owner_data->OwnerCurr != ImGuiKeyOwner_NoOwner) return false; } @@ -8912,10 +9645,11 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) // - SetKeyOwner(..., Any or None, Lock) : set lock void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) { - IM_ASSERT(IsNamedKeyOrModKey(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it) - IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function! - ImGuiContext& g = *GImGui; + IM_ASSERT(IsNamedKeyOrMod(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it) + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function! + //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X, flags=%08X)\n", GetKeyName(key), owner_id, flags); + ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); owner_data->OwnerCurr = owner_data->OwnerNext = owner_id; @@ -8932,7 +9666,6 @@ void ImGui::SetKeyOwnersForKeyChord(ImGuiKeyChord key_chord, ImGuiID owner_id, I if (key_chord & ImGuiMod_Shift) { SetKeyOwner(ImGuiMod_Shift, owner_id, flags); } if (key_chord & ImGuiMod_Alt) { SetKeyOwner(ImGuiMod_Alt, owner_id, flags); } if (key_chord & ImGuiMod_Super) { SetKeyOwner(ImGuiMod_Super, owner_id, flags); } - if (key_chord & ImGuiMod_Shortcut) { SetKeyOwner(ImGuiMod_Shortcut, owner_id, flags); } if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); } } @@ -8957,18 +9690,17 @@ void ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags) } } -bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +// This is the only public API until we expose owner_id versions of the API as replacements. +bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord) +{ + return IsKeyChordPressed(key_chord, 0, ImGuiInputFlags_None); +} + +// This is equivalent to comparing KeyMods + doing a IsKeyPressed() +bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) { ImGuiContext& g = *GImGui; - - // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any. - if ((flags & ImGuiInputFlags_RouteMask_) == 0) - flags |= ImGuiInputFlags_RouteFocused; - if (!SetShortcutRouting(key_chord, owner_id, flags)) - return false; - - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); + key_chord = FixupKeyChord(key_chord); ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); if (g.IO.KeyMods != mods) return false; @@ -8976,12 +9708,77 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags // Special storage location for mods ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); if (key == ImGuiKey_None) - key = ConvertSingleModFlagToKey(&g, mods); - - if (!IsKeyPressed(key, owner_id, (flags & (ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateMask_)))) + key = ConvertSingleModFlagToKey(mods); + if (!IsKeyPressed(key, (flags & ImGuiInputFlags_RepeatMask_), owner_id)) return false; - IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! + return true; +} +void ImGui::SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasShortcut; + g.NextItemData.Shortcut = key_chord; + g.NextItemData.ShortcutFlags = flags; +} + +void ImGui::ItemHandleShortcut(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiInputFlags flags = g.NextItemData.ShortcutFlags; + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetNextItemShortcut) == 0); // Passing flags not supported by SetNextItemShortcut()! + + if (flags & ImGuiInputFlags_Tooltip) + { + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasShortcut; + g.LastItemData.Shortcut = g.NextItemData.Shortcut; + } + if (!Shortcut(g.NextItemData.Shortcut, flags & ImGuiInputFlags_SupportedByShortcut, id) || g.NavActivateId != 0) + return; + + // FIXME: Generalize Activation queue? + g.NavActivateId = id; // Will effectively disable clipping. + g.NavActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_FromShortcut; + //if (g.ActiveId == 0 || g.ActiveId == id) + g.NavActivateDownId = g.NavActivatePressedId = id; + NavHighlightActivated(id); +} + +bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags) +{ + return Shortcut(key_chord, flags, ImGuiKeyOwner_Any); +} + +bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) +{ + //ImGuiContext& g = *GImGui; + //IMGUI_DEBUG_LOG("Shortcut(%s, flags=%X, owner_id=0x%08X)\n", GetKeyChordName(key_chord, g.TempBuffer.Data, g.TempBuffer.Size), flags, owner_id); + + // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any. + if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0) + flags |= ImGuiInputFlags_RouteFocused; + + // Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default) + // Effectively makes Shortcut() always input-owner aware. + if (owner_id == ImGuiKeyOwner_Any || owner_id == ImGuiKeyOwner_NoOwner) + owner_id = GetRoutingIdFromOwnerId(owner_id); + + // Submit route + if (!SetShortcutRouting(key_chord, flags, owner_id)) + return false; + + // Default repeat behavior for Shortcut() + // So e.g. pressing Ctrl+W and releasing Ctrl while holding W will not trigger the W shortcut. + if ((flags & ImGuiInputFlags_Repeat) != 0 && (flags & ImGuiInputFlags_RepeatUntilMask_) == 0) + flags |= ImGuiInputFlags_RepeatUntilKeyModsChange; + + if (!IsKeyChordPressed(key_chord, flags, owner_id)) + return false; + + // Claim mods during the press + SetKeyOwnersForKeyChord(key_chord & ImGuiMod_Mask_, owner_id); + + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! return true; } @@ -8990,24 +9787,26 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags // [SECTION] ERROR CHECKING //----------------------------------------------------------------------------- -// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. +// Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues. +// Called by IMGUI_CHECKVERSION(). // Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit -// If this triggers you have an issue: -// - Most commonly: mismatched headers and compiled code version. -// - Or: mismatched configuration #define, compilation settings, packing pragma etc. -// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui, -// which is way it is required you put them in your imconfig file (and not just before including imgui.h). -// Otherwise it is possible that different compilation units would see different structure layout +// If this triggers you have mismatched headers and compiled code versions. +// - It could be because of a build issue (using new headers with old compiled code) +// - It could be because of mismatched configuration #define, compilation settings, packing pragma etc. +// THE CONFIGURATION SETTINGS MENTIONED IN imconfig.h MUST BE SET FOR ALL COMPILATION UNITS INVOLVED WITH DEAR IMGUI. +// Which is why it is required you put them in your imconfig file (and NOT only before including imgui.h). +// Otherwise it is possible that different compilation units would see different structure layout. +// If you don't want to modify imconfig.h you can use the IMGUI_USER_CONFIG define to change filename. bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) { bool error = false; if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } - if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } + if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } - if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } - if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } - if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } - if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } + if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } + if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } + if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } + if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } return !error; } @@ -9262,12 +10061,120 @@ void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx) IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); } +//----------------------------------------------------------------------------- +// [SECTION] ITEM SUBMISSION +//----------------------------------------------------------------------------- +// - KeepAliveID() +// - ItemAdd() +//----------------------------------------------------------------------------- + +// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). +void ImGui::KeepAliveID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId == id) + g.ActiveIdIsAlive = id; + if (g.ActiveIdPreviousFrame == id) + g.ActiveIdPreviousFrameIsAlive = true; +} + +// Declare item bounding box for clipping and interaction. +// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface +// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. +// THIS IS IN THE PERFORMANCE CRITICAL PATH (UNTIL THE CLIPPING TEST AND EARLY-RETURN) +bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Set item data + // (DisplayRect is left untouched, made valid when ImGuiItemStatusFlags_HasDisplayRect is set) + g.LastItemData.ID = id; + g.LastItemData.Rect = bb; + g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; + g.LastItemData.InFlags = g.CurrentItemFlags | g.NextItemData.ItemFlags | extra_flags; + g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; + // Note: we don't copy 'g.NextItemData.SelectionUserData' to an hypothetical g.LastItemData.SelectionUserData: since the former is not cleared. + + if (id != 0) + { + KeepAliveID(id); + + // Directional navigation processing + // Runs prior to clipping early-out + // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget + // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests + // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of + // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. + // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able + // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). + // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. + // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. + if (!(g.LastItemData.InFlags & ImGuiItemFlags_NoNav)) + { + // FIMXE-NAV: investigate changing the window tests into a simple 'if (g.NavFocusScopeId == g.CurrentFocusScopeId)' test. + window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); + if (g.NavId == id || g.NavAnyRequest) + if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) + if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) + NavProcessItem(); + } + + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasShortcut) + ItemHandleShortcut(id); + } + + // Lightweight clear of SetNextItemXXX data. + g.NextItemData.Flags = ImGuiNextItemDataFlags_None; + g.NextItemData.ItemFlags = ImGuiItemFlags_None; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (id != 0) + IMGUI_TEST_ENGINE_ITEM_ADD(id, g.LastItemData.NavRect, &g.LastItemData); +#endif + + // Clipping test + // (this is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value) + //const bool is_clipped = IsClippedEx(bb, id); + //if (is_clipped) + // return false; + // g.NavActivateId is not necessarily == g.NavId, in the case of remote activation (e.g. shortcuts) + const bool is_rect_visible = bb.Overlaps(window->ClipRect); + if (!is_rect_visible) + if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId)) + if (!g.LogEnabled) + return false; + + // [DEBUG] +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (id != 0) + { + if (id == g.DebugLocateId) + DebugLocateItemResolveWithLastItem(); + + // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". + // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". + // READ THE FAQ: https://dearimgui.com/faq + IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); + } + //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] + //if ((g.LastItemData.InFlags & ImGuiItemFlags_NoNav) == 0) + // window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG] +#endif + + // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) + if (is_rect_visible) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Visible; + if (IsMouseHoveringRect(bb.Min, bb.Max)) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; + return true; +} + //----------------------------------------------------------------------------- // [SECTION] LAYOUT //----------------------------------------------------------------------------- // - ItemSize() -// - ItemAdd() // - SameLine() // - GetCursorScreenPos() // - SetCursorScreenPos() @@ -9298,6 +10205,7 @@ void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx) // Advance cursor given item size for layout. // Register minimum needed size so it can extend the bounding box used for auto-fit calculation. // See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. +// THIS IS IN THE PERFORMANCE CRITICAL PATH. void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) { ImGuiContext& g = *GImGui; @@ -9317,8 +10225,8 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; window->DC.CursorPosPrevLine.y = line_y1; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line - window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line + window->DC.CursorPos.y = IM_TRUNC(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] @@ -9334,89 +10242,10 @@ void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) SameLine(); } -// Declare item bounding box for clipping and interaction. -// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface -// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. -bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - - // Set item data - // (DisplayRect is left untouched, made valid when ImGuiItemStatusFlags_HasDisplayRect is set) - g.LastItemData.ID = id; - g.LastItemData.Rect = bb; - g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; - g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags; - g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; - - // Directional navigation processing - if (id != 0) - { - KeepAliveID(id); - - // Runs prior to clipping early-out - // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget - // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests - // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of - // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. - // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able - // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). - // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. - // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. - if (!(g.LastItemData.InFlags & ImGuiItemFlags_NoNav)) - { - window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); - if (g.NavId == id || g.NavAnyRequest) - if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) - if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) - NavProcessItem(); - } - - // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". - // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". - // READ THE FAQ: https://dearimgui.com/faq - IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); - } - g.NextItemData.Flags = ImGuiNextItemDataFlags_None; - -#ifdef IMGUI_ENABLE_TEST_ENGINE - if (id != 0) - IMGUI_TEST_ENGINE_ITEM_ADD(id, g.LastItemData.NavRect, &g.LastItemData); -#endif - - // Clipping test - // (FIXME: This is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value) - //const bool is_clipped = IsClippedEx(bb, id); - //if (is_clipped) - // return false; - const bool is_rect_visible = bb.Overlaps(window->ClipRect); - if (!is_rect_visible) - if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId)) - if (!g.LogEnabled) - return false; - - // [DEBUG] -#ifndef IMGUI_DISABLE_DEBUG_TOOLS - if (id != 0 && id == g.DebugLocateId) - DebugLocateItemResolveWithLastItem(); -#endif - //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] - //if ((g.LastItemData.InFlags & ImGuiItemFlags_NoNav) == 0) - // window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG] - - // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) - if (is_rect_visible) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Visible; - if (IsMouseHoveringRect(bb.Min, bb.Max)) - g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; - return true; -} - // Gets back to previous line and continue with horizontal layout // offset_from_start_x == 0 : follow right after previous item // offset_from_start_x != 0 : align to specified x position (relative to window/group left) -// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 +// spacing_w < 0 : use default spacing if offset_from_start_x == 0, no spacing if offset_from_start_x != 0 // spacing_w >= 0 : enforce spacing amount void ImGui::SameLine(float offset_from_start_x, float spacing_w) { @@ -9450,9 +10279,6 @@ ImVec2 ImGui::GetCursorScreenPos() return window->DC.CursorPos; } -// 2022/08/05: Setting cursor position also extend boundaries (via modifying CursorMaxPos) used to compute window size, group size etc. -// I believe this was is a judicious choice but it's probably being relied upon (it has been the case since 1.31 and 1.50) -// It would be sane if we requested user to use SetCursorPos() + Dummy(ImVec2(0,0)) to extend CursorMaxPos... void ImGui::SetCursorScreenPos(const ImVec2& pos) { ImGuiWindow* window = GetCurrentWindow(); @@ -9549,14 +10375,18 @@ void ImGui::PushMultiItemsWidths(int components, float w_full) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(components > 0); const ImGuiStyle& style = g.Style; - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width - window->DC.ItemWidthStack.push_back(w_item_last); - for (int i = 0; i < components - 2; i++) - window->DC.ItemWidthStack.push_back(w_item_one); - window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; + float w_items = w_full - style.ItemInnerSpacing.x * (components - 1); + float prev_split = w_items; + for (int i = components - 1; i > 0; i--) + { + float next_split = IM_TRUNC(w_items * i / components); + window->DC.ItemWidthStack.push_back(ImMax(prev_split - next_split, 1.0f)); + prev_split = next_split; + } + window->DC.ItemWidth = ImMax(prev_split, 1.0f); g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; } @@ -9583,7 +10413,7 @@ float ImGui::CalcItemWidth() float region_max_x = GetContentRegionMaxAbs().x; w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); } - w = IM_FLOOR(w); + w = IM_TRUNC(w); return w; } @@ -9644,10 +10474,8 @@ ImVec2 ImGui::GetContentRegionMax() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max - window->Pos; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x - window->Pos.x; - return mx; + ImVec2 mx = (window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max; + return mx - window->Pos; } // [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. @@ -9655,9 +10483,7 @@ ImVec2 ImGui::GetContentRegionMaxAbs() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x; + ImVec2 mx = (window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max; return mx; } @@ -9692,6 +10518,7 @@ void ImGui::BeginGroup() ImGuiGroupData& group_data = g.GroupStack.back(); group_data.WindowID = window->ID; group_data.BackupCursorPos = window->DC.CursorPos; + group_data.BackupCursorPosPrevLine = window->DC.CursorPosPrevLine; group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; group_data.BackupIndent = window->DC.Indent; group_data.BackupGroupOffset = window->DC.GroupOffset; @@ -9699,6 +10526,7 @@ void ImGui::BeginGroup() group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; + group_data.BackupIsSameLine = window->DC.IsSameLine; group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; group_data.EmitItem = true; @@ -9725,11 +10553,13 @@ void ImGui::EndGroup() ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); window->DC.CursorPos = group_data.BackupCursorPos; + window->DC.CursorPosPrevLine = group_data.BackupCursorPosPrevLine; window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); window->DC.Indent = group_data.BackupIndent; window->DC.GroupOffset = group_data.BackupGroupOffset; window->DC.CurrLineSize = group_data.BackupCurrLineSize; window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; + window->DC.IsSameLine = group_data.BackupIsSameLine; if (g.LogEnabled) g.LogLinePosY = -FLT_MAX; // To enforce a carriage return @@ -9770,7 +10600,8 @@ void ImGui::EndGroup() g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated; g.GroupStack.pop_back(); - //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] + if (g.DebugShowGroupRects) + window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] } @@ -9809,7 +10640,7 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) } scroll[axis] = scroll_target - center_ratio * (window->SizeFull[axis] - decoration_size[axis]); } - scroll[axis] = IM_FLOOR(ImMax(scroll[axis], 0.0f)); + scroll[axis] = IM_ROUND(ImMax(scroll[axis], 0.0f)); if (!window->Collapsed && !window->SkipItems) scroll[axis] = ImMin(scroll[axis], window->ScrollMax[axis]); } @@ -9864,7 +10695,7 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) { if (can_be_fully_visible_x) - SetScrollFromPosX(window, ImFloor((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f); + SetScrollFromPosX(window, ImTrunc((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f); else SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x, 0.0f); } @@ -9879,7 +10710,7 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) { if (can_be_fully_visible_y) - SetScrollFromPosY(window, ImFloor((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f); + SetScrollFromPosY(window, ImTrunc((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f); else SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y, 0.0f); } @@ -9964,7 +10795,7 @@ void ImGui::SetScrollY(float scroll_y) void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) { IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); - window->ScrollTarget.x = IM_FLOOR(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset + window->ScrollTarget.x = IM_TRUNC(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset window->ScrollTargetCenterRatio.x = center_x_ratio; window->ScrollTargetEdgeSnapDist.x = 0.0f; } @@ -9972,7 +10803,7 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) { IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); - window->ScrollTarget.y = IM_FLOOR(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset + window->ScrollTarget.y = IM_TRUNC(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset window->ScrollTargetCenterRatio.y = center_y_ratio; window->ScrollTargetEdgeSnapDist.y = 0.0f; } @@ -10024,31 +10855,40 @@ bool ImGui::BeginTooltip() return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); } +bool ImGui::BeginItemTooltip() +{ + if (!IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + return false; + return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); +} + bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) { ImGuiContext& g = *GImGui; if (g.DragDropWithinSource || g.DragDropWithinTarget) { - // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) - // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. - // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. + // Drag and Drop tooltips are positioning differently than other tooltips: + // - offset visibility to increase visibility around mouse. + // - never clamp within outer viewport boundary. + // We call SetNextWindowPos() to enforce position and disable clamping. + // See FindBestWindowPosForPopup() for positionning logic of other tooltips (not drag and drop ones). //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; - ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); + ImVec2 tooltip_pos = g.IO.MousePos + TOOLTIP_DEFAULT_OFFSET * g.Style.MouseCursorScale; SetNextWindowPos(tooltip_pos); SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( - tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; + tooltip_flags |= ImGuiTooltipFlags_OverridePrevious; } char window_name[16]; ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); - if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) + if (tooltip_flags & ImGuiTooltipFlags_OverridePrevious) if (ImGuiWindow* window = FindWindowByName(window_name)) if (window->Active) { // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. - SetWindowHiddendAndSkipItemsForCurrentFrame(window); + SetWindowHiddenAndSkipItemsForCurrentFrame(window); ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); } ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; @@ -10067,14 +10907,6 @@ void ImGui::EndTooltip() End(); } -void ImGui::SetTooltipV(const char* fmt, va_list args) -{ - if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None)) - return; - TextV(fmt, args); - EndTooltip(); -} - void ImGui::SetTooltip(const char* fmt, ...) { va_list args; @@ -10083,6 +10915,32 @@ void ImGui::SetTooltip(const char* fmt, ...) va_end(args); } +void ImGui::SetTooltipV(const char* fmt, va_list args) +{ + if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None)) + return; + TextV(fmt, args); + EndTooltip(); +} + +// Shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav'. +// Defaults to == ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort when using the mouse. +void ImGui::SetItemTooltip(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + SetTooltipV(fmt, args); + va_end(args); +} + +void ImGui::SetItemTooltipV(const char* fmt, va_list args) +{ + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + SetTooltipV(fmt, args); +} + + //----------------------------------------------------------------------------- // [SECTION] POPUPS //----------------------------------------------------------------------------- @@ -10180,7 +11038,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. popup_ref.PopupId = id; popup_ref.Window = NULL; - popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type). + popup_ref.RestoreNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type). popup_ref.OpenFrameCount = g.FrameCount; popup_ref.OpenParentId = parent_window->IDStack.back(); popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); @@ -10193,17 +11051,23 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) } else { - // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui - // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing - // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand. - if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) + // Gently handle the user mistakenly calling OpenPopup() every frames: it is likely a programming mistake! + // However, if we were to run the regular code path, the ui would become completely unusable because the popup will always be + // in hidden-while-calculating-size state _while_ claiming focus. Which is extremely confusing situation for the programmer. + // Instead, for successive frames calls to OpenPopup(), we silently avoid reopening even if ImGuiPopupFlags_NoReopen is not specified. + bool keep_existing = false; + if (g.OpenPopupStack[current_stack_size].PopupId == id) + if ((g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) || (popup_flags & ImGuiPopupFlags_NoReopen)) + keep_existing = true; + if (keep_existing) { + // No reopen g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount; } else { - // Close child popups if any, then flag popup for open/reopen - ClosePopupToLevel(current_stack_size, false); + // Reopen: close child popups if any, then flag popup for open/reopen (set position, focus, init navigation) + ClosePopupToLevel(current_stack_size, true); g.OpenPopupStack.push_back(popup_ref); } @@ -10223,6 +11087,7 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to return; // Don't close our own child popup windows. + //IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\") restore_under=%d\n", ref_window ? ref_window->Name : "", restore_focus_to_window_under_popup); int popup_count_to_keep = 0; if (ref_window) { @@ -10233,14 +11098,15 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to if (!popup.Window) continue; IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); - if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) - continue; // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) - // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: - // Window -> Popup1 -> Popup2 -> Popup3 + // - Clicking/Focusing Window2 won't close Popup1: + // Window -> Popup1 -> Window2(Ref) + // - Clicking/focusing Popup1 will close Popup2 and Popup3: + // Window -> Popup1(Ref) -> Popup2 -> Popup3 // - Each popups may contain child windows, which is why we compare ->RootWindow! // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child + // We step through every popup from bottom to top to validate their position relative to reference window. bool ref_window_is_descendent_of_popup = false; for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) @@ -10278,18 +11144,19 @@ void ImGui::ClosePopupsExceptModals() void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) { ImGuiContext& g = *GImGui; - IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); + IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_under=%d\n", remaining, restore_focus_to_window_under_popup); IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); // Trim open popup stack - ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; - ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow; + ImGuiPopupData prev_popup = g.OpenPopupStack[remaining]; g.OpenPopupStack.resize(remaining); - if (restore_focus_to_window_under_popup) + // Restore focus (unless popup window was not yet submitted, and didn't have a chance to take focus anyhow. See #7325 for an edge case) + if (restore_focus_to_window_under_popup && prev_popup.Window) { - ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window; - if (focus_window && !focus_window->WasActive && popup_window) + ImGuiWindow* popup_window = prev_popup.Window; + ImGuiWindow* focus_window = (popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : prev_popup.RestoreNavWindow; + if (focus_window && !focus_window->WasActive) FocusTopMostWindowUnderOne(popup_window, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild); // Fallback else FocusWindow(focus_window, (g.NavLayer == ImGuiNavLayer_Main) ? ImGuiFocusRequestFlags_RestoreFocusedChild : ImGuiFocusRequestFlags_None); @@ -10339,7 +11206,7 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) char name[20]; if (flags & ImGuiWindowFlags_ChildMenu) - ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth + ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuDepth); // Recycle windows based on depth else ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame @@ -10348,6 +11215,8 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) EndPopup(); + //g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack; + return is_open; } @@ -10365,7 +11234,9 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) } // If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. -// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. +// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup). +// - *p_open set back to false in BeginPopupModal() when popup is not open. +// - if you set *p_open to false before calling BeginPopupModal(), it will close the popup. bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; @@ -10374,6 +11245,8 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla if (!IsPopupOpen(id, ImGuiPopupFlags_None)) { g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + if (p_open && *p_open) + *p_open = false; return false; } @@ -10605,15 +11478,20 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) } if (window->Flags & ImGuiWindowFlags_Tooltip) { - // Position tooltip (always follows mouse) - float sc = g.Style.MouseCursorScale; - ImVec2 ref_pos = NavCalcPreferredRefPos(); + // Position tooltip (always follows mouse + clamp within outer boundaries) + // Note that drag and drop tooltips are NOT using this path: BeginTooltipEx() manually sets their position. + // In theory we could handle both cases in same location, but requires a bit of shuffling as drag and drop tooltips are calling SetWindowPos() leading to 'window_pos_set_by_api' being set in Begin() + IM_ASSERT(g.CurrentWindow == window); + const float scale = g.Style.MouseCursorScale; + const ImVec2 ref_pos = NavCalcPreferredRefPos(); + const ImVec2 tooltip_pos = ref_pos + TOOLTIP_DEFAULT_OFFSET * scale; ImRect r_avoid; if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)) r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); else - r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. - return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * scale, ref_pos.y + 24 * scale); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. + //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255, 0, 255, 255)); + return FindBestWindowPosForPopupEx(tooltip_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); } IM_ASSERT(0); return window->Pos; @@ -10634,11 +11512,19 @@ void ImGui::SetNavWindow(ImGuiWindow* window) { IMGUI_DEBUG_LOG_FOCUS("[focus] SetNavWindow(\"%s\")\n", window ? window->Name : ""); g.NavWindow = window; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; } g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false; NavUpdateAnyRequestFlag(); } +void ImGui::NavHighlightActivated(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavHighlightActivatedId = id; + g.NavHighlightActivatedTimer = NAV_ACTIVATE_HIGHLIGHT_TIMER; +} + void ImGui::NavClearPreferredPosForAxis(ImGuiAxis axis) { ImGuiContext& g = *GImGui; @@ -10652,7 +11538,7 @@ void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); g.NavId = id; g.NavLayer = nav_layer; - g.NavFocusScopeId = focus_scope_id; + SetNavFocusScope(focus_scope_id); g.NavWindow->NavLastIds[nav_layer] = id; g.NavWindow->NavRectRel[nav_layer] = rect_rel; @@ -10674,7 +11560,7 @@ void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; g.NavId = id; g.NavLayer = nav_layer; - g.NavFocusScopeId = g.CurrentFocusScopeId; + SetNavFocusScope(g.CurrentFocusScopeId); window->NavLastIds[nav_layer] = id; if (g.LastItemData.ID == id) window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect); @@ -10853,6 +11739,11 @@ static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result) result->FocusScopeId = g.CurrentFocusScopeId; result->InFlags = g.LastItemData.InFlags; result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect); + if (result->InFlags & ImGuiItemFlags_HasSelectionUserData) + { + IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid); + result->SelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData. + } } // True when current work location may be scrolled horizontally when moving left / right. @@ -10865,7 +11756,7 @@ void ImGui::NavUpdateCurrentWindowIsScrollPushableX() } // We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) -// This is called after LastItemData is set. +// This is called after LastItemData is set, but NextItemData is also still valid. static void ImGui::NavProcessItem() { ImGuiContext& g = *GImGui; @@ -10901,23 +11792,26 @@ static void ImGui::NavProcessItem() // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy) if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0) { - const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0; - if (is_tabbing) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi) || (window->Flags & ImGuiWindowFlags_NoNavInputs) == 0) { - NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags); - } - else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) - { - ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; - if (NavScoreItem(result)) - NavApplyItemToResult(result); + const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0; + if (is_tabbing) + { + NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags); + } + else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) + { + ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; + if (NavScoreItem(result)) + NavApplyItemToResult(result); - // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. - const float VISIBLE_RATIO = 0.70f; - if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) - if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) - if (NavScoreItem(&g.NavMoveResultLocalVisible)) - NavApplyItemToResult(&g.NavMoveResultLocalVisible); + // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. + const float VISIBLE_RATIO = 0.70f; + if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) + if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) + if (NavScoreItem(&g.NavMoveResultLocalVisible)) + NavApplyItemToResult(&g.NavMoveResultLocalVisible); + } } } @@ -10927,8 +11821,14 @@ static void ImGui::NavProcessItem() if (g.NavWindow != window) SetNavWindow(window); // Always refresh g.NavWindow, because some operations such as FocusItem() may not have a window. g.NavLayer = window->DC.NavLayerCurrent; + SetNavFocusScope(g.CurrentFocusScopeId); // Will set g.NavFocusScopeId AND store g.NavFocusScopePath g.NavFocusScopeId = g.CurrentFocusScopeId; g.NavIdIsAlive = true; + if (g.LastItemData.InFlags & ImGuiItemFlags_HasSelectionUserData) + { + IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid); + g.NavLastValidSelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData. + } window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position) } } @@ -10945,8 +11845,12 @@ void ImGui::NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flag ImGuiContext& g = *GImGui; if ((move_flags & ImGuiNavMoveFlags_FocusApi) == 0) + { if (g.NavLayer != g.CurrentWindow->DC.NavLayerCurrent) return; + if (g.NavFocusScopeId != g.CurrentFocusScopeId) + return; + } // - Can always land on an item when using API call. // - Tabbing with _NavEnableKeyboard (space/enter/arrows): goes through every item. @@ -11007,7 +11911,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM ImGuiContext& g = *GImGui; IM_ASSERT(g.NavWindow != NULL); - if (move_flags & ImGuiNavMoveFlags_Tabbing) + if (move_flags & ImGuiNavMoveFlags_IsTabbing) move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId; g.NavMoveSubmitted = g.NavMoveScoringItems = true; @@ -11017,7 +11921,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM g.NavMoveFlags = move_flags; g.NavMoveScrollFlags = scroll_flags; g.NavMoveForwardToNextFrame = false; - g.NavMoveKeyMods = g.IO.KeyMods; + g.NavMoveKeyMods = (move_flags & ImGuiNavMoveFlags_FocusApi) ? 0 : g.IO.KeyMods; g.NavMoveResultLocal.Clear(); g.NavMoveResultLocalVisible.Clear(); g.NavMoveResultOther.Clear(); @@ -11034,6 +11938,19 @@ void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result) NavUpdateAnyRequestFlag(); } +// Called by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere +void ImGui::NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiNavTreeNodeData* tree_node_data) +{ + ImGuiContext& g = *GImGui; + g.NavMoveScoringItems = false; + g.LastItemData.ID = tree_node_data->ID; + g.LastItemData.InFlags = tree_node_data->InFlags & ~ImGuiItemFlags_HasSelectionUserData; // Losing SelectionUserData, recovered next-frame (cheaper). + g.LastItemData.NavRect = tree_node_data->NavRect; + NavApplyItemToResult(result); // Result this instead of implementing a NavApplyPastTreeNodeToResult() + NavClearPreferredPosForAxis(ImGuiAxis_Y); + NavUpdateAnyRequestFlag(); +} + void ImGui::NavMoveRequestCancel() { ImGuiContext& g = *GImGui; @@ -11094,6 +12011,7 @@ void ImGui::NavRestoreLayer(ImGuiNavLayer layer) { ImGuiWindow* prev_nav_window = g.NavWindow; g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); // FIXME-NAV: Should clear ongoing nav requests? + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; if (prev_nav_window) IMGUI_DEBUG_LOG_FOCUS("[focus] NavRestoreLayer: from \"%s\" to SetNavWindow(\"%s\")\n", prev_nav_window->Name, g.NavWindow->Name); } @@ -11133,7 +12051,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) if (window->Flags & ImGuiWindowFlags_NoNavInputs) { g.NavId = 0; - g.NavFocusScopeId = window->NavRootFocusScopeId; + SetNavFocusScope(window->NavRootFocusScopeId); return; } @@ -11152,7 +12070,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) else { g.NavId = window->NavLastIds[0]; - g.NavFocusScopeId = window->NavRootFocusScopeId; + SetNavFocusScope(window->NavRootFocusScopeId); } } @@ -11160,7 +12078,10 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.NavWindow; - if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) + const bool activated_shortcut = g.ActiveId != 0 && g.ActiveIdFromShortcut && g.ActiveId == g.LastItemData.ID; + + // Testing for !activated_shortcut here could in theory be removed if we decided that activating a remote shortcut altered one of the g.NavDisableXXX flag. + if ((g.NavDisableHighlight || !g.NavDisableMouseHover || !window) && !activated_shortcut) { // Mouse (we need a fallback in case the mouse becomes invalid after being used) // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. @@ -11171,16 +12092,21 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() else { // When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item + ImRect ref_rect; + if (activated_shortcut) + ref_rect = g.LastItemData.NavRect; + else + ref_rect = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); + // Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?) - ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX)) { ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); - rect_rel.Translate(window->Scroll - next_scroll); + ref_rect.Translate(window->Scroll - next_scroll); } - ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); + ImVec2 pos = ImVec2(ref_rect.Min.x + ImMin(g.Style.FramePadding.x * 4, ref_rect.GetWidth()), ref_rect.Max.y - ImMin(g.Style.FramePadding.y, ref_rect.GetHeight())); ImGuiViewport* viewport = GetMainViewport(); - return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. + return ImTrunc(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImTrunc() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. } } @@ -11273,10 +12199,10 @@ static void ImGui::NavUpdate() g.NavActivateFlags = ImGuiActivateFlags_None; if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) { - const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate)); - const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, false))); - const bool input_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Enter)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput)); - const bool input_pressed = input_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Enter, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, false))); + const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner)); + const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, 0, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, 0, ImGuiKeyOwner_NoOwner))); + const bool input_down = (nav_keyboard_active && (IsKeyDown(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyDown(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner)); + const bool input_pressed = input_down && ((nav_keyboard_active && (IsKeyPressed(ImGuiKey_Enter, 0, ImGuiKeyOwner_NoOwner) || IsKeyPressed(ImGuiKey_KeypadEnter, 0, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, 0, ImGuiKeyOwner_NoOwner))); if (g.ActiveId == 0 && activate_pressed) { g.NavActivateId = g.NavId; @@ -11290,13 +12216,22 @@ static void ImGui::NavUpdate() if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_down || input_down)) g.NavActivateDownId = g.NavId; if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_pressed || input_pressed)) + { g.NavActivatePressedId = g.NavId; + NavHighlightActivated(g.NavId); + } } if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) g.NavDisableHighlight = true; if (g.NavActivateId != 0) IM_ASSERT(g.NavActivateDownId == g.NavActivateId); + // Highlight + if (g.NavHighlightActivatedTimer > 0.0f) + g.NavHighlightActivatedTimer = ImMax(0.0f, g.NavHighlightActivatedTimer - io.DeltaTime); + if (g.NavHighlightActivatedTimer == 0.0f) + g.NavHighlightActivatedId = 0; + // Process programmatic activation request // FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others) if (g.NavNextActivateId != 0) @@ -11323,9 +12258,9 @@ static void ImGui::NavUpdate() if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY && move_dir != ImGuiDir_None) { if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) - SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollX(window, ImTrunc(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) - SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollY(window, ImTrunc(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); } // *Normal* Manual scroll with LStick @@ -11335,9 +12270,9 @@ static void ImGui::NavUpdate() const ImVec2 scroll_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); const float tweak_factor = IsKeyDown(ImGuiKey_NavGamepadTweakSlow) ? 1.0f / 10.0f : IsKeyDown(ImGuiKey_NavGamepadTweakFast) ? 10.0f : 1.0f; if (scroll_dir.x != 0.0f && window->ScrollbarX) - SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); + SetScrollX(window, ImTrunc(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); if (scroll_dir.y != 0.0f) - SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); + SetScrollY(window, ImTrunc(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); } } @@ -11351,11 +12286,7 @@ static void ImGui::NavUpdate() // Update mouse position if requested // (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied) if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) - { - io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); - io.WantSetMousePos = true; - //IMGUI_DEBUG_LOG_IO("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); - } + TeleportMousePos(NavCalcPreferredRefPos()); // [DEBUG] g.NavScoringDebugCount = 0; @@ -11389,6 +12320,8 @@ void ImGui::NavInitRequestApplyResult() IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result + if (result->SelectionUserData != ImGuiSelectionUserData_Invalid) + g.NavLastValidSelectionUserData = result->SelectionUserData; if (g.NavInitRequestFromMove) NavRestoreHighlightAfterMove(); } @@ -11443,10 +12376,10 @@ void ImGui::NavUpdateCreateMoveRequest() if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) { const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateNavMove; - if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Left; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Right; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Up; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Down; } } g.NavMoveClipDir = g.NavMoveDir; g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); @@ -11526,7 +12459,7 @@ void ImGui::NavUpdateCreateMoveRequest() scoring_rect.TranslateY(scoring_rect_offset_y); if (g.NavMoveSubmitted) NavBiasScoringRect(scoring_rect, window->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer], g.NavMoveDir, g.NavMoveFlags); - IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem(). + IM_ASSERT(!scoring_rect.IsInverted()); // Ensure we have a non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem(). //GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG] //if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG] } @@ -11542,22 +12475,22 @@ void ImGui::NavUpdateCreateTabbingRequest() if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) return; - const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat) && !g.IO.KeyCtrl && !g.IO.KeyAlt; + const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner) && !g.IO.KeyCtrl && !g.IO.KeyAlt; if (!tab_pressed) return; // Initiate tabbing request // (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!) - // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests. // See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping. const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; if (nav_keyboard_active) g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.NavDisableHighlight == true && g.ActiveId == 0) ? 0 : +1; else g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1; + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate; ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down; - NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + NavMoveRequestSubmit(ImGuiDir_None, clip_dir, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. g.NavTabbingCounter = -1; } @@ -11574,7 +12507,7 @@ void ImGui::NavMoveRequestApplyResult() ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL; // Tabbing forward wrap - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && result == NULL) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && result == NULL) if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID) result = &g.NavTabbingResultFirst; @@ -11582,9 +12515,9 @@ void ImGui::NavMoveRequestApplyResult() const ImGuiAxis axis = (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X; if (result == NULL) { - if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) + g.NavMoveFlags |= ImGuiNavMoveFlags_NoSetNavHighlight; + if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavHighlight) == 0) NavRestoreHighlightAfterMove(); NavClearPreferredPosForAxis(axis); // On a failed move, clear preferred pos for this axis. IMGUI_DEBUG_LOG_NAV("[nav] NavMoveSubmitted but not led to a result!\n"); @@ -11620,12 +12553,19 @@ void ImGui::NavMoveRequestApplyResult() { IMGUI_DEBUG_LOG_FOCUS("[focus] NavMoveRequest: SetNavWindow(\"%s\")\n", result->Window->Name); g.NavWindow = result->Window; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; } - if (g.ActiveId != result->ID) + + // Clear active id unless requested not to + // FIXME: ImGuiNavMoveFlags_NoClearActiveId is currently unused as we don't have a clear strategy to preserve active id after interaction, + // so this is mostly provided as a gateway for further experiments (see #1418, #2890) + if (g.ActiveId != result->ID && (g.NavMoveFlags & ImGuiNavMoveFlags_NoClearActiveId) == 0) ClearActiveID(); - if (g.NavId != result->ID) + + // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) + // PageUp/PageDown however sets always set NavJustMovedTo (vs Home/End which doesn't) mimicking Windows behavior. + if ((g.NavId != result->ID || (g.NavMoveFlags & ImGuiNavMoveFlags_IsPageMove)) && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSelect) == 0) { - // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) g.NavJustMovedToId = result->ID; g.NavJustMovedToFocusScopeId = result->FocusScopeId; g.NavJustMovedToKeyMods = g.NavMoveKeyMods; @@ -11635,32 +12575,32 @@ void ImGui::NavMoveRequestApplyResult() IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); ImVec2 preferred_scoring_pos_rel = g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer]; SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); + if (result->SelectionUserData != ImGuiSelectionUserData_Invalid) + g.NavLastValidSelectionUserData = result->SelectionUserData; // Restore last preferred position for current axis // (storing in RootWindowForNav-> as the info is desirable at the beginning of a Move Request. In theory all storage should use RootWindowForNav..) - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) == 0) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) == 0) { preferred_scoring_pos_rel[axis] = result->RectRel.GetCenter()[axis]; g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer] = preferred_scoring_pos_rel; } - // Tabbing: Activates Inputable or Focus non-Inputable - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable)) - { - g.NavNextActivateId = result->ID; - g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState; - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - } + // Tabbing: Activates Inputable, otherwise only Focus + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && (result->InFlags & ImGuiItemFlags_Inputable) == 0) + g.NavMoveFlags &= ~ImGuiNavMoveFlags_Activate; // Activate if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate) { g.NavNextActivateId = result->ID; g.NavNextActivateFlags = ImGuiActivateFlags_None; + if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) + g.NavNextActivateFlags |= ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState | ImGuiActivateFlags_FromTabbing; } // Enable nav highlight - if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavHighlight) == 0) NavRestoreHighlightAfterMove(); } @@ -11673,7 +12613,7 @@ static void ImGui::NavUpdateCancelRequest() ImGuiContext& g = *GImGui; const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, ImGuiKeyOwner_None)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, ImGuiKeyOwner_None))) + if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, 0, ImGuiKeyOwner_NoOwner)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, 0, ImGuiKeyOwner_NoOwner))) return; IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); @@ -11687,15 +12627,14 @@ static void ImGui::NavUpdateCancelRequest() NavRestoreLayer(ImGuiNavLayer_Main); NavRestoreHighlightAfterMove(); } - else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) + else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow) { // Exit child window - ImGuiWindow* child_window = g.NavWindow; - ImGuiWindow* parent_window = g.NavWindow->ParentWindow; + ImGuiWindow* child_window = g.NavWindow->RootWindowForNav; + ImGuiWindow* parent_window = child_window->ParentWindow; IM_ASSERT(child_window->ChildId != 0); - ImRect child_rect = child_window->Rect(); FocusWindow(parent_window); - SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect)); + SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_window->Rect())); NavRestoreHighlightAfterMove(); } else if (g.OpenPopupStack.Size > 0 && g.OpenPopupStack.back().Window != NULL && !(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) @@ -11723,10 +12662,10 @@ static float ImGui::NavUpdatePageUpPageDown() if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL) return 0.0f; - const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_None); - const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_None); - const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); - const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); + const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner); + const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner); + const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); + const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out return 0.0f; @@ -11736,9 +12675,9 @@ static float ImGui::NavUpdatePageUpPageDown() if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY) { // Fallback manual-scroll when window has no navigable item - if (IsKeyPressed(ImGuiKey_PageUp, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + if (IsKeyPressed(ImGuiKey_PageUp, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); - else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); else if (home_pressed) SetScrollY(window, 0.0f); @@ -11755,14 +12694,14 @@ static float ImGui::NavUpdatePageUpPageDown() nav_scoring_rect_offset_y = -page_offset_y; g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) g.NavMoveClipDir = ImGuiDir_Up; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove; } else if (IsKeyPressed(ImGuiKey_PageDown, true)) { nav_scoring_rect_offset_y = +page_offset_y; g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) g.NavMoveClipDir = ImGuiDir_Down; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove; } else if (home_pressed) { @@ -11927,12 +12866,13 @@ static void ImGui::NavUpdateWindowing() } // Start CTRL+Tab or Square+L/R window selection + // (g.ConfigNavWindowingKeyNext/g.ConfigNavWindowingKeyPrev defaults are ImGuiMod_Ctrl|ImGuiKey_Tab and ImGuiMod_Ctrl|ImGuiMod_Shift|ImGuiKey_Tab) const ImGuiID owner_id = ImHashStr("###NavUpdateWindowing"); const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, owner_id, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); - const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, owner_id, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); - const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, 0, ImGuiInputFlags_None); + const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); + const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); + const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_None); const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard! if (start_windowing_with_gamepad || start_windowing_with_keyboard) if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) @@ -11943,7 +12883,7 @@ static void ImGui::NavUpdateWindowing() g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; - // Register ownership of our mods. Using ImGuiInputFlags_RouteGlobalHigh in the Shortcut() calls instead would probably be correct but may have more side-effects. + // Manually register ownership of our mods. Using a global route in the Shortcut() calls instead would probably be correct but may have more side-effects. if (keyboard_next_window || keyboard_prev_window) SetKeyOwnersForKeyChord((g.ConfigNavWindowingKeyNext | g.ConfigNavWindowingKeyPrev) & ImGuiMod_Mask_, owner_id); } @@ -11989,28 +12929,33 @@ static void ImGui::NavUpdateWindowing() } // Keyboard: Press and Release ALT to toggle menu layer - // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. - // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. - if (nav_keyboard_active && IsKeyPressed(ImGuiMod_Alt, ImGuiKeyOwner_None)) - { - g.NavWindowingToggleLayer = true; - g.NavInputSource = ImGuiInputSource_Keyboard; - } + const ImGuiKey windowing_toggle_keys[] = { ImGuiKey_LeftAlt, ImGuiKey_RightAlt }; + for (ImGuiKey windowing_toggle_key : windowing_toggle_keys) + if (nav_keyboard_active && IsKeyPressed(windowing_toggle_key, 0, ImGuiKeyOwner_NoOwner)) + { + g.NavWindowingToggleLayer = true; + g.NavWindowingToggleKey = windowing_toggle_key; + g.NavInputSource = ImGuiInputSource_Keyboard; + break; + } if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard) { // We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370) // We cancel toggling nav layer when other modifiers are pressed. (See #4439) + // - AltGR is Alt+Ctrl on some layout but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). // We cancel toggling nav layer if an owner has claimed the key. - if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_None) == false) + if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper) + g.NavWindowingToggleLayer = false; + if (TestKeyOwner(g.NavWindowingToggleKey, ImGuiKeyOwner_NoOwner) == false || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_NoOwner) == false) g.NavWindowingToggleLayer = false; - // Apply layer toggle on release + // Apply layer toggle on Alt release // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. - if (IsKeyReleased(ImGuiMod_Alt) && g.NavWindowingToggleLayer) + if (IsKeyReleased(g.NavWindowingToggleKey) && g.NavWindowingToggleLayer) if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) apply_toggle_layer = true; - if (!IsKeyDown(ImGuiMod_Alt)) + if (!IsKeyDown(g.NavWindowingToggleKey)) g.NavWindowingToggleLayer = false; } @@ -12028,7 +12973,7 @@ static void ImGui::NavUpdateWindowing() const float move_step = NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); g.NavWindowingAccumDeltaPos += nav_move_dir * move_step; g.NavDisableMouseHover = true; - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaPos); + ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaPos); if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) { ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; @@ -12160,6 +13105,14 @@ void ImGui::ClearDragDrop() memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); } +bool ImGui::BeginTooltipHidden() +{ + ImGuiContext& g = *GImGui; + bool ret = Begin("##Tooltip_Hidden", NULL, ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize); + SetWindowHiddenAndSkipItemsForCurrentFrame(g.CurrentWindow); + return ret; +} + // When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() // If the item has an identifier: // - This assume/require the item to be activated (typically via ButtonBehavior). @@ -12216,7 +13169,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) // Rely on keeping other window->LastItemXXX fields intact. source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect); KeepAliveID(source_id); - bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id); + bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id, g.LastItemData.InFlags); if (is_hovered && g.IO.MouseClicked[mouse_button]) { SetActiveID(source_id, window); @@ -12240,6 +13193,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) source_drag_active = true; } + IM_ASSERT(g.DragDropWithinTarget == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() if (source_drag_active) { if (!g.DragDropActive) @@ -12262,12 +13216,13 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) { // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. - bool ret = BeginTooltip(); + bool ret; + if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) + ret = BeginTooltipHidden(); + else + ret = BeginTooltip(); IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame(). IM_UNUSED(ret); - - if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) - SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow); } if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) @@ -12354,15 +13309,16 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) if (window->SkipItems) return false; - IM_ASSERT(g.DragDropWithinTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() g.DragDropTargetRect = bb; + g.DragDropTargetClipRect = window->ClipRect; // May want to be overriden by user depending on use case? g.DragDropTargetId = id; g.DragDropWithinTarget = true; return true; } // We don't use BeginDragDropTargetCustom() and duplicate its code because: -// 1) we use LastItemRectHoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. +// 1) we use LastItemData's ImGuiItemStatusFlags_HoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. // 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. // Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) bool ImGui::BeginDragDropTarget() @@ -12388,8 +13344,9 @@ bool ImGui::BeginDragDropTarget() if (g.DragDropPayload.SourceId == id) return false; - IM_ASSERT(g.DragDropWithinTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() g.DragDropTargetRect = display_rect; + g.DragDropTargetClipRect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasClipRect) ? g.LastItemData.ClipRect : window->ClipRect; g.DragDropTargetId = id; g.DragDropWithinTarget = true; return true; @@ -12404,7 +13361,6 @@ bool ImGui::IsDragDropPayloadBeingAccepted() const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; ImGuiPayload& payload = g.DragDropPayload; IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? @@ -12428,7 +13384,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop payload.Preview = was_accepted_previously; flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that live for 1 frame) if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) - window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + RenderDragDropTargetRect(r, g.DragDropTargetClipRect); g.DragDropAcceptFrameCount = g.FrameCount; payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() @@ -12439,10 +13395,20 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop return &payload; } -// FIXME-DRAGDROP: Settle on a proper default visuals for drop target. -void ImGui::RenderDragDropTargetRect(const ImRect& bb) +// FIXME-STYLE FIXME-DRAGDROP: Settle on a proper default visuals for drop target. +void ImGui::RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect) { - GetWindowDrawList()->AddRect(bb.Min - ImVec2(3.5f, 3.5f), bb.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImRect bb_display = bb; + bb_display.ClipWith(item_clip_rect); // Clip THEN expand so we have a way to visualize that target is not entirely visible. + bb_display.Expand(3.5f); + bool push_clip_rect = !window->ClipRect.Contains(bb_display); + if (push_clip_rect) + window->DrawList->PushClipRectFullScreen(); + window->DrawList->AddRect(bb_display.Min, bb_display.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + if (push_clip_rect) + window->DrawList->PopClipRect(); } const ImGuiPayload* ImGui::GetDragDropPayload() @@ -12790,9 +13756,9 @@ ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) { ImGuiContext& g = *GImGui; const ImGuiID type_hash = ImHashStr(type_name); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].TypeHash == type_hash) - return &g.SettingsHandlers[handler_n]; + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.TypeHash == type_hash) + return &handler; return NULL; } @@ -12801,9 +13767,9 @@ void ImGui::ClearIniSettings() { ImGuiContext& g = *GImGui; g.SettingsIniData.clear(); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ClearAllFn) - g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ClearAllFn != NULL) + handler.ClearAllFn(&g, &handler); } void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) @@ -12838,9 +13804,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) // Call pre-read handlers // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ReadInitFn) - g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ReadInitFn != NULL) + handler.ReadInitFn(&g, &handler); void* entry_data = NULL; ImGuiSettingsHandler* entry_handler = NULL; @@ -12884,9 +13850,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) memcpy(buf, ini_data, ini_size); // Call post-read handlers - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ApplyAllFn) - g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ApplyAllFn != NULL) + handler.ApplyAllFn(&g, &handler); } void ImGui::SaveIniSettingsToDisk(const char* ini_filename) @@ -12912,11 +13878,8 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) g.SettingsDirtyTimer = 0.0f; g.SettingsIniData.Buf.resize(0); g.SettingsIniData.Buf.push_back(0); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - { - ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n]; - handler->WriteAllFn(&g, handler, &g.SettingsIniData); - } + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + handler.WriteAllFn(&g, &handler, &g.SettingsIniData); if (out_size) *out_size = (size_t)g.SettingsIniData.size(); return g.SettingsIniData.c_str(); @@ -12926,12 +13889,13 @@ ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) { ImGuiContext& g = *GImGui; -#if !IMGUI_DEBUG_INI_SETTINGS - // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() - // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. - if (const char* p = strstr(name, "###")) - name = p; -#endif + if (g.IO.ConfigDebugIniSettings == false) + { + // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() + // Preserve the full string when ConfigDebugVerboseIniSettings is set to make .ini inspection easier. + if (const char* p = strstr(name, "###")) + name = p; + } const size_t name_len = strlen(name); // Allocate chunk @@ -12981,8 +13945,8 @@ void ImGui::ClearWindowSettings(const char* name) static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) { ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) - g.Windows[i]->SettingsOffset = -1; + for (ImGuiWindow* window : g.Windows) + window->SettingsOffset = -1; g.SettingsWindows.clear(); } @@ -13007,6 +13971,7 @@ static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } + else if (sscanf(line, "IsChild=%d", &i) == 1) { settings->IsChild = (i != 0); } } // Apply to existing windows (if any) @@ -13027,9 +13992,8 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl // Gather data from windows that were active during this session // (if a window wasn't opened in this session we preserve its settings) ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; if (window->Flags & ImGuiWindowFlags_NoSavedSettings) continue; @@ -13042,7 +14006,7 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl IM_ASSERT(settings->ID == window->ID); settings->Pos = ImVec2ih(window->Pos); settings->Size = ImVec2ih(window->SizeFull); - + settings->IsChild = (window->Flags & ImGuiWindowFlags_ChildWindow) != 0; settings->Collapsed = window->Collapsed; settings->WantDelete = false; } @@ -13055,9 +14019,18 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl continue; const char* settings_name = settings->GetName(); buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); - buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); - buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); - buf->appendf("Collapsed=%d\n", settings->Collapsed); + if (settings->IsChild) + { + buf->appendf("IsChild=1\n"); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + } + else + { + buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + if (settings->Collapsed) + buf->appendf("Collapsed=1\n"); + } buf->append("\n"); } } @@ -13108,10 +14081,8 @@ static void ImGui::UpdateViewportsNewFrame() main_viewport->Pos = ImVec2(0.0f, 0.0f); main_viewport->Size = g.IO.DisplaySize; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; - // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin; viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax; @@ -13298,7 +14269,7 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeDat //----------------------------------------------------------------------------- // [SECTION] METRICS/DEBUGGER WINDOW //----------------------------------------------------------------------------- -// - RenderViewportThumbnail() [Internal] +// - DebugRenderViewportThumbnail() [Internal] // - RenderViewportsThumbnails() [Internal] // - DebugTextEncoding() // - MetricsHelpMarker() [Internal] @@ -13329,16 +14300,15 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* ImVec2 off = bb.Min - viewport->Pos * scale; float alpha_mul = 1.0f; window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* thumb_window : g.Windows) { - ImGuiWindow* thumb_window = g.Windows[i]; if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) continue; ImRect thumb_r = thumb_window->Rect(); ImRect title_r = thumb_window->TitleBarRect(); - thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); - title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height + thumb_r = ImRect(ImTrunc(off + thumb_r.Min * scale), ImTrunc(off + thumb_r.Max * scale)); + title_r = ImRect(ImTrunc(off + title_r.Min * scale), ImTrunc(off + ImVec2(title_r.Max.x, title_r.Min.y + title_r.GetHeight() * 3.0f) * scale)); // Exaggerate title bar height thumb_r.ClipWithFull(bb); title_r.ClipWithFull(bb); const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); @@ -13348,6 +14318,8 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); } draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); + if (viewport->ID == g.DebugMetricsConfig.HighlightViewportID) + window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); } static void RenderViewportsThumbnails() @@ -13355,16 +14327,14 @@ static void RenderViewportsThumbnails() ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. float SCALE = 1.0f / 8.0f; - ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - bb_full.Add(g.Viewports[n]->GetMainRect()); + ImRect bb_full(g.Viewports[0]->Pos, g.Viewports[0]->Pos + g.Viewports[0]->Size); ImVec2 p = window->DC.CursorPos; ImVec2 off = p - bb_full.Min * SCALE; - for (int n = 0; n < g.Viewports.Size; n++) + + // Draw viewports + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); } @@ -13374,14 +14344,15 @@ static void RenderViewportsThumbnails() // Draw an arbitrary US keyboard layout to visualize translated keys void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list) { - const ImVec2 key_size = ImVec2(35.0f, 35.0f); - const float key_rounding = 3.0f; - const ImVec2 key_face_size = ImVec2(25.0f, 25.0f); - const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f); - const float key_face_rounding = 2.0f; - const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f); + const float scale = ImGui::GetFontSize() / 13.0f; + const ImVec2 key_size = ImVec2(35.0f, 35.0f) * scale; + const float key_rounding = 3.0f * scale; + const ImVec2 key_face_size = ImVec2(25.0f, 25.0f) * scale; + const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f) * scale; + const float key_face_rounding = 2.0f * scale; + const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f) * scale; const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); - const float key_row_offset = 9.0f; + const float key_row_offset = 9.0f * scale; ImVec2 board_min = GetCursorScreenPos(); ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); @@ -13456,11 +14427,40 @@ void ImGui::DebugTextEncoding(const char* str) EndTable(); } +static void DebugFlashStyleColorStop() +{ + ImGuiContext& g = *GImGui; + if (g.DebugFlashStyleColorIdx != ImGuiCol_COUNT) + g.Style.Colors[g.DebugFlashStyleColorIdx] = g.DebugFlashStyleColorBackup; + g.DebugFlashStyleColorIdx = ImGuiCol_COUNT; +} + +// Flash a given style color for some + inhibit modifications of this color via PushStyleColor() calls. +void ImGui::DebugFlashStyleColor(ImGuiCol idx) +{ + ImGuiContext& g = *GImGui; + DebugFlashStyleColorStop(); + g.DebugFlashStyleColorTime = 0.5f; + g.DebugFlashStyleColorIdx = idx; + g.DebugFlashStyleColorBackup = g.Style.Colors[idx]; +} + +void ImGui::UpdateDebugToolFlashStyleColor() +{ + ImGuiContext& g = *GImGui; + if (g.DebugFlashStyleColorTime <= 0.0f) + return; + ColorConvertHSVtoRGB(cosf(g.DebugFlashStyleColorTime * 6.0f) * 0.5f + 0.5f, 0.5f, 0.5f, g.Style.Colors[g.DebugFlashStyleColorIdx].x, g.Style.Colors[g.DebugFlashStyleColorIdx].y, g.Style.Colors[g.DebugFlashStyleColorIdx].z); + g.Style.Colors[g.DebugFlashStyleColorIdx].w = 1.0f; + if ((g.DebugFlashStyleColorTime -= g.IO.DeltaTime) <= 0.0f) + DebugFlashStyleColorStop(); +} + // Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. static void MetricsHelpMarker(const char* desc) { ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) + if (ImGui::BeginItemTooltip()) { ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); ImGui::TextUnformatted(desc); @@ -13472,9 +14472,8 @@ static void MetricsHelpMarker(const char* desc) // [DEBUG] List fonts in a font atlas and display its texture void ImGui::ShowFontAtlas(ImFontAtlas* atlas) { - for (int i = 0; i < atlas->Fonts.Size; i++) + for (ImFont* font : atlas->Fonts) { - ImFont* font = atlas->Fonts[i]; PushID(font); DebugNodeFont(font); PopID(); @@ -13498,8 +14497,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; if (cfg->ShowDebugLog) ShowDebugLogWindow(&cfg->ShowDebugLog); - if (cfg->ShowStackTool) - ShowStackToolWindow(&cfg->ShowStackTool); + if (cfg->ShowIDStackTool) + ShowIDStackToolWindow(&cfg->ShowIDStackTool); if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1) { @@ -13507,11 +14506,14 @@ void ImGui::ShowMetricsWindow(bool* p_open) return; } + // [DEBUG] Clear debug breaks hooks after exactly one cycle. + DebugBreakClearData(); + // Basic info Text("Dear ImGui %s", GetVersion()); Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); - Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations); + Text("%d visible windows, %d current allocations", io.MetricsRenderWindows, g.DebugAllocInfo.TotalAllocCount - g.DebugAllocInfo.TotalFreeCount); //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } Separator(); @@ -13540,8 +14542,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); } else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } - else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate - else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); } // Note: y1/y2 not always accurate + else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); } else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight); } else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } IM_ASSERT(0); @@ -13555,7 +14557,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) else if (rect_type == WRT_InnerRect) { return window->InnerRect; } else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } else if (rect_type == WRT_WorkRect) { return window->WorkRect; } - else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } + else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } IM_ASSERT(0); @@ -13566,34 +14568,24 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Tools if (TreeNode("Tools")) { - bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer"); - SameLine(); - MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); - if (show_encoding_viewer) - { - static char buf[100] = ""; - SetNextItemWidth(-FLT_MIN); - InputText("##Text", buf, IM_ARRAYSIZE(buf)); - if (buf[0] != 0) - DebugTextEncoding(buf); - TreePop(); - } - + // Debug Break features // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. - if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) - DebugStartItemPicker(); + SeparatorTextEx(0, "Debug breaks", NULL, CalcTextSize("(?)").x + g.Style.SeparatorTextPadding.x); SameLine(); MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); + if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) + DebugStartItemPicker(); + Checkbox("Show \"Debug Break\" buttons in other sections (io.ConfigDebugIsDebuggerPresent)", &g.IO.ConfigDebugIsDebuggerPresent); + + SeparatorText("Visualize"); - // Stack Tool is your best friend! Checkbox("Show Debug Log", &cfg->ShowDebugLog); SameLine(); MetricsHelpMarker("You can also call ImGui::ShowDebugLogWindow() from your code."); - // Stack Tool is your best friend! - Checkbox("Show Stack Tool", &cfg->ShowStackTool); + Checkbox("Show ID Stack Tool", &cfg->ShowIDStackTool); SameLine(); - MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code."); + MetricsHelpMarker("You can also call ImGui::ShowIDStackToolWindow() from your code."); Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); @@ -13656,11 +14648,26 @@ void ImGui::ShowMetricsWindow(bool* p_open) Unindent(); } } + Checkbox("Show groups rectangles", &g.DebugShowGroupRects); // Storing in context as this is used by group code and prefers to be in hot-data + + SeparatorText("Validate"); Checkbox("Debug Begin/BeginChild return value", &io.ConfigDebugBeginReturnValueLoop); SameLine(); MetricsHelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running."); + Checkbox("UTF-8 Encoding viewer", &cfg->ShowTextEncodingViewer); + SameLine(); + MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); + if (cfg->ShowTextEncodingViewer) + { + static char buf[64] = ""; + SetNextItemWidth(-FLT_MIN); + InputText("##DebugTextEncodingBuf", buf, IM_ARRAYSIZE(buf)); + if (buf[0] != 0) + DebugTextEncoding(buf); + } + TreePop(); } @@ -13675,9 +14682,9 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! ImVector& temp_buffer = g.WindowsTempSortBuffer; temp_buffer.resize(0); - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) - temp_buffer.push_back(g.Windows[i]); + for (ImGuiWindow* window : g.Windows) + if (window->LastFrameActive + 1 >= g.FrameCount) + temp_buffer.push_back(window); struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); @@ -13689,44 +14696,44 @@ void ImGui::ShowMetricsWindow(bool* p_open) // DrawLists int drawlist_count = 0; - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); + for (ImGuiViewportP* viewport : g.Viewports) + drawlist_count += viewport->DrawDataP.CmdLists.Size; if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) { Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - { - ImGuiViewportP* viewport = g.Viewports[viewport_i]; - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); - } + for (ImGuiViewportP* viewport : g.Viewports) + for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists) + DebugNodeDrawList(NULL, viewport, draw_list, "DrawList"); TreePop(); } // Viewports if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) { - Indent(GetTreeNodeToLabelSpacing()); - RenderViewportsThumbnails(); - Unindent(GetTreeNodeToLabelSpacing()); - for (int i = 0; i < g.Viewports.Size; i++) - DebugNodeViewport(g.Viewports[i]); + SetNextItemOpen(true, ImGuiCond_Once); + if (TreeNode("Windows Minimap")) + { + RenderViewportsThumbnails(); + TreePop(); + } + cfg->HighlightViewportID = 0; + + for (ImGuiViewportP* viewport : g.Viewports) + DebugNodeViewport(viewport); TreePop(); } // Details for Popups if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) { - for (int i = 0; i < g.OpenPopupStack.Size; i++) + for (const ImGuiPopupData& popup_data : g.OpenPopupStack) { // As it's difficult to interact with tree nodes while popups are open, we display everything inline. - const ImGuiPopupData* popup_data = &g.OpenPopupStack[i]; - ImGuiWindow* window = popup_data->Window; - BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'", - popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", - popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); + ImGuiWindow* window = popup_data.Window; + BulletText("PopupID: %08x, Window: '%s' (%s%s), RestoreNavWindow '%s', ParentWindow '%s'", + popup_data.PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", + popup_data.RestoreNavWindow ? popup_data.RestoreNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); } TreePop(); } @@ -13768,6 +14775,13 @@ void ImGui::ShowMetricsWindow(bool* p_open) TreePop(); } + // Details for TypingSelect + if (TreeNode("TypingSelect", "TypingSelect (%d)", g.TypingSelectState.SearchBuffer[0] != 0 ? 1 : 0)) + { + DebugNodeTypingSelectState(&g.TypingSelectState); + TreePop(); + } + // Details for Docking #ifdef IMGUI_HAS_DOCK if (TreeNode("Docking")) @@ -13792,11 +14806,12 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("\"%s\"", g.IO.IniFilename); else TextUnformatted(""); + Checkbox("io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings); Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) { - for (int n = 0; n < g.SettingsHandlers.Size; n++) - BulletText("%s", g.SettingsHandlers[n].TypeName); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + BulletText("\"%s\"", handler.TypeName); TreePop(); } if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) @@ -13824,6 +14839,22 @@ void ImGui::ShowMetricsWindow(bool* p_open) TreePop(); } + // Settings + if (TreeNode("Memory allocations")) + { + ImGuiDebugAllocInfo* info = &g.DebugAllocInfo; + Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount); + if (SmallButton("GC now")) { g.GcCompactAll = true; } + Text("Recent frames with allocations:"); + int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf); + for (int n = buf_size - 1; n >= 0; n--) + { + ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[(info->LastEntriesIdx - n + buf_size) % buf_size]; + BulletText("Frame %06d: %+3d ( %2d malloc, %2d free )%s", entry->FrameCount, entry->AllocCount - entry->FreeCount, entry->AllocCount, entry->FreeCount, (n == 0) ? " (most recent)" : ""); + } + TreePop(); + } + if (TreeNode("Inputs")) { Text("KEYBOARD/GAMEPAD/MOUSE KEYS"); @@ -13834,7 +14865,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) #ifdef IMGUI_DISABLE_OBSOLETE_KEYIO struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; #else - struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key >= 0 && key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array //Text("Legacy raw:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { SameLine(); Text("\"%s\" %d", GetKeyName(key), key); } } #endif Text("Keys down:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); } @@ -13859,6 +14890,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (IsMouseClicked(i)) { SameLine(); Text("b%d (%d)", i, io.MouseClickedCount[i]); } Text("Mouse released:"); for (int i = 0; i < count; i++) if (IsMouseReleased(i)) { SameLine(); Text("b%d", i); } Text("Mouse wheel: %.1f", io.MouseWheel); + Text("MouseStationaryTimer: %.2f", g.MouseStationaryTimer); Text("Mouse source: %s", GetMouseSourceName(io.MouseSource)); Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused Unindent(); @@ -13876,41 +14908,44 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("KEY OWNERS"); { Indent(); - if (BeginListBox("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) - { + if (BeginChild("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings)) for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); - if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner) continue; Text("%s: 0x%08X%s", GetKeyName(key), owner_data->OwnerCurr, owner_data->LockUntilRelease ? " LockUntilRelease" : owner_data->LockThisFrame ? " LockThisFrame" : ""); DebugLocateItemOnHover(owner_data->OwnerCurr); } - EndListBox(); - } + EndChild(); Unindent(); } Text("SHORTCUT ROUTING"); + SameLine(); + MetricsHelpMarker("Declared shortcut routes automatically set key owner when mods matches."); { Indent(); - if (BeginListBox("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) - { + if (BeginChild("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings)) for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; ) { - char key_chord_name[64]; ImGuiKeyRoutingData* routing_data = &rt->Entries[idx]; - GetKeyChordName(key | routing_data->Mods, key_chord_name, IM_ARRAYSIZE(key_chord_name)); - Text("%s: 0x%08X", key_chord_name, routing_data->RoutingCurr); + ImGuiKeyChord key_chord = key | routing_data->Mods; + Text("%s: 0x%08X (scored %d)", GetKeyChordName(key_chord), routing_data->RoutingCurr, routing_data->RoutingCurrScore); DebugLocateItemOnHover(routing_data->RoutingCurr); + if (g.IO.ConfigDebugIsDebuggerPresent) + { + SameLine(); + if (DebugBreakButton("**DebugBreak**", "in SetShortcutRouting() for this KeyChord")) + g.DebugBreakInShortcutRouting = key_chord; + } idx = routing_data->NextEntryIndex; } } - EndListBox(); - } + EndChild(); Text("(ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: 0x%X)", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); Unindent(); } @@ -13934,7 +14969,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); Text("ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: %X", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame - Text("HoverDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverDelayId, g.HoverDelayTimer, g.HoverDelayClearTimer); + Text("HoverItemDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverItemDelayId, g.HoverItemDelayTimer, g.HoverItemDelayClearTimer); Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); DebugLocateItemOnHover(g.DragDropPayload.SourceId); Unindent(); @@ -13945,11 +14980,20 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); DebugLocateItemOnHover(g.NavId); Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource)); + Text("NavLastValidSelectionUserData = %" IM_PRId64 " (0x%" IM_PRIX64 ")", g.NavLastValidSelectionUserData, g.NavLastValidSelectionUserData); Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); Text("NavActivateId/DownId/PressedId: %08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId); Text("NavActivateFlags: %04X", g.NavActivateFlags); Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); + Text("NavFocusRoute[] = "); + for (int path_n = g.NavFocusRoute.Size - 1; path_n >= 0; path_n--) + { + const ImGuiFocusScopeData& focus_scope = g.NavFocusRoute[path_n]; + SameLine(0.0f, 0.0f); + Text("0x%08X/", focus_scope.ID); + SetItemTooltip("In window \"%s\"", FindWindowByID(focus_scope.WindowID)->Name); + } Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); Unindent(); @@ -13959,9 +15003,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Overlay: Display windows Rectangles and Begin Order if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) { - for (int n = 0; n < g.Windows.Size; n++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[n]; if (!window->WasActive) continue; ImDrawList* draw_list = GetForegroundDrawList(window); @@ -14018,21 +15061,90 @@ void ImGui::ShowMetricsWindow(bool* p_open) End(); } +void ImGui::DebugBreakClearData() +{ + // Those fields are scattered in their respective subsystem to stay in hot-data locations + ImGuiContext& g = *GImGui; + g.DebugBreakInWindow = 0; + g.DebugBreakInTable = 0; + g.DebugBreakInShortcutRouting = ImGuiKey_None; +} + +void ImGui::DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location) +{ + if (!BeginItemTooltip()) + return; + Text("To call IM_DEBUG_BREAK() %s:", description_of_location); + Separator(); + TextUnformatted(keyboard_only ? "- Press 'Pause/Break' on keyboard." : "- Press 'Pause/Break' on keyboard.\n- or Click (may alter focus/active id).\n- or navigate using keyboard and press space."); + Separator(); + TextUnformatted("Choose one way that doesn't interfere with what you are trying to debug!\nYou need a debugger attached or this will crash!"); + EndTooltip(); +} + +// Special button that doesn't take focus, doesn't take input owner, and can be activated without a click etc. +// In order to reduce interferences with the contents we are trying to debug into. +bool ImGui::DebugBreakButton(const char* label, const char* description_of_location) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrLineTextBaseOffset); + ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x * 2.0f, label_size.y); + + const ImRect bb(pos, pos + size); + ItemSize(size, 0.0f); + if (!ItemAdd(bb, id)) + return false; + + // WE DO NOT USE ButtonEx() or ButtonBehavior() in order to reduce our side-effects. + bool hovered = ItemHoverable(bb, id, g.CurrentItemFlags); + bool pressed = hovered && (IsKeyChordPressed(g.DebugBreakKeyChord) || IsMouseClicked(0) || g.NavActivateId == id); + DebugBreakButtonTooltip(false, description_of_location); + + ImVec4 col4f = GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImVec4 hsv; + ColorConvertRGBtoHSV(col4f.x, col4f.y, col4f.z, hsv.x, hsv.y, hsv.z); + ColorConvertHSVtoRGB(hsv.x + 0.20f, hsv.y, hsv.z, col4f.x, col4f.y, col4f.z); + + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, GetColorU32(col4f), true, g.Style.FrameRounding); + RenderTextClipped(bb.Min, bb.Max, label, NULL, &label_size, g.Style.ButtonTextAlign, &bb); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + // [DEBUG] Display contents of Columns void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) { if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) return; BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); - for (int column_n = 0; column_n < columns->Columns.Size; column_n++) - BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); + for (ImGuiOldColumnData& column : columns->Columns) + BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", (int)columns->Columns.index_from_ptr(&column), column.OffsetNorm, GetColumnOffsetFromNorm(columns, column.OffsetNorm)); TreePop(); } +static void FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id) +{ + union { void* ptr; int integer; } tex_id_opaque; + memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id))); + if (sizeof(tex_id) >= sizeof(void*)) + ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr); + else + ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer); +} + // [DEBUG] Display contents of ImDrawList -void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) +void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label) { ImGuiContext& g = *GImGui; + IM_UNUSED(viewport); // Used in docking branch ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; int cmd_count = draw_list->CmdBuffer.Size; if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) @@ -14064,10 +15176,11 @@ void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, continue; } + char texid_desc[20]; + FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), pcmd->TextureId); char buf[300]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", - pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, - pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); + ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex %s, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", + pcmd->ElemCount / 3, texid_desc, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); @@ -14147,8 +15260,8 @@ void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, co // Draw bounding boxes if (show_aabb) { - out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU - out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles + out_draw_list->AddRect(ImTrunc(clip_rect.Min), ImTrunc(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU + out_draw_list->AddRect(ImTrunc(vtxs_rect.Min), ImTrunc(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles } out_draw_list->Flags = backup_flags; } @@ -14173,7 +15286,7 @@ void ImGui::DebugNodeFont(ImFont* font) SetNextItemWidth(GetFontSize() * 8); DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); SameLine(); MetricsHelpMarker( - "Note than the default embedded font is NOT meant to be scaled.\n\n" + "Note that the default embedded font is NOT meant to be scaled.\n\n" "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " "You may oversample them to get some flexibility with scaling. " "You can also render at multiple sizes and select which one to use at runtime.\n\n" @@ -14259,11 +15372,8 @@ void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) { if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) return; - for (int n = 0; n < storage->Data.Size; n++) - { - const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; + for (const ImGuiStorage::ImGuiStoragePair& p : storage->Data) BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. - } TreePop(); } @@ -14310,8 +15420,12 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) { + ImGuiContext& g = *GImGui; SetNextItemOpen(true, ImGuiCond_Once); - if (TreeNode("viewport0", "Viewport #%d", 0)) + bool open = TreeNode("viewport0", "Viewport #%d", 0); + if (IsItemHovered()) + g.DebugMetricsConfig.HighlightViewportID = viewport->ID; + if (open) { ImGuiWindowFlags flags = viewport->Flags; BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", @@ -14321,9 +15435,8 @@ void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists) + DebugNodeDrawList(NULL, viewport, draw_list, "DrawList"); TreePop(); } } @@ -14350,8 +15463,11 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) if (window->MemoryCompacted) TextDisabled("Note: some memory buffers have been compacted/freed."); + if (g.IO.ConfigDebugIsDebuggerPresent && DebugBreakButton("**DebugBreak**", "in Begin()")) + g.DebugBreakInWindow = window->ID; + ImGuiWindowFlags flags = window->Flags; - DebugNodeDrawList(window, window->DrawList, "DrawList"); + DebugNodeDrawList(window, window->Viewport, window->DrawList, "DrawList"); BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", @@ -14373,13 +15489,14 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++) BulletText("NavPreferredScoringPosRel[%d] = {%.1f,%.1f)", layer, (pr[layer].x == FLT_MAX ? -99999.0f : pr[layer].x), (pr[layer].y == FLT_MAX ? -99999.0f : pr[layer].y)); // Display as 99999.0f so it looks neater. BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); - if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } - if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } - if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } + if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } + if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } + if (window->ParentWindowForFocusRoute != NULL) { DebugNodeWindow(window->ParentWindowForFocusRoute, "ParentWindowForFocusRoute"); } + if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) { - for (int n = 0; n < window->ColumnsStorage.Size; n++) - DebugNodeColumns(&window->ColumnsStorage[n]); + for (ImGuiOldColumns& columns : window->ColumnsStorage) + DebugNodeColumns(&columns); TreePop(); } DebugNodeStorage(&window->StateStorage, "Storage"); @@ -14445,9 +15562,36 @@ void ImGui::DebugLogV(const char* fmt, va_list args) const int old_size = g.DebugLogBuf.size(); g.DebugLogBuf.appendf("[%05d] ", g.FrameCount); g.DebugLogBuf.appendfv(fmt, args); + g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size()); if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY) IMGUI_DEBUG_PRINTF("%s", g.DebugLogBuf.begin() + old_size); - g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size()); +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTestEngine) + IMGUI_TEST_ENGINE_LOG("%s", g.DebugLogBuf.begin() + old_size); +#endif +} + +// FIXME-LAYOUT: To be done automatically via layout mode once we rework ItemSize/ItemAdd into ItemLayout. +static void SameLineOrWrap(const ImVec2& size) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 pos(window->DC.CursorPosPrevLine.x + g.Style.ItemSpacing.x, window->DC.CursorPosPrevLine.y); + if (window->ClipRect.Contains(ImRect(pos, pos + size))) + ImGui::SameLine(); +} + +static void ShowDebugLogFlag(const char* name, ImGuiDebugLogFlags flags) +{ + ImGuiContext& g = *GImGui; + ImVec2 size(ImGui::GetFrameHeight() + g.Style.ItemInnerSpacing.x + ImGui::CalcTextSize(name).x, ImGui::GetFrameHeight()); + SameLineOrWrap(size); // FIXME-LAYOUT: To be done automatically once we rework ItemSize/ItemAdd into ItemLayout. + if (ImGui::CheckboxFlags(name, &g.DebugLogFlags, flags) && g.IO.KeyShift && (g.DebugLogFlags & flags) != 0) + { + g.DebugLogAutoDisableFrames = 2; + g.DebugLogAutoDisableFlags |= flags; + } + ImGui::SetItemTooltip("Hold SHIFT when clicking to enable for 2 frames only (useful for spammy log entries)"); } void ImGui::ShowDebugLogWindow(bool* p_open) @@ -14461,14 +15605,18 @@ void ImGui::ShowDebugLogWindow(bool* p_open) return; } - CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_); - SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId); - SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus); - SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup); - SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav); - SameLine(); if (CheckboxFlags("Clipper", &g.DebugLogFlags, ImGuiDebugLogFlags_EventClipper)) { g.DebugLogClipperAutoDisableFrames = 2; } if (IsItemHovered()) SetTooltip("Clipper log auto-disabled after 2 frames"); - //SameLine(); CheckboxFlags("Selection", &g.DebugLogFlags, ImGuiDebugLogFlags_EventSelection); - SameLine(); CheckboxFlags("IO", &g.DebugLogFlags, ImGuiDebugLogFlags_EventIO); + ImGuiDebugLogFlags all_enable_flags = ImGuiDebugLogFlags_EventMask_ & ~ImGuiDebugLogFlags_EventInputRouting; + CheckboxFlags("All", &g.DebugLogFlags, all_enable_flags); + SetItemTooltip("(except InputRouting which is spammy)"); + + ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId); + ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper); + ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus); + ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO); + ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav); + ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup); + //ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection); + ShowDebugLogFlag("InputRouting", ImGuiDebugLogFlags_EventInputRouting); if (SmallButton("Clear")) { @@ -14478,7 +15626,10 @@ void ImGui::ShowDebugLogWindow(bool* p_open) SameLine(); if (SmallButton("Copy")) SetClipboardText(g.DebugLogBuf.c_str()); - BeginChild("##log", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); + BeginChild("##log", ImVec2(0.0f, 0.0f), ImGuiChildFlags_Border, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); + + const ImGuiDebugLogFlags backup_log_flags = g.DebugLogFlags; + g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper; ImGuiListClipper clipper; clipper.Begin(g.DebugLogIndex.size()); @@ -14487,10 +15638,10 @@ void ImGui::ShowDebugLogWindow(bool* p_open) { const char* line_begin = g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no); const char* line_end = g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no); - TextUnformatted(line_begin, line_end); + TextUnformatted(line_begin, line_end); // Display line ImRect text_rect = g.LastItemData.Rect; if (IsItemHovered()) - for (const char* p = line_begin; p <= line_end - 10; p++) + for (const char* p = line_begin; p <= line_end - 10; p++) // Search for 0x???????? identifiers { ImGuiID id = 0; if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1) @@ -14503,6 +15654,7 @@ void ImGui::ShowDebugLogWindow(bool* p_open) p += 10; } } + g.DebugLogFlags = backup_log_flags; if (GetScrollY() >= GetScrollMaxY()) SetScrollHereY(1.0f); EndChild(); @@ -14511,9 +15663,41 @@ void ImGui::ShowDebugLogWindow(bool* p_open) } //----------------------------------------------------------------------------- -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL) //----------------------------------------------------------------------------- +// Draw a small cross at current CursorPos in current window's DrawList +void ImGui::DebugDrawCursorPos(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 pos = window->DC.CursorPos; + window->DrawList->AddLine(ImVec2(pos.x, pos.y - 3.0f), ImVec2(pos.x, pos.y + 4.0f), col, 1.0f); + window->DrawList->AddLine(ImVec2(pos.x - 3.0f, pos.y), ImVec2(pos.x + 4.0f, pos.y), col, 1.0f); +} + +// Draw a 10px wide rectangle around CurposPos.x using Line Y1/Y2 in current window's DrawList +void ImGui::DebugDrawLineExtents(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float curr_x = window->DC.CursorPos.x; + float line_y1 = (window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y); + float line_y2 = line_y1 + (window->DC.IsSameLine ? window->DC.PrevLineSize.y : window->DC.CurrLineSize.y); + window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y1), ImVec2(curr_x + 5.0f, line_y1), col, 1.0f); + window->DrawList->AddLine(ImVec2(curr_x - 0.5f, line_y1), ImVec2(curr_x - 0.5f, line_y2), col, 1.0f); + window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y2), ImVec2(curr_x + 5.0f, line_y2), col, 1.0f); +} + +// Draw last item rect in ForegroundDrawList (so it is always visible) +void ImGui::DebugDrawItemRect(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); +} + +// [DEBUG] Locate item position/rectangle given an ID. static const ImU32 DEBUG_LOCATE_ITEM_COLOR = IM_COL32(0, 255, 0, 255); // Green void ImGui::DebugLocateItem(ImGuiID target_id) @@ -14521,8 +15705,10 @@ void ImGui::DebugLocateItem(ImGuiID target_id) ImGuiContext& g = *GImGui; g.DebugLocateId = target_id; g.DebugLocateFrames = 2; + g.DebugBreakInLocateId = false; } +// FIXME: Doesn't work over through a modal window, because they clear HoveredWindow. void ImGui::DebugLocateItemOnHover(ImGuiID target_id) { if (target_id == 0 || !IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenBlockedByPopup)) @@ -14530,11 +15716,24 @@ void ImGui::DebugLocateItemOnHover(ImGuiID target_id) ImGuiContext& g = *GImGui; DebugLocateItem(target_id); GetForegroundDrawList(g.CurrentWindow)->AddRect(g.LastItemData.Rect.Min - ImVec2(3.0f, 3.0f), g.LastItemData.Rect.Max + ImVec2(3.0f, 3.0f), DEBUG_LOCATE_ITEM_COLOR); + + // Can't easily use a context menu here because it will mess with focus, active id etc. + if (g.IO.ConfigDebugIsDebuggerPresent && g.MouseStationaryTimer > 1.0f) + { + DebugBreakButtonTooltip(false, "in ItemAdd()"); + if (IsKeyChordPressed(g.DebugBreakKeyChord)) + g.DebugBreakInLocateId = true; + } } void ImGui::DebugLocateItemResolveWithLastItem() { ImGuiContext& g = *GImGui; + + // [DEBUG] Debug break requested by user + if (g.DebugBreakInLocateId) + IM_DEBUG_BREAK(); + ImGuiLastItemData item_data = g.LastItemData; g.DebugLocateId = 0; ImDrawList* draw_list = GetForegroundDrawList(g.CurrentWindow); @@ -14546,6 +15745,12 @@ void ImGui::DebugLocateItemResolveWithLastItem() draw_list->AddLine(p1, p2, DEBUG_LOCATE_ITEM_COLOR); } +void ImGui::DebugStartItemPicker() +{ + ImGuiContext& g = *GImGui; + g.DebugItemPickerActive = true; +} + // [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. void ImGui::UpdateDebugToolItemPicker() { @@ -14580,13 +15785,13 @@ void ImGui::UpdateDebugToolItemPicker() EndTooltip(); } -// [DEBUG] Stack Tool: update queries. Called by NewFrame() +// [DEBUG] ID Stack Tool: update queries. Called by NewFrame() void ImGui::UpdateDebugToolStackQueries() { ImGuiContext& g = *GImGui; - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; - // Clear hook when stack tool is not visible + // Clear hook when id stack tool is not visible g.DebugHookIdInfo = 0; if (g.FrameCount != tool->LastActiveFrame + 1) return; @@ -14620,12 +15825,12 @@ void ImGui::UpdateDebugToolStackQueries() } } -// [DEBUG] Stack tool: hooks called by GetID() family functions +// [DEBUG] ID Stack tool: hooks called by GetID() family functions void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; // Step 0: stack query // This assumes that the ID was computed with the current ID stack, which tends to be the case for our widget. @@ -14668,7 +15873,7 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat info->DataType = data_type; } -static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) +static int StackToolFormatLevelInfo(ImGuiIDStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) { ImGuiStackLevelInfo* info = &tool->Results[n]; ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL; @@ -14685,20 +15890,20 @@ static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for return ImFormatString(buf, buf_size, "???"); } -// Stack Tool: Display UI -void ImGui::ShowStackToolWindow(bool* p_open) +// ID Stack Tool: Display UI +void ImGui::ShowIDStackToolWindow(bool* p_open) { ImGuiContext& g = *GImGui; if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver); - if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) + if (!Begin("Dear ImGui ID Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) { End(); return; } // Display hovered/active status - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; const ImGuiID hovered_id = g.HoveredIdPreviousFrame; const ImGuiID active_id = g.ActiveId; #ifdef IMGUI_ENABLE_TEST_ENGINE @@ -14714,7 +15919,7 @@ void ImGui::ShowStackToolWindow(bool* p_open) Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC); SameLine(); TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*"); - if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiMod_Ctrl) && IsKeyPressed(ImGuiKey_C)) + if (tool->CopyToClipboardOnCtrlC && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused)) { tool->CopyToClipboardLastTime = (float)g.Time; char* p = g.TempBuffer.Data; @@ -14767,7 +15972,7 @@ void ImGui::ShowStackToolWindow(bool* p_open) void ImGui::ShowMetricsWindow(bool*) {} void ImGui::ShowFontAtlas(ImFontAtlas*) {} void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} -void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} +void ImGui::DebugNodeDrawList(ImGuiWindow*, ImGuiViewportP*, const ImDrawList*, const char*) {} void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} void ImGui::DebugNodeFont(ImFont*) {} void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} @@ -14780,10 +15985,9 @@ void ImGui::DebugNodeViewport(ImGuiViewportP*) {} void ImGui::DebugLog(const char*, ...) {} void ImGui::DebugLogV(const char*, va_list) {} void ImGui::ShowDebugLogWindow(bool*) {} -void ImGui::ShowStackToolWindow(bool*) {} +void ImGui::ShowIDStackToolWindow(bool*) {} +void ImGui::DebugStartItemPicker() {} void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {} -void ImGui::UpdateDebugToolItemPicker() {} -void ImGui::UpdateDebugToolStackQueries() {} #endif // #ifndef IMGUI_DISABLE_DEBUG_TOOLS diff --git a/extern/src/imgui/imgui.h b/extern/src/imgui/imgui.h index 8da4ea1b..572cae80 100644 --- a/extern/src/imgui/imgui.h +++ b/extern/src/imgui/imgui.h @@ -1,29 +1,34 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (headers) // Help: -// - Read FAQ at http://dearimgui.com/faq -// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - See links below. // - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. +// - Read top of imgui.cpp for more details, links and comments. // Resources: -// - FAQ http://dearimgui.com/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/6478 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues +// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md) +// - Homepage ................... https://github.com/ocornut/imgui +// - Releases & changelog ....... https://github.com/ocornut/imgui/releases +// - Gallery .................... https://github.com/ocornut/imgui/issues/7503 (please post your screenshots/video there!) +// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code) +// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more) +// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools +// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui +// - Issues & support ........... https://github.com/ocornut/imgui/issues +// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps) -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// For first-time users having issues compiling/linking/running/loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there. // Library Version // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345') -#define IMGUI_VERSION "1.89.6" -#define IMGUI_VERSION_NUM 18960 +#define IMGUI_VERSION "1.90.7" +#define IMGUI_VERSION_NUM 19070 #define IMGUI_HAS_TABLE /* @@ -33,10 +38,11 @@ Index of this file: // [SECTION] Forward declarations and basic types // [SECTION] Dear ImGui end-user API functions // [SECTION] Flags & Enumerations +// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) // [SECTION] Helpers: Memory allocations macros, ImVector<> // [SECTION] ImGuiStyle // [SECTION] ImGuiIO -// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload) // [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) // [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) // [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) @@ -49,7 +55,7 @@ Index of this file: #pragma once // Configuration file with compile-time options -// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') +// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system) #ifdef IMGUI_USER_CONFIG #include IMGUI_USER_CONFIG #endif @@ -69,7 +75,7 @@ Index of this file: // Define attributes of all API symbols declarations (e.g. for DLL under Windows) // IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) -// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) +// Using dear imgui via a shared library is not recommended: we don't guarantee backward nor forward ABI compatibility + this is a call-heavy library and function call overhead adds up. #ifndef IMGUI_API #define IMGUI_API #endif @@ -84,10 +90,13 @@ Index of this file: #endif #define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! #define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. -#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 + +// Check that version and structures layouts are matching between compiled imgui code and caller. Read comments above DebugCheckVersionAndDataLayout() for details. #define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) // Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. +// (MSVC provides an equivalent mechanism via SAL Annotations but it would require the macros in a different +// location. e.g. #include + void myprintf(_Printf_format_string_ const char* format, ...)) #if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__) #define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) #define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) @@ -115,10 +124,15 @@ Index of this file: #endif #if defined(__clang__) #pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wold-style-cast" -#if __has_warning("-Wzero-as-null-pointer-constant") -#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' #endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -164,8 +178,9 @@ struct ImGuiViewport; // A Platform Window (always only one in 'ma // Enumerations // - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration) // - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value) enum ImGuiMouseSource : int; // -> enum ImGuiMouseSource // Enum; A mouse input source identifier (Mouse, TouchScreen, Pen) typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling @@ -178,23 +193,26 @@ typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() -// Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file) +// Flags (declared as int to allow using as flags without overhead, and to not pollute the top of this file) // - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() +typedef int ImGuiChildFlags; // -> enum ImGuiChildFlags_ // Flags: for BeginChild() typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. +typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for Shortcut(), SetNextItemShortcut() typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() -typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for storage only for now: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values. +typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for IsKeyChordPressed(), Shortcut() etc. an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values. typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. @@ -234,8 +252,8 @@ typedef unsigned long long ImU64; // 64-bit unsigned integer // Character types // (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) -typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. +typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. #ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] typedef ImWchar32 ImWchar; #else @@ -250,6 +268,7 @@ typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type] // This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type. +// Add '#define IMGUI_DEFINE_MATH_OPERATORS' in your imconfig.h file to benefit from courtesy maths operators for those types. IM_MSVC_RUNTIME_CHECKS_OFF struct ImVec2 { @@ -293,7 +312,7 @@ namespace ImGui // Main IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) - IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! + IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleColor(), PushStyleVar() to modify style mid-frame! IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). @@ -303,7 +322,7 @@ namespace ImGui IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. IMGUI_API void ShowDebugLogWindow(bool* p_open = NULL); // create Debug Log window. display a simplified log of important dear imgui events. - IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. + IMGUI_API void ShowIDStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. @@ -324,23 +343,33 @@ namespace ImGui // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions + // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding + // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] // - Note that the bottom of window stack always contains a window called "Debug". IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); IMGUI_API void End(); // Child Windows // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. - // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). - // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. - // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] - IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); - IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + // - Before 1.90 (November 2023), the "ImGuiChildFlags child_flags = 0" parameter was "bool border = false". + // This API is backward compatible with old code, as we guarantee that ImGuiChildFlags_Border == true. + // Consider updating your old code: + // BeginChild("Name", size, false) -> Begin("Name", size, 0); or Begin("Name", size, ImGuiChildFlags_None); + // BeginChild("Name", size, true) -> Begin("Name", size, ImGuiChildFlags_Border); + // - Manual sizing (each axis can use a different setting e.g. ImVec2(0.0f, 400.0f)): + // == 0.0f: use remaining parent window size for this axis. + // > 0.0f: use specified size for this axis. + // < 0.0f: right/bottom-align to specified distance from available content boundaries. + // - Specifying ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY makes the sizing automatic based on child contents. + // Combining both ImGuiChildFlags_AutoResizeX _and_ ImGuiChildFlags_AutoResizeY defeats purpose of a scrolling region and is NOT recommended. + // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting + // anything to the window. Always call a matching EndChild() for each BeginChild() call, regardless of its return value. + // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions + // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding + // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0); + IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0); IMGUI_API void EndChild(); // Windows Utilities @@ -348,10 +377,10 @@ namespace ImGui IMGUI_API bool IsWindowAppearing(); IMGUI_API bool IsWindowCollapsed(); IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. - IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ! + IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options. IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives - IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API) - IMGUI_API ImVec2 GetWindowSize(); // get current window size + IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (note: it is unlikely you need to use this. Consider using current layout pos instead, GetCursorScreenPos()) + IMGUI_API ImVec2 GetWindowSize(); // get current window size (note: it is unlikely you need to use this. Consider using GetCursorScreenPos() and e.g. GetContentRegionAvail() instead) IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x) IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) @@ -359,7 +388,7 @@ namespace ImGui // - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() - IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. + IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use 0.0f or FLT_MAX if you don't want limits. Use -1 for both min and max of same axis to preserve current size (which itself is a constraint). Use callback to apply non-trivial programmatic constraints. IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() @@ -426,16 +455,28 @@ namespace ImGui IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList - IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(ImU32 col, float alpha_mul = 1.0f); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. - // Cursor / Layout + // Layout cursor positioning // - By "cursor" we mean the current output position. // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: - // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() - // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. + // - Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. -> this is the preferred way forward. + // - Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() + // - GetCursorScreenPos() = GetCursorPos() + GetWindowPos(). GetWindowPos() is almost only ever useful to convert from window-local to absolute coordinates. + IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (prefer using this, also more useful to work with ImDrawList API). + IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates + IMGUI_API ImVec2 GetCursorPos(); // [window-local] cursor position in window coordinates (relative to window position) + IMGUI_API float GetCursorPosX(); // [window-local] " + IMGUI_API float GetCursorPosY(); // [window-local] " + IMGUI_API void SetCursorPos(const ImVec2& local_pos); // [window-local] " + IMGUI_API void SetCursorPosX(float local_x); // [window-local] " + IMGUI_API void SetCursorPosY(float local_y); // [window-local] " + IMGUI_API ImVec2 GetCursorStartPos(); // [window-local] initial cursor position, in window coordinates + + // Other layout functions IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in a horizontal-layout context. @@ -445,15 +486,6 @@ namespace ImGui IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 IMGUI_API void BeginGroup(); // lock horizontal starting position IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) - IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) - IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc. - IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList:: - IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system. - IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) - IMGUI_API void SetCursorPosY(float local_y); // - IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates - IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. - IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) IMGUI_API float GetTextLineHeight(); // ~ FontSize IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) @@ -500,7 +532,7 @@ namespace ImGui // - Most widgets return true when the value has been changed or when pressed/selected // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button - IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text + IMGUI_API bool SmallButton(const char* label); // button with (FramePadding.y == 0) to easily embed within text IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape IMGUI_API bool Checkbox(const char* label, bool* v); @@ -513,8 +545,10 @@ namespace ImGui // Widgets: Images // - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples - IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0)); - IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); + // - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above. + // - Note that Image() may add +2.0f to provided size if a border is visible, ImageButton() adds style.FramePadding*2.0f to provided size. + IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0)); + IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Widgets: Combo Box (Dropdown) // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. @@ -523,7 +557,7 @@ namespace ImGui IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" - IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items = -1); // Widgets: Drag Sliders // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. @@ -611,9 +645,9 @@ namespace ImGui IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. + IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushID(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. IMGUI_API void TreePush(const void* ptr_id); // " - IMGUI_API void TreePop(); // ~ Unindent()+PopId() + IMGUI_API void TreePop(); // ~ Unindent()+PopID() IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. @@ -626,22 +660,22 @@ namespace ImGui IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. // Widgets: List Boxes - // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. - // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. + // - This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label. + // - You can submit contents and manage your selection state however you want it, by creating e.g. Selectable() or any other items. // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); - IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); + IMGUI_API bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items = -1); // Widgets: Data Plotting // - Consider using ImPlot (https://github.com/epezent/implot) which is much better! IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); - IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); // Widgets: Value() Helpers. // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) @@ -665,12 +699,22 @@ namespace ImGui IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL // Tooltips - // - Tooltip are windows following the mouse. They do not take focus away. - IMGUI_API bool BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). - IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip() returns true! - IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). + // - Tooltips are windows following the mouse. They do not take focus away. + // - A tooltip window can contain items of any types. + // - SetTooltip() is more or less a shortcut for the 'if (BeginTooltip()) { Text(...); EndTooltip(); }' idiom (with a subtlety that it discard any previously submitted tooltip) + IMGUI_API bool BeginTooltip(); // begin/append a tooltip window. + IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip()/BeginItemTooltip() returns true! + IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip. Often used after a ImGui::IsItemHovered() check. Override any previous call to SetTooltip(). IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + // Tooltips: helpers for showing a tooltip when hovering an item + // - BeginItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip) && BeginTooltip())' idiom. + // - SetItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) { SetTooltip(...); }' idiom. + // - Where 'ImGuiHoveredFlags_ForTooltip' itself is a shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' depending on active input type. For mouse it defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'. + IMGUI_API bool BeginItemTooltip(); // begin/append a tooltip window if preceding item was hovered. + IMGUI_API void SetItemTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip if preceding item was hovered. override any previous call to SetTooltip(). + IMGUI_API void SetItemTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + // Popups, Modals // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. @@ -679,9 +723,7 @@ namespace ImGui // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. // This is sometimes leading to confusing mistakes. May rework this in the future. - - // Popups: begin/end functions - // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. + // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards if returned true. ImGuiWindowFlags are forwarded to the window. // - BeginPopupModal(): block every interaction behind the window, cannot be closed by user, add a dimming background, has a title bar. IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. @@ -731,12 +773,10 @@ namespace ImGui // TableNextColumn() will automatically wrap-around into the next row if needed. // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! // - Summary of possible call flow: - // -------------------------------------------------------------------------------------------------------- - // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK - // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK - // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! - // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! - // -------------------------------------------------------------------------------------------------------- + // - TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK + // - TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK + // - TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! + // - TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! // - 5. Call EndTable() IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! @@ -754,8 +794,9 @@ namespace ImGui // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. - IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) + IMGUI_API void TableHeadersRow(); // submit a row with headers cells based on data provided to TableSetupColumn() + submit context menu + IMGUI_API void TableAngledHeadersRow(); // submit a row with angled headers for every column with the ImGuiTableColumnFlags_AngledHeader flag. MUST BE FIRST ROW. // Tables: Sorting & Miscellaneous functions // - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. @@ -813,7 +854,7 @@ namespace ImGui IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true! - IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. + IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. returns NULL when drag and drop is finished or inactive. use ImGuiPayload::IsDataType() to test for the payload type. // Disabling [BETA API] // - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors) @@ -832,6 +873,9 @@ namespace ImGui IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window. IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. + // Overlapping mode + IMGUI_API void SetNextItemAllowOverlap(); // allow next item to be overlapped by a subsequent item. Useful with invisible buttons, selectable, treenode covering an area where subsequent items may need to be added. Note that both Selectable() and TreeNode() have dedicated flags doing this. + // Item/Widgets Utilities and Query Functions // - Most of the functions are referring to the previous Item that has been submitted. // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. @@ -852,7 +896,6 @@ namespace ImGui IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space) IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space) IMGUI_API ImVec2 GetItemRectSize(); // get size of last item - IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. // Viewports // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. @@ -873,8 +916,6 @@ namespace ImGui IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) IMGUI_API ImGuiStorage* GetStateStorage(); - IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame - IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) // Text Utilities IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); @@ -893,10 +934,29 @@ namespace ImGui IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held. IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)? + IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord); // was key chord (mods + key) pressed, e.g. you can pass 'ImGuiMod_Ctrl | ImGuiKey_S' as a key-chord. This doesn't do any routing or focus check, please consider using Shortcut() function instead. IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared. IMGUI_API void SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard); // Override io.WantCaptureKeyboard flag next frame (said flag is left for your application to handle, typically when true it instructs your app to ignore inputs). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard"; after the next NewFrame() call. + // Inputs Utilities: Shortcut Testing & Routing [BETA] + // - ImGuiKeyChord = a ImGuiKey + optional ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super. + // ImGuiKey_C // Accepted by functions taking ImGuiKey or ImGuiKeyChord arguments) + // ImGuiMod_Ctrl | ImGuiKey_C // Accepted by functions taking ImGuiKeyChord arguments) + // only ImGuiMod_XXX values are legal to combine with an ImGuiKey. You CANNOT combine two ImGuiKey values. + // - The general idea is that several callers may register interest in a shortcut, and only one owner gets it. + // Parent -> call Shortcut(Ctrl+S) // When Parent is focused, Parent gets the shortcut. + // Child1 -> call Shortcut(Ctrl+S) // When Child1 is focused, Child1 gets the shortcut (Child1 overrides Parent shortcuts) + // Child2 -> no call // When Child2 is focused, Parent gets the shortcut. + // The whole system is order independent, so if Child1 makes its calls before Parent, results will be identical. + // This is an important property as it facilitate working with foreign code or larger codebase. + // - To understand the difference: + // - IsKeyChordPressed() compares mods and call IsKeyPressed() -> function has no side-effect. + // - Shortcut() submits a route, routes are resolved, if it currently can be routed it calls IsKeyChordPressed() -> function has (desirable) side-effects as it can prevents another call from getting the route. + // - Visualize registered routes in 'Metrics/Debugger->Inputs'. + IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0); + IMGUI_API void SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0); + // Inputs Utilities: Mouse specific // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. @@ -911,8 +971,8 @@ namespace ImGui IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) - IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) - IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (uses io.MouseDraggingThreshold if lock_threshold < 0.0f) + IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (uses io.MouseDraggingThreshold if lock_threshold < 0.0f) IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired mouse cursor shape. Important: reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired mouse cursor shape @@ -933,7 +993,10 @@ namespace ImGui IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. // Debug Utilities + // - Your main debugging friend is the ShowMetricsWindow() function, which is also accessible from Demo->Tools->Metrics Debugger IMGUI_API void DebugTextEncoding(const char* text); + IMGUI_API void DebugFlashStyleColor(ImGuiCol idx); + IMGUI_API void DebugStartItemPicker(); IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. // Memory Allocators @@ -972,21 +1035,47 @@ enum ImGuiWindowFlags_ ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus) ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) - ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) - ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window - ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) - ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiWindowFlags_NoNavInputs = 1 << 16, // No gamepad/keyboard navigation within the window + ImGuiWindowFlags_NoNavFocus = 1 << 17, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) + ImGuiWindowFlags_UnsavedDocument = 1 << 18, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, // [Internal] - ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. + ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: share focus scope, allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() ImGuiWindowFlags_ChildMenu = 1 << 28, // Don't use! For internal use by BeginMenu() + + // Obsolete names +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 30, // Obsoleted in 1.90: Use ImGuiChildFlags_AlwaysUseWindowPadding in BeginChild() call. +#endif +}; + +// Flags for ImGui::BeginChild() +// (Legacy: bit 0 must always correspond to ImGuiChildFlags_Border to be backward compatible with old API using 'bool border = false'. +// About using AutoResizeX/AutoResizeY flags: +// - May be combined with SetNextWindowSizeConstraints() to set a min/max size for each axis (see "Demo->Child->Auto-resize with Constraints"). +// - Size measurement for a given axis is only performed when the child window is within visible boundaries, or is just appearing. +// - This allows BeginChild() to return false when not within boundaries (e.g. when scrolling), which is more optimal. BUT it won't update its auto-size while clipped. +// While not perfect, it is a better default behavior as the always-on performance gain is more valuable than the occasional "resizing after becoming visible again" glitch. +// - You may also use ImGuiChildFlags_AlwaysAutoResize to force an update even when child window is not in view. +// HOWEVER PLEASE UNDERSTAND THAT DOING SO WILL PREVENT BeginChild() FROM EVER RETURNING FALSE, disabling benefits of coarse clipping. +enum ImGuiChildFlags_ +{ + ImGuiChildFlags_None = 0, + ImGuiChildFlags_Border = 1 << 0, // Show an outer border and enable WindowPadding. (IMPORTANT: this is always == 1 == true for legacy reason) + ImGuiChildFlags_AlwaysUseWindowPadding = 1 << 1, // Pad with style.WindowPadding even if no border are drawn (no padding by default for non-bordered child windows because it makes more sense) + ImGuiChildFlags_ResizeX = 1 << 2, // Allow resize from right border (layout direction). Enable .ini saving (unless ImGuiWindowFlags_NoSavedSettings passed to window flags) + ImGuiChildFlags_ResizeY = 1 << 3, // Allow resize from bottom border (layout direction). " + ImGuiChildFlags_AutoResizeX = 1 << 4, // Enable auto-resizing width. Read "IMPORTANT: Size measurement" details above. + ImGuiChildFlags_AutoResizeY = 1 << 5, // Enable auto-resizing height. Read "IMPORTANT: Size measurement" details above. + ImGuiChildFlags_AlwaysAutoResize = 1 << 6, // Combined with AutoResizeX/AutoResizeY. Always measure size even when child is hidden, always return true, always disable clipping optimization! NOT RECOMMENDED. + ImGuiChildFlags_FrameStyle = 1 << 7, // Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding. }; // Flags for ImGui::InputText() @@ -1026,25 +1115,31 @@ enum ImGuiTreeNodeFlags_ ImGuiTreeNodeFlags_None = 0, ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) - ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one + ImGuiTreeNodeFlags_AllowOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). - ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow + ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow. IMPORTANT: node can still be marked open/close if you don't set the _Leaf flag! ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). - ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. - ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). - ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) - //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible + ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line without using AllowOverlap mode. + ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (cover the indent area). + ImGuiTreeNodeFlags_SpanTextWidth = 1 << 13, // Narrow hit box + narrow hovering highlight, will only cover the label text. + ImGuiTreeNodeFlags_SpanAllColumns = 1 << 14, // Frame will span all columns of its container table (text will still fit in current column) + ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 15, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) + //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 16, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog, + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiTreeNodeFlags_AllowItemOverlap = ImGuiTreeNodeFlags_AllowOverlap, // Renamed in 1.89.7 +#endif }; // Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. -// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat -// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. +// - To be backward compatible with older API which took an 'int mouse_button = 1' argument instead of 'ImGuiPopupFlags flags', +// we need to treat small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. // It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. // - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. // IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter @@ -1058,10 +1153,12 @@ enum ImGuiPopupFlags_ ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) ImGuiPopupFlags_MouseButtonMask_ = 0x1F, ImGuiPopupFlags_MouseButtonDefault_ = 1, - ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack - ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space - ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. - ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) + ImGuiPopupFlags_NoReopen = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't reopen same popup if already open (won't reposition, won't reinitialize navigation) + //ImGuiPopupFlags_NoReopenAlwaysNavInit = 1 << 6, // For OpenPopup*(), BeginPopupContext*(): focus and initialize navigation even when not reopening. + ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 7, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack + ImGuiPopupFlags_NoOpenOverItems = 1 << 8, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space + ImGuiPopupFlags_AnyPopupId = 1 << 10, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. + ImGuiPopupFlags_AnyPopupLevel = 1 << 11, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel, }; @@ -1070,10 +1167,14 @@ enum ImGuiSelectableFlags_ { ImGuiSelectableFlags_None = 0, ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this doesn't close parent popup window - ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) + ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Frame will span all columns of its container table (text will still fit in current column) ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text - ImGuiSelectableFlags_AllowItemOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one + ImGuiSelectableFlags_AllowOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiSelectableFlags_AllowItemOverlap = ImGuiSelectableFlags_AllowOverlap, // Renamed in 1.89.7 +#endif }; // Flags for ImGui::BeginCombo() @@ -1087,6 +1188,7 @@ enum ImGuiComboFlags_ ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button + ImGuiComboFlags_WidthFitPreview = 1 << 7, // Width dynamically calculated from preview contents ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest, }; @@ -1097,7 +1199,7 @@ enum ImGuiTabBarFlags_ ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup - ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit @@ -1110,147 +1212,15 @@ enum ImGuiTabBarFlags_ enum ImGuiTabItemFlags_ { ImGuiTabItemFlags_None = 0, - ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + set ImGuiTabItemFlags_NoAssumedClosure. ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() - ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID()/PopID() on BeginTabItem()/EndTabItem() ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) ImGuiTabItemFlags_Trailing = 1 << 7, // Enforce the tab position to the right of the tab bar (before the scrolling buttons) -}; - -// Flags for ImGui::BeginTable() -// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. -// Read comments/demos carefully + experiment with live demos to get acquainted with them. -// - The DEFAULT sizing policies are: -// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. -// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. -// - When ScrollX is off: -// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. -// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. -// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). -// - Stretch Columns will share the remaining width according to their respective weight. -// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. -// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. -// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). -// - When ScrollX is on: -// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed -// - Columns sizing policy allowed: Fixed/Auto mostly. -// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed. -// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. -// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). -// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. -// - Read on documentation at the top of imgui_tables.cpp for details. -enum ImGuiTableFlags_ -{ - // Features - ImGuiTableFlags_None = 0, - ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. - ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) - ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. - ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. - ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. - ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). - // Decorations - ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) - ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. - ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. - ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. - ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. - ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. - ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. - ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. - ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. - ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. - ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style - ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style - // Sizing Policy (read above for defaults) - ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. - ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. - ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. - ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). - // Sizing Extra Options - ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. - ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. - ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. - ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. - // Clipping - ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). - // Padding - ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers. - ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding. - ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). - // Scrolling - ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX. - ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. - // Sorting - ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). - ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). - - // [Internal] Combinations and masks - ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, -}; - -// Flags for ImGui::TableSetupColumn() -enum ImGuiTableColumnFlags_ -{ - // Input configuration flags - ImGuiTableColumnFlags_None = 0, - ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) - ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. - ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. - ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). - ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). - ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. - ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. - ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. - ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). - ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). - ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. - ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. - ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu. - ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. - ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). - ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. - ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). - ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. - - // Output status flags, read-only via TableGetColumnFlags() - ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. - ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. - ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs - ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse - - // [Internal] Combinations and masks - ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, - ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, - ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, - ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) -}; - -// Flags for ImGui::TableNextRow() -enum ImGuiTableRowFlags_ -{ - ImGuiTableRowFlags_None = 0, - ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) -}; - -// Enum for ImGui::TableSetBgColor() -// Background colors are rendering in 3 layers: -// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. -// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. -// - Layer 2: draw with CellBg color if set. -// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color. -// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. -// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. -// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. -enum ImGuiTableBgTarget_ -{ - ImGuiTableBgTarget_None = 0, - ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) - ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) - ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) + ImGuiTabItemFlags_NoAssumedClosure = 1 << 8, // Tab is selected when trying to close + closure is not immediately assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. }; // Flags for ImGui::IsWindowFocused() @@ -1279,16 +1249,30 @@ enum ImGuiHoveredFlags_ ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. - ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window - ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled - ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse. + ImGuiHoveredFlags_AllowWhenOverlappedByItem = 1 << 8, // IsItemHovered() only: Return true even if the item uses AllowOverlap mode and is overlapped by another hoverable item. + ImGuiHoveredFlags_AllowWhenOverlappedByWindow = 1 << 9, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window. + ImGuiHoveredFlags_AllowWhenDisabled = 1 << 10, // IsItemHovered() only: Return true even if the item is disabled + ImGuiHoveredFlags_NoNavOverride = 1 << 11, // IsItemHovered() only: Disable using gamepad/keyboard navigation state when active, always query mouse + ImGuiHoveredFlags_AllowWhenOverlapped = ImGuiHoveredFlags_AllowWhenOverlappedByItem | ImGuiHoveredFlags_AllowWhenOverlappedByWindow, ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows, - // Hovering delays (for tooltips) - ImGuiHoveredFlags_DelayNormal = 1 << 11, // Return true after io.HoverDelayNormal elapsed (~0.30 sec) - ImGuiHoveredFlags_DelayShort = 1 << 12, // Return true after io.HoverDelayShort elapsed (~0.10 sec) - ImGuiHoveredFlags_NoSharedDelay = 1 << 13, // Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays) + // Tooltips mode + // - typically used in IsItemHovered() + SetTooltip() sequence. + // - this is a shortcut to pull flags from 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' where you can reconfigure desired behavior. + // e.g. 'TooltipHoveredFlagsForMouse' defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'. + // - for frequently actioned or hovered items providing a tooltip, you want may to use ImGuiHoveredFlags_ForTooltip (stationary + delay) so the tooltip doesn't show too often. + // - for items which main purpose is to be hovered, or items with low affordance, or in less consistent apps, prefer no delay or shorter delay. + ImGuiHoveredFlags_ForTooltip = 1 << 12, // Shortcut for standard flags when using IsItemHovered() + SetTooltip() sequence. + + // (Advanced) Mouse Hovering delays. + // - generally you can use ImGuiHoveredFlags_ForTooltip to use application-standardized flags. + // - use those if you need specific overrides. + ImGuiHoveredFlags_Stationary = 1 << 13, // Require mouse to be stationary for style.HoverStationaryDelay (~0.15 sec) _at least one time_. After this, can move on same item/window. Using the stationary test tends to reduces the need for a long delay. + ImGuiHoveredFlags_DelayNone = 1 << 14, // IsItemHovered() only: Return true immediately (default). As this is the default you generally ignore this. + ImGuiHoveredFlags_DelayShort = 1 << 15, // IsItemHovered() only: Return true after style.HoverDelayShort elapsed (~0.15 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item). + ImGuiHoveredFlags_DelayNormal = 1 << 16, // IsItemHovered() only: Return true after style.HoverDelayNormal elapsed (~0.40 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item). + ImGuiHoveredFlags_NoSharedDelay = 1 << 17, // IsItemHovered() only: Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays) }; // Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() @@ -1348,11 +1332,17 @@ enum ImGuiSortDirection_ ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. }; +// Since 1.90, defining IMGUI_DISABLE_OBSOLETE_FUNCTIONS automatically defines IMGUI_DISABLE_OBSOLETE_KEYIO as well. +#if defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && !defined(IMGUI_DISABLE_OBSOLETE_KEYIO) +#define IMGUI_DISABLE_OBSOLETE_KEYIO +#endif + // A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value): can represent Keyboard, Mouse and Gamepad values. // All our named keys are >= 512. Keys value 0 to 511 are left unused as legacy native/opaque key values (< 1.87). // Since >= 1.89 we increased typing (went from int to enum), some legacy code may need a cast to ImGuiKey. // Read details about the 1.87 and 1.89 transition : https://github.com/ocornut/imgui/issues/4921 // Note that "Keys" related to physical keys and are not the same concept as input "Characters", the later are submitted via io.AddInputCharacter(). +// The keyboard key enum values are named after the keys on a standard US keyboard, and on other keyboard types the keys reported may not match the keycaps. enum ImGuiKey : int { // Keyboard @@ -1381,6 +1371,8 @@ enum ImGuiKey : int ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z, ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6, ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12, + ImGuiKey_F13, ImGuiKey_F14, ImGuiKey_F15, ImGuiKey_F16, ImGuiKey_F17, ImGuiKey_F18, + ImGuiKey_F19, ImGuiKey_F20, ImGuiKey_F21, ImGuiKey_F22, ImGuiKey_F23, ImGuiKey_F24, ImGuiKey_Apostrophe, // ' ImGuiKey_Comma, // , ImGuiKey_Minus, // - @@ -1406,6 +1398,8 @@ enum ImGuiKey : int ImGuiKey_KeypadAdd, ImGuiKey_KeypadEnter, ImGuiKey_KeypadEqual, + ImGuiKey_AppBack, // Available on some keyboard/mouses. Often referred as "Browser Back" + ImGuiKey_AppForward, // Gamepad (some of those are analog values, 0.0f to 1.0f) // NAVIGATION ACTION // (download controller mapping PNG/PSD at http://dearimgui.com/controls_sheets) @@ -1450,13 +1444,13 @@ enum ImGuiKey : int // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys. // In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and // backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user... + // - On macOS, we swap Cmd(Super) and Ctrl keys at the time of the io.AddKeyEvent() call. ImGuiMod_None = 0, - ImGuiMod_Ctrl = 1 << 12, // Ctrl + ImGuiMod_Ctrl = 1 << 12, // Ctrl (non-macOS), Cmd (macOS) ImGuiMod_Shift = 1 << 13, // Shift ImGuiMod_Alt = 1 << 14, // Option/Menu - ImGuiMod_Super = 1 << 15, // Cmd/Super/Windows - ImGuiMod_Shortcut = 1 << 11, // Alias for Ctrl (non-macOS) _or_ Super (macOS). - ImGuiMod_Mask_ = 0xF800, // 5-bits + ImGuiMod_Super = 1 << 15, // Windows/Super (non-macOS), Ctrl (macOS) + ImGuiMod_Mask_ = 0xF000, // 4-bits // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + the io.KeyMap[] array. // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE) @@ -1473,11 +1467,37 @@ enum ImGuiKey : int #endif #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiMod_Shortcut = ImGuiMod_Ctrl, // Removed in 1.90.7, you can now simply use ImGuiMod_Ctrl ImGuiKey_ModCtrl = ImGuiMod_Ctrl, ImGuiKey_ModShift = ImGuiMod_Shift, ImGuiKey_ModAlt = ImGuiMod_Alt, ImGuiKey_ModSuper = ImGuiMod_Super, // Renamed in 1.89 - ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 + //ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 #endif }; +// Flags for Shortcut(), SetNextItemShortcut(), +// (and for upcoming extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() that are still in imgui_internal.h) +// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function) +enum ImGuiInputFlags_ +{ + ImGuiInputFlags_None = 0, + ImGuiInputFlags_Repeat = 1 << 0, // Enable repeat. Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. + + // Flags for Shortcut(), SetNextItemShortcut() + // - Routing policies: RouteGlobal+OverActive >> RouteActive or RouteFocused (if owner is active item) >> RouteGlobal+OverFocused >> RouteFocused (if in focused window stack) >> RouteGlobal. + // - Default policy is RouteFocused. Can select only 1 policy among all available. + ImGuiInputFlags_RouteActive = 1 << 10, // Route to active item only. + ImGuiInputFlags_RouteFocused = 1 << 11, // Route to windows in the focus stack (DEFAULT). Deep-most focused window takes inputs. Active item takes inputs over deep-most focused window. + ImGuiInputFlags_RouteGlobal = 1 << 12, // Global route (unless a focused window or active item registered the route). + ImGuiInputFlags_RouteAlways = 1 << 13, // Do not register route, poll keys directly. + // - Routing options + ImGuiInputFlags_RouteOverFocused = 1 << 14, // Option: global route: higher priority than focused route (unless active item in focused route). + ImGuiInputFlags_RouteOverActive = 1 << 15, // Option: global route: higher priority than active item. Unlikely you need to use that: will interfere with every active items, e.g. CTRL+A registered by InputText will be overridden by this. May not be fully honored as user/internal code is likely to always assume they can access keys when active. + ImGuiInputFlags_RouteUnlessBgFocused = 1 << 16, // Option: global route: will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications. + ImGuiInputFlags_RouteFromRootWindow = 1 << 17, // Option: route evaluated from the point of view of root window rather than current window. + + // Flags for SetNextItemShortcut() + ImGuiInputFlags_Tooltip = 1 << 18, // Automatically display a tooltip when hovering item [BETA] Unsure of right api (opt-in/opt-out) +}; + #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO // OBSOLETED in 1.88 (from July 2022): ImGuiNavInput and io.NavInputs[]. // Official backends between 1.60 and 1.86: will keep working and feed gamepad inputs as long as IMGUI_DISABLE_OBSOLETE_KEYIO is not set. @@ -1529,15 +1549,15 @@ enum ImGuiCol_ ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive, - ImGuiCol_TitleBg, - ImGuiCol_TitleBgActive, - ImGuiCol_TitleBgCollapsed, + ImGuiCol_TitleBg, // Title bar + ImGuiCol_TitleBgActive, // Title bar when focused + ImGuiCol_TitleBgCollapsed, // Title bar when collapsed ImGuiCol_MenuBarBg, ImGuiCol_ScrollbarBg, ImGuiCol_ScrollbarGrab, ImGuiCol_ScrollbarGrabHovered, ImGuiCol_ScrollbarGrabActive, - ImGuiCol_CheckMark, + ImGuiCol_CheckMark, // Checkbox tick and RadioButton circle ImGuiCol_SliderGrab, ImGuiCol_SliderGrabActive, ImGuiCol_Button, @@ -1579,40 +1599,45 @@ enum ImGuiCol_ // - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. // During initialization or between frames, feel free to just poke into ImGuiStyle directly. // - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. // - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. enum ImGuiStyleVar_ { - // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) - ImGuiStyleVar_Alpha, // float Alpha - ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha - ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding - ImGuiStyleVar_WindowRounding, // float WindowRounding - ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize - ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize - ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign - ImGuiStyleVar_ChildRounding, // float ChildRounding - ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize - ImGuiStyleVar_PopupRounding, // float PopupRounding - ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize - ImGuiStyleVar_FramePadding, // ImVec2 FramePadding - ImGuiStyleVar_FrameRounding, // float FrameRounding - ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize - ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing - ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing - ImGuiStyleVar_IndentSpacing, // float IndentSpacing - ImGuiStyleVar_CellPadding, // ImVec2 CellPadding - ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize - ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding - ImGuiStyleVar_GrabMinSize, // float GrabMinSize - ImGuiStyleVar_GrabRounding, // float GrabRounding - ImGuiStyleVar_TabRounding, // float TabRounding - ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign - ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign - ImGuiStyleVar_SeparatorTextBorderSize,// float SeparatorTextBorderSize - ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign - ImGuiStyleVar_SeparatorTextPadding,// ImVec2 SeparatorTextPadding + // Enum name -------------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) + ImGuiStyleVar_Alpha, // float Alpha + ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha + ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding + ImGuiStyleVar_WindowRounding, // float WindowRounding + ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize + ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize + ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign + ImGuiStyleVar_ChildRounding, // float ChildRounding + ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize + ImGuiStyleVar_PopupRounding, // float PopupRounding + ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize + ImGuiStyleVar_FramePadding, // ImVec2 FramePadding + ImGuiStyleVar_FrameRounding, // float FrameRounding + ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize + ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing + ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing + ImGuiStyleVar_IndentSpacing, // float IndentSpacing + ImGuiStyleVar_CellPadding, // ImVec2 CellPadding + ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize + ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding + ImGuiStyleVar_GrabMinSize, // float GrabMinSize + ImGuiStyleVar_GrabRounding, // float GrabRounding + ImGuiStyleVar_TabRounding, // float TabRounding + ImGuiStyleVar_TabBorderSize, // float TabBorderSize + ImGuiStyleVar_TabBarBorderSize, // float TabBarBorderSize + ImGuiStyleVar_TableAngledHeadersAngle, // float TableAngledHeadersAngle + ImGuiStyleVar_TableAngledHeadersTextAlign,// ImVec2 TableAngledHeadersTextAlign + ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign + ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign + ImGuiStyleVar_SeparatorTextBorderSize, // float SeparatorTextBorderSize + ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign + ImGuiStyleVar_SeparatorTextPadding, // ImVec2 SeparatorTextPadding ImGuiStyleVar_COUNT }; @@ -1728,7 +1753,7 @@ enum ImGuiMouseSource : int ImGuiMouseSource_COUNT }; -// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions +// Enumeration for ImGui::SetNextWindow***(), SetWindow***(), SetNextItem***() functions // Represent a condition. // Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. enum ImGuiCond_ @@ -1740,6 +1765,170 @@ enum ImGuiCond_ ImGuiCond_Appearing = 1 << 3, // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) }; +//----------------------------------------------------------------------------- +// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +//----------------------------------------------------------------------------- + +// Flags for ImGui::BeginTable() +// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. +// Read comments/demos carefully + experiment with live demos to get acquainted with them. +// - The DEFAULT sizing policies are: +// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. +// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. +// - When ScrollX is off: +// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. +// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. +// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). +// - Stretch Columns will share the remaining width according to their respective weight. +// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. +// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). +// - When ScrollX is on: +// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed +// - Columns sizing policy allowed: Fixed/Auto mostly. +// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed. +// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. +// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). +// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. +// - Read on documentation at the top of imgui_tables.cpp for details. +enum ImGuiTableFlags_ +{ + // Features + ImGuiTableFlags_None = 0, + ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. + ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) + ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. + ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. + ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. + ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). + // Decorations + ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) + ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. + ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. + ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. + ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. + ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. + ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. + ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. + ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. + ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. + ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style + ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style + // Sizing Policy (read above for defaults) + ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. + ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. + ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. + ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). + // Sizing Extra Options + ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. + ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. + ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. + ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. + // Clipping + ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). + // Padding + ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers. + ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding. + ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). + // Scrolling + ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX. + ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. + // Sorting + ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). + ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). + // Miscellaneous + ImGuiTableFlags_HighlightHoveredColumn = 1 << 28, // Highlight column headers when hovered (may evolve into a fuller highlight) + + // [Internal] Combinations and masks + ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, +}; + +// Flags for ImGui::TableSetupColumn() +enum ImGuiTableColumnFlags_ +{ + // Input configuration flags + ImGuiTableColumnFlags_None = 0, + ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) + ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. + ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. + ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). + ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). + ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. + ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. + ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. + ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). + ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). + ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. + ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. + ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit horizontal label for this column. Convenient for some small columns. Name will still appear in context menu or in angled headers. + ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. + ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). + ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. + ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). + ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. + ImGuiTableColumnFlags_AngledHeader = 1 << 18, // TableHeadersRow() will submit an angled header row for this column. Note this will add an extra row. + + // Output status flags, read-only via TableGetColumnFlags() + ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. + ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. + ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs + ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse + + // [Internal] Combinations and masks + ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, + ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, + ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, + ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) +}; + +// Flags for ImGui::TableNextRow() +enum ImGuiTableRowFlags_ +{ + ImGuiTableRowFlags_None = 0, + ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) +}; + +// Enum for ImGui::TableSetBgColor() +// Background colors are rendering in 3 layers: +// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. +// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. +// - Layer 2: draw with CellBg color if set. +// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color. +// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. +// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. +// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. +enum ImGuiTableBgTarget_ +{ + ImGuiTableBgTarget_None = 0, + ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) + ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) + ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) +}; + +// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +// Obtained by calling TableGetSortSpecs(). +// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. +// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! +struct ImGuiTableSortSpecs +{ + const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. + int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. + bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. + + ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +// Sorting specification for one column of a table (sizeof == 12 bytes) +struct ImGuiTableColumnSortSpecs +{ + ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) + ImS16 ColumnIndex; // Index of the column + ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) + ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending + + ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + //----------------------------------------------------------------------------- // [SECTION] Helpers: Memory allocations macros, ImVector<> //----------------------------------------------------------------------------- @@ -1829,6 +2018,7 @@ struct ImVector inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline int find_index(const T& v) const { const T* data_end = Data + Size; const T* it = find(v); if (it == data_end) return -1; const ptrdiff_t off = it - Data; return (int)off; } inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } @@ -1862,7 +2052,7 @@ struct ImGuiStyle float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). - ImVec2 CellPadding; // Padding within a table cell + ImVec2 CellPadding; // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows. ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). @@ -1874,6 +2064,9 @@ struct ImGuiStyle float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. float TabBorderSize; // Thickness of border around tabs. float TabMinWidthForCloseButton; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + float TabBarBorderSize; // Thickness of tab-bar separator, which takes on the tab active color to denote focus. + float TableAngledHeadersAngle; // Angle of angled headers (supported values range from -50.0f degrees to +50.0f degrees). + ImVec2 TableAngledHeadersTextAlign;// Alignment of angled headers within the cell ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. @@ -1890,6 +2083,14 @@ struct ImGuiStyle float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. ImVec4 Colors[ImGuiCol_COUNT]; + // Behaviors + // (It is possible to modify those fields mid-frame if specific behavior need it, unlike e.g. configuration fields in ImGuiIO) + float HoverStationaryDelay; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary. + float HoverDelayShort; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay. + float HoverDelayNormal; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). " + ImGuiHoveredFlags HoverFlagsForTooltipMouse;// Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse. + ImGuiHoveredFlags HoverFlagsForTooltipNav; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad. + IMGUI_API ImGuiStyle(); IMGUI_API void ScaleAllSizes(float scale_factor); }; @@ -1899,6 +2100,9 @@ struct ImGuiStyle //----------------------------------------------------------------------------- // Communicate most settings and inputs/outputs to Dear ImGui using this structure. // Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. +// It is generally expected that: +// - initialization: backends and user code writes to ImGuiIO. +// - main loop: backends writes to ImGuiIO, user code and imgui code reads from ImGuiIO. //----------------------------------------------------------------------------- // [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions. @@ -1924,13 +2128,6 @@ struct ImGuiIO float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions. const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified). - float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. - float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. - float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. - float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). - float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. - float HoverDelayNormal; // = 0.30 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayNormal) returns true. - float HoverDelayShort; // = 0.10 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayShort) returns true. void* UserData; // = NULL // Store your own data. ImFontAtlas*Fonts; // // Font atlas: load, rasterize and pack one or more fonts into a single texture. @@ -1941,7 +2138,7 @@ struct ImGuiIO // Miscellaneous options bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. - bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. + bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // Swap Cmd<>Ctrl keys + OS X style text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates. bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). bool ConfigInputTextEnterKeepActive; // = false // [BETA] Pressing Enter will keep item active and select contents (single-line only). @@ -1950,18 +2147,39 @@ struct ImGuiIO bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. + // Inputs Behaviors + // (other variables, ones which are expected to be tweaked within UI code, are exposed in ImGuiStyle) + float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. + float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. + float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. + float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). + float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. + + //------------------------------------------------------------------ // Debug options - // - tools to test correct Begin/End and BeginChild/EndChild behaviors. - // - presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX() - // this is inconsistent with other BeginXXX functions and create confusion for many users. - // - we expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior. + //------------------------------------------------------------------ + + // Option to enable various debug tools showing buttons that will call the IM_DEBUG_BREAK() macro. + // - The Item Picker tool will be available regardless of this being enabled, in order to maximize its discoverability. + // - Requires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application. + // e.g. io.ConfigDebugIsDebuggerPresent = ::IsDebuggerPresent() on Win32, or refer to ImOsIsDebuggerPresent() imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version). + bool ConfigDebugIsDebuggerPresent; // = false // Enable various tools calling IM_DEBUG_BREAK(). + + // Tools to test correct Begin/End and BeginChild/EndChild behaviors. + // - Presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX() + // - This is inconsistent with other BeginXXX functions and create confusion for many users. + // - We expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior. bool ConfigDebugBeginReturnValueOnce;// = false // First-time calls to Begin()/BeginChild() will return false. NEEDS TO BE SET AT APPLICATION BOOT TIME if you don't want to miss windows. bool ConfigDebugBeginReturnValueLoop;// = false // Some calls to Begin()/BeginChild() will return false. Will cycle through window depths then repeat. Suggested use: add "io.ConfigDebugBeginReturnValue = io.KeyShift" in your main loop then occasionally press SHIFT. Windows should be flickering while running. - // - option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data. - // - backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them. - // - consider using e.g. Win32's IsDebuggerPresent() as an additional filter (or see ImOsIsDebuggerPresent() in imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version). + + // Option to deactivate io.AddFocusEvent(false) handling. + // - May facilitate interactions with a debugger when focus loss leads to clearing inputs data. + // - Backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them. bool ConfigDebugIgnoreFocusLoss; // = false // Ignore io.AddFocusEvent(false), consequently not calling io.ClearInputKeys() in input processing. + // Options to audit .ini data + bool ConfigDebugIniSettings; // = false // Save .ini data with extra comments (particularly helpful for Docking, but makes saving slower) + //------------------------------------------------------------------ // Platform Functions // (the imgui_impl_xxxx backend files are setting those up for you) @@ -1983,11 +2201,9 @@ struct ImGuiIO // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows) // (default to use native imm32 api on Windows) void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. -#else - void* _UnusedPadding; // Unused field to keep data structure the same size. -#endif + + // Optional: Platform locale + ImWchar PlatformLocaleDecimalPoint; // '.' // [Experimental] Configure decimal point e.g. '.' or ',' useful for some languages (e.g. German), generally pulled from *localeconv()->decimal_point //------------------------------------------------------------------ // Input - Call before calling NewFrame() @@ -2007,8 +2223,11 @@ struct ImGuiIO IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode. IMGUI_API void SetAppAcceptingEvents(bool accepting_events); // Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. - IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually - IMGUI_API void ClearInputKeys(); // [Internal] Release all keys + IMGUI_API void ClearEventsQueue(); // Clear all incoming events. + IMGUI_API void ClearInputKeys(); // Clear current keyboard/mouse/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons. +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + IMGUI_API void ClearInputCharacters(); // [Obsoleted in 1.89.8] Clear the current frame text input buffer. Now included within ClearInputKeys(). +#endif //------------------------------------------------------------------ // Output - Updated by NewFrame() or EndFrame()/Render() @@ -2028,18 +2247,8 @@ struct ImGuiIO int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 int MetricsRenderWindows; // Number of visible windows int MetricsActiveWindows; // Number of active windows - int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. - // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. - // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). - // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space) -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. - bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. - float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. -#endif - //------------------------------------------------------------------ // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! //------------------------------------------------------------------ @@ -2060,7 +2269,7 @@ struct ImGuiIO bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows // Other state maintained from data above + IO function calls - ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. DOES NOT CONTAINS ImGuiMod_Shortcut which is pretranslated). Read-only, updated by NewFrame() + ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. Read-only, updated by NewFrame() ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this. bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) @@ -2074,6 +2283,7 @@ struct ImGuiIO bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds. bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window. bool MouseWheelRequestAxisSwap; // On a non-Mac system, holding SHIFT requests WheelY to perform the equivalent of a WheelX event. On a Mac system this is already enforced by the system. + bool MouseCtrlLeftAsRightClick; // (OSX) Set to true when the current click was a ctrl-click that spawned a simulated right click float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) float MouseDownDurationPrev[5]; // Previous time the mouse button has been down float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds) @@ -2085,11 +2295,21 @@ struct ImGuiIO ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16() ImVector InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. + // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. + // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). + // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space) +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. + bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. + float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. + //void* ImeWindowHandle; // [Obsoleted in 1.87] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. +#endif + IMGUI_API ImGuiIO(); }; //----------------------------------------------------------------------------- -// [SECTION] Misc data structures +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload) //----------------------------------------------------------------------------- // Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. @@ -2109,6 +2329,8 @@ struct ImGuiInputTextCallbackData void* UserData; // What user passed to InputText() // Read-only // Arguments for the different callback events + // - During Resize callback, Buf will be same as your input buffer. + // - However, during Completion/History/Always callback, Buf always points to our own internal data (it is not the same as your buffer)! Changes to it will be reflected into your own buffer shortly after the callback. // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary. // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state. ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; @@ -2163,30 +2385,6 @@ struct ImGuiPayload bool IsDelivery() const { return Delivery; } }; -// Sorting specification for one column of a table (sizeof == 12 bytes) -struct ImGuiTableColumnSortSpecs -{ - ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) - ImS16 ColumnIndex; // Index of the column - ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) - ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) - - ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - -// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) -// Obtained by calling TableGetSortSpecs(). -// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. -// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! -struct ImGuiTableSortSpecs -{ - const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. - int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. - bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. - - ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - //----------------------------------------------------------------------------- // [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) //----------------------------------------------------------------------------- @@ -2270,9 +2468,9 @@ struct ImGuiStorage { ImGuiID key; union { int val_i; float val_f; void* val_p; }; - ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } - ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } - ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } + ImGuiStoragePair(ImGuiID _key, int _val) { key = _key; val_i = _val; } + ImGuiStoragePair(ImGuiID _key, float _val) { key = _key; val_f = _val; } + ImGuiStoragePair(ImGuiID _key, void* _val) { key = _key; val_p = _val; } }; ImVector Data; @@ -2299,11 +2497,10 @@ struct ImGuiStorage IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); - // Use on your own storage if you know only integer are being stored (open/close all tree nodes) - IMGUI_API void SetAllInt(int val); - - // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. + // Advanced: for quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. IMGUI_API void BuildSortByKey(); + // Obsolete: use on your own storage if you know only integer are being stored (open/close all tree nodes) + IMGUI_API void SetAllInt(int val); }; // Helper: Manually clip large list of items. @@ -2344,12 +2541,14 @@ struct ImGuiListClipper IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. - // Call IncludeRangeByIndices() *BEFORE* first call to Step() if you need a range of items to not be clipped, regardless of their visibility. + // Call IncludeItemByIndex() or IncludeItemsByIndex() *BEFORE* first call to Step() if you need a range of items to not be clipped, regardless of their visibility. // (Due to alignment / padding of certain items it is possible that an extra item may be included on either end of the display range). - IMGUI_API void IncludeRangeByIndices(int item_begin, int item_end); // item_end is exclusive e.g. use (42, 42+1) to make item 42 never clipped. + inline void IncludeItemByIndex(int item_index) { IncludeItemsByIndex(item_index, item_index + 1); } + IMGUI_API void IncludeItemsByIndex(int item_begin, int item_end); // item_end is exclusive e.g. use (42, 42+1) to make item 42 never clipped. #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline void ForceDisplayRangeByIndices(int item_begin, int item_end) { IncludeRangeByIndices(item_begin, item_end); } // [renamed in 1.89.6] + inline void IncludeRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.9] + inline void ForceDisplayRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.6] //inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] #endif }; @@ -2374,9 +2573,13 @@ static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } +static inline bool operator==(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; } +static inline bool operator!=(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y; } static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } +static inline bool operator==(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w; } +static inline bool operator!=(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y || lhs.z != rhs.z || lhs.w != rhs.w; } IM_MSVC_RUNTIME_CHECKS_RESTORE #endif @@ -2413,8 +2616,8 @@ struct ImColor constexpr ImColor() { } constexpr ImColor(float r, float g, float b, float a = 1.0f) : Value(r, g, b, a) { } constexpr ImColor(const ImVec4& col) : Value(col) {} - ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; } - ImColor(ImU32 rgba) { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } + constexpr ImColor(int r, int g, int b, int a = 255) : Value((float)r * (1.0f / 255.0f), (float)g * (1.0f / 255.0f), (float)b * (1.0f / 255.0f), (float)a* (1.0f / 255.0f)) {} + constexpr ImColor(ImU32 rgba) : Value((float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * (1.0f / 255.0f)) {} inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } inline operator ImVec4() const { return Value; } @@ -2446,9 +2649,9 @@ typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* c // Special Draw callback value to request renderer backend to reset the graphics/render state. // The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. -// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. -// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). -#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) +// This is useful, for example, if you submitted callbacks which you know have altered the render state and you want it to be restored. +// Render state is not reset by default because they are many perfectly useful way of altering render state (e.g. changing shader/blending settings before an Image call). +#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-8) // Typically, 1 command = 1 GPU draw call (unless command is a callback) // - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, @@ -2571,15 +2774,15 @@ struct ImDrawList // [Internal, used while building lists] unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) - const char* _OwnerName; // Pointer to owner window's name for debugging ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImVector _ClipRectStack; // [Internal] - ImVector _TextureIdStack; // [Internal] ImVector _Path; // [Internal] current path building ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) + ImVector _ClipRectStack; // [Internal] + ImVector _TextureIdStack; // [Internal] float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content + const char* _OwnerName; // Pointer to owner window's name for debugging // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) ImDrawList(ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } @@ -2612,13 +2815,20 @@ struct ImDrawList IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); + IMGUI_API void AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f); + IMGUI_API void AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0); IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); - IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); - IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) + // General polygon + // - Only simple polygons are supported by filling functions (no self-intersections, no holes). + // - Concave polygon fill is more expensive than convex one: it has O(N^2) complexity. Provided as a convenience fo user but not used by main library. + IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); + IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); + IMGUI_API void AddConcavePolyFilled(const ImVec2* points, int num_points, ImU32 col); + // Image primitives // - Read FAQ to understand what ImTextureID is. // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. @@ -2628,14 +2838,17 @@ struct ImDrawList IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); // Stateful path API, add points then finish with PathFillConvex() or PathStroke() - // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // - Important: filled shapes must always use clockwise winding order! The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // so e.g. 'PathArcTo(center, radius, PI * -0.5f, PI)' is ok, whereas 'PathArcTo(center, radius, PI, PI * -0.5f)' won't have correct anti-aliasing when followed by PathFillConvex(). inline void PathClear() { _Path.Size = 0; } inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } + inline void PathFillConcave(ImU32 col) { AddConcavePolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle + IMGUI_API void PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments = 0); // Ellipse IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); @@ -2648,7 +2861,7 @@ struct ImDrawList // Advanced: Channels // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) - // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! + // - This API shouldn't have been in ImDrawList in the first place! // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } @@ -2668,6 +2881,9 @@ struct ImDrawList inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index // Obsolete names + //inline void AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f) { AddEllipse(center, ImVec2(radius_x, radius_y), col, rot, num_segments, thickness); } // OBSOLETED in 1.90.5 (Mar 2024) + //inline void AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0) { AddEllipseFilled(center, ImVec2(radius_x, radius_y), col, rot, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024) + //inline void PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments = 0) { PathEllipticalArcTo(center, ImVec2(radius_x, radius_y), rot, a_min, a_max, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024) //inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021) //inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021) @@ -2689,18 +2905,20 @@ struct ImDrawList // as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) struct ImDrawData { - bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. - int CmdListsCount; // Number of ImDrawList* to render - int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size - int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size - ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. - ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) - ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) - ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. + int CmdListsCount; // Number of ImDrawList* to render (should always be == CmdLists.size) + int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size + int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size + ImVector CmdLists; // Array of ImDrawList* to render. The ImDrawLists are owned by ImGuiContext and only pointed to from here. + ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) + ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) + ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + ImGuiViewport* OwnerViewport; // Viewport carrying the ImDrawData instance, might be of use to the renderer (generally not). // Functions ImDrawData() { Clear(); } - void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! + IMGUI_API void Clear(); + IMGUI_API void AddDrawList(ImDrawList* draw_list); // Helper to add an external draw list into an existing ImDrawData. IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. }; @@ -2716,7 +2934,7 @@ struct ImFontConfig bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). int FontNo; // 0 // Index of font within TTF/OTF file float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). - int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. + int OversampleH; // 2 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal. You can reduce this to 1 for large glyphs save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. @@ -2726,7 +2944,8 @@ struct ImFontConfig float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. - float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. + float RasterizerMultiply; // 1.0f // Linearly brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. This is a silly thing we may remove in the future. + float RasterizerDensity; // 1.0f // DPI scale for rasterization, not altering other font metrics: make it easy to swap between e.g. a 100% and a 400% fonts for a zooming display. IMPORTANT: If you increase this it is expected that you increase font scale accordingly, otherwise quality may look lowered. ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. // [Internal] @@ -2810,8 +3029,8 @@ struct ImFontAtlas IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); - IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. - IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. + IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. + IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts. IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory. @@ -2853,7 +3072,7 @@ struct ImFontAtlas // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. // - After calling Build(), you can query the rectangle position and render your pixels. - // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. + // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of preferred texture format. // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), // so you can render e.g. custom colorful icons and use them as regular glyphs. // - Read docs/FONTS.md for more details about using colorful icons. @@ -2982,6 +3201,7 @@ enum ImGuiViewportFlags_ // - Windows are generally trying to stay within the Work Area of their host viewport. struct ImGuiViewport { + ImGuiID ID; // Unique identifier for the viewport ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) ImVec2 Size; // Main Area: Size of the viewport. @@ -3018,32 +3238,36 @@ struct ImGuiPlatformImeData // Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. //----------------------------------------------------------------------------- -namespace ImGui -{ -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key] -#else - static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; } -#endif -} - #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS namespace ImGui { + // OBSOLETED in 1.90.0 (from September 2023) + static inline bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags window_flags = 0) { return BeginChild(id, size, ImGuiChildFlags_FrameStyle, window_flags); } + static inline void EndChildFrame() { EndChild(); } + //static inline bool BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags window_flags){ return BeginChild(str_id, size_arg, border ? ImGuiChildFlags_Border : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Border + //static inline bool BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags window_flags) { return BeginChild(id, size_arg, border ? ImGuiChildFlags_Border : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Border + static inline void ShowStackToolWindow(bool* p_open = NULL) { ShowIDStackToolWindow(p_open); } + IMGUI_API bool ListBox(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int popup_max_height_in_items = -1); + // OBSOLETED in 1.89.7 (from June 2023) + IMGUI_API void SetItemAllowOverlap(); // Use SetNextItemAllowOverlap() before item. // OBSOLETED in 1.89.4 (from March 2023) static inline void PushAllowKeyboardFocus(bool tab_stop) { PushTabStop(tab_stop); } static inline void PopAllowKeyboardFocus() { PopTabStop(); } // OBSOLETED in 1.89 (from August 2022) IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Use new ImageButton() signature (explicit item id, regular FramePadding) - // OBSOLETED in 1.88 (from May 2022) - static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. - static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. - // OBSOLETED in 1.86 (from November 2021) - IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper. - // OBSOLETED in 1.85 (from August 2021) - static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } + // OBSOLETED in 1.87 (from February 2022) + IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // Map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]. When using a 1.87+ backend using io.AddKeyEvent(), calling GetKeyIndex() with ANY ImGuiKey_XXXX values will return the same value! + //static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END); return key; } // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) + //-- OBSOLETED in 1.88 (from May 2022) + //static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. + //static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. + //-- OBSOLETED in 1.86 (from November 2021) + //IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Code removed, see 1.90 for last version of the code. Calculate range of visible items for large list of evenly sized items. Prefer using ImGuiListClipper. + //-- OBSOLETED in 1.85 (from August 2021) + //static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } //-- OBSOLETED in 1.81 (from February 2021) //static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } //static inline bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1) { float height = GetTextLineHeightWithSpacing() * ((height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f) + GetStyle().FramePadding.y * 2.0f; return BeginListBox(label, ImVec2(0.0f, height)); } // Helper to calculate size from items_count and height_in_items @@ -3094,21 +3318,21 @@ namespace ImGui //static inline void SetScrollPosHere() { SetScrollHere(); } // OBSOLETED in 1.42 } -// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() -typedef ImDrawFlags ImDrawCornerFlags; -enum ImDrawCornerFlags_ -{ - ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit - ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). - ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. - ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. - ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. - ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 - ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, - ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, - ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, - ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, -}; +//-- OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() +//typedef ImDrawFlags ImDrawCornerFlags; +//enum ImDrawCornerFlags_ +//{ +// ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit +// ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). +// ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. +// ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. +// ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. +// ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 +// ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, +// ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, +// ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, +// ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, +//}; // RENAMED and MERGED both ImGuiKey_ModXXX and ImGuiModFlags_XXX into ImGuiMod_XXX (from September 2022) // RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022). Exceptionally commented out ahead of obscolescence schedule to reduce confusion and because they were not meant to be used in the first place. @@ -3117,6 +3341,8 @@ enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl //typedef ImGuiKeyChord ImGuiKeyModFlags; // == int //enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = 0, ImGuiKeyModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiKeyModFlags_Shift = ImGuiMod_Shift, ImGuiKeyModFlags_Alt = ImGuiMod_Alt, ImGuiKeyModFlags_Super = ImGuiMod_Super }; +#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // OBSOLETED IN 1.90 (now using C++11 standard version) + #endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // RENAMED IMGUI_DISABLE_METRICS_WINDOW > IMGUI_DISABLE_DEBUG_TOOLS in 1.88 (from June 2022) @@ -3139,9 +3365,14 @@ enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl #pragma warning (pop) #endif -// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) +// Include imgui_user.h at the end of imgui.h +// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included. #ifdef IMGUI_INCLUDE_IMGUI_USER_H +#ifdef IMGUI_USER_H_FILENAME +#include IMGUI_USER_H_FILENAME +#else #include "imgui_user.h" #endif +#endif #endif // #ifndef IMGUI_DISABLE diff --git a/extern/src/imgui/imgui_draw.cpp b/extern/src/imgui/imgui_draw.cpp index 0280c6e7..b9669113 100644 --- a/extern/src/imgui/imgui_draw.cpp +++ b/extern/src/imgui/imgui_draw.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (drawing and font code) /* @@ -8,6 +8,7 @@ Index of this file: // [SECTION] STB libraries implementation // [SECTION] Style functions // [SECTION] ImDrawList +// [SECTION] ImTriangulator, ImDrawList concave polygon fill // [SECTION] ImDrawListSplitter // [SECTION] ImDrawData // [SECTION] Helpers ShadeVertsXXX functions @@ -63,6 +64,8 @@ Index of this file: #pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used @@ -134,7 +137,7 @@ namespace IMGUI_STB_NAMESPACE #define STBTT_sqrt(x) ImSqrt(x) #define STBTT_pow(x,y) ImPow(x,y) #define STBTT_fabs(x) ImFabs(x) -#define STBTT_ifloor(x) ((int)ImFloorSigned(x)) +#define STBTT_ifloor(x) ((int)ImFloor(x)) #define STBTT_iceil(x) ((int)ImCeil(x)) #define STBTT_STATIC #define STB_TRUETYPE_IMPLEMENTATION @@ -382,12 +385,13 @@ void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) } // Initialize before use in a new frame. We always have a command ready in the buffer. +// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this. void ImDrawList::_ResetForNewFrame() { // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, ClipRect) == 0); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, TextureId) == sizeof(ImVec4)); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); if (_Splitter._Count > 1) _Splitter.Merge(this); @@ -474,7 +478,7 @@ void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) } // Compare ClipRect, TextureId and VtxOffset with a single memcmp() -#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) +#define ImDrawCmd_HeaderSize (offsetof(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) #define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset #define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset #define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset) @@ -560,7 +564,7 @@ int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const { // Automatic segment count const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy - if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) + if (radius_idx >= 0 && radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) return _Data->CircleSegmentCounts[radius_idx]; // Use cached value else return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); @@ -640,7 +644,7 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count) _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; } -// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). +// Release the number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) { IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); @@ -1190,8 +1194,8 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f); const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f); - const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f); - const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f); + const int a_min_sample = a_is_reverse ? (int)ImFloor(a_min_sample_f) : (int)ImCeil(a_min_sample_f); + const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloor(a_max_sample_f); const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0); const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; @@ -1216,6 +1220,26 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa } } +void ImDrawList::PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments) +{ + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + _Path.reserve(_Path.Size + (num_segments + 1)); + + const float cos_rot = ImCos(rot); + const float sin_rot = ImSin(rot); + for (int i = 0; i <= num_segments; i++) + { + const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); + ImVec2 point(ImCos(a) * radius.x, ImSin(a) * radius.y); + const ImVec2 rel((point.x * cos_rot) - (point.y * sin_rot), (point.x * sin_rot) + (point.y * cos_rot)); + point.x = rel.x + center.x; + point.y = rel.y + center.y; + _Path.push_back(point); + } +} + ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) { float u = 1.0f - t; @@ -1311,33 +1335,22 @@ void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, } } -IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) { + /* + IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - // Obsoleted in 1.82 (from February 2021) - // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) - // ~0 --> ImDrawFlags_RoundCornersAll or 0 - if (flags == ~0) - return ImDrawFlags_RoundCornersAll; - - // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) - // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) - // 0x02 --> ImDrawFlags_RoundCornersTopRight - // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight - // 0x04 --> ImDrawFlags_RoundCornersBotLeft - // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft - // ... - // 0x0F --> ImDrawFlags_RoundCornersAll or 0 - // (See all values in ImDrawCornerFlags_) - if (flags >= 0x01 && flags <= 0x0F) - return (flags << 4); - + // Obsoleted in 1.82 (from February 2021). This code was stripped/simplified and mostly commented in 1.90 (from September 2023) + // - Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) + if (flags == ~0) { return ImDrawFlags_RoundCornersAll; } + // - Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations). Read details in older version of this code. + if (flags >= 0x01 && flags <= 0x0F) { return (flags << 4); } // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' #endif - - // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. - // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... + */ + // If this assert triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. + // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc. anyway. + // See details in 1.82 Changelog as well as 2021/03/12 and 2023/09/08 entries in "API BREAKING CHANGES" section. IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); if ((flags & ImDrawFlags_RoundCornersMask_) == 0) @@ -1348,10 +1361,12 @@ static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) { - flags = FixRectCornerFlags(flags); - rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); - rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); - + if (rounding >= 0.5f) + { + flags = FixRectCornerFlags(flags); + rounding = ImMin(rounding, ImFabs(b.x - a.x) * (((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f) - 1.0f); + rounding = ImMin(rounding, ImFabs(b.y - a.y) * (((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f) - 1.0f); + } if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) { PathLineTo(a); @@ -1544,6 +1559,35 @@ void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, in PathFillConvex(col); } +// Ellipse +void ImDrawList::AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments; + PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1); + PathStroke(col, true, thickness); +} + +void ImDrawList::AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments; + PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1); + PathFillConvex(col); +} + // Cubic Bezier takes 4 controls points void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) { @@ -1571,10 +1615,11 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, if ((col & IM_COL32_A_MASK) == 0) return; + // Accept null ranges + if (text_begin == text_end || text_begin[0] == 0) + return; if (text_end == NULL) text_end = text_begin + strlen(text_begin); - if (text_begin == text_end) - return; // Pull default font/size from the shared ImDrawListSharedData instance if (font == NULL) @@ -1658,6 +1703,316 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_mi PopTextureID(); } +//----------------------------------------------------------------------------- +// [SECTION] ImTriangulator, ImDrawList concave polygon fill +//----------------------------------------------------------------------------- +// Triangulate concave polygons. Based on "Triangulation by Ear Clipping" paper, O(N^2) complexity. +// Reference: https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf +// Provided as a convenience for user but not used by main library. +//----------------------------------------------------------------------------- +// - ImTriangulator [Internal] +// - AddConcavePolyFilled() +//----------------------------------------------------------------------------- + +enum ImTriangulatorNodeType +{ + ImTriangulatorNodeType_Convex, + ImTriangulatorNodeType_Ear, + ImTriangulatorNodeType_Reflex +}; + +struct ImTriangulatorNode +{ + ImTriangulatorNodeType Type; + int Index; + ImVec2 Pos; + ImTriangulatorNode* Next; + ImTriangulatorNode* Prev; + + void Unlink() { Next->Prev = Prev; Prev->Next = Next; } +}; + +struct ImTriangulatorNodeSpan +{ + ImTriangulatorNode** Data = NULL; + int Size = 0; + + void push_back(ImTriangulatorNode* node) { Data[Size++] = node; } + void find_erase_unsorted(int idx) { for (int i = Size - 1; i >= 0; i--) if (Data[i]->Index == idx) { Data[i] = Data[Size - 1]; Size--; return; } } +}; + +struct ImTriangulator +{ + static int EstimateTriangleCount(int points_count) { return (points_count < 3) ? 0 : points_count - 2; } + static int EstimateScratchBufferSize(int points_count) { return sizeof(ImTriangulatorNode) * points_count + sizeof(ImTriangulatorNode*) * points_count * 2; } + + void Init(const ImVec2* points, int points_count, void* scratch_buffer); + void GetNextTriangle(unsigned int out_triangle[3]); // Return relative indexes for next triangle + + // Internal functions + void BuildNodes(const ImVec2* points, int points_count); + void BuildReflexes(); + void BuildEars(); + void FlipNodeList(); + bool IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const; + void ReclassifyNode(ImTriangulatorNode* node); + + // Internal members + int _TrianglesLeft = 0; + ImTriangulatorNode* _Nodes = NULL; + ImTriangulatorNodeSpan _Ears; + ImTriangulatorNodeSpan _Reflexes; +}; + +// Distribute storage for nodes, ears and reflexes. +// FIXME-OPT: if everything is convex, we could report it to caller and let it switch to an convex renderer +// (this would require first building reflexes to bail to convex if empty, without even building nodes) +void ImTriangulator::Init(const ImVec2* points, int points_count, void* scratch_buffer) +{ + IM_ASSERT(scratch_buffer != NULL && points_count >= 3); + _TrianglesLeft = EstimateTriangleCount(points_count); + _Nodes = (ImTriangulatorNode*)scratch_buffer; // points_count x Node + _Ears.Data = (ImTriangulatorNode**)(_Nodes + points_count); // points_count x Node* + _Reflexes.Data = (ImTriangulatorNode**)(_Nodes + points_count) + points_count; // points_count x Node* + BuildNodes(points, points_count); + BuildReflexes(); + BuildEars(); +} + +void ImTriangulator::BuildNodes(const ImVec2* points, int points_count) +{ + for (int i = 0; i < points_count; i++) + { + _Nodes[i].Type = ImTriangulatorNodeType_Convex; + _Nodes[i].Index = i; + _Nodes[i].Pos = points[i]; + _Nodes[i].Next = _Nodes + i + 1; + _Nodes[i].Prev = _Nodes + i - 1; + } + _Nodes[0].Prev = _Nodes + points_count - 1; + _Nodes[points_count - 1].Next = _Nodes; +} + +void ImTriangulator::BuildReflexes() +{ + ImTriangulatorNode* n1 = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next) + { + if (ImTriangleIsClockwise(n1->Prev->Pos, n1->Pos, n1->Next->Pos)) + continue; + n1->Type = ImTriangulatorNodeType_Reflex; + _Reflexes.push_back(n1); + } +} + +void ImTriangulator::BuildEars() +{ + ImTriangulatorNode* n1 = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next) + { + if (n1->Type != ImTriangulatorNodeType_Convex) + continue; + if (!IsEar(n1->Prev->Index, n1->Index, n1->Next->Index, n1->Prev->Pos, n1->Pos, n1->Next->Pos)) + continue; + n1->Type = ImTriangulatorNodeType_Ear; + _Ears.push_back(n1); + } +} + +void ImTriangulator::GetNextTriangle(unsigned int out_triangle[3]) +{ + if (_Ears.Size == 0) + { + FlipNodeList(); + + ImTriangulatorNode* node = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, node = node->Next) + node->Type = ImTriangulatorNodeType_Convex; + _Reflexes.Size = 0; + BuildReflexes(); + BuildEars(); + + // If we still don't have ears, it means geometry is degenerated. + if (_Ears.Size == 0) + { + // Return first triangle available, mimicking the behavior of convex fill. + IM_ASSERT(_TrianglesLeft > 0); // Geometry is degenerated + _Ears.Data[0] = _Nodes; + _Ears.Size = 1; + } + } + + ImTriangulatorNode* ear = _Ears.Data[--_Ears.Size]; + out_triangle[0] = ear->Prev->Index; + out_triangle[1] = ear->Index; + out_triangle[2] = ear->Next->Index; + + ear->Unlink(); + if (ear == _Nodes) + _Nodes = ear->Next; + + ReclassifyNode(ear->Prev); + ReclassifyNode(ear->Next); + _TrianglesLeft--; +} + +void ImTriangulator::FlipNodeList() +{ + ImTriangulatorNode* prev = _Nodes; + ImTriangulatorNode* temp = _Nodes; + ImTriangulatorNode* current = _Nodes->Next; + prev->Next = prev; + prev->Prev = prev; + while (current != _Nodes) + { + temp = current->Next; + + current->Next = prev; + prev->Prev = current; + _Nodes->Next = current; + current->Prev = _Nodes; + + prev = current; + current = temp; + } + _Nodes = prev; +} + +// A triangle is an ear is no other vertex is inside it. We can test reflexes vertices only (see reference algorithm) +bool ImTriangulator::IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const +{ + ImTriangulatorNode** p_end = _Reflexes.Data + _Reflexes.Size; + for (ImTriangulatorNode** p = _Reflexes.Data; p < p_end; p++) + { + ImTriangulatorNode* reflex = *p; + if (reflex->Index != i0 && reflex->Index != i1 && reflex->Index != i2) + if (ImTriangleContainsPoint(v0, v1, v2, reflex->Pos)) + return false; + } + return true; +} + +void ImTriangulator::ReclassifyNode(ImTriangulatorNode* n1) +{ + // Classify node + ImTriangulatorNodeType type; + const ImTriangulatorNode* n0 = n1->Prev; + const ImTriangulatorNode* n2 = n1->Next; + if (!ImTriangleIsClockwise(n0->Pos, n1->Pos, n2->Pos)) + type = ImTriangulatorNodeType_Reflex; + else if (IsEar(n0->Index, n1->Index, n2->Index, n0->Pos, n1->Pos, n2->Pos)) + type = ImTriangulatorNodeType_Ear; + else + type = ImTriangulatorNodeType_Convex; + + // Update lists when a type changes + if (type == n1->Type) + return; + if (n1->Type == ImTriangulatorNodeType_Reflex) + _Reflexes.find_erase_unsorted(n1->Index); + else if (n1->Type == ImTriangulatorNodeType_Ear) + _Ears.find_erase_unsorted(n1->Index); + if (type == ImTriangulatorNodeType_Reflex) + _Reflexes.push_back(n1); + else if (type == ImTriangulatorNodeType_Ear) + _Ears.push_back(n1); + n1->Type = type; +} + +// Use ear-clipping algorithm to triangulate a simple polygon (no self-interaction, no holes). +// (Reminder: we don't perform any coarse clipping/culling in ImDrawList layer! +// It is up to caller to ensure not making costly calls that will be outside of visible area. +// As concave fill is noticeably more expensive than other primitives, be mindful of this... +// Caller can build AABB of points, and avoid filling if 'draw_list->_CmdHeader.ClipRect.Overlays(points_bb) == false') +void ImDrawList::AddConcavePolyFilled(const ImVec2* points, const int points_count, ImU32 col) +{ + if (points_count < 3 || (col & IM_COL32_A_MASK) == 0) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + ImTriangulator triangulator; + unsigned int triangle[3]; + if (Flags & ImDrawListFlags_AntiAliasedFill) + { + // Anti-aliased Fill + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + const int idx_count = (points_count - 2) * 3 + points_count * 6; + const int vtx_count = (points_count * 2); + PrimReserve(idx_count, vtx_count); + + // Add indexes for fill + unsigned int vtx_inner_idx = _VtxCurrentIdx; + unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; + + _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2)); + triangulator.Init(points, points_count, _Data->TempBuffer.Data); + while (triangulator._TrianglesLeft > 0) + { + triangulator.GetNextTriangle(triangle); + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (triangle[0] << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (triangle[1] << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (triangle[2] << 1)); + _IdxWritePtr += 3; + } + + // Compute normals + _Data->TempBuffer.reserve_discard(points_count); + ImVec2* temp_normals = _Data->TempBuffer.Data; + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + const ImVec2& p0 = points[i0]; + const ImVec2& p1 = points[i1]; + float dx = p1.x - p0.x; + float dy = p1.y - p0.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i0].x = dy; + temp_normals[i0].y = -dx; + } + + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + // Average normals + const ImVec2& n0 = temp_normals[i0]; + const ImVec2& n1 = temp_normals[i1]; + float dm_x = (n0.x + n1.x) * 0.5f; + float dm_y = (n0.y + n1.y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= AA_SIZE * 0.5f; + dm_y *= AA_SIZE * 0.5f; + + // Add vertices + _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner + _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer + _VtxWritePtr += 2; + + // Add indexes for fringes + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); + _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); + _IdxWritePtr += 6; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // Non Anti-aliased Fill + const int idx_count = (points_count - 2) * 3; + const int vtx_count = points_count; + PrimReserve(idx_count, vtx_count); + for (int i = 0; i < vtx_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr++; + } + _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2)); + triangulator.Init(points, points_count, _Data->TempBuffer.Data); + while (triangulator._TrianglesLeft > 0) + { + triangulator.GetNextTriangle(triangle); + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx + triangle[0]); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + triangle[1]); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + triangle[2]); + _IdxWritePtr += 3; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } +} //----------------------------------------------------------------------------- // [SECTION] ImDrawListSplitter @@ -1808,6 +2163,63 @@ void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) // [SECTION] ImDrawData //----------------------------------------------------------------------------- +void ImDrawData::Clear() +{ + Valid = false; + CmdListsCount = TotalIdxCount = TotalVtxCount = 0; + CmdLists.resize(0); // The ImDrawList are NOT owned by ImDrawData but e.g. by ImGuiContext, so we don't clear them. + DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.0f, 0.0f); + OwnerViewport = NULL; +} + +// Important: 'out_list' is generally going to be draw_data->CmdLists, but may be another temporary list +// as long at it is expected that the result will be later merged into draw_data->CmdLists[]. +void ImGui::AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector* out_list, ImDrawList* draw_list) +{ + if (draw_list->CmdBuffer.Size == 0) + return; + if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) + return; + + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + // May trigger for you if you are using PrimXXX functions incorrectly. + IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); + IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); + if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + + // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) + // If this assert triggers because you are drawing lots of stuff manually: + // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. + // Be mindful that the lower-level ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. + // - If you want large meshes with more than 64K vertices, you can either: + // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. + // Most example backends already support this from 1.71. Pre-1.71 backends won't. + // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. + // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. + // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: + // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); + // Your own engine or render API may use different parameters or function calls to specify index sizes. + // 2 and 4 bytes indices are generally supported by most graphics API. + // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching + // the 64K limit to split your draw commands in multiple draw lists. + if (sizeof(ImDrawIdx) == 2) + IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); + + // Add to output list + records state in ImDrawData + out_list->push_back(draw_list); + draw_data->CmdListsCount++; + draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; + draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; +} + +void ImDrawData::AddDrawList(ImDrawList* draw_list) +{ + IM_ASSERT(CmdLists.Size == CmdListsCount); + draw_list->_PopUnusedDrawCmd(); + ImGui::AddDrawListToDrawDataEx(this, &CmdLists, draw_list); +} + // For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! void ImDrawData::DeIndexAllBuffers() { @@ -1832,15 +2244,9 @@ void ImDrawData::DeIndexAllBuffers() // or if there is a difference between your window resolution and framebuffer resolution. void ImDrawData::ScaleClipRects(const ImVec2& fb_scale) { - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; - cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y); - } - } + for (ImDrawList* draw_list : CmdLists) + for (ImDrawCmd& cmd : draw_list->CmdBuffer) + cmd.ClipRect = ImVec4(cmd.ClipRect.x * fb_scale.x, cmd.ClipRect.y * fb_scale.y, cmd.ClipRect.z * fb_scale.x, cmd.ClipRect.w * fb_scale.y); } //----------------------------------------------------------------------------- @@ -1896,6 +2302,14 @@ void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int ve } } +void ImGui::ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out) +{ + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->pos = ImRotate(vertex->pos- pivot_in, cos_a, sin_a) + pivot_out; +} + //----------------------------------------------------------------------------- // [SECTION] ImFontConfig //----------------------------------------------------------------------------- @@ -1904,10 +2318,11 @@ ImFontConfig::ImFontConfig() { memset(this, 0, sizeof(*this)); FontDataOwnedByAtlas = true; - OversampleH = 3; // FIXME: 2 may be a better default? + OversampleH = 2; OversampleV = 1; GlyphMaxAdvanceX = FLT_MAX; RasterizerMultiply = 1.0f; + RasterizerDensity = 1.0f; EllipsisChar = (ImWchar)-1; } @@ -1981,19 +2396,19 @@ ImFontAtlas::~ImFontAtlas() void ImFontAtlas::ClearInputData() { IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - for (int i = 0; i < ConfigData.Size; i++) - if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) + for (ImFontConfig& font_cfg : ConfigData) + if (font_cfg.FontData && font_cfg.FontDataOwnedByAtlas) { - IM_FREE(ConfigData[i].FontData); - ConfigData[i].FontData = NULL; + IM_FREE(font_cfg.FontData); + font_cfg.FontData = NULL; } // When clearing this we lose access to the font name and other information used to build the font. - for (int i = 0; i < Fonts.Size; i++) - if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) + for (ImFont* font : Fonts) + if (font->ConfigData >= ConfigData.Data && font->ConfigData < ConfigData.Data + ConfigData.Size) { - Fonts[i]->ConfigData = NULL; - Fonts[i]->ConfigDataCount = 0; + font->ConfigData = NULL; + font->ConfigDataCount = 0; } ConfigData.clear(); CustomRects.clear(); @@ -2090,6 +2505,8 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; + ImFontAtlasUpdateConfigDataPointers(this); + // Invalidate texture TexReady = false; ClearTexData(); @@ -2126,7 +2543,7 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) if (font_cfg.Name[0] == '\0') ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); font_cfg.EllipsisChar = (ImWchar)0x0085; - font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units + font_cfg.GlyphOffset.y = 1.0f * IM_TRUNC(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); @@ -2156,13 +2573,14 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, } // NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). -ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) { IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontData = ttf_data; - font_cfg.FontDataSize = ttf_size; + IM_ASSERT(font_data_size > 100 && "Incorrect value for font_data_size!"); // Heuristic to prevent accidentally passing a wrong value to font_data_size. + font_cfg.FontData = font_data; + font_cfg.FontDataSize = font_data_size; font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels; if (glyph_ranges) font_cfg.GlyphRanges = glyph_ranges; @@ -2377,7 +2795,10 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) + { + IM_ASSERT(0 && "stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize."); return false; + } // Measure highest codepoints ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; @@ -2459,7 +2880,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) // Convert our ranges in the format stb_truetype wants ImFontConfig& cfg = atlas->ConfigData[src_i]; - src_tmp.PackRange.font_size = cfg.SizePixels; + src_tmp.PackRange.font_size = cfg.SizePixels * cfg.RasterizerDensity; src_tmp.PackRange.first_unicode_codepoint_in_range = 0; src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data; src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size; @@ -2468,7 +2889,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV; // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects) - const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels); + const float scale = (cfg.SizePixels > 0.0f) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels * cfg.RasterizerDensity) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels * cfg.RasterizerDensity); const int padding = atlas->TexGlyphPadding; for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++) { @@ -2564,12 +2985,14 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) int unscaled_ascent, unscaled_descent, unscaled_line_gap; stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); - const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1)); - const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); + const float ascent = ImCeil(unscaled_ascent * font_scale); + const float descent = ImFloor(unscaled_descent * font_scale); ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); const float font_off_x = cfg.GlyphOffset.x; const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); + const float inv_rasterization_scale = 1.0f / cfg.RasterizerDensity; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) { // Register glyph @@ -2578,7 +3001,11 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) stbtt_aligned_quad q; float unused_x = 0.0f, unused_y = 0.0f; stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); - dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); + float x0 = q.x0 * inv_rasterization_scale + font_off_x; + float y0 = q.y0 * inv_rasterization_scale + font_off_y; + float x1 = q.x1 * inv_rasterization_scale + font_off_x; + float y1 = q.y1 * inv_rasterization_scale + font_off_y; + dst_font->AddGlyph(&cfg, (ImWchar)codepoint, x0, y0, x1, y1, q.s0, q.t0, q.s1, q.t1, pc.xadvance * inv_rasterization_scale); } } @@ -2598,19 +3025,31 @@ const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() #endif // IMGUI_ENABLE_STB_TRUETYPE +void ImFontAtlasUpdateConfigDataPointers(ImFontAtlas* atlas) +{ + for (ImFontConfig& font_cfg : atlas->ConfigData) + { + ImFont* font = font_cfg.DstFont; + if (!font_cfg.MergeMode) + { + font->ConfigData = &font_cfg; + font->ConfigDataCount = 0; + } + font->ConfigDataCount++; + } +} + void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) { if (!font_config->MergeMode) { font->ClearOutputData(); font->FontSize = font_config->SizePixels; - font->ConfigData = font_config; - font->ConfigDataCount = 0; + IM_ASSERT(font->ConfigData == font_config); font->ContainerAtlas = atlas; font->Ascent = ascent; font->Descent = descent; } - font->ConfigDataCount++; } void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque) @@ -2757,6 +3196,13 @@ static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) // Note: this is called / shared by both the stb_truetype and the FreeType builder void ImFontAtlasBuildInit(ImFontAtlas* atlas) { + // Round font size + // - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet. + // - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes. + // - We may support it better later and remove this rounding. + for (ImFontConfig& cfg : atlas->ConfigData) + cfg.SizePixels = ImTrunc(cfg.SizePixels); + // Register texture region for mouse cursors or standard white pixels if (atlas->PackIdMouseCursors < 0) { @@ -2798,9 +3244,9 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas) } // Build all fonts lookup tables - for (int i = 0; i < atlas->Fonts.Size; i++) - if (atlas->Fonts[i]->DirtyLookupTables) - atlas->Fonts[i]->BuildLookupTable(); + for (ImFont* font : atlas->Fonts) + if (font->DirtyLookupTables) + font->BuildLookupTable(); atlas->TexReady = true; } @@ -3165,6 +3611,7 @@ void ImFont::BuildLookupTable() max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); // Build lookup table + IM_ASSERT(Glyphs.Size > 0 && "Font has not loaded glyph!"); IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved IndexAdvanceX.clear(); IndexLookup.clear(); @@ -3281,7 +3728,7 @@ void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, floa advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); if (advance_x != advance_x_original) { - float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; + float char_off_x = cfg->PixelSnapH ? ImTrunc((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; x0 += char_off_x; x1 += char_off_x; } @@ -3549,8 +3996,8 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, Im if (glyph->Colored) col |= ~IM_COL32_A_MASK; float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); + float x = IM_TRUNC(pos.x); + float y = IM_TRUNC(pos.y); draw_list->PrimReserve(6, 4); draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); } @@ -3562,8 +4009,8 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. // Align to be pixel perfect - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); + float x = IM_TRUNC(pos.x); + float y = IM_TRUNC(pos.y); if (y > clip_rect.w) return; @@ -3634,6 +4081,8 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im { x = start_x; y += line_height; + if (y > clip_rect.w) + break; // break out of main loop word_wrap_eol = NULL; s = CalcWordWrapNextLineStartA(s, text_end); // Wrapping skips upcoming blanks continue; @@ -3863,8 +4312,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im } else { - draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL - draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR + draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b); // BL + draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e); // TR } if (p1.x > rect.Min.x + rounding) { @@ -3883,8 +4332,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im } else { - draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR - draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR + draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b); // TR + draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e); // BR } } draw_list->PathFillConvex(col); @@ -4071,8 +4520,8 @@ static unsigned int stb_decompress(unsigned char *output, const unsigned char *i //----------------------------------------------------------------------------- // ProggyClean.ttf // Copyright (c) 2004, 2005 Tristan Grimmer -// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) -// Download and more information at http://upperbounds.net +// MIT license (see License.txt in http://www.proggyfonts.net/index.php?menu=download) +// Download and more information at http://www.proggyfonts.net or http://upperboundsinteractive.com/fonts.php //----------------------------------------------------------------------------- // File: 'ProggyClean.ttf' (41208 bytes) // Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). diff --git a/extern/src/imgui/imgui_impl_glfw.cpp b/extern/src/imgui/imgui_impl_glfw.cpp index 6e81819e..f5d7daa2 100644 --- a/extern/src/imgui/imgui_impl_glfw.cpp +++ b/extern/src/imgui/imgui_impl_glfw.cpp @@ -12,11 +12,18 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2023-12-19: Emscripten: Added ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback() to register canvas selector and auto-resize GLFW window. +// 2023-10-05: Inputs: Added support for extra ImGuiKey values: F13 to F24 function keys. +// 2023-07-18: Inputs: Revert ignoring mouse data on GLFW_CURSOR_DISABLED as it can be used differently. User may set ImGuiConfigFLags_NoMouse if desired. (#5625, #6609) +// 2023-06-12: Accept glfwGetTime() not returning a monotonically increasing value. This seems to happens on some Windows setup when peripherals disconnect, and is likely to also happen on browser + Emscripten. (#6491) // 2023-04-04: Inputs: Added support for io.AddMouseSourceEvent() to discriminate ImGuiMouseSource_Mouse/ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen on Windows ONLY, using a custom WndProc hook. (#2702) // 2023-03-16: Inputs: Fixed key modifiers handling on secondary viewports (docking branch). Broken on 2023/01/04. (#6248, #6034) // 2023-03-14: Emscripten: Avoid using glfwGetError() and glfwGetGamepadState() which are not correctly implemented in Emscripten emulation. (#6240) @@ -26,7 +33,7 @@ // 2022-10-18: Perform a dummy glfwGetError() read to cancel missing mouse cursors errors. Using GLFW_VERSION_COMBINED directly. (#5785) // 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. // 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). -// 2022-09-01: Inputs: Honor GLFW_CURSOR_DISABLED by not setting mouse position. +// 2022-09-01: Inputs: Honor GLFW_CURSOR_DISABLED by not setting mouse position *EDIT* Reverted 2023-07-18. // 2022-04-30: Inputs: Fixed ImGui_ImplGlfw_TranslateUntranslatedKey() for lower case letters on OSX. // 2022-03-23: Inputs: Fixed a regression in 1.87 which resulted in keyboard modifiers events being reported incorrectly on Linux/X11. // 2022-02-07: Added ImGui_ImplGlfw_InstallCallbacks()/ImGui_ImplGlfw_RestoreCallbacks() helpers to facilitate user installing callbacks after initializing backend. @@ -63,6 +70,7 @@ // 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers. #include "imgui.h" +#ifndef IMGUI_DISABLE #include "imgui_impl_glfw.h" // Clang warnings with -Weverything @@ -77,11 +85,15 @@ #ifdef _WIN32 #undef APIENTRY +#ifndef GLFW_EXPOSE_NATIVE_WIN32 #define GLFW_EXPOSE_NATIVE_WIN32 +#endif #include // for glfwGetWin32Window() #endif #ifdef __APPLE__ +#ifndef GLFW_EXPOSE_NATIVE_COCOA #define GLFW_EXPOSE_NATIVE_COCOA +#endif #include // for glfwGetCocoaWindow() #endif @@ -106,7 +118,7 @@ enum GlfwClientApi { GlfwClientApi_Unknown, GlfwClientApi_OpenGL, - GlfwClientApi_Vulkan + GlfwClientApi_Vulkan, }; struct ImGui_ImplGlfw_Data @@ -119,6 +131,9 @@ struct ImGui_ImplGlfw_Data ImVec2 LastValidMousePos; bool InstalledCallbacks; bool CallbacksChainForAllWindows; +#ifdef __EMSCRIPTEN__ + const char* CanvasSelector; +#endif // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. GLFWwindowfocusfun PrevUserCallbackWindowFocus; @@ -268,6 +283,18 @@ static ImGuiKey ImGui_ImplGlfw_KeyToImGuiKey(int key) case GLFW_KEY_F10: return ImGuiKey_F10; case GLFW_KEY_F11: return ImGuiKey_F11; case GLFW_KEY_F12: return ImGuiKey_F12; + case GLFW_KEY_F13: return ImGuiKey_F13; + case GLFW_KEY_F14: return ImGuiKey_F14; + case GLFW_KEY_F15: return ImGuiKey_F15; + case GLFW_KEY_F16: return ImGuiKey_F16; + case GLFW_KEY_F17: return ImGuiKey_F17; + case GLFW_KEY_F18: return ImGuiKey_F18; + case GLFW_KEY_F19: return ImGuiKey_F19; + case GLFW_KEY_F20: return ImGuiKey_F20; + case GLFW_KEY_F21: return ImGuiKey_F21; + case GLFW_KEY_F22: return ImGuiKey_F22; + case GLFW_KEY_F23: return ImGuiKey_F23; + case GLFW_KEY_F24: return ImGuiKey_F24; default: return ImGuiKey_None; } } @@ -384,8 +411,6 @@ void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y) ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); if (bd->PrevUserCallbackCursorPos != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) bd->PrevUserCallbackCursorPos(window, x, y); - if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) - return; ImGuiIO& io = ImGui::GetIO(); io.AddMousePosEvent((float)x, (float)y); @@ -399,8 +424,6 @@ void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); if (bd->PrevUserCallbackCursorEnter != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) bd->PrevUserCallbackCursorEnter(window, entered); - if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) - return; ImGuiIO& io = ImGui::GetIO(); if (entered) @@ -474,7 +497,7 @@ static LRESULT CALLBACK ImGui_ImplGlfw_WndProc(HWND hWnd, UINT msg, WPARAM wPara ImGui::GetIO().AddMouseSourceEvent(GetMouseSourceFromMessageExtraInfo()); break; } - return ::CallWindowProc(bd->GlfwWndProc, hWnd, msg, wParam, lParam); + return ::CallWindowProcW(bd->GlfwWndProc, hWnd, msg, wParam, lParam); } #endif @@ -533,6 +556,7 @@ void ImGui_ImplGlfw_SetCallbacksChainForAllWindows(bool chain_for_all_windows) static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, GlfwClientApi client_api) { ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); //printf("GLFW_VERSION: %d.%d.%d (%d)", GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION, GLFW_VERSION_COMBINED); @@ -598,9 +622,9 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw // Windows: register a WndProc hook so we can intercept some messages. #ifdef _WIN32 - bd->GlfwWndProc = (WNDPROC)::GetWindowLongPtr((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC); + bd->GlfwWndProc = (WNDPROC)::GetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC); IM_ASSERT(bd->GlfwWndProc != nullptr); - ::SetWindowLongPtr((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)ImGui_ImplGlfw_WndProc); + ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)ImGui_ImplGlfw_WndProc); #endif bd->ClientApi = client_api; @@ -630,6 +654,9 @@ void ImGui_ImplGlfw_Shutdown() if (bd->InstalledCallbacks) ImGui_ImplGlfw_RestoreCallbacks(bd->Window); +#ifdef __EMSCRIPTEN__ + emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, nullptr, false, nullptr); +#endif for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) glfwDestroyCursor(bd->MouseCursors[cursor_n]); @@ -637,7 +664,7 @@ void ImGui_ImplGlfw_Shutdown() // Windows: register a WndProc hook so we can intercept some messages. #ifdef _WIN32 ImGuiViewport* main_viewport = ImGui::GetMainViewport(); - ::SetWindowLongPtr((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)bd->GlfwWndProc); + ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)bd->GlfwWndProc); bd->GlfwWndProc = nullptr; #endif @@ -652,16 +679,9 @@ static void ImGui_ImplGlfw_UpdateMouseData() ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); ImGuiIO& io = ImGui::GetIO(); - if (glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) - { - io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); - return; - } - // (those braces are here to reduce diff with multi-viewports support in 'docking' branch) { GLFWwindow* window = bd->Window; - #ifdef __EMSCRIPTEN__ const bool is_window_focused = true; #else @@ -715,7 +735,7 @@ void ImGui_ImplGlfw_NewFrame() { ImGuiIO& io = ImGui::GetIO(); ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); - IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplGlfw_InitForXXX()?"); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?"); // Setup display size (every frame to accommodate for window resizing) int w, h; @@ -727,7 +747,10 @@ void ImGui_ImplGlfw_NewFrame() io.DisplayFramebufferScale = ImVec2((float)display_w / (float)w, (float)display_h / (float)h); // Setup time step + // (Accept glfwGetTime() not returning a monotonically increasing value. Seems to happens on disconnecting peripherals and probably on VMs and Emscripten, see #6491, #6189, #6114, #3644) double current_time = glfwGetTime(); + if (current_time <= bd->Time) + current_time = bd->Time + 0.00001f; io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f); bd->Time = current_time; @@ -735,6 +758,46 @@ void ImGui_ImplGlfw_NewFrame() ImGui_ImplGlfw_UpdateMouseCursor(); } +#ifdef __EMSCRIPTEN__ +static EM_BOOL ImGui_ImplGlfw_OnCanvasSizeChange(int event_type, const EmscriptenUiEvent* event, void* user_data) +{ + ImGui_ImplGlfw_Data* bd = (ImGui_ImplGlfw_Data*)user_data; + double canvas_width, canvas_height; + emscripten_get_element_css_size(bd->CanvasSelector, &canvas_width, &canvas_height); + glfwSetWindowSize(bd->Window, (int)canvas_width, (int)canvas_height); + return true; +} + +static EM_BOOL ImGui_ImplEmscripten_FullscreenChangeCallback(int event_type, const EmscriptenFullscreenChangeEvent* event, void* user_data) +{ + ImGui_ImplGlfw_Data* bd = (ImGui_ImplGlfw_Data*)user_data; + double canvas_width, canvas_height; + emscripten_get_element_css_size(bd->CanvasSelector, &canvas_width, &canvas_height); + glfwSetWindowSize(bd->Window, (int)canvas_width, (int)canvas_height); + return true; +} + +// 'canvas_selector' is a CSS selector. The event listener is applied to the first element that matches the query. +// STRING MUST PERSIST FOR THE APPLICATION DURATION. PLEASE USE A STRING LITERAL OR ENSURE POINTER WILL STAY VALID. +void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_selector) +{ + IM_ASSERT(canvas_selector != nullptr); + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?"); + + bd->CanvasSelector = canvas_selector; + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, bd, false, ImGui_ImplGlfw_OnCanvasSizeChange); + emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, bd, false, ImGui_ImplEmscripten_FullscreenChangeCallback); + + // Change the size of the GLFW window according to the size of the canvas + ImGui_ImplGlfw_OnCanvasSizeChange(EMSCRIPTEN_EVENT_RESIZE, {}, bd); +} +#endif + +//----------------------------------------------------------------------------- + #if defined(__clang__) #pragma clang diagnostic pop #endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/extern/src/imgui/imgui_impl_glfw.h b/extern/src/imgui/imgui_impl_glfw.h index 698b0d4b..6a9acd05 100644 --- a/extern/src/imgui/imgui_impl_glfw.h +++ b/extern/src/imgui/imgui_impl_glfw.h @@ -11,11 +11,15 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp #pragma once #include "imgui.h" // IMGUI_IMPL_API +#ifndef IMGUI_DISABLE struct GLFWwindow; struct GLFWmonitor; @@ -26,6 +30,11 @@ IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool ins IMGUI_IMPL_API void ImGui_ImplGlfw_Shutdown(); IMGUI_IMPL_API void ImGui_ImplGlfw_NewFrame(); +// Emscripten related initialization phase methods +#ifdef __EMSCRIPTEN__ +IMGUI_IMPL_API void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(const char* canvas_selector); +#endif + // GLFW callbacks install // - When calling Init with 'install_callbacks=true': ImGui_ImplGlfw_InstallCallbacks() is called. GLFW callbacks will be installed for you. They will chain-call user's previously installed callbacks, if any. // - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call individual function yourself from your own GLFW callbacks. @@ -45,3 +54,5 @@ IMGUI_IMPL_API void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c); IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event); + +#endif // #ifndef IMGUI_DISABLE diff --git a/extern/src/imgui/imgui_impl_opengl3.cpp b/extern/src/imgui/imgui_impl_opengl3.cpp index 338ed9e2..58603a04 100644 --- a/extern/src/imgui/imgui_impl_opengl3.cpp +++ b/extern/src/imgui/imgui_impl_opengl3.cpp @@ -14,11 +14,20 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2024-05-07: OpenGL: Update loader for Linux to support EGL/GLVND. (#7562) +// 2024-04-16: OpenGL: Detect ES3 contexts on desktop based on version string, to e.g. avoid calling glPolygonMode() on them. (#7447) +// 2024-01-09: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" and variants, fixing regression on distros missing a symlink. +// 2023-11-08: OpenGL: Update GL3W based imgui_impl_opengl3_loader.h to load "libGL.so" instead of "libGL.so.1", accommodating for NetBSD systems having only "libGL.so.3" available. (#6983) +// 2023-10-05: OpenGL: Rename symbols in our internal loader so that LTO compilation with another copy of gl3w is possible. (#6875, #6668, #4445) +// 2023-06-20: OpenGL: Fixed erroneous use glGetIntegerv(GL_CONTEXT_PROFILE_MASK) on contexts lower than 3.2. (#6539, #6333) // 2023-05-09: OpenGL: Support for glBindSampler() backup/restore on ES3. (#6375) // 2023-04-18: OpenGL: Restore front and back polygon mode separately when supported by context. (#6333) // 2023-03-23: OpenGL: Properly restoring "no shader program bound" if it was the case prior to running the rendering function. (#6267, #6220, #6224) @@ -103,13 +112,10 @@ #endif #include "imgui.h" +#ifndef IMGUI_DISABLE #include "imgui_impl_opengl3.h" #include -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif #if defined(__APPLE__) #include #endif @@ -172,9 +178,21 @@ #define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES #endif -// Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have. -#ifdef GL_POLYGON_MODE -#define IMGUI_IMPL_HAS_POLYGON_MODE +// Desktop GL 2.0+ has extension and glPolygonMode() which GL ES and WebGL don't have.. +// A desktop ES context can technically compile fine with our loader, so we also perform a runtime checks +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) +#define IMGUI_IMPL_OPENGL_HAS_EXTENSIONS // has glGetIntegerv(GL_NUM_EXTENSIONS) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE // may have glPolygonMode() +#endif + +// Desktop GL 2.1+ and GL ES 3.0+ have glBindBuffer() with GL_PIXEL_UNPACK_BUFFER target. +#if !defined(IMGUI_IMPL_OPENGL_ES2) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK +#endif + +// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART #endif // Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have. @@ -187,16 +205,6 @@ #define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER #endif -// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state -#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1) -#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART -#endif - -// Desktop GL use extension detection -#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) -#define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS -#endif - // [Debugging] //#define IMGUI_IMPL_OPENGL_DEBUG #ifdef IMGUI_IMPL_OPENGL_DEBUG @@ -225,6 +233,7 @@ struct ImGui_ImplOpenGL3_Data unsigned int VboHandle, ElementsHandle; GLsizeiptr VertexBufferSize; GLsizeiptr IndexBufferSize; + bool HasPolygonMode; bool HasClipOrigin; bool UseBufferSubData; @@ -266,6 +275,7 @@ struct ImGui_ImplOpenGL3_VtxAttribState bool ImGui_ImplOpenGL3_Init(const char* glsl_version) { ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); // Initialize our loader @@ -283,23 +293,33 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version) io.BackendRendererName = "imgui_impl_opengl3"; // Query for GL version (e.g. 320 for GL 3.2) -#if !defined(IMGUI_IMPL_OPENGL_ES2) +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GLES 2 + bd->GlVersion = 200; + bd->GlProfileIsES2 = true; +#else + // Desktop or GLES 3 + const char* gl_version_str = (const char*)glGetString(GL_VERSION); GLint major = 0; GLint minor = 0; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); if (major == 0 && minor == 0) - { - // Query GL_VERSION in desktop GL 2.x, the string will start with "." - const char* gl_version = (const char*)glGetString(GL_VERSION); - sscanf(gl_version, "%d.%d", &major, &minor); - } + sscanf(gl_version_str, "%d.%d", &major, &minor); // Query GL_VERSION in desktop GL 2.x, the string will start with "." bd->GlVersion = (GLuint)(major * 100 + minor * 10); #if defined(GL_CONTEXT_PROFILE_MASK) - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask); + if (bd->GlVersion >= 320) + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask); bd->GlProfileIsCompat = (bd->GlProfileMask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0; #endif +#if defined(IMGUI_IMPL_OPENGL_ES3) + bd->GlProfileIsES3 = true; +#else + if (strncmp(gl_version_str, "OpenGL ES 3", 11) == 0) + bd->GlProfileIsES3 = true; +#endif + bd->UseBufferSubData = false; /* // Query vendor to enable glBufferSubData kludge @@ -309,16 +329,10 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version) bd->UseBufferSubData = true; #endif */ -#elif defined(IMGUI_IMPL_OPENGL_ES2) - bd->GlVersion = 200; // GLES 2 - bd->GlProfileIsES2 = true; -#elif defined(IMGUI_IMPL_OPENGL_ES3) - bd->GlVersion = 200; // Don't raise version as it is intended as a desktop version check for now. - bd->GlProfileIsES3 = true; #endif #ifdef IMGUI_IMPL_OPENGL_DEBUG - printf("GL_MAJOR_VERSION = %d\nGL_MINOR_VERSION = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", major, minor, (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG] + printf("GlVersion = %d, \"%s\"\nGlProfileIsCompat = %d\nGlProfileMask = 0x%X\nGlProfileIsES2 = %d, GlProfileIsES3 = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", bd->GlVersion, gl_version_str, bd->GlProfileIsCompat, bd->GlProfileMask, bd->GlProfileIsES2, bd->GlProfileIsES3, (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG] #endif #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET @@ -350,8 +364,11 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version) glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); // Detect extensions we support +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE + bd->HasPolygonMode = (!bd->GlProfileIsES2 && !bd->GlProfileIsES3); +#endif bd->HasClipOrigin = (bd->GlVersion >= 450); -#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS +#ifdef IMGUI_IMPL_OPENGL_HAS_EXTENSIONS GLint num_extensions = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); for (GLint i = 0; i < num_extensions; i++) @@ -381,7 +398,7 @@ void ImGui_ImplOpenGL3_Shutdown() void ImGui_ImplOpenGL3_NewFrame() { ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); - IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL3_Init()?"); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOpenGL3_Init()?"); if (!bd->ShaderHandle) ImGui_ImplOpenGL3_CreateDeviceObjects(); @@ -403,8 +420,9 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid if (bd->GlVersion >= 310) glDisable(GL_PRIMITIVE_RESTART); #endif -#ifdef IMGUI_IMPL_HAS_POLYGON_MODE - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE + if (bd->HasPolygonMode) + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT) @@ -455,9 +473,9 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxPos)); GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxUV)); GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxColor)); - GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); - GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); - GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, pos))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, uv))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, col))); } // OpenGL3 Render function. @@ -492,8 +510,8 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object); #endif -#ifdef IMGUI_IMPL_HAS_POLYGON_MODE - GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE + GLint last_polygon_mode[2]; if (bd->HasPolygonMode) { glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); } #endif GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); @@ -631,18 +649,10 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); } #endif -#ifdef IMGUI_IMPL_HAS_POLYGON_MODE +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE // Desktop OpenGL 3.0 and OpenGL 3.1 had separate polygon draw modes for front-facing and back-facing faces of polygons - if (bd->GlVersion <= 310 || bd->GlProfileIsCompat) - { - glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); - glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); - } - else - { - glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); - } -#endif // IMGUI_IMPL_HAS_POLYGON_MODE + if (bd->HasPolygonMode) { if (bd->GlVersion <= 310 || bd->GlProfileIsCompat) { glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); } else { glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); } } +#endif // IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); @@ -739,6 +749,10 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects() GLint last_texture, last_array_buffer; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK + GLint last_pixel_unpack_buffer = 0; + if (bd->GlVersion >= 210) { glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &last_pixel_unpack_buffer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); } +#endif #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); @@ -912,6 +926,9 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects() // Restore modified GL state glBindTexture(GL_TEXTURE_2D, last_texture); glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK + if (bd->GlVersion >= 210) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, last_pixel_unpack_buffer); } +#endif #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY glBindVertexArray(last_vertex_array); #endif @@ -928,9 +945,13 @@ void ImGui_ImplOpenGL3_DestroyDeviceObjects() ImGui_ImplOpenGL3_DestroyFontsTexture(); } +//----------------------------------------------------------------------------- + #if defined(__GNUC__) #pragma GCC diagnostic pop #endif #if defined(__clang__) #pragma clang diagnostic pop #endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/extern/src/imgui/imgui_impl_opengl3.h b/extern/src/imgui/imgui_impl_opengl3.h index 77d11801..d66a15eb 100644 --- a/extern/src/imgui/imgui_impl_opengl3.h +++ b/extern/src/imgui/imgui_impl_opengl3.h @@ -14,8 +14,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // About GLSL version: // The 'glsl_version' initialization parameter should be nullptr (default) or a "#version XXX" string. @@ -24,6 +27,7 @@ #pragma once #include "imgui.h" // IMGUI_IMPL_API +#ifndef IMGUI_DISABLE // Backend API IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr); @@ -37,9 +41,9 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture(); IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects(); IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects(); -// Specific OpenGL ES versions -//#define IMGUI_IMPL_OPENGL_ES2 // Auto-detected on Emscripten -//#define IMGUI_IMPL_OPENGL_ES3 // Auto-detected on iOS/Android +// Configuration flags to add in your imconfig file: +//#define IMGUI_IMPL_OPENGL_ES2 // Enable ES 2 (Auto-detected on Emscripten) +//#define IMGUI_IMPL_OPENGL_ES3 // Enable ES 3 (Auto-detected on iOS/Android) // You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line. #if !defined(IMGUI_IMPL_OPENGL_ES2) \ @@ -58,3 +62,5 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects(); #endif #endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/extern/src/imgui/imgui_impl_opengl3_loader.h b/extern/src/imgui/imgui_impl_opengl3_loader.h index 7ca72e37..3fbc3481 100644 --- a/extern/src/imgui/imgui_impl_opengl3_loader.h +++ b/extern/src/imgui/imgui_impl_opengl3_loader.h @@ -10,7 +10,7 @@ // THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE. // // IF YOU GET BUILD ERRORS IN THIS FILE (commonly macro redefinitions or function redefinitions): -// IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCUDING 'imgui_impl_opengl3_loader.h' +// IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCLUDING 'imgui_impl_opengl3_loader.h' // IN THE SAME COMPILATION UNIT AS ONE OF YOUR FILE WHICH IS USING A THIRD-PARTY OPENGL LOADER. // (e.g. COULD HAPPEN IF YOU ARE DOING A UNITY/JUMBO BUILD, OR INCLUDING .CPP FILES FROM OTHERS) // YOU SHOULD NOT BUILD BOTH IN THE SAME COMPILATION UNIT. @@ -18,7 +18,7 @@ // WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT. // // Regenerate with: -// python gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt +// python3 gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt // // More info: // https://github.com/dearimgui/gl3w_stripped @@ -346,6 +346,10 @@ GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #endif #endif /* GL_VERSION_2_0 */ +#ifndef GL_VERSION_2_1 +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#endif /* GL_VERSION_2_1 */ #ifndef GL_VERSION_3_0 typedef khronos_uint16_t GLhalf; #define GL_MAJOR_VERSION 0x821B @@ -467,7 +471,7 @@ GL3W_API int imgl3wIsSupported(int major, int minor); GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc); /* gl3w internal state */ -union GL3WProcs { +union ImGL3WProcs { GL3WglProc ptr[59]; struct { PFNGLACTIVETEXTUREPROC ActiveTexture; @@ -532,7 +536,7 @@ union GL3WProcs { } gl; }; -GL3W_API extern union GL3WProcs imgl3wProcs; +GL3W_API extern union ImGL3WProcs imgl3wProcs; /* OpenGL functions */ #define glActiveTexture imgl3wProcs.gl.ActiveTexture @@ -608,7 +612,7 @@ extern "C" { #include -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define GL3W_ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #if defined(_WIN32) #ifndef WIN32_LEAN_AND_MEAN @@ -661,26 +665,123 @@ static GL3WglProc get_proc(const char *proc) #else #include -static void *libgl; -static GL3WglProc (*glx_get_proc_address)(const GLubyte *); +static void* libgl; // OpenGL library +static void* libglx; // GLX library +static void* libegl; // EGL library +static GL3WGetProcAddressProc gl_get_proc_address; + +static void close_libgl(void) +{ + if (libgl) { + dlclose(libgl); + libgl = NULL; + } + if (libegl) { + dlclose(libegl); + libegl = NULL; + } + if (libglx) { + dlclose(libglx); + libglx = NULL; + } +} + +static int is_library_loaded(const char* name, void** lib) +{ + *lib = dlopen(name, RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD); + return *lib != NULL; +} + +static int open_libs(void) +{ + // On Linux we have two APIs to get process addresses: EGL and GLX. + // EGL is supported under both X11 and Wayland, whereas GLX is X11-specific. + + libgl = NULL; + libegl = NULL; + libglx = NULL; + + // First check what's already loaded, the windowing library might have + // already loaded either EGL or GLX and we want to use the same one. + + if (is_library_loaded("libEGL.so.1", &libegl) || + is_library_loaded("libGLX.so.0", &libglx)) { + libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL); + if (libgl) + return GL3W_OK; + else + close_libgl(); + } + + if (is_library_loaded("libGL.so", &libgl)) + return GL3W_OK; + if (is_library_loaded("libGL.so.1", &libgl)) + return GL3W_OK; + if (is_library_loaded("libGL.so.3", &libgl)) + return GL3W_OK; + + // Neither is already loaded, so we have to load one. Try EGL first + // because it is supported under both X11 and Wayland. + + // Load OpenGL + EGL + libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL); + libegl = dlopen("libEGL.so.1", RTLD_LAZY | RTLD_LOCAL); + if (libgl && libegl) + return GL3W_OK; + else + close_libgl(); + + // Fall back to legacy libGL, which includes GLX + // While most systems use libGL.so.1, NetBSD seems to use that libGL.so.3. See https://github.com/ocornut/imgui/issues/6983 + libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL); + if (!libgl) + libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); + if (!libgl) + libgl = dlopen("libGL.so.3", RTLD_LAZY | RTLD_LOCAL); + + if (libgl) + return GL3W_OK; + + return GL3W_ERROR_LIBRARY_OPEN; +} static int open_libgl(void) { - libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); - if (!libgl) + int res = open_libs(); + if (res) + return res; + + if (libegl) + *(void**)(&gl_get_proc_address) = dlsym(libegl, "eglGetProcAddress"); + else if (libglx) + *(void**)(&gl_get_proc_address) = dlsym(libglx, "glXGetProcAddressARB"); + else + *(void**)(&gl_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB"); + + if (!gl_get_proc_address) { + close_libgl(); return GL3W_ERROR_LIBRARY_OPEN; - *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB"); + } + return GL3W_OK; } -static void close_libgl(void) { dlclose(libgl); } - -static GL3WglProc get_proc(const char *proc) +static GL3WglProc get_proc(const char* proc) { - GL3WglProc res; - res = glx_get_proc_address((const GLubyte *)proc); + GL3WglProc res = NULL; + + // Before EGL version 1.5, eglGetProcAddress doesn't support querying core + // functions and may return a dummy function if we try, so try to load the + // function from the GL library directly first. + if (libegl) + *(void**)(&res) = dlsym(libgl, proc); + if (!res) - *(void **)(&res) = dlsym(libgl, proc); + res = gl_get_proc_address(proc); + + if (!libegl && !res) + *(void**)(&res) = dlsym(libgl, proc); + return res; } #endif @@ -794,12 +895,12 @@ static const char *proc_names[] = { "glViewport", }; -GL3W_API union GL3WProcs imgl3wProcs; +GL3W_API union ImGL3WProcs imgl3wProcs; static void load_procs(GL3WGetProcAddressProc proc) { size_t i; - for (i = 0; i < ARRAY_SIZE(proc_names); i++) + for (i = 0; i < GL3W_ARRAY_SIZE(proc_names); i++) imgl3wProcs.ptr[i] = proc(proc_names[i]); } diff --git a/extern/src/imgui/imgui_internal.h b/extern/src/imgui/imgui_internal.h index 3311d659..f2ac5ad0 100644 --- a/extern/src/imgui/imgui_internal.h +++ b/extern/src/imgui/imgui_internal.h @@ -1,12 +1,7 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (internal structures/api) // You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility. -// To implement maths operators for ImVec2 (disabled by default to not conflict with using IM_VEC2_CLASS_EXTRA with your own math types+operators), use: -/* -#define IMGUI_DEFINE_MATH_OPERATORS -#include "imgui_internal.h" -*/ /* @@ -20,9 +15,12 @@ Index of this file: // [SECTION] Generic helpers // [SECTION] ImDrawList support // [SECTION] Widgets support: flags, enums, data structures +// [SECTION] Data types support +// [SECTION] Popup support // [SECTION] Inputs support // [SECTION] Clipper support // [SECTION] Navigation support +// [SECTION] Typing-select support // [SECTION] Columns support // [SECTION] Multi-select support // [SECTION] Docking support @@ -81,7 +79,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' #endif #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor() #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h #pragma clang diagnostic ignored "-Wold-style-cast" @@ -89,6 +87,8 @@ Index of this file: #pragma clang diagnostic ignored "-Wdouble-promotion" #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision #pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn' +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -126,7 +126,7 @@ struct ImDrawListSharedData; // Data shared between all ImDrawList instan struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it struct ImGuiContext; // Main Dear ImGui context struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine -struct ImGuiDataVarInfo; // Variable information (e.g. to avoid style variables from an enum) +struct ImGuiDataVarInfo; // Variable information (e.g. to access style variables from an enum) struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box @@ -135,6 +135,7 @@ struct ImGuiLastItemData; // Status storage for last submitted items struct ImGuiLocEntry; // A localization entry. struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result +struct ImGuiNavTreeNodeData; // Temporary storage for last TreeNode() being a Left arrow landing candidate. struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions struct ImGuiNextWindowData; // Storage for SetNextWindow** functions struct ImGuiNextItemData; // Storage for SetNextItem** functions @@ -147,11 +148,14 @@ struct ImGuiStyleMod; // Stacked style modifier, backup of modifie struct ImGuiTabBar; // Storage for a tab bar struct ImGuiTabItem; // Storage for a tab item (within a tab bar) struct ImGuiTable; // Storage for a table +struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow() struct ImGuiTableColumn; // Storage for one column of a table struct ImGuiTableInstanceData; // Storage for one instance of a same table struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. struct ImGuiTableSettings; // Storage for a table .ini settings struct ImGuiTableColumnsSettings; // Storage for a column .ini settings +struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest() +struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public) struct ImGuiWindow; // Storage for one window struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) @@ -165,7 +169,6 @@ typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // E typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later) typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow(); -typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc. typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() @@ -177,6 +180,8 @@ typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // F typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() +typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest() +typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy() typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); @@ -196,13 +201,13 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer namespace ImStb { -#undef STB_TEXTEDIT_STRING -#undef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_STRING ImGuiInputTextState -#define STB_TEXTEDIT_CHARTYPE ImWchar -#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#undef IMSTB_TEXTEDIT_STRING +#undef IMSTB_TEXTEDIT_CHARTYPE +#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState +#define IMSTB_TEXTEDIT_CHARTYPE ImWchar +#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) +#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99 +#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999 #include "imstb_textedit.h" } // namespace ImStb @@ -227,13 +232,14 @@ namespace ImStb #else #define IMGUI_DEBUG_LOG(...) ((void)0) #endif -#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) // Static Asserts #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") @@ -266,8 +272,13 @@ namespace ImStb #define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 -#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds +#define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // ImTrunc() is not inlined in MSVC debug builds #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // +#define IM_STRINGIFY_HELPER(_X) #_X +#define IM_STRINGIFY(_X) IM_STRINGIFY_HELPER(_X) // Preprocessor idiom to stringify e.g. an integer. +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +#define IM_FLOOR IM_TRUNC +#endif // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall #ifdef _MSC_VER @@ -292,16 +303,28 @@ namespace ImStb #elif defined(__clang__) #define IM_DEBUG_BREAK() __builtin_debugtrap() #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03") +#define IM_DEBUG_BREAK() __asm__ volatile("int3;nop") #elif defined(__GNUC__) && defined(__thumb__) #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01") #elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__) -#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0"); +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0") #else #define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! #endif #endif // #ifndef IM_DEBUG_BREAK +// Format specifiers, printing 64-bit hasn't been decently standardized... +// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. +#if defined(_MSC_VER) && !defined(__clang__) +#define IM_PRId64 "I64d" +#define IM_PRIu64 "I64u" +#define IM_PRIX64 "I64X" +#else +#define IM_PRId64 "lld" +#define IM_PRIu64 "llu" +#define IM_PRIX64 "llX" +#endif + //----------------------------------------------------------------------------- // [SECTION] Generic helpers // Note that the ImXXX helpers functions are lower-level than ImGui functions. @@ -345,18 +368,18 @@ static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } // Helpers: String -IMGUI_API int ImStricmp(const char* str1, const char* str2); -IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); -IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); -IMGUI_API char* ImStrdup(const char* str); -IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); -IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); -IMGUI_API int ImStrlenW(const ImWchar* str); +IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare. +IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count. +IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't). +IMGUI_API char* ImStrdup(const char* str); // Duplicate a string. +IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed. +IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range. IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line -IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line -IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); -IMGUI_API void ImStrTrimBlanks(char* str); -IMGUI_API const char* ImStrSkipBlank(const char* str); +IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); // Find a substring in a string range. +IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer. +IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character. +IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string) +IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line (ImWchar string) IM_MSVC_RUNTIME_CHECKS_OFF static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; } static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } @@ -383,6 +406,8 @@ IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, co IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 +IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr); // return previous UTF-8 code-point. +IMGUI_API int ImTextCountLines(const char* in_text, const char* in_text_end); // return number of lines taken by text. trailing carriage return doesn't count as an extra line. // Helpers: File System #ifdef IMGUI_DISABLE_FILE_FUNCTIONS @@ -418,7 +443,6 @@ IM_MSVC_RUNTIME_CHECKS_OFF #define ImAcos(X) acosf(X) #define ImAtan2(Y, X) atan2f((Y), (X)) #define ImAtof(STR) atof(STR) -//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() #define ImCeil(X) ceilf(X) static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision static inline double ImPow(double x, double y) { return pow(x, y); } @@ -456,10 +480,10 @@ static inline float ImSaturate(float f) static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; } -static inline float ImFloor(float f) { return (float)(int)(f); } -static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() -static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } -static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); } +static inline float ImTrunc(float f) { return (float)(int)(f); } +static inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } +static inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() +static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); } static inline int ImModPositive(int a, int b) { return (a + b) % b; } static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } @@ -478,7 +502,8 @@ IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); -inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; } // Helper: ImVec1 (1D vector) // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) @@ -522,6 +547,7 @@ struct IMGUI_API ImRect ImVec2 GetBR() const { return Max; } // Bottom-right bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } + bool ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; } bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } @@ -532,7 +558,7 @@ struct IMGUI_API ImRect void TranslateY(float dy) { Min.y += dy; Max.y += dy; } void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. - void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } + void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); } bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } }; @@ -671,9 +697,6 @@ struct ImPool int GetBufSize() const { return Buf.Size; } int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); } -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304) -#endif }; // Helper: ImChunkStream<> @@ -697,7 +720,6 @@ struct ImChunkStream int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } void swap(ImChunkStream& rhs) { rhs.Buf.swap(Buf); } - }; // Helper: ImGuiTextIndex<> @@ -770,12 +792,10 @@ struct IMGUI_API ImDrawListSharedData struct ImDrawDataBuilder { - ImVector Layers[2]; // Global layers for: regular, tooltip + ImVector* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData. + ImVector LayerData1; - void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } - void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } - int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } - IMGUI_API void FlattenIntoSingleLayer(); + ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); } }; //----------------------------------------------------------------------------- @@ -800,9 +820,11 @@ enum ImGuiItemFlags_ ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable() + ImGuiItemFlags_AllowOverlap = 1 << 9, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame. // Controlled by widget code ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature. + ImGuiItemFlags_HasSelectionUserData = 1 << 11, // false // Set by SetNextItemSelectionUserData() }; // Status flags for an already submitted item @@ -818,8 +840,9 @@ enum ImGuiItemStatusFlags_ ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. - ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon) - ImGuiItemStatusFlags_Visible = 1 << 9, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()). + ImGuiItemStatusFlags_Visible = 1 << 8, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()). + ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid. + ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd(). // Additional status + semantic for ImGuiTestEngine #ifdef IMGUI_ENABLE_TEST_ENGINE @@ -831,6 +854,14 @@ enum ImGuiItemStatusFlags_ #endif }; +// Extend ImGuiHoveredFlags_ +enum ImGuiHoveredFlagsPrivate_ +{ + ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay, + ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary, + ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_, +}; + // Extend ImGuiInputTextFlags_ enum ImGuiInputTextFlagsPrivate_ { @@ -838,6 +869,7 @@ enum ImGuiInputTextFlagsPrivate_ ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. + ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 29, // For internal use by InputScalar() and TempInputScalar() }; // Extend ImGuiButtonFlags_ @@ -851,13 +883,13 @@ enum ImGuiButtonFlagsPrivate_ ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping - ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() + ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable. ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) - ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags) + ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags) ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) @@ -875,7 +907,7 @@ enum ImGuiComboFlagsPrivate_ enum ImGuiSliderFlagsPrivate_ { ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? - ImGuiSliderFlags_ReadOnly = 1 << 21, + ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead. }; // Extend ImGuiSelectableFlags_ @@ -896,6 +928,7 @@ enum ImGuiSelectableFlagsPrivate_ enum ImGuiTreeNodeFlagsPrivate_ { ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20, + ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 21,// (FIXME-WIP) Turn Down arrow into an Up arrow, but reversed trees (#6517) }; enum ImGuiSeparatorFlags_ @@ -925,7 +958,7 @@ enum ImGuiTextFlags_ enum ImGuiTooltipFlags_ { ImGuiTooltipFlags_None = 0, - ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append) + ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append) }; // FIXME: this is in development, not exposed/functional as a generic feature yet. @@ -959,43 +992,6 @@ enum ImGuiPlotType ImGuiPlotType_Histogram, }; -enum ImGuiPopupPositionPolicy -{ - ImGuiPopupPositionPolicy_Default, - ImGuiPopupPositionPolicy_ComboBox, - ImGuiPopupPositionPolicy_Tooltip, -}; - -struct ImGuiDataVarInfo -{ - ImGuiDataType Type; - ImU32 Count; // 1+ - ImU32 Offset; // Offset in parent structure - void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); } -}; - -struct ImGuiDataTypeTempStorage -{ - ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT -}; - -// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). -struct ImGuiDataTypeInfo -{ - size_t Size; // Size in bytes - const char* Name; // Short descriptive name for the type, for debugging - const char* PrintFmt; // Default printf format for the type - const char* ScanFmt; // Default scanf format for the type -}; - -// Extend ImGuiDataType_ -enum ImGuiDataTypePrivate_ -{ - ImGuiDataType_String = ImGuiDataType_COUNT + 1, - ImGuiDataType_Pointer, - ImGuiDataType_ID, -}; - // Stacked color modifier, backup of modified data so we can restore it struct ImGuiColorMod { @@ -1032,6 +1028,7 @@ struct IMGUI_API ImGuiGroupData ImGuiID WindowID; ImVec2 BackupCursorPos; ImVec2 BackupCursorMaxPos; + ImVec2 BackupCursorPosPrevLine; ImVec1 BackupIndent; ImVec1 BackupGroupOffset; ImVec2 BackupCurrLineSize; @@ -1039,6 +1036,7 @@ struct IMGUI_API ImGuiGroupData ImGuiID BackupActiveIdIsAlive; bool BackupActiveIdPreviousFrameIsAlive; bool BackupHoveredIdIsAlive; + bool BackupIsSameLine; bool EmitItem; }; @@ -1078,7 +1076,7 @@ struct IMGUI_API ImGuiInputTextState int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. ImVector TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. ImVector TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. - ImVector InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) + ImVector InitialTextA; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered) bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) int BufCapacityA; // end-user buffer capacity float ScrollX; // horizontal scrolling/offset @@ -1088,12 +1086,15 @@ struct IMGUI_API ImGuiInputTextState bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection bool Edited; // edited this frame ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set. + bool ReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version. + int ReloadSelectionStart; // POSITIONS ARE IN IMWCHAR units *NOT* UTF-8 this is why this is not exposed yet. + int ReloadSelectionEnd; ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } int GetUndoAvailCount() const { return Stb.undostate.undo_point; } - int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } + int GetRedoAvailCount() const { return IMSTB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation // Cursor & Selection @@ -1105,21 +1106,25 @@ struct IMGUI_API ImGuiInputTextState int GetSelectionStart() const { return Stb.select_start; } int GetSelectionEnd() const { return Stb.select_end; } void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } + + // Reload user buf (WIP #2890) + // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this) + // strcpy(my_buf, "hello"); + // if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item + // state->ReloadUserBufAndSelectAll(); + void ReloadUserBufAndSelectAll() { ReloadUserBuf = true; ReloadSelectionStart = 0; ReloadSelectionEnd = INT_MAX; } + void ReloadUserBufAndKeepSelection() { ReloadUserBuf = true; ReloadSelectionStart = Stb.select_start; ReloadSelectionEnd = Stb.select_end; } + void ReloadUserBufAndMoveToEnd() { ReloadUserBuf = true; ReloadSelectionStart = ReloadSelectionEnd = INT_MAX; } + }; -// Storage for current popup stack -struct ImGuiPopupData +enum ImGuiWindowRefreshFlags_ { - ImGuiID PopupId; // Set on OpenPopup() - ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() - ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close - int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value - int OpenFrameCount; // Set on OpenPopup() - ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) - ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) - ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup - - ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } + ImGuiWindowRefreshFlags_None = 0, + ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND. + ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover + ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus + // Refresh policy/frequency, Load Balancing etc. }; enum ImGuiNextWindowDataFlags_ @@ -1133,6 +1138,8 @@ enum ImGuiNextWindowDataFlags_ ImGuiNextWindowDataFlags_HasFocus = 1 << 5, ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, ImGuiNextWindowDataFlags_HasScroll = 1 << 7, + ImGuiNextWindowDataFlags_HasChildFlags = 1 << 8, + ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 9, }; // Storage for SetNexWindow** functions @@ -1147,34 +1154,45 @@ struct ImGuiNextWindowData ImVec2 SizeVal; ImVec2 ContentSizeVal; ImVec2 ScrollVal; + ImGuiChildFlags ChildFlags; bool CollapsedVal; ImRect SizeConstraintRect; ImGuiSizeCallback SizeCallback; void* SizeCallbackUserData; float BgAlphaVal; // Override background alpha ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?) + ImGuiWindowRefreshFlags RefreshFlagsVal; ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } }; +// Multi-Selection item index or identifier when using SetNextItemSelectionUserData()/BeginMultiSelect() +// (Most users are likely to use this store an item INDEX but this may be used to store a POINTER as well.) +typedef ImS64 ImGuiSelectionUserData; + enum ImGuiNextItemDataFlags_ { - ImGuiNextItemDataFlags_None = 0, - ImGuiNextItemDataFlags_HasWidth = 1 << 0, - ImGuiNextItemDataFlags_HasOpen = 1 << 1, + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1, + ImGuiNextItemDataFlags_HasShortcut = 1 << 2, }; struct ImGuiNextItemData { ImGuiNextItemDataFlags Flags; - float Width; // Set by SetNextItemWidth() - ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) - ImGuiCond OpenCond; - bool OpenVal; // Set by SetNextItemOpen() + ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap. + // Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem() + ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values) + float Width; // Set by SetNextItemWidth() + ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut() + ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut() + bool OpenVal; // Set by SetNextItemOpen() + ImGuiCond OpenCond : 8; - ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } - inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! + ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; } + inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()! }; // Status storage for the last submitted item @@ -1185,11 +1203,24 @@ struct ImGuiLastItemData ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_ ImRect Rect; // Full rectangle ImRect NavRect; // Navigation scoring rectangle (not displayed) - ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set) + // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags ar set. + ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set. + ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set.. + ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set.. ImGuiLastItemData() { memset(this, 0, sizeof(*this)); } }; +// Store data emitted by TreeNode() for usage by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere. +// This is the minimum amount of data that we need to perform the equivalent of NavApplyItemToResult() and which we can't infer in TreePop() +// Only stored when the node is a potential candidate for landing on a Left arrow jump. +struct ImGuiNavTreeNodeData +{ + ImGuiID ID; + ImGuiItemFlags InFlags; + ImRect NavRect; +}; + struct IMGUI_API ImGuiStackSizes { short SizeOfIDStack; @@ -1210,9 +1241,9 @@ struct IMGUI_API ImGuiStackSizes // Data saved for each window pushed into the stack struct ImGuiWindowStackData { - ImGuiWindow* Window; - ImGuiLastItemData ParentLastItemDataBackup; - ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting + ImGuiWindow* Window; + ImGuiLastItemData ParentLastItemDataBackup; + ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting }; struct ImGuiShrinkWidthItem @@ -1231,6 +1262,66 @@ struct ImGuiPtrOrIndex ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } }; +//----------------------------------------------------------------------------- +// [SECTION] Data types support +//----------------------------------------------------------------------------- + +struct ImGuiDataVarInfo +{ + ImGuiDataType Type; + ImU32 Count; // 1+ + ImU32 Offset; // Offset in parent structure + void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); } +}; + +struct ImGuiDataTypeTempStorage +{ + ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT +}; + +// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). +struct ImGuiDataTypeInfo +{ + size_t Size; // Size in bytes + const char* Name; // Short descriptive name for the type, for debugging + const char* PrintFmt; // Default printf format for the type + const char* ScanFmt; // Default scanf format for the type +}; + +// Extend ImGuiDataType_ +enum ImGuiDataTypePrivate_ +{ + ImGuiDataType_String = ImGuiDataType_COUNT + 1, + ImGuiDataType_Pointer, + ImGuiDataType_ID, +}; + +//----------------------------------------------------------------------------- +// [SECTION] Popup support +//----------------------------------------------------------------------------- + +enum ImGuiPopupPositionPolicy +{ + ImGuiPopupPositionPolicy_Default, + ImGuiPopupPositionPolicy_ComboBox, + ImGuiPopupPositionPolicy_Tooltip, +}; + +// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack) +struct ImGuiPopupData +{ + ImGuiID PopupId; // Set on OpenPopup() + ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() + ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close + int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value + int OpenFrameCount; // Set on OpenPopup() + ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) + ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) + ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup + + ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } +}; + //----------------------------------------------------------------------------- // [SECTION] Inputs support //----------------------------------------------------------------------------- @@ -1278,7 +1369,6 @@ enum ImGuiInputSource ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them. ImGuiInputSource_Keyboard, ImGuiInputSource_Gamepad, - ImGuiInputSource_Clipboard, // Currently only used by InputText() ImGuiInputSource_COUNT }; @@ -1312,7 +1402,8 @@ struct ImGuiInputEvent // Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior. #define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. -#define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner. +#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner. +//#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit. typedef ImS16 ImGuiKeyRoutingIndex; @@ -1320,12 +1411,13 @@ typedef ImS16 ImGuiKeyRoutingIndex; struct ImGuiKeyRoutingData { ImGuiKeyRoutingIndex NextEntryIndex; - ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super. + ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. + ImU8 RoutingCurrScore; // [DEBUG] For debug display ImU8 RoutingNextScore; // Lower is better (0: perfect score) ImGuiID RoutingCurr; ImGuiID RoutingNext; - ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; } + ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; } }; // Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching. @@ -1349,53 +1441,47 @@ struct ImGuiKeyOwnerData bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame. bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well. - ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; } + ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; } }; +// Extend ImGuiInputFlags_ // Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() -// Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function) -enum ImGuiInputFlags_ +// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function) +enum ImGuiInputFlagsPrivate_ { - // Flags for IsKeyPressed(), IsMouseClicked(), Shortcut() - ImGuiInputFlags_None = 0, - ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. - ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) - ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast - ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster - ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, - - // Flags for SetItemKeyOwner() - ImGuiInputFlags_CondHovered = 1 << 4, // Only set if item is hovered (default to both) - ImGuiInputFlags_CondActive = 1 << 5, // Only set if item is active (default to both) - ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, - ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, + // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut() + // - Repeat mode: Repeat rate selection + ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) + ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast + ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster + // - Repeat mode: Specify when repeating key pressed can be interrupted. + // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in. + ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior. + ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut) + ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6, // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod. + ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat // Flags for SetKeyOwner(), SetItemKeyOwner() - ImGuiInputFlags_LockThisFrame = 1 << 6, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. - ImGuiInputFlags_LockUntilRelease = 1 << 7, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. + // - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary. + ImGuiInputFlags_LockThisFrame = 1 << 20, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. + ImGuiInputFlags_LockUntilRelease = 1 << 21, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. - // Routing policies for Shortcut() + low-level SetShortcutRouting() - // - The general idea is that several callers register interest in a shortcut, and only one owner gets it. - // - When a policy (other than _RouteAlways) is set, Shortcut() will register itself with SetShortcutRouting(), - // allowing the system to decide where to route the input among other route-aware calls. - // - Shortcut() uses ImGuiInputFlags_RouteFocused by default: meaning that a simple Shortcut() poll - // will register a route and only succeed when parent window is in the focus stack and if no-one - // with a higher priority is claiming the shortcut. - // - Using ImGuiInputFlags_RouteAlways is roughly equivalent to doing e.g. IsKeyPressed(key) + testing mods. - // - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow. - // - Can select only 1 policy among all available. - ImGuiInputFlags_RouteFocused = 1 << 8, // (Default) Register focused route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window. - ImGuiInputFlags_RouteGlobalLow = 1 << 9, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority. - ImGuiInputFlags_RouteGlobal = 1 << 10, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText). - ImGuiInputFlags_RouteGlobalHigh = 1 << 11, // Register route globally (highest priority: unlikely you need to use that: will interfere with every active items) - ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this! - ImGuiInputFlags_RouteAlways = 1 << 12, // Do not register route, poll keys directly. - ImGuiInputFlags_RouteUnlessBgFocused= 1 << 13, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications. - ImGuiInputFlags_RouteExtraMask_ = ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused, + // - Condition for SetItemKeyOwner() + ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both) + ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both) + ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, // [Internal] Mask of which function support which flags - ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_, - ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteExtraMask_, + ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, + ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress, + ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_, + ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, + ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways, + ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow, + ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_, + ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat, + ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_, + ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip, ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease, ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_, }; @@ -1440,6 +1526,8 @@ enum ImGuiActivateFlags_ ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key. ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used. ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) + ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request + ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function. }; // Early work-in-progress API for ScrollToItem() @@ -1460,8 +1548,7 @@ enum ImGuiScrollFlags_ enum ImGuiNavHighlightFlags_ { ImGuiNavHighlightFlags_None = 0, - ImGuiNavHighlightFlags_TypeDefault = 1 << 0, - ImGuiNavHighlightFlags_TypeThin = 1 << 1, + ImGuiNavHighlightFlags_Compact = 1 << 1, // Compact highlight, no padding ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. ImGuiNavHighlightFlags_NoRounding = 1 << 3, }; @@ -1479,10 +1566,13 @@ enum ImGuiNavMoveFlags_ ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary ImGuiNavMoveFlags_Forwarded = 1 << 7, ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result - ImGuiNavMoveFlags_FocusApi = 1 << 9, - ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight - ImGuiNavMoveFlags_Activate = 1 << 11, - ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight + ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details) + ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight + ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request. + ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item. + ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo + ImGuiNavMoveFlags_NoSetNavHighlight = 1 << 14, // Do not alter the visible state of keyboard vs mouse nav highlight + ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result }; enum ImGuiNavLayer @@ -1502,16 +1592,60 @@ struct ImGuiNavItemData float DistBox; // Move // Best candidate box distance to current NavId float DistCenter; // Move // Best candidate center distance to current NavId float DistAxial; // Move // Best candidate axial distance to current NavId + ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionData() value. ImGuiNavItemData() { Clear(); } - void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; } + void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; } +}; + +struct ImGuiFocusScopeData +{ + ImGuiID ID; + ImGuiID WindowID; +}; + +//----------------------------------------------------------------------------- +// [SECTION] Typing-select support +//----------------------------------------------------------------------------- + +// Flags for GetTypingSelectRequest() +enum ImGuiTypingSelectFlags_ +{ + ImGuiTypingSelectFlags_None = 0, + ImGuiTypingSelectFlags_AllowBackspace = 1 << 0, // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state) + ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times. +}; + +// Returned by GetTypingSelectRequest(), designed to eventually be public. +struct IMGUI_API ImGuiTypingSelectRequest +{ + ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest() + int SearchBufferLen; + const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize). + bool SelectRequest; // Set when buffer was modified this frame, requesting a selection. + bool SingleCharMode; // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication. + ImS8 SingleCharSize; // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input. +}; + +// Storage for GetTypingSelectRequest() +struct IMGUI_API ImGuiTypingSelectState +{ + ImGuiTypingSelectRequest Request; // User-facing data + char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient. + ImGuiID FocusScope; + int LastRequestFrame = 0; + float LastRequestTime = 0.0f; + bool SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing. + + ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); } + void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging }; //----------------------------------------------------------------------------- // [SECTION] Columns support //----------------------------------------------------------------------------- -// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! +// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays! enum ImGuiOldColumnFlags_ { ImGuiOldColumnFlags_None = 0, @@ -1519,16 +1653,16 @@ enum ImGuiOldColumnFlags_ ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window - ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. + ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. // Obsolete names (will be removed) #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, - ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, - ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, - ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, - ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, - ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, + //ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, + //ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, + //ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, + //ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, + //ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, + //ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, #endif }; @@ -1567,6 +1701,9 @@ struct ImGuiOldColumns // [SECTION] Multi-select support //----------------------------------------------------------------------------- +// We always assume that -1 is an invalid value (which works for indices and pointers) +#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1) + #ifdef IMGUI_HAS_MULTI_SELECT // #endif // #ifdef IMGUI_HAS_MULTI_SELECT @@ -1587,18 +1724,17 @@ struct ImGuiOldColumns // Every instance of ImGuiViewport is in fact a ImGuiViewportP. struct ImGuiViewportP : public ImGuiViewport { - int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used - ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. + int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used + ImDrawList* BgFgDrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. ImDrawData DrawDataP; - ImDrawDataBuilder DrawDataBuilder; - + ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. - ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } - ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } + ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; } + ~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); } // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } @@ -1624,6 +1760,7 @@ struct ImGuiWindowSettings ImVec2ih Pos; ImVec2ih Size; bool Collapsed; + bool IsChild; bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) bool WantDelete; // Set to invalidate/delete the settings entry @@ -1653,6 +1790,7 @@ struct ImGuiSettingsHandler // This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack. enum ImGuiLocKey : int { + ImGuiLocKey_VersionStr, ImGuiLocKey_TableSizeOne, ImGuiLocKey_TableSizeAllFit, ImGuiLocKey_TableSizeAllDefault, @@ -1677,30 +1815,53 @@ struct ImGuiLocEntry enum ImGuiDebugLogFlags_ { // Event types - ImGuiDebugLogFlags_None = 0, - ImGuiDebugLogFlags_EventActiveId = 1 << 0, - ImGuiDebugLogFlags_EventFocus = 1 << 1, - ImGuiDebugLogFlags_EventPopup = 1 << 2, - ImGuiDebugLogFlags_EventNav = 1 << 3, - ImGuiDebugLogFlags_EventClipper = 1 << 4, - ImGuiDebugLogFlags_EventSelection = 1 << 5, - ImGuiDebugLogFlags_EventIO = 1 << 6, - ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO, - ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY + ImGuiDebugLogFlags_None = 0, + ImGuiDebugLogFlags_EventActiveId = 1 << 0, + ImGuiDebugLogFlags_EventFocus = 1 << 1, + ImGuiDebugLogFlags_EventPopup = 1 << 2, + ImGuiDebugLogFlags_EventNav = 1 << 3, + ImGuiDebugLogFlags_EventClipper = 1 << 4, + ImGuiDebugLogFlags_EventSelection = 1 << 5, + ImGuiDebugLogFlags_EventIO = 1 << 6, + ImGuiDebugLogFlags_EventInputRouting = 1 << 7, + + ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting, + ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY + ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine +}; + +struct ImGuiDebugAllocEntry +{ + int FrameCount; + ImS16 AllocCount; + ImS16 FreeCount; +}; + +struct ImGuiDebugAllocInfo +{ + int TotalAllocCount; // Number of call to MemAlloc(). + int TotalFreeCount; + ImS16 LastEntriesIdx; // Current index in buffer + ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations + + ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); } }; struct ImGuiMetricsConfig { bool ShowDebugLog = false; - bool ShowStackTool = false; + bool ShowIDStackTool = false; bool ShowWindowsRects = false; bool ShowWindowsBeginOrder = false; bool ShowTablesRects = false; bool ShowDrawCmdMesh = true; bool ShowDrawCmdBoundingBoxes = true; + bool ShowTextEncodingViewer = false; bool ShowAtlasTintedWithTextColor = false; int ShowWindowsRectsType = -1; int ShowTablesRectsType = -1; + int HighlightMonitorIdx = -1; + ImGuiID HighlightViewportID = 0; }; struct ImGuiStackLevelInfo @@ -1714,8 +1875,8 @@ struct ImGuiStackLevelInfo ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); } }; -// State for Stack tool queries -struct ImGuiStackTool +// State for ID Stack tool queries +struct ImGuiIDStackTool { int LastActiveFrame; int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level @@ -1724,7 +1885,7 @@ struct ImGuiStackTool bool CopyToClipboardOnCtrlC; float CopyToClipboardLastTime; - ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } + ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } }; //----------------------------------------------------------------------------- @@ -1758,6 +1919,7 @@ struct ImGuiContext ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. + float CurrentDpiScale; // Current window/viewport DpiScale ImDrawListSharedData DrawListSharedData; double Time; int FrameCount; @@ -1783,7 +1945,8 @@ struct ImGuiContext ImVector CurrentWindowStack; ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* int WindowsActiveCount; // Number of unique windows submitted by frame - ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) + ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING). + ImGuiID DebugBreakInWindow; // Set to break in Begin() call. ImGuiWindow* CurrentWindow; // Window being drawn into ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. @@ -1791,12 +1954,13 @@ struct ImGuiContext ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. ImVec2 WheelingWindowRefMousePos; int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL + int WheelingWindowScrolledFrame; float WheelingWindowReleaseTimer; ImVec2 WheelingWindowWheelRemainder; ImVec2 WheelingAxisAvg; // Item/widgets state and tracking information - ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] + ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] ImGuiID HoveredId; // Hovered widget, filled during the frame ImGuiID HoveredIdPreviousFrame; bool HoveredIdAllowOverlap; @@ -1812,10 +1976,11 @@ struct ImGuiContext bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. bool ActiveIdHasBeenEditedThisFrame; + bool ActiveIdFromShortcut; + int ActiveIdMouseButton : 8; ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) ImGuiWindow* ActiveIdWindow; ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad - int ActiveIdMouseButton; ImGuiID ActiveIdPreviousFrame; bool ActiveIdPreviousFrameIsAlive; bool ActiveIdPreviousFrameHasBeenEditedBefore; @@ -1823,36 +1988,43 @@ struct ImGuiContext ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. - // [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system + // Key/Input Ownership + Shortcut Routing system // - The idea is that instead of "eating" a given key, we can link to an owner. - // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID. // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame(). + double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic) + double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic) + double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed. + ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT]; ImGuiKeyRoutingTable KeysRoutingTable; ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency) + ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls. #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);' #endif // Next window/item data - ImGuiID CurrentFocusScopeId; // == g.FocusScopeStack.back() - ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() + ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId. + ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back() ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd) ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + bool DebugShowGroupRects; // Shared stacks - ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() - ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() - ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() - ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin() - ImVectorItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() - ImVectorGroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() - ImVectorOpenPopupStack; // Which popups are open (persistent) - ImVectorBeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) - int BeginMenuCount; + ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line) + ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() + ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() + ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() + ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin() + ImVector ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() + ImVector GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() + ImVector OpenPopupStack; // Which popups are open (persistent) + ImVector BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) + ImVector NavTreeNodeStack; // Stack for TreeNode() when a NavLeft requested is emitted. // Viewports ImVector Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. @@ -1860,11 +2032,14 @@ struct ImGuiContext // Gamepad/keyboard Navigation ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow' ImGuiID NavId; // Focused item for navigation - ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) + ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope) + ImVector NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain. ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem() ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0 ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat) ImGuiActivateFlags NavActivateFlags; + ImGuiID NavHighlightActivatedId; + float NavHighlightActivatedTimer; ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). ImGuiKeyChord NavJustMovedToKeyMods; @@ -1872,6 +2047,7 @@ struct ImGuiContext ImGuiActivateFlags NavNextActivateFlags; ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. + ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data. bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) @@ -1902,20 +2078,20 @@ struct ImGuiContext ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) - ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828) - ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab + ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828) + ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X) ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents float NavWindowingTimer; float NavWindowingHighlightAlpha; bool NavWindowingToggleLayer; + ImGuiKey NavWindowingToggleKey; ImVec2 NavWindowingAccumDeltaPos; ImVec2 NavWindowingAccumDeltaSize; // Render float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) - ImGuiMouseCursor MouseCursor; // Drag and Drop bool DragDropActive; @@ -1926,6 +2102,7 @@ struct ImGuiContext int DragDropMouseButton; ImGuiPayload DragDropPayload; ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) + ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing ImGuiID DragDropTargetId; ImGuiDragDropFlags DragDropAcceptFlags; float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) @@ -1942,6 +2119,7 @@ struct ImGuiContext // Tables ImGuiTable* CurrentTable; + ImGuiID DebugBreakInTable; // Set to break in BeginTable() call. int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size) ImVector TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting) ImPool Tables; // Persistent table data @@ -1955,17 +2133,25 @@ struct ImGuiContext ImVector ShrinkWidthBuffer; // Hover Delay system - ImGuiID HoverDelayId; - ImGuiID HoverDelayIdPreviousFrame; - float HoverDelayTimer; // Currently used IsItemHovered(), generally inferred from g.HoveredIdTimer but kept uncleared until clear timer elapse. - float HoverDelayClearTimer; // Currently used IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared. + ImGuiID HoverItemDelayId; + ImGuiID HoverItemDelayIdPreviousFrame; + float HoverItemDelayTimer; // Currently used by IsItemHovered() + float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared. + ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item. + ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window. + + // Mouse state + ImGuiMouseCursor MouseCursor; + float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic) + ImVec2 MouseLastValidPos; // Widget state - ImVec2 MouseLastValidPos; ImGuiInputTextState InputTextState; ImGuiInputTextDeactivatedState InputTextDeactivatedState; ImFont InputTextPasswordFont; ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. + int BeginMenuDepth; + int BeginComboDepth; ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others). ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for @@ -1974,6 +2160,8 @@ struct ImGuiContext ImU32 ColorEditSavedColor; // RGB value with alpha set to 0. ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. ImGuiComboPreviewData ComboPreviewData; + ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving + bool WindowResizeRelativeMode; float SliderGrabClickOffset; float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? @@ -1983,14 +2171,15 @@ struct ImGuiContext float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled() short DisabledStackSize; + short LockMarkEdited; short TooltipOverrideCount; ImVector ClipboardHandlerData; // If no custom clipboard handler is defined ImVector MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once + ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest() // Platform support ImGuiPlatformImeData PlatformImeData; // Data updated by current frame ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn - char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point // Settings bool SettingsLoaded; @@ -2019,17 +2208,24 @@ struct ImGuiContext int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. // Debug Tools + // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.) ImGuiDebugLogFlags DebugLogFlags; ImGuiTextBuffer DebugLogBuf; ImGuiTextIndex DebugLogIndex; - ImU8 DebugLogClipperAutoDisableFrames; + ImGuiDebugLogFlags DebugLogAutoDisableFlags; + ImU8 DebugLogAutoDisableFrames; ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above. + bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId. + ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around. bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) ImU8 DebugItemPickerMouseButton; ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID + float DebugFlashStyleColorTime; + ImVec4 DebugFlashStyleColorBackup; ImGuiMetricsConfig DebugMetricsConfig; - ImGuiStackTool DebugStackTool; + ImGuiIDStackTool DebugIDStackTool; + ImGuiDebugAllocInfo DebugAllocInfo; // Misc float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames.. @@ -2040,6 +2236,7 @@ struct ImGuiContext int WantCaptureKeyboardNextFrame; // " int WantTextInputNextFrame; ImVector TempBuffer; // Temporary text buffer + char TempKeychordName[64]; ImGuiContext(ImFontAtlas* shared_font_atlas) { @@ -2049,7 +2246,7 @@ struct ImGuiContext Initialized = false; FontAtlasOwnedByContext = shared_font_atlas ? false : true; Font = NULL; - FontSize = FontBaseSize = 0.0f; + FontSize = FontBaseSize = CurrentDpiScale = 0.0f; IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); Time = 0.0f; FrameCount = 0; @@ -2068,7 +2265,7 @@ struct ImGuiContext HoveredWindowUnderMovingWindow = NULL; MovingWindow = NULL; WheelingWindow = NULL; - WheelingWindowStartFrame = -1; + WheelingWindowStartFrame = WheelingWindowScrolledFrame = -1; WheelingWindowReleaseTimer = 0.0f; DebugHookIdInfo = 0; @@ -2085,6 +2282,7 @@ struct ImGuiContext ActiveIdHasBeenPressedBefore = false; ActiveIdHasBeenEditedBefore = false; ActiveIdHasBeenEditedThisFrame = false; + ActiveIdFromShortcut = false; ActiveIdClickOffset = ImVec2(-1, -1); ActiveIdWindow = NULL; ActiveIdSource = ImGuiInputSource_None; @@ -2096,6 +2294,8 @@ struct ImGuiContext LastActiveId = 0; LastActiveIdTimer = 0.0f; + LastKeyboardKeyPressTime = LastKeyModsChangeTime = LastKeyModsChangeFromNoneTime = -1.0; + ActiveIdUsingNavDirMask = 0x00; ActiveIdUsingAllKeyboardKeys = false; #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -2104,15 +2304,18 @@ struct ImGuiContext CurrentFocusScopeId = 0; CurrentItemFlags = ImGuiItemFlags_None; - BeginMenuCount = 0; + DebugShowGroupRects = false; NavWindow = NULL; NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = 0; NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None; + NavHighlightActivatedId = 0; + NavHighlightActivatedTimer = 0.0f; NavJustMovedToKeyMods = ImGuiMod_None; NavInputSource = ImGuiInputSource_Keyboard; NavLayer = ImGuiNavLayer_Main; + NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; NavIdIsAlive = false; NavMousePosDirty = false; NavDisableHighlight = true; @@ -2131,14 +2334,16 @@ struct ImGuiContext NavTabbingDir = 0; NavTabbingCounter = 0; - ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab; - ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab; + // All platforms use Ctrl+Tab but Ctrl<>Super are swapped on Mac... + // FIXME: Because this value is stored, it annoyingly interfere with toggling io.ConfigMacOSXBehaviors updating this.. + ConfigNavWindowingKeyNext = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiKey_Tab); + ConfigNavWindowingKeyPrev = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab); NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; NavWindowingToggleLayer = false; + NavWindowingToggleKey = ImGuiKey_None; DimBgRatio = 0.0f; - MouseCursor = ImGuiMouseCursor_Arrow; DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; DragDropSourceFlags = ImGuiDragDropFlags_None; @@ -2158,14 +2363,19 @@ struct ImGuiContext TablesTempDataStacked = 0; CurrentTabBar = NULL; - HoverDelayId = HoverDelayIdPreviousFrame = 0; - HoverDelayTimer = HoverDelayClearTimer = 0.0f; + HoverItemDelayId = HoverItemDelayIdPreviousFrame = HoverItemUnlockedStationaryId = HoverWindowUnlockedStationaryId = 0; + HoverItemDelayTimer = HoverItemDelayClearTimer = 0.0f; + + MouseCursor = ImGuiMouseCursor_Arrow; + MouseStationaryTimer = 0.0f; TempInputId = 0; + BeginMenuDepth = BeginComboDepth = 0; ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; ColorEditCurrentID = ColorEditSavedID = 0; ColorEditSavedHue = ColorEditSavedSat = 0.0f; ColorEditSavedColor = 0; + WindowResizeRelativeMode = false; SliderGrabClickOffset = 0.0f; SliderCurrentAccum = 0.0f; SliderCurrentAccumDirty = false; @@ -2175,11 +2385,11 @@ struct ImGuiContext ScrollbarClickDeltaToGrabCenter = 0.0f; DisabledAlphaBackup = 0.0f; DisabledStackSize = 0; + LockMarkEdited = 0; TooltipOverrideCount = 0; PlatformImeData.InputPos = ImVec2(0.0f, 0.0f); PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission - PlatformLocaleDecimalPoint = '.'; SettingsLoaded = false; SettingsDirtyTimer = 0.0f; @@ -2198,17 +2408,28 @@ struct ImGuiContext DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY; DebugLocateId = 0; - DebugLogClipperAutoDisableFrames = 0; + DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None; + DebugLogAutoDisableFrames = 0; DebugLocateFrames = 0; DebugBeginReturnValueCullDepth = -1; DebugItemPickerActive = false; DebugItemPickerMouseButton = ImGuiMouseButton_Left; DebugItemPickerBreakId = 0; + DebugFlashStyleColorTime = 0.0f; + DebugFlashStyleColorIdx = ImGuiCol_COUNT; + + // Same as DebugBreakClearData(). Those fields are scattered in their respective subsystem to stay in hot-data locations + DebugBreakInWindow = 0; + DebugBreakInTable = 0; + DebugBreakInLocateId = false; + DebugBreakKeyChord = ImGuiKey_Pause; + DebugBreakInShortcutRouting = ImGuiKey_None; memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; FramerateSecPerFrameAccum = 0.0f; WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; + memset(TempKeychordName, 0, sizeof(TempKeychordName)); } }; @@ -2258,6 +2479,7 @@ struct IMGUI_API ImGuiWindowTempData int CurrentTableIdx; // Current table index (into g.Tables) ImGuiLayoutType LayoutType; ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() + ImU32 ModalDimBgColor; // Local parameters stacks // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. @@ -2274,6 +2496,7 @@ struct IMGUI_API ImGuiWindow char* Name; // Window name, owned by the window. ImGuiID ID; // == ImHashStr(Name) ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_ ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded. ImVec2 Pos; // Position (always rounded-up to nearest pixel) ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) @@ -2303,11 +2526,13 @@ struct IMGUI_API ImGuiWindow bool Collapsed; // Set when collapsing window to become only title-bar bool WantCollapseToggle; bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) + bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false. bool Appearing; // Set during the frame where the window is appearing (or re-appearing) bool Hidden; // Do not display (== HiddenFrames*** > 0) bool IsFallbackWindow; // Set on the "Debug##Default" window. bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() bool HasCloseButton; // Set when the window has a close button (p_open != NULL) + signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3) signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) short BeginCountPreviousFrame; // Number of Begin() during the previous frame @@ -2316,7 +2541,6 @@ struct IMGUI_API ImGuiWindow short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) ImS8 AutoFitFramesX, AutoFitFramesY; - ImS8 AutoFitChildAxises; bool AutoFitOnlyGrows; ImGuiDir AutoPosLastDirection; ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames @@ -2360,6 +2584,7 @@ struct IMGUI_API ImGuiWindow ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. + ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honoerd (e.g. Tool linked to Document) ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) @@ -2450,6 +2675,8 @@ struct IMGUI_API ImGuiTabBar float ScrollingSpeed; float ScrollingRectMinX; float ScrollingRectMaxX; + float SeparatorMinX; + float SeparatorMaxX; ImGuiID ReorderRequestTabId; ImS16 ReorderRequestOffset; ImS8 BeginCount; @@ -2539,26 +2766,39 @@ struct ImGuiTableColumn }; // Transient cell data stored per row. -// sizeof() ~ 6 +// sizeof() ~ 6 bytes struct ImGuiTableCellData { ImU32 BgColor; // Actual color ImGuiTableColumnIdx Column; // Column number }; +// Parameters for TableAngledHeadersRowEx() +// This may end up being refactored for more general purpose. +// sizeof() ~ 12 bytes +struct ImGuiTableHeaderData +{ + ImGuiTableColumnIdx Index; // Column index + ImU32 TextColor; + ImU32 BgColor0; + ImU32 BgColor1; +}; + // Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?) +// sizeof() ~ 24 bytes struct ImGuiTableInstanceData { ImGuiID TableInstanceID; float LastOuterHeight; // Outer height from last frame - float LastFirstRowHeight; // Height of first row from last frame (FIXME: this is used as "header height" and may be reworked) + float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set) float LastFrozenHeight; // Height of frozen section from last frame + int HoveredRowLast; // Index of row which was hovered last frame. + int HoveredRowNext; // Index of row hovered this frame, set after encountering it. - ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastFirstRowHeight = LastFrozenHeight = 0.0f; } + ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; } }; -// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs, incoming RowData -// sizeof() ~ 580 bytes + heap allocs described in TableBeginInitMemory() +// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory() struct IMGUI_API ImGuiTable { ImGuiID ID; @@ -2582,6 +2822,7 @@ struct IMGUI_API ImGuiTable float RowPosY1; float RowPosY2; float RowMinHeight; // Height submitted to TableNextRow() + float RowCellPaddingY; // Top and bottom padding. Reloaded during row change. float RowTextBaseline; float RowIndentOffsetX; ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ @@ -2595,9 +2836,8 @@ struct IMGUI_API ImGuiTable float HostIndentX; float MinColumnWidth; float OuterPaddingX; - float CellPaddingX; // Padding from each borders - float CellPaddingY; - float CellSpacingX1; // Spacing between non-bordered cells + float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout. + float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout. float CellSpacingX2; float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. float ColumnsGivenWidth; // Sum of current column width @@ -2606,6 +2846,8 @@ struct IMGUI_API ImGuiTable float ResizedColumnNextWidth; float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout() + float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout() ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is ImRect WorkRect; @@ -2626,10 +2868,12 @@ struct IMGUI_API ImGuiTable ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() ImGuiTableColumnIdx SortSpecsCount; ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) - ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount) ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() + ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). + ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted. ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. @@ -2655,6 +2899,7 @@ struct IMGUI_API ImGuiTable bool IsSortSpecsDirty; bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). + bool DisableDefaultContextMenu; // Disable default context menu contents. You may submit your own using TableBeginContextMenuPopup()/EndPopup() bool IsSettingsRequestLoad; bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) @@ -2662,6 +2907,8 @@ struct IMGUI_API ImGuiTable bool IsResetDisplayOrderRequest; bool IsUnfrozenRows; // Set when we got past the frozen row. bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() + bool IsActiveIdAliveBeforeTable; + bool IsActiveIdInTable; bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame. bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous. bool MemoryCompacted; @@ -2674,11 +2921,14 @@ struct IMGUI_API ImGuiTable // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. -// sizeof() ~ 112 bytes. +// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs. +// sizeof() ~ 136 bytes. struct IMGUI_API ImGuiTableTempData { int TableIndex; // Index in g.Tables.Buf[] pool float LastTimeActive; // Last timestamp this structure was used + float AngledHeadersExtraWidth; // Used in EndTable() + ImVector AngledHeadersRequests; // Used in TableAngledHeadersRow() ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() ImDrawListSplitter DrawSplitter; @@ -2750,6 +3000,7 @@ namespace ImGui IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); IMGUI_API ImGuiWindow* FindWindowByName(const char* name); IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); + IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window); IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy); IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent); @@ -2759,7 +3010,8 @@ namespace ImGui IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); - IMGUI_API void SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window); + IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window); + inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; } inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); } @@ -2774,12 +3026,16 @@ namespace ImGui IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window); IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window); + // Windows: Idle, Refresh Policies [EXPERIMENTAL] + IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags); + // Fonts, drawing IMGUI_API void SetCurrentFont(ImFont* font); inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector* out_list, ImDrawList* draw_list); // Init IMGUI_API void Initialize(); @@ -2788,6 +3044,7 @@ namespace ImGui // NewFrame IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); + IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window); IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); IMGUI_API void UpdateMouseMovingWindowNewFrame(); IMGUI_API void UpdateMouseMovingWindowEndFrame(); @@ -2852,7 +3109,7 @@ namespace ImGui IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min. IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0); - IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); + IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags); IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0); IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id); IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); @@ -2875,7 +3132,7 @@ namespace ImGui IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); // Popups, Modals, Tooltips - IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); + IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags); IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); @@ -2883,6 +3140,7 @@ namespace ImGui IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); + IMGUI_API bool BeginTooltipHidden(); IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window); IMGUI_API ImGuiWindow* GetTopMostPopupModal(); IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal(); @@ -2907,52 +3165,61 @@ namespace ImGui IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result); + IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiNavTreeNodeData* tree_node_data); IMGUI_API void NavMoveRequestCancel(); IMGUI_API void NavMoveRequestApplyResult(); IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); + IMGUI_API void NavHighlightActivated(ImGuiID id); IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis); + IMGUI_API void NavRestoreHighlightAfterMove(); IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX(); - IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. IMGUI_API void SetNavWindow(ImGuiWindow* window); IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); + IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id); + + // Focus/Activation + // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are + // much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones. + IMGUI_API void FocusItem(); // Focus last item (no selection/activation). + IMGUI_API void ActivateItemByID(ImGuiID id); // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again. // Inputs // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. - inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } - inline bool IsNamedKeyOrModKey(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super || key == ImGuiMod_Shortcut; } - inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } - inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; } - inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } - inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; } - inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } - inline ImGuiKeyChord ConvertShortcutMod(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; IM_ASSERT_PARANOID(key_chord & ImGuiMod_Shortcut); return (key_chord & ~ImGuiMod_Shortcut) | (g.IO.ConfigMacOSXBehaviors ? ImGuiMod_Super : ImGuiMod_Ctrl); } - inline ImGuiKey ConvertSingleModFlagToKey(ImGuiContext* ctx, ImGuiKey key) + inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } + inline bool IsNamedKeyOrMod(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; } + inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } + inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; } + inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } + inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; } + inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } + inline bool IsModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; } + ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord); + inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key) { - ImGuiContext& g = *ctx; if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl; if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift; if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt; if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper; - if (key == ImGuiMod_Shortcut) return (g.IO.ConfigMacOSXBehaviors ? ImGuiKey_ReservedForModSuper : ImGuiKey_ReservedForModCtrl); return key; } IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key); inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); } - IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size); + IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord); inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); } IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down); IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis); IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate); + IMGUI_API void TeleportMousePos(const ImVec2& pos); IMGUI_API void SetActiveIdUsingAllKeyboardKeys(); inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } // [EXPERIMENTAL] Low-Level: Key/Input Ownership // - The idea is that instead of "eating" a given input, we can link to an owner id. // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead). - // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID. // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0). // - Input ownership is automatically released on the frame after a key is released. Therefore: // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case). @@ -2960,12 +3227,12 @@ namespace ImGui // - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state. // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step. // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved. - IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key); - IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'. - IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id' - inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(ctx, key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; } + IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key); + IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'. + IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id' + inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; } // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag. @@ -2973,26 +3240,32 @@ namespace ImGui // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'. // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API. - IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id); - IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. - IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id); - IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); - IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. + IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0); + IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id); - // [EXPERIMENTAL] Shortcut Routing - // - ImGuiKeyChord = a ImGuiKey optionally OR-red with ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super. - // ImGuiKey_C (accepted by functions taking ImGuiKey or ImGuiKeyChord) - // ImGuiKey_C | ImGuiMod_Ctrl (accepted by functions taking ImGuiKeyChord) - // ONLY ImGuiMod_XXX values are legal to 'OR' with an ImGuiKey. You CANNOT 'OR' two ImGuiKey values. - // - When using one of the routing flags (e.g. ImGuiInputFlags_RouteFocused): routes requested ahead of time given a chord (key + modifiers) and a routing policy. - // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame. - // - Route is granted to a single owner. When multiple requests are made we have policies to select the winning route. - // - Multiple read sites may use the same owner id and will all get the granted route. - // - For routing: when owner_id is 0 we use the current Focus Scope ID as a default owner in order to identify our location. - IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); - IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); - IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id); + // Shortcut Testing & Routing + // - Set Shortcut() and SetNextItemShortcut() in imgui.h + // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(), + // allowing the system to decide where to route the input among other route-aware calls. + // (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check) + // - When using one of the routing option: + // - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.) + // - Routes are requested given a chord (key + modifiers) and a routing policy. + // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame. + // - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window). + // - Multiple read sites may use the same owner id can all access the granted route. + // - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location. + // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute() + // e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused. + IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); + IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0 + IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id); IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord); // [EXPERIMENTAL] Focus Scope @@ -3012,7 +3285,13 @@ namespace ImGui IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); IMGUI_API void ClearDragDrop(); IMGUI_API bool IsDragDropPayloadBeingAccepted(); - IMGUI_API void RenderDragDropTargetRect(const ImRect& bb); + IMGUI_API void RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect); + + // Typing-Select API + IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None); + IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx); + IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx); + IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data); // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); @@ -3030,10 +3309,13 @@ namespace ImGui IMGUI_API void TableOpenContextMenu(int column_n = -1); IMGUI_API void TableSetColumnWidth(int column_n, float width); IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); - IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet. IMGUI_API float TableGetHeaderRowHeight(); + IMGUI_API float TableGetHeaderAngledMaxLabelWidth(); IMGUI_API void TablePushBackgroundChannel(); IMGUI_API void TablePopBackgroundChannel(); + IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count); // Tables: Internals inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } @@ -3046,7 +3328,7 @@ namespace ImGui IMGUI_API void TableUpdateBorders(ImGuiTable* table); IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); IMGUI_API void TableDrawBorders(ImGuiTable* table); - IMGUI_API void TableDrawContextMenu(ImGuiTable* table); + IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display); IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table); IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; } @@ -3111,7 +3393,7 @@ namespace ImGui IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); - IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight + IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_None); // Navigation highlight IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); @@ -3127,7 +3409,7 @@ namespace ImGui IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); - IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0); + IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0); IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f); IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width); IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); @@ -3152,6 +3434,7 @@ namespace ImGui IMGUI_API void TreePushOverrideID(ImGuiID id); IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open); IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging. + IMGUI_API void SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data); // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). @@ -3190,6 +3473,7 @@ namespace ImGui // Shade functions (write over already created vertices) IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); + IMGUI_API void ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out); // Garbage collection IMGUI_API void GcCompactTransientMiscBuffers(); @@ -3199,20 +3483,25 @@ namespace ImGui // Debug Log IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1); IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free // Debug Tools IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255)); + IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255)); + IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255)); IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time! IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time! IMGUI_API void DebugLocateItemResolveWithLastItem(); - inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); } - inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } + IMGUI_API void DebugBreakClearData(); + IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location); + IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location); IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end); IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); - IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); + IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label); IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); IMGUI_API void DebugNodeFont(ImFont* font); IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph); @@ -3221,6 +3510,7 @@ namespace ImGui IMGUI_API void DebugNodeTable(ImGuiTable* table); IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state); + IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state); IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); IMGUI_API void DebugNodeWindowsList(ImVector* windows, const char* label); @@ -3234,16 +3524,14 @@ namespace ImGui inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89 inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89 - // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): + //inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity! + + // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister(): // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)' - // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' - // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))' (WIP) - // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() - inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() - inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem -#endif -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity! + // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0' + // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))' + //inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() + //inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem #endif } // namespace ImGui @@ -3263,6 +3551,7 @@ struct ImFontBuilderIO #ifdef IMGUI_ENABLE_STB_TRUETYPE IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); #endif +IMGUI_API void ImFontAtlasUpdateConfigDataPointers(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); diff --git a/extern/src/imgui/imgui_tables.cpp b/extern/src/imgui/imgui_tables.cpp index 8850094d..10daf40f 100644 --- a/extern/src/imgui/imgui_tables.cpp +++ b/extern/src/imgui/imgui_tables.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (tables and columns code) /* @@ -24,8 +24,9 @@ Index of this file: */ // Navigating this file: -// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. //----------------------------------------------------------------------------- // [SECTION] Commentary @@ -48,7 +49,8 @@ Index of this file: // - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). // | TableSetupDrawChannels() - setup ImDrawList channels // | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission -// | TableDrawContextMenu() - draw right-click context menu +// | TableBeginContextMenuPopup() +// | - TableDrawDefaultContextMenu() - draw right-click context menu contents //----------------------------------------------------------------------------- // - TableHeadersRow() or TableHeader() user submit a headers row (optional) // | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction @@ -82,7 +84,7 @@ Index of this file: // Y with ScrollX/ScrollY disabled: we output table directly in current window // - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful if parent window can vertically scroll. // - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) -// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) +// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtendY is set) // Y with ScrollX/ScrollY enabled: using a child window for scrolling // - outer_size.y < 0.0f -> Bottom-align. Not meaningful if parent window can vertically scroll. // - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. @@ -198,11 +200,7 @@ Index of this file: #include "imgui_internal.h" // System includes -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif // Visual Studio warnings #ifdef _MSC_VER @@ -230,6 +228,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') #pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked @@ -321,19 +320,30 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG IM_ASSERT(inner_width >= 0.0f); // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve. + // FIXME: coarse clipping because access to table data causes two issues: + // - instance numbers varying/unstable. may not be a direct problem for users, but could make outside access broken or confusing, e.g. TestEngine. + // - can't implement support for ImGuiChildFlags_ResizeY as we need to somehow pull the height data from somewhere. this also needs stable instance numbers. + // The side-effects of accessing table data on coarse clip would be: + // - always reserving the pooled ImGuiTable data ahead for a fully clipped table (minor IMHO). Also the 'outer_window_is_measuring_size' criteria may already be defeating this in some situations. + // - always performing the GetOrAddByKey() O(log N) query in g.Tables.Map[]. const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; const ImVec2 avail_size = GetContentRegionAvail(); - ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); - ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); - if (use_child_window && IsClippedEx(outer_rect, 0)) + const ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); + const ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); + const bool outer_window_is_measuring_size = (outer_window->AutoFitFramesX > 0) || (outer_window->AutoFitFramesY > 0); // Doesn't apply to AlwaysAutoResize windows! + if (use_child_window && IsClippedEx(outer_rect, 0) && !outer_window_is_measuring_size) { ItemSize(outer_rect); + ItemAdd(outer_rect, id); return false; } + // [DEBUG] Debug break requested by user + if (g.DebugBreakInTable == id) + IM_DEBUG_BREAK(); + // Acquire storage for the table ImGuiTable* table = g.Tables.GetOrAddByKey(id); - const ImGuiTableFlags table_last_flags = table->Flags; // Acquire temporary buffers const int table_idx = g.Tables.GetIndex(table); @@ -349,7 +359,9 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG flags = TableFixFlags(flags, outer_window); // Initialize - const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const int previous_frame_active = table->LastFrameActive; + const int instance_no = (previous_frame_active != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const ImGuiTableFlags previous_flags = table->Flags; table->ID = id; table->Flags = flags; table->LastFrameActive = g.FrameCount; @@ -396,7 +408,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); // Reset scroll if we are reactivating it - if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) + if ((previous_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) SetNextWindowScroll(ImVec2(0.0f, 0.0f)); // Create scrolling region (without border and zero window padding) @@ -408,13 +420,17 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->InnerRect = table->InnerWindow->InnerRect; IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); + // Allow submitting when host is measuring + if (table->InnerWindow->SkipItems && outer_window_is_measuring_size) + table->InnerWindow->SkipItems = false; + // When using multiple instances, ensure they have the same amount of horizontal decorations (aka vertical scrollbar) so stretched columns can be aligned) if (instance_no == 0) { table->HasScrollbarYPrev = table->HasScrollbarYCurr; table->HasScrollbarYCurr = false; } - table->HasScrollbarYCurr |= (table->InnerWindow->ScrollMax.y > 0.0f); + table->HasScrollbarYCurr |= table->InnerWindow->ScrollbarY; } else { @@ -443,6 +459,18 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + // Make left and top borders not overlap our contents by offsetting HostClipRect (#6765) + // (we normally shouldn't alter HostClipRect as we rely on TableMergeDrawChannels() expanding non-clipped column toward the + // limits of that rectangle, in order for ImDrawListSplitter::Merge() to merge the draw commands. However since the overlap + // problem only affect scrolling tables in this case we can get away with doing it without extra cost). + if (inner_window != outer_window) + { + if (flags & ImGuiTableFlags_BordersOuterV) + table->HostClipRect.Min.x = ImMin(table->HostClipRect.Min.x + TABLE_BORDER_SIZE, table->HostClipRect.Max.x); + if (flags & ImGuiTableFlags_BordersOuterH) + table->HostClipRect.Min.y = ImMin(table->HostClipRect.Min.y + TABLE_BORDER_SIZE, table->HostClipRect.Max.y); + } + // Padding and Spacing // - None ........Content..... Pad .....Content........ // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | @@ -456,7 +484,6 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; table->CellSpacingX2 = inner_spacing_explicit; table->CellPaddingX = inner_padding_explicit; - table->CellPaddingY = g.Style.CellPadding.y; const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; @@ -473,10 +500,15 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() + table->RowCellPaddingY = 0.0f; table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; table->IsUnfrozenRows = true; - table->DeclColumnsCount = 0; + table->DeclColumnsCount = table->AngledHeadersCount = 0; + if (previous_frame_active + 1 < g.FrameCount) + table->IsActiveIdInTable = false; + table->AngledHeadersHeight = 0.0f; + temp_data->AngledHeadersExtraWidth = 0.0f; // Using opaque colors facilitate overlapping lines of the grid, otherwise we'd need to improve TableDrawBorders() table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); @@ -489,7 +521,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. inner_window->DC.CurrentTableIdx = table_idx; - if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) + if ((previous_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) table->IsResetDisplayOrderRequest = true; // Mark as used to avoid GC @@ -850,8 +882,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); - // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible - // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). + // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible to avoid + // the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). Also see #6510. // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) table->InnerWindow->SkipItems = false; @@ -936,7 +968,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) if (column->Flags & ImGuiTableColumnFlags_WidthStretch) { float weight_ratio = column->StretchWeight / stretch_sum_weights; - column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); + column->WidthRequest = IM_TRUNC(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); width_remaining_for_stretched_columns -= column->WidthRequest; } @@ -946,7 +978,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; // Assign final width, record width in case we will need to shrink - column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); + column->WidthGiven = ImTrunc(ImMax(column->WidthRequest, table->MinColumnWidth)); table->ColumnsGivenWidth += column->WidthGiven; } @@ -971,17 +1003,25 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // clear ActiveId, which is equivalent to the change provided by _AllowWhenBLockedByActiveItem). // - This allows columns to be marked as hovered when e.g. clicking a button inside the column, or using drag and drop. ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - table->HoveredColumnBody = -1; - table->HoveredColumnBorder = -1; + table_instance->HoveredRowLast = table_instance->HoveredRowNext; + table_instance->HoveredRowNext = -1; + table->HoveredColumnBody = table->HoveredColumnBorder = -1; const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight)); const ImGuiID backup_active_id = g.ActiveId; g.ActiveId = 0; - const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); + const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0, ImGuiItemFlags_None); g.ActiveId = backup_active_id; + // Determine skewed MousePos.x to support angled headers. + float mouse_skewed_x = g.IO.MousePos.x; + if (table->AngledHeadersHeight > 0.0f) + if (g.IO.MousePos.y >= table->OuterRect.Min.y && g.IO.MousePos.y <= table->OuterRect.Min.y + table->AngledHeadersHeight) + mouse_skewed_x += ImTrunc((table->OuterRect.Min.y + table->AngledHeadersHeight - g.IO.MousePos.y) * table->AngledHeadersSlope); + // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. int visible_n = 0; + bool has_at_least_one_column_requesting_output = false; bool offset_x_frozen = (table->FreezeColumnsCount > 0); float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; ImRect host_clip_rect = table->InnerClipRect; @@ -1019,7 +1059,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) } // Detect hovered column - if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) + if (is_hovering_table && mouse_skewed_x >= column->ClipRect.Min.x && mouse_skewed_x < column->ClipRect.Max.x) table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; // Lock start position @@ -1036,9 +1076,10 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. + const float previous_instance_work_min_x = column->WorkMinX; column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max - column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); + column->ItemWidth = ImTrunc(column->WidthGiven * 0.65f); column->ClipRect.Min.x = column->MinX; column->ClipRect.Min.y = work_rect.Min.y; column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; @@ -1062,9 +1103,12 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; // Mark column as SkipItems (ignoring all items/layout) + // (table->HostSkipItems is a copy of inner_window->SkipItems before we cleared it above in Part 2) column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; if (column->IsSkipItems) IM_ASSERT(!is_visible); + if (column->IsRequestOutput && !column->IsSkipItems) + has_at_least_one_column_requesting_output = true; // Update status flags column->Flags |= ImGuiTableColumnFlags_IsEnabled; @@ -1085,8 +1129,22 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); // Reset content width variables - column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; - column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; + if (table->InstanceCurrent == 0) + { + column->ContentMaxXFrozen = column->WorkMinX; + column->ContentMaxXUnfrozen = column->WorkMinX; + column->ContentMaxXHeadersUsed = column->WorkMinX; + column->ContentMaxXHeadersIdeal = column->WorkMinX; + } + else + { + // As we store an absolute value to make per-cell updates faster, we need to offset values used for width computation. + const float offset_from_previous_instance = column->WorkMinX - previous_instance_work_min_x; + column->ContentMaxXFrozen += offset_from_previous_instance; + column->ContentMaxXUnfrozen += offset_from_previous_instance; + column->ContentMaxXHeadersUsed += offset_from_previous_instance; + column->ContentMaxXHeadersIdeal += offset_from_previous_instance; + } // Don't decrement auto-fit counters until container window got a chance to submit its items if (table->HostSkipItems == false) @@ -1102,18 +1160,26 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) visible_n++; } + // In case the table is visible (e.g. decorations) but all columns clipped, we keep a column visible. + // Else if give no chance to a clipper-savy user to submit rows and therefore total contents height used by scrollbar. + if (has_at_least_one_column_requesting_output == false) + { + table->Columns[table->LeftMostEnabledColumn].IsRequestOutput = true; + table->Columns[table->LeftMostEnabledColumn].IsSkipItems = false; + } + // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); if (is_hovering_table && table->HoveredColumnBody == -1) - { - if (g.IO.MousePos.x >= unused_x1) + if (mouse_skewed_x >= unused_x1) table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; - } if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) table->Flags &= ~ImGuiTableFlags_Resizable; + table->IsActiveIdAliveBeforeTable = (g.ActiveIdIsAlive != 0); + // [Part 8] Lock actual OuterRect/WorkRect right-most position. // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. @@ -1125,8 +1191,16 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); } table->InnerWindow->ParentWorkRect = table->WorkRect; - table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); - table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); + table->BorderX1 = table->InnerClipRect.Min.x; + table->BorderX2 = table->InnerClipRect.Max.x; + + // Setup window's WorkRect.Max.y for GetContentRegionAvail(). Other values will be updated in each TableBeginCell() call. + float window_content_max_y; + if (table->Flags & ImGuiTableFlags_NoHostExtendY) + window_content_max_y = table->OuterRect.Max.y; + else + window_content_max_y = ImMax(table->InnerWindow->ContentRegionRect.Max.y, (table->Flags & ImGuiTableFlags_ScrollY) ? 0.0f : table->OuterRect.Max.y); + table->InnerWindow->WorkRect.Max.y = ImClamp(window_content_max_y - g.Style.CellPadding.y, table->InnerWindow->WorkRect.Min.y, table->InnerWindow->WorkRect.Max.y); // [Part 9] Allocate draw channels and setup background cliprect TableSetupDrawChannels(table); @@ -1134,14 +1208,26 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // [Part 10] Hit testing on borders if (table->Flags & ImGuiTableFlags_Resizable) TableUpdateBorders(table); - table_instance->LastFirstRowHeight = 0.0f; + table_instance->LastTopHeadersRowHeight = 0.0f; table->IsLayoutLocked = true; table->IsUsingHeaders = false; - // [Part 11] Context menu - if (TableBeginContextMenuPopup(table)) + // Highlight header + table->HighlightColumnHeader = -1; + if (table->IsContextPopupOpen && table->ContextPopupColumn != -1 && table->InstanceInteracted == table->InstanceCurrent) + table->HighlightColumnHeader = table->ContextPopupColumn; + else if ((table->Flags & ImGuiTableFlags_HighlightHoveredColumn) && table->HoveredColumnBody != -1 && table->HoveredColumnBody != table->ColumnsCount && table->HoveredColumnBorder == -1) + if (g.ActiveId == 0 || (table->IsActiveIdInTable || g.DragDropActive)) + table->HighlightColumnHeader = table->HoveredColumnBody; + + // [Part 11] Default context menu + // - To append to this menu: you can call TableBeginContextMenuPopup()/.../EndPopup(). + // - To modify or replace this: set table->IsContextPopupNoDefaultContents = true, then call TableBeginContextMenuPopup()/.../EndPopup(). + // - You may call TableDrawDefaultContextMenu() with selected flags to display specific sections of the default menu, + // e.g. TableDrawDefaultContextMenu(table, table->Flags & ~ImGuiTableFlags_Hideable) will display everything EXCEPT columns visibility options. + if (table->DisableDefaultContextMenu == false && TableBeginContextMenuPopup(table)) { - TableDrawContextMenu(table); + TableDrawDefaultContextMenu(table, table->Flags); EndPopup(); } @@ -1167,8 +1253,6 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // Process hit-testing on resizing borders. Actual size change will be applied in EndTable() // - Set table->HoveredColumnBorder with a short delay/timer to reduce visual feedback noise. -// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize -// widgets overlapping the same area. void ImGui::TableUpdateBorders(ImGuiTable* table) { ImGuiContext& g = *GImGui; @@ -1179,10 +1263,10 @@ void ImGui::TableUpdateBorders(ImGuiTable* table) // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). // Actual columns highlight/render will be performed in EndTable() and not be affected. ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; - const float hit_y1 = table->OuterRect.Min.y; - const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight); - const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight; + const float hit_half_width = ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale); + const float hit_y1 = (table->FreezeRowsCount >= 1 ? table->OuterRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight; + const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight - table->AngledHeadersHeight); + const float hit_y2_head = hit_y1 + table_instance->LastTopHeadersRowHeight; for (int order_n = 0; order_n < table->ColumnsCount; order_n++) { @@ -1208,12 +1292,12 @@ void ImGui::TableUpdateBorders(ImGuiTable* table) //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); bool hovered = false, held = false; - bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); + bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); if (pressed && IsMouseDoubleClicked(0)) { TableSetColumnWidthAutoSingle(table, column_n); ClearActiveID(); - held = hovered = false; + held = false; } if (held) { @@ -1285,7 +1369,7 @@ void ImGui::EndTable() max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); if (table->ResizedColumn != -1) max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); - table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; + table->InnerWindow->DC.CursorMaxPos.x = max_pos_x + table->TempData->AngledHeadersExtraWidth; } // Pop clipping rect @@ -1356,11 +1440,13 @@ void ImGui::EndTable() if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) { ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; - const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); - const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); + const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale)); + const float new_width = ImTrunc(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); table->ResizedColumnNextWidth = new_width; } + table->IsActiveIdInTable = (g.ActiveIdIsAlive != 0 && table->IsActiveIdAliveBeforeTable == false); + // Pop from id stack IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table_instance->TableInstanceID, "Mismatching PushID/PopID!"); IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); @@ -1383,7 +1469,10 @@ void ImGui::EndTable() // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) if (inner_window != outer_window) { + short backup_nav_layers_active_mask = inner_window->DC.NavLayersActiveMask; + inner_window->DC.NavLayersActiveMask |= 1 << ImGuiNavLayer_Main; // So empty table don't appear to navigate differently. EndChild(); + inner_window->DC.NavLayersActiveMask = backup_nav_layers_active_mask; } else { @@ -1401,7 +1490,7 @@ void ImGui::EndTable() } else if (temp_data->UserOuterSize.x <= 0.0f) { - const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; + const float decoration_size = table->TempData->AngledHeadersExtraWidth + ((table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f); outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x); outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); } @@ -1440,7 +1529,7 @@ void ImGui::EndTable() NavUpdateCurrentWindowIsScrollPushableX(); } -// See "COLUMN SIZING POLICIES" comments at the top of this file +// See "COLUMNS SIZING POLICIES" comments at the top of this file // If (init_width_or_weight <= 0.0f) it is ignored void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) { @@ -1468,6 +1557,11 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) flags |= ImGuiTableColumnFlags_WidthFixed; + if (flags & ImGuiTableColumnFlags_AngledHeader) + { + flags |= ImGuiTableColumnFlags_NoHeaderLabel; + table->AngledHeadersCount++; + } TableSetupColumnFlags(table, column, flags); column->UserID = user_id; @@ -1501,6 +1595,7 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo } // Store name (append with zero-terminator in contiguous buffer) + // FIXME: If we recorded the number of \n in names we could compute header row height column->NameOffset = -1; if (label != NULL && label[0] != 0) { @@ -1549,6 +1644,7 @@ void ImGui::TableSetupScrollFreeze(int columns, int rows) // - TableGetCellBgRect() [Internal] // - TableGetColumnResizeID() [Internal] // - TableGetHoveredColumn() [Internal] +// - TableGetHoveredRow() [Internal] // - TableSetBgColor() //----------------------------------------------------------------------------- @@ -1653,6 +1749,19 @@ int ImGui::TableGetHoveredColumn() return (int)table->HoveredColumnBody; } +// Return -1 when table is not hovered. Return maxrow+1 if in table but below last submitted row. +// *IMPORTANT* Unlike TableGetHoveredColumn(), this has a one frame latency in updating the value. +// This difference with is the reason why this is not public yet. +int ImGui::TableGetHoveredRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return -1; + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + return (int)table_instance->HoveredRowLast; +} + void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) { ImGuiContext& g = *GImGui; @@ -1727,19 +1836,20 @@ void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) table->LastRowFlags = table->RowFlags; table->RowFlags = row_flags; + table->RowCellPaddingY = g.Style.CellPadding.y; table->RowMinHeight = row_min_height; TableBeginRow(table); // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, // because that would essentially require a unique clipping rectangle per-cell. - table->RowPosY2 += table->CellPaddingY * 2.0f; + table->RowPosY2 += table->RowCellPaddingY * 2.0f; table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); // Disable output until user calls TableNextColumn() table->InnerWindow->SkipItems = true; } -// [Internal] Called by TableNextRow() +// [Internal] Only called by TableNextRow() void ImGui::TableBeginRow(ImGuiTable* table) { ImGuiWindow* window = table->InnerWindow; @@ -1760,8 +1870,10 @@ void ImGui::TableBeginRow(ImGuiTable* table) table->RowPosY1 = table->RowPosY2 = next_y1; table->RowTextBaseline = 0.0f; table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent + window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x, window->DC.CursorPos.y + table->RowCellPaddingY); // This allows users to call SameLine() to share LineSize between columns. + window->DC.PrevLineSize = window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); // This allows users to call SameLine() to share LineSize between columns, and to call it from first column too. window->DC.IsSameLine = window->DC.IsSetPos = false; window->DC.CursorMaxPos.y = next_y1; @@ -1798,12 +1910,17 @@ void ImGui::TableEndRow(ImGuiTable* table) const float bg_y2 = table->RowPosY2; const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); - if (table->CurrentRow == 0) - TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1; + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + if ((table->RowFlags & ImGuiTableRowFlags_Headers) && (table->CurrentRow == 0 || (table->LastRowFlags & ImGuiTableRowFlags_Headers))) + table_instance->LastTopHeadersRowHeight += bg_y2 - bg_y1; const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); if (is_visible) { + // Update data for TableGetHoveredRow() + if (table->HoveredColumnBody != -1 && g.IO.MousePos.y >= bg_y1 && g.IO.MousePos.y < bg_y2 && table_instance->HoveredRowNext < 0) + table_instance->HoveredRowNext = table->CurrentRow; + // Decide of background color for the row ImU32 bg_col0 = 0; ImU32 bg_col1 = 0; @@ -1815,15 +1932,14 @@ void ImGui::TableEndRow(ImGuiTable* table) bg_col1 = table->RowBgColor[1]; // Decide of top border color - ImU32 border_col = 0; + ImU32 top_border_col = 0; const float border_size = TABLE_BORDER_SIZE; - if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) - if (table->Flags & ImGuiTableFlags_BordersInnerH) - border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; + if (table->CurrentRow > 0 && (table->Flags & ImGuiTableFlags_BordersInnerH)) + top_border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; const bool draw_strong_bottom_border = unfreeze_rows_actual; - if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) + if ((bg_col0 | bg_col1 | top_border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) { // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. @@ -1857,13 +1973,14 @@ void ImGui::TableEndRow(ImGuiTable* table) cell_bg_rect.ClipWith(table->BgClipRect); cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); - window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); + if (cell_bg_rect.Min.y < cell_bg_rect.Max.y) + window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); } } // Draw top border - if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) - window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); + if (top_border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), top_border_col, border_size); // Draw bottom border at the row unfreezing mark (always strong) if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) @@ -1881,7 +1998,7 @@ void ImGui::TableEndRow(ImGuiTable* table) IM_ASSERT(table->IsUnfrozenRows == false); const float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); table->IsUnfrozenRows = true; - TableGetInstanceData(table, table->InstanceCurrent)->LastFrozenHeight = y0 - table->OuterRect.Min.y; + table_instance->LastFrozenHeight = y0 - table->OuterRect.Min.y; // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); @@ -1991,12 +2108,14 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n) start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. window->DC.CursorPos.x = start_x; - window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; + window->DC.CursorPos.y = table->RowPosY1 + table->RowCellPaddingY; window->DC.CursorMaxPos.x = window->DC.CursorPos.x; window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x; // PrevLine.y is preserved. This allows users to call SameLine() to share LineSize between columns. window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; + // Note how WorkRect.Max.y is only set once during layout window->WorkRect.Min.y = window->DC.CursorPos.y; window->WorkRect.Min.x = column->WorkMinX; window->WorkRect.Max.x = column->WorkMaxX; @@ -2047,7 +2166,7 @@ void ImGui::TableEndCell(ImGuiTable* table) p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); if (column->IsEnabled) - table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); + table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->RowCellPaddingY); column->ItemWidth = window->DC.ItemWidth; // Propagate text baseline for the entire row @@ -2065,6 +2184,8 @@ void ImGui::TableEndCell(ImGuiTable* table) // - TableSetColumnWidthAutoAll() [Internal] // - TableUpdateColumnsWeightFromWidth() [Internal] //------------------------------------------------------------------------- +// Note that actual columns widths are computed in TableUpdateLayout(). +//------------------------------------------------------------------------- // Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) @@ -2257,6 +2378,7 @@ void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) // - TablePopBackgroundChannel() [Internal] // - TableSetupDrawChannels() [Internal] // - TableMergeDrawChannels() [Internal] +// - TableGetColumnBorderCol() [Internal] // - TableDrawBorders() [Internal] //------------------------------------------------------------------------- @@ -2540,6 +2662,18 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table) } } +static ImU32 TableGetColumnBorderCol(ImGuiTable* table, int order_n, int column_n) +{ + const bool is_hovered = (table->HoveredColumnBorder == column_n); + const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); + const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1); + if (is_resized || is_hovered) + return ImGui::GetColorU32(is_resized ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered); + if (is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize))) + return table->BorderColorStrong; + return table->BorderColorLight; +} + // FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) void ImGui::TableDrawBorders(ImGuiTable* table) { @@ -2554,9 +2688,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) // Draw inner border and resizing feedback ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); const float border_size = TABLE_BORDER_SIZE; - const float draw_y1 = table->InnerRect.Min.y; + const float draw_y1 = ImMax(table->InnerRect.Min.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight) + ((table->Flags & ImGuiTableFlags_BordersOuterH) ? 1.0f : 0.0f); const float draw_y2_body = table->InnerRect.Max.y; - const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1; + const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastTopHeadersRowHeight) : draw_y1; if (table->Flags & ImGuiTableFlags_BordersInnerV) { for (int order_n = 0; order_n < table->ColumnsCount; order_n++) @@ -2582,21 +2716,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) // Draw in outer window so right-most column won't be clipped // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. - ImU32 col; - float draw_y2; - if (is_hovered || is_resized || is_frozen_separator) - { - draw_y2 = draw_y2_body; - col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; - } - else - { - draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; - col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; - } - + float draw_y2 = (is_hovered || is_resized || is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) == 0) ? draw_y2_body : draw_y2_head; if (draw_y2 > draw_y1) - inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); + inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), TableGetColumnBorderCol(table, order_n, column_n), border_size); } } @@ -2613,7 +2735,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table) const ImU32 outer_col = table->BorderColorStrong; if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) { - inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); + inner_drawlist->AddRect(outer_border.Min, outer_border.Max + ImVec2(1, 1), outer_col, 0.0f, 0, border_size); } else if (table->Flags & ImGuiTableFlags_BordersOuterV) { @@ -2628,7 +2750,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table) } if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) { - // Draw bottom-most row border + // Draw bottom-most row border between it is above outer border. const float border_y = table->RowPosY2; if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); @@ -2649,8 +2771,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) //------------------------------------------------------------------------- // Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) -// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since -// last call, or the first time. +// When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have +// changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, +// else you may wastefully sort your data every frame! // Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() { @@ -2813,6 +2936,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table) } // Write output + // May be able to move all SortSpecs data from table (48 bytes) to ImGuiTableTempData if we decide to write it back on every BeginTable() ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; if (dirty && sort_specs != NULL) for (int column_n = 0; column_n < table->ColumnsCount; column_n++) @@ -2836,8 +2960,11 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table) // [SECTION] Tables: Headers //------------------------------------------------------------------------- // - TableGetHeaderRowHeight() [Internal] +// - TableGetHeaderAngledMaxLabelWidth() [Internal] // - TableHeadersRow() // - TableHeader() +// - TableAngledHeadersRow() +// - TableAngledHeadersRowEx() [Internal] //------------------------------------------------------------------------- float ImGui::TableGetHeaderRowHeight() @@ -2846,21 +2973,31 @@ float ImGui::TableGetHeaderRowHeight() // Calculate row height, for the unlikely case that some labels may be taller than others. // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. // In your custom header row you may omit this all together and just call TableNextRow() without a height... - float row_height = GetTextLineHeight(); - int columns_count = TableGetColumnCount(); - for (int column_n = 0; column_n < columns_count; column_n++) - { - ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n); - if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel)) - row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); - } - row_height += GetStyle().CellPadding.y * 2.0f; - return row_height; + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + float row_height = g.FontSize; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + if ((table->Columns[column_n].Flags & ImGuiTableColumnFlags_NoHeaderLabel) == 0) + row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(table, column_n)).y); + return row_height + g.Style.CellPadding.y * 2.0f; +} + +float ImGui::TableGetHeaderAngledMaxLabelWidth() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + float width = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + if (table->Columns[column_n].Flags & ImGuiTableColumnFlags_AngledHeader) + width = ImMax(width, CalcTextSize(TableGetColumnName(table, column_n), NULL, true).x); + return width + g.Style.CellPadding.y * 2.0f; // Swap padding } // [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). // The intent is that advanced users willing to create customized headers would not need to use this helper -// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. +// and can create their own! For example: TableHeader() may be preceded by Checkbox() or other custom widgets. // See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. // This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. // FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. @@ -2875,9 +3012,9 @@ void ImGui::TableHeadersRow() TableUpdateLayout(table); // Open row - const float row_y1 = GetCursorScreenPos().y; const float row_height = TableGetHeaderRowHeight(); TableNextRow(ImGuiTableRowFlags_Headers, row_height); + const float row_y1 = GetCursorScreenPos().y; if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. return; @@ -2899,7 +3036,7 @@ void ImGui::TableHeadersRow() ImVec2 mouse_pos = ImGui::GetMousePos(); if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) - TableOpenContextMenu(-1); // Will open a non-column-specific popup. + TableOpenContextMenu(columns_count); // Will open a non-column-specific popup. } // Emit a column header (text + optional sort order) @@ -2928,16 +3065,19 @@ void ImGui::TableHeader(const char* label) // If we already got a row height, there's use that. // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? ImRect cell_r = TableGetCellBgRect(table, column_n); - float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); + float label_height = ImMax(label_size.y, table->RowMinHeight - table->RowCellPaddingY * 2.0f); // Calculate ideal size for sort order arrow float w_arrow = 0.0f; float w_sort_text = 0.0f; + bool sort_arrow = false; char sort_order_suf[4] = ""; const float ARROW_SCALE = 0.65f; if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) { - w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + w_arrow = ImTrunc(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + if (column->SortOrder != -1) + sort_arrow = true; if (column->SortOrder > 0) { ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); @@ -2945,13 +3085,12 @@ void ImGui::TableHeader(const char* label) } } - // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. + // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considered for merging. float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; - column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); + column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, sort_arrow ? cell_r.Max.x : ImMin(max_pos_x, cell_r.Max.x)); column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); // Keep header highlighted when context menu is open. - const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); ImGuiID id = window->GetID(label); ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal @@ -2961,12 +3100,11 @@ void ImGui::TableHeader(const char* label) //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] - // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + // Using AllowOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + const bool highlight = (table->HighlightColumnHeader == column_n); bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); - if (g.ActiveId != id) - SetItemAllowOverlap(); - if (held || hovered || selected) + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowOverlap); + if (held || hovered || highlight) { const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); @@ -2978,7 +3116,7 @@ void ImGui::TableHeader(const char* label) if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding); if (held) table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; @@ -3036,19 +3174,190 @@ void ImGui::TableHeader(const char* label) RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); - if (text_clipped && hovered && g.ActiveId == 0 && IsItemHovered(ImGuiHoveredFlags_DelayNormal)) - SetTooltip("%.*s", (int)(label_end - label), label); + if (text_clipped && hovered && g.ActiveId == 0) + SetItemTooltip("%.*s", (int)(label_end - label), label); // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden if (IsMouseReleased(1) && IsItemHovered()) TableOpenContextMenu(column_n); } +// Unlike TableHeadersRow() it is not expected that you can reimplement or customize this with custom widgets. +// FIXME: No hit-testing/button on the angled header. +void ImGui::TableAngledHeadersRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + ImGuiTableTempData* temp_data = table->TempData; + temp_data->AngledHeadersRequests.resize(0); + temp_data->AngledHeadersRequests.reserve(table->ColumnsEnabledCount); + + // Which column needs highlight? + const ImGuiID row_id = GetID("##AngledHeaders"); + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + int highlight_column_n = table->HighlightColumnHeader; + if (highlight_column_n == -1 && table->HoveredColumnBody != -1) + if (table_instance->HoveredRowLast == 0 && table->HoveredColumnBorder == -1 && (g.ActiveId == 0 || g.ActiveId == row_id || (table->IsActiveIdInTable || g.DragDropActive))) + highlight_column_n = table->HoveredColumnBody; + + // Build up request + ImU32 col_header_bg = GetColorU32(ImGuiCol_TableHeaderBg); + ImU32 col_text = GetColorU32(ImGuiCol_Text); + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + if ((column->Flags & ImGuiTableColumnFlags_AngledHeader) == 0) // Note: can't rely on ImGuiTableColumnFlags_IsVisible test here. + continue; + ImGuiTableHeaderData request = { (ImGuiTableColumnIdx)column_n, col_text, col_header_bg, (column_n == highlight_column_n) ? GetColorU32(ImGuiCol_Header) : 0 }; + temp_data->AngledHeadersRequests.push_back(request); + } + + // Render row + TableAngledHeadersRowEx(row_id, g.Style.TableAngledHeadersAngle, 0.0f, temp_data->AngledHeadersRequests.Data, temp_data->AngledHeadersRequests.Size); +} + +// Important: data must be fed left to right +void ImGui::TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + ImGuiWindow* window = g.CurrentWindow; + ImDrawList* draw_list = window->DrawList; + IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); + IM_ASSERT(table->CurrentRow == -1 && "Must be first row"); + + if (max_label_width == 0.0f) + max_label_width = TableGetHeaderAngledMaxLabelWidth(); + + // Angle argument expressed in (-IM_PI/2 .. +IM_PI/2) as it is easier to think about for user. + const bool flip_label = (angle < 0.0f); + angle -= IM_PI * 0.5f; + const float cos_a = ImCos(angle); + const float sin_a = ImSin(angle); + const float label_cos_a = flip_label ? ImCos(angle + IM_PI) : cos_a; + const float label_sin_a = flip_label ? ImSin(angle + IM_PI) : sin_a; + const ImVec2 unit_right = ImVec2(cos_a, sin_a); + + // Calculate our base metrics and set angled headers data _before_ the first call to TableNextRow() + // FIXME-STYLE: Would it be better for user to submit 'max_label_width' or 'row_height' ? One can be derived from the other. + const float header_height = g.FontSize + g.Style.CellPadding.x * 2.0f; + const float row_height = ImTrunc(ImFabs(ImRotate(ImVec2(max_label_width, flip_label ? +header_height : -header_height), cos_a, sin_a).y)); + table->AngledHeadersHeight = row_height; + table->AngledHeadersSlope = (sin_a != 0.0f) ? (cos_a / sin_a) : 0.0f; + const ImVec2 header_angled_vector = unit_right * (row_height / -sin_a); // vector from bottom-left to top-left, and from bottom-right to top-right + + // Declare row, override and draw our own background + TableNextRow(ImGuiTableRowFlags_Headers, row_height); + TableNextColumn(); + const ImRect row_r(table->WorkRect.Min.x, table->BgClipRect.Min.y, table->WorkRect.Max.x, table->RowPosY2); + table->DrawSplitter->SetCurrentChannel(draw_list, TABLE_DRAW_CHANNEL_BG0); + float clip_rect_min_x = table->BgClipRect.Min.x; + if (table->FreezeColumnsCount > 0) + clip_rect_min_x = ImMax(clip_rect_min_x, table->Columns[table->FreezeColumnsCount - 1].MaxX); + TableSetBgColor(ImGuiTableBgTarget_RowBg0, 0); // Cancel + PushClipRect(table->BgClipRect.Min, table->BgClipRect.Max, false); // Span all columns + draw_list->AddRectFilled(ImVec2(table->BgClipRect.Min.x, row_r.Min.y), ImVec2(table->BgClipRect.Max.x, row_r.Max.y), GetColorU32(ImGuiCol_TableHeaderBg, 0.25f)); // FIXME-STYLE: Change row background with an arbitrary color. + PushClipRect(ImVec2(clip_rect_min_x, table->BgClipRect.Min.y), table->BgClipRect.Max, true); // Span all columns + + ButtonBehavior(row_r, row_id, NULL, NULL); + KeepAliveID(row_id); + + const float ascent_scaled = g.Font->Ascent * (g.FontSize / g.Font->FontSize); // FIXME: Standardize those scaling factors better + const float line_off_for_ascent_x = (ImMax((g.FontSize - ascent_scaled) * 0.5f, 0.0f) / -sin_a) * (flip_label ? -1.0f : 1.0f); + const ImVec2 padding = g.Style.CellPadding; // We will always use swapped component + const ImVec2 align = g.Style.TableAngledHeadersTextAlign; + + // Draw background and labels in first pass, then all borders. + float max_x = 0.0f; + for (int pass = 0; pass < 2; pass++) + for (int order_n = 0; order_n < data_count; order_n++) + { + const ImGuiTableHeaderData* request = &data[order_n]; + const int column_n = request->Index; + ImGuiTableColumn* column = &table->Columns[column_n]; + + ImVec2 bg_shape[4]; + bg_shape[0] = ImVec2(column->MaxX, row_r.Max.y); + bg_shape[1] = ImVec2(column->MinX, row_r.Max.y); + bg_shape[2] = bg_shape[1] + header_angled_vector; + bg_shape[3] = bg_shape[0] + header_angled_vector; + if (pass == 0) + { + // Draw shape + draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor0); + draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor1); // Optional highlight + max_x = ImMax(max_x, bg_shape[3].x); + + // Draw label + // - First draw at an offset where RenderTextXXX() function won't meddle with applying current ClipRect, then transform to final offset. + // - Handle multiple lines manually, as we want each lines to follow on the horizontal border, rather than see a whole block rotated. + const char* label_name = TableGetColumnName(table, column_n); + const char* label_name_end = FindRenderedTextEnd(label_name); + const float line_off_step_x = (g.FontSize / -sin_a); + const int label_lines = ImTextCountLines(label_name, label_name_end); + + // Left<>Right alignment + float line_off_curr_x = flip_label ? (label_lines - 1) * line_off_step_x : 0.0f; + float line_off_for_align_x = ImMax((((column->MaxX - column->MinX) - padding.x * 2.0f) - (label_lines * line_off_step_x)), 0.0f) * align.x; + line_off_curr_x += line_off_for_align_x - line_off_for_ascent_x; + + // Register header width + column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX + ImCeil(label_lines * line_off_step_x - line_off_for_align_x); + + while (label_name < label_name_end) + { + const char* label_name_eol = strchr(label_name, '\n'); + if (label_name_eol == NULL) + label_name_eol = label_name_end; + + // FIXME: Individual line clipping for right-most column is broken for negative angles. + ImVec2 label_size = CalcTextSize(label_name, label_name_eol); + float clip_width = max_label_width - padding.y; // Using padding.y*2.0f would be symmetrical but hide more text. + float clip_height = ImMin(label_size.y, column->ClipRect.Max.x - column->WorkMinX - line_off_curr_x); + ImRect clip_r(window->ClipRect.Min, window->ClipRect.Min + ImVec2(clip_width, clip_height)); + int vtx_idx_begin = draw_list->_VtxCurrentIdx; + PushStyleColor(ImGuiCol_Text, request->TextColor); + RenderTextEllipsis(draw_list, clip_r.Min, clip_r.Max, clip_r.Max.x, clip_r.Max.x, label_name, label_name_eol, &label_size); + PopStyleColor(); + int vtx_idx_end = draw_list->_VtxCurrentIdx; + + // Up<>Down alignment + const float available_space = ImMax(clip_width - label_size.x + ImAbs(padding.x * cos_a) * 2.0f - ImAbs(padding.y * sin_a) * 2.0f, 0.0f); + const float vertical_offset = available_space * align.y * (flip_label ? -1.0f : 1.0f); + + // Rotate and offset label + ImVec2 pivot_in = ImVec2(window->ClipRect.Min.x - vertical_offset, window->ClipRect.Min.y + label_size.y); + ImVec2 pivot_out = ImVec2(column->WorkMinX, row_r.Max.y); + line_off_curr_x += flip_label ? -line_off_step_x : line_off_step_x; + pivot_out += unit_right * padding.y; + if (flip_label) + pivot_out += unit_right * (clip_width - ImMax(0.0f, clip_width - label_size.x)); + pivot_out.x += flip_label ? line_off_curr_x + line_off_step_x : line_off_curr_x; + ShadeVertsTransformPos(draw_list, vtx_idx_begin, vtx_idx_end, pivot_in, label_cos_a, label_sin_a, pivot_out); // Rotate and offset + //if (g.IO.KeyShift) { ImDrawList* fg_dl = GetForegroundDrawList(); vtx_idx_begin = fg_dl->_VtxCurrentIdx; fg_dl->AddRect(clip_r.Min, clip_r.Max, IM_COL32(0, 255, 0, 255), 0.0f, 0, 1.0f); ShadeVertsTransformPos(fg_dl, vtx_idx_begin, fg_dl->_VtxCurrentIdx, pivot_in, label_cos_a, label_sin_a, pivot_out); } + + label_name = label_name_eol + 1; + } + } + if (pass == 1) + { + // Draw border + draw_list->AddLine(bg_shape[0], bg_shape[3], TableGetColumnBorderCol(table, order_n, column_n)); + } + } + PopClipRect(); + PopClipRect(); + table->TempData->AngledHeadersExtraWidth = ImMax(0.0f, max_x - table->Columns[table->RightMostEnabledColumn].MaxX); +} + //------------------------------------------------------------------------- // [SECTION] Tables: Context Menu //------------------------------------------------------------------------- // - TableOpenContextMenu() [Internal] -// - TableDrawContextMenu() [Internal] +// - TableBeginContextMenuPopup() [Internal] +// - TableDrawDefaultContextMenu() [Internal] //------------------------------------------------------------------------- // Use -1 to open menu not specific to a given column. @@ -3084,7 +3393,13 @@ bool ImGui::TableBeginContextMenuPopup(ImGuiTable* table) // Output context menu into current window (generally a popup) // FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? -void ImGui::TableDrawContextMenu(ImGuiTable* table) +// Sections to display are pulled from 'flags_for_section_to_display', which is typically == table->Flags. +// - ImGuiTableFlags_Resizable -> display Sizing menu items +// - ImGuiTableFlags_Reorderable -> display "Reset Order" +////- ImGuiTableFlags_Sortable -> display sorting options (disabled) +// - ImGuiTableFlags_Hideable -> display columns visibility menu items +// It means if you have a custom context menus you can call this section and omit some sections, and add your own. +void ImGui::TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; @@ -3096,7 +3411,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; // Sizing - if (table->Flags & ImGuiTableFlags_Resizable) + if (flags_for_section_to_display & ImGuiTableFlags_Resizable) { if (column != NULL) { @@ -3116,7 +3431,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) } // Ordering - if (table->Flags & ImGuiTableFlags_Reorderable) + if (flags_for_section_to_display & ImGuiTableFlags_Reorderable) { if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableResetOrder), NULL, false, !table->IsDefaultDisplayOrder)) table->IsResetDisplayOrderRequest = true; @@ -3130,7 +3445,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) // Sorting // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) #if 0 - if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) + if ((flags_for_section_to_display & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) { if (want_separator) Separator(); @@ -3145,7 +3460,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) #endif // Hiding / Visibility - if (table->Flags & ImGuiTableFlags_Hideable) + if (flags_for_section_to_display & ImGuiTableFlags_Hideable) { if (want_separator) Separator(); @@ -3581,7 +3896,8 @@ static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_poli void ImGui::DebugNodeTable(ImGuiTable* table) { - const bool is_active = (table->LastFrameActive >= GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. + ImGuiContext& g = *GImGui; + const bool is_active = (table->LastFrameActive >= g.FrameCount - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } bool open = TreeNode(table, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); if (!is_active) { PopStyleColor(); } @@ -3593,12 +3909,24 @@ void ImGui::DebugNodeTable(ImGuiTable* table) return; if (table->InstanceCurrent > 0) Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1); + if (g.IO.ConfigDebugIsDebuggerPresent) + { + if (DebugBreakButton("**DebugBreak**", "in BeginTable()")) + g.DebugBreakInTable = table->ID; + SameLine(); + } + bool clear_settings = SmallButton("Clear settings"); BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); + for (int n = 0; n < table->InstanceCurrent + 1; n++) + { + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, n); + BulletText("Instance %d: HoveredRow: %d, LastOuterHeight: %.2f", n, table_instance->HoveredRowLast, table_instance->LastOuterHeight); + } //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); float sum_weights = 0.0f; for (int n = 0; n < table->ColumnsCount; n++) @@ -3724,7 +4052,7 @@ float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offse return offset / (columns->OffMaxX - columns->OffMinX); } -static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; +static const float COLUMNS_HIT_RECT_HALF_THICKNESS = 4.0f; static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) { @@ -3735,7 +4063,7 @@ static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); - float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; + float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale) - window->Pos.x; x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); @@ -3908,7 +4236,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl // Set state for first column // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect const float column_padding = g.Style.ItemSpacing.x; - const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); + const float half_clip_extend_x = ImTrunc(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); @@ -3955,8 +4283,9 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl float width = offset_1 - offset_0; PushItemWidth(width * 0.65f); window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; + window->WorkRect.Max.y = window->ContentRegionRect.Max.y; } void ImGui::NextColumn() @@ -3970,7 +4299,7 @@ void ImGui::NextColumn() if (columns->Count == 1) { - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); IM_ASSERT(columns->Current == 0); return; } @@ -4002,7 +4331,7 @@ void ImGui::NextColumn() window->DC.IsSameLine = false; columns->LineMinY = columns->LineMaxY; } - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); window->DC.CursorPos.y = columns->LineMinY; window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); window->DC.CurrLineTextBaseOffset = 0.0f; @@ -4049,7 +4378,7 @@ void ImGui::EndColumns() ImGuiOldColumnData* column = &columns->Columns[n]; float x = window->Pos.x + GetColumnOffset(n); const ImGuiID column_id = columns->ID + ImGuiID(n); - const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; + const float column_hit_hw = ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale); const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); if (!ItemAdd(column_hit_rect, column_id, NULL, ImGuiItemFlags_NoNav)) continue; @@ -4066,7 +4395,7 @@ void ImGui::EndColumns() // Draw column const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - const float xi = IM_FLOOR(x); + const float xi = IM_TRUNC(x); window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); } @@ -4087,7 +4416,7 @@ void ImGui::EndColumns() window->ParentWorkRect = columns->HostBackupParentWorkRect; window->DC.CurrentColumns = NULL; window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); NavUpdateCurrentWindowIsScrollPushableX(); } diff --git a/extern/src/imgui/imgui_widgets.cpp b/extern/src/imgui/imgui_widgets.cpp index 83f27111..2881dd7a 100644 --- a/extern/src/imgui/imgui_widgets.cpp +++ b/extern/src/imgui/imgui_widgets.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.7 // (widgets code) /* @@ -18,6 +18,8 @@ Index of this file: // [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. // [SECTION] Widgets: TreeNode, CollapsingHeader, etc. // [SECTION] Widgets: Selectable +// [SECTION] Widgets: Typing-Select support +// [SECTION] Widgets: Multi-Select support // [SECTION] Widgets: ListBox // [SECTION] Widgets: PlotLines, PlotHistogram // [SECTION] Widgets: Value helpers @@ -41,11 +43,7 @@ Index of this file: #include "imgui_internal.h" // System includes -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif //------------------------------------------------------------------------- // Warnings @@ -77,6 +75,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') #pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked @@ -124,9 +123,9 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1); //------------------------------------------------------------------------- // For InputTextEx() -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source); -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); -static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); +static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false); +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); +static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); //------------------------------------------------------------------------- // [SECTION] Widgets: Text, etc. @@ -479,6 +478,9 @@ void ImGui::BulletTextV(const char* fmt, va_list args) // Frame N + RepeatDelay + RepeatRate*N true true - true //------------------------------------------------------------------------------------------------------------------------------------------------- +// FIXME: For refactor we could output flags, incl mouse hovered vs nav keyboard vs nav triggered etc. +// And better standardize how widgets use 'GetColor32((held && hovered) ? ... : hovered ? ...)' vs 'GetColor32(held ? ... : hovered ? ...);' +// For mouse feedback we typically prefer the 'held && hovered' test, but for nav feedback not always. Outputting hovered=true on Activation may be misleading. bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) { ImGuiContext& g = *GImGui; @@ -492,6 +494,14 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) flags |= ImGuiButtonFlags_PressedOnDefault_; + // Default behavior inherited from item flags + // Note that _both_ ButtonFlags and ItemFlags are valid sources, so copy one into the item_flags and only check that. + ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); + if (flags & ImGuiButtonFlags_AllowOverlap) + item_flags |= ImGuiItemFlags_AllowOverlap; + if (flags & ImGuiButtonFlags_Repeat) + item_flags |= ImGuiItemFlags_ButtonRepeat; + ImGuiWindow* backup_hovered_window = g.HoveredWindow; const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; if (flatten_hovered_children) @@ -499,16 +509,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool #ifdef IMGUI_ENABLE_TEST_ENGINE // Alternate registration spot, for when caller didn't use ItemAdd() - if (id != 0 && g.LastItemData.ID != id) + if (g.LastItemData.ID != id) IMGUI_TEST_ENGINE_ITEM_ADD(id, bb, NULL); #endif bool pressed = false; - bool hovered = ItemHoverable(bb, id); - - // Drag source doesn't report as hovered - if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) - hovered = false; + bool hovered = ItemHoverable(bb, id, item_flags); // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) @@ -527,14 +533,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool if (flatten_hovered_children) g.HoveredWindow = backup_hovered_window; - // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. - if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) - hovered = false; - // Mouse handling const ImGuiID test_owner_id = (flags & ImGuiButtonFlags_NoTestKeyOwner) ? ImGuiKeyOwner_Any : id; if (hovered) { + IM_ASSERT(id != 0); // Lazily check inside rare path. + // Poll mouse buttons // - 'mouse_button_clicked' is generally carried into ActiveIdMouseButton when setting ActiveId. // - Technically we only need some values in one code path, but since this is gated by hovered test this is fine. @@ -543,7 +547,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool for (int button = 0; button < 3; button++) if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here. { - if (IsMouseClicked(button, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } + if (IsMouseClicked(button, ImGuiInputFlags_None, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; } } @@ -579,7 +583,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool { if (mouse_button_released != -1) { - const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior + const bool has_repeated_at_least_once = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior if (!has_repeated_at_least_once) pressed = true; if (!(flags & ImGuiButtonFlags_NoNavFocus)) @@ -590,8 +594,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. - if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) - if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, test_owner_id, ImGuiInputFlags_Repeat)) + if (g.ActiveId == id && (item_flags & ImGuiItemFlags_ButtonRepeat)) + if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, ImGuiInputFlags_Repeat, test_owner_id)) pressed = true; } @@ -599,16 +603,16 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool g.NavDisableHighlight = true; } - // Gamepad/Keyboard navigation - // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. - if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) + // Gamepad/Keyboard handling + // We report navigated and navigation-activated items as hovered but we don't set g.HoveredId to not interfere with mouse. + if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover) if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) hovered = true; if (g.NavActivateDownId == id) { bool nav_activated_by_code = (g.NavActivateId == id); bool nav_activated_by_inputs = (g.NavActivatePressedId == id); - if (!nav_activated_by_inputs && (flags & ImGuiButtonFlags_Repeat)) + if (!nav_activated_by_inputs && (item_flags & ImGuiItemFlags_ButtonRepeat)) { // Avoid pressing multiple keys from triggering excessive amount of repeat events const ImGuiKeyData* key1 = GetKeyData(ImGuiKey_Space); @@ -623,8 +627,10 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool pressed = true; SetActiveID(id, window); g.ActiveIdSource = g.NavInputSource; - if (!(flags & ImGuiButtonFlags_NoNavFocus)) + if (!(flags & ImGuiButtonFlags_NoNavFocus) && !(g.NavActivateFlags & ImGuiActivateFlags_FromShortcut)) SetFocusID(id, window); + if (g.NavActivateFlags & ImGuiActivateFlags_FromShortcut) + g.ActiveIdFromShortcut = true; } } @@ -655,7 +661,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool { // Report as pressed when releasing the mouse (this is the most common path) bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2; - bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps + bool is_repeating_already = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps bool is_button_avail_or_owned = TestKeyOwner(MouseButtonToKey(mouse_button), test_owner_id); if (!is_double_click_release && !is_repeating_already && is_button_avail_or_owned) pressed = true; @@ -668,13 +674,19 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool else if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad) { // When activated using Nav, we hold on the ActiveID until activation button is released - if (g.NavActivateDownId != id) + if (g.NavActivateDownId == id) + held = true; // hovered == true not true as we are already likely hovered on direct activation. + else ClearActiveID(); } if (pressed) g.ActiveIdHasBeenPressedBefore = true; } + // Activation highlight (this may be a remote activation) + if (g.NavHighlightActivatedId == id) + hovered = true; + if (out_hovered) *out_hovered = hovered; if (out_held) *out_held = held; @@ -702,9 +714,6 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags if (!ItemAdd(bb, id)) return false; - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); @@ -781,9 +790,6 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu if (!ItemAdd(bb, id)) return false; - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); @@ -812,14 +818,14 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? - const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize)); ImRect bb_interact = bb; const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); if (area_to_visible_ratio < 1.5f) - bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); + bb_interact.Expand(ImTrunc(bb_interact.GetSize() * -0.25f)); // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. - // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). + // (this isn't the common behavior of buttons, but it doesn't affect the user because navigation tends to keep items visible in scrolling layer). bool is_clipped = !ItemAdd(bb_interact, id); bool hovered, held; @@ -848,17 +854,19 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); - ItemAdd(bb, id); + ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize)); + bool is_clipped = !ItemAdd(bb, id); bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); + if (is_clipped) + return pressed; // Render ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); ImU32 text_col = GetColorU32(ImGuiCol_Text); if (hovered || held) - window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col); - RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); + window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0.0f, -0.5f), g.FontSize * 0.5f + 1.0f, bg_col); + RenderArrow(window->DrawList, bb.Min, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); // Switch to moving the window after mouse is moved beyond the initial drag threshold if (IsItemActive() && IsMouseDragging(0)) @@ -881,9 +889,9 @@ ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) IM_ASSERT(scrollbar_size > 0.0f); if (axis == ImGuiAxis_X) - return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); + return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x - border_size, outer_rect.Max.y - border_size); else - return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); + return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x - border_size, inner_rect.Max.y - border_size); } void ImGui::Scrollbar(ImGuiAxis axis) @@ -944,7 +952,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 const bool allow_interaction = (alpha >= 1.0f); ImRect bb = bb_frame; - bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); + bb.Expand(ImVec2(-ImClamp(IM_TRUNC((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_TRUNC((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); @@ -972,7 +980,6 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 // Click position in scrollbar normalized space (0.0f->1.0f) const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); - SetHoveredID(id); bool seek_absolute = false; if (g.ActiveIdIsJustActivated) @@ -994,7 +1001,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; - // Update distance to grab now that we have seeked and saturated + // Update distance to grab now that we have seek'ed and saturated if (seek_absolute) g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; } @@ -1013,33 +1020,30 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 return held; } -void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) +// - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples +// - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above. +void ImGui::Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return; - ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - if (border_col.w > 0.0f) - bb.Max += ImVec2(2, 2); + const float border_size = (border_col.w > 0.0f) ? 1.0f : 0.0f; + const ImVec2 padding(border_size, border_size); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f); ItemSize(bb); if (!ItemAdd(bb, 0)) return; - if (border_col.w > 0.0f) - { - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); - window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col)); - } - else - { - window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); - } + // Render + if (border_size > 0.0f) + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f, ImDrawFlags_None, border_size); + window->DrawList->AddImage(user_texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); } // ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) // We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. -bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); @@ -1047,7 +1051,7 @@ bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size return false; const ImVec2 padding = g.Style.FramePadding; - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2.0f); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f); ItemSize(bb); if (!ItemAdd(bb, id)) return false; @@ -1066,14 +1070,15 @@ bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size return pressed; } -bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col) +// Note that ImageButton() adds style.FramePadding*2.0f to provided size. This is in order to facilitate fitting an image in a button. +bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (window->SkipItems) return false; - return ImageButtonEx(window->GetID(str_id), user_texture_id, size, uv0, uv1, bg_col, tint_col); + return ImageButtonEx(window->GetID(str_id), user_texture_id, image_size, uv0, uv1, bg_col, tint_col); } #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS @@ -1140,12 +1145,12 @@ bool ImGui::Checkbox(const char* label, bool* v) { // Undocumented tristate/mixed/indeterminate checkbox (#2644) // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) - ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + ImVec2 pad(ImMax(1.0f, IM_TRUNC(square_sz / 3.6f)), ImMax(1.0f, IM_TRUNC(square_sz / 3.6f))); window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); } else if (*v) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); } @@ -1168,10 +1173,8 @@ bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) if (!all_on && any_on) { ImGuiContext& g = *GImGui; - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_MixedValue; + g.NextItemData.ItemFlags |= ImGuiItemFlags_MixedValue; pressed = Checkbox(label, &all_on); - g.CurrentItemFlags = backup_item_flags; } else { @@ -1242,7 +1245,7 @@ bool ImGui::RadioButton(const char* label, bool active) window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), num_segment); if (active) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark)); } @@ -1288,24 +1291,47 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over if (!ItemAdd(bb, 0)) return; - // Render - fraction = ImSaturate(fraction); - RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); - bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); - const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); - RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); + // Fraction < 0.0f will display an indeterminate progress bar animation + // The value must be animated along with time, so e.g. passing '-1.0f * ImGui::GetTime()' as fraction works. + const bool is_indeterminate = (fraction < 0.0f); + if (!is_indeterminate) + fraction = ImSaturate(fraction); - // Default displaying the fraction as percentage string, but user can override it - char overlay_buf[32]; - if (!overlay) + // Out of courtesy we accept a NaN fraction without crashing + float fill_n0 = 0.0f; + float fill_n1 = (fraction == fraction) ? fraction : 0.0f; + + if (is_indeterminate) { - ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); - overlay = overlay_buf; + const float fill_width_n = 0.2f; + fill_n0 = ImFmod(-fraction, 1.0f) * (1.0f + fill_width_n) - fill_width_n; + fill_n1 = ImSaturate(fill_n0 + fill_width_n); + fill_n0 = ImSaturate(fill_n0); } - ImVec2 overlay_size = CalcTextSize(overlay, NULL); - if (overlay_size.x > 0.0f) - RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); + // Render + RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); + RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), fill_n0, fill_n1, style.FrameRounding); + + // Default displaying the fraction as percentage string, but user can override it + // Don't display text for indeterminate bars by default + char overlay_buf[32]; + if (!is_indeterminate || overlay != NULL) + { + if (!overlay) + { + ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); + overlay = overlay_buf; + } + + ImVec2 overlay_size = CalcTextSize(overlay, NULL); + if (overlay_size.x > 0.0f) + { + float text_x = is_indeterminate ? (bb.Min.x + bb.Max.x - overlay_size.x) * 0.5f : ImLerp(bb.Min.x, bb.Max.x, fill_n1) + style.ItemSpacing.x; + RenderTextClipped(ImVec2(ImClamp(text_x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); + } + } } void ImGui::Bullet() @@ -1422,26 +1448,19 @@ void ImGui::SeparatorEx(ImGuiSeparatorFlags flags, float thickness) else if (flags & ImGuiSeparatorFlags_Horizontal) { // Horizontal Separator - float x1 = window->Pos.x; - float x2 = window->Pos.x + window->Size.x; - - // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator - if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) - x1 += window->DC.Indent.x; - - // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want, - // need to introduce a variant of WorkRect for that purpose. (#4787) - if (ImGuiTable* table = g.CurrentTable) - { - x1 = table->Columns[table->CurrentColumn].MinX; - x2 = table->Columns[table->CurrentColumn].MaxX; - } + float x1 = window->DC.CursorPos.x; + float x2 = window->WorkRect.Max.x; + // Preserve legacy behavior inside Columns() // Before Tables API happened, we relied on Separator() to span all columns of a Columns() set. // We currently don't need to provide the same feature for tables because tables naturally have border features. ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; if (columns) + { + x1 = window->Pos.x + window->DC.Indent.x; // Used to be Pos.x before 2023/10/03 + x2 = window->Pos.x + window->Size.x; PushColumnsBackground(); + } // We don't provide our width to the layout so that it doesn't get feed back into AutoFit // FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell) @@ -1475,7 +1494,11 @@ void ImGui::Separator() // Those flags should eventually be configurable by the user // FIXME: We cannot g.Style.SeparatorTextBorderSize for thickness as it relates to SeparatorText() which is a decorated separator, not defaulting to 1.0f. ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; - flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot. + + // Only applies to legacy Columns() api as they relied on Separator() a lot. + if (window->DC.CurrentColumns) + flags |= ImGuiSeparatorFlags_SpanAllColumns; + SeparatorEx(flags, 1.0f); } @@ -1492,14 +1515,14 @@ void ImGui::SeparatorTextEx(ImGuiID id, const char* label, const char* label_end const float separator_thickness = style.SeparatorTextBorderSize; const ImVec2 min_size(label_size.x + extra_w + padding.x * 2.0f, ImMax(label_size.y + padding.y * 2.0f, separator_thickness)); const ImRect bb(pos, ImVec2(window->WorkRect.Max.x, pos.y + min_size.y)); - const float text_baseline_y = ImFloor((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f)); + const float text_baseline_y = ImTrunc((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f)); ItemSize(min_size, text_baseline_y); if (!ItemAdd(bb, id)) return; const float sep1_x1 = pos.x; const float sep2_x2 = bb.Max.x; - const float seps_y = ImFloor((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f); + const float seps_y = ImTrunc((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f); const float label_avail_w = ImMax(0.0f, sep2_x2 - sep1_x1 - padding.x * 2.0f); const ImVec2 label_pos(pos.x + padding.x + ImMax(0.0f, (label_avail_w - label_size.x - extra_w) * style.SeparatorTextAlign.x), pos.y + text_baseline_y); // FIXME-ALIGN @@ -1553,14 +1576,20 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float if (!ItemAdd(bb, id, NULL, ImGuiItemFlags_NoNav)) return false; + // FIXME: AFAIK the only leftover reason for passing ImGuiButtonFlags_AllowOverlap here is + // to allow caller of SplitterBehavior() to call SetItemAllowOverlap() after the item. + // Nowadays we would instead want to use SetNextItemAllowOverlap() before the item. + ImGuiButtonFlags button_flags = ImGuiButtonFlags_FlattenChildren; +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + button_flags |= ImGuiButtonFlags_AllowOverlap; +#endif + bool hovered, held; ImRect bb_interact = bb; bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); - ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); + ButtonBehavior(bb_interact, id, &hovered, &held, button_flags); if (hovered) g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb - if (g.ActiveId != id) - SetItemAllowOverlap(); if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay)) SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); @@ -1568,8 +1597,7 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float ImRect bb_render = bb; if (held) { - ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; - float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; + float mouse_delta = (g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min)[axis]; // Minimum pane size float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1); @@ -1582,12 +1610,8 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float // Apply resize if (mouse_delta != 0.0f) { - if (mouse_delta < 0.0f) - IM_ASSERT(*size1 + mouse_delta >= min_size1); - if (mouse_delta > 0.0f) - IM_ASSERT(*size2 - mouse_delta >= min_size2); - *size1 += mouse_delta; - *size2 -= mouse_delta; + *size1 = ImMax(*size1 + mouse_delta, min_size1); + *size2 = ImMax(*size2 - mouse_delta, min_size2); bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); MarkItemEdited(id); } @@ -1641,7 +1665,7 @@ void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_exc width_excess = 0.0f; for (int n = 0; n < count; n++) { - float width_rounded = ImFloor(items[n].Width); + float width_rounded = ImTrunc(items[n].Width); width_excess += items[n].Width - width_rounded; items[n].Width = width_rounded; } @@ -1687,10 +1711,13 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together + if (flags & ImGuiComboFlags_WidthFitPreview) + IM_ASSERT((flags & (ImGuiComboFlags_NoPreview | (ImGuiComboFlags)ImGuiComboFlags_CustomPreview)) == 0); const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth(); + const float preview_width = ((flags & ImGuiComboFlags_WidthFitPreview) && (preview_value != NULL)) ? CalcTextSize(preview_value, NULL, true).x : 0.0f; + const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : ((flags & ImGuiComboFlags_WidthFitPreview) ? (arrow_size + preview_width + style.FramePadding.x * 2.0f) : CalcItemWidth()); const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); ItemSize(total_bb, style.FramePadding.y); @@ -1783,7 +1810,7 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags // This is essentially a specialized version of BeginPopupEx() char name[16]; - ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth + ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginComboDepth); // Recycle windows based on depth // Set position given a custom constraint (peak into expected window size so we can position it) // FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function? @@ -1810,12 +1837,15 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above return false; } + g.BeginComboDepth++; return true; } void ImGui::EndCombo() { + ImGuiContext& g = *GImGui; EndPopup(); + g.BeginComboDepth--; } // Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements @@ -1829,7 +1859,7 @@ bool ImGui::BeginComboPreview() if (window->SkipItems || !(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible)) return false; IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag? - if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional) + if (!window->ClipRect.Overlaps(preview_data->PreviewRect)) // Narrower test (optional) return false; // FIXME: This could be contained in a PushWorkRect() api @@ -1872,18 +1902,15 @@ void ImGui::EndComboPreview() } // Getter for the old Combo() API: const char*[] -static bool Items_ArrayGetter(void* data, int idx, const char** out_text) +static const char* Items_ArrayGetter(void* data, int idx) { const char* const* items = (const char* const*)data; - if (out_text) - *out_text = items[idx]; - return true; + return items[idx]; } // Getter for the old Combo() API: "item1\0item2\0item3\0" -static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) +static const char* Items_SingleStringGetter(void* data, int idx) { - // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. const char* items_separated_by_zeros = (const char*)data; int items_count = 0; const char* p = items_separated_by_zeros; @@ -1894,22 +1921,18 @@ static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) p += strlen(p) + 1; items_count++; } - if (!*p) - return false; - if (out_text) - *out_text = p; - return true; + return *p ? p : NULL; } // Old API, prefer using BeginCombo() nowadays if you can. -bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) +bool ImGui::Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items) { ImGuiContext& g = *GImGui; // Call the getter to obtain the preview string which is a parameter to BeginCombo() const char* preview_value = NULL; if (*current_item >= 0 && *current_item < items_count) - items_getter(data, *current_item, &preview_value); + preview_value = getter(user_data, *current_item); // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) @@ -1923,12 +1946,13 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi bool value_changed = false; for (int i = 0; i < items_count; i++) { + const char* item_text = getter(user_data, i); + if (item_text == NULL) + item_text = "*Unknown item*"; + PushID(i); const bool item_selected = (i == *current_item); - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - if (Selectable(item_text, item_selected)) + if (Selectable(item_text, item_selected) && *current_item != i) { value_changed = true; *current_item = i; @@ -1967,13 +1991,37 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa return value_changed; } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +struct ImGuiGetNameFromIndexOldToNewCallbackData { void* UserData; bool (*OldCallback)(void*, int, const char**); }; +static const char* ImGuiGetNameFromIndexOldToNewCallback(void* user_data, int idx) +{ + ImGuiGetNameFromIndexOldToNewCallbackData* data = (ImGuiGetNameFromIndexOldToNewCallbackData*)user_data; + const char* s = NULL; + data->OldCallback(data->UserData, idx, &s); + return s; +} + +bool ImGui::ListBox(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int height_in_items) +{ + ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter }; + return ListBox(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, height_in_items); +} +bool ImGui::Combo(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int popup_max_height_in_items) +{ + ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter }; + return Combo(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, popup_max_height_in_items); +} + +#endif + //------------------------------------------------------------------------- // [SECTION] Data Type and Data Formatting Helpers [Internal] //------------------------------------------------------------------------- // - DataTypeGetInfo() // - DataTypeFormatString() // - DataTypeApplyOp() -// - DataTypeApplyOpFromText() +// - DataTypeApplyFromText() // - DataTypeCompare() // - DataTypeClamp() // - GetMinimumStepAtDecimalPrecision @@ -2261,7 +2309,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); - const float tweak_factor = tweak_slow ? 1.0f / 1.0f : tweak_fast ? 10.0f : 1.0f; + const float tweak_factor = tweak_slow ? 1.0f / 10.0f : tweak_fast ? 10.0f : 1.0f; adjust_delta = GetNavTweakPressedAmount(axis) * tweak_factor; v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); } @@ -2415,19 +2463,18 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { // Tabbing or CTRL-clicking on Drag turns it into an InputText - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = hovered && IsMouseClicked(0, id); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id)); - const bool make_active = (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id); + const bool make_active = (clicked || double_clicked || g.NavActivateId == id); if (make_active && (clicked || double_clicked)) SetKeyOwner(ImGuiKey_MouseLeft, id); if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + if ((clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) temp_input_is_active = true; // (Optional) simple click (without moving) turns Drag into an InputText @@ -2778,14 +2825,14 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); + const float v_range_f = (float)(v_min < v_max ? v_max - v_min : v_min - v_max); // We don't need high precision for what we do with it. // Calculate bounds const float grab_padding = 2.0f; // FIXME: Should be part of style. const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; float grab_sz = style.GrabMinSize; - if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows - grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit + if (!is_floating_point && v_range_f >= 0.0f) // v_range_f < 0 may happen on integer overflows + grab_sz = ImMax(slider_sz / (v_range_f + 1), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit grab_sz = ImMin(grab_sz, slider_sz); const float slider_usable_sz = slider_sz - grab_sz; const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; @@ -2854,8 +2901,8 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ } else { - if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow) - input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps + if ((v_range_f >= -100.0f && v_range_f <= 100.0f && v_range_f != 0.0f) || tweak_slow) + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / v_range_f; // Gamepad/keyboard tweak speeds in integer steps else input_delta /= 100.0f; } @@ -2902,6 +2949,10 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ } } + if (set_new_value) + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + set_new_value = false; + if (set_new_value) { TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); @@ -2947,11 +2998,6 @@ bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); - // Those are the things we can do easily outside the SliderBehaviorT<> template, saves code generation. - ImGuiContext& g = *GImGui; - if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) - return false; - switch (data_type) { case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } @@ -3008,18 +3054,17 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { // Tabbing or CTRL-clicking on Slider turns it into an input box - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = hovered && IsMouseClicked(0, id); - const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); + const bool make_active = (clicked || g.NavActivateId == id); if (make_active && clicked) SetKeyOwner(ImGuiKey_MouseLeft, id); if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + if ((clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) temp_input_is_active = true; if (make_active && !temp_input_is_active) @@ -3175,8 +3220,8 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); - const bool clicked = hovered && IsMouseClicked(0, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); if (clicked || g.NavActivateId == id) { if (clicked) @@ -3391,14 +3436,6 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* return value_changed; } -static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format) -{ - if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) - return ImGuiInputTextFlags_CharsScientific; - const char format_last_char = format[0] ? format[strlen(format) - 1] : 0; - return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal; -} - // Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! // This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. // However this may not be ideal for all uses, as some user code may break on out of bound values. @@ -3415,8 +3452,7 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); ImStrTrimBlanks(data_buf); - ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; - flags |= InputScalar_DefaultCharsFilter(data_type, format); + ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint; bool value_changed = false; if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) @@ -3460,10 +3496,8 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data char buf[64]; DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); - // Testing ActiveId as a minor optimization as filtering is not needed until active - if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) - flags |= InputScalar_DefaultCharsFilter(data_type, format); - flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + flags |= (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint; bool value_changed = false; if (p_step == NULL) @@ -3557,7 +3591,6 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_dat bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) { - flags |= ImGuiInputTextFlags_CharsScientific; return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); } @@ -3600,7 +3633,6 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) { - flags |= ImGuiInputTextFlags_CharsScientific; return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); } @@ -3698,8 +3730,8 @@ namespace ImStb { static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; } -static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; } -static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } +static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { IM_ASSERT(idx <= obj->CurLenW); return obj->TextW[idx]; } +static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return IMSTB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx) @@ -3817,12 +3849,13 @@ static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const Im #define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page #define STB_TEXTEDIT_K_SHIFT 0x400000 -#define STB_TEXTEDIT_IMPLEMENTATION +#define IMSTB_TEXTEDIT_IMPLEMENTATION +#define IMSTB_TEXTEDIT_memmove memmove #include "imstb_textedit.h" // stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling // the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) -static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) +static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const IMSTB_TEXTEDIT_CHARTYPE* text, int text_len) { stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); @@ -3875,6 +3908,10 @@ void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) { + // Accept null ranges + if (new_text == new_text_end) + return; + const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); if (new_text_len + BufTextLen >= BufSize) @@ -3906,9 +3943,8 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons } // Return false to discard a character. -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source) +static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard) { - IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard); unsigned int c = *p_char; // Filter non-printable (NB: isprint is unreliable! see #2467) @@ -3916,14 +3952,14 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f if (c < 0x20) { bool pass = false; - pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) - pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); + pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0; // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) + pass |= (c == '\t') && (flags & ImGuiInputTextFlags_AllowTabInput) != 0; if (!pass) return false; apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted. } - if (input_source != ImGuiInputSource_Clipboard) + if (input_source_is_clipboard == false) { // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) if (c == 127) @@ -3939,16 +3975,19 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f return false; // Generic named filters - if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))) + if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint))) { // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'. // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. // Change the default decimal_point with: - // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; + // ImGui::GetIO()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; // Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions. - ImGuiContext& g = *GImGui; - const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; + ImGuiContext& g = *ctx; + const unsigned c_decimal_point = (unsigned int)g.IO.PlatformLocaleDecimalPoint; + if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint)) + if (c == '.' || c == ',') + c = c_decimal_point; // Full-width -> half-width conversion for numeric fields (https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block) // While this is mostly convenient, this has the side-effect for uninformed users accidentally inputting full-width characters that they may @@ -4034,7 +4073,7 @@ static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* st const int insert_len = new_last_diff - first_diff + 1; const int delete_len = old_last_diff - first_diff + 1; if (insert_len > 0 || delete_len > 0) - if (STB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) + if (IMSTB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) for (int i = 0; i < delete_len; i++) p[i] = ImStb::STB_TEXTEDIT_GETCHAR(state, first_diff + i); } @@ -4050,8 +4089,16 @@ void ImGui::InputTextDeactivateHook(ImGuiID id) if (id == 0 || state->ID != id) return; g.InputTextDeactivatedState.ID = state->ID; - g.InputTextDeactivatedState.TextA.resize(state->CurLenA + 1); - memcpy(g.InputTextDeactivatedState.TextA.Data, state->TextA.Data ? state->TextA.Data : "", state->CurLenA + 1); + if (state->Flags & ImGuiInputTextFlags_ReadOnly) + { + g.InputTextDeactivatedState.TextA.resize(0); // In theory this data won't be used, but clear to be neat. + } + else + { + IM_ASSERT(state->TextA.Data != 0); + g.InputTextDeactivatedState.TextA.resize(state->CurLenA + 1); + memcpy(g.InputTextDeactivatedState.TextA.Data, state->TextA.Data, state->CurLenA + 1); + } } // Edit a string of text @@ -4078,12 +4125,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const bool RENDER_SELECTION_WHEN_INACTIVE = false; const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; - const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; - const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; - const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; - const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; - if (is_resizable) - IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar) BeginGroup(); @@ -4097,7 +4138,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ ImGuiWindow* draw_window = window; ImVec2 inner_size = frame_size; - ImGuiItemStatusFlags item_status_flags = 0; ImGuiLastItemData item_data_backup; if (is_multiline) { @@ -4108,17 +4148,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ EndGroup(); return false; } - item_status_flags = g.LastItemData.StatusFlags; item_data_backup = g.LastItemData; window->DC.CursorPos = backup_pos; + // Prevent NavActivation from Tabbing when our widget accepts Tab inputs: this allows cycling through widgets without stopping. + if (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_FromTabbing) && (flags & ImGuiInputTextFlags_AllowTabInput)) + g.NavActivateId = 0; + + // Prevent NavActivate reactivating in BeginChild() when we are already active. + const ImGuiID backup_activate_id = g.NavActivateId; + if (g.ActiveId == id) // Prevent reactivation + g.NavActivateId = 0; + // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. - // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre. PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); + g.NavActivateId = backup_activate_id; PopStyleVar(3); PopStyleColor(); if (!child_visible) @@ -4139,16 +4187,23 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (!(flags & ImGuiInputTextFlags_MergedItem)) if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) return false; - item_status_flags = g.LastItemData.StatusFlags; } - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); if (hovered) g.MouseCursor = ImGuiMouseCursor_TextInput; // We are only allowed to access the state if we are already the active widget. ImGuiInputTextState* state = GetInputTextState(id); - const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + if (g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) + flags |= ImGuiInputTextFlags_ReadOnly; + const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; + const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; + const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; + const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; + if (is_resizable) + IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! + const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateId == id) && ((g.NavActivateFlags & ImGuiActivateFlags_PreferInput) || (g.NavInputSource == ImGuiInputSource_Keyboard))); const bool user_clicked = hovered && io.MouseClicked[0]; @@ -4159,27 +4214,32 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; + const bool init_reload_from_user_buf = (state != NULL && state->ReloadUserBuf); const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); // state != NULL means its our state. - const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing); + const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav); const bool init_state = (init_make_active || user_scroll_active); - if ((init_state && g.ActiveId != id) || init_changed_specs) + if ((init_state && g.ActiveId != id) || init_changed_specs || init_reload_from_user_buf) { // Access state even if we don't own it yet. state = &g.InputTextState; state->CursorAnimReset(); + state->ReloadUserBuf = false; // Backup state of deactivating item so they'll have a chance to do a write to output buffer on the same frame they report IsItemDeactivatedAfterEdit (#4714) InputTextDeactivateHook(state->ID); - // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) - // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) + // From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode) const int buf_len = (int)strlen(buf); - state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. - memcpy(state->InitialTextA.Data, buf, buf_len + 1); + if (!init_reload_from_user_buf) + { + // Take a copy of the initial buffer value. + state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. + memcpy(state->InitialTextA.Data, buf, buf_len + 1); + } // Preserve cursor position and undo/redo stack if we come back to same widget - // FIXME: Since we reworked this on 2022/06, may want to differenciate recycle_cursor vs recycle_undostate? - bool recycle_state = (state->ID == id && !init_changed_specs); + // FIXME: Since we reworked this on 2022/06, may want to differentiate recycle_cursor vs recycle_undostate? + bool recycle_state = (state->ID == id && !init_changed_specs && !init_reload_from_user_buf); if (recycle_state && (state->CurLenA != buf_len || (state->TextAIsValid && strncmp(state->TextA.Data, buf, buf_len) != 0))) recycle_state = false; @@ -4204,13 +4264,19 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ stb_textedit_initialize_state(&state->Stb, !is_multiline); } - if (!is_multiline) + if (init_reload_from_user_buf) + { + state->Stb.select_start = state->ReloadSelectionStart; + state->Stb.cursor = state->Stb.select_end = state->ReloadSelectionEnd; + state->CursorClamp(); + } + else if (!is_multiline) { if (flags & ImGuiInputTextFlags_AutoSelectAll) select_all = true; if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState))) select_all = true; - if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl)) + if (user_clicked && io.KeyCtrl) select_all = true; } @@ -4234,6 +4300,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + SetKeyOwner(ImGuiKey_Enter, id); + SetKeyOwner(ImGuiKey_KeypadEnter, id); SetKeyOwner(ImGuiKey_Home, id); SetKeyOwner(ImGuiKey_End, id); if (is_multiline) @@ -4241,10 +4309,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ SetKeyOwner(ImGuiKey_PageUp, id); SetKeyOwner(ImGuiKey_PageDown, id); } + // FIXME: May be a problem to always steal Alt on OSX, would ideally still allow an uninterrupted Alt down-up to toggle menu if (is_osx) SetKeyOwner(ImGuiMod_Alt, id); - if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. - SetShortcutRouting(ImGuiKey_Tab, id); } // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) @@ -4373,16 +4440,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // We expect backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336) // (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes) - if ((flags & ImGuiInputTextFlags_AllowTabInput) && Shortcut(ImGuiKey_Tab, id) && !is_readonly) + if ((flags & ImGuiInputTextFlags_AllowTabInput) && !is_readonly) { - unsigned int c = '\t'; // Insert TAB - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) - state->OnKeyPressed((int)c); + if (Shortcut(ImGuiKey_Tab, ImGuiInputFlags_Repeat, id)) + { + unsigned int c = '\t'; // Insert TAB + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) + state->OnKeyPressed((int)c); + } + // FIXME: Implement Shift+Tab + /* + if (Shortcut(ImGuiKey_Tab | ImGuiMod_Shift, ImGuiInputFlags_Repeat, id)) + { + } + */ } // Process regular text input (before we check for Return because using some IME will effectively send a Return?) // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters. - const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); + const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeyCtrl); if (io.InputQueueCharacters.Size > 0) { if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav) @@ -4392,7 +4468,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ unsigned int c = (unsigned int)io.InputQueueCharacters[n]; if (c == '\t') // Skip Tab, see above. continue; - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) state->OnKeyPressed((int)c); } @@ -4412,25 +4488,26 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl - const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End + const bool is_startend_key_down = is_osx && io.KeyCtrl && !io.KeySuper && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End // Using Shortcut() with ImGuiInputFlags_RouteFocused (default policy) to allow routing operations for other code (e.g. calling window trying to use CTRL+A and CTRL+B: formet would be handled by InputText) // Otherwise we could simply assume that we own the keys as we are active. const ImGuiInputFlags f_repeat = ImGuiInputFlags_Repeat; - const bool is_cut = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_X, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, id, f_repeat)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); - const bool is_copy = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_C, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, id)) && !is_password && (!is_multiline || state->HasSelection()); - const bool is_paste = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_V, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, id, f_repeat)) && !is_readonly; - const bool is_undo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Z, id, f_repeat)) && !is_readonly && is_undoable; - const bool is_redo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Y, id, f_repeat) || (is_osx && Shortcut(ImGuiMod_Shortcut | ImGuiMod_Shift | ImGuiKey_Z, id, f_repeat))) && !is_readonly && is_undoable; - const bool is_select_all = Shortcut(ImGuiMod_Shortcut | ImGuiKey_A, id); + const bool is_cut = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_X, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, f_repeat, id)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); + const bool is_copy = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, 0, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, 0, id)) && !is_password && (!is_multiline || state->HasSelection()); + const bool is_paste = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_V, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, f_repeat, id)) && !is_readonly; + const bool is_undo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Z, f_repeat, id)) && !is_readonly && is_undoable; + const bool is_redo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Y, f_repeat, id) || (is_osx && Shortcut(ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Z, f_repeat, id))) && !is_readonly && is_undoable; + const bool is_select_all = Shortcut(ImGuiMod_Ctrl | ImGuiKey_A, 0, id); // We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful. const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool is_enter_pressed = IsKeyPressed(ImGuiKey_Enter, true) || IsKeyPressed(ImGuiKey_KeypadEnter, true); const bool is_gamepad_validate = nav_gamepad_active && (IsKeyPressed(ImGuiKey_NavGamepadActivate, false) || IsKeyPressed(ImGuiKey_NavGamepadInput, false)); - const bool is_cancel = Shortcut(ImGuiKey_Escape, id, f_repeat) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, id, f_repeat)); + const bool is_cancel = Shortcut(ImGuiKey_Escape, f_repeat, id) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, f_repeat, id)); // FIXME: Should use more Shortcut() and reduce IsKeyPressed()+SetKeyOwner(), but requires modifiers combination to be taken account of. + // FIXME-OSX: Missing support for Alt(option)+Right/Left = go to end of line, or next line if already in end of line. if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } @@ -4455,7 +4532,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { if (is_wordmove_key_down) state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); - else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) + else if (is_osx && io.KeyCtrl && !io.KeyAlt && !io.KeySuper) state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); } state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); @@ -4475,7 +4552,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ else if (!is_readonly) { unsigned int c = '\n'; // Insert new line - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) state->OnKeyPressed((int)c); } } @@ -4483,7 +4560,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { if (flags & ImGuiInputTextFlags_EscapeClearsAll) { - if (state->CurLenA > 0) + if (buf[0] != 0) { revert_edit = true; } @@ -4542,7 +4619,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { unsigned int c; s += ImTextCharFromUtf8(&c, s, NULL); - if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard)) + if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true)) continue; clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; } @@ -4571,9 +4648,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (flags & ImGuiInputTextFlags_EscapeClearsAll) { // Clear input + IM_ASSERT(buf[0] != 0); apply_new_text = ""; apply_new_text_length = 0; - STB_TEXTEDIT_CHARTYPE empty_string; + value_changed = true; + IMSTB_TEXTEDIT_CHARTYPE empty_string; stb_textedit_replace(state, &state->Stb, &empty_string, 0); } else if (strcmp(buf, state->InitialTextA.Data) != 0) @@ -4601,9 +4680,12 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL); } - // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. + // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer + // before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. - // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). + // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage + // (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object + // unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). const bool apply_edit_back_to_user_buffer = !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); if (apply_edit_back_to_user_buffer) { @@ -4620,7 +4702,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. ImGuiInputTextFlags event_flag = 0; ImGuiKey event_key = ImGuiKey_None; - if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, id)) + if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, 0, id)) { event_flag = ImGuiInputTextFlags_CallbackCompletion; event_key = ImGuiKey_Tab; @@ -4679,7 +4761,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } if (buf_dirty) { - IM_ASSERT((flags & ImGuiInputTextFlags_ReadOnly) == 0); + IM_ASSERT(!is_readonly); IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! InputTextReconcileUndoStateAfterUserCallback(state, callback_data.Buf, callback_data.BufTextLen); // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ? if (callback_data.BufTextLen > backup_current_text_length && is_resizable) @@ -4704,11 +4786,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Handle reapplying final data on deactivation (see InputTextDeactivateHook() for details) if (g.InputTextDeactivatedState.ID == id) { - if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly) + if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly && strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0) { apply_new_text = g.InputTextDeactivatedState.TextA.Data; apply_new_text_length = g.InputTextDeactivatedState.TextA.Size - 1; - value_changed |= (strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0); + value_changed = true; //IMGUI_DEBUG_LOG("InputText(): apply Deactivated data for 0x%08X: \"%.*s\".\n", id, apply_new_text_length, apply_new_text); } g.InputTextDeactivatedState.ID = 0; @@ -4850,9 +4932,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const float scroll_increment_x = inner_size.x * 0.25f; const float visible_width = inner_size.x - style.FramePadding.x; if (cursor_offset.x < state->ScrollX) - state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); + state->ScrollX = IM_TRUNC(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); else if (cursor_offset.x - visible_width >= state->ScrollX) - state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); + state->ScrollX = IM_TRUNC(cursor_offset.x - visible_width + scroll_increment_x); } else { @@ -4902,7 +4984,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ else { ImVec2 rect_size = InputTextCalcTextSizeW(&g, p, text_selected_end, &p, NULL, true); - if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines + if (rect_size.x <= 0.0f) rect_size.x = IM_TRUNC(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); rect.ClipWith(clip_rect); if (rect.Overlaps(clip_rect)) @@ -4925,7 +5007,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { state->CursorAnim += io.DeltaTime; bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f; - ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll); + ImVec2 cursor_screen_pos = ImTrunc(draw_pos + cursor_offset - draw_scroll); ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f); if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); @@ -4963,11 +5045,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)... Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; + g.NextItemData.ItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; EndChild(); item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow); - g.CurrentItemFlags = backup_item_flags; // ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active... // FIXME: This quite messy/tricky, should attempt to get rid of the child window. @@ -5011,10 +5091,10 @@ void ImGui::DebugNodeInputTextState(ImGuiInputTextState* state) Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenW, state->CurLenA, stb_state->cursor, stb_state->select_start, stb_state->select_end); Text("has_preferred_x: %d (%.2f)", stb_state->has_preferred_x, stb_state->preferred_x); Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point); - if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), true)) // Visualize undo state + if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 10), ImGuiChildFlags_Border | ImGuiChildFlags_ResizeY)) // Visualize undo state { PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - for (int n = 0; n < STB_TEXTEDIT_UNDOSTATECOUNT; n++) + for (int n = 0; n < IMSTB_TEXTEDIT_UNDOSTATECOUNT; n++) { ImStb::StbUndoRecord* undo_rec = &undo_state->undo_rec[n]; const char undo_rec_type = (n < undo_state->undo_point) ? 'u' : (n >= undo_state->redo_point) ? 'r' : ' '; @@ -5096,10 +5176,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const float square_sz = GetFrameHeight(); - const float w_full = CalcItemWidth(); - const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); - const float w_inputs = w_full - w_button; const char* label_display_end = FindRenderedTextEnd(label); + float w_full = CalcItemWidth(); g.NextItemData.ClearFlags(); BeginGroup(); @@ -5133,6 +5211,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; const int components = alpha ? 4 : 3; + const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); + const float w_inputs = ImMax(w_full - w_button, 1.0f); + w_full = w_inputs + w_button; // Convert to the formats we need float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; @@ -5156,10 +5237,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) { // RGB/HSV 0..255 Sliders - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + const float w_items = w_inputs - style.ItemInnerSpacing.x * (components - 1); - const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); + const bool hide_prefix = (IM_TRUNC(w_items / components) <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; static const char* fmt_table_int[3][4] = { @@ -5175,11 +5255,14 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag }; const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1; + float prev_split = 0.0f; for (int n = 0; n < components; n++) { if (n > 0) SameLine(0, style.ItemInnerSpacing.x); - SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); + float next_split = IM_TRUNC(w_items * (n + 1) / components); + SetNextItemWidth(ImMax(next_split - prev_split, 1.0f)); + prev_split = next_split; // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. if (flags & ImGuiColorEditFlags_Float) @@ -5204,7 +5287,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag else ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); SetNextItemWidth(w_inputs); - if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) + if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsUppercase)) { value_changed = true; char* p = buf; @@ -5302,7 +5385,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag // Drag and Drop Target // NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test. - if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) { bool accepted_drag_drop = false; if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) @@ -5367,6 +5450,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl ImGuiIO& io = g.IO; const float width = CalcItemWidth(); + const bool is_readonly = ((g.NextItemData.ItemFlags | g.CurrentItemFlags) & ImGuiItemFlags_ReadOnly) != 0; g.NextItemData.ClearFlags(); PushID(label); @@ -5401,7 +5485,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; - float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); + float bars_triangles_half_sz = IM_TRUNC(bars_width * 0.20f); float backup_initial_col[4]; memcpy(backup_initial_col, col, components * sizeof(float)); @@ -5437,7 +5521,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { // Hue wheel + SV triangle logic InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; ImVec2 current_off = g.IO.MousePos - wheel_center; @@ -5472,7 +5556,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { // SV rectangle logic InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); @@ -5485,7 +5569,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl // Hue bar logic SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); value_changed = value_changed_h = true; @@ -5569,7 +5653,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl if ((flags & ImGuiColorEditFlags_NoInputs) == 0) { PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); - ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) @@ -5691,7 +5775,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl } // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) - float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; + float sv_cursor_rad = value_changed_sv ? wheel_thickness * 0.55f : wheel_thickness * 0.40f; int sv_cursor_segments = draw_list->_CalcCircleAutoSegmentCount(sv_cursor_rad); // Lock segment count so the +1 one matches others. draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, sv_cursor_segments); draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, sv_cursor_segments); @@ -5801,7 +5885,7 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl } // Tooltip - if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) + if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered && IsItemHovered(ImGuiHoveredFlags_ForTooltip)) ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); return pressed; @@ -5831,7 +5915,7 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags { ImGuiContext& g = *GImGui; - if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None)) + if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None)) return; const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; if (text_end > text) @@ -5869,6 +5953,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) return; ImGuiContext& g = *GImGui; + g.LockMarkEdited++; ImGuiColorEditFlags opts = g.ColorEditOptions; if (allow_opt_inputs) { @@ -5911,6 +5996,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) g.ColorEditOptions = opts; EndPopup(); + g.LockMarkEdited--; } void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) @@ -5920,6 +6006,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) return; ImGuiContext& g = *GImGui; + g.LockMarkEdited++; if (allow_opt_picker) { ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function @@ -5949,6 +6036,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); } EndPopup(); + g.LockMarkEdited--; } //------------------------------------------------------------------------- @@ -6119,44 +6207,72 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l label_end = FindRenderedTextEnd(label); const ImVec2 label_size = CalcTextSize(label, label_end, false); + const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapsing arrow width + Spacing + const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it + const float text_width = g.FontSize + label_size.x + padding.x * 2; // Include collapsing arrow + // We vertically grow up to current line height up the typical widget height. const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); + const bool span_all_columns = (flags & ImGuiTreeNodeFlags_SpanAllColumns) != 0 && (g.CurrentTable != NULL); ImRect frame_bb; - frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; + frame_bb.Min.x = span_all_columns ? window->ParentWorkRect.Min.x : (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; frame_bb.Min.y = window->DC.CursorPos.y; - frame_bb.Max.x = window->WorkRect.Max.x; + frame_bb.Max.x = span_all_columns ? window->ParentWorkRect.Max.x : (flags & ImGuiTreeNodeFlags_SpanTextWidth) ? window->DC.CursorPos.x + text_width + padding.x : window->WorkRect.Max.x; frame_bb.Max.y = window->DC.CursorPos.y + frame_height; if (display_frame) { // Framed header expand a little outside the default padding, to the edge of InnerClipRect // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) - frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); - frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); + frame_bb.Min.x -= IM_TRUNC(window->WindowPadding.x * 0.5f - 1.0f); + frame_bb.Max.x += IM_TRUNC(window->WindowPadding.x * 0.5f); } - const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing - const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it - const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); ItemSize(ImVec2(text_width, frame_height), padding.y); // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing ImRect interact_bb = frame_bb; - if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) - interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; + if ((flags & (ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_SpanTextWidth | ImGuiTreeNodeFlags_SpanAllColumns)) == 0) + interact_bb.Max.x = frame_bb.Min.x + text_width + (label_size.x > 0.0f ? style.ItemSpacing.x * 2.0f : 0.0f); - // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. - // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). - // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. - const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable.. + const float backup_clip_rect_min_x = window->ClipRect.Min.x; + const float backup_clip_rect_max_x = window->ClipRect.Max.x; + if (span_all_columns) + { + window->ClipRect.Min.x = window->ParentWorkRect.Min.x; + window->ClipRect.Max.x = window->ParentWorkRect.Max.x; + } + + // Compute open and multi-select states before ItemAdd() as it clear NextItem data. bool is_open = TreeNodeUpdateNextOpen(id, flags); - if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); - bool item_add = ItemAdd(interact_bb, id); g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; g.LastItemData.DisplayRect = frame_bb; + if (span_all_columns) + { + window->ClipRect.Min.x = backup_clip_rect_min_x; + window->ClipRect.Max.x = backup_clip_rect_max_x; + } + + // If a NavLeft request is happening and ImGuiTreeNodeFlags_NavLeftJumpsBackHere enabled: + // Store data for the current depth to allow returning to this node from any child item. + // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). + // It will become tempting to enable ImGuiTreeNodeFlags_NavLeftJumpsBackHere by default or move it to ImGuiStyle. + // Currently only supports 32 level deep and we are fine with (1 << Depth) overflowing into a zero, easy to increase. + if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + { + g.NavTreeNodeStack.resize(g.NavTreeNodeStack.Size + 1); + ImGuiNavTreeNodeData* nav_tree_node_data = &g.NavTreeNodeStack.back(); + nav_tree_node_data->ID = id; + nav_tree_node_data->InFlags = g.LastItemData.InFlags; + nav_tree_node_data->NavRect = g.LastItemData.NavRect; + window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); + } + + const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; if (!item_add) { if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) @@ -6165,9 +6281,16 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l return is_open; } + if (span_all_columns) + { + TablePushBackgroundChannel(); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect; + g.LastItemData.ClipRect = window->ClipRect; + } + ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - button_flags |= ImGuiButtonFlags_AllowItemOverlap; + if ((flags & ImGuiTreeNodeFlags_AllowOverlap) || (g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap)) + button_flags |= ImGuiButtonFlags_AllowOverlap; if (!is_leaf) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; @@ -6240,8 +6363,6 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen; } } - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - SetItemAllowOverlap(); // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. if (selected != was_selected) //-V547 @@ -6249,7 +6370,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l // Render const ImU32 text_col = GetColorU32(ImGuiCol_Text); - ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; + ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_Compact; if (display_frame) { // Framed type @@ -6259,15 +6380,14 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l if (flags & ImGuiTreeNodeFlags_Bullet) RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 1.0f); else // Leaf without bullet, left-adjusted text - text_pos.x -= text_offset_x; + text_pos.x -= text_offset_x -padding.x; if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) frame_bb.Max.x -= g.FontSize + style.FramePadding.x; if (g.LogEnabled) LogSetNextTextDecoration("###", "###"); - RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); } else { @@ -6281,12 +6401,20 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l if (flags & ImGuiTreeNodeFlags_Bullet) RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 0.70f); if (g.LogEnabled) LogSetNextTextDecoration(">", NULL); - RenderText(text_pos, label, label_end, false); } + if (span_all_columns) + TablePopBackgroundChannel(); + + // Label + if (display_frame) + RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); + else + RenderText(text_pos, label, label_end, false); + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) TreePushOverrideID(id); IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); @@ -6328,12 +6456,14 @@ void ImGui::TreePop() ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) - if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) - if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) - { - SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); - NavMoveRequestCancel(); - } + if (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask) // Only set during request + { + ImGuiNavTreeNodeData* nav_tree_node_data = &g.NavTreeNodeStack.back(); + IM_ASSERT(nav_tree_node_data->ID == window->IDStack.back()); + if (g.NavIdIsAlive && g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + NavMoveRequestResolveWithPastTreeNode(&g.NavMoveResultLocal, nav_tree_node_data); + g.NavTreeNodeStack.pop_back(); + } window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. @@ -6385,7 +6515,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl ImGuiID id = window->GetID(label); flags |= ImGuiTreeNodeFlags_CollapsingHeader; if (p_visible) - flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; + flags |= ImGuiTreeNodeFlags_AllowOverlap | (ImGuiTreeNodeFlags)ImGuiTreeNodeFlags_ClipLabelForTrailingButton; bool is_open = TreeNodeBehavior(id, flags, label); if (p_visible != NULL) { @@ -6395,8 +6525,8 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl ImGuiContext& g = *GImGui; ImGuiLastItemData last_item_backup = g.LastItemData; float button_size = g.FontSize; - float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); - float button_y = g.LastItemData.Rect.Min.y; + float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x - button_size); + float button_y = g.LastItemData.Rect.Min.y + g.Style.FramePadding.y; ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); if (CloseButton(close_button_id, ImVec2(button_x, button_y))) *p_visible = false; @@ -6414,7 +6544,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl // Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. // But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. -// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. +// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowOverlap are also frequently used flags. // FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) { @@ -6451,8 +6581,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl { const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; const float spacing_y = style.ItemSpacing.y; - const float spacing_L = IM_FLOOR(spacing_x * 0.50f); - const float spacing_U = IM_FLOOR(spacing_y * 0.50f); + const float spacing_L = IM_TRUNC(spacing_x * 0.50f); + const float spacing_U = IM_TRUNC(spacing_y * 0.50f); bb.Min.x -= spacing_L; bb.Min.y -= spacing_U; bb.Max.x += (spacing_x - spacing_L); @@ -6460,7 +6590,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl } //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } - // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable.. const float backup_clip_rect_min_x = window->ClipRect.Min.x; const float backup_clip_rect_max_x = window->ClipRect.Max.x; if (span_all_columns) @@ -6486,10 +6616,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, // which would be advantageous since most selectable are not selected. - if (span_all_columns && window->DC.CurrentColumns) - PushColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePushBackgroundChannel(); + if (span_all_columns) + { + if (g.CurrentTable) + TablePushBackgroundChannel(); + else if (window->DC.CurrentColumns) + PushColumnsBackground(); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect; + g.LastItemData.ClipRect = window->ClipRect; + } // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries ImGuiButtonFlags button_flags = 0; @@ -6498,7 +6633,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } - if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } + if ((flags & ImGuiSelectableFlags_AllowOverlap) || (g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap)) { button_flags |= ImGuiButtonFlags_AllowOverlap; } const bool was_selected = selected; bool hovered, held; @@ -6527,9 +6662,6 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl if (pressed) MarkItemEdited(id); - if (flags & ImGuiSelectableFlags_AllowItemOverlap) - SetItemAllowOverlap(); - // In this branch, Selectable() cannot toggle the selection so this will never trigger. if (selected != was_selected) //-V547 g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; @@ -6540,12 +6672,16 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); RenderFrame(bb.Min, bb.Max, col, false, 0.0f); } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + if (g.NavId == id) + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding); - if (span_all_columns && window->DC.CurrentColumns) - PopColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePopBackgroundChannel(); + if (span_all_columns) + { + if (g.CurrentTable) + TablePopBackgroundChannel(); + else if (window->DC.CurrentColumns) + PopColumnsBackground(); + } RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); @@ -6570,6 +6706,212 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags return false; } + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Typing-Select support +//------------------------------------------------------------------------- + +// [Experimental] Currently not exposed in public API. +// Consume character inputs and return search request, if any. +// This would typically only be called on the focused window or location you want to grab inputs for, e.g. +// if (ImGui::IsWindowFocused(...)) +// if (ImGuiTypingSelectRequest* req = ImGui::GetTypingSelectRequest()) +// focus_idx = ImGui::TypingSelectFindMatch(req, my_items.size(), [](void*, int n) { return my_items[n]->Name; }, &my_items, -1); +// However the code is written in a way where calling it from multiple locations is safe (e.g. to obtain buffer). +ImGuiTypingSelectRequest* ImGui::GetTypingSelectRequest(ImGuiTypingSelectFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiTypingSelectState* data = &g.TypingSelectState; + ImGuiTypingSelectRequest* out_request = &data->Request; + + // Clear buffer + const float TYPING_SELECT_RESET_TIMER = 1.80f; // FIXME: Potentially move to IO config. + const int TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK = 4; // Lock single char matching when repeating same char 4 times + if (data->SearchBuffer[0] != 0) + { + bool clear_buffer = false; + clear_buffer |= (g.NavFocusScopeId != data->FocusScope); + clear_buffer |= (data->LastRequestTime + TYPING_SELECT_RESET_TIMER < g.Time); + clear_buffer |= g.NavAnyRequest; + clear_buffer |= g.ActiveId != 0 && g.NavActivateId == 0; // Allow temporary SPACE activation to not interfere + clear_buffer |= IsKeyPressed(ImGuiKey_Escape) || IsKeyPressed(ImGuiKey_Enter); + clear_buffer |= IsKeyPressed(ImGuiKey_Backspace) && (flags & ImGuiTypingSelectFlags_AllowBackspace) == 0; + //if (clear_buffer) { IMGUI_DEBUG_LOG("GetTypingSelectRequest(): Clear SearchBuffer.\n"); } + if (clear_buffer) + data->Clear(); + } + + // Append to buffer + const int buffer_max_len = IM_ARRAYSIZE(data->SearchBuffer) - 1; + int buffer_len = (int)strlen(data->SearchBuffer); + bool select_request = false; + for (ImWchar w : g.IO.InputQueueCharacters) + { + const int w_len = ImTextCountUtf8BytesFromStr(&w, &w + 1); + if (w < 32 || (buffer_len == 0 && ImCharIsBlankW(w)) || (buffer_len + w_len > buffer_max_len)) // Ignore leading blanks + continue; + char w_buf[5]; + ImTextCharToUtf8(w_buf, (unsigned int)w); + if (data->SingleCharModeLock && w_len == out_request->SingleCharSize && memcmp(w_buf, data->SearchBuffer, w_len) == 0) + { + select_request = true; // Same character: don't need to append to buffer. + continue; + } + if (data->SingleCharModeLock) + { + data->Clear(); // Different character: clear + buffer_len = 0; + } + memcpy(data->SearchBuffer + buffer_len, w_buf, w_len + 1); // Append + buffer_len += w_len; + select_request = true; + } + g.IO.InputQueueCharacters.resize(0); + + // Handle backspace + if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, ImGuiInputFlags_Repeat)) + { + char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len); + *p = 0; + buffer_len = (int)(p - data->SearchBuffer); + } + + // Return request if any + if (buffer_len == 0) + return NULL; + if (select_request) + { + data->FocusScope = g.NavFocusScopeId; + data->LastRequestFrame = g.FrameCount; + data->LastRequestTime = (float)g.Time; + } + out_request->Flags = flags; + out_request->SearchBufferLen = buffer_len; + out_request->SearchBuffer = data->SearchBuffer; + out_request->SelectRequest = (data->LastRequestFrame == g.FrameCount); + out_request->SingleCharMode = false; + out_request->SingleCharSize = 0; + + // Calculate if buffer contains the same character repeated. + // - This can be used to implement a special search mode on first character. + // - Performed on UTF-8 codepoint for correctness. + // - SingleCharMode is always set for first input character, because it usually leads to a "next". + if (flags & ImGuiTypingSelectFlags_AllowSingleCharMode) + { + const char* buf_begin = out_request->SearchBuffer; + const char* buf_end = out_request->SearchBuffer + out_request->SearchBufferLen; + const int c0_len = ImTextCountUtf8BytesFromChar(buf_begin, buf_end); + const char* p = buf_begin + c0_len; + for (; p < buf_end; p += c0_len) + if (memcmp(buf_begin, p, (size_t)c0_len) != 0) + break; + const int single_char_count = (p == buf_end) ? (out_request->SearchBufferLen / c0_len) : 0; + out_request->SingleCharMode = (single_char_count > 0 || data->SingleCharModeLock); + out_request->SingleCharSize = (ImS8)c0_len; + data->SingleCharModeLock |= (single_char_count >= TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK); // From now on we stop search matching to lock to single char mode. + } + + return out_request; +} + +static int ImStrimatchlen(const char* s1, const char* s1_end, const char* s2) +{ + int match_len = 0; + while (s1 < s1_end && ImToUpper(*s1++) == ImToUpper(*s2++)) + match_len++; + return match_len; +} + +// Default handler for finding a result for typing-select. You may implement your own. +// You might want to display a tooltip to visualize the current request SearchBuffer +// When SingleCharMode is set: +// - it is better to NOT display a tooltip of other on-screen display indicator. +// - the index of the currently focused item is required. +// if your SetNextItemSelectionData() values are indices, you can obtain it from ImGuiMultiSelectIO::NavIdItem, otherwise from g.NavLastValidSelectionUserData. +int ImGui::TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx) +{ + if (req == NULL || req->SelectRequest == false) // Support NULL parameter so both calls can be done from same spot. + return -1; + int idx = -1; + if (req->SingleCharMode && (req->Flags & ImGuiTypingSelectFlags_AllowSingleCharMode)) + idx = TypingSelectFindNextSingleCharMatch(req, items_count, get_item_name_func, user_data, nav_item_idx); + else + idx = TypingSelectFindBestLeadingMatch(req, items_count, get_item_name_func, user_data); + if (idx != -1) + NavRestoreHighlightAfterMove(); + return idx; +} + +// Special handling when a single character is repeated: perform search on a single letter and goes to next. +int ImGui::TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx) +{ + // FIXME: Assume selection user data is index. Would be extremely practical. + //if (nav_item_idx == -1) + // nav_item_idx = (int)g.NavLastValidSelectionUserData; + + int first_match_idx = -1; + bool return_next_match = false; + for (int idx = 0; idx < items_count; idx++) + { + const char* item_name = get_item_name_func(user_data, idx); + if (ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SingleCharSize, item_name) < req->SingleCharSize) + continue; + if (return_next_match) // Return next matching item after current item. + return idx; + if (first_match_idx == -1 && nav_item_idx == -1) // Return first match immediately if we don't have a nav_item_idx value. + return idx; + if (first_match_idx == -1) // Record first match for wrapping. + first_match_idx = idx; + if (nav_item_idx == idx) // Record that we encountering nav_item so we can return next match. + return_next_match = true; + } + return first_match_idx; // First result +} + +int ImGui::TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data) +{ + int longest_match_idx = -1; + int longest_match_len = 0; + for (int idx = 0; idx < items_count; idx++) + { + const char* item_name = get_item_name_func(user_data, idx); + const int match_len = ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SearchBufferLen, item_name); + if (match_len <= longest_match_len) + continue; + longest_match_idx = idx; + longest_match_len = match_len; + if (match_len == req->SearchBufferLen) + break; + } + return longest_match_idx; +} + +void ImGui::DebugNodeTypingSelectState(ImGuiTypingSelectState* data) +{ +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + Text("SearchBuffer = \"%s\"", data->SearchBuffer); + Text("SingleCharMode = %d, Size = %d, Lock = %d", data->Request.SingleCharMode, data->Request.SingleCharSize, data->SingleCharModeLock); + Text("LastRequest = time: %.2f, frame: %d", data->LastRequestTime, data->LastRequestFrame); +#else + IM_UNUSED(data); +#endif +} + + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Multi-Select support +//------------------------------------------------------------------------- + +void ImGui::SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data) +{ + // Note that flags will be cleared by ItemAdd(), so it's only useful for Navigation code! + // This designed so widgets can also cheaply set this before calling ItemAdd(), so we are not tied to MultiSelect api. + ImGuiContext& g = *GImGui; + g.NextItemData.ItemFlags |= ImGuiItemFlags_HasSelectionUserData; + g.NextItemData.SelectionUserData = selection_user_data; +} + + //------------------------------------------------------------------------- // [SECTION] Widgets: ListBox //------------------------------------------------------------------------- @@ -6578,6 +6920,7 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags // - ListBox() //------------------------------------------------------------------------- +// This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label. // Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" // Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) @@ -6593,7 +6936,7 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) // Size default to hold ~7.25 items. // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); + ImVec2 size = ImTrunc(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); @@ -6603,19 +6946,21 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) { ItemSize(bb.GetSize(), style.FramePadding.y); ItemAdd(bb, 0, &frame_bb); + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values return false; } - // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. + // FIXME-OPT: We could omit the BeginGroup() if label_size.x == 0.0f but would need to omit the EndGroup() as well. BeginGroup(); if (label_size.x > 0.0f) { ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); RenderText(label_pos, label); window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + AlignTextToFramePadding(); } - BeginChildFrame(id, frame_bb.GetSize()); + BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle); return true; } @@ -6626,7 +6971,7 @@ void ImGui::EndListBox() IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); IM_UNUSED(window); - EndChildFrame(); + EndChild(); EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label } @@ -6638,7 +6983,7 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* const item // This is merely a helper around BeginListBox(), EndListBox(). // Considering using those directly to submit custom data or store selection differently. -bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) +bool ImGui::ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items) { ImGuiContext& g = *GImGui; @@ -6646,7 +6991,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v if (height_in_items < 0) height_in_items = ImMin(items_count, 7); float height_in_items_f = height_in_items + 0.25f; - ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); + ImVec2 size(0.0f, ImTrunc(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); if (!BeginListBox(label, size)) return false; @@ -6659,8 +7004,8 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v while (clipper.Step()) for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - const char* item_text; - if (!items_getter(data, i, &item_text)) + const char* item_text = getter(user_data, i); + if (item_text == NULL) item_text = "*Unknown item*"; PushID(i); @@ -6714,7 +7059,7 @@ int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_get ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, 0, &frame_bb)) return -1; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); // Determine scale from values if not specified if (scale_min == FLT_MAX || scale_max == FLT_MAX) @@ -7007,12 +7352,18 @@ void ImGui::EndMenuBar() PopClipRect(); PopID(); window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. - g.GroupStack.back().EmitItem = false; - EndGroup(); // Restore position on layer 0 + + // FIXME: Extremely confusing, cleanup by (a) working on WorkRect stack system (b) not using a Group confusingly here. + ImGuiGroupData& group_data = g.GroupStack.back(); + group_data.EmitItem = false; + ImVec2 restore_cursor_max_pos = group_data.BackupCursorMaxPos; + window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, window->DC.CursorMaxPos.x - window->Scroll.x); // Convert ideal extents for scrolling layer equivalent. + EndGroup(); // Restore position on layer 0 // FIXME: Misleading to use a group for that backup/restore window->DC.LayoutType = ImGuiLayoutType_Vertical; window->DC.IsSameLine = false; window->DC.NavLayerCurrent = ImGuiNavLayer_Main; window->DC.MenuBarAppending = false; + window->DC.CursorMaxPos = restore_cursor_max_pos; } // Important: calling order matters! @@ -7168,15 +7519,15 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // Menu inside an horizontal menu bar // Selectable extend their highlight by half ItemSpacing in each direction. // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() - popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + popup_pos = ImVec2(pos.x - 1.0f - IM_TRUNC(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); float w = label_size.x; ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, label_size.y)); RenderText(text_pos, label); PopStyleVar(); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { @@ -7185,7 +7536,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float checkmark_w = IM_TRUNC(g.FontSize * 1.20f); float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); @@ -7203,6 +7554,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) PopItemFlag(); bool want_open = false; + bool want_open_nav_init = false; bool want_close = false; if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) { @@ -7213,18 +7565,18 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL; if (g.HoveredWindow == window && child_menu_window != NULL) { - float ref_unit = g.FontSize; // FIXME-DPI - float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f; - ImRect next_window_rect = child_menu_window->Rect(); + const float ref_unit = g.FontSize; // FIXME-DPI + const float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f; + const ImRect next_window_rect = child_menu_window->Rect(); ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta); ImVec2 tb = (child_dir > 0.0f) ? next_window_rect.GetTL() : next_window_rect.GetTR(); ImVec2 tc = (child_dir > 0.0f) ? next_window_rect.GetBL() : next_window_rect.GetBR(); - float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack. + const float pad_farmost_h = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // Add a bit of extra slack. ta.x += child_dir * -0.5f; tb.x += child_dir * ref_unit; tc.x += child_dir * ref_unit; - tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus - tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); + tb.y = ta.y + ImMax((tb.y - pad_farmost_h) - ta.y, -ref_unit * 8.0f); // Triangle has maximum height to limit the slope and the bias toward large sub-menus + tc.y = ta.y + ImMin((tc.y + pad_farmost_h) - ta.y, +ref_unit * 8.0f); moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] } @@ -7232,18 +7584,22 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) - if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover) + if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover && g.ActiveId == 0) want_close = true; // Open + // (note: at this point 'hovered' actually includes the NavDisableMouseHover == false test) if (!menu_is_open && pressed) // Click/activate to open want_open = true; else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open want_open = true; + else if (!menu_is_open && hovered && g.HoveredIdTimer >= 0.30f && g.MouseStationaryTimer >= 0.30f) // Hover to open (timer fallback) + want_open = true; if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open { - want_open = true; + want_open = want_open_nav_init = true; NavMoveRequestCancel(); + NavRestoreHighlightAfterMove(); } } else @@ -7275,13 +7631,13 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size) { - // Don't reopen/recycle same menu level in the same frame, first close the other menu and yield for a frame. + // Don't reopen/recycle same menu level in the same frame if it is a different menu ID, first close the other menu and yield for a frame. OpenPopup(label); } else if (want_open) { menu_is_open = true; - OpenPopup(label); + OpenPopup(label, ImGuiPopupFlags_NoReopen);// | (want_open_nav_init ? ImGuiPopupFlags_NoReopenAlwaysNavInit : 0)); } if (menu_is_open) @@ -7293,6 +7649,14 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) PopStyleVar(); if (menu_is_open) { + // Implement what ImGuiPopupFlags_NoReopenAlwaysNavInit would do: + // Perform an init request in the case the popup was already open (via a previous mouse hover) + if (want_open && want_open_nav_init && !g.NavInitRequest) + { + FocusWindow(g.CurrentWindow, ImGuiFocusRequestFlags_UnlessBelowModal); + NavInitWindow(g.CurrentWindow, false); + } + // Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu() // (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck) g.LastItemData = last_item_in_parent; @@ -7362,14 +7726,14 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful // Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark. float w = label_size.x; - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f); ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f)); PopStyleVar(); if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) RenderText(text_pos, label); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { @@ -7378,7 +7742,7 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float checkmark_w = IM_TRUNC(g.FontSize * 1.20f); float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y)); @@ -7523,6 +7887,8 @@ bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); tab_bar->ID = id; + tab_bar->SeparatorMinX = tab_bar->BarRect.Min.x - IM_TRUNC(window->WindowPadding.x * 0.5f); + tab_bar->SeparatorMaxX = tab_bar->BarRect.Max.x + IM_TRUNC(window->WindowPadding.x * 0.5f); return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); } @@ -7533,6 +7899,7 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG if (window->SkipItems) return false; + IM_ASSERT(tab_bar->ID != 0); if ((flags & ImGuiTabBarFlags_DockNode) == 0) PushOverrideID(tab_bar->ID); @@ -7575,12 +7942,12 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); // Draw separator + // (it would be misleading to draw this in EndTabBar() suggesting that it may be drawn over tabs, as tab bar are appendable) const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); - const float y = tab_bar->BarRect.Max.y - 1.0f; + if (g.Style.TabBarBorderSize > 0.0f) { - const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); - const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); - window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); + const float y = tab_bar->BarRect.Max.y; + window->DrawList->AddRectFilled(ImVec2(tab_bar->SeparatorMinX, y - g.Style.TabBarBorderSize), ImVec2(tab_bar->SeparatorMaxX, y), col); } return true; } @@ -7787,7 +8154,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) { ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; - float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); + float shrinked_width = IM_TRUNC(g.ShrinkWidthBuffer[tab_n].Width); if (shrinked_width < 0.0f) continue; @@ -7947,7 +8314,7 @@ void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) if (tab->Flags & ImGuiTabItemFlags_Button) return; // A button appended with TabItemButton(). - if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + if ((tab->Flags & (ImGuiTabItemFlags_UnsavedDocument | ImGuiTabItemFlags_NoAssumedClosure)) == 0) { // This will remove a frame of lag for selecting another tab on closure. // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure @@ -8374,7 +8741,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; size.x = tab->Width; if (is_central_section) - window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_TRUNC(tab->Offset - tab_bar->ScrollingAnim), 0.0f); else window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); ImVec2 pos = window->DC.CursorPos; @@ -8398,7 +8765,8 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, } // Click to Select a tab - ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); + // Allow the close button to overlap + ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowOverlap); if (g.DragDropActive) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; bool hovered, held; @@ -8406,10 +8774,6 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (pressed && !is_tab_button) TabBarQueueFocus(tab_bar, tab); - // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) - if (g.ActiveId != id) - SetItemAllowOverlap(); - // Drag and drop: re-order tabs if (held && !tab_appearing && IsMouseDragging(0)) { @@ -8431,7 +8795,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) { // Enlarge tab display when hovering - bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); + bb.Max.x = bb.Min.x + IM_TRUNC(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); display_draw_list = GetForegroundDrawList(window); TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); } @@ -8474,8 +8838,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, // FIXME: We may want disabled tab to still display the tooltip? if (text_clipped && g.HoveredId == id && !held) if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) - if (IsItemHovered(ImGuiHoveredFlags_DelayNormal)) - SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); + SetItemTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected if (is_tab_button) @@ -8526,7 +8889,7 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI IM_ASSERT(width > 0.0f); const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); const float y1 = bb.Min.y + 1.0f; - const float y2 = bb.Max.y - 1.0f; + const float y2 = bb.Max.y - g.Style.TabBarBorderSize; draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9); draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12); @@ -8577,7 +8940,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, } const float button_sz = g.FontSize; - const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y); + const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x - button_sz), bb.Min.y + frame_padding.y); // Close Button & Unsaved Marker // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() @@ -8595,10 +8958,8 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, if (close_button_visible) { ImGuiLastItemData last_item_backup = g.LastItemData; - PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); if (CloseButton(close_button_id, button_pos)) close_button_pressed = true; - PopStyleVar(); g.LastItemData = last_item_backup; // Close with middle mouse button @@ -8607,7 +8968,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, } else if (unsaved_marker_visible) { - const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f); + const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz)); RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text)); } diff --git a/extern/src/imgui/imstb_textedit.h b/extern/src/imgui/imstb_textedit.h index a8a82311..783054ab 100644 --- a/extern/src/imgui/imstb_textedit.h +++ b/extern/src/imgui/imstb_textedit.h @@ -2,8 +2,9 @@ // This is a slightly modified version of stb_textedit.h 1.14. // Those changes would need to be pushed into nothings/stb: // - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) -// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000) +// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000 + #6783) // Grep for [DEAR IMGUI] to find the changes. +// - Also renamed macros used or defined outside of IMSTB_TEXTEDIT_IMPLEMENTATION block from STB_TEXTEDIT_* to IMSTB_TEXTEDIT_* // stb_textedit.h - v1.14 - public domain - Sean Barrett // Development of this library was sponsored by RAD Game Tools @@ -30,7 +31,7 @@ // DEPENDENCIES // // Uses the C runtime function 'memmove', which you can override -// by defining STB_TEXTEDIT_memmove before the implementation. +// by defining IMSTB_TEXTEDIT_memmove before the implementation. // Uses no other functions. Performs no runtime allocations. // // @@ -40,7 +41,7 @@ // 1.13 (2019-02-07) fix bug in undo size management // 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash // 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield -// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual +// 1.10 (2016-10-25) suppress warnings about casting away const with -Wcast-qual // 1.9 (2016-08-27) customizable move-by-word // 1.8 (2016-04-02) better keyboard handling when mouse button is down // 1.7 (2015-09-13) change y range handling in case baseline is non-0 @@ -274,8 +275,8 @@ //// //// -#ifndef INCLUDE_STB_TEXTEDIT_H -#define INCLUDE_STB_TEXTEDIT_H +#ifndef INCLUDE_IMSTB_TEXTEDIT_H +#define INCLUDE_IMSTB_TEXTEDIT_H //////////////////////////////////////////////////////////////////////// // @@ -286,33 +287,33 @@ // and undo state. // -#ifndef STB_TEXTEDIT_UNDOSTATECOUNT -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#ifndef IMSTB_TEXTEDIT_UNDOSTATECOUNT +#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99 #endif -#ifndef STB_TEXTEDIT_UNDOCHARCOUNT -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#ifndef IMSTB_TEXTEDIT_UNDOCHARCOUNT +#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999 #endif -#ifndef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_CHARTYPE int +#ifndef IMSTB_TEXTEDIT_CHARTYPE +#define IMSTB_TEXTEDIT_CHARTYPE int #endif -#ifndef STB_TEXTEDIT_POSITIONTYPE -#define STB_TEXTEDIT_POSITIONTYPE int +#ifndef IMSTB_TEXTEDIT_POSITIONTYPE +#define IMSTB_TEXTEDIT_POSITIONTYPE int #endif typedef struct { // private data - STB_TEXTEDIT_POSITIONTYPE where; - STB_TEXTEDIT_POSITIONTYPE insert_length; - STB_TEXTEDIT_POSITIONTYPE delete_length; + IMSTB_TEXTEDIT_POSITIONTYPE where; + IMSTB_TEXTEDIT_POSITIONTYPE insert_length; + IMSTB_TEXTEDIT_POSITIONTYPE delete_length; int char_storage; } StbUndoRecord; typedef struct { // private data - StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; - STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; + StbUndoRecord undo_rec [IMSTB_TEXTEDIT_UNDOSTATECOUNT]; + IMSTB_TEXTEDIT_CHARTYPE undo_char[IMSTB_TEXTEDIT_UNDOCHARCOUNT]; short undo_point, redo_point; int undo_char_point, redo_char_point; } StbUndoState; @@ -371,7 +372,7 @@ typedef struct float ymin,ymax; // height of row above and below baseline int num_chars; } StbTexteditRow; -#endif //INCLUDE_STB_TEXTEDIT_H +#endif //INCLUDE_IMSTB_TEXTEDIT_H //////////////////////////////////////////////////////////////////////////// @@ -384,11 +385,11 @@ typedef struct // implementation isn't include-guarded, since it might have indirectly // included just the "header" portion -#ifdef STB_TEXTEDIT_IMPLEMENTATION +#ifdef IMSTB_TEXTEDIT_IMPLEMENTATION -#ifndef STB_TEXTEDIT_memmove +#ifndef IMSTB_TEXTEDIT_memmove #include -#define STB_TEXTEDIT_memmove memmove +#define IMSTB_TEXTEDIT_memmove memmove #endif @@ -398,7 +399,7 @@ typedef struct // // traverse the layout to locate the nearest character to a display position -static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) +static int stb_text_locate_coord(IMSTB_TEXTEDIT_STRING *str, float x, float y) { StbTexteditRow r; int n = STB_TEXTEDIT_STRINGLEN(str); @@ -458,7 +459,7 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) } // API click: on mouse down, move the cursor to the clicked location, and reset the selection -static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +static void stb_textedit_click(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) { // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse // goes off the top or bottom of the text @@ -476,7 +477,7 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat } // API drag: on mouse drag, move the cursor and selection endpoint to the clicked location -static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +static void stb_textedit_drag(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) { int p = 0; @@ -502,11 +503,11 @@ static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state // // forward declarations -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); +static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); +static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); typedef struct { @@ -518,7 +519,7 @@ typedef struct // find the x/y location of a character, and remember info about the previous row in // case we get a move-up event (for page up, we'll have to rescan) -static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) +static void stb_textedit_find_charpos(StbFindState *find, IMSTB_TEXTEDIT_STRING *str, int n, int single_line) { StbTexteditRow r; int prev_start = 0; @@ -549,7 +550,10 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s i += r.num_chars; find->y += r.baseline_y_delta; if (i == z) // [DEAR IMGUI] + { + r.num_chars = 0; // [DEAR IMGUI] break; // [DEAR IMGUI] + } } find->first_char = first = i; @@ -566,7 +570,7 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s #define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) // make the selection/cursor state valid if client altered the string -static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_clamp(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { int n = STB_TEXTEDIT_STRINGLEN(str); if (STB_TEXT_HAS_SELECTION(state)) { @@ -580,7 +584,7 @@ static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat } // delete characters while updating undo -static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) +static void stb_textedit_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) { stb_text_makeundo_delete(str, state, where, len); STB_TEXTEDIT_DELETECHARS(str, where, len); @@ -588,7 +592,7 @@ static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *sta } // delete the section -static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_delete_selection(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { stb_textedit_clamp(str, state); if (STB_TEXT_HAS_SELECTION(state)) { @@ -625,7 +629,7 @@ static void stb_textedit_move_to_first(STB_TexteditState *state) } // move cursor to last character of selection -static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_move_to_last(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { if (STB_TEXT_HAS_SELECTION(state)) { stb_textedit_sortselection(state); @@ -637,13 +641,13 @@ static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditStat } #ifdef STB_TEXTEDIT_IS_SPACE -static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) +static int is_word_boundary( IMSTB_TEXTEDIT_STRING *str, int idx ) { return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; } #ifndef STB_TEXTEDIT_MOVEWORDLEFT -static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) +static int stb_textedit_move_to_word_previous( IMSTB_TEXTEDIT_STRING *str, int c ) { --c; // always move at least one character while( c >= 0 && !is_word_boundary( str, c ) ) @@ -658,7 +662,7 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) #endif #ifndef STB_TEXTEDIT_MOVEWORDRIGHT -static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) +static int stb_textedit_move_to_word_next( IMSTB_TEXTEDIT_STRING *str, int c ) { const int len = STB_TEXTEDIT_STRINGLEN(str); ++c; // always move at least one character @@ -685,7 +689,7 @@ static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) } // API cut: delete selection -static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static int stb_textedit_cut(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { if (STB_TEXT_HAS_SELECTION(state)) { stb_textedit_delete_selection(str,state); // implicitly clamps @@ -696,7 +700,7 @@ static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) } // API paste: replace existing selection with passed-in text -static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +static int stb_textedit_paste_internal(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE *text, int len) { // if there's a selection, the paste should delete it stb_textedit_clamp(str, state); @@ -717,14 +721,14 @@ static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditSta #endif // API key: process a keyboard input -static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) +static void stb_textedit_key(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) { retry: switch (key) { default: { int c = STB_TEXTEDIT_KEYTOTEXT(key); if (c > 0) { - STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; + IMSTB_TEXTEDIT_CHARTYPE ch = (IMSTB_TEXTEDIT_CHARTYPE) c; // can't add newline in single-line mode if (c == '\n' && state->single_line) @@ -889,8 +893,8 @@ retry: x = row.x0; for (i=0; i < row.num_chars; ++i) { float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE) break; #endif x += dx; @@ -951,8 +955,8 @@ retry: x = row.x0; for (i=0; i < row.num_chars; ++i) { float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE) break; #endif x += dx; @@ -1109,8 +1113,8 @@ retry: static void stb_textedit_flush_redo(StbUndoState *state) { - state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT; + state->redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT; } // discard the oldest entry in the undo list @@ -1122,13 +1126,13 @@ static void stb_textedit_discard_undo(StbUndoState *state) int n = state->undo_rec[0].insert_length, i; // delete n characters from all other records state->undo_char_point -= n; - STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); + IMSTB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(IMSTB_TEXTEDIT_CHARTYPE))); for (i=0; i < state->undo_point; ++i) if (state->undo_rec[i].char_storage >= 0) state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it } --state->undo_point; - STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); + IMSTB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); } } @@ -1138,7 +1142,7 @@ static void stb_textedit_discard_undo(StbUndoState *state) // fill up even though the undo buffer didn't static void stb_textedit_discard_redo(StbUndoState *state) { - int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; + int k = IMSTB_TEXTEDIT_UNDOSTATECOUNT-1; if (state->redo_point <= k) { // if the k'th undo state has characters, clean those up @@ -1146,7 +1150,7 @@ static void stb_textedit_discard_redo(StbUndoState *state) int n = state->undo_rec[k].insert_length, i; // move the remaining redo character data to the end of the buffer state->redo_char_point += n; - STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); + IMSTB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((IMSTB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(IMSTB_TEXTEDIT_CHARTYPE))); // adjust the position of all the other records to account for above memmove for (i=state->redo_point; i < k; ++i) if (state->undo_rec[i].char_storage >= 0) @@ -1154,12 +1158,12 @@ static void stb_textedit_discard_redo(StbUndoState *state) } // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' // [DEAR IMGUI] - size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); + size_t move_size = (size_t)((IMSTB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin); IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end); - STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); + IMSTB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); // now move redo_point to point to the new one ++state->redo_point; @@ -1173,32 +1177,32 @@ static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numch // if we have no free records, we have to make room, by sliding the // existing records down - if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (state->undo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) stb_textedit_discard_undo(state); // if the characters to store won't possibly fit in the buffer, we can't undo - if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { + if (numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT) { state->undo_point = 0; state->undo_char_point = 0; return NULL; } // if we don't have enough free characters in the buffer, we have to make room - while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) + while (state->undo_char_point + numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT) stb_textedit_discard_undo(state); return &state->undo_rec[state->undo_point++]; } -static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) +static IMSTB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) { StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); if (r == NULL) return NULL; r->where = pos; - r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len; - r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len; + r->insert_length = (IMSTB_TEXTEDIT_POSITIONTYPE) insert_len; + r->delete_length = (IMSTB_TEXTEDIT_POSITIONTYPE) delete_len; if (insert_len == 0) { r->char_storage = -1; @@ -1210,7 +1214,7 @@ static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, } } -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { StbUndoState *s = &state->undostate; StbUndoRecord u, *r; @@ -1237,7 +1241,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) // characters stored for *undoing* don't leave room for redo // if the last is true, we have to bail - if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { + if (s->undo_char_point + u.delete_length >= IMSTB_TEXTEDIT_UNDOCHARCOUNT) { // the undo records take up too much character space; there's no space to store the redo characters r->insert_length = 0; } else { @@ -1246,7 +1250,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) // there's definitely room to store the characters eventually while (s->undo_char_point + u.delete_length > s->redo_char_point) { // should never happen: - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) return; // there's currently not enough room, so discard a redo record stb_textedit_discard_redo(s); @@ -1278,11 +1282,11 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) s->redo_point--; } -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { StbUndoState *s = &state->undostate; StbUndoRecord *u, r; - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) return; // we need to do two things: apply the redo record, and create an undo record @@ -1334,20 +1338,20 @@ static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int le stb_text_createundo(&state->undostate, where, 0, length); } -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) +static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) { int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); + IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); if (p) { for (i=0; i < length; ++i) p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); } } -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) +static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) { int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); + IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); if (p) { for (i=0; i < old_length; ++i) p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); @@ -1359,8 +1363,8 @@ static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_lin { state->undostate.undo_point = 0; state->undostate.undo_char_point = 0; - state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->undostate.redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT; + state->undostate.redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT; state->select_end = state->select_start = 0; state->cursor = 0; state->has_preferred_x = 0; @@ -1383,16 +1387,16 @@ static void stb_textedit_initialize_state(STB_TexteditState *state, int is_singl #pragma GCC diagnostic ignored "-Wcast-qual" #endif -static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) +static int stb_textedit_paste(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE const *ctext, int len) { - return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len); + return stb_textedit_paste_internal(str, state, (IMSTB_TEXTEDIT_CHARTYPE *) ctext, len); } #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif -#endif//STB_TEXTEDIT_IMPLEMENTATION +#endif//IMSTB_TEXTEDIT_IMPLEMENTATION /* ------------------------------------------------------------------------------ diff --git a/extern/src/imgui/imstb_truetype.h b/extern/src/imgui/imstb_truetype.h index 35c827e6..976f09cb 100644 --- a/extern/src/imgui/imstb_truetype.h +++ b/extern/src/imgui/imstb_truetype.h @@ -656,7 +656,7 @@ STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); // If skip != 0, this tells stb_truetype to skip any codepoints for which // there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, +// codepoints without a glyph received the font's "missing character" glyph, // typically an empty box by convention. STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above diff --git a/extern/src/libdeflate.h b/extern/src/libdeflate.h index 0a274f0f..05dac048 100644 --- a/extern/src/libdeflate.h +++ b/extern/src/libdeflate.h @@ -13,8 +13,8 @@ extern "C" { #endif #define LIBDEFLATE_VERSION_MAJOR 1 -#define LIBDEFLATE_VERSION_MINOR 19 -#define LIBDEFLATE_VERSION_STRING "1.19" +#define LIBDEFLATE_VERSION_MINOR 20 +#define LIBDEFLATE_VERSION_STRING "1.20" /* * Users of libdeflate.dll on Windows can define LIBDEFLATE_DLL to cause diff --git a/src/ReDIVA/imgui_helper.cpp b/src/ReDIVA/imgui_helper.cpp index 087c9296..fa3c066a 100644 --- a/src/ReDIVA/imgui_helper.cpp +++ b/src/ReDIVA/imgui_helper.cpp @@ -1936,16 +1936,16 @@ namespace ImGui { const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); + const float_t v_range_f = (float_t)(v_min < v_max ? v_max - v_min : v_min - v_max); // We don't need high precision for what we do with it. // Calculate bounds const float_t grab_padding = 2.0f; // FIXME: Should be part of style. const float_t slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; float_t grab_sz = style.GrabMinSize * 1.5f; - // v_range < 0 may happen on integer overflows - if (!is_floating_point && v_range >= 0) + // v_range_f < 0 may happen on integer overflows + if (!is_floating_point && v_range_f >= 0.0f) // For integer sliders: if possible have the grab size represent 1 unit - grab_sz = ImMax((float_t)(slider_sz / (v_range + 1)), style.GrabMinSize * 1.5f); + grab_sz = ImMax(slider_sz / (v_range_f + 1), style.GrabMinSize); grab_sz = ImMin(grab_sz, slider_sz); const float_t slider_usable_sz = slider_sz - grab_sz; const float_t slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; @@ -1987,9 +1987,8 @@ namespace ImGui { } ImRect out_grab_bb; - if (slider_sz < 1.0f) { + if (slider_sz < 1.0f) out_grab_bb = ImRect(bb.Min, bb.Min); - } else { float_t grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); @@ -2033,9 +2032,9 @@ namespace ImGui { if (tweak_slow) input_delta /= 10.0f; } - else if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow) + else if ((v_range_f >= -100.0f && v_range_f <= 100.0f && v_range_f != 0.0f) || tweak_slow) // Gamepad/keyboard tweak speeds in integer steps - input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float_t)v_range; + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / v_range_f; else input_delta /= 100.0f; @@ -2082,6 +2081,10 @@ namespace ImGui { } } + if (set_new_value) + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + set_new_value = false; + if (set_new_value) { TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); @@ -2135,13 +2138,9 @@ namespace ImGui { const void* p_min, const void* p_max, const void* p_step, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) { // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) - && "Invalid ImGuiSliderFlags flag! Has the 'float_t power' argument been" + && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been" " mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); - ImGuiContext& g = *GImGui; - if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) - return false; - switch (data_type) { case ImGuiDataType_S8: { int32_t v32 = (int32_t) * (int8_t*)p_v; @@ -2273,17 +2272,16 @@ namespace ImGui { if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { // Tabbing or CTRL-clicking on Slider turns it into an input box - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = hovered && IsMouseClicked(0, id); - const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); + const bool make_active = (clicked || g.NavActivateId == id); if (make_active && clicked) SetKeyOwner(ImGuiKey_MouseLeft, id); if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + if ((clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) temp_input_is_active = true; if (make_active && !temp_input_is_active) { @@ -2302,14 +2300,14 @@ namespace ImGui { } // Draw frame - const uint32_t frame_col = GetColorU32(g.ActiveId == id + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); RenderNavHighlight(frame_bb, id); RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); // Slider behavior ImRect grab_bb; - bool value_changed = SliderBehaviorStep(frame_bb, id, data_type, + const bool value_changed = SliderBehaviorStep(frame_bb, id, data_type, p_data, p_min, p_max, p_step, format, flags, &grab_bb); if (value_changed) MarkItemEdited(id); @@ -2334,7 +2332,8 @@ namespace ImGui { io.KeyRepeatDelay = key_repeat_delay; io.KeyRepeatRate = key_repeat_rate; - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags + | (temp_input_allowed ? ImGuiItemStatusFlags_Inputable : 0)); return value_changed; } } \ No newline at end of file diff --git a/thirdparty.txt b/thirdparty.txt index 17574d33..908ec45d 100644 --- a/thirdparty.txt +++ b/thirdparty.txt @@ -119,32 +119,6 @@ The EGL Specification and various headers: ------------------------------------------------------------------------------- -cimgui - -The MIT License (MIT) - -Copyright (c) 2015 Stephan Dilly - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------------------- - imgui The MIT License (MIT)

2{L{j;n^GJtcSazOp#|#9n#tN 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%0D#0L%-_75=i=@_z;y_5^m3*Ut0#quyy~ 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ⅆ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