Просмотр исходного кода

app/menu: add new icons / shapes for channel and contact button

media 4 дней назад
Родитель
Сommit
17e4310b36

+ 828 - 0
bin/app/data/menu.obj

@@ -0,0 +1,828 @@
+# Blender 5.1.2
+# www.blender.org
+mtllib menu.mtl
+o Curve.004
+v 0.581867 0.000000 -0.013432
+v 0.313193 0.000000 -0.013432
+v 0.013136 0.000000 -0.344343
+v 0.013519 0.000000 -0.346639
+v 0.016237 0.000000 -0.361322
+v 0.019127 0.000000 -0.376372
+v 0.022214 0.000000 -0.391744
+v 0.025522 0.000000 -0.407392
+v 0.029077 0.000000 -0.423267
+v 0.032904 0.000000 -0.439325
+v 0.037027 0.000000 -0.455518
+v 0.041472 0.000000 -0.471801
+v 0.046264 0.000000 -0.488125
+v 0.051427 0.000000 -0.504446
+v 0.056986 0.000000 -0.520717
+v 0.062967 0.000000 -0.536890
+v 0.068387 0.000000 -0.552019
+v 0.074087 0.000000 -0.567070
+v 0.080073 0.000000 -0.582054
+v 0.086350 0.000000 -0.596982
+v 0.092926 0.000000 -0.611866
+v 0.099804 0.000000 -0.626716
+v 0.106993 0.000000 -0.641544
+v 0.114496 0.000000 -0.656360
+v 0.122321 0.000000 -0.671177
+v 0.130472 0.000000 -0.686005
+v 0.138956 0.000000 -0.700855
+v 0.147779 0.000000 -0.715738
+v 0.147806 0.000000 -0.715783
+v 0.147881 0.000000 -0.715908
+v 0.147994 0.000000 -0.716097
+v 0.148136 0.000000 -0.716333
+v 0.148297 0.000000 -0.716602
+v 0.148468 0.000000 -0.716886
+v 0.148639 0.000000 -0.717170
+v 0.148800 0.000000 -0.717439
+v 0.148942 0.000000 -0.717675
+v 0.149055 0.000000 -0.717864
+v 0.149130 0.000000 -0.717989
+v 0.149157 0.000000 -0.718034
+v 0.745979 0.000000 -0.718034
+v 0.747357 0.000000 -0.715738
+v 0.756180 0.000000 -0.700837
+v 0.764664 0.000000 -0.685972
+v 0.772816 0.000000 -0.671131
+v 0.780640 0.000000 -0.656303
+v 0.788144 0.000000 -0.641477
+v 0.795332 0.000000 -0.626639
+v 0.802211 0.000000 -0.611780
+v 0.808786 0.000000 -0.596886
+v 0.815064 0.000000 -0.581946
+v 0.821050 0.000000 -0.566949
+v 0.826749 0.000000 -0.551884
+v 0.832169 0.000000 -0.536737
+v 0.838133 0.000000 -0.520599
+v 0.843678 0.000000 -0.504358
+v 0.848829 0.000000 -0.488061
+v 0.853610 0.000000 -0.471755
+v 0.858048 0.000000 -0.455488
+v 0.862165 0.000000 -0.439306
+v 0.865988 0.000000 -0.423256
+v 0.869540 0.000000 -0.407386
+v 0.872847 0.000000 -0.391742
+v 0.875933 0.000000 -0.376372
+v 0.878823 0.000000 -0.361321
+v 0.881541 0.000000 -0.346639
+v 0.881548 0.000000 -0.346594
+v 0.881569 0.000000 -0.346469
+v 0.881601 0.000000 -0.346280
+v 0.881640 0.000000 -0.346044
+v 0.881685 0.000000 -0.345775
+v 0.881732 0.000000 -0.345491
+v 0.881780 0.000000 -0.345207
+v 0.881824 0.000000 -0.344938
+v 0.881864 0.000000 -0.344702
+v 0.881895 0.000000 -0.344513
+v 0.881916 0.000000 -0.344388
+v 0.881924 0.000000 -0.344343
+v 0.880393 0.000000 -0.342583
+v 0.396015 0.000000 -0.022845
+v 0.499121 0.000000 -0.022845
+v 0.511582 0.000000 -0.023282
+v 0.523905 0.000000 -0.024581
+v 0.536051 0.000000 -0.026725
+v 0.547977 0.000000 -0.029696
+v 0.559643 0.000000 -0.033475
+v 0.571007 0.000000 -0.038045
+v 0.582028 0.000000 -0.043389
+v 0.592665 0.000000 -0.049488
+v 0.602877 0.000000 -0.056325
+v 0.612623 0.000000 -0.063882
+v 0.621860 0.000000 -0.072140
+v 0.630549 0.000000 -0.081083
+v 0.634101 0.000000 -0.084998
+v 0.643919 0.000000 -0.095822
+v 0.658751 0.000000 -0.112173
+v 0.677344 0.000000 -0.132670
+v 0.698443 0.000000 -0.155929
+v 0.720796 0.000000 -0.180571
+v 0.743149 0.000000 -0.205213
+v 0.764248 0.000000 -0.228473
+v 0.782841 0.000000 -0.248969
+v 0.797673 0.000000 -0.265320
+v 0.807491 0.000000 -0.276144
+v 0.811043 0.000000 -0.280059
+v 0.820559 0.000000 -0.291481
+v 0.829005 0.000000 -0.303547
+v 0.836366 0.000000 -0.316184
+v 0.842628 0.000000 -0.329321
+v 0.847775 0.000000 -0.342886
+v 0.851793 0.000000 -0.356808
+v 0.854669 0.000000 -0.371015
+v 0.856386 0.000000 -0.385436
+v 0.856930 0.000000 -0.400000
+v 0.856288 0.000000 -0.414635
+v 0.854443 0.000000 -0.429269
+v 0.851382 0.000000 -0.443831
+v 0.849473 0.000000 -0.451284
+v 0.847494 0.000000 -0.458754
+v 0.845444 0.000000 -0.466238
+v 0.843319 0.000000 -0.473731
+v 0.841118 0.000000 -0.481228
+v 0.838838 0.000000 -0.488725
+v 0.836477 0.000000 -0.496216
+v 0.834032 0.000000 -0.503699
+v 0.831501 0.000000 -0.511168
+v 0.828881 0.000000 -0.518618
+v 0.826170 0.000000 -0.526046
+v 0.823367 0.000000 -0.533446
+v 0.821277 0.000000 -0.539406
+v 0.819144 0.000000 -0.545348
+v 0.816965 0.000000 -0.551274
+v 0.814742 0.000000 -0.557184
+v 0.812475 0.000000 -0.563081
+v 0.810162 0.000000 -0.568965
+v 0.807806 0.000000 -0.574838
+v 0.805404 0.000000 -0.580701
+v 0.802958 0.000000 -0.586556
+v 0.800467 0.000000 -0.592404
+v 0.797931 0.000000 -0.598245
+v 0.795351 0.000000 -0.604082
+v 0.787517 0.000000 -0.619513
+v 0.778320 0.000000 -0.633929
+v 0.767859 0.000000 -0.647266
+v 0.756236 0.000000 -0.659464
+v 0.743551 0.000000 -0.670459
+v 0.729905 0.000000 -0.680190
+v 0.715397 0.000000 -0.688595
+v 0.700129 0.000000 -0.695611
+v 0.684200 0.000000 -0.701176
+v 0.667712 0.000000 -0.705228
+v 0.650764 0.000000 -0.707705
+v 0.633458 0.000000 -0.708544
+v 0.626143 0.000000 -0.708544
+v 0.605919 0.000000 -0.708544
+v 0.575367 0.000000 -0.708544
+v 0.537071 0.000000 -0.708544
+v 0.493610 0.000000 -0.708544
+v 0.447568 0.000000 -0.708544
+v 0.401526 0.000000 -0.708544
+v 0.358066 0.000000 -0.708544
+v 0.319769 0.000000 -0.708544
+v 0.289218 0.000000 -0.708544
+v 0.268993 0.000000 -0.708544
+v 0.261678 0.000000 -0.708544
+v 0.244388 0.000000 -0.707705
+v 0.227451 0.000000 -0.705228
+v 0.210968 0.000000 -0.701176
+v 0.195042 0.000000 -0.695611
+v 0.179772 0.000000 -0.688595
+v 0.165260 0.000000 -0.680190
+v 0.151608 0.000000 -0.670459
+v 0.138917 0.000000 -0.659464
+v 0.127288 0.000000 -0.647266
+v 0.116822 0.000000 -0.633929
+v 0.107621 0.000000 -0.619513
+v 0.099785 0.000000 -0.604082
+v 0.097207 0.000000 -0.598261
+v 0.094675 0.000000 -0.592431
+v 0.092189 0.000000 -0.586591
+v 0.089749 0.000000 -0.580741
+v 0.087354 0.000000 -0.574882
+v 0.085003 0.000000 -0.569013
+v 0.082694 0.000000 -0.563135
+v 0.080428 0.000000 -0.557247
+v 0.078203 0.000000 -0.551349
+v 0.076019 0.000000 -0.545442
+v 0.073875 0.000000 -0.539525
+v 0.071770 0.000000 -0.533599
+v 0.068966 0.000000 -0.526180
+v 0.066255 0.000000 -0.518733
+v 0.063636 0.000000 -0.511265
+v 0.061105 0.000000 -0.503778
+v 0.058659 0.000000 -0.496279
+v 0.056298 0.000000 -0.488772
+v 0.054018 0.000000 -0.481262
+v 0.051817 0.000000 -0.473754
+v 0.049693 0.000000 -0.466251
+v 0.047642 0.000000 -0.458760
+v 0.045664 0.000000 -0.451285
+v 0.043754 0.000000 -0.443831
+v 0.040693 0.000000 -0.429269
+v 0.038849 0.000000 -0.414635
+v 0.038206 0.000000 -0.400000
+v 0.038751 0.000000 -0.385436
+v 0.040468 0.000000 -0.371015
+v 0.043343 0.000000 -0.356808
+v 0.047361 0.000000 -0.342886
+v 0.052509 0.000000 -0.329321
+v 0.058770 0.000000 -0.316184
+v 0.066131 0.000000 -0.303547
+v 0.074577 0.000000 -0.291481
+v 0.084094 0.000000 -0.280059
+v 0.087645 0.000000 -0.276144
+v 0.097463 0.000000 -0.265320
+v 0.112296 0.000000 -0.248969
+v 0.130888 0.000000 -0.228473
+v 0.151988 0.000000 -0.205213
+v 0.174340 0.000000 -0.180571
+v 0.196693 0.000000 -0.155929
+v 0.217792 0.000000 -0.132670
+v 0.236385 0.000000 -0.112173
+v 0.251217 0.000000 -0.095822
+v 0.261036 0.000000 -0.084998
+v 0.264587 0.000000 -0.081083
+v 0.273276 0.000000 -0.072140
+v 0.282514 0.000000 -0.063882
+v 0.292259 0.000000 -0.056325
+v 0.302471 0.000000 -0.049488
+v 0.313108 0.000000 -0.043389
+v 0.324130 0.000000 -0.038045
+v 0.335494 0.000000 -0.033475
+v 0.347159 0.000000 -0.029696
+v 0.359086 0.000000 -0.026725
+v 0.371231 0.000000 -0.024581
+v 0.383555 0.000000 -0.023282
+v 0.386064 0.000000 -0.489978
+v 0.168753 0.000000 -0.484315
+v 0.168753 0.000000 -0.476585
+v 0.386064 0.000000 -0.470998
+v 0.386064 0.000000 -0.489978
+v 0.508996 0.000000 -0.470998
+v 0.726307 0.000000 -0.476585
+v 0.726307 0.000000 -0.484315
+v 0.508996 0.000000 -0.489978
+v 0.508996 0.000000 -0.470998
+v 0.386064 0.000000 -0.296742
+v 0.226697 0.000000 -0.291079
+v 0.226697 0.000000 -0.283349
+v 0.386064 0.000000 -0.277763
+v 0.386064 0.000000 -0.296742
+v 0.508996 0.000000 -0.277763
+v 0.668363 0.000000 -0.283349
+v 0.668363 0.000000 -0.291079
+v 0.508996 0.000000 -0.296742
+v 0.508996 0.000000 -0.277763
+v 0.306074 0.000000 -0.195953
+v 0.306074 0.000000 -0.188224
+v 0.447530 0.000000 -0.182637
+v 0.588985 0.000000 -0.188224
+v 0.588985 0.000000 -0.195953
+v 0.447530 0.000000 -0.201540
+v 0.306074 0.000000 -0.195953
+v 0.451893 0.000000 -0.478804
+v 0.442401 0.000000 -0.478804
+v 0.435436 0.000000 -0.392250
+v 0.148468 0.000000 -0.386893
+v 0.148468 0.000000 -0.379164
+v 0.435436 0.000000 -0.373807
+v 0.442401 0.000000 -0.287252
+v 0.451893 0.000000 -0.287252
+v 0.458399 0.000000 -0.373960
+v 0.746592 0.000000 -0.379164
+v 0.746592 0.000000 -0.386893
+v 0.458399 0.000000 -0.392097
+v 0.451893 0.000000 -0.478804
+v 0.645858 0.000000 -0.570104
+v 0.645858 0.000000 -0.577833
+v 0.447530 0.000000 -0.583420
+v 0.249201 0.000000 -0.577833
+v 0.249201 0.000000 -0.570104
+v 0.447530 0.000000 -0.564517
+v 0.645858 0.000000 -0.570104
+vn -0.0000 1.0000 -0.0000
+vt 0.134752 0.000000
+vt 0.141844 0.000000
+vt 0.138298 0.000000
+vt 0.145390 0.000000
+vt 0.131206 0.000000
+vt 0.127660 0.000000
+vt 0.124113 0.000000
+vt 0.120567 0.000000
+vt 0.117021 0.000000
+vt 0.113475 0.000000
+vt 0.109929 0.000000
+vt 0.106383 0.000000
+vt 0.102837 0.000000
+vt 0.099291 0.000000
+vt 0.095745 0.000000
+vt 0.092199 0.000000
+vt 0.585106 0.000000
+vt 0.581560 0.000000
+vt 0.578014 0.000000
+vt 0.574468 0.000000
+vt 0.570922 0.000000
+vt 0.567376 0.000000
+vt 0.563830 0.000000
+vt 0.560284 0.000000
+vt 0.556738 0.000000
+vt 0.553191 0.000000
+vt 0.549645 0.000000
+vt 0.546099 0.000000
+vt 0.542553 0.000000
+vt 0.539007 0.000000
+vt 0.535461 0.000000
+vt 0.148936 0.000000
+vt 0.588652 0.000000
+vt 0.531915 0.000000
+vt 0.592199 0.000000
+vt 0.528369 0.000000
+vt 0.595745 0.000000
+vt 0.524823 0.000000
+vt 0.088652 0.000000
+vt 0.152482 0.000000
+vt 0.599291 0.000000
+vt 0.521277 0.000000
+vt 0.602837 0.000000
+vt 0.517730 0.000000
+vt 0.085106 0.000000
+vt 0.156028 0.000000
+vt 0.606383 0.000000
+vt 0.514184 0.000000
+vt 0.081560 0.000000
+vt 0.159574 0.000000
+vt 0.609929 0.000000
+vt 0.510638 0.000000
+vt 0.613475 0.000000
+vt 0.507092 0.000000
+vt 0.078014 0.000000
+vt 0.163121 0.000000
+vt 0.617021 0.000000
+vt 0.503546 0.000000
+vt 0.074468 0.000000
+vt 0.166667 0.000000
+vt 0.620567 0.000000
+vt 0.500000 0.000000
+vt 0.070922 0.000000
+vt 0.170213 0.000000
+vt 0.624114 0.000000
+vt 0.496454 0.000000
+vt 0.067376 0.000000
+vt 0.173759 0.000000
+vt 0.627660 0.000000
+vt 0.492908 0.000000
+vt 0.631206 0.000000
+vt 0.489362 0.000000
+vt 0.063830 0.000000
+vt 0.177305 0.000000
+vt 0.634752 0.000000
+vt 0.485816 0.000000
+vt 0.638298 0.000000
+vt 0.482269 0.000000
+vt 0.989362 0.000000
+vt 0.982270 0.000000
+vt 0.985816 0.000000
+vt 0.060284 0.000000
+vt 0.180851 0.000000
+vt 0.641844 0.000000
+vt 0.478723 0.000000
+vt 0.992908 0.000000
+vt 1.000000 0.000000
+vt 0.645390 0.000000
+vt 0.475177 0.000000
+vt 0.996454 0.000000
+vt 0.648936 0.000000
+vt 0.471631 0.000000
+vt 0.056738 0.000000
+vt 0.184397 0.000000
+vt 0.652482 0.000000
+vt 0.468085 0.000000
+vt 0.656028 0.000000
+vt 0.464539 0.000000
+vt 0.053191 0.000000
+vt 0.187943 0.000000
+vt 0.659574 0.000000
+vt 0.460993 0.000000
+vt 0.663121 0.000000
+vt 0.457447 0.000000
+vt 0.666667 0.000000
+vt 0.453901 0.000000
+vt 0.049645 0.000000
+vt 0.191489 0.000000
+vt 0.670213 0.000000
+vt 0.450355 0.000000
+vt 0.673759 0.000000
+vt 0.446809 0.000000
+vt 0.046099 0.000000
+vt 0.195035 0.000000
+vt 0.677305 0.000000
+vt 0.443262 0.000000
+vt 0.680851 0.000000
+vt 0.439716 0.000000
+vt 0.042553 0.000000
+vt 0.198582 0.000000
+vt 0.684397 0.000000
+vt 0.436170 0.000000
+vt 0.687943 0.000000
+vt 0.432624 0.000000
+vt 0.840426 0.000000
+vt 0.847518 0.000000
+vt 0.851064 0.000000
+vt 0.868794 0.000000
+vt 0.861702 0.000000
+vt 0.865248 0.000000
+vt 0.691489 0.000000
+vt 0.429078 0.000000
+vt 0.039007 0.000000
+vt 0.202128 0.000000
+vt 0.843972 0.000000
+vt 0.858156 0.000000
+vt 0.695035 0.000000
+vt 0.425532 0.000000
+vt 0.939716 0.000000
+vt 0.975177 0.000000
+vt 0.936170 0.000000
+vt 0.971631 0.000000
+vt 0.698582 0.000000
+vt 0.421986 0.000000
+vt 0.035461 0.000000
+vt 0.205674 0.000000
+vt 0.702128 0.000000
+vt 0.418440 0.000000
+vt 0.705674 0.000000
+vt 0.414894 0.000000
+vt 0.031915 0.000000
+vt 0.209220 0.000000
+vt 0.709220 0.000000
+vt 0.411348 0.000000
+vt 0.712766 0.000000
+vt 0.407801 0.000000
+vt 0.028369 0.000000
+vt 0.212766 0.000000
+vt 0.404255 0.000000
+vt 0.716312 0.000000
+vt 0.024823 0.000000
+vt 0.216312 0.000000
+vt 0.400709 0.000000
+vt 0.719858 0.000000
+vt 0.021277 0.000000
+vt 0.219858 0.000000
+vt 0.397163 0.000000
+vt 0.723404 0.000000
+vt 0.943262 0.000000
+vt 0.968085 0.000000
+vt 0.017730 0.000000
+vt 0.223404 0.000000
+vt 0.946809 0.000000
+vt 0.964539 0.000000
+vt 0.393617 0.000000
+vt 0.726950 0.000000
+vt 0.950355 0.000000
+vt 0.960993 0.000000
+vt 0.014184 0.000000
+vt 0.226950 0.000000
+vt 0.957447 0.000000
+vt 0.953901 0.000000
+vt 0.390071 0.000000
+vt 0.730496 0.000000
+vt 0.010638 0.000000
+vt 0.230496 0.000000
+vt 0.386525 0.000000
+vt 0.734043 0.000000
+vt 0.007092 0.000000
+vt 0.234043 0.000000
+vt 0.237589 0.000000
+vt 0.241135 0.000000
+vt 0.244681 0.000000
+vt 0.248227 0.000000
+vt 0.251773 0.000000
+vt 0.255319 0.000000
+vt 0.258865 0.000000
+vt 0.262411 0.000000
+vt 0.265957 0.000000
+vt 0.269504 0.000000
+vt 0.273050 0.000000
+vt 0.003546 0.000000
+vt 0.751773 0.000000
+vt 0.748227 0.000000
+vt 0.744681 0.000000
+vt 0.741135 0.000000
+vt 0.737589 0.000000
+vt 0.276596 0.000000
+vt 0.382979 0.000000
+vt 0.379433 0.000000
+vt 0.375887 0.000000
+vt 0.372340 0.000000
+vt 0.368794 0.000000
+vt 0.000000 0.000000
+vt 0.875886 0.000000
+vt 0.882979 0.000000
+vt 0.886525 0.000000
+vt 0.904255 0.000000
+vt 0.897163 0.000000
+vt 0.900709 0.000000
+vt 0.879433 0.000000
+vt 0.893617 0.000000
+vt 0.755319 0.000000
+vt 0.365248 0.000000
+vt 0.361702 0.000000
+vt 0.758865 0.000000
+vt 0.358156 0.000000
+vt 0.762411 0.000000
+vt 0.354610 0.000000
+vt 0.765957 0.000000
+vt 0.351064 0.000000
+vt 0.769504 0.000000
+vt 0.347518 0.000000
+vt 0.773050 0.000000
+vt 0.929078 0.000000
+vt 0.921986 0.000000
+vt 0.925532 0.000000
+vt 0.911348 0.000000
+vt 0.918440 0.000000
+vt 0.914894 0.000000
+vt 0.343972 0.000000
+vt 0.776596 0.000000
+vt 0.340426 0.000000
+vt 0.780142 0.000000
+vt 0.336879 0.000000
+vt 0.783688 0.000000
+vt 0.333333 0.000000
+vt 0.787234 0.000000
+vt 0.329787 0.000000
+vt 0.790780 0.000000
+vt 0.326241 0.000000
+vt 0.794326 0.000000
+vt 0.797872 0.000000
+vt 0.322695 0.000000
+vt 0.801418 0.000000
+vt 0.319149 0.000000
+vt 0.804965 0.000000
+vt 0.315603 0.000000
+vt 0.808511 0.000000
+vt 0.312057 0.000000
+vt 0.812057 0.000000
+vt 0.308511 0.000000
+vt 0.815603 0.000000
+vt 0.304965 0.000000
+vt 0.819149 0.000000
+vt 0.301418 0.000000
+vt 0.822695 0.000000
+vt 0.297872 0.000000
+vt 0.826241 0.000000
+vt 0.294326 0.000000
+vt 0.829787 0.000000
+vt 0.290780 0.000000
+vt 0.287234 0.000000
+vt 0.833333 0.000000
+vt 0.283688 0.000000
+vt 0.280142 0.000000
+s 0
+usemtl SVGMat.002
+f 39/1/1 41/2/1 40/3/1
+f 39/1/1 42/4/1 41/2/1
+f 38/5/1 42/4/1 39/1/1
+f 37/6/1 42/4/1 38/5/1
+f 36/7/1 42/4/1 37/6/1
+f 35/8/1 42/4/1 36/7/1
+f 34/9/1 42/4/1 35/8/1
+f 33/10/1 42/4/1 34/9/1
+f 32/11/1 42/4/1 33/10/1
+f 31/12/1 42/4/1 32/11/1
+f 30/13/1 42/4/1 31/12/1
+f 29/14/1 42/4/1 30/13/1
+f 28/15/1 42/4/1 29/14/1
+f 27/16/1 166/17/1 28/15/1
+f 166/17/1 165/18/1 28/15/1
+f 165/18/1 42/4/1 28/15/1
+f 165/18/1 164/19/1 42/4/1
+f 164/19/1 163/20/1 42/4/1
+f 163/20/1 162/21/1 42/4/1
+f 162/21/1 161/22/1 42/4/1
+f 161/22/1 160/23/1 42/4/1
+f 160/23/1 159/24/1 42/4/1
+f 159/24/1 158/25/1 42/4/1
+f 158/25/1 157/26/1 42/4/1
+f 157/26/1 156/27/1 42/4/1
+f 156/27/1 155/28/1 42/4/1
+f 155/28/1 154/29/1 42/4/1
+f 154/29/1 153/30/1 42/4/1
+f 153/30/1 152/31/1 42/4/1
+f 152/31/1 43/32/1 42/4/1
+f 27/16/1 167/33/1 166/17/1
+f 151/34/1 43/32/1 152/31/1
+f 27/16/1 168/35/1 167/33/1
+f 150/36/1 43/32/1 151/34/1
+f 27/16/1 169/37/1 168/35/1
+f 149/38/1 43/32/1 150/36/1
+f 26/39/1 169/37/1 27/16/1
+f 149/38/1 44/40/1 43/32/1
+f 26/39/1 170/41/1 169/37/1
+f 148/42/1 44/40/1 149/38/1
+f 26/39/1 171/43/1 170/41/1
+f 147/44/1 44/40/1 148/42/1
+f 25/45/1 171/43/1 26/39/1
+f 147/44/1 45/46/1 44/40/1
+f 25/45/1 172/47/1 171/43/1
+f 146/48/1 45/46/1 147/44/1
+f 24/49/1 172/47/1 25/45/1
+f 146/48/1 46/50/1 45/46/1
+f 24/49/1 173/51/1 172/47/1
+f 145/52/1 46/50/1 146/48/1
+f 24/49/1 174/53/1 173/51/1
+f 144/54/1 46/50/1 145/52/1
+f 23/55/1 174/53/1 24/49/1
+f 144/54/1 47/56/1 46/50/1
+f 23/55/1 175/57/1 174/53/1
+f 143/58/1 47/56/1 144/54/1
+f 22/59/1 175/57/1 23/55/1
+f 143/58/1 48/60/1 47/56/1
+f 22/59/1 176/61/1 175/57/1
+f 142/62/1 48/60/1 143/58/1
+f 21/63/1 176/61/1 22/59/1
+f 142/62/1 49/64/1 48/60/1
+f 21/63/1 177/65/1 176/61/1
+f 141/66/1 49/64/1 142/62/1
+f 20/67/1 177/65/1 21/63/1
+f 141/66/1 50/68/1 49/64/1
+f 20/67/1 178/69/1 177/65/1
+f 140/70/1 50/68/1 141/66/1
+f 20/67/1 179/71/1 178/69/1
+f 139/72/1 50/68/1 140/70/1
+f 19/73/1 179/71/1 20/67/1
+f 139/72/1 51/74/1 50/68/1
+f 19/73/1 180/75/1 179/71/1
+f 138/76/1 51/74/1 139/72/1
+f 19/73/1 181/77/1 180/75/1
+f 137/78/1 51/74/1 138/76/1
+f 280/79/1 278/80/1 279/81/1
+f 18/82/1 181/77/1 19/73/1
+f 137/78/1 52/83/1 51/74/1
+f 18/82/1 182/84/1 181/77/1
+f 136/85/1 52/83/1 137/78/1
+f 281/86/1 278/80/1 280/79/1
+f 281/86/1 283/87/1 278/80/1
+f 18/82/1 183/88/1 182/84/1
+f 135/89/1 52/83/1 136/85/1
+f 282/90/1 283/87/1 281/86/1
+f 18/82/1 184/91/1 183/88/1
+f 134/92/1 52/83/1 135/89/1
+f 17/93/1 184/91/1 18/82/1
+f 134/92/1 53/94/1 52/83/1
+f 17/93/1 185/95/1 184/91/1
+f 133/96/1 53/94/1 134/92/1
+f 17/93/1 186/97/1 185/95/1
+f 132/98/1 53/94/1 133/96/1
+f 16/99/1 186/97/1 17/93/1
+f 132/98/1 54/100/1 53/94/1
+f 16/99/1 187/101/1 186/97/1
+f 131/102/1 54/100/1 132/98/1
+f 16/99/1 188/103/1 187/101/1
+f 130/104/1 54/100/1 131/102/1
+f 16/99/1 189/105/1 188/103/1
+f 129/106/1 54/100/1 130/104/1
+f 15/107/1 189/105/1 16/99/1
+f 129/106/1 55/108/1 54/100/1
+f 15/107/1 190/109/1 189/105/1
+f 128/110/1 55/108/1 129/106/1
+f 15/107/1 191/111/1 190/109/1
+f 127/112/1 55/108/1 128/110/1
+f 14/113/1 191/111/1 15/107/1
+f 127/112/1 56/114/1 55/108/1
+f 14/113/1 192/115/1 191/111/1
+f 126/116/1 56/114/1 127/112/1
+f 14/113/1 193/117/1 192/115/1
+f 125/118/1 56/114/1 126/116/1
+f 13/119/1 193/117/1 14/113/1
+f 125/118/1 57/120/1 56/114/1
+f 13/119/1 194/121/1 193/117/1
+f 124/122/1 57/120/1 125/118/1
+f 13/119/1 195/123/1 194/121/1
+f 123/124/1 57/120/1 124/122/1
+f 238/125/1 240/126/1 241/127/1
+f 246/128/1 244/129/1 245/130/1
+f 13/119/1 196/131/1 195/123/1
+f 122/132/1 57/120/1 123/124/1
+f 12/133/1 196/131/1 13/119/1
+f 122/132/1 58/134/1 57/120/1
+f 239/135/1 240/126/1 238/125/1
+f 246/128/1 243/136/1 244/129/1
+f 12/133/1 197/137/1 196/131/1
+f 121/138/1 58/134/1 122/132/1
+f 266/139/1 276/140/1 265/141/1
+f 266/139/1 275/142/1 276/140/1
+f 12/133/1 198/143/1 197/137/1
+f 120/144/1 58/134/1 121/138/1
+f 11/145/1 198/143/1 12/133/1
+f 120/144/1 59/146/1 58/134/1
+f 11/145/1 199/147/1 198/143/1
+f 119/148/1 59/146/1 120/144/1
+f 11/145/1 200/149/1 199/147/1
+f 118/150/1 59/146/1 119/148/1
+f 10/151/1 200/149/1 11/145/1
+f 118/150/1 60/152/1 59/146/1
+f 10/151/1 201/153/1 200/149/1
+f 117/154/1 60/152/1 118/150/1
+f 10/151/1 202/155/1 201/153/1
+f 116/156/1 60/152/1 117/154/1
+f 9/157/1 202/155/1 10/151/1
+f 116/156/1 61/158/1 60/152/1
+f 115/159/1 61/158/1 116/156/1
+f 9/157/1 203/160/1 202/155/1
+f 8/161/1 203/160/1 9/157/1
+f 115/159/1 62/162/1 61/158/1
+f 114/163/1 62/162/1 115/159/1
+f 8/161/1 204/164/1 203/160/1
+f 7/165/1 204/164/1 8/161/1
+f 114/163/1 63/166/1 62/162/1
+f 113/167/1 63/166/1 114/163/1
+f 7/165/1 205/168/1 204/164/1
+f 267/169/1 275/142/1 266/139/1
+f 267/169/1 274/170/1 275/142/1
+f 6/171/1 205/168/1 7/165/1
+f 113/167/1 64/172/1 63/166/1
+f 268/173/1 274/170/1 267/169/1
+f 268/173/1 273/174/1 274/170/1
+f 112/175/1 64/172/1 113/167/1
+f 6/171/1 206/176/1 205/168/1
+f 269/177/1 273/174/1 268/173/1
+f 269/177/1 272/178/1 273/174/1
+f 5/179/1 206/176/1 6/171/1
+f 112/175/1 65/180/1 64/172/1
+f 269/177/1 271/181/1 272/178/1
+f 270/182/1 271/181/1 269/177/1
+f 111/183/1 65/180/1 112/175/1
+f 5/179/1 207/184/1 206/176/1
+f 4/185/1 207/184/1 5/179/1
+f 111/183/1 66/186/1 65/180/1
+f 110/187/1 66/186/1 111/183/1
+f 4/185/1 208/188/1 207/184/1
+f 3/189/1 208/188/1 4/185/1
+f 110/187/1 67/190/1 66/186/1
+f 110/187/1 68/191/1 67/190/1
+f 110/187/1 69/192/1 68/191/1
+f 110/187/1 70/193/1 69/192/1
+f 110/187/1 71/194/1 70/193/1
+f 110/187/1 72/195/1 71/194/1
+f 110/187/1 73/196/1 72/195/1
+f 110/187/1 74/197/1 73/196/1
+f 110/187/1 75/198/1 74/197/1
+f 110/187/1 76/199/1 75/198/1
+f 110/187/1 77/200/1 76/199/1
+f 110/187/1 78/201/1 77/200/1
+f 2/202/1 213/203/1 3/189/1
+f 213/203/1 212/204/1 3/189/1
+f 212/204/1 211/205/1 3/189/1
+f 211/205/1 210/206/1 3/189/1
+f 210/206/1 209/207/1 3/189/1
+f 209/207/1 208/188/1 3/189/1
+f 110/187/1 79/208/1 78/201/1
+f 109/209/1 79/208/1 110/187/1
+f 109/209/1 108/210/1 79/208/1
+f 108/210/1 107/211/1 79/208/1
+f 107/211/1 106/212/1 79/208/1
+f 106/212/1 105/213/1 79/208/1
+f 105/213/1 1/214/1 79/208/1
+f 248/215/1 250/216/1 251/217/1
+f 256/218/1 254/219/1 255/220/1
+f 249/221/1 250/216/1 248/215/1
+f 256/218/1 253/222/1 254/219/1
+f 2/202/1 214/223/1 213/203/1
+f 104/224/1 1/214/1 105/213/1
+f 103/225/1 1/214/1 104/224/1
+f 2/202/1 215/226/1 214/223/1
+f 102/227/1 1/214/1 103/225/1
+f 2/202/1 216/228/1 215/226/1
+f 101/229/1 1/214/1 102/227/1
+f 2/202/1 217/230/1 216/228/1
+f 100/231/1 1/214/1 101/229/1
+f 2/202/1 218/232/1 217/230/1
+f 99/233/1 1/214/1 100/231/1
+f 2/202/1 219/234/1 218/232/1
+f 263/235/1 261/236/1 262/237/1
+f 258/238/1 261/236/1 263/235/1
+f 258/238/1 260/239/1 261/236/1
+f 259/240/1 260/239/1 258/238/1
+f 98/241/1 1/214/1 99/233/1
+f 2/202/1 220/242/1 219/234/1
+f 97/243/1 1/214/1 98/241/1
+f 2/202/1 221/244/1 220/242/1
+f 96/245/1 1/214/1 97/243/1
+f 2/202/1 222/246/1 221/244/1
+f 95/247/1 1/214/1 96/245/1
+f 2/202/1 223/248/1 222/246/1
+f 94/249/1 1/214/1 95/247/1
+f 2/202/1 224/250/1 223/248/1
+f 93/251/1 1/214/1 94/249/1
+f 2/202/1 225/252/1 224/250/1
+f 2/202/1 226/253/1 225/252/1
+f 92/254/1 1/214/1 93/251/1
+f 2/202/1 227/255/1 226/253/1
+f 91/256/1 1/214/1 92/254/1
+f 2/202/1 228/257/1 227/255/1
+f 90/258/1 1/214/1 91/256/1
+f 2/202/1 229/259/1 228/257/1
+f 89/260/1 1/214/1 90/258/1
+f 2/202/1 230/261/1 229/259/1
+f 88/262/1 1/214/1 89/260/1
+f 2/202/1 231/263/1 230/261/1
+f 87/264/1 1/214/1 88/262/1
+f 2/202/1 232/265/1 231/263/1
+f 86/266/1 1/214/1 87/264/1
+f 2/202/1 233/267/1 232/265/1
+f 85/268/1 1/214/1 86/266/1
+f 2/202/1 234/269/1 233/267/1
+f 84/270/1 1/214/1 85/268/1
+f 2/202/1 235/271/1 234/269/1
+f 83/272/1 1/214/1 84/270/1
+f 82/273/1 1/214/1 83/272/1
+f 2/202/1 236/274/1 235/271/1
+f 81/275/1 1/214/1 82/273/1
+f 2/202/1 80/276/1 236/274/1
+f 2/202/1 81/275/1 80/276/1
+f 2/202/1 1/214/1 81/275/1

+ 139 - 4
bin/app/src/app/schema/menu/channel.rs

@@ -64,6 +64,8 @@ mod android_ui_consts {
     pub const LABEL_X: f32 = 40.;
     pub const LABEL_LINESPACE: f32 = 125.;
     pub const LABEL_FONTSIZE: f32 = 44.;
+    pub const CONTACTS_ICON_SCALE: f32 = 29.;
+    pub const CHANNELS_ICON_SCALE: f32 = 20.;
     pub const MENU_SEP_SIZE: f32 = 3.;
     pub const MENU_HANDLE_PAD: f32 = 110.;
     pub const MENU_FADE: f32 = 130.;
@@ -91,6 +93,13 @@ mod android_ui_consts {
     pub const COPY_SCALE: f32 = 35.;
     pub const COPY_BTN_SIZE: f32 = CHATEDIT_HEIGHT;
     pub const CONTENT_OUTLINE_SIZE: f32 = 0.5;
+    pub const TAB_LABEL_X: f32 = 90.;
+    pub const CHANNELS_TAB_ICON_GAP: f32 = 12.;
+    pub const CONTACTS_TAB_ICON_GAP: f32 = 8.5;
+    pub const CHANNELS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CHANNELS_ICON_SCALE - CHANNELS_TAB_ICON_GAP;
+    pub const CONTACTS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CONTACTS_ICON_SCALE - CONTACTS_TAB_ICON_GAP;
 }
 
 #[cfg(target_os = "android")]
@@ -111,6 +120,8 @@ mod ui_consts {
     pub const LABEL_X: f32 = 20.;
     pub const LABEL_LINESPACE: f32 = 55.;
     pub const LABEL_FONTSIZE: f32 = 22.;
+    pub const CONTACTS_ICON_SCALE: f32 = 14.5;
+    pub const CHANNELS_ICON_SCALE: f32 = 10.;
     pub const MENU_SEP_SIZE: f32 = 1.;
     pub const MENU_HANDLE_PAD: f32 = 80.;
     pub const MENU_FADE: f32 = 130.;
@@ -135,6 +146,13 @@ mod ui_consts {
     pub const COPY_SCALE: f32 = 15.;
     pub const COPY_BTN_SIZE: f32 = CHATEDIT_HEIGHT;
     pub const CONTENT_OUTLINE_SIZE: f32 = 0.3;
+    pub const TAB_LABEL_X: f32 = 45.;
+    pub const CHANNELS_TAB_ICON_GAP: f32 = 6.;
+    pub const CONTACTS_TAB_ICON_GAP: f32 = 4.25;
+    pub const CHANNELS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CHANNELS_ICON_SCALE - CHANNELS_TAB_ICON_GAP;
+    pub const CONTACTS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CONTACTS_ICON_SCALE - CONTACTS_TAB_ICON_GAP;
 }
 
 async fn unfocus_editors(content: &SceneNodePtr) {
@@ -162,6 +180,10 @@ pub async fn make(
     cc.add_const_f32("LABEL_LINESPACE", LABEL_LINESPACE);
     cc.add_const_f32("HEADER_HEIGHT", HEADER_HEIGHT);
     cc.add_const_f32("CONTENT_MARGIN", CONTENT_MARGIN);
+    cc.add_const_f32("CONTACTS_ICON_SCALE", CONTACTS_ICON_SCALE);
+    cc.add_const_f32("CHANNELS_ICON_SCALE", CHANNELS_ICON_SCALE);
+    cc.add_const_f32("TAB_LABEL_X", TAB_LABEL_X);
+    cc.add_const_f32("CHANNELS_TAB_ICON_X", CHANNELS_TAB_ICON_X);
     cc.add_const_f32("CONTENT_OUTLINE_SIZE", CONTENT_OUTLINE_SIZE);
     cc.add_const_f32("MENU_BTN_W_L", MENU_BTN_W_L);
     cc.add_const_f32("COPY_WIDTH", COPY_WIDTH);
@@ -606,11 +628,23 @@ pub async fn make(
         node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     content_area.link(node);
 
+    let node = create_vector_art("channels_tab_icon");
+    let prop = node.get_property("rect").unwrap();
+    let code = cc.compile("w / 2 + CHANNELS_TAB_ICON_X").unwrap();
+    prop.set_expr(atom, Role::App, 0, code).unwrap();
+    prop.set_f32(atom, Role::App, 1, LABEL_LINESPACE / 2. + 3.).unwrap();
+    prop.set_f32(atom, Role::App, 2, CHANNELS_ICON_SCALE).unwrap();
+    prop.set_f32(atom, Role::App, 3, CHANNELS_ICON_SCALE).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    let shape = shape::create_channels_icon(COLOR_MINT).scaled(CHANNELS_ICON_SCALE);
+    let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content_area.link(node);
+
     let node = create_text("channels_tab_text");
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        let code = cc.compile("w / 2 + TAB_LABEL_X").unwrap();
         prop.set_expr(atom, Role::App, 0, code).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
         let code = cc.compile("w").unwrap();
@@ -619,7 +653,7 @@ pub async fn make(
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        let code = cc.compile("w / 2 + TAB_LABEL_X").unwrap();
         prop.set_expr(atom, Role::App, 0, code).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
         let code = cc.compile("w").unwrap();
@@ -687,18 +721,29 @@ pub async fn make(
         node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     content_area.link(node);
 
+    let node = create_vector_art("contacts_tab_icon");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, CONTACTS_TAB_ICON_X).unwrap();
+    prop.set_f32(atom, Role::App, 1, LABEL_LINESPACE / 2. + 4.).unwrap();
+    prop.set_f32(atom, Role::App, 2, CONTACTS_ICON_SCALE).unwrap();
+    prop.set_f32(atom, Role::App, 3, CONTACTS_ICON_SCALE).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    let shape = shape::create_contacts_icon(COLOR_INACTIVE).scaled(CONTACTS_ICON_SCALE);
+    let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content_area.link(node);
+
     let node = create_text("contacts_tab_text");
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 0, TAB_LABEL_X).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
         prop.set_f32(atom, Role::App, 2, 200.).unwrap();
         prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 0, TAB_LABEL_X).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
         prop.set_f32(atom, Role::App, 2, 200.).unwrap();
         prop.set_f32(atom, Role::App, 3, 40.).unwrap();
@@ -1325,6 +1370,96 @@ pub async fn make(
         .await;
     editlayer_node.link(node);
 
+    // Generate-secret button: mirrors add-channel button, positioned on the left.
+    let node = create_layer("gensecret_btn_layer");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, CHATEDIT_PAD).unwrap();
+    let code = cc.compile("LABEL_LINESPACE + 3. * CHATEDIT_PAD + 2. * CHATEDIT_HEIGHT").unwrap();
+    prop.set_expr(atom, Role::App, 1, code).unwrap();
+    let code = cc.compile("MENU_BTN_W_L + 45").unwrap();
+    prop.set_expr(atom, Role::App, 2, code).unwrap();
+    prop.set_f32(atom, Role::App, 3, CHATEDIT_HEIGHT * 0.95).unwrap();
+    node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    node.set_property_u32(atom, Role::App, "priority", 1).unwrap();
+    let editlayer_node = node.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content_area.link(editlayer_node.clone());
+
+    let node = create_vector_art("gensecret_btns_bg");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, 0.).unwrap();
+    prop.set_f32(atom, Role::App, 1, 0.).unwrap();
+    prop.set_expr(atom, Role::App, 2, expr::load_var("w")).unwrap();
+    prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
+
+    let mut shape = VectorShape::new();
+    shape.add_outline(
+        expr::const_f32(0.),
+        expr::const_f32(0.),
+        expr::const_f32(MENU_BTN_W_L + 45.),
+        expr::load_var("h"),
+        CONTENT_OUTLINE_SIZE,
+        COLOR_CYAN,
+    );
+    let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    editlayer_node.link(node);
+
+    let node = create_button("gensecret_btn");
+    node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, 0.).unwrap();
+    prop.set_f32(atom, Role::App, 1, 0.).unwrap();
+    let code = cc.compile("MENU_BTN_W_L + 45").unwrap();
+    prop.set_expr(atom, Role::App, 2, code).unwrap();
+    prop.set_f32(atom, Role::App, 3, CHATEDIT_HEIGHT).unwrap();
+
+    let (slot, recvr) = Slot::new("gensecret_clicked");
+    node.register("click", slot).unwrap();
+    let secedit_node3 = secedit_node.clone();
+    let renderer_clone = app.renderer.clone();
+    let listen_click = app.ex.spawn(async move {
+        while let Ok(_) = recvr.recv().await {
+            debug!(target: "app::menu", "gen secret button clicked");
+            let secret_bytes: [u8; 32] = OsRng.gen();
+            let secret = bs58::encode(secret_bytes).into_string();
+            let text_prop = secedit_node3.get_property("text").unwrap();
+            let atom = &mut renderer_clone.make_guard(gfxtag!("gen secret"));
+            text_prop.set_str(atom, Role::App, 0, &secret).unwrap();
+            if let crate::scene::Pimpl::Edit(edit) = secedit_node3.pimpl() {
+                edit.on_text_prop_changed();
+            }
+        }
+    });
+    app.tasks.lock().unwrap().push(listen_click);
+
+    let node = node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    editlayer_node.link(node);
+
+    let node = create_text("gen_secret");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, 0.).unwrap();
+    prop.set_f32(atom, Role::App, 1, BTN_TEXT_Y).unwrap();
+    prop.set_f32(atom, Role::App, 2, MENU_BTN_W_L + 45.).unwrap();
+    prop.set_f32(atom, Role::App, 3, CHATEDIT_HEIGHT).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
+    node.set_property_f32(atom, Role::App, "font_size", FONTSIZE * 0.95).unwrap();
+    node.set_property_str(atom, Role::App, "text", "generate key").unwrap();
+    let prop = node.get_property("text_align").unwrap();
+    prop.set_enum(atom, Role::App, 0, "center").unwrap();
+    node.set_property_bool(atom, Role::App, "use_i18n", false).unwrap();
+
+    let prop = node.get_property("text_color").unwrap();
+    prop.set_f32(atom, Role::App, 0, COLOR_CYAN[0]).unwrap();
+    prop.set_f32(atom, Role::App, 1, COLOR_CYAN[1]).unwrap();
+    prop.set_f32(atom, Role::App, 2, COLOR_CYAN[2]).unwrap();
+    prop.set_f32(atom, Role::App, 3, COLOR_CYAN[3]).unwrap();
+
+    let node = node
+        .setup(|me| Text::new(me, window_scale.clone(), app.renderer.clone(), i18n_fish.clone(), app.redraw_trigger.clone()))
+        .await;
+    editlayer_node.link(node);
+
     // Create cancel/done edit buttons at bottom of screen
     let btns =
         edit_buttons::create_edit_buttons(app, content.clone(), &window_scale, i18n_fish).await;

+ 49 - 4
bin/app/src/app/schema/menu/contact.rs

@@ -65,6 +65,8 @@ mod android_ui_consts {
     pub const LABEL_X: f32 = 40.;
     pub const LABEL_LINESPACE: f32 = 125.;
     pub const LABEL_FONTSIZE: f32 = 44.;
+    pub const CONTACTS_ICON_SCALE: f32 = 29.;
+    pub const CHANNELS_ICON_SCALE: f32 = 20.;
     pub const MENU_SEP_SIZE: f32 = 3.;
     pub const MENU_HANDLE_PAD: f32 = 110.;
     pub const MENU_FADE: f32 = 250.;
@@ -92,6 +94,13 @@ mod android_ui_consts {
     pub const COPY_SCALE: f32 = 35.;
     pub const COPY_BTN_SIZE: f32 = CHATEDIT_HEIGHT;
     pub const CONTENT_OUTLINE_SIZE: f32 = 0.5;
+    pub const TAB_LABEL_X: f32 = 90.;
+    pub const CHANNELS_TAB_ICON_GAP: f32 = 12.;
+    pub const CONTACTS_TAB_ICON_GAP: f32 = 8.5;
+    pub const CHANNELS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CHANNELS_ICON_SCALE - CHANNELS_TAB_ICON_GAP;
+    pub const CONTACTS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CONTACTS_ICON_SCALE - CONTACTS_TAB_ICON_GAP;
 }
 
 #[cfg(target_os = "android")]
@@ -112,6 +121,8 @@ mod ui_consts {
     pub const LABEL_X: f32 = 20.;
     pub const LABEL_LINESPACE: f32 = 55.;
     pub const LABEL_FONTSIZE: f32 = 22.;
+    pub const CONTACTS_ICON_SCALE: f32 = 14.5;
+    pub const CHANNELS_ICON_SCALE: f32 = 10.;
     pub const MENU_SEP_SIZE: f32 = 1.;
     pub const MENU_HANDLE_PAD: f32 = 80.;
     pub const MENU_FADE: f32 = 130.;
@@ -136,6 +147,13 @@ mod ui_consts {
     pub const COPY_SCALE: f32 = 15.;
     pub const COPY_BTN_SIZE: f32 = CHATEDIT_HEIGHT;
     pub const CONTENT_OUTLINE_SIZE: f32 = 0.3;
+    pub const TAB_LABEL_X: f32 = 45.;
+    pub const CHANNELS_TAB_ICON_GAP: f32 = 6.;
+    pub const CONTACTS_TAB_ICON_GAP: f32 = 4.25;
+    pub const CHANNELS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CHANNELS_ICON_SCALE - CHANNELS_TAB_ICON_GAP;
+    pub const CONTACTS_TAB_ICON_X: f32 =
+        TAB_LABEL_X - CONTACTS_ICON_SCALE - CONTACTS_TAB_ICON_GAP;
 }
 
 async fn unfocus_editors(content: &SceneNodePtr) {
@@ -163,6 +181,10 @@ pub async fn make(
     cc.add_const_f32("LABEL_LINESPACE", LABEL_LINESPACE);
     cc.add_const_f32("HEADER_HEIGHT", HEADER_HEIGHT);
     cc.add_const_f32("CONTENT_MARGIN", CONTENT_MARGIN);
+    cc.add_const_f32("CONTACTS_ICON_SCALE", CONTACTS_ICON_SCALE);
+    cc.add_const_f32("CHANNELS_ICON_SCALE", CHANNELS_ICON_SCALE);
+    cc.add_const_f32("TAB_LABEL_X", TAB_LABEL_X);
+    cc.add_const_f32("CHANNELS_TAB_ICON_X", CHANNELS_TAB_ICON_X);
     cc.add_const_f32("CONTENT_OUTLINE_SIZE", CONTENT_OUTLINE_SIZE);
     cc.add_const_f32("MENU_BTN_W_L", MENU_BTN_W_L);
     cc.add_const_f32("COPY_WIDTH", COPY_WIDTH);
@@ -607,18 +629,29 @@ pub async fn make(
         node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     content_area.link(node);
 
+    let node = create_vector_art("contacts_tab_icon");
+    let prop = node.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, CONTACTS_TAB_ICON_X).unwrap();
+    prop.set_f32(atom, Role::App, 1, LABEL_LINESPACE / 2. + 4.).unwrap();
+    prop.set_f32(atom, Role::App, 2, CONTACTS_ICON_SCALE).unwrap();
+    prop.set_f32(atom, Role::App, 3, CONTACTS_ICON_SCALE).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    let shape = shape::create_contacts_icon(COLOR_MINT).scaled(CONTACTS_ICON_SCALE);
+    let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content_area.link(node);
+
     let node = create_text("contacts_tab_text");
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 0, TAB_LABEL_X).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
         prop.set_f32(atom, Role::App, 2, 200.).unwrap();
         prop.set_f32(atom, Role::App, 3, 40.).unwrap();
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-        prop.set_f32(atom, Role::App, 0, CONTENT_MARGIN * 3.0).unwrap();
+        prop.set_f32(atom, Role::App, 0, TAB_LABEL_X).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
         prop.set_f32(atom, Role::App, 2, 200.).unwrap();
         prop.set_f32(atom, Role::App, 3, 40.).unwrap();
@@ -685,11 +718,23 @@ pub async fn make(
         node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     content_area.link(node);
 
+    let node = create_vector_art("channels_tab_icon");
+    let prop = node.get_property("rect").unwrap();
+    let code = cc.compile("w / 2 + CHANNELS_TAB_ICON_X").unwrap();
+    prop.set_expr(atom, Role::App, 0, code).unwrap();
+    prop.set_f32(atom, Role::App, 1, LABEL_LINESPACE / 2. + 3.).unwrap();
+    prop.set_f32(atom, Role::App, 2, CHANNELS_ICON_SCALE).unwrap();
+    prop.set_f32(atom, Role::App, 3, CHANNELS_ICON_SCALE).unwrap();
+    node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    let shape = shape::create_channels_icon(COLOR_INACTIVE).scaled(CHANNELS_ICON_SCALE);
+    let node = node.setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content_area.link(node);
+
     let node = create_text("channels_tab_text");
     let prop = node.get_property("rect").unwrap();
     #[cfg(any(target_os = "android", feature = "emulate-android"))]
     {
-        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        let code = cc.compile("w / 2 + TAB_LABEL_X").unwrap();
         prop.set_expr(atom, Role::App, 0, code).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.4).unwrap();
         let code = cc.compile("w").unwrap();
@@ -698,7 +743,7 @@ pub async fn make(
     }
     #[cfg(not(any(target_os = "android", feature = "emulate-android")))]
     {
-        let code = cc.compile("w / 2 + CONTENT_MARGIN * 3.0").unwrap();
+        let code = cc.compile("w / 2 + TAB_LABEL_X").unwrap();
         prop.set_expr(atom, Role::App, 0, code).unwrap();
         prop.set_f32(atom, Role::App, 1, CONTENT_MARGIN * 1.15).unwrap();
         let code = cc.compile("w").unwrap();

+ 25 - 59
bin/app/src/app/schema/menu/mod.rs

@@ -29,7 +29,7 @@ use crate::{
     },
     expr,
     gfx::gfxtag,
-    mesh::{CANCEL_MENU_BTN_GRADIENT, COLOR_CYAN, DONE_MENU_BTN_GRADIENT},
+    mesh::COLOR_CYAN,
     prop::{PropertyAtomicGuard, PropertyBool, PropertyFloat32, Role},
     scene::{SceneNodePtr, Slot},
     shape,
@@ -56,11 +56,12 @@ mod android_ui_consts {
     // Button constants
     pub const MENU_BTN_W_L: f32 = 250.;
     pub const MENU_BTN_W_R: f32 = 200.;
-    pub const MENU_BTN_H: f32 = 130.;
+    pub const MENU_BTN_H: f32 = 180.;
     pub const EDIT_BTN_OUTLINE_T: f32 = 2.;
     pub const BTN_TEXT_FONTSIZE: f32 = 50.;
     pub const BTN_TEXT_Y: f32 = 30.;
     pub const LABEL_LINESPACE: f32 = 60.;
+    pub const MENU_ICON_SCALE: f32 = 220.;
 }
 
 #[cfg(target_os = "android")]
@@ -93,11 +94,12 @@ mod ui_consts {
     // Button constants
     pub const MENU_BTN_W_L: f32 = 110.;
     pub const MENU_BTN_W_R: f32 = 85.;
-    pub const MENU_BTN_H: f32 = 60.;
+    pub const MENU_BTN_H: f32 = 100.;
     pub const EDIT_BTN_OUTLINE_T: f32 = 1.;
     pub const BTN_TEXT_FONTSIZE: f32 = 20.;
     pub const BTN_TEXT_Y: f32 = 14.;
     pub const LABEL_LINESPACE: f32 = 140.;
+    pub const MENU_ICON_SCALE: f32 = 100.;
 }
 
 pub mod channel;
@@ -126,6 +128,18 @@ pub async fn make(
     let renderer = app.renderer.clone();
     let atom = &mut renderer.make_guard(gfxtag!("setup"));
 
+    // Create chat container layer
+    let chat_layer = create_layer("chat");
+    let prop = chat_layer.get_property("rect").unwrap();
+    prop.set_f32(atom, Role::App, 0, 0.).unwrap();
+    prop.set_f32(atom, Role::App, 1, 0.).unwrap();
+    prop.set_expr(atom, Role::App, 2, expr::load_var("w")).unwrap();
+    prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
+    chat_layer.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
+    chat_layer.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
+    let chat_layer = chat_layer.setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
+    content.link(chat_layer.clone());
+
     // Create contact screen
     let contact_layer = create_layer("contact_screen_layer");
     let prop = contact_layer.get_property("rect").unwrap();
@@ -166,6 +180,7 @@ pub async fn make(
     cc.add_const_f32("MENU_BTN_W_L", MENU_BTN_W_L);
     cc.add_const_f32("MENU_BTN_W_R", MENU_BTN_W_R);
     cc.add_const_f32("MENU_BTN_H", MENU_BTN_H);
+    cc.add_const_f32("MENU_ICON_SCALE", MENU_ICON_SCALE);
 
     let atom = &mut PropertyAtomicGuard::none();
 
@@ -330,36 +345,6 @@ pub async fn make(
     mainlayer_node.link(node);
 
     // Write / Menu button
-    let node = create_vector_art("writebtn_bg");
-    let prop = node.get_property("rect").unwrap();
-    prop.set_f32(atom, Role::App, 0, 0.).unwrap();
-    prop.set_f32(atom, Role::App, 1, 0.).unwrap();
-    prop.set_expr(atom, Role::App, 2, expr::load_var("w")).unwrap();
-    prop.set_expr(atom, Role::App, 3, expr::load_var("h")).unwrap();
-    node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-
-    let mut shape = VectorShape::new();
-    shape.add_gradient_box(
-        cc.compile("w - MENU_BTN_W_R").unwrap(),
-        expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        DONE_MENU_BTN_GRADIENT,
-    );
-    shape.add_outline(
-        cc.compile("w - MENU_BTN_W_R").unwrap(),
-        expr::const_f32(0.),
-        expr::load_var("w"),
-        expr::load_var("h"),
-        EDIT_BTN_OUTLINE_T,
-        COLOR_CYAN,
-    );
-
-    let node = node
-        .setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone()))
-        .await;
-    mainlayer_node.link(node);
-
     let node = create_button("write_btn");
     node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
     let prop = node.get_property("rect").unwrap();
@@ -391,36 +376,17 @@ pub async fn make(
         node.setup(|me| Button::new(me, app.renderer.clone(), app.redraw_trigger.clone())).await;
     mainlayer_node.link(node);
 
-    let node = create_text("write_text");
+    let node = create_vector_art("write_icon");
     let prop = node.get_property("rect").unwrap();
-    let code = cc.compile("w - MENU_BTN_W_R").unwrap();
+    let code = cc.compile("w - MENU_BTN_W_R / 2 - MENU_ICON_SCALE * 0.45").unwrap();
     prop.set_expr(atom, Role::App, 0, code).unwrap();
-    prop.set_f32(atom, Role::App, 1, BTN_TEXT_Y).unwrap();
-    prop.set_f32(atom, Role::App, 2, MENU_BTN_W_R).unwrap();
-    prop.set_f32(atom, Role::App, 3, MENU_BTN_H).unwrap();
+    prop.set_f32(atom, Role::App, 1, MENU_BTN_H / 2. + MENU_ICON_SCALE * 0.36).unwrap();
+    prop.set_f32(atom, Role::App, 2, MENU_ICON_SCALE).unwrap();
+    prop.set_f32(atom, Role::App, 3, MENU_ICON_SCALE).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
-    node.set_property_f32(atom, Role::App, "font_size", BTN_TEXT_FONTSIZE).unwrap();
-    node.set_property_str(atom, Role::App, "text", "menu").unwrap();
-    let prop = node.get_property("text_align").unwrap();
-    prop.set_enum(atom, Role::App, 0, "center").unwrap();
-    node.set_property_bool(atom, Role::App, "use_i18n", false).unwrap();
-
-    let prop = node.get_property("text_color").unwrap();
-    prop.set_f32(atom, Role::App, 0, COLOR_CYAN[0]).unwrap();
-    prop.set_f32(atom, Role::App, 1, COLOR_CYAN[1]).unwrap();
-    prop.set_f32(atom, Role::App, 2, COLOR_CYAN[2]).unwrap();
-    prop.set_f32(atom, Role::App, 3, COLOR_CYAN[3]).unwrap();
-
+    let shape = shape::create_menu_icon(COLOR_CYAN).scaled(MENU_ICON_SCALE);
     let node = node
-        .setup(|me| {
-            Text::new(
-                me,
-                window_scale.clone(),
-                app.renderer.clone(),
-                i18n_fish.clone(),
-                app.redraw_trigger.clone(),
-            )
-        })
+        .setup(|me| VectorArt::new(me, shape, app.renderer.clone(), app.redraw_trigger.clone()))
         .await;
     mainlayer_node.link(node);
 

Разница между файлами не показана из-за своего большого размера
+ 10585 - 0
bin/app/src/shape/channels_icon.rs


Разница между файлами не показана из-за своего большого размера
+ 1702 - 0
bin/app/src/shape/contacts_icon.rs


+ 353 - 0
bin/app/src/shape/menu_icon.rs

@@ -0,0 +1,353 @@
+/* This file is part of DarkFi (https://dark.fi)
+ *
+ * Copyright (C) 2020-2026 Dyne.org foundation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
+pub fn create_menu_icon(color: Color) -> VectorShape {
+    VectorShape {
+        verts: vec![
+            ShapeVertex::from_xy(0.581867, -0.013432, color),
+            ShapeVertex::from_xy(0.313193, -0.013432, color),
+            ShapeVertex::from_xy(0.013136, -0.344343, color),
+            ShapeVertex::from_xy(0.013519, -0.346639, color),
+            ShapeVertex::from_xy(0.016237, -0.361322, color),
+            ShapeVertex::from_xy(0.019127, -0.376372, color),
+            ShapeVertex::from_xy(0.022214, -0.391744, color),
+            ShapeVertex::from_xy(0.025522, -0.407392, color),
+            ShapeVertex::from_xy(0.029077, -0.423267, color),
+            ShapeVertex::from_xy(0.032904, -0.439325, color),
+            ShapeVertex::from_xy(0.037027, -0.455518, color),
+            ShapeVertex::from_xy(0.041472, -0.471801, color),
+            ShapeVertex::from_xy(0.046264, -0.488125, color),
+            ShapeVertex::from_xy(0.051427, -0.504446, color),
+            ShapeVertex::from_xy(0.056986, -0.520717, color),
+            ShapeVertex::from_xy(0.062967, -0.53689, color),
+            ShapeVertex::from_xy(0.068387, -0.552019, color),
+            ShapeVertex::from_xy(0.074087, -0.56707, color),
+            ShapeVertex::from_xy(0.080073, -0.582054, color),
+            ShapeVertex::from_xy(0.08635, -0.596982, color),
+            ShapeVertex::from_xy(0.092926, -0.611866, color),
+            ShapeVertex::from_xy(0.099804, -0.626716, color),
+            ShapeVertex::from_xy(0.106993, -0.641544, color),
+            ShapeVertex::from_xy(0.114496, -0.65636, color),
+            ShapeVertex::from_xy(0.122321, -0.671177, color),
+            ShapeVertex::from_xy(0.130472, -0.686005, color),
+            ShapeVertex::from_xy(0.138956, -0.700855, color),
+            ShapeVertex::from_xy(0.147779, -0.715738, color),
+            ShapeVertex::from_xy(0.147806, -0.715783, color),
+            ShapeVertex::from_xy(0.147881, -0.715908, color),
+            ShapeVertex::from_xy(0.147994, -0.716097, color),
+            ShapeVertex::from_xy(0.148136, -0.716333, color),
+            ShapeVertex::from_xy(0.148297, -0.716602, color),
+            ShapeVertex::from_xy(0.148468, -0.716886, color),
+            ShapeVertex::from_xy(0.148639, -0.71717, color),
+            ShapeVertex::from_xy(0.1488, -0.717439, color),
+            ShapeVertex::from_xy(0.148942, -0.717675, color),
+            ShapeVertex::from_xy(0.149055, -0.717864, color),
+            ShapeVertex::from_xy(0.14913, -0.717989, color),
+            ShapeVertex::from_xy(0.149157, -0.718034, color),
+            ShapeVertex::from_xy(0.745979, -0.718034, color),
+            ShapeVertex::from_xy(0.747357, -0.715738, color),
+            ShapeVertex::from_xy(0.75618, -0.700837, color),
+            ShapeVertex::from_xy(0.764664, -0.685972, color),
+            ShapeVertex::from_xy(0.772816, -0.671131, color),
+            ShapeVertex::from_xy(0.78064, -0.656303, color),
+            ShapeVertex::from_xy(0.788144, -0.641477, color),
+            ShapeVertex::from_xy(0.795332, -0.626639, color),
+            ShapeVertex::from_xy(0.802211, -0.61178, color),
+            ShapeVertex::from_xy(0.808786, -0.596886, color),
+            ShapeVertex::from_xy(0.815064, -0.581946, color),
+            ShapeVertex::from_xy(0.82105, -0.566949, color),
+            ShapeVertex::from_xy(0.826749, -0.551884, color),
+            ShapeVertex::from_xy(0.832169, -0.536737, color),
+            ShapeVertex::from_xy(0.838133, -0.520599, color),
+            ShapeVertex::from_xy(0.843678, -0.504358, color),
+            ShapeVertex::from_xy(0.848829, -0.488061, color),
+            ShapeVertex::from_xy(0.85361, -0.471755, color),
+            ShapeVertex::from_xy(0.858048, -0.455488, color),
+            ShapeVertex::from_xy(0.862165, -0.439306, color),
+            ShapeVertex::from_xy(0.865988, -0.423256, color),
+            ShapeVertex::from_xy(0.86954, -0.407386, color),
+            ShapeVertex::from_xy(0.872847, -0.391742, color),
+            ShapeVertex::from_xy(0.875933, -0.376372, color),
+            ShapeVertex::from_xy(0.878823, -0.361321, color),
+            ShapeVertex::from_xy(0.881541, -0.346639, color),
+            ShapeVertex::from_xy(0.881548, -0.346594, color),
+            ShapeVertex::from_xy(0.881569, -0.346469, color),
+            ShapeVertex::from_xy(0.881601, -0.34628, color),
+            ShapeVertex::from_xy(0.88164, -0.346044, color),
+            ShapeVertex::from_xy(0.881685, -0.345775, color),
+            ShapeVertex::from_xy(0.881732, -0.345491, color),
+            ShapeVertex::from_xy(0.88178, -0.345207, color),
+            ShapeVertex::from_xy(0.881824, -0.344938, color),
+            ShapeVertex::from_xy(0.881864, -0.344702, color),
+            ShapeVertex::from_xy(0.881895, -0.344513, color),
+            ShapeVertex::from_xy(0.881916, -0.344388, color),
+            ShapeVertex::from_xy(0.881924, -0.344343, color),
+            ShapeVertex::from_xy(0.880393, -0.342583, color),
+            ShapeVertex::from_xy(0.396015, -0.022845, color),
+            ShapeVertex::from_xy(0.499121, -0.022845, color),
+            ShapeVertex::from_xy(0.511582, -0.023282, color),
+            ShapeVertex::from_xy(0.523905, -0.024581, color),
+            ShapeVertex::from_xy(0.536051, -0.026725, color),
+            ShapeVertex::from_xy(0.547977, -0.029696, color),
+            ShapeVertex::from_xy(0.559643, -0.033475, color),
+            ShapeVertex::from_xy(0.571007, -0.038045, color),
+            ShapeVertex::from_xy(0.582028, -0.043389, color),
+            ShapeVertex::from_xy(0.592665, -0.049488, color),
+            ShapeVertex::from_xy(0.602877, -0.056325, color),
+            ShapeVertex::from_xy(0.612623, -0.063882, color),
+            ShapeVertex::from_xy(0.62186, -0.07214, color),
+            ShapeVertex::from_xy(0.630549, -0.081083, color),
+            ShapeVertex::from_xy(0.634101, -0.084998, color),
+            ShapeVertex::from_xy(0.643919, -0.095822, color),
+            ShapeVertex::from_xy(0.658751, -0.112173, color),
+            ShapeVertex::from_xy(0.677344, -0.13267, color),
+            ShapeVertex::from_xy(0.698443, -0.155929, color),
+            ShapeVertex::from_xy(0.720796, -0.180571, color),
+            ShapeVertex::from_xy(0.743149, -0.205213, color),
+            ShapeVertex::from_xy(0.764248, -0.228473, color),
+            ShapeVertex::from_xy(0.782841, -0.248969, color),
+            ShapeVertex::from_xy(0.797673, -0.26532, color),
+            ShapeVertex::from_xy(0.807491, -0.276144, color),
+            ShapeVertex::from_xy(0.811043, -0.280059, color),
+            ShapeVertex::from_xy(0.820559, -0.291481, color),
+            ShapeVertex::from_xy(0.829005, -0.303547, color),
+            ShapeVertex::from_xy(0.836366, -0.316184, color),
+            ShapeVertex::from_xy(0.842628, -0.329321, color),
+            ShapeVertex::from_xy(0.847775, -0.342886, color),
+            ShapeVertex::from_xy(0.851793, -0.356808, color),
+            ShapeVertex::from_xy(0.854669, -0.371015, color),
+            ShapeVertex::from_xy(0.856386, -0.385436, color),
+            ShapeVertex::from_xy(0.85693, -0.4, color),
+            ShapeVertex::from_xy(0.856288, -0.414635, color),
+            ShapeVertex::from_xy(0.854443, -0.429269, color),
+            ShapeVertex::from_xy(0.851382, -0.443831, color),
+            ShapeVertex::from_xy(0.849473, -0.451284, color),
+            ShapeVertex::from_xy(0.847494, -0.458754, color),
+            ShapeVertex::from_xy(0.845444, -0.466238, color),
+            ShapeVertex::from_xy(0.843319, -0.473731, color),
+            ShapeVertex::from_xy(0.841118, -0.481228, color),
+            ShapeVertex::from_xy(0.838838, -0.488725, color),
+            ShapeVertex::from_xy(0.836477, -0.496216, color),
+            ShapeVertex::from_xy(0.834032, -0.503699, color),
+            ShapeVertex::from_xy(0.831501, -0.511168, color),
+            ShapeVertex::from_xy(0.828881, -0.518618, color),
+            ShapeVertex::from_xy(0.82617, -0.526046, color),
+            ShapeVertex::from_xy(0.823367, -0.533446, color),
+            ShapeVertex::from_xy(0.821277, -0.539406, color),
+            ShapeVertex::from_xy(0.819144, -0.545348, color),
+            ShapeVertex::from_xy(0.816965, -0.551274, color),
+            ShapeVertex::from_xy(0.814742, -0.557184, color),
+            ShapeVertex::from_xy(0.812475, -0.563081, color),
+            ShapeVertex::from_xy(0.810162, -0.568965, color),
+            ShapeVertex::from_xy(0.807806, -0.574838, color),
+            ShapeVertex::from_xy(0.805404, -0.580701, color),
+            ShapeVertex::from_xy(0.802958, -0.586556, color),
+            ShapeVertex::from_xy(0.800467, -0.592404, color),
+            ShapeVertex::from_xy(0.797931, -0.598245, color),
+            ShapeVertex::from_xy(0.795351, -0.604082, color),
+            ShapeVertex::from_xy(0.787517, -0.619513, color),
+            ShapeVertex::from_xy(0.77832, -0.633929, color),
+            ShapeVertex::from_xy(0.767859, -0.647266, color),
+            ShapeVertex::from_xy(0.756236, -0.659464, color),
+            ShapeVertex::from_xy(0.743551, -0.670459, color),
+            ShapeVertex::from_xy(0.729905, -0.68019, color),
+            ShapeVertex::from_xy(0.715397, -0.688595, color),
+            ShapeVertex::from_xy(0.700129, -0.695611, color),
+            ShapeVertex::from_xy(0.6842, -0.701176, color),
+            ShapeVertex::from_xy(0.667712, -0.705228, color),
+            ShapeVertex::from_xy(0.650764, -0.707705, color),
+            ShapeVertex::from_xy(0.633458, -0.708544, color),
+            ShapeVertex::from_xy(0.626143, -0.708544, color),
+            ShapeVertex::from_xy(0.605919, -0.708544, color),
+            ShapeVertex::from_xy(0.575367, -0.708544, color),
+            ShapeVertex::from_xy(0.537071, -0.708544, color),
+            ShapeVertex::from_xy(0.49361, -0.708544, color),
+            ShapeVertex::from_xy(0.447568, -0.708544, color),
+            ShapeVertex::from_xy(0.401526, -0.708544, color),
+            ShapeVertex::from_xy(0.358066, -0.708544, color),
+            ShapeVertex::from_xy(0.319769, -0.708544, color),
+            ShapeVertex::from_xy(0.289218, -0.708544, color),
+            ShapeVertex::from_xy(0.268993, -0.708544, color),
+            ShapeVertex::from_xy(0.261678, -0.708544, color),
+            ShapeVertex::from_xy(0.244388, -0.707705, color),
+            ShapeVertex::from_xy(0.227451, -0.705228, color),
+            ShapeVertex::from_xy(0.210968, -0.701176, color),
+            ShapeVertex::from_xy(0.195042, -0.695611, color),
+            ShapeVertex::from_xy(0.179772, -0.688595, color),
+            ShapeVertex::from_xy(0.16526, -0.68019, color),
+            ShapeVertex::from_xy(0.151608, -0.670459, color),
+            ShapeVertex::from_xy(0.138917, -0.659464, color),
+            ShapeVertex::from_xy(0.127288, -0.647266, color),
+            ShapeVertex::from_xy(0.116822, -0.633929, color),
+            ShapeVertex::from_xy(0.107621, -0.619513, color),
+            ShapeVertex::from_xy(0.099785, -0.604082, color),
+            ShapeVertex::from_xy(0.097207, -0.598261, color),
+            ShapeVertex::from_xy(0.094675, -0.592431, color),
+            ShapeVertex::from_xy(0.092189, -0.586591, color),
+            ShapeVertex::from_xy(0.089749, -0.580741, color),
+            ShapeVertex::from_xy(0.087354, -0.574882, color),
+            ShapeVertex::from_xy(0.085003, -0.569013, color),
+            ShapeVertex::from_xy(0.082694, -0.563135, color),
+            ShapeVertex::from_xy(0.080428, -0.557247, color),
+            ShapeVertex::from_xy(0.078203, -0.551349, color),
+            ShapeVertex::from_xy(0.076019, -0.545442, color),
+            ShapeVertex::from_xy(0.073875, -0.539525, color),
+            ShapeVertex::from_xy(0.07177, -0.533599, color),
+            ShapeVertex::from_xy(0.068966, -0.52618, color),
+            ShapeVertex::from_xy(0.066255, -0.518733, color),
+            ShapeVertex::from_xy(0.063636, -0.511265, color),
+            ShapeVertex::from_xy(0.061105, -0.503778, color),
+            ShapeVertex::from_xy(0.058659, -0.496279, color),
+            ShapeVertex::from_xy(0.056298, -0.488772, color),
+            ShapeVertex::from_xy(0.054018, -0.481262, color),
+            ShapeVertex::from_xy(0.051817, -0.473754, color),
+            ShapeVertex::from_xy(0.049693, -0.466251, color),
+            ShapeVertex::from_xy(0.047642, -0.45876, color),
+            ShapeVertex::from_xy(0.045664, -0.451285, color),
+            ShapeVertex::from_xy(0.043754, -0.443831, color),
+            ShapeVertex::from_xy(0.040693, -0.429269, color),
+            ShapeVertex::from_xy(0.038849, -0.414635, color),
+            ShapeVertex::from_xy(0.038206, -0.4, color),
+            ShapeVertex::from_xy(0.038751, -0.385436, color),
+            ShapeVertex::from_xy(0.040468, -0.371015, color),
+            ShapeVertex::from_xy(0.043343, -0.356808, color),
+            ShapeVertex::from_xy(0.047361, -0.342886, color),
+            ShapeVertex::from_xy(0.052509, -0.329321, color),
+            ShapeVertex::from_xy(0.05877, -0.316184, color),
+            ShapeVertex::from_xy(0.066131, -0.303547, color),
+            ShapeVertex::from_xy(0.074577, -0.291481, color),
+            ShapeVertex::from_xy(0.084094, -0.280059, color),
+            ShapeVertex::from_xy(0.087645, -0.276144, color),
+            ShapeVertex::from_xy(0.097463, -0.26532, color),
+            ShapeVertex::from_xy(0.112296, -0.248969, color),
+            ShapeVertex::from_xy(0.130888, -0.228473, color),
+            ShapeVertex::from_xy(0.151988, -0.205213, color),
+            ShapeVertex::from_xy(0.17434, -0.180571, color),
+            ShapeVertex::from_xy(0.196693, -0.155929, color),
+            ShapeVertex::from_xy(0.217792, -0.13267, color),
+            ShapeVertex::from_xy(0.236385, -0.112173, color),
+            ShapeVertex::from_xy(0.251217, -0.095822, color),
+            ShapeVertex::from_xy(0.261036, -0.084998, color),
+            ShapeVertex::from_xy(0.264587, -0.081083, color),
+            ShapeVertex::from_xy(0.273276, -0.07214, color),
+            ShapeVertex::from_xy(0.282514, -0.063882, color),
+            ShapeVertex::from_xy(0.292259, -0.056325, color),
+            ShapeVertex::from_xy(0.302471, -0.049488, color),
+            ShapeVertex::from_xy(0.313108, -0.043389, color),
+            ShapeVertex::from_xy(0.32413, -0.038045, color),
+            ShapeVertex::from_xy(0.335494, -0.033475, color),
+            ShapeVertex::from_xy(0.347159, -0.029696, color),
+            ShapeVertex::from_xy(0.359086, -0.026725, color),
+            ShapeVertex::from_xy(0.371231, -0.024581, color),
+            ShapeVertex::from_xy(0.383555, -0.023282, color),
+            ShapeVertex::from_xy(0.386064, -0.489978, color),
+            ShapeVertex::from_xy(0.168753, -0.484315, color),
+            ShapeVertex::from_xy(0.168753, -0.476585, color),
+            ShapeVertex::from_xy(0.386064, -0.470998, color),
+            ShapeVertex::from_xy(0.386064, -0.489978, color),
+            ShapeVertex::from_xy(0.508996, -0.470998, color),
+            ShapeVertex::from_xy(0.726307, -0.476585, color),
+            ShapeVertex::from_xy(0.726307, -0.484315, color),
+            ShapeVertex::from_xy(0.508996, -0.489978, color),
+            ShapeVertex::from_xy(0.508996, -0.470998, color),
+            ShapeVertex::from_xy(0.386064, -0.296742, color),
+            ShapeVertex::from_xy(0.226697, -0.291079, color),
+            ShapeVertex::from_xy(0.226697, -0.283349, color),
+            ShapeVertex::from_xy(0.386064, -0.277763, color),
+            ShapeVertex::from_xy(0.386064, -0.296742, color),
+            ShapeVertex::from_xy(0.508996, -0.277763, color),
+            ShapeVertex::from_xy(0.668363, -0.283349, color),
+            ShapeVertex::from_xy(0.668363, -0.291079, color),
+            ShapeVertex::from_xy(0.508996, -0.296742, color),
+            ShapeVertex::from_xy(0.508996, -0.277763, color),
+            ShapeVertex::from_xy(0.306074, -0.195953, color),
+            ShapeVertex::from_xy(0.306074, -0.188224, color),
+            ShapeVertex::from_xy(0.44753, -0.182637, color),
+            ShapeVertex::from_xy(0.588985, -0.188224, color),
+            ShapeVertex::from_xy(0.588985, -0.195953, color),
+            ShapeVertex::from_xy(0.44753, -0.20154, color),
+            ShapeVertex::from_xy(0.306074, -0.195953, color),
+            ShapeVertex::from_xy(0.451893, -0.478804, color),
+            ShapeVertex::from_xy(0.442401, -0.478804, color),
+            ShapeVertex::from_xy(0.435436, -0.39225, color),
+            ShapeVertex::from_xy(0.148468, -0.386893, color),
+            ShapeVertex::from_xy(0.148468, -0.379164, color),
+            ShapeVertex::from_xy(0.435436, -0.373807, color),
+            ShapeVertex::from_xy(0.442401, -0.287252, color),
+            ShapeVertex::from_xy(0.451893, -0.287252, color),
+            ShapeVertex::from_xy(0.458399, -0.37396, color),
+            ShapeVertex::from_xy(0.746592, -0.379164, color),
+            ShapeVertex::from_xy(0.746592, -0.386893, color),
+            ShapeVertex::from_xy(0.458399, -0.392097, color),
+            ShapeVertex::from_xy(0.451893, -0.478804, color),
+            ShapeVertex::from_xy(0.645858, -0.570104, color),
+            ShapeVertex::from_xy(0.645858, -0.577833, color),
+            ShapeVertex::from_xy(0.44753, -0.58342, color),
+            ShapeVertex::from_xy(0.249201, -0.577833, color),
+            ShapeVertex::from_xy(0.249201, -0.570104, color),
+            ShapeVertex::from_xy(0.44753, -0.564517, color),
+            ShapeVertex::from_xy(0.645858, -0.570104, color),
+        ],
+        indices: vec![
+            38, 40, 39, 38, 41, 40, 37, 41, 38, 36, 41, 37, 35, 41, 36, 34, 41, 35, 33, 41,
+            34, 32, 41, 33, 31, 41, 32, 30, 41, 31, 29, 41, 30, 28, 41, 29, 27, 41, 28, 26,
+            165, 27, 165, 164, 27, 164, 41, 27, 164, 163, 41, 163, 162, 41, 162, 161, 41, 161, 160, 41,
+            160, 159, 41, 159, 158, 41, 158, 157, 41, 157, 156, 41, 156, 155, 41, 155, 154, 41, 154, 153,
+            41, 153, 152, 41, 152, 151, 41, 151, 42, 41, 26, 166, 165, 150, 42, 151, 26, 167, 166, 149,
+            42, 150, 26, 168, 167, 148, 42, 149, 25, 168, 26, 148, 43, 42, 25, 169, 168, 147, 43, 148,
+            25, 170, 169, 146, 43, 147, 24, 170, 25, 146, 44, 43, 24, 171, 170, 145, 44, 146, 23, 171,
+            24, 145, 45, 44, 23, 172, 171, 144, 45, 145, 23, 173, 172, 143, 45, 144, 22, 173, 23, 143,
+            46, 45, 22, 174, 173, 142, 46, 143, 21, 174, 22, 142, 47, 46, 21, 175, 174, 141, 47, 142,
+            20, 175, 21, 141, 48, 47, 20, 176, 175, 140, 48, 141, 19, 176, 20, 140, 49, 48, 19, 177,
+            176, 139, 49, 140, 19, 178, 177, 138, 49, 139, 18, 178, 19, 138, 50, 49, 18, 179, 178, 137,
+            50, 138, 18, 180, 179, 136, 50, 137, 279, 277, 278, 17, 180, 18, 136, 51, 50, 17, 181, 180,
+            135, 51, 136, 280, 277, 279, 280, 282, 277, 17, 182, 181, 134, 51, 135, 281, 282, 280, 17, 183,
+            182, 133, 51, 134, 16, 183, 17, 133, 52, 51, 16, 184, 183, 132, 52, 133, 16, 185, 184, 131,
+            52, 132, 15, 185, 16, 131, 53, 52, 15, 186, 185, 130, 53, 131, 15, 187, 186, 129, 53, 130,
+            15, 188, 187, 128, 53, 129, 14, 188, 15, 128, 54, 53, 14, 189, 188, 127, 54, 128, 14, 190,
+            189, 126, 54, 127, 13, 190, 14, 126, 55, 54, 13, 191, 190, 125, 55, 126, 13, 192, 191, 124,
+            55, 125, 12, 192, 13, 124, 56, 55, 12, 193, 192, 123, 56, 124, 12, 194, 193, 122, 56, 123,
+            237, 239, 240, 245, 243, 244, 12, 195, 194, 121, 56, 122, 11, 195, 12, 121, 57, 56, 238, 239,
+            237, 245, 242, 243, 11, 196, 195, 120, 57, 121, 265, 275, 264, 265, 274, 275, 11, 197, 196, 119,
+            57, 120, 10, 197, 11, 119, 58, 57, 10, 198, 197, 118, 58, 119, 10, 199, 198, 117, 58, 118,
+            9, 199, 10, 117, 59, 58, 9, 200, 199, 116, 59, 117, 9, 201, 200, 115, 59, 116, 8, 201,
+            9, 115, 60, 59, 114, 60, 115, 8, 202, 201, 7, 202, 8, 114, 61, 60, 113, 61, 114, 7,
+            203, 202, 6, 203, 7, 113, 62, 61, 112, 62, 113, 6, 204, 203, 266, 274, 265, 266, 273, 274,
+            5, 204, 6, 112, 63, 62, 267, 273, 266, 267, 272, 273, 111, 63, 112, 5, 205, 204, 268, 272,
+            267, 268, 271, 272, 4, 205, 5, 111, 64, 63, 268, 270, 271, 269, 270, 268, 110, 64, 111, 4,
+            206, 205, 3, 206, 4, 110, 65, 64, 109, 65, 110, 3, 207, 206, 2, 207, 3, 109, 66, 65,
+            109, 67, 66, 109, 68, 67, 109, 69, 68, 109, 70, 69, 109, 71, 70, 109, 72, 71, 109, 73,
+            72, 109, 74, 73, 109, 75, 74, 109, 76, 75, 109, 77, 76, 1, 212, 2, 212, 211, 2, 211,
+            210, 2, 210, 209, 2, 209, 208, 2, 208, 207, 2, 109, 78, 77, 108, 78, 109, 108, 107, 78,
+            107, 106, 78, 106, 105, 78, 105, 104, 78, 104, 0, 78, 247, 249, 250, 255, 253, 254, 248, 249,
+            247, 255, 252, 253, 1, 213, 212, 103, 0, 104, 102, 0, 103, 1, 214, 213, 101, 0, 102, 1,
+            215, 214, 100, 0, 101, 1, 216, 215, 99, 0, 100, 1, 217, 216, 98, 0, 99, 1, 218, 217,
+            262, 260, 261, 257, 260, 262, 257, 259, 260, 258, 259, 257, 97, 0, 98, 1, 219, 218, 96, 0,
+            97, 1, 220, 219, 95, 0, 96, 1, 221, 220, 94, 0, 95, 1, 222, 221, 93, 0, 94, 1,
+            223, 222, 92, 0, 93, 1, 224, 223, 1, 225, 224, 91, 0, 92, 1, 226, 225, 90, 0, 91,
+            1, 227, 226, 89, 0, 90, 1, 228, 227, 88, 0, 89, 1, 229, 228, 87, 0, 88, 1, 230,
+            229, 86, 0, 87, 1, 231, 230, 85, 0, 86, 1, 232, 231, 84, 0, 85, 1, 233, 232, 83,
+            0, 84, 1, 234, 233, 82, 0, 83, 81, 0, 82, 1, 235, 234, 80, 0, 81, 1, 79, 235,
+            1, 80, 79, 1, 0, 80,
+        ],
+    }
+}

+ 8 - 0
bin/app/src/shape/mod.rs

@@ -41,6 +41,14 @@ pub use version_block::create_version_block;
 mod copy;
 pub use copy::create_copy;
 
+mod contacts_icon;
+pub use contacts_icon::create_contacts_icon;
+mod channels_icon;
+pub use channels_icon::create_channels_icon;
+
+mod menu_icon;
+pub use menu_icon::create_menu_icon;
+
 mod blockchain_netlogo1;
 pub use blockchain_netlogo1::create_blockchain_netlogo1;
 mod blockchain_netlogo2;

Некоторые файлы не были показаны из-за большого количества измененных файлов