From 8e34bb97f8bde8d714e4b29dc3cd02a3ef1f62c0 Mon Sep 17 00:00:00 2001 From: Assaf Inbal Date: Fri, 13 Sep 2024 15:29:52 +0300 Subject: [PATCH] Add support for modifying non-light entities --- README.md | 2 +- doc/options.png | Bin 18271 -> 28000 bytes .../ApplicationPlugin.properties | 2 + .../HomeAssistantFloorPlan/Controller.java | 2 +- .../EntityOptionsPanel.java | 9 +- .../HomeAssistantFloorPlan/Panel.java | 132 +++++++++++++----- 6 files changed, 107 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 3f926ea..900cd56 100644 --- a/README.md +++ b/README.md @@ -212,5 +212,5 @@ When using the "Room overlay" light mixing mode, it's also suggested to: - [x] Allow using existing rendered images and just re-create overlays and YAML - [ ] After rendering is complete, show preview of overlay images - [ ] Allow overriding state-icons/labels positions, and save persistently -- [ ] Allow defining, per entity, if it should be an icon or label, and save +- [X] Allow defining, per entity, if it should be an icon or label, and save that persistently diff --git a/doc/options.png b/doc/options.png index 1ed8d81b9f2962a30d3af6c210547f6cb9219a50..44410d842129ab541437cb03c4314254846ce66b 100644 GIT binary patch literal 28000 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 DCJsdE literal 18271 zcmbTdbzB@>vo$(E2o^L61c%@r+}+*Xg1ZjxArKrwa3{FCYeH~$mtcdt%fM}(=e*~h ztH1l*KWJ#Cdv@<#RjbyjT^**RAc=~MhYSLNP^G2BR6rmYFz{21_!{_+Kk@7m@Cyd4 zA}Io@7$w*PPF`6E%L{`*)iEfKM)1HnlB1M1a0l9-mmiouhayuDNa9jjOjyms;HVwN zk)Y4@#yc^OTHBdkglVW|Fi{HB72=^k(3cGPQ>mvyE^Nmb`%d}&lC)Ie$H31rm>}9V z8iPH`Xj{LIdokGX!B@f>J*M_pt;oZgpJ$N&vL+5;3(=W352pPpg%?t0l=hQ`-P?+z zIIC_{RJ^etI~?w?VCH>zE|y5%+si!09evyxPFVndJn?^im?D=d+$L^0>&4%j)pf{E zvu_Doz3I4_$Pte)gwp!{g(Fs)fdSSXb9S%ZW^S@40%tEl(;)UZ3I34GLe^(zG@}F$cz7=%ZxyXR zoYNtN>)6^fz%oM6Um{PzOg_Ro`zW`i@BJo_K%nfW&rowh!(Um%BEvACYyqQx&emc# zFGNA0B1NrEho<${I@yW9c+<=nfLV)}`=X&J&`S$JRoUj#7L(_5ChKCZk8~PkQd#`o z8Vp_+QgFGS_Z0ngp041YZhRh&8fUO3_Ge0q%gdvF z4CJNr@bb>!frRRfs-H$L#-=O;Z@BNrSKLcgB76?o{yK~vEVB3?ls9gT1c|p3XjPpf zaXTbAXeB6F;&ZO~)VAU74YXUN286aRV zcrtY>t0C}w-K3vWyrCZkRR5c1Hvy4bRh<*1m0@1Te17BckKm&y_w&k$pXQU<#I~e2 zRG++6>H{=%%yJIN#QqP`+-Apojazio!{%qUH_so!51JBEHr*?BocYnd_1$JY-(_)| z@!9V@?K!1AbR|CwRHbe6uH7k&3hW8ssK3~Kl>WYK~UQFOXfoP*O>=uvutpEz|J?bXFsA0IlOd7-y` zf(67+ry(g}Jx5=OAG6<~U`ssl6_l1n_&qfG>*|c?h4e(g{jMr1(`{5hzPssshRUs! zYF17TF?G@(R12Lx?g&16Hls#!I<9xY-|tEamPo_~2iG(=ryMtJqAlQ{;LVwQF@=F{ z3O<=MqgHHc^bU`X>a1BXYJIQGyb0?o=o^4K;#Tg2EuDE}Jlv#=`AFQi-OX2>ayJ^C z8$MqdHkjN`$}&y#30yNb^MAXcT61E6B-i4LpHw0}d#}2$`Cj68p5dQsIg2%@mugJl zJG7Bft-g-YJULm}c(rMFaqHnroABevq&j&SJ^C+X79B()=mTwYKFdi@n%jC({xGu)4ZSdCc~6unp(M;xRrM_tFpr9C;#lI4%ohf}qsCDL-F5l`oluXBG*C$3 zbk(O?Q1w-b6CJBlg#}K~)W+5?)5rx)f#n8e zw_v~Dy*c^iW^OTDhAr;{d*a2l9llas@1$BDq#dMMYNE7$cF}E^U-;oh$9kqS=4;uA zelw&&Te-7s>|~#-c1}2FO>p6J`c%Uk)@bJ!hXyK+$71%gdy-0*f4r6iB*V~^hm zEC@uBJPnQc24JF=5CBUgul`q${aF`TJgzbfz*iM<&Q=r~*D`tlPdzc<^{#@k;IW$I`ON#taoxQDB)xJq`pe{*F%m^7YSSQz186VJ(jV`pl` zSYT$qmYCf1*izpf=PRG$+@alk)OYyh>bfDt&b$wRe?L{ith-4KYky{OoFI%F2E~cv z$eC5?Tz*lPFNrE+;|4lE>F?wCnObMlni+$<|6u2sXmBfz@y)B4E=}e5px2i+Ja$)! zppKz*IC(T+24;j8pPMZ0hBj$$ANGBVo31U?e=}F&UdAuZR0;uslw?aDU|l%GRb7G_ z5K9vn)U60nV#hF>P>8O~6(^{V@+D_WyzD(1-fxSTUNpG=sEpF~^Dljf`r=^hOz-O= zp|y4J8o^4R{9~4ef+R{(ZTN;27P@m)g|4Vnk^4LJ5D@DYKZW zC+FE>98QX*E%`O)xw-j6&-O^ZW;hR!yHdk@_%=)CS44+WiLZ1 zle}a(m8d-HnC26QB=@%9ZO*y|Cb~r0IV6@MImB~&yE@KR;c8W;5g?;etM66gv6ceI z2tZ0UgKxoCuu3i5shK&m7htv~M&q#5`xfyIj4kQ*ccycHj_ne?P5+ETE3WDk7wLC! zVtVTJW#Rf3t;U>7+o)y?#w{58Z0ZJXCe=)$&7fg7ahA6Ab~*~V8KREm0Dpidcj1uA z+RHESh-5^qP^AET&FA~Lwqt>&_KmInMF<;Qew#2nDB$z>sd0zBQm2?YlggRsN01Pq zN@ALsqodLYkh6<8+S}W$E4b!IR2q^2e0{Fh0YXBFq2qCzDTxAtdSVW^=_e2~0w@4O ziI+KxD0`+9!BXd+xFIr&@QnVX`EeG0Q31WI0I`oxd1@bK8SvL%d0vU0vc&Rom&y@3 zW!UsvK8q-=ddHepTM^eGm zG60MxzT{zeN<^ep_ko6|fPQb-sP@-%g4T49{RR2Up{r+@smrU@bzE@2X=fLbI`gvnty*o0bD0Afk%neiM!>q|fUyc*Jg6l33B<@Hr11-1K zxA8ZUZO@O%oFA=-S{_5wy{Dv}VgGR?Ya7#IJY6ztfeA$}<*yznnH%&wSx0L=$~_d+ zJZhxOLj5ab6idV!FX(k@t_yT{l;Xx%3LOJ6Q?TF`TA^6QUL_|L`?trH-Jh? zomJ5f#woxm6fty!ar2(NFwNI%-2^G206TSi)x|P~^ThF$^|MBG{E~vIl{au9%$Mrn zsf1ATV!M%h3>%OTB4XqipURLT{F(Mg5Q*ulDV7~iXf9c%n5XC2IN@ofGFhqBvsGzj zyv>r+zQ)py)q{IkK{FKDc2iHjrg;&aZnPy=00g=f`%Dj(SKs`ZR@HxAsXX;|+CNME z-GG%W+h=tZK@XX!pJUz-@2OiqxO^k9~XM%?BW>SgRXB*kckP4HWi#)>sp4d&cjl!V;4`mb(sGj^h zOws3~@BO7!y%qsQ4{K$7cCRP`2t@o@v}xJ{f-Z3T`IH{~`fMDK18jjitT@x+d@djm zBF2|GAQgk+B}f`ynBgeouh6@ zk$U!?~<`%e766?x>(`O$={B*yOJI=+R7*M_O6~)}Cj# zAOa{p^nbVAn2$P6Pke7CNWQNZ3ke?uKI_xehgbzXr2N-(&xnwidqgOksPz1q;T@NkjWau%!hzL z)E-)%&t$mvG&npP(S67@75BcR1rU4xiwBTrF-YbyB=`U;SSr0(izE{euK#T$OsN+u z30eJOc|my4KPD3*p})xK8X5ehX4Xwl)0j~(c`f{N9*Q{h1UvruRWA#=8sEiT;EkyN z4;soF#P11THs1(w0nSKpHVn@?U|ZLJ`9b`l(Y)(Q1BJi>)FllVGbDIllMn1INVH9x z9zc{;c{arRjppH@$lQ7e=T0_?s&VAu!6^G;OA*%ynEIRo?qy zsLO;@L7UPud#IrR5Hy3YVd;=e{L4F9%D=b1?f^#l)wW)0Rsr8WZirtWZZQh|{$5U2 zCtGBm($$k0`heG&9;_jCH^H((+WRy}9dE1{hci>t8?*Tal+5W5vC^P5f&t9v)@7|BpAbf=qp?iRCC zFS_*=Dd+V9IDIqMC6wXnVY;RO510qW2iP6fN^L%{WV#dg0M6IzCp)K6J2gSSW{Uo} z1z()Fod}8QG06qu%Ke32tHa7j9_|Ura_fZNq<!0|2WURPZDv3zZte|yL4*@XDMoOB?c-0X_c_!cEKE)$7B5?gF#(x?2)g)kD zkP=?iKUDc&Q)3_wEn|NgL}3+DqlsUtP^P}V{mTW5VF_!J@<3?O`u7@Nuk4ZgX>)qz zSKqq;9jp&o&1+5#DE4bRPhS=4W1cU6S%-^pOpw;U0i7m&)`9RjJPAp}YvNhxIvDmo zH1yc56K}grB{v&9)^8-HK@s(Ox2;?k8#YxR!JKNHDNe=PI(^&@dudf6Gw`5W830(L zfbU;`-M;;ptJBYgk-&neH9Cpn$rOg#)*d4u_%hVytYOdz;+XP7S;~!5B2` z#KiLBeijz?&@KEV9CKg8%`6c8VQ@$W3m;sCefYBRv0D1#{e0ez~1tkI@8WbR;1!?%D zWRUzNTju9KkU96Z=h%jf@GWRR=$97cse7t|)k83H>`ep|MoqklfcH@sq~!mq*W%cn z@1o^1WlEGrGEuJOvqn~@x;w%%_RFw!!-Uw@+h@aZmoAjijc2)dxjdjD52SQl@pX*Bmh$`O#`ibjqQ~l^DB^uo7MSl< z{McejzveOwp6P11^_^C|x0+xuzq7hwF4m3Y^aJJ(^7*Yfq}Qs046Rol@>mr4J|7rA zo1Y#}GD`QKXgnTAv2lGdM3VJ^`c>Lu!JSxS^T5fTYGr!T7%Vfgrkr!1{yV9}BJD|P-=OCFF z)-n%WL=JGd-NP3ZXjE^*fD*oXK#T$z9-NI6aZsKZK&ONpL6~EF@m1(6Ttq1YCmws) zw~atG4l#2~Z=BiIpJrkHeB!5p3l9}eXA8RE^>4sVSHl05i2olkUZmjM!o6o2tYY6P z@pFFj>n5U5Hjp!q-QOGqE;%?>m+YVIm~FDkJbEC4o&kVgKKZZ+-*^Ik7A`F56C`n3 zfUzVGv`XQnZ?*0opIu5~?zD5#y_Mu%VKcA5@h@-MHW!3Va`Lo}x8s$NyO8rXd1Jp_ z#OqNuatKiR>3~b)b(&b#!Vgx9O4NUM`b29%LZ9S!-phUS zu{Hy*TafAXoYsz8iQgkij~N0;4IZFK471S?uc(-A1vcqRhRT-IlO`2sDT5O1OnOIt^OT=A=u1yyhOQBB!$sW3b|n)%X=ll zj`ZuH??eo2xeP%{K;Vs`EZ!ID@RE|N21c!+(w(M|P9uP=%|d)%2SEp(|+8^h^mgaf*i?^GPr-Y*a_2 zN!XWxd1ttuDE^&GH!D+;SH#iCtTT7@DCQr6fYh!Ruz!erXqxA=jkloe+>CmdV=_*L z10sCwC0W1zsP+OA0h5TUbMyd}ka_(NYJjv}Qa&uKQOXjmsHf5EK-ysEB`aDxL)m?+ zGJr;4eHdyhIjj4lpnmP1-a`5a3i<}{E@-p`5iKpB#uQvB4c3BK$TSO3_(du(8@+&_ z8;N}WNMzn264S7?YBgYVm(;8S?eG%CQt**m&fIX65a zMwFj52($R46;B&X1@+l}&@fH=qi)8bD6bBl=}dF=Bp{5aM9Z|&IWoqTx3Hy|A~B-8aU6W8Jjf_=qH7v0N8LN1;uE}sZCe1g_MZ6;s9lwV5af<`?d2oqKyH;QRIEofX z=v4THnIU4>B9di#>az+cI!(ZUj7Wf#F5Krx*3opJ#Ke>F_S_N{g#7mZJ)5@`IaWN1 zW*hHw|4Z5G^D=vpK}EEH5irNvUeWSv^cKb(D^tRNt|WlThFTcFCJ>aSm~spndqw6z zbPXbmjv$o=Mq4 zP5ZLmJ}=WY{57232$2E>MZZ8-H>>-G08wS~c6w76-Ba^B|0i( z|D?xuz7Iqb>KFPy_*gU`3Ib}7fXor#0f7XKA^v|^uv?ucQYGdq$XAjWRM0pEz|Siq zJRlf$AR!?jF|;vmq>w>)KqT4!Nb8Fb)||E)56Cs~R=-<=z;N>BLh`l=(Ga%@n<(15 zYJCf?_kc)`2Uab0zmIi?9D^m)9TLLzhwxh9khu>?hOWC>OEtf2B1fGok3N0^%&~ZD zonj-*1jym)v+jr}ix&~#Y|G>@>?En*SiKd&Y;foXTo!&y35om{+Y|rs6!KeIh?(+{ z2LzDBA0?MhWK5!Qa824aUK~P+{L9-5VEjg(ee>m$#s2X43%RrAm39>x3jnS;f_G;JE!P!Kf zjz@(vdYb{@1|J!ILlTJVE5i@EPb3A2Lgh_9cQvVW#7~VjYRnFGV7HFZq+dW)Tj)C% z7!sLE7v;S4<=(tw6epA$B>o-RQgVyL#%RAI`m-V_Ce7%xf%?D$dSb|3*Oc{!s)^UteX>}U*D7V+2vqXL^^0AOsP#hBnSJ#0 zXKkK_EfPRTvc&!)BnKlj{)jx0+ucOQ`d{sE>&&3s=D@yGv3%s`GZ|l{Z5P z<>4HkL=nZc`Bk%;G>*m0&afuR6mGqD`3ChW^bV*2pBGT-JjXcnL#Q57P5Cpu#64oWj^*Wi4E7Q>KhK-wZ#^Xem{YV@wRCrGJTI zC}!iu&v7*xv#>j8xmYe0Qz*=^O1RG6Q$4daF+YuBUF{j!^lFRR%vJ`EsISPcrI?Y4 zeAy(+<3|IIt>EApIet-Nza9e~K~BlSCn>&fp>G-At6oLh<&r6)u1{dZ$3!wYbT`lS zAFArVdn@rCa+liMLSv~=9H>Qql1X;h%8IU@IBaSmNp+ero)=47LS>Dq%~pFK z*bl!5A0Akg7_nAH_S}-TmeuxCPH8d~G3=l1p?UjNv1)utyU|{MKy`sD=xH)vSf^14 z>7*yV?(Y}k`4tDbSz7lmwaMi&N|W28CvF1oQfc$)nPbFer91Cb73GynRqTJBY&f0L zr0y?&_Lr`eLwt_Nbx~=az6&lsGG!}AL;t%8w<D^~d#fCA z+zcGs&64H&!5|0V0D~SO58TpOP;)njx6H#Z?tUO5bCzDR*tV*F;B6P61CyDwm+p;l zuBrWl2ZaP%SI&M+@^%CFQzJO(qX*Itix)<%qiDk=DkN6+Lk02gb~Ie%I+x!`bj|9O zwwZ8=>ys@qaEj;?F^OjE1RCx{Ai>(rAR*Rme;Koa=XS*E8@^rM5h#>7JiY01Xj``r z<$Hd-I6qq$6VlydZJ&M@Gm-y$ka((8KKJ!vYRm=vmjR_O)n$a? zV^@7TRVUX}ny;F}qKJ!ac5)?(5Chn@?( zaL;_9VNtYaxUcv5$~^?}2;F>JZTI`7>YmE5)_sBSD7&lPC+f1GTe$AF=+C5`&rc6~ z1!?vw6xl=`Ks(6pc9NmJlyHcdfk4%;=dL9gi(?@^VpXF(x?Rg`jv`FJ?mt~#1^44UFuKIRqv5jWto-Ut`wnVGNUHA!WqK(piu<~*@Ep)fgKaMdQ&e)REBWOo=Ss! zo4JYs8ihWq!+Wl)x+o>hN!m^?c7=(p$fk?dq_1~B9qy=IGc{>eA<@d-lw@9J9vL@L ze(mvJbzz;xg4WT}2U6kE#uubV^;fF6WaK$Ys~Z+%+Yel!+C1M=#&pnG=M+^dsi*A9 zpXR3KI-#yM(7LOe08FdVOllro#y)E;vf$qD#c>M~Oc}~YBhIXlx^_Pf;Q)05y{-Tk zuhdL@(#0f#9JI}i11=9G`U|~yBBedokFjVx9!ioq=d=htT`;kX25m)&&g-r{@bcDF zg!fq{@#rNO4fZ=B^cP$q7U*ST@n?6XV>c-WQw=r;znPxxuDw2uO)FT&z;E&synKvw%}rYR8N!Xn zo%G)PE%x3BI&r~#jyP^3%BDJ+%vYwC-@k?L*U|lpWNLsu3OYzEcfk*F`n?gqXo#oZ zY4fog8Vbzu!jwXv8r0-y!B(UKX{xzxK}HR8E+ulbcdx%ei;^Luc4bfSS$}_l;eHC$ z6uQz+Jm^932B(R_mXS?e#?>%DgLI)R>OE~7<{anF_8|RZC|9@0VqLlfZ-}!ZTVqFr zJX?mtn`k@7oP+n08!qM$iW|Ef=~+5ru&i`V>*TPVRpDm#wp(+{UDHU?u{v6~#o0#B zCD1#S5KY8y{njOOhsD5sGm5iB#lhvnQnS`_O^Nn2lSdYD#m=X~{BWhs_s zk&7yh#P>V3XEcktyC46mx%wDH2#of|jB_MZw{L;5Z)IG2e2C&k813vd!Qw22Chu{~ z6lzvgpz$Nyl?WP_og?JOAy)0xM9+U{BQFxO1e z_WWDo1+y9(;)#j|qO=b&C-cH4Q*d>?bxl30A|hI6L*}pbhuX`$zZ0vD4`H5Pee)LA z*`fm&fyh8QVV(t=(#aQXng%%Vj@3yxjZAxqhP7Trxs)lc-EMl0han#)Ol$9i{SjGu zk_(FbkuSN4Ptb}*rflX*=oyxnuG)M6vP*tE6=Wl5Gl^_AyJj|kuh=@>Rs*>?fmb%& zw8j5yUi+5_jYXNl7Dwb(>(GKfcNK@l5>HrtZAbcS(hZW9>Dm;p899hLq6RnLIu@uFMe}l#ybhOol7J$;%R+V7>#jsJitDrUpbJEUj*(!-lsS14MA*twPAqtCxgq- ze%4oHhlDE473;G4zk17`MpO;!f4hZ&HY7>1Zv&;)S%I;cw6i+Cm3q9yA81W znaJucmp-*uN$LOiphM&J-1J_UT+9(iWo8iX z*jmMVcL13Ku}OPBPQtDBZ#qMU^B9g{2P?wUuUS;a@cXaNBX~0`J>0rH3F%BP&2)$` z|MU0-3!FiO5@rhhEeC2hA?V|x4}!MDhV{?AnPhVzWiktEW^gbU?O{cGtr8yTrj`W2G9PD|@qBpuv3e4)MKeIN|Y?RScf3+gjFv>c; z@e6hBiML3>Ur;j56p1E|_76?{of5b)p|ZziB>fqOlb4lk<>;Z_XMQ<$C4JQ$!fF2>XmQz`5!FZn*6B+KM5Ap~T>W=#qqv*PfG6hQktv$iyv%Ymx8P8!=mT z*&!aHeElw;9X7D&fN!0O?n)Q3R~1vE0UA~Glo45d`a^^6?nEDP!Job>lR(Rh)6Kgq zto;w8h^kSCkE%S}O-T3>@G8`dOP(^B2eYoz3f_9o!|)t`o|^Ti%}slC$WbHd_b!pF zT*Nl-2b9ultqB|D?KQTYoI0vWbM4)P3v_m5nStPySme^Zj#a6R@HXooi|bi!$S{6* z8^j#PrMn}hUuTnBKb)L6k~43V(=A&;)o#Pz5DQR>oBE@Iooyyq#3 zqRY2+mPL=!Q=_6V|40q$;Y6-yRwuNsf2w;K{;Nk9FQ>?u70O33H80>9dIT=|TZDN! z-DME(U*ok@HRK&`P*_yE+ZN7yMFn2x+Hejum`=~IFtr%;3CkSIA__mh;}?yAI7~fa zxR&cl>+2lhgE~G8jf{?UoLpq&YP;vliSSaX)>g-|kyq06xlXjjxiwnor?)Iec@0+) zhuP+l`r%9!Ec>8kd9|w!+^M_?P1T}$#Xp7N|8RU+4HqGj@@<}HbzGE9O$74bOilI2 zk3!9BbP&9MYu@5kC7QtYdfT)>WLiv#eJf(Dk92FBq`0ms zac%*$Gu^2a#N+1`99@{CzVQ(j+2Pr^TsSG=1_{moTO)CL!9?r}27e4yS)kD9e0Off zt|{PCo!od;r-OzL6`&)}HkBhY@U6yd8*b1;?uF-#7 zzUUIK^!%us8gcEki0@lPr5g2SQJvrfzdFTuTD6BrN}GaBa%+_`bq1TZ-im_=)Y|V3 z`MGQpNqg`CCCuF1+UIIC+hNT$e);VDSx6ZX;)RPFej}a+Nrg;%CB<>%8l$-eSxb4ml7fT?*;g|&=CH`klfP4Z-@$FQ z@dZ8h+~tQ~35*JGAE?Oy0Cy+1d)N(Fk9bWf|L*KC!a)Hh-y~U3y?U9Z9IA{r<#5~E z%FrmBmmtxilKJ$x@;YPtL6xaR7RrAle`SyLdzf>uO0_^Q~kTmNkcqZNhHRPA#z!jclgdi0ENDkjHK3*dK z2&RaFz%s(5%;y-KrApy;`*6;=>d48K<^SZlXD^)1fFX34^(IjPxG7 z>gBTAVd3xG*PR;`#-k#m>jo!n7YcV#SAp=i0i#H3e^ zD49r@=wa7HX**w6C6nuzr9Lbo)!!!O!Z0{7h%&>(Cb#hDOpTYNOdI)iy7 zv`WB&i8ZqoTUndWAQLB@01o-{o9FGPrUdo(qw=)9nhM0hy&8M-zH9DEjC*^+I%M?f z4H{QYtQp?Qf|GVV*VXtbLa8dfVyX zFGS~Bnkc4x=SLfznBhq!sp+CngKF zhFG3_mw8V$&ivczGEXKuz23N9ofqu8NU`qBF~Opk{&~R)-n-s?mCKaBo-pHsjxNMY z&itcgZ3jab_`f@#!4LI~>g%;prQM)GK(stQ@JudGFwl5LZq44ke*ada5UVZJ;Y6PXEKeOk%uWdvW+U; zs61O;OK+w%%6%Y4L-lvOdTJrTv^2NxX9M$i`OsApciZqD@@nL7G%?-bkSm{AYP8ppb|X1Vg}ph*ViI#kkL9?VM}o`ckG?bS~l zwxlXc>w75(y0*~FL(hfTB)Q>8wYl+r9Twe;(`mMQkOK8 zMJ(JjHWD!T6(~u=r$ky>dwkR&>vF2r{(&4;^_g-?OUlXu4H;;5i!ymTS*FU{Zqi;N z2GqtIe0jR{2Z3NaXZtYhvw*4$O34k4W{mmrbRm&?+z3jm#e6v`Q-#*DIO*(|5*LS@ z$hS^Fsb0(EuN8gj2pR1)_d@YdxszgR9RkeeGNZL_ofPsx4j@>L7L#cd?ad>gBzAdk zr>7bsa-4<&6^~_=%65Xd_K350xeo|ZJ?(>X(BBf`^caWzn3ez}vei-rbx*=J@ecUY z$db(DW=bK96Qe_ER^gXBUl{AvceA~g`0~p8>h*fa=~6nOcB^7z5U_|Fq0PNjEL9k*`;$LzW=IMU^~QzWQ*lorq4i7n0^pO^|3ixoTpK4Rq7Sy+&!9B zzgY`6`)l7g*!5pkbrIsb>=YIX<7Yvi{8EW?DuOWXQpm+Q9p3FIArNk*bu3*m@V-7F?JKY~!-6gLXXS_VWZ9W>PZfS3!~on9gaa*VUm5e!nqWA`Gad+g0EeK=PKfC_*eFNvwx}^ac7+>S$8H6VfVU6 zfgG#liTSS9H@Yb7g$=vp6o$$X_FO+`Wl2|8Q|hDJ9Vtyle=#OXFIFsbIOEmoF&v_t zB*K}-Doi}7Bi*0vE!X6=+*PGfSY)gULf`$`EqwhY;h`3B_?o0Col7A^vxP5KCU#By zArGa;xj5b1qxRkBhRHoT!=GYvqSIJbqy~I`=|%FkLB5;3uM6{w(DmgfI}*CW6(hh4 z^NC@5?o8&M0@Sj@Nk@F*JG_$HD8hRMmNk#VhkfQaUEk$SZ51bnx5)K0nBH%5c)X?Z zE^6K$i?DHM16|3yISSUq+CiyPyYCxu_WNRW-D0ifI+7b`jCD> zA$nKkpmkrDpI|MY)@|26bCvx$>uP;Ux;{Rl&Mzu&@D7V7jcaK@x}(h$Ct`i|b6u&p z9@~a}-ahzzFL(MmTXw;>B%{fQYfhR|MV6Sqdd2yyEV^$u%<|gzm&Tc;{x}Qg(k8s+ zDMnZ7Rm$6*&YPl7vWF6J?@XR1Da>bVOayPgUpMoSGzd>$eRoCq+w-SOCMlw=s&r)W zI)}qaf$(RC#zVtao-Y?m4OjF|sg15rf*494^LqWW@u@|T@g)%It!Y^sKEAVNM zuCl*O^wAscbBMn3V+yN(Par||i&XmiQnyEZAr$|ovd+K%QGZC?wxKe}|LO1?&)B&M zr7O^N(2+9K^2CA0tUVXe0fLSM#gFr*@9VSU zsiTdeZ~Ma}xuRB=mzk~CF3N@tkwJ(8?A|afSE|Gs;CvIEh;&S96T$gvSG1>BXb}bvM;tY zE?&z_xDZyBXR`uqoEwpqx=Y?1Sa#!eZ=p7K7Q|4Y%lre@{7^@CO7-j+rY z`FP>eE}FLH$5#UHRecGTBqTHOur~a4AYyic1rOME>aO@H4PTAbELLv9YM+wEL+1RJ z8p-ZkKgHK(ncL6Q`s(f??r@-bws`^#Dli}W z&*oWmlyj(PlPyVwRx*j&o?Q9r`*N2)q}$pdE94rP6WeTy++w^*xPjZVh62KGVV^@4 zV7&ZGDHdyU9BP+QY85ii5~mT8aB2w^mjQ#Wf;+^BEHofuvOQIi`az}*VfhRKe=u!8WtaiL=;C3 z<&rP=9>iV=GKt$#J^R_`uJF&u3Za5dvq~cFVo%y7)}%)#h7|n^JV-6*&U%!2JcSuh z7}E*zah7zg_JT?G`9IP1SbRR_JJM$sFGieO6CKM`PgwcB%DqTRr(d&jTZh7?`N z`_we80feB>VLW|{J&*@_n=DM@-NTrbPlu@s?IX^HWzT(&DXOMx&aE12kRfTNwq82l z6-KUyUFmw+8`+5^C+>>2ti-e)XfO+iq)BZXCz}}B`Ba`ahI*HjUHRCVr6jvfPBVELXe!{ z*yq%%;z97~uYfw1!7S>2Qp`R)xz9N8&V=wH7qD3e{>}mPl8C_mUtTX1(qJ^~B^qBd{Wp_apAR&yR)f zyCTIflb|9K5=i#3RN-1~rw;^c<-$E_FVo_Q6Iv=-XPD_5Q?&hBr^K&_;-EFORg)WZ zh1g9nO}Hj-$Dw?vu?KlrEwQkM)ldfFn1>`Ey)vnx7YNT;MT&HCN?s5^wfxHl5vXmge3*H!QKWzzn z9L_;6H^MrWQSYa}*WcIof*2?WY#%Vd7_=SyzQG;y&R=z4vz-ExzurU24=yJOQNlJI z3#R5QAtUh9HQhS!LS!(^2(IGfHOV|gO(L7L`b7TC=U zgn{>T)lGrt(46qJ!_xNn>Iwze`NqTBp^5;p;Qo34uXN z=^4GyN7M^=34RxNZ<~7sJjRc4`TAA0HeNhaREM;pLrYrb?F#R{PCqV@;M(`6lX~}l zswk1F-4)-P6_+`E_h6BJ+*R}r=Cf`^f^6n5$($sW&pYh*aog)McQ?DKOS|Vw!TOXA zolp)2ZLHBtC_Utm2Q~_+yG^**Jz{yFoRcx{K%5d+r^)eWDhf`Up^+y7NCv?eO(-}I z*pePe6;4$k`y-ev2sk+TB+J0pW@6pw=<S8>otTf8(#LU*%GFx#ub$YOHCZgO^t_rG8%%eDu;N2%CCJRLOvTURa zwzcl>rm~mq8d7Nu#_^VU!y)=)FMRV6?9ecn&6!aKovqXiXL9d9+Q|98w9&gGyVe}s z2mvB_Waga~X)nD5eR;Qu{sxP`?g(aZ%m@_KMp8(Zkj=yyyU>=fJzYZrUb%RWf%6EI z_0@V|^%72v24x}!s#JNEz#E6$`uRsCoN_*&^xhv)aQqK8<8zk95hfq@WQD$S-IU57S8N;CyI@F^LSX0 z8F#6DsK4}WDdP$eU=++t<-a)1#b@u87?19ozwAC~m~v+u zUAp7luU-Eu{Sp7g$APbxs$Ktm$ve>h^qm~>C*liyfYY1PyvZ9vpF=SdRHy|FwsNh#lGL~g1r|6IxGNgWra5sKeM&`zi7!< z0o=L$&eU|eJfHaK_`a5j8{Ua)@O4x&7rp*1cEMPG&(dj!4qlXxnI_rJwGntC$c1Bn z=FOfxS+d(%}s*r80e@DT66E>_LQQo>IdfZLA+8vKQU#ij~urU1xB z*{!eh;QW?Dzm$Q;$#7V&xxeNycirFD@t41pY;f)e?nEwV{|Y=c;r=pK;HViNsQP>* zaxMSbM^@ko7t8YNKF|JgD|`LQP+;Zxit$?RwfFIVUxjaZaJT&aQqXZKZEbB=vVd}5 z8D5*cHh=x&kaXUThxs@1&lPG}aGz%8w{ejFaezGpq}{Pu_tWxuRbA)i*?QamzIi?+ z^2xK=`O_x0DNXF?*--|Z+Pwri+9E46bE2?2Xi>4j{tw~WZ{(kM#%kwGoPF?-5@^}L zjPq`NyU`DeQRI>a?o4g~E;16R4*Zd-{`aG0MKzRlRPgg&e IbxsLQ0Q1$a getHomeAssistantEntities() { + public List getHomeAssistantEntities() { List homeAssistantEntities = new ArrayList(); for (HomePieceOfFurniture piece : home.getFurniture()) { diff --git a/src/com/shmuelzon/HomeAssistantFloorPlan/EntityOptionsPanel.java b/src/com/shmuelzon/HomeAssistantFloorPlan/EntityOptionsPanel.java index 50156f5..6a4bd3c 100644 --- a/src/com/shmuelzon/HomeAssistantFloorPlan/EntityOptionsPanel.java +++ b/src/com/shmuelzon/HomeAssistantFloorPlan/EntityOptionsPanel.java @@ -45,7 +45,7 @@ private enum ActionType {CLOSE, RESET_TO_DEFAULTS} private JButton resetToDefaultsButton; private ResourceBundle resource; - public EntityOptionsPanel(UserPreferences preferences, Controller controller, String entityName) { + public EntityOptionsPanel(UserPreferences preferences, Controller controller, String entityName, boolean isLight) { super(new GridBagLayout()); this.controller = controller; this.entityName = entityName; @@ -53,7 +53,7 @@ public EntityOptionsPanel(UserPreferences preferences, Controller controller, St resource = ResourceBundle.getBundle("com.shmuelzon.HomeAssistantFloorPlan.ApplicationPlugin", Locale.getDefault()); createActions(preferences); createComponents(); - layoutComponents(); + layoutComponents(isLight); } private void createActions(UserPreferences preferences) { @@ -137,7 +137,7 @@ public void actionPerformed(ActionEvent ev) { resetToDefaultsButton.setText(resource.getString("HomeAssistantFloorPlan.Panel.resetToDefaultsButton.text")); } - private void layoutComponents() { + private void layoutComponents(boolean isLight) { int labelAlignment = OperatingSystem.isMacOSX() ? JLabel.TRAILING : JLabel.LEADING; int standardGap = Math.round(2 * SwingTools.getResolutionScale()); Insets insets = new Insets(0, standardGap, 0, standardGap); @@ -163,6 +163,9 @@ private void layoutComponents() { GridBagConstraints.HORIZONTAL, insets, 0, 0)); currentGridYIndex++; + if (!isLight) + return; + /* Always on */ add(alwaysOnLabel, new GridBagConstraints( 0, currentGridYIndex, 1, 1, 0, 0, GridBagConstraints.CENTER, diff --git a/src/com/shmuelzon/HomeAssistantFloorPlan/Panel.java b/src/com/shmuelzon/HomeAssistantFloorPlan/Panel.java index 0325133..421d753 100644 --- a/src/com/shmuelzon/HomeAssistantFloorPlan/Panel.java +++ b/src/com/shmuelzon/HomeAssistantFloorPlan/Panel.java @@ -3,6 +3,7 @@ import java.awt.Component; import java.awt.ComponentOrientation; import java.awt.Cursor; +import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; @@ -39,6 +40,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; +import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.JTree; @@ -57,6 +59,7 @@ import javax.swing.tree.TreePath; import com.eteks.sweethome3d.model.HomeLight; +import com.eteks.sweethome3d.model.HomePieceOfFurniture; import com.eteks.sweethome3d.model.UserPreferences; import com.eteks.sweethome3d.swing.AutoCommitSpinner; import com.eteks.sweethome3d.swing.FileContentManager; @@ -78,6 +81,8 @@ private enum ActionType {BROWSE, START, STOP, CLOSE} private ExecutorService renderExecutor; private JLabel detectedLightsLabel; private JTree detectedLightsTree; + private JLabel otherEntitiesLabel; + private JTree otherEntitiesTree; private JLabel widthLabel; private JSpinner widthSpinner; private JLabel heightLabel; @@ -183,11 +188,8 @@ private void showBrowseDialog() { outputDirectoryTextField.setText(selectedDirectory); } - private void createComponents(UserPreferences preferences, Map>> lightsGroups) { - final ActionMap actionMap = getActionMap(); - - detectedLightsLabel = new JLabel(resource.getString("HomeAssistantFloorPlan.Panel.detectedLightsTreeLabel.text")); - detectedLightsTree = new JTree(new DefaultMutableTreeNode(resource.getString("HomeAssistantFloorPlan.Panel.detectedLightsTree.root.text"))) { + private JTree createTree(String rootName, final boolean isLight) { + final JTree tree = new JTree(new DefaultMutableTreeNode(rootName)) { @Override protected void setExpandedState(TreePath path, boolean state) { if (state) { @@ -195,58 +197,76 @@ protected void setExpandedState(TreePath path, boolean state) { } } }; - detectedLightsTree.addMouseListener(new java.awt.event.MouseAdapter() { + tree.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent event) { - TreePath selectedPath = detectedLightsTree.getSelectionPath(); + TreePath selectedPath = tree.getSelectionPath(); if (selectedPath == null) return; DefaultMutableTreeNode node = (DefaultMutableTreeNode)selectedPath.getLastPathComponent(); if (!node.isLeaf()) { - detectedLightsTree.clearSelection(); + tree.clearSelection(); return; } EntityNode entityNode = (EntityNode)node.getUserObject(); - openEntityOptionsPanel(entityNode.name); + openEntityOptionsPanel(entityNode.name, isLight); } }); - detectedLightsTree.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + tree.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { - TreePath path = detectedLightsTree.getPathForLocation(e.getX(), e.getY()); + TreePath path = tree.getPathForLocation(e.getX(), e.getY()); if (path != null && ((DefaultMutableTreeNode)path.getLastPathComponent()).isLeaf()) { - detectedLightsTree.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - detectedLightsTree.setSelectionPath(path); + tree.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + tree.setSelectionPath(path); } else { - detectedLightsTree.setCursor(Cursor.getDefaultCursor()); - detectedLightsTree.clearSelection(); + tree.setCursor(Cursor.getDefaultCursor()); + tree.clearSelection(); } } }); + tree.putClientProperty("JTree.lineStyle", "Angled"); + tree.setUI(new BasicTreeUI() { + @Override + protected boolean shouldPaintExpandControl(TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { + return false; + } + }); + DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); + renderer.setLeafIcon(null); + renderer.setOpenIcon(null); + renderer.setClosedIcon(null); + tree.setBorder(LineBorder.createGrayLineBorder()); + tree.setVisibleRowCount(20); + + return tree; + } + + private void createComponents(UserPreferences preferences, Map>> lightsGroups) { + final ActionMap actionMap = getActionMap(); + + detectedLightsLabel = new JLabel(resource.getString("HomeAssistantFloorPlan.Panel.detectedLightsTreeLabel.text")); + detectedLightsTree = createTree(resource.getString("HomeAssistantFloorPlan.Panel.detectedLightsTree.root.text"), true); buildLightsGroupsTree(lightsGroups); PropertyChangeListener updateTreeOnProperyChanged = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent ev) { buildLightsGroupsTree(controller.getLightsGroups()); - detectedLightsTree.repaint(); - SwingUtilities.getWindowAncestor(Panel.this).pack(); } }; controller.addPropertyChangeListener(Controller.Property.NUMBER_OF_RENDERS, updateTreeOnProperyChanged); controller.addPropertyChangeListener(Controller.Property.ENTITY_ATTRIBUTE_CHANGED, updateTreeOnProperyChanged); - detectedLightsTree.putClientProperty("JTree.lineStyle", "Angled"); - detectedLightsTree.setUI(new BasicTreeUI() { - @Override - protected boolean shouldPaintExpandControl(TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { - return false; + + otherEntitiesLabel = new JLabel(resource.getString("HomeAssistantFloorPlan.Panel.otherEntitiesTreeLabel.text")); + otherEntitiesTree = createTree(resource.getString("HomeAssistantFloorPlan.Panel.otherEntitiesTree.root.text"), false); + buildOtherEntitiesGroupsTree(controller.getHomeAssistantEntities()); + PropertyChangeListener updateEntitiesTreeOnProperyChanged = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent ev) { + buildOtherEntitiesGroupsTree(controller.getHomeAssistantEntities()); } - }); - DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)detectedLightsTree.getCellRenderer(); - renderer.setLeafIcon(null); - renderer.setOpenIcon(null); - renderer.setClosedIcon(null); - detectedLightsTree.setBorder(LineBorder.createGrayLineBorder()); + }; + controller.addPropertyChangeListener(Controller.Property.ENTITY_ATTRIBUTE_CHANGED, updateEntitiesTreeOnProperyChanged); widthLabel = new JLabel(); widthLabel.setText(resource.getString("HomeAssistantFloorPlan.Panel.widthLabel.text")); @@ -429,15 +449,25 @@ private void layoutComponents() { Insets insets = new Insets(0, standardGap, 0, standardGap); int currentGridYIndex = 0; - /* Detected lights caption */ + /* Detected entities captions */ add(detectedLightsLabel, new GridBagConstraints( - 0, currentGridYIndex, 1, 1, 0, 0, GridBagConstraints.CENTER, + 0, currentGridYIndex, 2, 1, 0, 0, GridBagConstraints.CENTER, + GridBagConstraints.HORIZONTAL, insets, 0, 0)); + add(otherEntitiesLabel, new GridBagConstraints( + 2, currentGridYIndex, 2, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, insets, 0, 0)); currentGridYIndex++; - /* Detected lights tree */ - add(detectedLightsTree, new GridBagConstraints( - 0, currentGridYIndex, 4, 1, 0, 0, GridBagConstraints.CENTER, + /* Detected entities trees */ + JScrollPane detectedLightsScrollPane = new JScrollPane(detectedLightsTree); + detectedLightsScrollPane.setPreferredSize(new Dimension(275, 350)); + add(detectedLightsScrollPane, new GridBagConstraints( + 0, currentGridYIndex, 2, 1, 0, 0, GridBagConstraints.CENTER, + GridBagConstraints.HORIZONTAL, insets, 0, 0)); + JScrollPane otherEntitiesScrollPane = new JScrollPane(otherEntitiesTree); + otherEntitiesScrollPane.setPreferredSize(new Dimension(275, 350)); + add(otherEntitiesScrollPane, new GridBagConstraints( + 2, currentGridYIndex, 2, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, insets, 0, 0)); currentGridYIndex++; @@ -593,9 +623,41 @@ private void buildLightsGroupsTree(Map>> lig } } + private void buildOtherEntitiesGroupsTree(List otherEntities) { + DefaultTreeModel model = (DefaultTreeModel)otherEntitiesTree.getModel(); + DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); + + root.removeAllChildren(); + model.reload(); + + for (HomePieceOfFurniture entity : otherEntities ) { + String entityName = entity.getName(); + String type = entityName.split("\\.")[0]; + + DefaultMutableTreeNode typeGroup = null; + for (int i = 0; i < root.getChildCount(); i++) { + if (root.getChildAt(i).toString().equals(type)) { + typeGroup = (DefaultMutableTreeNode)root.getChildAt(i); + break; + } + } + + if (typeGroup == null) { + typeGroup = new DefaultMutableTreeNode(type); + model.insertNodeInto(typeGroup, root, root.getChildCount()); + } + + typeGroup.add(new DefaultMutableTreeNode(generateLightEntityNode(entityName))); + } + + for (int i = 0; i < otherEntitiesTree.getRowCount(); i++) { + otherEntitiesTree.expandRow(i); + } + } + /* Method to open the new panel */ - private void openEntityOptionsPanel(String entityName) { - EntityOptionsPanel entityOptionsPanel = new EntityOptionsPanel(preferences, controller, entityName); + private void openEntityOptionsPanel(String entityName, boolean isLight) { + EntityOptionsPanel entityOptionsPanel = new EntityOptionsPanel(preferences, controller, entityName, isLight); entityOptionsPanel.displayView(this); }