From 48705e66705168b1d5d66508e24a0a55a2693a31 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 10 Aug 2020 22:28:05 +0300 Subject: [PATCH] Style viewer and styles resolution fix for proxies. --- .../vision/gdml/demo/GDMLAppComponent.kt | 39 +++-- .../mipt/npm/muon/monitor/server/MMServer.kt | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 + gradlew.bat | 1 + playground/src/jsMain/kotlin/PlayGroundApp.kt | 5 +- .../vision/bootstrap/MetaViewerComponent.kt | 87 ---------- .../vision/bootstrap/propertyEditor.kt | 49 ------ .../vision/bootstrap/visionPropertyEditor.kt | 45 +++++ .../dataforge/vision/react/ConfigEditor.kt | 16 +- .../hep/dataforge/vision/react/MetaViewer.kt | 157 ++++++++++++++++++ .../hep/dataforge/vision/react/styles.kt | 9 - .../kotlin/hep/dataforge/vision/StyleSheet.kt | 10 -- .../kotlin/hep/dataforge/vision/Vision.kt | 16 +- .../hep/dataforge/vision/VisionManager.kt | 2 +- .../editor/VisualObjectEditorFragment.kt | 1 - .../hep/dataforge/vision/solid/Proxy.kt | 18 +- .../dataforge/vision/solid/serialization.kt | 2 +- .../hep/dataforge/vision/solid/ConvexTest.kt | 6 +- .../dataforge/vision/solid/PropertyTest.kt | 1 - 21 files changed, 265 insertions(+), 205 deletions(-) delete mode 100644 ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/MetaViewerComponent.kt delete mode 100644 ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/propertyEditor.kt create mode 100644 ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/visionPropertyEditor.kt create mode 100644 ui/react/src/main/kotlin/hep/dataforge/vision/react/MetaViewer.kt delete mode 100644 ui/react/src/main/kotlin/hep/dataforge/vision/react/styles.kt diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt index c189b6b8..f6d7d016 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt @@ -7,7 +7,10 @@ import hep.dataforge.vision.Vision import hep.dataforge.vision.VisionGroup import hep.dataforge.vision.bootstrap.* import hep.dataforge.vision.gdml.toVision -import hep.dataforge.vision.react.* +import hep.dataforge.vision.react.component +import hep.dataforge.vision.react.flexColumn +import hep.dataforge.vision.react.objectTree +import hep.dataforge.vision.react.state import hep.dataforge.vision.solid.Solid import hep.dataforge.vision.solid.SolidGroup import hep.dataforge.vision.solid.specifications.Camera @@ -78,7 +81,7 @@ val GDMLApp = component { props -> classes.add("p-1") overflow = Overflow.auto } - gridColumn(3, maxSize= GridMaxSize.XL, classes = "order-2 order-xl-1") { + gridColumn(3, maxSize = GridMaxSize.XL, classes = "order-2 order-xl-1") { card("Load data") { fileDrop("(drag file here)") { files -> val file = files?.get(0) @@ -102,7 +105,7 @@ val GDMLApp = component { props -> } } - gridColumn(6, maxSize= GridMaxSize.XL, classes = "order-1 order-xl-2") { + gridColumn(6, maxSize = GridMaxSize.XL, classes = "order-1 order-xl-2") { //canvas (visual as? Solid)?.let { visual3D -> child(ThreeCanvasComponent::class) { @@ -118,7 +121,7 @@ val GDMLApp = component { props -> } } } - gridColumn(3, maxSize= GridMaxSize.XL, classes = "order-3") { + gridColumn(3, maxSize = GridMaxSize.XL, classes = "order-3") { container { //settings canvas?.let { @@ -127,25 +130,25 @@ val GDMLApp = component { props -> } } } - container { - namecrumbs(selected, "World") { selected = it } - } container { //properties - card("Properties") { - selected.let { selected -> - val selectedObject: Vision? = when { - selected == null -> null - selected.isEmpty() -> visual - else -> (visual as? VisionGroup)?.get(selected) - } - if (selectedObject != null) { - configEditor(selectedObject, default = selectedObject.getAllProperties(), key = selected) - } + namecrumbs(selected, "World") { selected = it } + selected.let { selected -> + val selectedObject: Vision? = when { + selected == null -> null + selected.isEmpty() -> visual + else -> (visual as? VisionGroup)?.get(selected) + } + if (selectedObject != null) { + visionPropertyEditor( + selectedObject, + default = selectedObject.getAllProperties(), + key = selected + ) } } } } } } -} \ No newline at end of file +} diff --git a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt index 2052ffe8..d1e637b4 100644 --- a/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt +++ b/demo/muon-monitor/src/jvmMain/kotlin/ru/mipt/npm/muon/monitor/server/MMServer.kt @@ -1,6 +1,7 @@ package ru.mipt.npm.muon.monitor.server +import hep.dataforge.meta.DFExperimental import hep.dataforge.vision.solid.SolidManager import io.ktor.application.Application import io.ktor.application.call @@ -28,6 +29,7 @@ import java.net.URI private val generator = Cos2TrackGenerator(JDKRandomGenerator(223)) +@OptIn(DFExperimental::class) fun Application.module() { val currentDir = File(".").absoluteFile environment.log.info("Current directory: $currentDir") diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 6447 zcmY*dbyQSczlH%shY+L(kQ}C6ise@?c@F%#`dE9xT=qM=Dm?$VxD1hrECD1a#01Q8o zMyT3}z+1K>hPE%4doH=x5X;^NP(OFD5GByp;5FQ^bpzkBa(;eudMu7Iyv$DE+N=>p z{3Y5_BP>F3)tXW*Styc(Ji3jnK-giGA_&42fsbZ@#+e+ly3w0VmLC;LA)h1UY(ChA zfwqQ?-@}@S93F|exOv;Se;P|SrYvEG(8q&|ltqvQHO9KgCSwM!Y+#d5eIRq$Mi`pU__N$FTxW@KAWIw= zayY6@9EyxG<_tr&{Wi87m5*mf=u&=;eL1gf{Mt)q8Drick8CcxzLW>cG~TbW)|$*D zYMc|5eZNNzt7O_C1LqgaI`Z0B+2#;3yO;E7N4oMY@~7$4;MRonU+Ca z#*cD!7$u9pZ|3f!-_6rpN}XhAWd`1qiR{e*1CJK1dvBsjUyY@BuT|;EAz}*0uSwT_ zq(g0jXTAK4wsQ>kIKEfRQZw^GIKNRZmV)b;c*Kpc?IvNuq{+eCM4%IBoRUk!JeJ4IVH!pLl+5gQn^$0Fw(WROw~SclOYWbMmvR+x&lYa zrU`5lck*s2zl;n6HEa_E|Btu!_BeeF8T=~0Z-pdJsKtN8nr88*8loznbI`@@8U-bc zCE&MaHH#?LN;6&wU%>->{X&6n*c6ECkP#Bn{lafo9KW+AKK>>f)YfzG#t`XCsl$WX zeS|50l&G{J6yrdD0#njv3|C}K(~azN%1+c#*-JXtZd=Rs-zr)f{Mneaqpgewz^3OM5FaDaH3?RpqMyL}=5sFu_zcDc^E~=$H zp`mutZ0ahrf32c`6ROBh&lI`>vuFJE*(NVpjr~^d53MZ0v$G#mHqBLpZ_=3?pNjHc zq`Dn6xbc32BSg`U@YE?)%%`LvRRWt@NnS4GSj=p><<_-c6l`myAJE0fSp^QbBfdS( zl>BC`;EiMtvPQ^FVSL|sjTc(?b%8Qt@%U>rt&`4_cYT+R`OvMomf#104S~4%y%G=i zSF$4cuIxlIe>@1E=sfXhVt@RqP-*grJnW~;iWiY{&Bqh7J|{vYQ!^1x4cnyGk6Wb9 zO0~}ejH&5@bEj&`2?Wl*cf=IV=$oa9rzh+#gN?j{IY z{cFM?b1*TT+&S2rOIFFvy{`FvX}_js+9rw1O*1ySv8Q}r2b0@*h|1Di0R1v* zVt4yRX`%ac3xeH;(y!FJ1wfX0u z(vEffdladd}+qfb##M5s|vX#V+!&>>0;o_Le@c)+7jDwJJ(9>+3CRkGH z##M)o)xY%3-ifK*iFpo7NiBT`wYVc=lYIZtKF{pxNfod2V)Ml&<=??l)7w5)Glopn z8#scqBz@^rE2-5aVDT_~Q#A7m4S6@B{QM6c_oY?)xk>z8r!qnbkvnqHoIRTMZijQ5 zv*ir-hjrA??C7S({;peDbjO+Kk0=tpoYQr7VQMJ*cR43?@CVMwg=}e<87k-T@wQ2`}bwe-}AAk?H=&0Yz~Zbk~bc>EP@tV zZ}M>Z2br)mwHOaQS1^~;AVlgQS(~eqTT3cQ)Jq8?bKk~$>tZSLgMW6sF{Os2*%OD^ z#@G{w=c@536Pgy5n{C*b?yf@Kd`v9zOG*56432l!^U3K)m1;qIzM*3ZS)XJnJ4THC z^e*Y&BQ)hyIA?LzXpqWK1`GN&gr?{?;qw?0wZ2-3WO3HI;)oY4YL?q5>F9QpzV?jw z%Ae1D+te?r(`vL~!tzayt@-830@#ZS)-KyoF0$s!Vw0Vud%!J!?moY0m8#gODn9F+ zY?TnBMwOKomVz60?|&V3HO!Z!cH+<9qbk>I-tT86n9=X9g`Zr=G+ zeJZH~&WtV__tcQ~B#c3;HnlwX+UoXIT>zqV;hho> zm(S|vbkcOsiPJd5fwJn%e%@Z(YNs#TqQ-MTQNPf9zDS)^#q=x)hn0wzK&7Tn_|BdK zx}|&Y!FqT|pVs!!ayLJ%C$M2LMR|s6aQ%QUi>oqMG=a-^oPaKfKR>DyX9dBV*%R!+ z%FvBF>KN67w@!4Lj7{*vhaGWkP344{vG@LFna%+6y+SB#;an8bz1SAoZg)%>it7$I$^*bWXoT6hbhk;!C7 z5tAKrT@VO5N!8a8G3=U4NL5yNqYdEsc2}2^o5ctj;Hrf0Dk~jL|srk z+XuB%H@ROKFqLw>LUu0bqRXw}B*R!OLo6|5*Q4|0dPlcG;>@4(_wZ})Yf&doH+L*RE=D|Z6RxTU#a|+qO_A4p z2U{|br!ER>QqRY>(awtH6L-S8zx$EeC$o;?KH-zEE{_f%M55>lLD!d9KbLpEyv&z3 zOD}@>1Exq4C9v6urtETRrtB>6m;qqJfh)6o@&+S>@D45s~ccePF=|y`U z-f~hKH|y8x$ovl1NJi3Qqom;ERzIG#^&!~fFQcyl0+H+;`yV@UyA|P*R^h1K*<8h{ zZqjSxw79HGC?HMzs;UY)%J2b0gXnQ=OY;dHMi3-zr7BZ6SnFxTu8VCoySbgs>l^A8 zmN&kvh~36=TRu2B!zInA7+dp6$aaef-&PgtbENZDyV(2Qh!`{>wDfZGw=1SFg*E{+ z#RVlY)C{0iP0+Q52$nQXhK{cVx<)i;=tyb=4mRyl7vX}F8Q%QL>_d6O7MM}r2)$$y+>m{$P8lbYz;fZ z3QWqj-`0^M+YpnVm!KE9$7?qn-uiDEF=*G=DW84fhX*c2c78!Mp!igEq_TE#1gLe8 zl$ro$nqM(yq&C?t-G#o9^eY1)Q9PX&YrAtOX|lboS9pTS>3XVy+T*%QF@Dx%R! zi~z%gEL!?kG{Q%?*cWYwt#5W}g>qQ?$$RX%E0(03W7ZERFNIOjpM5e?6J0JAro(i1 zsQeyE7G{}iSZNnP(n4FwvEp+ztGzd?jYx+(7Mk46X^c!>`oO7{i_yo>FV+t|SvS!} zBkOPHlUb!OPh1Y-8duD(b2u@P=5b8soW*+wnMY4Q8Eq!-L)~5b=n{68|ISew8k>Nt zjw!awOP?W8P1$OO`+#?*f{M(%*J)%E_^tKqR(nv#swuRijXecgwQacnz4TE8 z=2-p0u+VG&&^ePGuUHKIgI+h>XY*ZqAI5N*4Wc%8CXbXf57?Mpl#k^M=OHx26*X=b z@XIHOwsp{@XZ?Foo*@>FnvH!0EQsZ*BR?l&zm|TjE+bDiqA$Y2SY>Copx~1PHa4js z_!C`yon1&oi{Kr00~T|`DcYfvr^uu*F03OLS>^N@6Zi4VhFx(|WVY7whxD`RzX@{a zbt^j09cW#7p^J^3)}YLkrHR`G;mbL@W6__7SC=}Xh$OzjG!>tu=ubtG%LthmSDE)Y zfp>6T8@qS6C@y(<;eHyUqHzM9+%$!LWjRr*z1Qw1s?bAYrK7*KD*C^qP{W=T31H#9%+CXSZ;mJdIE6lN%IxBUk0hr5P})$QDM>4>ow%muHv z-zVTS+rI9+PV|%56*~qa^GKRWwz;dLtoUR%*1M}RGh$LcGlrHaAh-`>BW&!A6mvv( zo}57{BhH+Bqiza~XoxEIpXk_BGR8GzhcQwT4ND>~ahppmV*4SGve=@GE0zZGn}Z_l zMJ~Bi7prl4W<5m=nXZVtIYs=mwv2O*-UXG(Y9#Tfu8=c%NzSja+#d#gJ}FZhj)shN zMhx$^a#S-Ji`_niAxIQ^8YN)tqqJ!k5S_*BUFNY4F-4u9`G(W0v9;O*=f94+)C?7x zvYptQhDL9z*Ef*V5;DWma#Kwl4duDaGW=wP;`7wCjpnvd1`SO#b!fM0%!1J-u}iOT zS`t%%#@E|EzErxcRQ`fYJ)?gm)spx4eAd0@1P(T8Pr4n}5d$L~0>gytVD-^eF2bLx zW3i^+7-f{_=5Zq77xY&vCpL~@OTUZ`^myD;mRijH9fO>_Qdw^gurX%)NhZcgCIxgN z4yJcYrgaS}O8U(X^mwaTnrkxmt*ni+Cdmv>X$)_K4fl)^GtOUWQ~h>K$_^s;h!1Dw z*q&qAD_pNCM3lb9=U3Af`-?xuwb62P12trTb=MXKaYoNRHZPDJv9*`Aw)QF0Tb@g}XFL;| zdJF}(@e5r%*LCQBK*U(pdQRDeKE!)FF+}k{9Fz>A6zUP@OV+3DhvOQ zm{2a0QrQ^kn~?Df`@q(xA(yDoo!~Q+;;_*@_h(a`J~*mJkCa@npgsiRZAQ#pqSOZK z!muT4MNvG*<^MYIQN0h-W#UtDprj`i7Xxq=bTN{>rHH}V?ZdT~kd!O-X zt5JI4SH&YHnn(%JNKh$z*YZsO#t%LLA680?$^5V~dE8Pl^cPrXu++@2D?!)`KkPkM zE{Jaq+MNaAl)!{f!@ID?j@Fh)p!zU~?G%ODNge-447;DM8a%=PGRAB#D&LD5-=atG zY9Y3SF$2Xq8v`e8Rvmy3(wxGi--=L0eqRV6KFsU+waZV(WuPT00CKK)a--{eLpmBy zcXLs^*FtPQfeF;&p!YXTs3p9?U8Q0nzxqE+bM#Y7^_TmK zsw$bo4WCokyvS6N_0(KUJ2!8X|5~{<8pDd7rDt;^sCOx&=RxoN<`o-B}EwumojPl2bzq!x}k%%W5t9nTM1xeXi zQv;z_icyd<$#$rBJk9nk)8!h|c`$y~+NUVUGMRKk0aIBHQxP%YPu#d}ntgv1C_my; zpbt9K?YSK7jR%!jIUz+E3dnfbRMkv&7^h$B&oh5Ae2U{ka*7&~Z|XGk#69p1c_G1FC{&L1hn#)ZCmqpbHXC6uk;Obwn7kSJKaZ`H?u#%dz%W!fJP&`<51T`RomXjQ_%* zZ6iKVWhSW(o;7GYUuAwQxLzZTMt^H4@rorBp`tprXq9xsaKz)V<&_~zzsbGC#J2xC zQqiFYS<^~7D^Pcs?HzZm78=|`Ql?|`KIZR%#&qOMAEpStCrEMl8R0iZLR|#8%!;8p z0VGG*J(7WAxG~ij`ISsxDD--ge}1Dh3vAj>!wtQtec=#YCHNFKz$`Il6fa~c`rYYD z(xqyH;ETfFb?fK!?^*s3`))*65xs|5*^u3Snz(6t59|0kESGze=0W7f>LL{K_sC3& z*ardr??S+*s+p>{8sni`20|xZQ#^D^AQTjp`=*)izGeFN$qoSHK6K7(lg#A*T_gM( zK|#q5@BmyU)j&wqjB*=s29ufgV)YL%VJRV>@1p)anJxE7WkARdZ36Lb~f2b6Q zlm7uK{1gU}2|U1INlYN^Cl9Dh;{WL3PjQf^)PE=rpfSw?($jsQrq#T^it69uKY15Tb~K=hm} zh{fw3iUZN>cmUlz1T^;!pw6KHjOL|4uKo}3i|5k^cjn$5g+E9&YZL(c0t7^Yyr*;k z{39mNJB|kkA^-oNpr8j6hJ*m~3oM}A&ow%Xk22_5P%a?j<^aqv(ILmiH2Q>4Owl^89`~3rMHp zp3(w1Yh0kR@38~4fWByT)-r6kJki5KxqsSQ->5QD8+n7Lblrq&rqbQu<4GcZbwU*DehL0!uF< zAtALa2-nN~-E+^Kf9CT%^Pcydcg~!dGjHY)VIP{X+Mk5X+Z1~yNkl;K;}!vd91tr< z3$)!P0ZK`15GdXAY=~6eS|ICMe*_|EtvP9boO{_-?eWIq(~Zo-^Ni?kUPq%Frv%84 zr)oV1Do+g^<-_H;g&&6jZW30jA}03FK{ok6%fnpg;T?i6z?Ni4>j&X84{fZopFMV_ zPgq3;2ochOBOr>*RYtVW6qFYa2RCa+Rij=CocWr`A#j^WVQcy=l`bl)`?rJh=2@6e z5{>%T3cj@IohTK=HSz{HCTuU>e9Jdy(opO40;jY>4CYhDaoW$2zlNl%@5(Qiu=y0y zcPW^JHHod;>lqb~jFKYaMy2xYMtqcZ)tr_RM@6k9lIwWE8QrU-RZ^X=V;RcRRkvfh zd1>Ux5k>B6Zog!6HSDMhQY$F;vke(i*FG4;(;LQ}mHEaN8B^s8K(WGkdBU85Nh-nw z3TtcD!M5Wr+_o`vA0(6W&{4w4+nrWDTW1^{ z`epH{pQuSybd8I*sYD3SJ~2ag z)Yl_lSuF&Mbw4X`D?Zu`D`om|Xx`05WdlZ9t=JoV-6wy-R)lz9Vmu3c>A*fG30~0(?uQ5FkJ%zGK6$qDU~&hJ-V3Gc6s?!hhw*e)&1k)r=FnmzLWcywDn{+ksed*I9(B{*s3K(%lJ)U)|9X0a^E2 z?>RlLCvy+s4faLC0}D1!+cYzr%>h-s0|&9TBc1a9Zj|0mYS(5 zrQ~xRl7za1>q_E^{8c1q74LqFM-}HUQKs z-HX=BqDsXVjC!$_)l0!SF$o_V=RXM+z&V&q6#jU#AuF*Ji7|_5#Z1IhRaGYUxFADf zpXVNXi^mIuN^VZCEy?r%N`o=v9TuU`3mG^fHWsJ7ia5E@h3U;R^8nN0<6mS@yNZ|*5X zjEnxhb4H)?Mxy|QSTBrESL0adG6`arE$lH-Quq8IpQfLyXQ6-~q4$o-rhCpAt($tI zaQa-ZZM^S!;$?}%kABf#XFUWGO|RZjOJYN?9`~l2FNCPG(y>&9>G2l#+5fWW;j7y+ zQId*;#2h|q8>}2c^sysZFYgKl&gLAc8b;;_h%M^v5(yp^hO`DU#mFTN zZo|S}wZuF&o_J(DA!5AX>d=y}Iw7%z*yBr$?F*l*`ncP=hjAJ8zx2t%b$OWhk#*>L zp`+b!2vJ%5!5Pm;TXyhUy>17398}g9$AA1ssrPvPv44N`QtuuEE{>Jfe<@nFgB5?k zeEE{>t*#8BJh%#1a}!~{TtS;f#A-UQO!fR1zuQA~$WHb8_sW<`I zOQt1l>b3%|CE-m#+H%q)ASiMAt&ke3SnvD{cC0Ff;U-w5o;8ioQdl~qkLfEQ-TaIu~%rf%rG#UXd z#FXb(La?+7@`V^U+FMI3**T4yDFF#ZXU;?IM6Bw#p@kx86Xq&q-1cybR(211`S}V* znO%<4o*ixUE0Pbh+Yz&y$*tl-EYXj4#@j5-Wj6CQ7slhaV>Bq)HZf-lb{<_}t>aYl z&=`I3F_+?^Q~lAB&dSS|O^qS%5er4X>)d^YqM{p>F_t3F+O*!(aZ;%_yJJ}DE$sT^ zD?V+F1o)k|;MJA7`df*pD~TA{i+^wLEi5h3gr(29e5~cw@g{21H}^GSsQD@#%k03a zK9?s{0JjBaTq z%7|3eul{k|8$TQf8qMtCiY(ub>dVMH!d3$^aEg9r8e~r>3sXIyah&#Of9~35eqFVQ>knQg8ZBr~gYpRT*COY|4$vZssNa2NxUeYfsm!1qND_;I$wR~eah0d%+M7?x^JA+$)Ce~Rg zeqN7OxBK8sNnuySGL7AXp>`pLB^Uz@)H+Fq#6*xz^WQ%C8FYh2c}ibM$objs+y-d? zrX=r$2HB8GQAT(a-w^I+Es60?fl37;e}5$RjTuFMKXp%mne_VmrD+=0@u#&VHEO>T z0+aDh{lgzr?z>~c5JWEZg`onQ5xvC~Pg`I34~`FcnLIpC<-1wExH5^!-;y8S-GaK$ zqV%<$D)?4;qGGHu8a=-ztvXSqxh#zCt;e8A_h?gwd4CR;I%At`%CO^gi0;$9($Z`nsRqjuU6#in|WCc2vnFl7_u}-ps18Z*4Id%R4g&)zX z=u-}T0Ym3Y-i-H&S?xF}yw?AdonDV+mwfb*odRY)h;UL3);X$Jjcc$Zn&D^A3CtT} z(yDV3RddXi$VJUPVhedH^S0)1&)Bbgt@+Paok?^h;$k*W0Cbh`vG2mpVU2}c99a5HuH!aSi! z`nGbfL^TymSO0$QBNCccZm*uW{Nh09Z~MGCeOOU2RMqHJ-N&DuF-2n_ObxbNZG*JV zbI(4ArNKZ@CUt-@eo_k@7Mxy(MarP*DVP^#5Z;ZCqEYjzxIeI@q|R4zFEvIRGSVU% z$duRe?0xKK+(*?VWjN^l{Is8>%$ zZ+M=HCS<3MQ`&8i7~}*7hNPrD|Jpj|yihO~({IdOBM?%{!ygU%^BJyBmS%6`!UkVo zL^v<&C;4Th7tx1l!)WXNrYFSMljXe=FPsxEl#gW6l0I%9R?<>^G5~ze5H_V;gf+ny zkoSHZ-~~LeKBBjvGOTE0$zT3w3P}2At4ce)1Y^c=mw9(lJ+3FzO|?53ToOlD?jbsQ z5vy<+b*YLnYm1m9*uo+Hv$3$6AsTswxYOo$!QDU1@_I;r+|0PE$m%;+gL_=h`{M0G z<%5f$DRD1rkyN$KcaWOd?Z>Vcr0Itq->o9Q2%tOr{?NT>&{g$V>kWg|J-0^vg*>mq zXDCk~jYn^7od`Ep|5+kxII7RTuS?Tx=nETO{85~G=6slBjlci%kz`5LkHx;b8HlZh zw*1dWnq*D}N{}lP?*^3Sl#PuDO{Q#n_};J|DU39cPe7s2pX@nCXO~n(FReYqJ3s!S zxpR+QJYxy(_V`@?XTfn8#(w-Z6!{lnk#x%5?42|OsX85_8tK`R_Ov3I#G8T%~|m5^dSLk z=E+zY@@x=EdFQ?R+(^!|Odf9!syD1W>9@W&hWlp@K0RyhEXqPgul#0a-Iymp?(Z8+ zedpt^fW(v;4&6%_BXA z4ML%iVq3UBLjtrypnLM(5fbb$$>*yu%nuPX34Rq^>h*W~m(1Af3XeCtwBOBnb(dcg z+c1f(KCz$tT8{k$O(PYvpV-y?HCzAn)o{Gqea*A+gt|&S*q!p*I7C$ro)~UpMuq~z zD|2*bHB0PErq1`Q`F1;cdmrI%ATwI3T;F3jc(Op`_q zG9GZ(b!$5`zCYFbU0gY*arcOL7%Z11HI8N< zcq<&EOTU~%Z3Q#_Ew?K+2p9%*Mv-*1Nf&fk%@LxhKX;1l5O|Iu>j}ovw{mq96>@dX zRyxG|0z=J$nFIqD!E-Q&?67!glaAo1mOtCUh7{Ar?dWVzC&DU-cGcQD zdZs=K!wc!qJbJ4aoRX@L zBRa?Q9N7R5#0tl=(2)H*61@~nW?QcNN)aonJBtDj!>d+B8l-Vjc1vu()AGLsOg;z= z3z>Lgn+88SWz5<$r*2$j5F6$glpX51lvo`8iT|m8vPVVVa|jx z&hfX2>kf%tAM?<=>xP+`#7lZs61$5|7J_%%!KyPj!t#T}j$H#+@?leTQwL&WsN$BN zuXS}6RGLD|V8HiN%M-zT^@+Hmns8IP+?%IVh@_upzIr!I+-a7r=-%NBXw*Op0`LK3 zG5fdG`C@Axy?d+8VQLq(qkUTD+FNVrN5Q|J6R&jh2Lv)Ole+5pGloEZZQ79>m7YGM zSPJ1GRDQtW?r9jb{g**e3Mr>PHrRWagZ|ku4kjL;JOdL~Id05kc*CA+ui@= zieS-e>hskR-1I9Sx7b4i6p>2LP#vgtG6;8vGL>E3$NPQ$J2r~XGQDNg;Sw=& zC}lz+3@Sq%I2q-97R&9|8Ij2^?^DGQK_oiqZS2$!-rzVqn=~d~TS{n&I+svxt4dWO zT?K0)JEx>9E7saW8h!5+MmAkC`g~v*@ z6VKn0>eZdon>BH(O$mACnxk3D?vSlCFFnvZ#+&hUs)Wr!aP{<@|oc^G>bJk59^xhmz!RA%|K_$o)V`D@gVs>@bSmXVID_PQXp znfja8U01+t3V!o{8ZKi~G@#q$KrAH-Ks3$G{Qo}H|N1ijJMsgZDgOmM1O$Fi0>0CX zpbAzXhYbP@PV;~=*nn7eQGjoT2b9nGFNg-PpHT$a@?7JL7I&pmkmclS7#Y#zRYg_`D0h47O z&|%88tXNh8{Yk$@@*HA-B9r#tDkY$>!U#Ie`j1TupjRn@;(ykyyld-zJ{@qm!UG~I zxR#ZxV8CEi5JXV?ANc~bS9*;MYtkTvifc5iynmg!XpIr%SN*R#E?|3&2QVs~N02d=N!1;GdfNGr)gc$|K#-y*M=Ra9B4#cmk-naoQuS*cWnE3C4 F{|nTN-B$nr diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b44297..bb8b2fc2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d..fbd7c515 100644 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9c..5093609d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -84,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% diff --git a/playground/src/jsMain/kotlin/PlayGroundApp.kt b/playground/src/jsMain/kotlin/PlayGroundApp.kt index 3b8a04a4..ea95c926 100644 --- a/playground/src/jsMain/kotlin/PlayGroundApp.kt +++ b/playground/src/jsMain/kotlin/PlayGroundApp.kt @@ -1,8 +1,7 @@ import hep.dataforge.context.Global import hep.dataforge.js.Application import hep.dataforge.js.startApplication -import hep.dataforge.names.Name -import hep.dataforge.vision.bootstrap.visualPropertyEditor +import hep.dataforge.vision.bootstrap.visionPropertyEditor import hep.dataforge.vision.react.objectTree import hep.dataforge.vision.solid.Point3D import hep.dataforge.vision.solid.SolidGroup @@ -41,7 +40,7 @@ private class PlayGroundApp : Application { threeCanvas(obj) } div("col-3") { - visualPropertyEditor(Name.EMPTY, obj) + visionPropertyEditor(obj) } } } diff --git a/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/MetaViewerComponent.kt b/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/MetaViewerComponent.kt deleted file mode 100644 index d4809611..00000000 --- a/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/MetaViewerComponent.kt +++ /dev/null @@ -1,87 +0,0 @@ -package hep.dataforge.vision.bootstrap - -import hep.dataforge.meta.Meta -import hep.dataforge.meta.MetaItem -import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.names.NameToken -import kotlinx.html.classes -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import react.* -import react.dom.* - -interface MetaViewerProps : RProps { - var name: NameToken - var meta: Meta - var descriptor: NodeDescriptor? -} - - -interface TreeState : RState { - var expanded: Boolean -} - -@Deprecated("To be replaced by react functional component") -class MetaViewerComponent : RComponent() { - - override fun TreeState.init() { - expanded = false - } - - private val onClick: (Event) -> Unit = { - setState { - expanded = !expanded - } - } - - override fun RBuilder.render() { - div("d-inline-block text-truncate") { - if (props.meta.items.isNotEmpty()) { - span("tree-caret") { - attrs { - if (state.expanded) { - classes += "tree-caret-down" - } - onClickFunction = onClick - } - } - } - label("tree-label") { - +props.name.toString() - } - ul("tree") { - props.meta.items.forEach { (token, item) -> - //val descriptor = props. - li { - when (item) { - is MetaItem.NodeItem -> { - child(MetaViewerComponent::class) { - attrs { - name = token - meta = item.node - descriptor = props.descriptor?.nodes?.get(token.body) - } - } - } - is MetaItem.ValueItem -> { - div("row") { - div("col") { - label("tree-label") { - +token.toString() - } - } - div("col") { - label { - +item.value.toString() - } - } - } - } - } - } - } - } - } - } - -} \ No newline at end of file diff --git a/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/propertyEditor.kt b/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/propertyEditor.kt deleted file mode 100644 index d51375ee..00000000 --- a/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/propertyEditor.kt +++ /dev/null @@ -1,49 +0,0 @@ -package hep.dataforge.vision.bootstrap - -import hep.dataforge.meta.Meta -import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.names.Name -import hep.dataforge.names.isEmpty -import hep.dataforge.vision.Vision -import hep.dataforge.vision.react.configEditor -import org.w3c.dom.Element -import react.RBuilder -import react.dom.li -import react.dom.nav -import react.dom.ol -import react.dom.render -import kotlin.collections.set - -fun RBuilder.visualPropertyEditor( - path: Name, - item: Vision, - descriptor: NodeDescriptor? = item.descriptor, - default: Meta? = null -) { - card("Properties") { - if (!path.isEmpty()) { - nav { - attrs { - attributes["aria-label"] = "breadcrumb" - } - ol("breadcrumb") { - path.tokens.forEach { token -> - li("breadcrumb-item") { - +token.toString() - } - } - } - } - } - configEditor(item, descriptor, default) - } -} - -fun Element.visualPropertyEditor( - path: Name, - item: Vision, - descriptor: NodeDescriptor? = item.descriptor, - default: Meta? = null -) = render(this) { - this.visualPropertyEditor(path, item, descriptor, default) -} \ No newline at end of file diff --git a/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/visionPropertyEditor.kt new file mode 100644 index 00000000..0c46e386 --- /dev/null +++ b/ui/bootstrap/src/main/kotlin/hep/dataforge/vision/bootstrap/visionPropertyEditor.kt @@ -0,0 +1,45 @@ +package hep.dataforge.vision.bootstrap + +import hep.dataforge.meta.Meta +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.vision.Vision +import hep.dataforge.vision.react.configEditor +import hep.dataforge.vision.react.metaViewer +import hep.dataforge.vision.resolveStyle +import org.w3c.dom.Element +import react.RBuilder +import react.dom.render + +fun RBuilder.visionPropertyEditor( + item: Vision, + descriptor: NodeDescriptor? = item.descriptor, + default: Meta? = null, + key: Any? = null +) { + card("Properties") { + configEditor(item, descriptor, default, key) + } + val styles = item.styles + if(styles.isNotEmpty()) { + card("Styles") { + accordion("styles") { + styles.forEach { styleName -> + val style = item.resolveStyle(styleName) + if (style != null) { + entry(styleName) { + metaViewer(style) + } + } + } + } + } + } +} + +fun Element.visionPropertyEditor( + item: Vision, + descriptor: NodeDescriptor? = item.descriptor, + default: Meta? = null +) = render(this) { + visionPropertyEditor(item, descriptor, default) +} \ No newline at end of file diff --git a/ui/react/src/main/kotlin/hep/dataforge/vision/react/ConfigEditor.kt b/ui/react/src/main/kotlin/hep/dataforge/vision/react/ConfigEditor.kt index 9331f581..712d3b60 100644 --- a/ui/react/src/main/kotlin/hep/dataforge/vision/react/ConfigEditor.kt +++ b/ui/react/src/main/kotlin/hep/dataforge/vision/react/ConfigEditor.kt @@ -113,7 +113,7 @@ private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) { css { +TreeStyles.tree } - val keys = buildSet { + val keys = buildSet { (descriptorItem as? NodeDescriptor)?.items?.keys?.forEach { add(NameToken(it)) } @@ -121,7 +121,7 @@ private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) { defaultItem?.node?.items?.keys?.let { addAll(it) } } - keys.forEach { token -> + keys.filter { !it.body.startsWith("@") }.forEach { token -> styledLi { css { +TreeStyles.treeItem @@ -145,7 +145,6 @@ private fun RFBuilder.configEditorItem(props: ConfigEditorItemProps) { styledDiv { css { +TreeStyles.treeLeaf -// justifyContent = JustifyContent.flexEnd } styledDiv { css { @@ -238,13 +237,4 @@ fun RBuilder.configEditor( descriptor: NodeDescriptor? = obj.descriptor, default: Meta? = null, key: Any? = null -) { - child(ConfigEditor) { - attrs { - this.key = key?.toString() ?: "" - this.root = obj.config - this.descriptor = descriptor - this.default = default - } - } -} +) = configEditor(obj.config,descriptor, default, key) diff --git a/ui/react/src/main/kotlin/hep/dataforge/vision/react/MetaViewer.kt b/ui/react/src/main/kotlin/hep/dataforge/vision/react/MetaViewer.kt new file mode 100644 index 00000000..e5a628b4 --- /dev/null +++ b/ui/react/src/main/kotlin/hep/dataforge/vision/react/MetaViewer.kt @@ -0,0 +1,157 @@ +package hep.dataforge.vision.react + +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.descriptors.ItemDescriptor +import hep.dataforge.meta.descriptors.NodeDescriptor +import hep.dataforge.meta.descriptors.defaultItem +import hep.dataforge.meta.descriptors.get +import hep.dataforge.meta.get +import hep.dataforge.names.Name +import hep.dataforge.names.NameToken +import hep.dataforge.names.plus +import kotlinx.html.js.onClickFunction +import org.w3c.dom.events.Event +import react.* +import react.dom.a +import styled.* + +interface MetaViewerProps : RProps { + /** + * Root meta + */ + var root: Meta + + /** + * Full path to the displayed node in [root]. Could be empty + */ + var name: Name + + /** + * Root descriptor + */ + var descriptor: NodeDescriptor? +} + +private val MetaViewerItem: FunctionalComponent = component { props -> + metaViewerItem(props) +} + +private fun RFBuilder.metaViewerItem(props: MetaViewerProps) { + var expanded: Boolean by state { true } + val item = props.root[props.name] + val descriptorItem: ItemDescriptor? = props.descriptor?.get(props.name) + val actualItem = item ?: descriptorItem?.defaultItem() + + val token = props.name.last()?.toString() ?: "Meta" + + val expanderClick: (Event) -> Unit = { + expanded = !expanded + } + + when (actualItem) { + is MetaItem.NodeItem -> { + styledDiv { + css { + +TreeStyles.treeLeaf + } + styledSpan { + css { + +TreeStyles.treeCaret + if (expanded) { + +TreeStyles.treeCaredDown + } + } + attrs { + onClickFunction = expanderClick + } + } + styledSpan { + css { + +TreeStyles.treeLabel + if (item == null) { + +TreeStyles.treeLabelInactive + } + } + +token + } + } + if (expanded) { + styledUl { + css { + +TreeStyles.tree + } + val keys = buildSet { + (descriptorItem as? NodeDescriptor)?.items?.keys?.forEach { + add(NameToken(it)) + } + actualItem.node.items.keys.let { addAll(it) } + } + + keys.filter { !it.body.startsWith("@") }.forEach { token -> + styledLi { + css { + +TreeStyles.treeItem + } + child(MetaViewerItem) { + attrs { + this.key = props.name.toString() + this.root = props.root + this.name = props.name + token + this.descriptor = props.descriptor + } + } + //configEditor(props.root, props.name + token, props.descriptor, props.default) + } + } + } + } + } + is MetaItem.ValueItem -> { + styledDiv { + css { + +TreeStyles.treeLeaf + } + styledDiv { + css { + +TreeStyles.treeLabel + } + styledSpan { + css { + if (item == null) { + +TreeStyles.treeLabelInactive + } + } + +token + } + } + styledDiv { + a { + +actualItem.value.toString() + } + } + } + } + } +} + +val MetaViewer = component { props -> + child(MetaViewerItem) { + attrs { + this.key = "" + this.root = props.root + this.name = Name.EMPTY + this.descriptor = props.descriptor + } + } +} + +fun RBuilder.metaViewer(meta: Meta, descriptor: NodeDescriptor? = null, key: Any? = null) { + child(MetaViewer) { + attrs { + this.key = key?.toString() ?: "" + this.root = meta + this.descriptor = descriptor + } + } +} diff --git a/ui/react/src/main/kotlin/hep/dataforge/vision/react/styles.kt b/ui/react/src/main/kotlin/hep/dataforge/vision/react/styles.kt deleted file mode 100644 index 5a3a7576..00000000 --- a/ui/react/src/main/kotlin/hep/dataforge/vision/react/styles.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hep.dataforge.vision.react - -import styled.StyleSheet - - -class MainStyle: StyleSheet("main", true){ - - -} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt index 4dfb28d1..1ff736c9 100644 --- a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt @@ -5,7 +5,6 @@ package hep.dataforge.vision import hep.dataforge.meta.* import hep.dataforge.names.Name import hep.dataforge.names.asName -import hep.dataforge.values.asValue import kotlinx.serialization.* import kotlinx.serialization.builtins.MapSerializer import kotlinx.serialization.builtins.serializer @@ -90,15 +89,6 @@ class StyleSheet private constructor(private val styleMap: MutableMap - get() = properties?.get(Vision.STYLE_KEY).stringList - set(value) { - setItem(Vision.STYLE_KEY,value.map { it.asValue() }.asValue()) - } - /** * Add style name to the list of styles to be resolved later. The style with given name does not necessary exist at the moment. */ diff --git a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/Vision.kt b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/Vision.kt index 8af6989b..1b8bcabd 100644 --- a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/Vision.kt @@ -5,6 +5,7 @@ import hep.dataforge.names.Name import hep.dataforge.names.asName import hep.dataforge.names.toName import hep.dataforge.provider.Type +import hep.dataforge.values.asValue import hep.dataforge.vision.Vision.Companion.TYPE import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.Transient @@ -56,13 +57,22 @@ interface Vision : Configurable { */ fun removeChangeListener(owner: Any?) + /** + * List of names of styles applied to this object. Order matters. Not inherited. + */ + var styles: List + get() = properties[STYLE_KEY].stringList + set(value) { + setItem(STYLE_KEY,value.map { it.asValue() }.asValue()) + } + companion object { - const val TYPE = "visual" + const val TYPE = "vision" val STYLE_KEY = "@style".asName() - private val VISUAL_OBJECT_SERIALIZER = PolymorphicSerializer(Vision::class) + private val VISION_SERIALIZER = PolymorphicSerializer(Vision::class) - fun serializer() = VISUAL_OBJECT_SERIALIZER + fun serializer() = VISION_SERIALIZER } } diff --git a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt index 4bebd56a..6bf7291c 100644 --- a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt @@ -84,7 +84,7 @@ class VisionManager(meta: Meta) : AbstractPlugin(meta) { } fun buildVision(meta: Meta): Vision { - val type = meta["type"].string ?: SimpleVisionGroup.serializer().descriptor.serialName + val type = meta["type"].string ?: Vision.serializer().descriptor.serialName val form = forms.values.find { it.name.toString() == type } ?: error("Could not resolve a form for type $type") return form.buildVision(meta, visionSerialModule) } diff --git a/visionforge-core/src/jvmMain/kotlin/hep/dataforge/vision/editor/VisualObjectEditorFragment.kt b/visionforge-core/src/jvmMain/kotlin/hep/dataforge/vision/editor/VisualObjectEditorFragment.kt index 846fad14..7da6885d 100644 --- a/visionforge-core/src/jvmMain/kotlin/hep/dataforge/vision/editor/VisualObjectEditorFragment.kt +++ b/visionforge-core/src/jvmMain/kotlin/hep/dataforge/vision/editor/VisualObjectEditorFragment.kt @@ -6,7 +6,6 @@ import hep.dataforge.meta.descriptors.NodeDescriptor import hep.dataforge.meta.update import hep.dataforge.vision.Vision import hep.dataforge.vision.resolveStyle -import hep.dataforge.vision.styles import javafx.beans.binding.Binding import javafx.beans.property.SimpleObjectProperty import javafx.scene.Node diff --git a/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/Proxy.kt b/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/Proxy.kt index 463434cc..53d65b0a 100644 --- a/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/Proxy.kt +++ b/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/Proxy.kt @@ -2,12 +2,10 @@ package hep.dataforge.vision.solid -import hep.dataforge.meta.Config -import hep.dataforge.meta.Laminate -import hep.dataforge.meta.MetaItem +import hep.dataforge.meta.* import hep.dataforge.meta.descriptors.NodeDescriptor -import hep.dataforge.meta.get import hep.dataforge.names.* +import hep.dataforge.values.asValue import hep.dataforge.vision.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -89,6 +87,12 @@ class Proxy private constructor( //override fun findAllStyles(): Laminate = Laminate((styles + prototype.styles).mapNotNull { findStyle(it) }) + override var styles: List + get() = properties[Vision.STYLE_KEY].stringList + prototype.styles + set(value) { + setItem(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) + } + override val descriptor: NodeDescriptor? get() = prototype.descriptor @@ -147,6 +151,12 @@ class Proxy private constructor( Laminate(properties, allStyles, prototype.getAllProperties(), parent?.getAllProperties()) + override var styles: List + get() = properties[Vision.STYLE_KEY].stringList + prototype.styles + set(value) { + setItem(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) + } + override val descriptor: NodeDescriptor? get() = prototype.descriptor } diff --git a/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/serialization.kt b/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/serialization.kt index ba672093..0b0a4d0b 100644 --- a/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/serialization.kt +++ b/visionforge-solid/src/commonMain/kotlin/hep/dataforge/vision/solid/serialization.kt @@ -123,7 +123,7 @@ internal object PrototypesSerializer : KSerializer { fun Vision.stringify(): String = SolidManager.jsonForSolids.stringify(Vision.serializer(), this) @OptIn(DFExperimental::class) -fun Vision.Companion.parseJson(str: String) = SolidManager.jsonForSolids.parse(Vision.serializer(), str).also { +fun Vision.Companion.parseJson(str: String) = SolidManager.jsonForSolids.parse(serializer(), str).also { if(it is VisionGroup){ it.attachChildren() } diff --git a/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/ConvexTest.kt b/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/ConvexTest.kt index 8dc87500..0afb5a7c 100644 --- a/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/ConvexTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/ConvexTest.kt @@ -1,13 +1,11 @@ package hep.dataforge.vision.solid -import hep.dataforge.meta.MetaItem -import hep.dataforge.meta.getIndexed -import hep.dataforge.meta.node -import hep.dataforge.meta.toMetaItem +import hep.dataforge.meta.* import kotlin.test.Test import kotlin.test.assertEquals class ConvexTest { + @OptIn(DFExperimental::class) @Suppress("UNUSED_VARIABLE") @Test fun testConvexBuilder() { diff --git a/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/PropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/PropertyTest.kt index efa9e1a0..48c7ec9d 100644 --- a/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/PropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/hep/dataforge/vision/solid/PropertyTest.kt @@ -3,7 +3,6 @@ package hep.dataforge.vision.solid import hep.dataforge.meta.int import hep.dataforge.meta.set import hep.dataforge.names.asName -import hep.dataforge.vision.styles import hep.dataforge.vision.useStyle import kotlin.test.Test import kotlin.test.assertEquals