Merge pull request 'Global Toolbar' (#284) from dan/ui:toolbar into master
the build was successful Details

This commit is contained in:
Sarah Jamie Lewis 2020-05-04 12:51:40 -07:00
commit 4ccf48a50f
64 changed files with 488 additions and 297 deletions

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/></svg>

After

Width:  |  Height:  |  Size: 367 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.07 18.28c.43-.9 3.05-1.78 4.93-1.78s4.51.88 4.93 1.78C15.57 19.36 13.86 20 12 20s-3.57-.64-4.93-1.72zm11.29-1.45c-1.43-1.74-4.9-2.33-6.36-2.33s-4.93.59-6.36 2.33C4.62 15.49 4 13.82 4 12c0-4.41 3.59-8 8-8s8 3.59 8 8c0 1.82-.62 3.49-1.64 4.83zM12 6c-1.94 0-3.5 1.56-3.5 3.5S10.06 13 12 13s3.5-1.56 3.5-3.5S13.94 6 12 6zm0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11z"/></svg>

After

Width:  |  Height:  |  Size: 597 B

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<g>
<circle class="st0" cx="12" cy="9.5" r="1.5"/>
<path class="st0" d="M12,4c-4.4,0-8,3.6-8,8c0,1.8,0.6,3.5,1.6,4.8c1.4-1.7,4.9-2.3,6.4-2.3s4.9,0.6,6.4,2.3c1-1.3,1.6-3,1.6-4.8
C20,7.6,16.4,4,12,4z M12,13c-1.9,0-3.5-1.6-3.5-3.5S10.1,6,12,6s3.5,1.6,3.5,3.5S13.9,13,12,13z"/>
<path class="st0" d="M12,16.5c-1.9,0-4.5,0.9-4.9,1.8C8.4,19.4,10.1,20,12,20s3.6-0.6,4.9-1.7C16.5,17.4,13.9,16.5,12,16.5z"/>
<path d="M12,6c-1.9,0-3.5,1.6-3.5,3.5S10.1,13,12,13s3.5-1.6,3.5-3.5S13.9,6,12,6z M12,11c-0.8,0-1.5-0.7-1.5-1.5S11.2,8,12,8
s1.5,0.7,1.5,1.5S12.8,11,12,11z"/>
<path d="M12,3.4c-4.7,0-8.6,3.8-8.6,8.6c0,4.7,3.8,8.6,8.6,8.6c4.7,0,8.6-3.8,8.6-8.6C20.6,7.3,16.7,3.4,12,3.4z M12,20
c-1.9,0-3.6-0.6-4.9-1.7c0.4-0.9,3-1.8,4.9-1.8s4.5,0.9,4.9,1.8C15.6,19.4,13.9,20,12,20z M12,14.5c-1.5,0-4.9,0.6-6.4,2.3
c-1-1.3-1.6-3-1.6-4.8c0-4.4,3.6-8,8-8s8,3.6,8,8c0,1.8-0.6,3.5-1.6,4.8C16.9,15.1,13.5,14.5,12,14.5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FF0000;}
</style>
<g>
<path class="st0" d="M5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8c1.5-1.7,4.9-2.3,6.4-2.3C10.5,14.5,7.1,15.1,5.6,16.8z"/>
<circle class="st0" cx="12" cy="9.5" r="1.5"/>
<path class="st0" d="M12,16.5c-1.9,0-4.4,0.9-4.9,1.8c1.3,1.1,3,1.7,4.9,1.7s3.5-0.6,4.9-1.7C16.4,17.4,13.9,16.5,12,16.5z"/>
<path d="M12,6c-1.9,0-3.5,1.6-3.5,3.5S10.1,13,12,13s3.5-1.6,3.5-3.5S13.9,6,12,6z M12,11c-0.8,0-1.5-0.7-1.5-1.5S11.2,8,12,8
s1.5,0.7,1.5,1.5S12.8,11,12,11z"/>
<path d="M12,11c0.8,0,1.5-0.7,1.5-1.5C13.5,10.3,12.8,11,12,11z"/>
<path d="M10.5,9.5c0,0.8,0.7,1.5,1.5,1.5C11.2,11,10.5,10.3,10.5,9.5z"/>
<path d="M12,8c0.8,0,1.5,0.7,1.5,1.5C13.5,8.7,12.8,8,12,8z"/>
<path d="M12,8c-0.8,0-1.5,0.7-1.5,1.5C10.5,8.7,11.2,8,12,8z"/>
<path d="M5.6,16.8c0.4,0.6,0.9,1.1,1.5,1.5c0.4-0.9,3-1.8,4.9-1.8c1.9,0,4.4,0.9,4.9,1.8c0.6-0.4,1.1-0.9,1.5-1.5
c-1.5-1.7-4.9-2.3-6.4-2.3S7.2,15.1,5.6,16.8z"/>
<path class="st1" d="M5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></svg>

After

Width:  |  Height:  |  Size: 240 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 353 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"/></svg>

After

Width:  |  Height:  |  Size: 373 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>

After

Width:  |  Height:  |  Size: 197 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z"/></svg>

After

Width:  |  Height:  |  Size: 195 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>

After

Width:  |  Height:  |  Size: 249 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M6 21h12V7H6v14zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg>

After

Width:  |  Height:  |  Size: 189 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></svg>

After

Width:  |  Height:  |  Size: 190 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>

After

Width:  |  Height:  |  Size: 431 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM21.41 6.34l-3.75-3.75-2.53 2.54 3.75 3.75 2.53-2.54z"/></svg>

After

Width:  |  Height:  |  Size: 240 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>

After

Width:  |  Height:  |  Size: 314 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><path d="M0 0h24v24H0V0z"/><path opacity=".87" d="M0 0h24v24H0V0z"/></g><path d="M20 8h-3V6.21c0-2.61-1.91-4.94-4.51-5.19C9.51.74 7 3.08 7 6v2H4v14h16V8zm-8 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM9 8V6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9z"/></svg>

After

Width:  |  Height:  |  Size: 349 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M20 8h-3V6.21c0-2.61-1.91-4.94-4.51-5.19C9.51.74 7 3.08 7 6h2c0-1.13.6-2.24 1.64-2.7C12.85 2.31 15 3.9 15 6v2H4v14h16V8zm-2 12H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"/></svg>

After

Width:  |  Height:  |  Size: 327 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>

After

Width:  |  Height:  |  Size: 185 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></svg>

After

Width:  |  Height:  |  Size: 493 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2 .01 7z"/></svg>

After

Width:  |  Height:  |  Size: 183 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M2 22h20V2L2 22z"/></svg>

After

Width:  |  Height:  |  Size: 156 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zM2 22h16V8h4V2L2 22z"/></svg>

After

Width:  |  Height:  |  Size: 192 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M21 1l-8.31 8.31 8.31 8.3zM4.91 4.36L3.5 5.77l6.36 6.37L1 21h17.73l2 2 1.41-1.41z"/></svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M.01 0h24v24h-24V0z" fill="none"/><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></svg>

After

Width:  |  Height:  |  Size: 367 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0zm0 0h24v24H0V0z" fill="none"/><path d="M10 6.35V4.26c-.66.17-1.29.43-1.88.75l1.5 1.5c.13-.05.25-.11.38-.16zM20 12c0-2.21-.91-4.2-2.36-5.64L20 4h-6v6l2.24-2.24C17.32 8.85 18 10.34 18 12c0 .85-.19 1.65-.51 2.38l1.5 1.5C19.63 14.74 20 13.41 20 12zM4.27 4L2.86 5.41l2.36 2.36C4.45 8.99 4 10.44 4 12c0 2.21.91 4.2 2.36 5.64L4 20h6v-6l-2.24 2.24C6.68 15.15 6 13.66 6 12c0-1 .25-1.94.68-2.77l8.08 8.08c-.25.13-.5.24-.76.34v2.09c.8-.21 1.55-.54 2.23-.96l2.58 2.58 1.41-1.41L4.27 4z"/></svg>

After

Width:  |  Height:  |  Size: 589 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M3 12c0 2.21.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24C5.68 15.15 5 13.66 5 12c0-2.61 1.67-4.83 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24C18.32 8.85 19 10.34 19 12c0 2.61-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z"/></svg>

After

Width:  |  Height:  |  Size: 426 B

View File

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><title>syncing</title><path d="M200,64a136,136,0,1,1-96.17,39.83A135.14,135.14,0,0,1,200,64m0-41A177,177,0,1,0,377,200,177,177,0,0,0,200,23Z"/><polygon points="177.25 285.49 95.25 203.5 124.25 174.5 177.25 227.51 275.75 129 304.75 158 177.25 285.49"/></svg>

After

Width:  |  Height:  |  Size: 352 B

View File

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><title>syncing</title><path d="M200,377.5c-97.87,0-177.5-79.63-177.5-177.5S102.13,22.5,200,22.5v41C124.73,63.5,63.5,124.73,63.5,200S124.73,336.5,200,336.5Z"/><path d="M217.37,64.59A139.55,139.55,0,0,0,200,63.5v-41a179.92,179.92,0,0,1,22.53,1.42Z"/><path d="M267.58,364.18,252,326.27a136.44,136.44,0,0,0,30.94-17.82L307.83,341A177.32,177.32,0,0,1,267.58,364.18Zm73.11-55.95-32.48-25a136.09,136.09,0,0,0,17.91-30.9L364,268A177.33,177.33,0,0,1,340.69,308.23ZM376,223.14l-40.65-5.3a139,139,0,0,0,0-35.76L376,176.75A180.23,180.23,0,0,1,377.5,200,178.41,178.41,0,0,1,376,223.14Zm-49.91-75.53a136.37,136.37,0,0,0-17.92-30.88l32.47-25A177.54,177.54,0,0,1,364,131.86ZM282.85,91.5a136.72,136.72,0,0,0-31-17.8l15.6-37.92a177.75,177.75,0,0,1,40.27,23.16Z"/><path d="M200,377.5v-41a139.43,139.43,0,0,0,17.37-1.09l5.16,40.67A179.92,179.92,0,0,1,200,377.5Z"/><rect x="177.5" y="112.5" width="45" height="114"/><rect x="177.5" y="253.5" width="45" height="34"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><title>syncing</title><rect x="179.5" y="112.5" width="41" height="114"/><rect x="179.5" y="253.5" width="41" height="34"/><path d="M200,377.5a179.92,179.92,0,0,1-22.53-1.42l5.16-40.67A139.43,139.43,0,0,0,200,336.5Z"/><path d="M132.52,364.22a177.53,177.53,0,0,1-40.27-23.16l24.91-32.56a136.59,136.59,0,0,0,31,17.8ZM59.36,308.3a177.92,177.92,0,0,1-23.31-40.16l37.86-15.76a136.22,136.22,0,0,0,17.92,30.89ZM24,223.25a179.57,179.57,0,0,1,0-46.4l40.65,5.31a139.05,139.05,0,0,0,0,35.77Zm49.87-75.56L36,132a177.48,177.48,0,0,1,23.3-40.19l32.48,25A135.88,135.88,0,0,0,73.88,147.69ZM117.1,91.55,92.17,59a177.44,177.44,0,0,1,40.25-23.17L148,73.73A136.44,136.44,0,0,0,117.1,91.55Z"/><path d="M182.63,64.59l-5.16-40.67A179.92,179.92,0,0,1,200,22.5v41A139.55,139.55,0,0,0,182.63,64.59Z"/><path d="M217.37,64.59A139.55,139.55,0,0,0,200,63.5v-41a179.92,179.92,0,0,1,22.53,1.42Z"/><path d="M267.58,364.18,252,326.27a136.44,136.44,0,0,0,30.94-17.82L307.83,341A177.32,177.32,0,0,1,267.58,364.18Zm73.11-55.95-32.48-25a136.09,136.09,0,0,0,17.91-30.9L364,268A177.11,177.11,0,0,1,340.69,308.23ZM376,223.14l-40.65-5.3a139,139,0,0,0,0-35.76L376,176.75A180.23,180.23,0,0,1,377.5,200,178.41,178.41,0,0,1,376,223.14Zm-49.91-75.53a136.37,136.37,0,0,0-17.92-30.88l32.47-25A177.54,177.54,0,0,1,364,131.86ZM282.85,91.5a136.72,136.72,0,0,0-31-17.8l15.6-37.92a177.75,177.75,0,0,1,40.27,23.16Z"/><path d="M200,377.5v-41a139.43,139.43,0,0,0,17.37-1.09l5.16,40.67A179.92,179.92,0,0,1,200,377.5Z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17 7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h10c2.76 0 5-2.24 5-5s-2.24-5-5-5zm0 8c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"/></svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@ -46,14 +46,16 @@ func processFile(filename string) {
indentCount := 0
inMultiLineComment := false
for _, line := range lines {
for ln, line := range lines {
singleCommentPos := strings.Index(line, "//")
multiLineCommentStartPos := strings.Index(line, "/*")
multiLineCommentEndPos := strings.Index(line, "*/")
openPos := strings.Index(line, "{")
closePos := strings.Index(line, "}")
if !inMultiLineComment && closePos > -1 && (singleCommentPos == -1 || closePos < singleCommentPos) &&
if !inMultiLineComment && closePos > -1 && (openPos == -1 || openPos > closePos) && (singleCommentPos == -1 || closePos < singleCommentPos) &&
(multiLineCommentStartPos == -1 || closePos < multiLineCommentStartPos) &&
(multiLineCommentEndPos == -1 || closePos > multiLineCommentEndPos) {
indentCount--
@ -63,11 +65,14 @@ func processFile(filename string) {
if trimedLine == "" {
file.Write([]byte("\n"))
} else {
if indentCount < 0 {
log.Fatalf("indent Count negative in %v at line %v\n", filename, ln)
}
file.Write([]byte(strings.Repeat(indent, indentCount) + trimedLine + "\n"))
}
openPos := strings.Index(line, "{")
if !inMultiLineComment && openPos > -1 && (singleCommentPos == -1 || openPos < singleCommentPos) &&
if !inMultiLineComment && openPos > -1 && (closePos == -1 || openPos > closePos) && (singleCommentPos == -1 || openPos < singleCommentPos) &&
(multiLineCommentStartPos == -1 || openPos < multiLineCommentStartPos) &&
(multiLineCommentEndPos == -1 || openPos > multiLineCommentEndPos) {
indentCount++

View File

@ -95,7 +95,6 @@ func profilePicRelativize(filename string) string {
// getProfilePic returns a string path to an image to display for hte given peer/group id
func getProfilePic(id string) string {
log.Debugf("getProfilePic for %v\n", id)
if isGroup(id) {
if picVal, exists := the.Peer.GetGroupAttribute(id, attr.GetLocalScope(constants.Picture)); exists {
pic, err := StringToImage(picVal)

View File

@ -59,9 +59,13 @@ func main() {
if buildVer == "" {
log.SetLevel(log.LevelDebug)
}
//log.ExcludeFromPattern("connection/connection")
log.ExcludeFromPattern("connection/connection")
//log.ExcludeFromPattern("outbound/3dhauthchannel")
//log.AddNothingExceptFilter("event/eventmanager")
log.ExcludeFromPattern("service.go")
log.ExcludeFromPattern("tor/BaseOnionService.go")
log.ExcludeFromPattern("applications/auth.go")
log.ExcludeFromPattern("connections/engine.go")
if os.Getenv("CWTCH_FOLDER") != "" {
the.CwtchDir = os.Getenv("CWTCH_FOLDER")

View File

@ -33,7 +33,6 @@
<file>qml/widgets/ProfileList.qml</file>
<file>qml/widgets/RadioButton.qml</file>
<file>qml/widgets/Button.qml</file>
<file>qml/widgets/StackToolbar.qml</file>
<file>qml/widgets/TextField.qml</file>
<file>qml/widgets/controls/Loader.qml</file>
<file>qml/widgets/controls/Variables.qml</file>

View File

@ -81,10 +81,28 @@ ApplicationWindow {
return px * 72 / (Screen.pixelDensity * 25.4)
}
Toolbar {
id: toolbar
onBack: { backFn() }
onRightMenu: {
if (gcd.selectedConversation.length == 32) {
theStack.pane = theStack.groupProfilePane
gcd.requestGroupSettings(gcd.selectedConversation)
} else {
theStack.pane = theStack.userProfilePane
gcd.requestPeerSettings()
}
}
}
StackLayout {
id: parentStack
currentIndex: 1
anchors.fill: parent
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.top: toolbar.bottom
readonly property int splashPane: 0
readonly property int managementPane: 1
@ -168,23 +186,28 @@ ApplicationWindow {
readonly property int groupProfilePane: 4
readonly property int addGroupPane: 5
property string title
Item { anchors.fill: parent } // empty
Item { anchors.fill: parent } // empty
OverlayPane { // messagePane
title: theStack.title
anchors.fill: parent
}
SettingsPane{ anchors.fill: parent }
SettingsPane { anchors.fill: parent }
PeerSettingsPane { anchors.fill: parent }
PeerSettingsPane { anchors.fill: parent }
GroupSettingsPane{ anchors.fill: parent }
GroupSettingsPane{ anchors.fill: parent }
AddGroupPane { anchors.fill: parent }
AddGroupPane { anchors.fill: parent }
onCurrentIndexChanged: {
if (currentIndex == emptyPane) {
toolbar.hideTitle()
toolbar.rightMenuVisible = false
}
}
onWidthChanged: {toolbar.titleWidth = width}
}
}
}
@ -193,18 +216,61 @@ ApplicationWindow {
Keys.onPressed: {
if (event.key == Qt.Key_Back) {
event.accepted = true
if (theStack.currentIndex == theStack.emptyPane) {
androidCwtchActivity.rootHomeButtonHandle()
} else if (theStack.currentIndex == theStack.userProfilePane || theStack.currentIndex == theStack.groupProfilePane) {
theStack.currentIndex = theStack.messagePane
backFn()
}
}
onCurrentIndexChanged : updateToolbar()
function updateToolbar() {
toolbar.hideTitle()
toolbar.rightMenuVisible = false
if (currentIndex == splashPane) {
toolbar.visible = false
} else {
toolbar.visible = true
if (currentIndex == managementPane) {
toolbar.color = Theme.backgroundMainColor
toolbar.leftMenuVisible = true
toolbar.backVisible = false
} else {
theStack.currentIndex = theStack.emptyPane
toolbar.leftMenuVisible = false
toolbar.backVisible = true
if (currentIndex == addEditProfilePane) {
toolbar.color = Theme.backgroundPaneColor
} else if (currentIndex == profilePane) {
toolbar.color = Theme.backgroundPaneColor
}
}
}
}
Component.onCompleted: updateToolbar()
}
function backFn() {
if (parentStack.currentIndex == parentStack.managementPane) {
androidCwtchActivity.rootHomeButtonHandle()
} else if (parentStack.currentIndex != parentStack.profilePane) {
parentStack.currentIndex = parentStack.managementPane
} else {
if (theStack.currentIndex == theStack.emptyPane) {
gcd.selectedProfile = "none"
gcd.reloadProfileList()
parentStack.pane = parentStack.managementPane
} else if (theStack.currentIndex == theStack.userProfilePane || theStack.currentIndex == theStack.groupProfilePane) {
theStack.currentIndex = theStack.messagePane
} else {
theStack.currentIndex = theStack.emptyPane
}
}
}
PropertyAnimation { id: anmPopup; easing.type: Easing.InQuart; duration: 7000; target: popup; property: "opacity"; to: 0; }
PropertyAnimation { id: anmPopup; easing.type: Easing.InQuart; duration: 7000; target: popup; property: "opacity"; to: 0; }
Rectangle { // THE ERROR MESSAGE POPUP
id: popup
@ -239,10 +305,6 @@ PropertyAnimation { id: anmPopup; easing.type: Easing.InQuart; duration: 7000; t
anmPopup.restart()
}
onSetToolbarTitle: function(str) {
theStack.title = str
}
onLoaded: function() {
parentStack.pane = parentStack.managementPane
splashPane.running = false

View File

@ -24,7 +24,7 @@ ColumnLayout {
placeholderText: "Search.."
style: CwtchTextFieldStyle{}
style: CwtchTextFieldStyle{}
anchors.left: parent.left
anchors.right: parent.right
@ -136,7 +136,7 @@ ColumnLayout {
RowLayout {
Button {
text: selected ? "-" : "+"
style: CwtchExpandingButton{}
style: CwtchExpandingButton{}
}
Text {
id: texttitle
@ -220,13 +220,13 @@ ColumnLayout {
//: title place holder text
placeholderText: qsTr("title-placeholder")
Layout.fillWidth: true
style: CwtchTextFieldStyle{}
style: CwtchTextFieldStyle{}
}
TextArea {
id: newpostbody
Layout.fillWidth: true
style: CwtchTextAreaStyle{}
style: CwtchTextAreaStyle{}
}
@ -241,7 +241,7 @@ ColumnLayout {
onClicked: {
if (newposttitle.text != "" && newpostbody.text != "") {
var msg = JSON.stringify({"o":2, "t":newposttitle.text, "b":newpostbody.text})
var msg = JSON.stringify({"o":2, "t":newposttitle.text, "b":newpostbody.text})
gcd.sendMessage(msg, nextMessageID++)
}
newposttitle.text = ""

View File

@ -26,7 +26,7 @@ Item {
model: messagesModel
spacing: 6
clip: true
ScrollBar.vertical: ScrollBar {}
ScrollBar.vertical: ScrollBar {}
maximumFlickVelocity: 1250
delegate: Widgets.Message {
@ -57,7 +57,7 @@ Item {
try {
msg = JSON.parse(message)
} catch (e) {
msg = {"o": 1, "d": "(legacy message type) " + message}
msg = {"o": 1, "d": "(legacy message type) " + message}
}
if (msg.o != 1) return
@ -90,7 +90,7 @@ Item {
try {
msg = JSON.parse(message)
} catch (e) {
msg = {"o": 1, "d": "(legacy message type) " + message}
msg = {"o": 1, "d": "(legacy message type) " + message}
}
if (msg.o != 1) return
@ -176,7 +176,7 @@ Item {
maximumFlickVelocity: 300
ScrollBar.vertical: ScrollBar{}
ScrollBar.vertical: ScrollBar{}
TextEdit {
id: txtMessage
@ -289,7 +289,7 @@ Item {
var txt = txtHidden.text.trim()
if (txt.length > 0) {
var rawText = txtHidden.getText(0, txtHidden.text.length)
var msg = JSON.stringify({"o":1, "d":rawText.replace(/\[\:newline\:\]/g,"\n")})
var msg = JSON.stringify({"o":1, "d":rawText.replace(/\[\:newline\:\]/g,"\n")})
gcd.sendMessage(msg, nextMessageID++)
}
}

View File

@ -24,7 +24,7 @@ ColumnLayout {
placeholderText: "Search.."
style: CwtchTextFieldStyle{}
style: CwtchTextFieldStyle{}
anchors.left: parent.left
anchors.right: parent.right
@ -140,7 +140,7 @@ ColumnLayout {
CheckBox {
checked: complete
onClicked: {
var msg = JSON.stringify({"o":4, "c":index})
var msg = JSON.stringify({"o":4, "c":index})
gcd.sendMessage(msg, btnSend.nextMessageID++)
}
}
@ -201,7 +201,7 @@ ColumnLayout {
//: Todo... placeholder text
placeholderText: qsTr("todo-placeholder")
Layout.fillWidth: true
style: CwtchTextFieldStyle{}
style: CwtchTextFieldStyle{}
}
Widgets.Button { // SEND MESSAGE BUTTON
@ -215,7 +215,7 @@ ColumnLayout {
onClicked: {
if (newposttitle.text != "") {
var msg = JSON.stringify({"o":4, "t":newposttitle.text})
var msg = JSON.stringify({"o":4, "t":newposttitle.text})
gcd.sendMessage(msg, nextMessageID++)
}
newposttitle.text = ""

View File

@ -13,19 +13,8 @@ ColumnLayout { // settingsPane
id: root
anchors.fill: parent
Widgets.StackToolbar {
id: stb
text: qsTr("create-group-title")
aux.visible: false
membership.visible: false
}
Flickable {
anchors.top: stb.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.fill: parent
boundsBehavior: Flickable.StopAtBounds
clip:true
contentWidth: tehcol.width
@ -44,7 +33,7 @@ ColumnLayout { // settingsPane
TextField {
id: txtServer
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
text: "2c3kmoobnyghj2zw6pwv7d57yzld753auo3ugauezzpvfak3ahc4bdyd"
}
@ -55,7 +44,7 @@ ColumnLayout { // settingsPane
TextField {
id: txtGroupName
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
//: default suggested group name
text: qsTr("default-group-name")
}

View File

@ -16,17 +16,8 @@ ColumnLayout { // groupSettingsPane
property string groupID
property variant addrbook
Widgets.StackToolbar {
id: toolbar
aux.visible: false
back.onClicked: theStack.pane = theStack.messagePane
}
Flickable {
anchors.top: toolbar.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.fill: parent
boundsBehavior: Flickable.StopAtBounds
clip:true
contentWidth: tehcol.width
@ -44,7 +35,7 @@ ColumnLayout { // groupSettingsPane
TextField {
id: txtServer
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
readOnly: true
}
@ -65,7 +56,7 @@ ColumnLayout { // groupSettingsPane
TextField {
id: txtInvitation
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
readOnly: true
}
@ -86,7 +77,7 @@ ColumnLayout { // groupSettingsPane
TextField {
id: txtGroupName
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
style: CwtchTextFieldStyle{ width: tehcol.width * 0.8 }
}
Widgets.Button {
@ -100,14 +91,14 @@ ColumnLayout { // groupSettingsPane
}
//: Invite someone to the group
Widgets.ScalingLabel { text: qsTr("invite-to-group-label") }
Widgets.ScalingLabel { text: qsTr("invite-to-group-label") }
ComboBox {
id: cbInvite
//popup.font.pixelSize: 12
width: 200
//font.pixelSize: 20
style: CwtchComboBoxStyle{}
style: CwtchComboBoxStyle{}
}
Widgets.Button {
@ -136,11 +127,10 @@ ColumnLayout { // groupSettingsPane
onSupplyGroupSettings: function(gid, name, server, invite, accepted, addrbooknames, addrbookaddrs) {
gsp.groupID = gid
toolbar.text = name
txtGroupName.text = name
txtServer.text = server
txtInvitation.text = invite
cbInvite.model = addrbooknames.map(function(e){return Utils.htmlEscaped(e)})
cbInvite.model = addrbooknames.map(function(e){return Utils.htmlEscaped(e)})
addrbook = addrbookaddrs
}
}

View File

@ -9,32 +9,11 @@ import "../overlays"
ColumnLayout {
Layout.fillWidth: true
property alias title: toolbar.text
id: overlay
property string name
property bool accepted
property bool inGroup
Widgets.StackToolbar {
id: toolbar
membership.visible: gcd.selectedConversation.length == 32
membership.onClicked: overlayStack.overlay = overlayStack.membershipOverlay
aux.onClicked: {
if (gcd.selectedConversation.length == 32) {
theStack.pane = theStack.groupProfilePane
gcd.requestGroupSettings(gcd.selectedConversation)
} else {
theStack.pane = theStack.userProfilePane
gcd.requestPeerSettings()
}
}
back.visible: true
}
RowLayout {
visible:!overlay.accepted && (gcd.selectedConversation.length == 32)

View File

@ -16,20 +16,8 @@ Column { // peerSettingsPane
anchors.fill: parent
property bool blocked
Widgets.StackToolbar {
id: toolbar
aux.visible: false
back.onClicked: theStack.pane = theStack.messagePane
}
Flickable {
anchors.top: toolbar.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.fill: parent
boundsBehavior: Flickable.StopAtBounds
clip:true
contentWidth: tehcol.width
@ -67,7 +55,7 @@ Column { // peerSettingsPane
}
}
Widgets.HLine{}
Widgets.HLine{}
GridLayout {
columns: 1
@ -96,7 +84,7 @@ Column { // peerSettingsPane
}
Widgets.HLine{}
Widgets.HLine{}
GridLayout {
@ -127,7 +115,7 @@ Column { // peerSettingsPane
}
Widgets.HLine{}
Widgets.HLine{}
Column {
width:parent.width * 0.95
anchors.horizontalCenter: parent.horizontalCenter
@ -152,7 +140,6 @@ Column { // peerSettingsPane
target: gcd
onSupplyPeerSettings: function(onion, nick, blocked) {
toolbar.text = nick
txtOnion.text = onion
txtDisplayName.text = nick
root.blocked = blocked

View File

@ -19,14 +19,6 @@ ColumnLayout { // Add Profile Pane
property bool deleting
property bool changingPassword
Widgets.StackToolbar {
id: stb
text: mode == "add" ? qsTr("add-profile-title") : qsTr("edit-profile-title")
aux.visible: false
membership.visible: false
stack: "management"
}
function reset() {
mode = "add"
txtProfileName.text = qsTr("default-profile-name")
@ -64,7 +56,7 @@ ColumnLayout { // Add Profile Pane
Flickable {
anchors.top: stb.bottom
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom

View File

@ -30,7 +30,7 @@ ColumnLayout {
TextField {
id: txtPassword
anchors.horizontalCenter: parent.horizontalCenter
style: CwtchTextFieldStyle{ width: thecol.width * 0.8 }
style: CwtchTextFieldStyle{ width: thecol.width * 0.8 }
echoMode: TextInput.Password
onAccepted: button.clicked()
}

View File

@ -14,20 +14,8 @@ ColumnLayout { // settingsPane
id: root
anchors.fill: parent
StackToolbar {
id: stb
//: Cwtch Settings title
text: qsTr("cwtch-settings-title")
aux.visible: false
membership.visible: false
}
Flickable {
anchors.top: stb.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.fill: parent
boundsBehavior: Flickable.StopAtBounds
clip:true
contentWidth: tehcol.width

View File

@ -29,7 +29,7 @@ Item {
indeterminate: true
style: ProgressBarStyle {
progress: CwtchProgress { running: sp.running }
progress: CwtchProgress { running: sp.running }
}
}

View File

@ -31,7 +31,10 @@ ThemeType {
portraitContactBadgeTextColor: whitePurple
portraitProfileBadgeColor: mauvePurple
dropShadowColor: darkGrayPurple
toggleColor: darkGrayPurple
toggleOnColor: whitePurple
toggleOffColor: mauvePurple
toolbarIconColor: whitePurple
}

View File

@ -35,4 +35,6 @@ ThemeType {
toggleColor: whitePurple
toggleOnColor: hotPink
toggleOffColor: purple
toolbarIconColor: darkPurple
}

View File

@ -31,6 +31,8 @@ Item {
readonly property color toggleOffColor: theme.toggleOffColor
readonly property color toggleOnColor: theme.toggleOnColor
readonly property color toolbarIconColor: theme.toolbarIconColor
readonly property int headerSize: 50
readonly property int usernameSize: 30
readonly property int tabSize: 25
@ -42,5 +44,6 @@ Item {
readonly property int sidePaneMinSize: 700
readonly property int doublePaneMinSize: 1000
property ThemeType theme: CwtchLight { }
property ThemeType theme: CwtchLight { }
}

View File

@ -27,6 +27,7 @@ QtObject {
property color toggleOnColor: "black"
property color toggleOffColor: "black"
property color toolbarIconColor: "red"
// ... more to come

View File

@ -12,7 +12,7 @@ Rectangle {
radius: width/2
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: parent.width * 0.15
anchors.margins: parent.width * 0.09
property alias content: container.children
Column {

View File

@ -34,7 +34,7 @@ TextField {
Widgets.Button {
icon: ""
text: button_text
anchors { top: parent.top; right: parent.right }
anchors { top: parent.top; right: parent.right }
override_radius: 10
height: parent.height; width: parent.height * 4

View File

@ -44,7 +44,7 @@ PortraitRow {
indeterminate: true
style: ProgressBarStyle {
progress: CwtchProgress { running: loadingProgress.running}
progress: CwtchProgress { running: loadingProgress.running}
}
}
@ -59,9 +59,9 @@ PortraitRow {
}
}
Component.onCompleted: { setColors(status) }
Component.onCompleted: { setColors(status) }
onStatusChanged: { setColors(status) }
onStatusChanged: { setColors(status) }
function setColors(status) {
//-2:WtfCodeError,-1:Error,0:Disconnected,1:Connecting,2:Connected,3:Authenticated,4:Synced,5:Failed,6:Killed

View File

@ -6,8 +6,10 @@ import CustomQmlTypes 1.0
import "../widgets" as Widgets
import "../theme"
// Needs the parent to have an onWidthChanged that calls .textResize()
Item {
//anchors.right: parent.right
anchors.right: parent.right
anchors.left: parent.left
property string text
@ -17,6 +19,9 @@ Item {
property alias weight: label.font.weight
property alias strikeout: label.font.strikeout
property alias font: label.font
property int extraPadding: 0
property Item container: parent
height: textMetric.height
width: textMetric.width + 10
@ -36,19 +41,16 @@ Item {
font: label.font
}
/*onWidthChanged: {
setTextResize()
}*/
onTextChanged: {
setTextResize()
textResize()
}
function setTextResize() {
function textResize() {
textMetric.text = text
var i = 2
var containerWidth = container != null ? container.width : 50
// - 30 for padding
while (textMetric.width > parent.width - (30 * gcd.themeScale) && parent.width > 50) {
while (textMetric.width > containerWidth - ((30 + extraPadding) * gcd.themeScale) && containerWidth > 50) {
textMetric.text = text.slice(0, text.length - (i * 3)) + "..."
i++
}

View File

@ -170,17 +170,17 @@ Item {
source: cats[index].source
property int index: 0
property var cats: [
{source: gcd.assetPath + "mutstd/smile.webp", model: folder_expressions},
{source: gcd.assetPath + "mutstd/artist_r1.webp", model: folder_activities_clothing},
{source: gcd.assetPath + "mutstd/red_apple.webp", model: folder_food_drink_herbs},
{source: gcd.assetPath + "mutstd/pride_100.webp", model: folder_gsr},
{source: gcd.assetPath + "mutstd/sun_behind_small_cloud.webp", model: folder_nature},
{source: gcd.assetPath + "mutstd/crystal_ball.webp", model: folder_objects},
{source: gcd.assetPath + "mutstd/crow.webp", model: folder_people},
{source: gcd.assetPath + "mutstd/purple_heart.webp", model: folder_symbols},
{source: gcd.assetPath + "mutstd/airplane.webp", model: folder_travel_places},
{source: gcd.assetPath + "mutstd/hash_char.webp", model: folder_utils},
{source: gcd.assetPath + "mutstd/undefined_character.webp", model: folder_other}
{source: gcd.assetPath + "mutstd/smile.webp", model: folder_expressions},
{source: gcd.assetPath + "mutstd/artist_r1.webp", model: folder_activities_clothing},
{source: gcd.assetPath + "mutstd/red_apple.webp", model: folder_food_drink_herbs},
{source: gcd.assetPath + "mutstd/pride_100.webp", model: folder_gsr},
{source: gcd.assetPath + "mutstd/sun_behind_small_cloud.webp", model: folder_nature},
{source: gcd.assetPath + "mutstd/crystal_ball.webp", model: folder_objects},
{source: gcd.assetPath + "mutstd/crow.webp", model: folder_people},
{source: gcd.assetPath + "mutstd/purple_heart.webp", model: folder_symbols},
{source: gcd.assetPath + "mutstd/airplane.webp", model: folder_travel_places},
{source: gcd.assetPath + "mutstd/hash_char.webp", model: folder_utils},
{source: gcd.assetPath + "mutstd/undefined_character.webp", model: folder_other}
]
height: root.size * (maCatRot.pressed ? 0.8 : 1.0)
width: root.size * (maCatRot.pressed ? 0.8 : 1.0)
@ -283,7 +283,7 @@ Item {
cellWidth: root.size
cellHeight: root.size
clip: true
ScrollBar.vertical: ScrollBar {}
ScrollBar.vertical: ScrollBar {}
maximumFlickVelocity: 1250
boundsBehavior: GridView.StopAtBounds
@ -292,18 +292,18 @@ Item {
}
}
ListModel { id: folder_activities_clothing }
ListModel { id: folder_expressions }
ListModel { id: folder_food_drink_herbs }
ListModel { id: folder_gsr }
ListModel { id: folder_nature }
ListModel { id: folder_objects }
ListModel { id: folder_people }
ListModel { id: folder_symbols }
ListModel { id: folder_travel_places }
ListModel { id: folder_utils }
ListModel { id: folder_other }
ListModel { id: folder_search }
ListModel { id: folder_activities_clothing }
ListModel { id: folder_expressions }
ListModel { id: folder_food_drink_herbs }
ListModel { id: folder_gsr }
ListModel { id: folder_nature }
ListModel { id: folder_objects }
ListModel { id: folder_people }
ListModel { id: folder_symbols }
ListModel { id: folder_travel_places }
ListModel { id: folder_utils }
ListModel { id: folder_other }
ListModel { id: folder_search }
DelegateModel {
id: emojiModel

63
qml/widgets/Icon.qml Normal file
View File

@ -0,0 +1,63 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "." as Widgets
import "../theme"
Rectangle {
id: root
property color backgroundColor: parent.color
property color hilightBackgroundColor: backgroundColor
property bool isHover: false
color: isHover ? backgroundColor : hilightBackgroundColor
property alias iconColor: iconColorOverlay.color
property alias source: srcImg.source
signal clicked()
Image {
id: srcImg
anchors.fill: parent
antialiasing: true
smooth: true
visible: false
// Apparently qml can now only DOWN-SCALE/SHRINK the SVG, so with this hack it which won't cause blurriness/pixelation
sourceSize.width: root.width*2
sourceSize.height: root.height*2
}
ColorOverlay{
id: iconColorOverlay
anchors.fill: srcImg
source: srcImg
antialiasing: true
smooth: true
}
MouseArea { // Full row mouse area triggering onClick
id: ma
anchors.fill: parent
hoverEnabled: true
onClicked: { root.clicked() }
onEntered: {
isHover = true
}
onExited: {
isHover = false
}
}
}

View File

@ -27,7 +27,7 @@ Item {
property real logscale: 4 * Math.log10(gcd.themeScale + 1)
onDualPaneChanged: { realignProfile() }
onDualPaneChanged: { realignProfile() }
function realignProfile() {
if (dualPane) {
@ -40,11 +40,14 @@ onDualPaneChanged: { realignProfile() }
portrait.anchors.left = profile.left
portrait.anchors.leftMargin = 25 * logscale
nameRect.anchors.horizontalCenter = undefined
nameRect.anchors.left = portrait.right
nameRow.anchors.right = undefined
nameRow.anchors.left = portrait.right
nameRect.anchors.top = undefined
nameRect.anchors.verticalCenter = portrait.verticalCenter
nameRow.anchors.top = undefined
nameRow.anchors.verticalCenter = portrait.verticalCenter
nameCenter.anchors.horizontalCenter = undefined
nameCenter.anchors.left = nameRow.left
} else {
profile.height = (150 * logscale)
@ -55,18 +58,18 @@ onDualPaneChanged: { realignProfile() }
portrait.anchors.leftMargin = undefined
portrait.anchors.horizontalCenter = profile.horizontalCenter
nameRect.anchors.left = undefined
nameRect.anchors.horizontalCenter = profile.horizontalCenter
nameRow.anchors.left = profile.left
nameRow.anchors.right = profile.right
nameRow.anchors.verticalCenter = undefined
nameRow.anchors.top = portrait.bottom
nameCenter.anchors.left = undefined
nameCenter.anchors.horizontalCenter = nameRow.horizontalCenter
nameRect.anchors.verticalCenter = undefined
nameRect.anchors.top = portrait.bottom
}
}
Component.onCompleted: { realignProfile() }
Rectangle {
anchors.left: parent.left
@ -93,65 +96,55 @@ Component.onCompleted: { realignProfile() }
}
Rectangle {
id: nameRect
id: nameRow
height: name.height
width: name.width + addBtn.width
onWidthChanged: { name.textResize() }
EllipsisLabel {
id: name
Rectangle {
id: nameCenter
width: name.width + addBtn.width
anchors.right: undefined
anchors.left: undefined
EllipsisLabel {
id: name
color: Theme.portraitOnlineTextColor
pixelSize: Theme.usernameSize * gcd.themeScale
weight: Font.Bold
text: nick
}
anchors.right: undefined
anchors.left: undefined
Widgets.Button { // Add Button
id: addBtn
color: Theme.portraitOnlineTextColor
pixelSize: Theme.usernameSize * gcd.themeScale
weight: Font.Bold
text: nick
extraPadding: addBtn.width + 30
container: nameRow
}
anchors.left: name.right //name.left + name.textWidth
anchors.top: name.top
Widgets.Button { // Add Button
id: addBtn
icon: "solid/plus"
anchors.left: name.right
anchors.top: name.top
height: name.height
width: height
radius: width * 0.3
onClicked: {
icon: "solid/plus"
height: name.height
width: height
radius: width * 0.3
onClicked: {
}
}
}
}
}
// TODO Remove for new global topbar
Widgets.Button {// BACK BUTTON
id: btnBack
icon: "solid/arrow-circle-left"
anchors.left: parent.left
anchors.leftMargin: 2
anchors.top: parent.top
anchors.topMargin: 2
onClicked: function() {
gcd.selectedProfile = "none"
gcd.reloadProfileList()
parentStack.pane = parentStack.managementPane
theStack.pane = theStack.emptyPane
}
}
TextField {
id: searchAddText
anchors.top: profile.bottom
anchors.horizontalCenter: parent.horizontalCenter
style: CwtchTextFieldStyle{ }
style: CwtchTextFieldStyle{ }
width: parent.width - 30
//: ex: "... paste an address here to add a contact ..."
placeholderText: qsTr("paste-address-to-add-contact")
@ -173,8 +166,11 @@ Component.onCompleted: { realignProfile() }
onion = _onion
image = _image
tag = _tag
//realignProfile()
}
onResetProfile: { realignProfile() }
/*onTorStatus: function(code, str) {
rectTorStatus.code = code
rectTorStatus.message = str

View File

@ -84,8 +84,8 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
}
onWidthChanged: {
cn.setTextResize()
onion.setTextResize()
cn.textResize()
onion.textResize()
}
}
@ -102,7 +102,7 @@ Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
anchors.fill: parent
hoverEnabled: true
onClicked: { crItem.clicked(crItem.handle) }
onClicked: { crItem.clicked(crItem.handle) }
onEntered: {
isHover = true

View File

@ -115,7 +115,7 @@ ColumnLayout {
width: height
}
badgeColor: Theme.portraitOnlineBorderColor
onClicked: function(handle) { profileAddEditPane.reset(); parentStack.pane = parentStack.addEditProfilePane }
onClicked: function(handle) { profileAddEditPane.reset(); parentStack.pane = parentStack.addEditProfilePane }
}
}
}

View File

@ -1,70 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "." as Widgets
import "../fonts"
Rectangle { // OVERHEAD BAR ON STACK PANE
id: toolbar
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 20 * gcd.themeScale + 4
Layout.minimumHeight: height
Layout.maximumHeight: height
color: "#EDEDED"
property alias text: lbl.text
property alias aux: btnAux
property alias back: btnBack
property alias membership: btnMembership
property string stack: "profile" // profile(theStack) or management(parentStack)
Widgets.Button {// BACK BUTTON
id: btnBack
icon: "solid/arrow-circle-left"
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 6
onClicked: {
if (stack == "profile") {
theStack.pane = theStack.emptyPane
} else {
parentStack.pane = parentStack.managementPane
}
}
}
ScalingLabel { // TEXT
id: lbl
text: "open privacy exec"
font.family: Fonts.applicationFontRegular.name
font.styleName: "ExtraBold"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
RowLayout {
anchors.right: parent.right
anchors.rightMargin: 6
anchors.verticalCenter: parent.verticalCenter
Widgets.Button { // Membership Button
id: btnMembership
icon: "solid/users"
//: View Group Membership
tooltip: qsTr("view-group-membership-tooltip")
}
Widgets.Button { // COG BUTTON
id: btnAux
icon: "solid/cog"
}
}
}

123
qml/widgets/Toolbar.qml Normal file
View File

@ -0,0 +1,123 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "." as Widgets
import "../theme"
Rectangle { // Global Toolbar
id: toolbar
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 35 * gcd.themeScale
Layout.minimumHeight: height
Layout.maximumHeight: height
color: Theme.backgroundMainColor
property alias leftMenuVisible: btnLeftMenu.visible
property alias backVisible: btnLeftBack.visible
property alias rightMenuVisible: btnRightMenu.visible
property alias titleWidth: paneArea.width
signal leftMenu()
signal back()
signal rightMenu()
Icon {
id: btnLeftMenu
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/menu-24px.svg"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: 30
height: 30
onClicked: { leftMenu() }
}
Icon {
id: btnLeftBack
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/chevron_left-24px.svg"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: 30
height: 30
onClicked: { back() }
}
Rectangle {
id: paneArea
anchors.right: parent.right
EllipsisLabel {
id: paneTitle
visible: true
anchors.left: undefined
anchors.right: undefined
anchors.horizontalCenter: parent.horizontalCenter
color: Theme.mainTextColor
pixelSize: Theme.tabSize * gcd.themeScale
weight: Font.Bold
text: "global toolbar"
//extraPadding: btnRightMenu.width + 10
}
onWidthChanged: { paneTitle.textResize() }
}
Icon {
id: btnRightMenu
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/more_vert-24px.svg"
visible: false
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
width: 30
height: 30
onClicked: { rightMenu() }
}
function setTitle(text, width) {
paneTitle.text = text
paneArea.width = width
paneTitle.textResize()
paneTitle.visible = true
}
function hideTitle() {
paneTitle.visible = false
}
Connections {
target: gcd
onSetToolbarTitle: function(handle) {
setTitle(handle, theStack.width)
btnRightMenu.visible = true
}
}
}