mirror of
https://github.com/monero-project/monero-gui.git
synced 2026-04-02 02:37:25 -04:00
Compare commits
2603 Commits
release-v0
...
v0.17.1.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fce5c7a84 | ||
|
|
157166269b | ||
|
|
caa273afea | ||
|
|
d58ce3f599 | ||
|
|
19a6f399f3 | ||
|
|
18c964afca | ||
|
|
158e0c3523 | ||
|
|
770a7a344b | ||
|
|
f3ddf525a4 | ||
|
|
df2b85e7ee | ||
|
|
e86fa3e4fb | ||
|
|
5702bdef39 | ||
|
|
c7213abb9a | ||
|
|
5ee363f9f3 | ||
|
|
3e01647744 | ||
|
|
f491b41100 | ||
|
|
a564abbe6b | ||
|
|
149732af3a | ||
|
|
2bb6da5f09 | ||
|
|
11370c50eb | ||
|
|
0ae4677a25 | ||
|
|
1c2879bda3 | ||
|
|
0997b38e1e | ||
|
|
be177d6205 | ||
|
|
919b2e4f3a | ||
|
|
8b9580d621 | ||
|
|
6f5bacabfd | ||
|
|
6fab741f2e | ||
|
|
c2977ac410 | ||
|
|
1adf58793f | ||
|
|
9fa597bb58 | ||
|
|
d79f8e8b17 | ||
|
|
a817bfba05 | ||
|
|
04429e85e6 | ||
|
|
e52d86d442 | ||
|
|
7f164e739a | ||
|
|
43214de7d0 | ||
|
|
0cf683a6cf | ||
|
|
c9fd9634ee | ||
|
|
ddcee95b88 | ||
|
|
299067a273 | ||
|
|
08635e3030 | ||
|
|
fdff5f68dd | ||
|
|
9b18344d23 | ||
|
|
153154f484 | ||
|
|
ee0137056d | ||
|
|
1b0f274aed | ||
|
|
cd054f6c26 | ||
|
|
d6cb9b6c85 | ||
|
|
852378accb | ||
|
|
fe73011422 | ||
|
|
9d2f083a97 | ||
|
|
33afd0bb83 | ||
|
|
a165a14519 | ||
|
|
33e1801c57 | ||
|
|
fac3fcb518 | ||
|
|
8457055f08 | ||
|
|
e01c847fde | ||
|
|
bedf04d08a | ||
|
|
83da709436 | ||
|
|
f51b0d7d0c | ||
|
|
1f9d60602a | ||
|
|
7a285b3613 | ||
|
|
6ee5effc15 | ||
|
|
954c972530 | ||
|
|
e5b0837c8e | ||
|
|
a73ae62526 | ||
|
|
44df1bccfc | ||
|
|
0a0dbf8853 | ||
|
|
25ca081109 | ||
|
|
b932df85fd | ||
|
|
9da52f2387 | ||
|
|
79ee893499 | ||
|
|
1b2d940850 | ||
|
|
db4273ee82 | ||
|
|
cb1f3ad0ce | ||
|
|
c81a842b6e | ||
|
|
26ad7b78b5 | ||
|
|
381442a138 | ||
|
|
7cb24f50b8 | ||
|
|
8c5891e28a | ||
|
|
61c0e15404 | ||
|
|
b03714ec45 | ||
|
|
701f063797 | ||
|
|
6ed5369829 | ||
|
|
4661167734 | ||
|
|
39d9d7d071 | ||
|
|
8ad5fd4c76 | ||
|
|
3c28ecef93 | ||
|
|
d3943ca2a9 | ||
|
|
73f76cec99 | ||
|
|
b76b43da6c | ||
|
|
05733c14b7 | ||
|
|
21d8c096ff | ||
|
|
13ca3eeb84 | ||
|
|
4cea7e1647 | ||
|
|
afc2e846fd | ||
|
|
c601313943 | ||
|
|
73c0522a56 | ||
|
|
06a66e3a00 | ||
|
|
12355deb94 | ||
|
|
cbbbf30198 | ||
|
|
40e108eb2b | ||
|
|
cdfe9f338f | ||
|
|
adb04cef71 | ||
|
|
1123dd7046 | ||
|
|
f1fdbee25d | ||
|
|
ff51dd08d3 | ||
|
|
476896864c | ||
|
|
0b7cf4a544 | ||
|
|
caff6193f2 | ||
|
|
e2a82c9037 | ||
|
|
28ee4164cd | ||
|
|
7af099958e | ||
|
|
0d8e363407 | ||
|
|
7306b84d41 | ||
|
|
9d25f7230b | ||
|
|
b28f2dae33 | ||
|
|
619b2d7947 | ||
|
|
a23c49e5b6 | ||
|
|
61fc38b29c | ||
|
|
22386aa7e1 | ||
|
|
f5c5df7b67 | ||
|
|
1aa98c3cfd | ||
|
|
67c47d468c | ||
|
|
0fcaadae53 | ||
|
|
5b5c0ac658 | ||
|
|
1b4c21700f | ||
|
|
9df9cb8da7 | ||
|
|
a32d39cc96 | ||
|
|
8ef7b7c89a | ||
|
|
1ef96f9544 | ||
|
|
d413b16d34 | ||
|
|
37fea0ee33 | ||
|
|
b12ec3b0f0 | ||
|
|
4c257aff67 | ||
|
|
be1f63f93d | ||
|
|
839167aff5 | ||
|
|
87400e781e | ||
|
|
98ce87a572 | ||
|
|
d555ba55a9 | ||
|
|
1387fd4f9c | ||
|
|
6ff43fa81e | ||
|
|
076c70906a | ||
|
|
923a32cfd5 | ||
|
|
e7c37fc7bc | ||
|
|
2b83edc982 | ||
|
|
4208b66baf | ||
|
|
b9e74f6b6d | ||
|
|
270b86b142 | ||
|
|
6c67a39d2e | ||
|
|
91239881f1 | ||
|
|
2d464a1266 | ||
|
|
0dda5796ec | ||
|
|
e1987522e2 | ||
|
|
1b519b8302 | ||
|
|
d488979351 | ||
|
|
d313c2de37 | ||
|
|
560dd09f8a | ||
|
|
ea778c41dd | ||
|
|
6595a7b1c1 | ||
|
|
dea513fc84 | ||
|
|
55759545d1 | ||
|
|
248ec22eb5 | ||
|
|
04eab65b10 | ||
|
|
8643f85fef | ||
|
|
e0679ce5e6 | ||
|
|
31dbe7ea42 | ||
|
|
f745670b36 | ||
|
|
a80746adf1 | ||
|
|
2e8bec15da | ||
|
|
24d8360da1 | ||
|
|
f75d988437 | ||
|
|
3a1601f132 | ||
|
|
fd956b54b5 | ||
|
|
6467333fe7 | ||
|
|
4effbd3c8e | ||
|
|
8845ce6d49 | ||
|
|
3aeaf99057 | ||
|
|
c41e3d8e7a | ||
|
|
9d05462715 | ||
|
|
394e56915d | ||
|
|
749c166b10 | ||
|
|
a563582d95 | ||
|
|
a000b8d850 | ||
|
|
4b626924e6 | ||
|
|
e97fb0b3d8 | ||
|
|
aa1ab4f448 | ||
|
|
1752fde08b | ||
|
|
121904f340 | ||
|
|
05f63a24cc | ||
|
|
e2085bdaa3 | ||
|
|
7e83173c77 | ||
|
|
183c8084a5 | ||
|
|
5bc305679c | ||
|
|
2557bdb35f | ||
|
|
79a87ca03b | ||
|
|
a8eab144e4 | ||
|
|
83cffa469e | ||
|
|
b1b7307578 | ||
|
|
e0dfda2189 | ||
|
|
370607a7dc | ||
|
|
dc1d0a68c8 | ||
|
|
fed38b9e06 | ||
|
|
17213bfe8c | ||
|
|
e1b5ee24e9 | ||
|
|
35f92b76a2 | ||
|
|
9255d649d9 | ||
|
|
86f5aae63d | ||
|
|
75e433388f | ||
|
|
f51b0f6704 | ||
|
|
1895755efb | ||
|
|
03db3f96ff | ||
|
|
1d2840f8b5 | ||
|
|
4e16698558 | ||
|
|
c013d7d125 | ||
|
|
27e4771622 | ||
|
|
e65159163d | ||
|
|
77b7a5244a | ||
|
|
3c69023135 | ||
|
|
fad8dab165 | ||
|
|
16646eb651 | ||
|
|
6898d5dd42 | ||
|
|
67be96e6d5 | ||
|
|
9ce88c6aeb | ||
|
|
5ea99a73e7 | ||
|
|
43aeea8eb7 | ||
|
|
7eeda0a8f0 | ||
|
|
9220937c4b | ||
|
|
6aaf294f0b | ||
|
|
721a0cbf91 | ||
|
|
d1bde4f8b2 | ||
|
|
380b955bce | ||
|
|
0db4c36db0 | ||
|
|
dcc040a119 | ||
|
|
63e32c4a83 | ||
|
|
7972d8a219 | ||
|
|
872b81fe39 | ||
|
|
6136e88fcb | ||
|
|
c77637d141 | ||
|
|
0d047035fb | ||
|
|
b5aa659757 | ||
|
|
88d297d8cc | ||
|
|
eb924a34d1 | ||
|
|
352da92229 | ||
|
|
99907e539a | ||
|
|
e8bcabe66b | ||
|
|
829414ed01 | ||
|
|
36262f029a | ||
|
|
13ee9b1f26 | ||
|
|
085abb798a | ||
|
|
c137a6ea36 | ||
|
|
2cea0fc669 | ||
|
|
aaa1cb47c0 | ||
|
|
1577ce278b | ||
|
|
9d48f96fc8 | ||
|
|
1a51e93e55 | ||
|
|
b62b821002 | ||
|
|
f3ee46175c | ||
|
|
17a3c51a43 | ||
|
|
410897ced7 | ||
|
|
2fd3974194 | ||
|
|
7c50e1ff4b | ||
|
|
dec5dcf25c | ||
|
|
9fc260c62d | ||
|
|
c9d36b1302 | ||
|
|
d931022963 | ||
|
|
df885b6eaa | ||
|
|
f78c95b73b | ||
|
|
b22fb24e47 | ||
|
|
8c8faf29e4 | ||
|
|
b7b1221221 | ||
|
|
38c3534ead | ||
|
|
f631b75f0a | ||
|
|
11fd19e0f8 | ||
|
|
1572b4cf79 | ||
|
|
10a47d783e | ||
|
|
14cc1d096a | ||
|
|
840421fd7b | ||
|
|
51739dfb22 | ||
|
|
be5e6772a4 | ||
|
|
c869390272 | ||
|
|
50c22ca300 | ||
|
|
f1b4eb6c56 | ||
|
|
d37c4ddef2 | ||
|
|
2522ff13fe | ||
|
|
596b71b293 | ||
|
|
8159b75be3 | ||
|
|
7677103f1b | ||
|
|
fead82b198 | ||
|
|
f55bf48bad | ||
|
|
e0faddf964 | ||
|
|
a00ed6a75a | ||
|
|
b54127e997 | ||
|
|
c672d8016d | ||
|
|
ccd8eb1c3a | ||
|
|
d5b165bde2 | ||
|
|
c978027933 | ||
|
|
9deec4dad0 | ||
|
|
e306992ce8 | ||
|
|
19daa074ca | ||
|
|
1c62edeff4 | ||
|
|
34439af67e | ||
|
|
e1e862bce4 | ||
|
|
0b2e74cdb5 | ||
|
|
3fee17e564 | ||
|
|
1e7d8293cb | ||
|
|
a3fc6754e0 | ||
|
|
8354c251c5 | ||
|
|
8f5053bd61 | ||
|
|
92b0a115f4 | ||
|
|
6a3e1aaf40 | ||
|
|
c32e11d3e8 | ||
|
|
9580c19da3 | ||
|
|
27532dc1bf | ||
|
|
c0e0626b84 | ||
|
|
c6d5c5dc3a | ||
|
|
749460fb46 | ||
|
|
c9ee76c2ee | ||
|
|
94dbf179d5 | ||
|
|
7deecbfdf6 | ||
|
|
29a742ba26 | ||
|
|
47559e51be | ||
|
|
f64dcde600 | ||
|
|
52c090b82f | ||
|
|
1edc068047 | ||
|
|
d18af7da72 | ||
|
|
53066ae92b | ||
|
|
333c9ee311 | ||
|
|
ff4de8e8f7 | ||
|
|
ef5d855950 | ||
|
|
e6f30578c0 | ||
|
|
f1e3926192 | ||
|
|
7f0c19950b | ||
|
|
1580c3a574 | ||
|
|
c8f4355e15 | ||
|
|
39561f8ead | ||
|
|
b15dbbb9b0 | ||
|
|
a73a4363ec | ||
|
|
55cbc562b6 | ||
|
|
e6c4c32d01 | ||
|
|
e36d4a918f | ||
|
|
0355ca2747 | ||
|
|
c946905907 | ||
|
|
a8bd2ab77e | ||
|
|
149e373367 | ||
|
|
fa3c8b5f89 | ||
|
|
e0f6577afd | ||
|
|
43f0854de9 | ||
|
|
f38e460842 | ||
|
|
527adcba17 | ||
|
|
0de1ba9f51 | ||
|
|
66e769603c | ||
|
|
15038850c2 | ||
|
|
efc9ad45e4 | ||
|
|
754a968706 | ||
|
|
c20a0ef928 | ||
|
|
eab98e3a48 | ||
|
|
2a8960bc2c | ||
|
|
fe68f59763 | ||
|
|
80e8dd6aef | ||
|
|
c82bd94bc3 | ||
|
|
28ca9503df | ||
|
|
73cc400ae8 | ||
|
|
8b7438ace2 | ||
|
|
210248e6ef | ||
|
|
f82948f4b0 | ||
|
|
da4e0dbf0f | ||
|
|
9dd3f4fecb | ||
|
|
abbe042c8a | ||
|
|
72a3b346bb | ||
|
|
d662e46146 | ||
|
|
bbc9ca8f08 | ||
|
|
f7271d1c7b | ||
|
|
afe1ae9b9c | ||
|
|
7f5b8ea0ad | ||
|
|
aa5000f556 | ||
|
|
8b6978b2a5 | ||
|
|
86d21a34ba | ||
|
|
4354a76df9 | ||
|
|
b616a14f88 | ||
|
|
7536e922e9 | ||
|
|
5bf0dd9684 | ||
|
|
cdf4ce2d6f | ||
|
|
37a8bcb525 | ||
|
|
2f8c0ca499 | ||
|
|
38612c1285 | ||
|
|
1d3a201077 | ||
|
|
a91a4f51ab | ||
|
|
52fbbae484 | ||
|
|
8f70fb4f79 | ||
|
|
c439d6814b | ||
|
|
f26f1469ca | ||
|
|
487e706f06 | ||
|
|
503c1af5f8 | ||
|
|
ca79525fdb | ||
|
|
7db5de082d | ||
|
|
ce6cc47afe | ||
|
|
a10a94f51c | ||
|
|
1833c16e39 | ||
|
|
d7207bfde3 | ||
|
|
5265e52b8b | ||
|
|
b6fdb709ba | ||
|
|
9aef3bab33 | ||
|
|
4b55197e18 | ||
|
|
11617d2f76 | ||
|
|
765e93cfd0 | ||
|
|
d31e661cd1 | ||
|
|
7f9b28c05f | ||
|
|
4a7ccd8d82 | ||
|
|
be954cc2c4 | ||
|
|
387e643ae9 | ||
|
|
6f71d47806 | ||
|
|
135c970ad9 | ||
|
|
fd5d1f584e | ||
|
|
2195c67f58 | ||
|
|
5c13624596 | ||
|
|
cfdba59584 | ||
|
|
4141832a4d | ||
|
|
5f183da6e3 | ||
|
|
30c54b1c6e | ||
|
|
c1da3d1c97 | ||
|
|
cbd03229dd | ||
|
|
2fc1b287dd | ||
|
|
7c8c6a116f | ||
|
|
ef93139a80 | ||
|
|
1b7844ec34 | ||
|
|
8f63e8870f | ||
|
|
286c75aa5b | ||
|
|
0a4d65dd99 | ||
|
|
83ccadb6a8 | ||
|
|
eae7eff9db | ||
|
|
2102e4be0d | ||
|
|
02eec351b9 | ||
|
|
ce4cb6512d | ||
|
|
3d24300963 | ||
|
|
9748974ce0 | ||
|
|
120b5285fb | ||
|
|
b022735506 | ||
|
|
33c1a6f4fc | ||
|
|
4b0dcb95bf | ||
|
|
fdb7f806fa | ||
|
|
a810bf3eb7 | ||
|
|
a99eef68f5 | ||
|
|
7ebdb884a1 | ||
|
|
c7f9ac926b | ||
|
|
9b98e0a2f5 | ||
|
|
3835387eea | ||
|
|
238b1b777f | ||
|
|
3af99e91e4 | ||
|
|
07ecca5af4 | ||
|
|
b245d0af7a | ||
|
|
585fb2810d | ||
|
|
0784532001 | ||
|
|
dcbdae0954 | ||
|
|
2bef74fe8a | ||
|
|
81d5dd1cae | ||
|
|
50767570f0 | ||
|
|
1d5b940349 | ||
|
|
3563d44d99 | ||
|
|
ffceda9159 | ||
|
|
a75a0fb8c5 | ||
|
|
5fa64c34ec | ||
|
|
376421667a | ||
|
|
8a73fd241e | ||
|
|
9760886eff | ||
|
|
34089599cd | ||
|
|
4a7a98034e | ||
|
|
79f78f48e2 | ||
|
|
fee81ba210 | ||
|
|
a078705ec6 | ||
|
|
de6a9b6779 | ||
|
|
3f13a5c9a4 | ||
|
|
fb7470a2a6 | ||
|
|
e2c6ae6472 | ||
|
|
ea25b71ca6 | ||
|
|
5ebe3f5092 | ||
|
|
8e4124f06a | ||
|
|
e47fd5f760 | ||
|
|
8767c71107 | ||
|
|
2156a6533b | ||
|
|
7eac690d44 | ||
|
|
31adc6cfd6 | ||
|
|
d582fd338d | ||
|
|
eed51e3ffa | ||
|
|
6a889bdaa1 | ||
|
|
5f27a45910 | ||
|
|
e1258e0ada | ||
|
|
925cced7d7 | ||
|
|
94083e746f | ||
|
|
a49d579bd3 | ||
|
|
6ed7fcec67 | ||
|
|
6d7db135e7 | ||
|
|
042400b83f | ||
|
|
df54439972 | ||
|
|
86252506f0 | ||
|
|
a9fea2462b | ||
|
|
58987b2ec6 | ||
|
|
aecd218d15 | ||
|
|
856843b52a | ||
|
|
fc740a89ab | ||
|
|
0643607ec3 | ||
|
|
5872bc8a2b | ||
|
|
d07da76383 | ||
|
|
c092de97f2 | ||
|
|
c84a8fb07d | ||
|
|
63b4566475 | ||
|
|
3699dc9f2e | ||
|
|
eee48ce74c | ||
|
|
9072f89a4e | ||
|
|
c9e461dcb6 | ||
|
|
55b548f31c | ||
|
|
dede10ea1a | ||
|
|
b739cdd52a | ||
|
|
94a27b964a | ||
|
|
c7df74dab7 | ||
|
|
bf9b04b126 | ||
|
|
d21c22b444 | ||
|
|
cee56a7d23 | ||
|
|
c3a34227b7 | ||
|
|
7a86856063 | ||
|
|
86f35992dc | ||
|
|
cb84652c8e | ||
|
|
dc3a99c9ca | ||
|
|
566beeaf4b | ||
|
|
9deca92e07 | ||
|
|
09ff85af44 | ||
|
|
a0b6c8a397 | ||
|
|
44dfb80633 | ||
|
|
7067195c2f | ||
|
|
19cf510e62 | ||
|
|
c14852cbd7 | ||
|
|
57d330244b | ||
|
|
dfd8ff9809 | ||
|
|
b4a65c52cc | ||
|
|
386c5e3d30 | ||
|
|
5069e6ecae | ||
|
|
7c38a836d3 | ||
|
|
0731972499 | ||
|
|
f9b9d43ac1 | ||
|
|
d1e431c5e8 | ||
|
|
4c0996888a | ||
|
|
a9d855ad00 | ||
|
|
636ca1c41d | ||
|
|
872b18d5af | ||
|
|
98abdaa5d5 | ||
|
|
b5fafb55c9 | ||
|
|
fbfc5310d5 | ||
|
|
478fddaf57 | ||
|
|
d175070f55 | ||
|
|
0af7a4320d | ||
|
|
48aab5c6e5 | ||
|
|
a20422da74 | ||
|
|
eb7fae92ef | ||
|
|
4b1a6eb49b | ||
|
|
df614cd0a0 | ||
|
|
0adafaaa91 | ||
|
|
467dd8b664 | ||
|
|
dba48334e6 | ||
|
|
98ab4ea2aa | ||
|
|
0629f06156 | ||
|
|
e05e6346ac | ||
|
|
d5469c8247 | ||
|
|
080ec28eb4 | ||
|
|
8f197bc6ac | ||
|
|
82bc71c81d | ||
|
|
5a4f27b375 | ||
|
|
b6d554eebd | ||
|
|
900f478abe | ||
|
|
742a4659f4 | ||
|
|
35b7a5f6bb | ||
|
|
21e8c7ca17 | ||
|
|
8ef1b41093 | ||
|
|
911ff4288d | ||
|
|
6dd759de33 | ||
|
|
e59e247048 | ||
|
|
8940d2b8d1 | ||
|
|
6940390a5e | ||
|
|
7ebf50dc6f | ||
|
|
2c515ceb74 | ||
|
|
39aa6e76b1 | ||
|
|
aa5962519a | ||
|
|
a3f5460d12 | ||
|
|
2e262d41d7 | ||
|
|
6de8547047 | ||
|
|
59954df199 | ||
|
|
8a66f7b6f7 | ||
|
|
a5e5bfad46 | ||
|
|
2058c78943 | ||
|
|
4d279a5f02 | ||
|
|
29f0c4667c | ||
|
|
f00b7b42c0 | ||
|
|
80a3da6efa | ||
|
|
2a1cd7dc01 | ||
|
|
9bc6e041ee | ||
|
|
3bab6ccedf | ||
|
|
eebbd2b93e | ||
|
|
a807dcd5df | ||
|
|
0009a886fe | ||
|
|
9c2bceaaed | ||
|
|
50f3e67e81 | ||
|
|
7e6fcff3ee | ||
|
|
f266480f7d | ||
|
|
96106cc818 | ||
|
|
ed9e061489 | ||
|
|
b56c0cd8a2 | ||
|
|
f36098d60f | ||
|
|
00439052e6 | ||
|
|
fae5956bfb | ||
|
|
8dfd7a300d | ||
|
|
7cf0f21ec0 | ||
|
|
098e78f4ef | ||
|
|
4a30d1fc38 | ||
|
|
148c1b9816 | ||
|
|
cc22693504 | ||
|
|
c4bdf5621c | ||
|
|
a8618b0471 | ||
|
|
b4a6569e63 | ||
|
|
e5a6a50e49 | ||
|
|
c7f272d86a | ||
|
|
023951fd84 | ||
|
|
ef2b0cfa4a | ||
|
|
fe08950b03 | ||
|
|
a5b500cd93 | ||
|
|
16fd1d1eee | ||
|
|
266b1f167d | ||
|
|
40a1edbbcb | ||
|
|
0999daf1f2 | ||
|
|
7462c64fe2 | ||
|
|
4920df95e3 | ||
|
|
6a453039ee | ||
|
|
5281244b33 | ||
|
|
525822f391 | ||
|
|
23e3d82441 | ||
|
|
5ca671e5f5 | ||
|
|
118ad125c4 | ||
|
|
c98ffcca5d | ||
|
|
e74075bb0e | ||
|
|
916c0e4406 | ||
|
|
b626fcba08 | ||
|
|
c765bbb1fd | ||
|
|
43f378b7d2 | ||
|
|
b73551d6ab | ||
|
|
632d82ac95 | ||
|
|
3fb775de28 | ||
|
|
82affff63f | ||
|
|
6d0593a26b | ||
|
|
13ea4035b5 | ||
|
|
1c97e9796d | ||
|
|
4eca4194b7 | ||
|
|
5c801ec2ad | ||
|
|
7f324fb3e6 | ||
|
|
710159a236 | ||
|
|
7afbcc9855 | ||
|
|
8d0647d677 | ||
|
|
9a5296f00e | ||
|
|
6f53cc4dda | ||
|
|
86f573f02c | ||
|
|
181866ba4a | ||
|
|
ded0a4da48 | ||
|
|
3f4f6f01dc | ||
|
|
6a5de80bd9 | ||
|
|
1fef418adb | ||
|
|
c6c094bbd5 | ||
|
|
10dea6073b | ||
|
|
beeddea678 | ||
|
|
66f6b95b5c | ||
|
|
3c6a1e45d7 | ||
|
|
3528bcd6b5 | ||
|
|
f8262b0d27 | ||
|
|
c5785ed195 | ||
|
|
500c7ec82e | ||
|
|
3e07ecabf9 | ||
|
|
98279f54fb | ||
|
|
a6818cd274 | ||
|
|
4c7d402eaf | ||
|
|
3984f8d1e8 | ||
|
|
f2424ddeaa | ||
|
|
b963028f10 | ||
|
|
4aac66a024 | ||
|
|
598de0f03f | ||
|
|
bd3b26c33d | ||
|
|
66f5b7310f | ||
|
|
5ff030783a | ||
|
|
7c11ac4d98 | ||
|
|
05a0d21f4c | ||
|
|
d0c2740a51 | ||
|
|
118752e775 | ||
|
|
1ed02f7d7a | ||
|
|
4042186fac | ||
|
|
abd98b95f6 | ||
|
|
d6ccae342d | ||
|
|
78f8cb2595 | ||
|
|
aa96e2ff3e | ||
|
|
ec83dea3c3 | ||
|
|
3ea329e45f | ||
|
|
a83adb70ad | ||
|
|
94561ed2a6 | ||
|
|
8c511722e0 | ||
|
|
131769f175 | ||
|
|
4a86a1cf76 | ||
|
|
e0ab9aa898 | ||
|
|
cc86795fa3 | ||
|
|
50cb72656a | ||
|
|
c9900c05b2 | ||
|
|
4e1f7349c4 | ||
|
|
5dccde25f4 | ||
|
|
24ac001daa | ||
|
|
163fa733ae | ||
|
|
a113670905 | ||
|
|
1661c82449 | ||
|
|
088d32e712 | ||
|
|
ba24fd79bb | ||
|
|
46227bdad0 | ||
|
|
872b49f29a | ||
|
|
38d412a3fa | ||
|
|
2833fdb907 | ||
|
|
b940ad72be | ||
|
|
17ea26e02a | ||
|
|
1cee81b996 | ||
|
|
f03ea0461c | ||
|
|
6ce9a3cba0 | ||
|
|
8cd32987d4 | ||
|
|
648b775a25 | ||
|
|
b24ccc2fe3 | ||
|
|
00783e7b68 | ||
|
|
dafc47050a | ||
|
|
0e65d89172 | ||
|
|
fd9e7d00ed | ||
|
|
3d7ded209a | ||
|
|
e81a589a8d | ||
|
|
074d8fb42e | ||
|
|
b632d078e5 | ||
|
|
1c2920a339 | ||
|
|
676b8d6921 | ||
|
|
9d5eb002ae | ||
|
|
63d4ba6df8 | ||
|
|
c2dbda63c6 | ||
|
|
6e7b4ff9f9 | ||
|
|
1269f0a13a | ||
|
|
04b91e76f2 | ||
|
|
c9c7bb9171 | ||
|
|
619661a61d | ||
|
|
457b1dee49 | ||
|
|
7cca39ad48 | ||
|
|
90406dfd1e | ||
|
|
6d7abaf5c0 | ||
|
|
bc40942889 | ||
|
|
646d3394d3 | ||
|
|
c06cb5cc58 | ||
|
|
983a3ba7ad | ||
|
|
265afe1610 | ||
|
|
32f7666912 | ||
|
|
20a58143b6 | ||
|
|
4cc3d3f3e2 | ||
|
|
2ab3d8ebf2 | ||
|
|
9e4bfb1ef2 | ||
|
|
97a9ac9bf8 | ||
|
|
2d23917afb | ||
|
|
52182ef9b1 | ||
|
|
91aff7c0e4 | ||
|
|
1723d04902 | ||
|
|
c83c74d3c2 | ||
|
|
d06ae80e0a | ||
|
|
8dd2a20ff8 | ||
|
|
e04db9299d | ||
|
|
7b0cd19487 | ||
|
|
c0fa4f5d27 | ||
|
|
d5f4d5d93f | ||
|
|
9ba1960207 | ||
|
|
04a665db0c | ||
|
|
f47335f89f | ||
|
|
f75aa22b26 | ||
|
|
50e1ce1460 | ||
|
|
df02532fd5 | ||
|
|
bd20626460 | ||
|
|
8738210991 | ||
|
|
6c2c17ada1 | ||
|
|
380f218b3a | ||
|
|
12647fac73 | ||
|
|
9f0f40af80 | ||
|
|
c316fab29f | ||
|
|
37de27d7f6 | ||
|
|
c61d857a67 | ||
|
|
56023facaa | ||
|
|
1dc45bad87 | ||
|
|
0daf2aacf5 | ||
|
|
06ccded94e | ||
|
|
ff38e965bd | ||
|
|
a9a59fd314 | ||
|
|
e2a187f892 | ||
|
|
4a526810ce | ||
|
|
2f5c47e95f | ||
|
|
34b216e6dc | ||
|
|
d2b9d5690b | ||
|
|
d10f1b5d30 | ||
|
|
fea3bb503f | ||
|
|
d92cc944cb | ||
|
|
f57b2d57cd | ||
|
|
cf0e5a811e | ||
|
|
ea8f51d168 | ||
|
|
e8befc4c67 | ||
|
|
5518771a8b | ||
|
|
47bc0f2a3c | ||
|
|
8bd820b909 | ||
|
|
f948d0e214 | ||
|
|
3a7c9e6c8e | ||
|
|
5a65d28d29 | ||
|
|
e9cdaf4dbe | ||
|
|
17f032ea11 | ||
|
|
ef565e5fa3 | ||
|
|
92f9bec1e7 | ||
|
|
0e3f3c13a1 | ||
|
|
74e12ce71d | ||
|
|
5fe6b48517 | ||
|
|
7f7a39292c | ||
|
|
2e1e227b4c | ||
|
|
ee68bcb6e9 | ||
|
|
025a638082 | ||
|
|
33babc5d85 | ||
|
|
a4c17ac82b | ||
|
|
06ba205320 | ||
|
|
5df14abed2 | ||
|
|
cdad85c0ef | ||
|
|
40e2d2045b | ||
|
|
212c8dd054 | ||
|
|
290582d428 | ||
|
|
582267a923 | ||
|
|
fe3c06c36b | ||
|
|
95d7826163 | ||
|
|
5e2099ad47 | ||
|
|
44280d1e52 | ||
|
|
897d879dad | ||
|
|
631a1c49c8 | ||
|
|
d3b20d2c04 | ||
|
|
c60c9ee69a | ||
|
|
965081c554 | ||
|
|
e6458b58ef | ||
|
|
9207462676 | ||
|
|
ab020358e7 | ||
|
|
135cfbac68 | ||
|
|
3dbf09e7ad | ||
|
|
32257c8fab | ||
|
|
5ecca50977 | ||
|
|
ae2fdc7ab3 | ||
|
|
f72ed257ce | ||
|
|
947e265a1a | ||
|
|
77ff362b58 | ||
|
|
9d40baa3ef | ||
|
|
d3b81cb6f8 | ||
|
|
c87ebf1f31 | ||
|
|
4905341999 | ||
|
|
047dee4eb4 | ||
|
|
dd1046b31f | ||
|
|
2b82a472ae | ||
|
|
8d5ef035d2 | ||
|
|
a3d41a80bf | ||
|
|
413507bba9 | ||
|
|
2ca76ff13c | ||
|
|
a6cd010695 | ||
|
|
411505bff5 | ||
|
|
4f4e879f8d | ||
|
|
448727f4b5 | ||
|
|
ca8138bb46 | ||
|
|
10764b8a68 | ||
|
|
b91afaf5c7 | ||
|
|
31501316c9 | ||
|
|
120a62257f | ||
|
|
a1e416ee83 | ||
|
|
3cf2dc0c04 | ||
|
|
6df9e584b3 | ||
|
|
0d247a9b8a | ||
|
|
bc22de47f9 | ||
|
|
a5b2d5e727 | ||
|
|
2c78f77eb2 | ||
|
|
738e802f3c | ||
|
|
8dab0755d3 | ||
|
|
5f81b573c0 | ||
|
|
a267712d10 | ||
|
|
0abaae073d | ||
|
|
a6791561d6 | ||
|
|
3ca2473239 | ||
|
|
779cc3e24d | ||
|
|
cfd2139310 | ||
|
|
4c05bff21e | ||
|
|
5392dd7ed0 | ||
|
|
cb9cb6eb09 | ||
|
|
3a33ddeecd | ||
|
|
a83910d7de | ||
|
|
336ed9d6e5 | ||
|
|
346e942e93 | ||
|
|
13a5be7306 | ||
|
|
bdceff6380 | ||
|
|
17c61f897a | ||
|
|
9a58e88ec6 | ||
|
|
355cccaa64 | ||
|
|
29580de2c7 | ||
|
|
67e08da918 | ||
|
|
e660b2d169 | ||
|
|
40bdf692d1 | ||
|
|
562c46660a | ||
|
|
0724dd0043 | ||
|
|
c0932a1bd5 | ||
|
|
d7a65fafad | ||
|
|
239e27c1b5 | ||
|
|
1ca10373a3 | ||
|
|
ac6687f6ff | ||
|
|
b616e1c8f6 | ||
|
|
1ec22b3d0c | ||
|
|
a01ffc6e1a | ||
|
|
e1bbc1e525 | ||
|
|
049cef9ce3 | ||
|
|
18f7a6a694 | ||
|
|
30a3abedbe | ||
|
|
2f5c926c82 | ||
|
|
55b4425c5d | ||
|
|
dc49d7af38 | ||
|
|
e01c2e903a | ||
|
|
886be81af2 | ||
|
|
671ddf5bef | ||
|
|
5f8cb04fee | ||
|
|
3f06560c51 | ||
|
|
f666e6f42e | ||
|
|
e546ce83b4 | ||
|
|
059a2d754e | ||
|
|
1e64ebe17a | ||
|
|
8abf8f844f | ||
|
|
01740a253d | ||
|
|
0461a28701 | ||
|
|
a3b1590286 | ||
|
|
b5cbb8b990 | ||
|
|
ff23a5bf1e | ||
|
|
afe2b14430 | ||
|
|
d4a6826d13 | ||
|
|
8d17018019 | ||
|
|
a65222d057 | ||
|
|
25e56ee8fb | ||
|
|
40c3e38f5a | ||
|
|
f810c56100 | ||
|
|
95b3bb955c | ||
|
|
8db07974e2 | ||
|
|
6c25650bbd | ||
|
|
4775fd74b8 | ||
|
|
f20ab12cf3 | ||
|
|
e6642c4338 | ||
|
|
5b81a1a9d6 | ||
|
|
7e40a810eb | ||
|
|
e7653d0497 | ||
|
|
8f7d2b592a | ||
|
|
7480f9b559 | ||
|
|
ba33649d7e | ||
|
|
705439c78b | ||
|
|
cddba56848 | ||
|
|
39fe5478b9 | ||
|
|
cb3c310eb8 | ||
|
|
c426f1eb83 | ||
|
|
beb94783c6 | ||
|
|
0b61328971 | ||
|
|
b96004a101 | ||
|
|
d2e7358db7 | ||
|
|
cfec9dde96 | ||
|
|
e04d563eb4 | ||
|
|
96c99b250e | ||
|
|
4370733b2b | ||
|
|
cac7662558 | ||
|
|
0abd21b434 | ||
|
|
0d29ea33d8 | ||
|
|
3a9f0e1100 | ||
|
|
d113bf1a66 | ||
|
|
2d72f55e57 | ||
|
|
4b0d1dcfbf | ||
|
|
35a0f25b57 | ||
|
|
702b654f09 | ||
|
|
f6de660e0e | ||
|
|
b3402b3d4e | ||
|
|
5b411b471e | ||
|
|
79dcb92d18 | ||
|
|
8bbc2e87bc | ||
|
|
c10ea20f83 | ||
|
|
b4231a758c | ||
|
|
59550ec673 | ||
|
|
6baa96360f | ||
|
|
14619b9437 | ||
|
|
817115fa47 | ||
|
|
5f5f2103c0 | ||
|
|
84865cdead | ||
|
|
c34a2b43fc | ||
|
|
ab9e31e7cc | ||
|
|
e1b4bcb2ef | ||
|
|
c4b3fbae1d | ||
|
|
1b5796a0ee | ||
|
|
9ab2922eb2 | ||
|
|
036b3b56c5 | ||
|
|
3c3848633e | ||
|
|
be7810c5a8 | ||
|
|
c7956f76ea | ||
|
|
30997a8262 | ||
|
|
431a789a39 | ||
|
|
8428e77c16 | ||
|
|
fe40ceab20 | ||
|
|
27ad473695 | ||
|
|
2c81f1808f | ||
|
|
f6a797fcb5 | ||
|
|
934ca28e2c | ||
|
|
de65413390 | ||
|
|
3bb69fd645 | ||
|
|
d301a9ac6e | ||
|
|
a4648d9738 | ||
|
|
df34693d4e | ||
|
|
edb849fa81 | ||
|
|
df50c5111b | ||
|
|
9d6038e0a3 | ||
|
|
484d403921 | ||
|
|
6d03d63c88 | ||
|
|
024fe1b834 | ||
|
|
d237e70ef1 | ||
|
|
8d49ad9ba4 | ||
|
|
55ad5886b4 | ||
|
|
2dc820c9d4 | ||
|
|
68c55270d4 | ||
|
|
0d7289d94b | ||
|
|
d1e8b6f823 | ||
|
|
cbbd898cd5 | ||
|
|
2524cc179e | ||
|
|
c69f0adac8 | ||
|
|
725cf737bc | ||
|
|
68c7cf7276 | ||
|
|
c32f26fc8f | ||
|
|
863c75f6a2 | ||
|
|
189f905785 | ||
|
|
477bce6117 | ||
|
|
f8a6dec0ed | ||
|
|
da39be9a8d | ||
|
|
1c3201b17f | ||
|
|
42bf4b2e87 | ||
|
|
f61656a1b8 | ||
|
|
7aff9e6af0 | ||
|
|
8cb93ec466 | ||
|
|
6267be0413 | ||
|
|
73a3549e09 | ||
|
|
a9cb42e2a4 | ||
|
|
1cffa8b68d | ||
|
|
8bc9fbecaf | ||
|
|
a4928bae6a | ||
|
|
a5a90c7ed8 | ||
|
|
d0e8cf2b43 | ||
|
|
f197f507bc | ||
|
|
4481aa7028 | ||
|
|
d71e7354d9 | ||
|
|
bec3605757 | ||
|
|
bac13afc9b | ||
|
|
ab47b4a783 | ||
|
|
d518b204b1 | ||
|
|
ca9883b6c0 | ||
|
|
65422ae6ca | ||
|
|
07bda54c41 | ||
|
|
fbd6d683ed | ||
|
|
d3cf9eaf97 | ||
|
|
a3c620f78d | ||
|
|
c286c7e5a8 | ||
|
|
37347672a8 | ||
|
|
f4982834ab | ||
|
|
209679abef | ||
|
|
80a992553d | ||
|
|
b77eca9db1 | ||
|
|
cfa594e595 | ||
|
|
abf823e38d | ||
|
|
08caf05eb2 | ||
|
|
5b79cf7a6a | ||
|
|
96945c2c79 | ||
|
|
d4be7634cb | ||
|
|
ceed212e63 | ||
|
|
3c1fe1da8b | ||
|
|
4b43a1dfb6 | ||
|
|
1fcd79729c | ||
|
|
f53d01be56 | ||
|
|
58e7af27c4 | ||
|
|
2d7b3e2bef | ||
|
|
1b529fabef | ||
|
|
eb53c72ca4 | ||
|
|
d0a40b4ca8 | ||
|
|
34e46eda64 | ||
|
|
fc4ae89039 | ||
|
|
1f2f08190a | ||
|
|
fbe1de1164 | ||
|
|
949e774a9f | ||
|
|
94440f9d0b | ||
|
|
c151e5e7a1 | ||
|
|
5d3fe93e1f | ||
|
|
c88bb60135 | ||
|
|
480acf441d | ||
|
|
c82bffeacc | ||
|
|
c840549db5 | ||
|
|
119d91ab80 | ||
|
|
b74aa1a585 | ||
|
|
171e1fc023 | ||
|
|
97cd215491 | ||
|
|
83e434395b | ||
|
|
afd9449b1d | ||
|
|
7ee0f5907f | ||
|
|
18f7c43fff | ||
|
|
de257c0ab2 | ||
|
|
060a718b0c | ||
|
|
8d9f33b5aa | ||
|
|
5062886815 | ||
|
|
7dfc6ceef5 | ||
|
|
7daff4c13a | ||
|
|
6b54017f08 | ||
|
|
776d0ab33d | ||
|
|
e910e40d0b | ||
|
|
ed0bccc7e2 | ||
|
|
e9df885b26 | ||
|
|
cb4a9daca2 | ||
|
|
131c42701c | ||
|
|
18f2accc7f | ||
|
|
ca2356f509 | ||
|
|
b1ceaea4ac | ||
|
|
607b1f8ede | ||
|
|
b2a7cb3d40 | ||
|
|
5f38dbb7dd | ||
|
|
ff6ce6294b | ||
|
|
03ade34cc7 | ||
|
|
c8a3e29f9f | ||
|
|
cc5aab8c5f | ||
|
|
002404227f | ||
|
|
dff0a07a8a | ||
|
|
5f6a0d81de | ||
|
|
e06e7d3e07 | ||
|
|
78d8f1992b | ||
|
|
36b0900589 | ||
|
|
d37de31b35 | ||
|
|
3658bf8c53 | ||
|
|
6d60785800 | ||
|
|
91da476cb3 | ||
|
|
4ab1816e1a | ||
|
|
9b7adfc0a8 | ||
|
|
e6a8fcd6cc | ||
|
|
e84f4623d8 | ||
|
|
7ab8b4fac7 | ||
|
|
c92c3627a6 | ||
|
|
e81cb7e640 | ||
|
|
0e65f25406 | ||
|
|
99365fadf0 | ||
|
|
7d9a698732 | ||
|
|
74dbe8bfcb | ||
|
|
edaa28cc23 | ||
|
|
6477e18040 | ||
|
|
9ce7c86558 | ||
|
|
36ec1a1c56 | ||
|
|
b0ba2379f4 | ||
|
|
5887f87677 | ||
|
|
4b9da8385b | ||
|
|
b8d2d05fce | ||
|
|
62285b01dc | ||
|
|
a6525e74e6 | ||
|
|
baff7f213f | ||
|
|
e1c429110f | ||
|
|
f9dec6e882 | ||
|
|
fd230789e9 | ||
|
|
f37a17581e | ||
|
|
8fd8bdcb2f | ||
|
|
528aba8724 | ||
|
|
fb4dfd0ea8 | ||
|
|
035887d3be | ||
|
|
24e7307a93 | ||
|
|
42f7afaefd | ||
|
|
04d0b14152 | ||
|
|
358e1d23fa | ||
|
|
ba0f7fc9f6 | ||
|
|
b39f041177 | ||
|
|
4b324bb719 | ||
|
|
8cd97e807c | ||
|
|
f56d3ea590 | ||
|
|
5d7102efd2 | ||
|
|
340b0836ff | ||
|
|
4926ee790b | ||
|
|
7b7996dc66 | ||
|
|
45efb415cd | ||
|
|
ee87122d5b | ||
|
|
1f908547e3 | ||
|
|
c721670098 | ||
|
|
ed603f310e | ||
|
|
507441f8b6 | ||
|
|
024abdb46f | ||
|
|
1644d3eb17 | ||
|
|
10926644bf | ||
|
|
e760d33dad | ||
|
|
2e4b7450ac | ||
|
|
09a89d8f4e | ||
|
|
f61a242f66 | ||
|
|
29e0f7c68f | ||
|
|
32d9c8f661 | ||
|
|
221a49a823 | ||
|
|
c30fd82636 | ||
|
|
a6f7b13389 | ||
|
|
5527507115 | ||
|
|
7f1fa6bbd6 | ||
|
|
15a5f76334 | ||
|
|
c03ea40552 | ||
|
|
71c3dd3515 | ||
|
|
55fd2332ed | ||
|
|
63ee61b8c4 | ||
|
|
9c4688b3f0 | ||
|
|
bd2687c22f | ||
|
|
7b0bdb1750 | ||
|
|
34fdfcb458 | ||
|
|
d2c47606ca | ||
|
|
568b78df81 | ||
|
|
d72284dc0e | ||
|
|
7611e826aa | ||
|
|
98a7a9e663 | ||
|
|
1e6e928995 | ||
|
|
723ad8c8ae | ||
|
|
c596e49a04 | ||
|
|
cd65cc12da | ||
|
|
2f22503c8b | ||
|
|
247f129a24 | ||
|
|
1a2675b246 | ||
|
|
6833275b2a | ||
|
|
19c2208dc4 | ||
|
|
82cf31010a | ||
|
|
d3ad848ea1 | ||
|
|
f3cc2818c5 | ||
|
|
91d4470295 | ||
|
|
f7af87e57b | ||
|
|
5dbcd714ea | ||
|
|
49a3eadd61 | ||
|
|
d4d8ff54e6 | ||
|
|
51e48db6e5 | ||
|
|
8412218f70 | ||
|
|
4bab4c510c | ||
|
|
d3d8e9fd0d | ||
|
|
11468d44be | ||
|
|
9c8b123fe5 | ||
|
|
38788aab43 | ||
|
|
9f53353b07 | ||
|
|
5c19a4d46f | ||
|
|
3b791035bf | ||
|
|
c47fed96b0 | ||
|
|
072d0dea24 | ||
|
|
190e2eb9ab | ||
|
|
e80e1b4c1f | ||
|
|
9074633751 | ||
|
|
f5aec0eba9 | ||
|
|
e5bdf34325 | ||
|
|
d6f88349b9 | ||
|
|
c2f1d0168b | ||
|
|
3562ab1444 | ||
|
|
e664549f43 | ||
|
|
5403b94f2e | ||
|
|
02e1663471 | ||
|
|
2438b20cf1 | ||
|
|
287e379a24 | ||
|
|
cd9e1bf0ea | ||
|
|
39b0fa18e1 | ||
|
|
5ce689972e | ||
|
|
0d24f642c3 | ||
|
|
fc68567f23 | ||
|
|
f7ac041b4e | ||
|
|
7fd1f8e025 | ||
|
|
e729cd233c | ||
|
|
1eadb1dbf8 | ||
|
|
2af79ca8b5 | ||
|
|
effa019053 | ||
|
|
b93b201eb3 | ||
|
|
61af76fcb8 | ||
|
|
15f56e4cea | ||
|
|
e516a8060a | ||
|
|
3f0241a039 | ||
|
|
07df0f41bf | ||
|
|
c80bc12284 | ||
|
|
cf3f785fa2 | ||
|
|
dc5028f019 | ||
|
|
87e93e1b08 | ||
|
|
42103432b7 | ||
|
|
842fe0d5f7 | ||
|
|
94c50199ea | ||
|
|
c2091e3a33 | ||
|
|
a22203573f | ||
|
|
0a5e87d007 | ||
|
|
a237d16f7d | ||
|
|
1ff1091ea4 | ||
|
|
891ea158dc | ||
|
|
9b17235533 | ||
|
|
6a7d42f3de | ||
|
|
d3400db5c0 | ||
|
|
01844efaa7 | ||
|
|
89d87b66d4 | ||
|
|
05f0f82bdc | ||
|
|
632423da07 | ||
|
|
a89ffd02d0 | ||
|
|
eb71974e73 | ||
|
|
c7542932f0 | ||
|
|
47fcd31806 | ||
|
|
341c00b15c | ||
|
|
3ac8772546 | ||
|
|
f3a47dbff8 | ||
|
|
944ab59642 | ||
|
|
d9c2b34d3f | ||
|
|
ecb683bd94 | ||
|
|
64718235c7 | ||
|
|
9bc3bbd966 | ||
|
|
fd842bb9e4 | ||
|
|
30d8ba72d1 | ||
|
|
3dc04b0df3 | ||
|
|
08ec5e99ac | ||
|
|
c2889c2b81 | ||
|
|
c6107d8376 | ||
|
|
f329a71029 | ||
|
|
333f4aaf83 | ||
|
|
f2b4c468a2 | ||
|
|
7a5456e3e4 | ||
|
|
a219eb5d47 | ||
|
|
235a1ee4b0 | ||
|
|
3aff7ddcef | ||
|
|
bd42200a29 | ||
|
|
0064e595c3 | ||
|
|
b1ae99c3df | ||
|
|
f91b38ff53 | ||
|
|
d36904096d | ||
|
|
ed760cfc82 | ||
|
|
b5f63184a9 | ||
|
|
bb14eeb4fc | ||
|
|
9e0311fa3d | ||
|
|
3caa1c6840 | ||
|
|
64df6a027e | ||
|
|
8850661b6c | ||
|
|
b4e19cb3e8 | ||
|
|
27285d04dd | ||
|
|
57ade0406e | ||
|
|
fe959dceb4 | ||
|
|
6fa805df62 | ||
|
|
a3128c9103 | ||
|
|
2c64769a51 | ||
|
|
d76330d32a | ||
|
|
28332f54e6 | ||
|
|
c7f3deb5cc | ||
|
|
0ac4c8c07d | ||
|
|
f8008002f6 | ||
|
|
666dee9bd8 | ||
|
|
225abb3144 | ||
|
|
d2113686ab | ||
|
|
10d8fc01ea | ||
|
|
443e9c260d | ||
|
|
73d6b2744e | ||
|
|
b78968b9d5 | ||
|
|
515d051c6a | ||
|
|
8eb4f0db2a | ||
|
|
da3eae20f0 | ||
|
|
9b5b241163 | ||
|
|
02493be6eb | ||
|
|
4b78ef71dc | ||
|
|
eec1560ead | ||
|
|
bd809abc52 | ||
|
|
15b7fe159f | ||
|
|
9689fff957 | ||
|
|
aa0742fe05 | ||
|
|
ea92e411c4 | ||
|
|
3577bef711 | ||
|
|
1593038224 | ||
|
|
7ff851aabc | ||
|
|
c06870ba53 | ||
|
|
2fbc3d7290 | ||
|
|
578f8261d7 | ||
|
|
2b3be5ef9a | ||
|
|
b44bcffd6f | ||
|
|
e68d922a0c | ||
|
|
a6824c6802 | ||
|
|
8a4596ee47 | ||
|
|
6404bf9bb3 | ||
|
|
7316716e15 | ||
|
|
90b0f4fa55 | ||
|
|
f6ba2e28cb | ||
|
|
442320bc36 | ||
|
|
2207fd5b29 | ||
|
|
eb028646b2 | ||
|
|
fd3280c254 | ||
|
|
a84bdce356 | ||
|
|
c963facc8c | ||
|
|
b758c799d4 | ||
|
|
bea033b18a | ||
|
|
ba2815b6c9 | ||
|
|
ae2c666a49 | ||
|
|
84c509c00d | ||
|
|
aa82615374 | ||
|
|
2d1882108f | ||
|
|
38401262cf | ||
|
|
b26cbe8101 | ||
|
|
f2749fa1f0 | ||
|
|
52e5317133 | ||
|
|
fa64421f94 | ||
|
|
310679c680 | ||
|
|
36eb1f80e1 | ||
|
|
dc7a95c8d1 | ||
|
|
a6289ba0f5 | ||
|
|
999c2d1faa | ||
|
|
cc22466fa3 | ||
|
|
6eac7daac9 | ||
|
|
4b2df0418a | ||
|
|
5a682b37ec | ||
|
|
8022db34c6 | ||
|
|
9aef631a25 | ||
|
|
cae85bce85 | ||
|
|
10508839cb | ||
|
|
bebb902aeb | ||
|
|
77cd521ffe | ||
|
|
b4b4149173 | ||
|
|
65f99c9cbc | ||
|
|
c2e27772e4 | ||
|
|
97de72b27d | ||
|
|
4320ead7f8 | ||
|
|
659b89936f | ||
|
|
f2fad10483 | ||
|
|
85cd428dcb | ||
|
|
bb37234142 | ||
|
|
7fe69cac94 | ||
|
|
57556bf73c | ||
|
|
600c5a76f1 | ||
|
|
3c0f269c64 | ||
|
|
48a267f631 | ||
|
|
c038c8e40a | ||
|
|
e553376c82 | ||
|
|
b3794a8ece | ||
|
|
b88ac2baa9 | ||
|
|
f5b684811c | ||
|
|
1f2d2db1fe | ||
|
|
342f85a68f | ||
|
|
bd3721a8e0 | ||
|
|
886cea3172 | ||
|
|
a2a4754982 | ||
|
|
d5a69cb638 | ||
|
|
c57b2ef12d | ||
|
|
530a81563c | ||
|
|
55c3d07a14 | ||
|
|
ecb6949c30 | ||
|
|
e098a3f15e | ||
|
|
c484157068 | ||
|
|
548bc5f028 | ||
|
|
da5dadec3b | ||
|
|
787234e838 | ||
|
|
2b5f920bc2 | ||
|
|
7708b09ea2 | ||
|
|
002c800ee8 | ||
|
|
561ff356b8 | ||
|
|
806262a5a2 | ||
|
|
25b53782ab | ||
|
|
d7f9ea7467 | ||
|
|
d6981981d3 | ||
|
|
9477fe9286 | ||
|
|
1e4e9384eb | ||
|
|
7cf94734be | ||
|
|
1e3c2f014c | ||
|
|
5d285452b3 | ||
|
|
67787421e1 | ||
|
|
5bebf83d52 | ||
|
|
b38a93a412 | ||
|
|
da6d01c451 | ||
|
|
c2c1260da0 | ||
|
|
50a9c00c59 | ||
|
|
d2d4c21cde | ||
|
|
84a60424ef | ||
|
|
09a49f6392 | ||
|
|
d8b40b6c46 | ||
|
|
bac833c1dd | ||
|
|
0c9c96206e | ||
|
|
09201b17fb | ||
|
|
d10ce1744c | ||
|
|
7c0a557e62 | ||
|
|
4c3f84a695 | ||
|
|
9b3a0d5b13 | ||
|
|
4d2b454e6d | ||
|
|
8ea0c16390 | ||
|
|
83f8508f56 | ||
|
|
16e08c2a12 | ||
|
|
619cc2b147 | ||
|
|
b8f531382d | ||
|
|
f463d2c511 | ||
|
|
5b3adeeb73 | ||
|
|
29df4ab244 | ||
|
|
923fe7b02b | ||
|
|
481ef1f895 | ||
|
|
e1623e0928 | ||
|
|
a8a518d728 | ||
|
|
515bb16418 | ||
|
|
77ec8e5bda | ||
|
|
616fd6603f | ||
|
|
1d5937e1e8 | ||
|
|
bd8289803e | ||
|
|
da7abd885a | ||
|
|
fc26bd175e | ||
|
|
9c09294d95 | ||
|
|
d70f714f35 | ||
|
|
564f256f81 | ||
|
|
793b4ab708 | ||
|
|
fbac6f2afa | ||
|
|
f3941c37d4 | ||
|
|
59fc48bd8b | ||
|
|
68014ee4b2 | ||
|
|
2d9dc09be9 | ||
|
|
3cf2b7ddbc | ||
|
|
646ce0dc0b | ||
|
|
7e95253fa2 | ||
|
|
fe6ce682bf | ||
|
|
db51dd0c39 | ||
|
|
03f09865e8 | ||
|
|
7b10b0b6b7 | ||
|
|
f8cd4c86d9 | ||
|
|
bd451e1402 | ||
|
|
ee8d7f8f65 | ||
|
|
3712da7e3f | ||
|
|
125e1d4a19 | ||
|
|
84bf8736d7 | ||
|
|
fa0c691666 | ||
|
|
49c3b4e83c | ||
|
|
b466f9fe96 | ||
|
|
e650818016 | ||
|
|
923fba3973 | ||
|
|
831dc59013 | ||
|
|
f8a920dc38 | ||
|
|
e0796b24c9 | ||
|
|
0f05127262 | ||
|
|
fc06005e3a | ||
|
|
c67077e428 | ||
|
|
b5c7811dde | ||
|
|
4a6762a427 | ||
|
|
cda7dcb484 | ||
|
|
2697ac69b2 | ||
|
|
54f9b7413f | ||
|
|
99fe6fb628 | ||
|
|
9dcb3604d7 | ||
|
|
4355dab38c | ||
|
|
1ea77662fe | ||
|
|
b1b8efdc3b | ||
|
|
950ac55281 | ||
|
|
a4efe92e6d | ||
|
|
f72b4073ac | ||
|
|
a1170dd9f9 | ||
|
|
71a1ff6677 | ||
|
|
493623e929 | ||
|
|
b27632e131 | ||
|
|
722d32a50c | ||
|
|
56bd6065e5 | ||
|
|
4bfd8560cd | ||
|
|
9f6b4334a1 | ||
|
|
b5722cfce2 | ||
|
|
72808de1ad | ||
|
|
6182d85f7e | ||
|
|
41326d0a8d | ||
|
|
377dd544eb | ||
|
|
dcddaad2be | ||
|
|
f5c428b546 | ||
|
|
11d65ea2d7 | ||
|
|
401aafab48 | ||
|
|
eb7e271fc6 | ||
|
|
7b2548b9fb | ||
|
|
46f0bb3f28 | ||
|
|
8e0e088e70 | ||
|
|
6c60b37e63 | ||
|
|
97847d5a06 | ||
|
|
7a9c6f4de4 | ||
|
|
02134c4fc6 | ||
|
|
01209b11b9 | ||
|
|
c840e2b664 | ||
|
|
079cfe226d | ||
|
|
b9c7d8d7b1 | ||
|
|
5bdbe25b3a | ||
|
|
33e04a3190 | ||
|
|
0a3c80688b | ||
|
|
8ede250bc6 | ||
|
|
eb311b9aca | ||
|
|
bbc790a981 | ||
|
|
722e37fb84 | ||
|
|
45781ab4a1 | ||
|
|
777cea24c8 | ||
|
|
bbc4bb27fe | ||
|
|
0b73229f6c | ||
|
|
2c44d979c6 | ||
|
|
a79d76ff3f | ||
|
|
0e21b3cfda | ||
|
|
3e57bb344e | ||
|
|
33a8a7276b | ||
|
|
4a744cf949 | ||
|
|
73eb6b4b75 | ||
|
|
d81ad1ce4f | ||
|
|
8ae4a7708e | ||
|
|
ebeb3fefdb | ||
|
|
0a2e02bb4d | ||
|
|
1c61de082a | ||
|
|
b34d5409e6 | ||
|
|
6868e26678 | ||
|
|
270a637924 | ||
|
|
71603973c8 | ||
|
|
7969f69866 | ||
|
|
ac709fed45 | ||
|
|
01054f2549 | ||
|
|
42a9e2fe35 | ||
|
|
808ecf57ac | ||
|
|
6eb8c8c9d6 | ||
|
|
1aec393c2f | ||
|
|
c6ebb71948 | ||
|
|
0d7f135aaa | ||
|
|
57aeeb0a6c | ||
|
|
19082461e8 | ||
|
|
44d3966951 | ||
|
|
11c0041794 | ||
|
|
a261339ddc | ||
|
|
aba5a0b4ad | ||
|
|
d9280b1711 | ||
|
|
2641eda20a | ||
|
|
8ed48b667e | ||
|
|
313e0865c6 | ||
|
|
0fcccfe2d8 | ||
|
|
76b437e494 | ||
|
|
1c58d4377a | ||
|
|
459ece51b6 | ||
|
|
15ac299fef | ||
|
|
0aed3ccc96 | ||
|
|
b1e9676f32 | ||
|
|
7dea3a2373 | ||
|
|
3b36dc997c | ||
|
|
12a3d687c6 | ||
|
|
64f8c07c5a | ||
|
|
85a3682ac6 | ||
|
|
8d5e97acd3 | ||
|
|
665eaf00c5 | ||
|
|
d32dabfd7f | ||
|
|
6dcd2b76fa | ||
|
|
39855241fc | ||
|
|
a30ce26dba | ||
|
|
3aa6da058a | ||
|
|
7fd4de60db | ||
|
|
9a09e6189b | ||
|
|
e5dd174d69 | ||
|
|
7615b86ac7 | ||
|
|
9735327df9 | ||
|
|
b590282f66 | ||
|
|
2e2e7be4d0 | ||
|
|
003c916d71 | ||
|
|
e255b7828b | ||
|
|
3da9eab934 | ||
|
|
d7f0be3270 | ||
|
|
a34608a801 | ||
|
|
cf8f36ba76 | ||
|
|
cd024bed8b | ||
|
|
784ca96cca | ||
|
|
3481acbe3c | ||
|
|
977f2f4d93 | ||
|
|
258cd58c96 | ||
|
|
448519ddc1 | ||
|
|
79452bc9ac | ||
|
|
607ee5254a | ||
|
|
7adeb694c1 | ||
|
|
ba2c9b5beb | ||
|
|
3cd4336bd0 | ||
|
|
d86aa1a5a3 | ||
|
|
97cfbf5c50 | ||
|
|
cc72eb24c2 | ||
|
|
d845e6bb9e | ||
|
|
421f6b582b | ||
|
|
caae87e72b | ||
|
|
fc7f2793e3 | ||
|
|
ad88e60394 | ||
|
|
f75086ca28 | ||
|
|
e7c73164a6 | ||
|
|
b780142c14 | ||
|
|
1e7f3c8126 | ||
|
|
71bb2e87c8 | ||
|
|
6ca3c1a23e | ||
|
|
f86bcc61c5 | ||
|
|
77f0e9b912 | ||
|
|
ead8dc27d0 | ||
|
|
ca29d7e1be | ||
|
|
e21f8903ee | ||
|
|
b4e0dd107c | ||
|
|
cae90e8287 | ||
|
|
bee64abe2e | ||
|
|
c3f84d6de4 | ||
|
|
b9f2e372d0 | ||
|
|
bdb1251cfa | ||
|
|
3e9df9d975 | ||
|
|
cf321fa8f3 | ||
|
|
da02e4df42 | ||
|
|
de8e80a9bd | ||
|
|
f0cd704fad | ||
|
|
cd87af1415 | ||
|
|
6693fc7449 | ||
|
|
c14df12ce6 | ||
|
|
271650cfbe | ||
|
|
d523b16c5b | ||
|
|
1455ca8cbf | ||
|
|
b859854fbf | ||
|
|
3cda2b663a | ||
|
|
8599aa4e32 | ||
|
|
a1410b444b | ||
|
|
34b06c1a0f | ||
|
|
e0cbf43947 | ||
|
|
4934f77c6f | ||
|
|
8d28d0f842 | ||
|
|
5671a450c8 | ||
|
|
61ce53f47e | ||
|
|
5cb02b9e01 | ||
|
|
703e499d52 | ||
|
|
361ff60f11 | ||
|
|
b68ac66237 | ||
|
|
928966188b | ||
|
|
65a8e5e4aa | ||
|
|
66d99324dd | ||
|
|
c09806d560 | ||
|
|
0fdd75be59 | ||
|
|
4359fe706e | ||
|
|
a636a04f0a | ||
|
|
0d3cb9f6e4 | ||
|
|
c8d3b55741 | ||
|
|
d80b0a39a8 | ||
|
|
b2c264ea59 | ||
|
|
2e5012f55b | ||
|
|
3f5d55d224 | ||
|
|
5a1ca8578b | ||
|
|
851571c7f6 | ||
|
|
6760d5edf9 | ||
|
|
80954c3979 | ||
|
|
64d0bd91ef | ||
|
|
1df05202e9 | ||
|
|
324cb8aa0d | ||
|
|
6400c885cc | ||
|
|
2ac690ce20 | ||
|
|
ab382dc604 | ||
|
|
ac0e9f7fb7 | ||
|
|
78a003c161 | ||
|
|
ed607e6e95 | ||
|
|
088b343d2f | ||
|
|
9d24649d61 | ||
|
|
24992f144e | ||
|
|
56c593fd67 | ||
|
|
af2af06165 | ||
|
|
4d56befb85 | ||
|
|
a6efacdd8f | ||
|
|
ea4728afde | ||
|
|
1109f9cec9 | ||
|
|
aa9b6df0c4 | ||
|
|
59a63e7725 | ||
|
|
af0f58f727 | ||
|
|
3bc4d6a10f | ||
|
|
3bf20a0bd1 | ||
|
|
3fd37b96a0 | ||
|
|
c46b5c82cd | ||
|
|
77a2ebc2c4 | ||
|
|
0c3f39ee0d | ||
|
|
b31c04e148 | ||
|
|
94e3d98452 | ||
|
|
ccb1f36083 | ||
|
|
b585e7b498 | ||
|
|
6f73948846 | ||
|
|
567bc07627 | ||
|
|
2aa37133fe | ||
|
|
fb1e39bbad | ||
|
|
134422cb65 | ||
|
|
d03c8959c8 | ||
|
|
9e50dfc3ce | ||
|
|
9bb6a25f31 | ||
|
|
4b5c985349 | ||
|
|
8115632db5 | ||
|
|
a04576d4c3 | ||
|
|
a1e7134433 | ||
|
|
241ebc9388 | ||
|
|
d53a335abc | ||
|
|
a60b05d40d | ||
|
|
c3f41ae003 | ||
|
|
3483b8dbec | ||
|
|
034f83bfb3 | ||
|
|
0a3d75d197 | ||
|
|
39f2b99c7b | ||
|
|
0fed21d6de | ||
|
|
a9fa808dd1 | ||
|
|
5e3a8958f3 | ||
|
|
d5e27ff07d | ||
|
|
8eee948f07 | ||
|
|
3d7090bdba | ||
|
|
eef3f8a3ac | ||
|
|
2671cd926c | ||
|
|
666203bd0e | ||
|
|
46ee2e9cc8 | ||
|
|
756ea882c9 | ||
|
|
d5b48aab07 | ||
|
|
eece475fb8 | ||
|
|
dda2390983 | ||
|
|
496332a878 | ||
|
|
b43a268873 | ||
|
|
f156acda72 | ||
|
|
8076e71109 | ||
|
|
51e0f442d6 | ||
|
|
e1e55807bc | ||
|
|
4cc30a8cd6 | ||
|
|
3c9b5b71df | ||
|
|
06bbda0c99 | ||
|
|
a9bea84086 | ||
|
|
fb8ba824f6 | ||
|
|
bacad3733d | ||
|
|
d2ee1845e1 | ||
|
|
5e4bc36fc3 | ||
|
|
f3891ffe04 | ||
|
|
2842c33759 | ||
|
|
045189553e | ||
|
|
0218312055 | ||
|
|
7d1bbeef10 | ||
|
|
9e9aa31df2 | ||
|
|
951be246b7 | ||
|
|
9872689abe | ||
|
|
6be5e5731e | ||
|
|
eb457019dd | ||
|
|
b7dbb83294 | ||
|
|
28bd9a72d2 | ||
|
|
9019fa8baa | ||
|
|
1257eb642a | ||
|
|
140b7634ff | ||
|
|
48da5a3dba | ||
|
|
58f1e3c8a9 | ||
|
|
da27e1c78b | ||
|
|
4f4d969416 | ||
|
|
15c5269e35 | ||
|
|
06899c937c | ||
|
|
1107daab98 | ||
|
|
292c11ee06 | ||
|
|
d554c7809d | ||
|
|
527b48278a | ||
|
|
9331f2cff1 | ||
|
|
2633419c8e | ||
|
|
5d0854491a | ||
|
|
1fe61f2bc7 | ||
|
|
fb32dda5a1 | ||
|
|
ceef6c8b6d | ||
|
|
c029dc8a5e | ||
|
|
b78d9d0c03 | ||
|
|
8161cf3acb | ||
|
|
b9fcd8f60b | ||
|
|
07a4dd26a5 | ||
|
|
ceda53d8d2 | ||
|
|
9662ef5a7c | ||
|
|
7a629a5b37 | ||
|
|
33c195d01d | ||
|
|
28069f7fb6 | ||
|
|
716366c54f | ||
|
|
030ff0994d | ||
|
|
0295641aeb | ||
|
|
0e4fa41c63 | ||
|
|
6e08eb1c56 | ||
|
|
855d95909a | ||
|
|
53c3151a23 | ||
|
|
c1dd25a77e | ||
|
|
f1f0109621 | ||
|
|
f258ae4b60 | ||
|
|
abccad8771 | ||
|
|
eb26b37b86 | ||
|
|
f7bbdd3044 | ||
|
|
b5253f03db | ||
|
|
ac8e88ee53 | ||
|
|
7116001f5c | ||
|
|
254553f90e | ||
|
|
cd46edb23f | ||
|
|
9d43cf3b44 | ||
|
|
08f61e25de | ||
|
|
acaf0f525d | ||
|
|
08c424cbc8 | ||
|
|
fa560ad0a0 | ||
|
|
ccec187ed6 | ||
|
|
ddb51583d3 | ||
|
|
fec309b907 | ||
|
|
e91552ab3c | ||
|
|
8efddfbb77 | ||
|
|
d89ff0fea1 | ||
|
|
ba39119aab | ||
|
|
834e617736 | ||
|
|
f63b098b61 | ||
|
|
35bf427159 | ||
|
|
a11eab5bb7 | ||
|
|
d06a16f7da | ||
|
|
122ed15e11 | ||
|
|
c691fc1915 | ||
|
|
82c9a02447 | ||
|
|
f4e58f1aad | ||
|
|
cc32479662 | ||
|
|
9272767e4e | ||
|
|
3102118e38 | ||
|
|
5b725a4f20 | ||
|
|
82d925a1d8 | ||
|
|
520a4f4260 | ||
|
|
5732245dac | ||
|
|
ee6bcdb7d0 | ||
|
|
2cb8f9fd2e | ||
|
|
9ca81e6413 | ||
|
|
56d6e38f85 | ||
|
|
562f711e64 | ||
|
|
ed64160716 | ||
|
|
ca0978e094 | ||
|
|
fdfd387e80 | ||
|
|
6df6ad636c | ||
|
|
275c3df302 | ||
|
|
f6beb48f5e | ||
|
|
427b161606 | ||
|
|
25426c5430 | ||
|
|
92240564bc | ||
|
|
3314dbd79f | ||
|
|
253944186b | ||
|
|
fa0e444db0 | ||
|
|
5ba724b7fa | ||
|
|
6e3f2f6777 | ||
|
|
da93fc4a86 | ||
|
|
fd03f083bd | ||
|
|
8c5b403b7c | ||
|
|
7dab8e509f | ||
|
|
290339a22d | ||
|
|
63478b1c48 | ||
|
|
7db6695768 | ||
|
|
a9fe150778 | ||
|
|
f37efc48a0 | ||
|
|
e551454fea | ||
|
|
bcbf50a5bf | ||
|
|
d003b255b9 | ||
|
|
06fdf27be2 | ||
|
|
78e0ae1a4e | ||
|
|
b6a7836447 | ||
|
|
4954491273 | ||
|
|
4c2640d4b3 | ||
|
|
adc1db585a | ||
|
|
f4ddb6faf9 | ||
|
|
da014b07a9 | ||
|
|
ecf4839f01 | ||
|
|
5730c4a29e | ||
|
|
fe811e2ec2 | ||
|
|
2bbd5c6814 | ||
|
|
4a8545c99f | ||
|
|
34b9a04af5 | ||
|
|
01dcfe01bb | ||
|
|
31ef55d838 | ||
|
|
bde1d472d3 | ||
|
|
6729ae7380 | ||
|
|
827c80d4d8 | ||
|
|
15155f2db8 | ||
|
|
7283fe41c2 | ||
|
|
c9daab71bf | ||
|
|
92582a9785 | ||
|
|
341ac18f1a | ||
|
|
adb47adf9b | ||
|
|
8ace0628a1 | ||
|
|
a7e99dc08a | ||
|
|
4f7a4a4f70 | ||
|
|
b56074bef1 | ||
|
|
ff3987ccab | ||
|
|
6de8e70004 | ||
|
|
d69176e936 | ||
|
|
70492cc169 | ||
|
|
26aabd2226 | ||
|
|
48b9aa450d | ||
|
|
bff27010f3 | ||
|
|
3e5f5f3245 | ||
|
|
bfbe00e11c | ||
|
|
178be387bb | ||
|
|
1541d87122 | ||
|
|
d6427a1efb | ||
|
|
229fba2de9 | ||
|
|
dc1d5e9e0a | ||
|
|
9018ae3afe | ||
|
|
5487383068 | ||
|
|
0e49e4ad37 | ||
|
|
6ff273fd32 | ||
|
|
cb94523747 | ||
|
|
44ad8a3be1 | ||
|
|
5a1952f7ac | ||
|
|
894b10eeb4 | ||
|
|
6147d81cc5 | ||
|
|
d8606ea917 | ||
|
|
7cea134352 | ||
|
|
08e5154535 | ||
|
|
aa74e9e026 | ||
|
|
3c45dcca7a | ||
|
|
1eaedb3e8e | ||
|
|
7418a10d28 | ||
|
|
fe53cddd03 | ||
|
|
ec640dcd1b | ||
|
|
2d697187ff | ||
|
|
c40944144a | ||
|
|
610682c2be | ||
|
|
199aedf60a | ||
|
|
170ddf1f6f | ||
|
|
b8466739f9 | ||
|
|
9f0d771f40 | ||
|
|
dbcd11563f | ||
|
|
19ac2aeb19 | ||
|
|
37bceb7897 | ||
|
|
679d18166f | ||
|
|
1deef73237 | ||
|
|
73d93c3c23 | ||
|
|
59a4afef3c | ||
|
|
75ccc7a31b | ||
|
|
7fe9d71eb3 | ||
|
|
4d56ed9e27 | ||
|
|
47f9a1765a | ||
|
|
acefb96520 | ||
|
|
7d8d477a19 | ||
|
|
74233bf459 | ||
|
|
1b07cdad1c | ||
|
|
ffeecb6234 | ||
|
|
400c385a5c | ||
|
|
e1359ace86 | ||
|
|
df3e5de3f1 | ||
|
|
1e8f8bf3cd | ||
|
|
3635b2f001 | ||
|
|
60cefb3820 | ||
|
|
d2f90be148 | ||
|
|
8532b240be | ||
|
|
1956f5896d | ||
|
|
366534a295 | ||
|
|
631560c95a | ||
|
|
eed500560d | ||
|
|
0988f54bd2 | ||
|
|
cfc6abcfdc | ||
|
|
5a5d92e6f6 | ||
|
|
d248e45563 | ||
|
|
dba28580e9 | ||
|
|
b75eedde0a | ||
|
|
2c73ca216e | ||
|
|
c13b4cb7bd | ||
|
|
d5b8ce4bec | ||
|
|
85aa323a2d | ||
|
|
b0f54f6d1d | ||
|
|
acb76b867e | ||
|
|
977d9873a7 | ||
|
|
ee328592e9 | ||
|
|
431feea267 | ||
|
|
4f62745207 | ||
|
|
05bb8beb71 | ||
|
|
ab42e7b23a | ||
|
|
b4a54eb047 | ||
|
|
5279971bd7 | ||
|
|
f86360faf4 | ||
|
|
57d8ec5e32 | ||
|
|
68898636a4 | ||
|
|
b38729fc0e | ||
|
|
544b872ada | ||
|
|
25e5b3528e | ||
|
|
72541b6d51 | ||
|
|
a7a954bb22 | ||
|
|
d72e9873d1 | ||
|
|
46dc634a5c | ||
|
|
9b8badc00c | ||
|
|
7251254d8f | ||
|
|
9c4425295b | ||
|
|
f04a9e07e1 | ||
|
|
66f29831e1 | ||
|
|
251db80609 | ||
|
|
791c26734f | ||
|
|
d074854aae | ||
|
|
28fb9fa2be | ||
|
|
67e9109c14 | ||
|
|
5109cb7b33 | ||
|
|
b4353a31ac | ||
|
|
a15f088e8b | ||
|
|
3034348ac8 | ||
|
|
4927d9c29e | ||
|
|
d71c35ab22 | ||
|
|
11e3380ab1 | ||
|
|
3d00c4ae30 | ||
|
|
8db58b42af | ||
|
|
8d5690c834 | ||
|
|
a8e545891c | ||
|
|
6ba65d4caa | ||
|
|
a9331a757f | ||
|
|
cd4418dc45 | ||
|
|
4a96678580 | ||
|
|
1378ae45c3 | ||
|
|
3b76636d6b | ||
|
|
6ca0713739 | ||
|
|
39ca338f96 | ||
|
|
0e92a8f723 | ||
|
|
6ef2a8e21d | ||
|
|
ffd49c1777 | ||
|
|
84fad36282 | ||
|
|
9393529613 | ||
|
|
76a105261e | ||
|
|
199ed44aae | ||
|
|
4e6a4213ff | ||
|
|
fbe5ba8317 | ||
|
|
12aa815c5a | ||
|
|
2a8d6f192a | ||
|
|
abe0ae9304 | ||
|
|
4fc34f6886 | ||
|
|
afd624d0c0 | ||
|
|
f06ee51f05 | ||
|
|
be0b04c54e | ||
|
|
ed358e6e16 | ||
|
|
9f58e29f1c | ||
|
|
f6fb6df48c | ||
|
|
86746a1563 | ||
|
|
47dc499413 | ||
|
|
a7594d64a2 | ||
|
|
a229f7006f | ||
|
|
34b6bcf504 | ||
|
|
0ef429fdac | ||
|
|
a090c724f8 | ||
|
|
4cfa813cd5 | ||
|
|
2bd8e2feda | ||
|
|
a272427423 | ||
|
|
e638ed0272 | ||
|
|
90818efe5e | ||
|
|
77648e71e9 | ||
|
|
959c2fcc32 | ||
|
|
79c946367f | ||
|
|
b32b308332 | ||
|
|
011e301324 | ||
|
|
fb6b467dcb | ||
|
|
d98221ac56 | ||
|
|
6e503cd0e2 | ||
|
|
408878290e | ||
|
|
d2d6e3ad66 | ||
|
|
0b7966f625 | ||
|
|
9afaa7cf0f | ||
|
|
b35d60db2d | ||
|
|
1d34d21a60 | ||
|
|
da2c6e8bc8 | ||
|
|
0bfff8844e | ||
|
|
3c24044736 | ||
|
|
3d4eb7a5f5 | ||
|
|
06bda869e0 | ||
|
|
c001e31241 | ||
|
|
3f9926487d | ||
|
|
84e6461248 | ||
|
|
60f64a30ad | ||
|
|
28608e4ce0 | ||
|
|
2d7ef434be | ||
|
|
7e8915966b | ||
|
|
625b92318f | ||
|
|
b38ee48e59 | ||
|
|
72a7fac467 | ||
|
|
916c7acbb7 | ||
|
|
6e794e3c50 | ||
|
|
7c0f704fbd | ||
|
|
f544d9ac78 | ||
|
|
8f368b9b3b | ||
|
|
5213daad77 | ||
|
|
57c0477fc6 | ||
|
|
70983136bc | ||
|
|
09935ba4b0 | ||
|
|
3ba4224b69 | ||
|
|
69b4d56fdd | ||
|
|
bbc16e36dd | ||
|
|
499419a23c | ||
|
|
30bf765b75 | ||
|
|
bb9e4ee0b9 | ||
|
|
57a9508849 | ||
|
|
4977049425 | ||
|
|
53b5b7a5c7 | ||
|
|
a128581ae5 | ||
|
|
6677a185f8 | ||
|
|
a9b6a70d15 | ||
|
|
cf2791a246 | ||
|
|
c28d2daf20 | ||
|
|
4f3bf839f7 | ||
|
|
129562594d | ||
|
|
676d976e53 | ||
|
|
e339034082 | ||
|
|
5a36aa7fce | ||
|
|
f262ce5209 | ||
|
|
be9cb8931c | ||
|
|
0477af1b0d | ||
|
|
0b9e89691d | ||
|
|
d654ec1647 | ||
|
|
a1cdb572e2 | ||
|
|
e5357c8a0b | ||
|
|
de3fd183d8 | ||
|
|
328eb32a24 | ||
|
|
f48cd1b82b | ||
|
|
948669edbc | ||
|
|
868fbe2f2d | ||
|
|
22792df5cd | ||
|
|
af9e4e86f0 | ||
|
|
5028491ab3 | ||
|
|
5cd38c5aa7 | ||
|
|
3d5fee0a2f | ||
|
|
8295b9dffd | ||
|
|
8c44c4c842 | ||
|
|
df21e36f5b | ||
|
|
d77e045f5d | ||
|
|
fb40d137f8 | ||
|
|
bfd2a63aca | ||
|
|
01f7b6cbfb | ||
|
|
3d65a5d90d | ||
|
|
b09dfc2511 | ||
|
|
02380fbf1a | ||
|
|
6d31c48522 | ||
|
|
901e77e6f1 | ||
|
|
a07fd46718 | ||
|
|
98479c4dc4 | ||
|
|
c3e1b51ac4 | ||
|
|
6d21b9919d | ||
|
|
36ac2ee86d | ||
|
|
63132dc1db | ||
|
|
82553b0df2 | ||
|
|
dc445edaae | ||
|
|
2e89f86b9f | ||
|
|
bb836dae38 | ||
|
|
8fbd8b99d7 | ||
|
|
9f0874ee06 | ||
|
|
e62fab767a | ||
|
|
f9e264ca0a | ||
|
|
2629c767a8 | ||
|
|
af7ad482c2 | ||
|
|
f6f26af7cb | ||
|
|
f15d6f5197 | ||
|
|
e7eb3bdfef | ||
|
|
5360d2c231 | ||
|
|
9462899e97 | ||
|
|
9819e63fcc | ||
|
|
50eafab5dc | ||
|
|
229bade38c | ||
|
|
5fdc9d894e | ||
|
|
ad68107e1b | ||
|
|
f14dc70663 | ||
|
|
b34432c6ac | ||
|
|
5be04964a3 | ||
|
|
9347e8d936 | ||
|
|
f6dc84a26a | ||
|
|
ed95c4f4bf | ||
|
|
4c432000cb | ||
|
|
f51cf35935 | ||
|
|
3b4d7ba93e | ||
|
|
8a3490a300 | ||
|
|
c64977a7db | ||
|
|
f362953afc | ||
|
|
2067cbec31 | ||
|
|
018ada3433 | ||
|
|
f49ad844b8 | ||
|
|
f68ca5d76e | ||
|
|
2556f24b8f | ||
|
|
d03f94da46 | ||
|
|
9943ceaf0e | ||
|
|
bf8b8f4512 | ||
|
|
71fe3e4ae4 | ||
|
|
d5e3835bbf | ||
|
|
e877d83023 | ||
|
|
00e34f7846 | ||
|
|
22a1114501 | ||
|
|
65ea07af61 | ||
|
|
fb33f35e45 | ||
|
|
fdaf557b99 | ||
|
|
33634d1ffe | ||
|
|
3934ba32ec | ||
|
|
e4d75c6680 | ||
|
|
278458bb64 | ||
|
|
def4434909 | ||
|
|
e39ea7119f | ||
|
|
9247609009 | ||
|
|
40f34ecc9e | ||
|
|
808743da94 | ||
|
|
ee6dd2ec56 | ||
|
|
c72ffb4212 | ||
|
|
b1a5ebacf3 | ||
|
|
da0155e260 | ||
|
|
d253991ecb | ||
|
|
37cb0061ee | ||
|
|
9038bb3803 | ||
|
|
0aa32694ef | ||
|
|
c8f0cf3543 | ||
|
|
f182a72d19 | ||
|
|
c5363da1e8 | ||
|
|
a8ba815fb3 | ||
|
|
587e6e8c24 | ||
|
|
f12d47386f | ||
|
|
8ba5e9a164 | ||
|
|
3c6625a506 | ||
|
|
0096765676 | ||
|
|
8241991e8a | ||
|
|
5f11583915 | ||
|
|
56f6c0a48b | ||
|
|
77cccf3836 | ||
|
|
84e345e655 | ||
|
|
92a62da383 | ||
|
|
39db876fee | ||
|
|
6ca78702f0 | ||
|
|
d13705749a | ||
|
|
5af989fa29 | ||
|
|
689123fa95 | ||
|
|
fd5e3dcecb | ||
|
|
d6e03df7de | ||
|
|
a0a60eba69 | ||
|
|
c0ffe5b96a | ||
|
|
d399528078 | ||
|
|
5d2d6adfaf | ||
|
|
7db2c0c9f7 | ||
|
|
87e8b09065 | ||
|
|
df2b8d3c8d | ||
|
|
ff46368783 | ||
|
|
18b36d5593 | ||
|
|
17c36025a0 | ||
|
|
ce8913b5bf | ||
|
|
7c9ba196c9 | ||
|
|
be986cf599 | ||
|
|
e6eef867dc | ||
|
|
4479026649 | ||
|
|
2deff0611d | ||
|
|
7dae6a1ff0 | ||
|
|
767a9b3042 | ||
|
|
94760e550e | ||
|
|
168a187f51 | ||
|
|
09455a7bd7 | ||
|
|
9b27a3de69 | ||
|
|
1983f1bee0 | ||
|
|
efab83fa46 | ||
|
|
ecbfaffae7 | ||
|
|
59e653b458 | ||
|
|
c85388815b | ||
|
|
10f8407a0d | ||
|
|
f45b0a7d25 | ||
|
|
22de9db4e1 | ||
|
|
986275c42c | ||
|
|
8b97eed79c | ||
|
|
a44d15a7e9 | ||
|
|
1f29558526 | ||
|
|
b49b8bffa1 | ||
|
|
d6395eab06 | ||
|
|
7d29ac861b | ||
|
|
70d42ee328 | ||
|
|
5e974f8845 | ||
|
|
cdb2d17a2e | ||
|
|
491c1d26bf | ||
|
|
86bd96e063 | ||
|
|
a5820bfd9a | ||
|
|
d07e415733 | ||
|
|
c096be427e | ||
|
|
ca00bf8b62 | ||
|
|
2e4b084ebf | ||
|
|
b1b8239722 | ||
|
|
9da4dc4899 | ||
|
|
014caff418 | ||
|
|
6399a4281f | ||
|
|
746f3adb6e | ||
|
|
f826c3fe65 | ||
|
|
7f6c4aa4c8 | ||
|
|
9cf2ba7b03 | ||
|
|
2b4402e0d4 | ||
|
|
5db9185409 | ||
|
|
bd173c9fc3 | ||
|
|
084c1c84f3 | ||
|
|
591a7c9662 | ||
|
|
76636ef992 | ||
|
|
45544c723f | ||
|
|
4bed8fab02 | ||
|
|
1cd4f0e8e3 | ||
|
|
7765205fe2 | ||
|
|
4360d9b67b | ||
|
|
a9753578d7 | ||
|
|
1f64326321 | ||
|
|
6fc8cfc827 | ||
|
|
cf14d744ee | ||
|
|
08beb71cca | ||
|
|
c1389a2f94 | ||
|
|
50fb2ddf69 | ||
|
|
fd1f4bf628 | ||
|
|
af882e87f5 | ||
|
|
89ec822ba5 | ||
|
|
5c664685da | ||
|
|
2061bc5212 | ||
|
|
5adc39915e | ||
|
|
2d47554741 | ||
|
|
1ad20a1fb3 | ||
|
|
53d2cd4ea7 | ||
|
|
b9757fe837 | ||
|
|
bed05a484c | ||
|
|
629f460eb6 | ||
|
|
ef6a6ed651 | ||
|
|
74b20236d6 | ||
|
|
4c9e2c1f1a | ||
|
|
b137f73440 | ||
|
|
84d3639991 | ||
|
|
c483c9c532 | ||
|
|
a6a7b56d73 | ||
|
|
cee0474e37 | ||
|
|
3b069ec049 | ||
|
|
d52486dfab | ||
|
|
fdd528b99e | ||
|
|
f378035836 | ||
|
|
7c1ecc0950 | ||
|
|
da2ea50616 | ||
|
|
ba8ddb23da | ||
|
|
bdb99725a0 | ||
|
|
4189900e86 | ||
|
|
fc131bd465 | ||
|
|
5268199679 | ||
|
|
cf488f4406 | ||
|
|
cec206ec8d | ||
|
|
b5c936c496 | ||
|
|
6c2fd8e431 | ||
|
|
13358cf0a3 | ||
|
|
533b1ea283 | ||
|
|
6ec32c5056 | ||
|
|
4f0e67a8be | ||
|
|
618d6cf3c0 | ||
|
|
ac509ed798 | ||
|
|
c6fd3ece1a | ||
|
|
e3663d054e | ||
|
|
9b1aac45fa | ||
|
|
d46000f77c | ||
|
|
c2a1a7bfb3 | ||
|
|
9c1d20737e | ||
|
|
3ad64eef66 | ||
|
|
860946c146 | ||
|
|
62b6a37483 | ||
|
|
c50eb93c3d | ||
|
|
33c4950757 | ||
|
|
30af56d392 | ||
|
|
dab4d5a8d7 | ||
|
|
0ece8a968e | ||
|
|
158d50e5fa | ||
|
|
83efc3893b | ||
|
|
c3208785cf | ||
|
|
addee255ff | ||
|
|
64ce0e62e2 | ||
|
|
48f7102e39 | ||
|
|
4982d23738 | ||
|
|
7f336b884b | ||
|
|
4ba2672d84 | ||
|
|
339da86683 | ||
|
|
93565d996c | ||
|
|
1d71429b74 | ||
|
|
d71c31e1bf | ||
|
|
f9447fa4a1 | ||
|
|
fbd508781e | ||
|
|
d253b1da9e | ||
|
|
1b5b78ab25 | ||
|
|
745b40acad | ||
|
|
b73bcdf4b9 | ||
|
|
b8e5230d7d | ||
|
|
c8dd6632a7 | ||
|
|
4617a09af9 | ||
|
|
bdffc7d12b | ||
|
|
da3216156d | ||
|
|
9d22b6ab4d | ||
|
|
4299c79828 | ||
|
|
c09041f7f0 | ||
|
|
7e801642c2 | ||
|
|
3b23446c31 | ||
|
|
850fc25b6d | ||
|
|
e3fde20f74 | ||
|
|
a77aed0ded | ||
|
|
fd2003e71f | ||
|
|
65a3474a80 | ||
|
|
c5d28ba9c0 | ||
|
|
4d2f5864c1 | ||
|
|
9cdfad3512 | ||
|
|
77bcdf9434 | ||
|
|
c1187241db | ||
|
|
a116427567 | ||
|
|
1f51d4b52d | ||
|
|
85434298d9 | ||
|
|
934f53817c | ||
|
|
7ba6eac43a | ||
|
|
c1ac91d926 | ||
|
|
eda9ea15c6 | ||
|
|
3757dc27f1 | ||
|
|
5cda1f5ac1 | ||
|
|
d9d2050f29 | ||
|
|
bbf9b4b258 | ||
|
|
21a9bfb5e4 | ||
|
|
d8f3a52378 | ||
|
|
aacf1814aa | ||
|
|
4f0fee1a18 | ||
|
|
ca71131463 | ||
|
|
2dfc8d6324 | ||
|
|
549034dfce | ||
|
|
1353a47447 | ||
|
|
8e1f1dbf05 | ||
|
|
2147803d45 | ||
|
|
d79fe0f457 | ||
|
|
da020fd0be | ||
|
|
8956a35aae | ||
|
|
aa432e5e44 | ||
|
|
ebfebe795a | ||
|
|
d5d59b5dc6 | ||
|
|
c349b5d248 | ||
|
|
1ada4f8826 | ||
|
|
476b727db1 | ||
|
|
11f3e6f8e7 | ||
|
|
c441697594 | ||
|
|
67ecb6a85d | ||
|
|
a01bb509ea | ||
|
|
6b0e6ed84b | ||
|
|
60f4dcc106 | ||
|
|
c58dfa913b | ||
|
|
ceeb9b667f | ||
|
|
3c67b9ee62 | ||
|
|
a8e19b8fb6 | ||
|
|
15ea9ec748 | ||
|
|
4775a5b74d | ||
|
|
bfafd7b279 | ||
|
|
09461397a8 | ||
|
|
2d357b6c12 | ||
|
|
a72a76d3e6 | ||
|
|
394b20ee36 | ||
|
|
2170f6a46d | ||
|
|
e6ada22611 | ||
|
|
4b871306e4 | ||
|
|
e324e160da | ||
|
|
44b72eaff2 | ||
|
|
b8f38f29ae | ||
|
|
3d21b1168f | ||
|
|
b9152286ec | ||
|
|
72d220462a | ||
|
|
58030c67c8 | ||
|
|
aded122465 | ||
|
|
d834fb419c | ||
|
|
c1c6d9ee6d | ||
|
|
aec65db8c3 | ||
|
|
1c7f529141 | ||
|
|
d437b98a12 | ||
|
|
027ed0e328 | ||
|
|
b82a17aa97 | ||
|
|
31675f4c16 | ||
|
|
30fde8d7fd | ||
|
|
e3eab0c667 | ||
|
|
e0e69b35bd | ||
|
|
f605793cfc | ||
|
|
b6f268d3a5 | ||
|
|
ab44064fcc | ||
|
|
4dc0d36b98 | ||
|
|
9e0db8f4ff | ||
|
|
66bb3fe7ac | ||
|
|
5e877c7939 | ||
|
|
806f496faf | ||
|
|
418e4816d4 | ||
|
|
a6606a3330 | ||
|
|
4e8c7d95ad | ||
|
|
01899f04f5 | ||
|
|
44079aab37 | ||
|
|
a57da2f0cd | ||
|
|
316ddf1c05 | ||
|
|
855f2068f2 | ||
|
|
603c1e7ee9 | ||
|
|
abd5f50713 | ||
|
|
085dfe114a | ||
|
|
0e6028aacf | ||
|
|
bcb7bcffdb | ||
|
|
b205acc51b | ||
|
|
a3088b1eeb | ||
|
|
bbcb780cfa | ||
|
|
91953f1a3a | ||
|
|
7af8383caf | ||
|
|
c72207c2e2 | ||
|
|
8553771f89 | ||
|
|
d78f9f5e70 | ||
|
|
77335b300a | ||
|
|
6f95f8a754 | ||
|
|
05844b0a29 | ||
|
|
1e4e8ae59a | ||
|
|
6f14fde89c | ||
|
|
d8ebafaec0 | ||
|
|
7340371cc9 | ||
|
|
cc17b75a54 | ||
|
|
8f73bac95c | ||
|
|
e4177bb365 | ||
|
|
80a058c954 | ||
|
|
ff1780aeaa | ||
|
|
f1b70d08c6 | ||
|
|
0ae04fde4b | ||
|
|
c64321ebe9 | ||
|
|
34e7eb4e6b | ||
|
|
b888396ab4 | ||
|
|
508546c7c8 | ||
|
|
794c146c49 | ||
|
|
80618c83fd | ||
|
|
0d991b3792 | ||
|
|
61e8ac5b95 | ||
|
|
aac7fc613a | ||
|
|
e0d99cb1bb | ||
|
|
188eb064f4 | ||
|
|
84d09c85de | ||
|
|
913ef54c22 | ||
|
|
b853380db6 | ||
|
|
ea49e84215 | ||
|
|
23d1d4a958 | ||
|
|
f52990c8e4 | ||
|
|
d69519f0aa | ||
|
|
605f81314a | ||
|
|
5dc180393f | ||
|
|
8ba9b0e7c7 | ||
|
|
8b94bd80c9 | ||
|
|
1f1d51d8e1 | ||
|
|
11df558f8e | ||
|
|
3c46d6d1bd | ||
|
|
c712444e17 | ||
|
|
4066cb22ea | ||
|
|
78e3cd4a63 | ||
|
|
7941f88e53 | ||
|
|
8750cc2c13 | ||
|
|
f932d7a245 | ||
|
|
6d0847c39f | ||
|
|
ba9a99a4c6 | ||
|
|
b1675ab1cd | ||
|
|
327cbd086f | ||
|
|
a681878344 | ||
|
|
9b835599b8 | ||
|
|
5767ad9cd5 | ||
|
|
4c75fe47f9 | ||
|
|
3e90c3d825 | ||
|
|
50b9281865 |
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@@ -0,0 +1 @@
|
||||
*
|
||||
120
.github/workflows/build.yml
vendored
Normal file
120
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
name: continuous-integration/gh-actions/gui
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build-macos:
|
||||
runs-on: macOS-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: install dependencies
|
||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi zmq libpgm miniupnpc ldns expat libunwind-headers protobuf qt5 pkg-config
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release -j3
|
||||
- name: test qml
|
||||
run: build/release/bin/monero-wallet-gui.app/Contents/MacOS/monero-wallet-gui --test-qml
|
||||
|
||||
build-ubuntu:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: remove bundled boost
|
||||
run: sudo rm -rf /usr/local/share/boost
|
||||
- name: set apt conf
|
||||
run: |
|
||||
echo "Acquire::Retries \"3\";" | sudo tee -a /etc/apt/apt.conf.d/80-custom
|
||||
echo "Acquire::http::Timeout \"120\";" | sudo tee -a /etc/apt/apt.conf.d/80-custom
|
||||
echo "Acquire::ftp::Timeout \"120\";" | sudo tee -a /etc/apt/apt.conf.d/80-custom
|
||||
- name: update apt
|
||||
run: sudo apt update
|
||||
- name: install monero dependencies
|
||||
run: sudo apt -y install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev libprotobuf-dev protobuf-compiler
|
||||
- name: install monero gui dependencies
|
||||
run: sudo apt -y install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev libgcrypt20-dev xvfb
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release -j3
|
||||
- name: test qml
|
||||
run: xvfb-run -a build/release/bin/monero-wallet-gui --test-qml
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: eine/setup-msys2@v2
|
||||
with:
|
||||
update: true
|
||||
install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release-win64 -j2
|
||||
- name: test qml
|
||||
run: build/release/bin/monero-wallet-gui --test-qml
|
||||
|
||||
docker-linux-static:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: satackey/action-docker-layer-caching@v0.0.8
|
||||
continue-on-error: true
|
||||
with:
|
||||
key: docker-linux-static-{hash}
|
||||
restore-keys: |
|
||||
docker-linux-static-
|
||||
- name: preprare build enviroment
|
||||
run: docker build --tag monero:build-env-linux --build-arg THREADS=3 --file Dockerfile.linux .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-linux sh -c 'make release-static -j3'
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ github.job }}
|
||||
path: |
|
||||
/home/runner/work/monero-gui/monero-gui/build/release/bin/monero-wallet-gui
|
||||
/home/runner/work/monero-gui/monero-gui/build/release/bin/monerod
|
||||
|
||||
docker-windows-static:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: satackey/action-docker-layer-caching@v0.0.8
|
||||
continue-on-error: true
|
||||
with:
|
||||
key: docker-windows-static-{hash}
|
||||
restore-keys: |
|
||||
docker-windows-static-
|
||||
- name: preprare build enviroment
|
||||
run: docker build --tag monero:build-env-windows --build-arg THREADS=3 --file Dockerfile.windows .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-windows sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j3'
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ github.job }}
|
||||
path: |
|
||||
/home/runner/work/monero-gui/monero-gui/build/x86_64-w64-mingw32/release/bin/monero-wallet-gui.exe
|
||||
/home/runner/work/monero-gui/monero-gui/build/x86_64-w64-mingw32/release/bin/monerod.exe
|
||||
|
||||
docker-android:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: preprare build enviroment
|
||||
run: docker build --tag monero:build-env-android --build-arg THREADS=3 --file Dockerfile.android .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -e THREADS=3 monero:build-env-android
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ github.job }}
|
||||
path: /home/runner/work/monero-gui/monero-gui/build/Android/release/android-build/monero-gui.apk
|
||||
31
.gitignore
vendored
31
.gitignore
vendored
@@ -3,3 +3,34 @@
|
||||
translations/*.qm
|
||||
build
|
||||
version.js
|
||||
# IOS stuff below
|
||||
moc_*
|
||||
*.o
|
||||
*.mak
|
||||
*.build
|
||||
*.xcodeproj
|
||||
monero-wallet-gui_plugin_import.cpp
|
||||
monero-wallet-gui_qml_plugin_import.cpp
|
||||
*.qmlc
|
||||
*.jsc
|
||||
qml_qmlcache.qrc
|
||||
|
||||
### Vim ###
|
||||
# Swap
|
||||
[._]*.s[a-v][a-z]
|
||||
[._]*.sw[a-p]
|
||||
[._]s[a-rt-v][a-z]
|
||||
[._]ss[a-gi-z]
|
||||
[._]sw[a-p]
|
||||
|
||||
# Session
|
||||
Session.vim
|
||||
|
||||
# Temporary
|
||||
.netrwhist
|
||||
*~
|
||||
*.autosave
|
||||
# Auto-generated tag files
|
||||
tags
|
||||
# Persistent undo
|
||||
[._]*.un~
|
||||
|
||||
177
BasicPanel.qml
177
BasicPanel.qml
@@ -1,177 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtGraphicalEffects 1.0
|
||||
import "components"
|
||||
import "pages"
|
||||
|
||||
// mbg033 @ 2016-10-08: Not used anymore, to be deleted
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
width: 470
|
||||
// height: paymentId.y + paymentId.height + 12
|
||||
height: header.height + header.anchors.topMargin + transferBasic.height
|
||||
color: "#F0EEEE"
|
||||
|
||||
border.width: 1
|
||||
border.color: "#DBDBDB"
|
||||
|
||||
property alias balanceText : balanceText.text;
|
||||
property alias unlockedBalanceText : availableBalanceText.text;
|
||||
// repeating signal to the outside world
|
||||
signal paymentClicked(string address, string paymentId, string amount, int mixinCount,
|
||||
int priority, string description)
|
||||
|
||||
Connections {
|
||||
target: transferBasic
|
||||
onPaymentClicked: {
|
||||
console.log("BasicPanel: paymentClicked")
|
||||
root.paymentClicked(address, paymentId, amount, mixinCount, priority, description)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Rectangle {
|
||||
id: header
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
anchors.topMargin: 30
|
||||
height: 64
|
||||
color: "#FFFFFF"
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
source: "images/moneroLogo2.png"
|
||||
}
|
||||
|
||||
Grid {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
width: 256
|
||||
columns: 3
|
||||
|
||||
Text {
|
||||
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: qsTr("Locked Balance:")
|
||||
}
|
||||
|
||||
Text {
|
||||
id: balanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: qsTr("78.9239845")
|
||||
}
|
||||
|
||||
Item {
|
||||
height: 20
|
||||
width: 20
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
source: "images/lockIcon.png"
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: qsTr("Available Balance:")
|
||||
}
|
||||
|
||||
Text {
|
||||
id: availableBalanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: qsTr("2324.9239845")
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
Item {
|
||||
anchors.top: header.bottom
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
Transfer {
|
||||
id : transferBasic
|
||||
anchors.fill: parent
|
||||
}
|
||||
}
|
||||
|
||||
// indicate disabled state
|
||||
// Desaturate {
|
||||
// anchors.fill: parent
|
||||
// source: parent
|
||||
// desaturation: root.enabled ? 0.0 : 1.0
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
557
CMakeLists.txt
Normal file
557
CMakeLists.txt
Normal file
@@ -0,0 +1,557 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(monero-gui)
|
||||
|
||||
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
|
||||
|
||||
set(VERSION_MAJOR "17")
|
||||
set(VERSION_MINOR "1")
|
||||
set(VERSION_REVISION "4")
|
||||
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
|
||||
|
||||
option(STATIC "Link libraries statically, requires static Qt")
|
||||
|
||||
option(USE_DEVICE_TREZOR "Trezor support compilation" ON)
|
||||
option(ENABLE_PASS_STRENGTH_METER "Enable zxcvbn library for password strength" OFF)
|
||||
option(WITH_SCANNER "Enable webcam QR scanner" OFF)
|
||||
option(DEV_MODE "Checkout latest monero master on build" OFF)
|
||||
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckLinkerFlag)
|
||||
include(FindCcache)
|
||||
|
||||
if(DEBUG)
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
endif()
|
||||
|
||||
set(BUILD_GUI_DEPS ON)
|
||||
set(ARCH "x86-64" CACHE STRING "Target architecture")
|
||||
set(BUILD_64 ON CACHE BOOL "Build 64-bit binaries")
|
||||
|
||||
if(NOT MANUAL_SUBMODULES)
|
||||
find_package(Git)
|
||||
if(GIT_FOUND)
|
||||
if(NOT DEV_MODE)
|
||||
function (check_submodule relative_path)
|
||||
execute_process(COMMAND git rev-parse "HEAD" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${relative_path} OUTPUT_VARIABLE localHead)
|
||||
execute_process(COMMAND git rev-parse "HEAD:${relative_path}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE checkedHead)
|
||||
string(COMPARE EQUAL "${localHead}" "${checkedHead}" upToDate)
|
||||
if (upToDate)
|
||||
message(STATUS "Submodule '${relative_path}' is up-to-date")
|
||||
else()
|
||||
message(FATAL_ERROR "Submodule '${relative_path}' is not using the checked head. Please update all submodules with\ngit submodule update --init --force --recursive\nor run cmake with -DMANUAL_SUBMODULES=1,\n or if you want to build from latest master run cmake with -DDEV_MODE=ON,\n or run make devmode")
|
||||
endif()
|
||||
endfunction ()
|
||||
message(STATUS "Checking submodules")
|
||||
check_submodule(monero)
|
||||
else()
|
||||
execute_process(COMMAND ${GIT_EXECUTABLE} fetch WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/monero RESULT_VARIABLE GIT_FETCH_RESULT)
|
||||
execute_process(COMMAND ${GIT_EXECUTABLE} checkout -f origin/master WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/monero RESULT_VARIABLE GIT_CHECKOUT_MASTER_RESULT)
|
||||
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --force --recursive WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/monero RESULT_VARIABLE GIT_SUBMODULE_UPDATE_RESULT)
|
||||
if(NOT GIT_FETCH_RESULT EQUAL "0" OR NOT GIT_CHECKOUT_MASTER_RESULT EQUAL "0" OR NOT GIT_SUBMODULE_UPDATE_RESULT EQUAL "0")
|
||||
message(FATAL_ERROR "Updating git submodule to master (-DDEV_MODE=ON) failed")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_subdirectory(monero)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
|
||||
set_property(TARGET wallet_merged PROPERTY FOLDER "monero")
|
||||
get_directory_property(ARCH_WIDTH DIRECTORY "monero" DEFINITION ARCH_WIDTH)
|
||||
get_directory_property(UNBOUND_LIBRARY DIRECTORY "monero" DEFINITION UNBOUND_LIBRARY)
|
||||
get_directory_property(DEVICE_TREZOR_READY DIRECTORY "monero" DEFINITION DEVICE_TREZOR_READY)
|
||||
get_directory_property(TREZOR_DEP_LIBS DIRECTORY "monero" DEFINITION TREZOR_DEP_LIBS)
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_definitions(-DQT_NO_DEBUG)
|
||||
endif()
|
||||
|
||||
if(STATIC)
|
||||
message(STATUS "Initiating static build")
|
||||
set(Boost_USE_STATIC_LIBS ON)
|
||||
set(Boost_USE_STATIC_RUNTIME ON)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
add_definitions(-DMONERO_GUI_STATIC)
|
||||
endif()
|
||||
|
||||
# Include password strength library
|
||||
if(ENABLE_PASS_STRENGTH_METER)
|
||||
message(STATUS "Building with pass strength meter support.")
|
||||
else()
|
||||
add_definitions(-DDISABLE_PASS_STRENGTH_METER)
|
||||
endif()
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
# force version update
|
||||
function (monero_gui_add_library_with_deps)
|
||||
cmake_parse_arguments(MONERO_ADD_LIBRARY "" "NAME" "DEPENDS;SOURCES" ${ARGN})
|
||||
source_group("${MONERO_ADD_LIBRARY_NAME}" FILES ${MONERO_ADD_LIBRARY_SOURCES})
|
||||
|
||||
# Define a ("virtual") object library and an actual library that links those
|
||||
# objects together. The virtual libraries can be arbitrarily combined to link
|
||||
# any subset of objects into one library archive. This is used for releasing
|
||||
# libwallet, which combines multiple components.
|
||||
set(objlib obj_${MONERO_ADD_LIBRARY_NAME})
|
||||
add_library(${objlib} OBJECT ${MONERO_ADD_LIBRARY_SOURCES})
|
||||
add_library("${MONERO_ADD_LIBRARY_NAME}" $<TARGET_OBJECTS:${objlib}>)
|
||||
if (MONERO_ADD_LIBRARY_DEPENDS)
|
||||
add_dependencies(${objlib} ${MONERO_ADD_LIBRARY_DEPENDS})
|
||||
endif()
|
||||
set_property(TARGET "${MONERO_ADD_LIBRARY_NAME}" PROPERTY FOLDER "libs")
|
||||
target_compile_definitions(${objlib}
|
||||
PRIVATE $<TARGET_PROPERTY:${MONERO_ADD_LIBRARY_NAME},INTERFACE_COMPILE_DEFINITIONS>)
|
||||
endfunction ()
|
||||
|
||||
function (monero_gui_add_library name)
|
||||
monero_gui_add_library_with_deps(NAME "${name}" SOURCES ${ARGN})
|
||||
endfunction()
|
||||
|
||||
include_directories(${EASYLOGGING_INCLUDE})
|
||||
link_directories(${EASYLOGGING_LIBRARY_DIRS})
|
||||
|
||||
|
||||
include(VersionGui)
|
||||
monero_gui_add_library(gui_version SOURCES version.js DEPENDS genversiongui)
|
||||
|
||||
message(STATUS "${CMAKE_MODULE_PATH}")
|
||||
|
||||
# OpenSSL
|
||||
if(APPLE AND NOT OPENSSL_ROOT_DIR)
|
||||
execute_process(COMMAND brew --prefix openssl OUTPUT_VARIABLE OPENSSL_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
endif()
|
||||
find_package(OpenSSL REQUIRED)
|
||||
message(STATUS "OpenSSL: Version ${OPENSSL_VERSION}")
|
||||
message(STATUS "OpenSSL: include dir at ${OPENSSL_INCLUDE_DIR}")
|
||||
message(STATUS "OpenSSL: libraries at ${OPENSSL_LIBRARIES} ${OPENSSL_SSL_LIBRARIES}")
|
||||
|
||||
# Zbar (for QR scanner)
|
||||
if(WITH_SCANNER)
|
||||
add_definitions(-DWITH_SCANNER)
|
||||
find_package(ZBar0 REQUIRED)
|
||||
message(STATUS "libzbar: include dir at ${ZBAR_INCLUDE_DIR}")
|
||||
message(STATUS "libzbar: libraries at ${ZBAR_LIBRARIES}")
|
||||
endif()
|
||||
|
||||
# Sodium
|
||||
find_library(SODIUM_LIBRARY sodium)
|
||||
message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}")
|
||||
|
||||
# LibUSB
|
||||
find_package(LibUSB)
|
||||
message(STATUS "libusb: include dir at ${LibUSB_INCLUDE_DIRS}")
|
||||
message(STATUS "libusb: libraries at ${LibUSB_LIBRARIES}")
|
||||
|
||||
# HIDApi
|
||||
if(NOT ANDROID)
|
||||
find_package(HIDAPI REQUIRED)
|
||||
message(STATUS "libhidapi: include dir at ${HIDAPI_INCLUDE_DIRS}")
|
||||
message(STATUS "libhidapi: libraries at ${HIDAPI_LIBRARIES}")
|
||||
endif()
|
||||
|
||||
# Boost
|
||||
if(DEBUG)
|
||||
set(Boost_DEBUG ON)
|
||||
endif()
|
||||
if(APPLE AND NOT BOOST_ROOT)
|
||||
execute_process(COMMAND brew --prefix boost OUTPUT_VARIABLE BOOST_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
endif()
|
||||
if(MINGW)
|
||||
set(Boost_THREADAPI win32)
|
||||
endif()
|
||||
find_package(Boost 1.58 REQUIRED COMPONENTS
|
||||
system
|
||||
filesystem
|
||||
thread
|
||||
date_time
|
||||
chrono
|
||||
regex
|
||||
serialization
|
||||
program_options
|
||||
locale)
|
||||
|
||||
if(UNIX AND NOT APPLE AND NOT ANDROID)
|
||||
set(CMAKE_SKIP_RPATH ON)
|
||||
find_package(X11 REQUIRED)
|
||||
message(STATUS "X11_FOUND = ${X11_FOUND}")
|
||||
message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}")
|
||||
message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}")
|
||||
include_directories(${X11_INCLUDE_DIR})
|
||||
link_directories(${X11_LIBRARIES})
|
||||
if(STATIC)
|
||||
find_library(XCB_LIBRARY xcb)
|
||||
message(STATUS "Found xcb library: ${XCB_LIBRARY}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MINGW)
|
||||
string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}")
|
||||
message(STATUS "MSYS location: ${msys2_install_path}")
|
||||
set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include")
|
||||
# This is necessary because otherwise CMake will make Boost libraries -lfoo
|
||||
# rather than a full path. Unfortunately, this makes the shared libraries get
|
||||
# linked due to a bug in CMake which misses putting -static flags around the
|
||||
# -lfoo arguments.
|
||||
set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib)
|
||||
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
|
||||
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
|
||||
endif()
|
||||
|
||||
set(QT5_LIBRARIES
|
||||
Qt5Core
|
||||
Qt5Quick
|
||||
Qt5Gui
|
||||
Qt5Qml
|
||||
Qt5Svg
|
||||
Qt5Xml
|
||||
)
|
||||
|
||||
if(WITH_SCANNER)
|
||||
list(APPEND QT5_LIBRARIES Qt5Multimedia)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
list(APPEND QT5_LIBRARIES Qt5MacExtras)
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
if(NOT CMAKE_PREFIX_PATH AND DEFINED ENV{CMAKE_PREFIX_PATH})
|
||||
message(STATUS "Using CMAKE_PREFIX_PATH environment variable: '$ENV{CMAKE_PREFIX_PATH}'")
|
||||
set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
|
||||
endif()
|
||||
if(APPLE AND NOT CMAKE_PREFIX_PATH)
|
||||
execute_process(COMMAND brew --prefix qt5 OUTPUT_VARIABLE QT5_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
list(APPEND CMAKE_PREFIX_PATH ${QT5_DIR})
|
||||
endif()
|
||||
|
||||
if(CMAKE_PREFIX_PATH)
|
||||
include_directories(${CMAKE_PREFIX_PATH}/include)
|
||||
set(CMAKE_BUILD_RPATH "${CMAKE_PREFIX_PATH}/lib")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
||||
# TODO: drop this once we switch to Qt 5.14+
|
||||
pkg_check_modules(Qt5QmlModels_PKG_CONFIG QUIET Qt5QmlModels)
|
||||
if(Qt5QmlModels_PKG_CONFIG_FOUND)
|
||||
list(APPEND QT5_LIBRARIES Qt5QmlModels)
|
||||
endif()
|
||||
|
||||
# TODO: drop this once we switch to Qt 5.12+
|
||||
find_package(Qt5XmlPatterns QUIET)
|
||||
if(Qt5XmlPatterns_FOUND)
|
||||
list(APPEND QT5_LIBRARIES Qt5XmlPatterns)
|
||||
endif()
|
||||
|
||||
foreach(QT5_MODULE ${QT5_LIBRARIES})
|
||||
find_package(${QT5_MODULE} REQUIRED)
|
||||
include_directories(${${QT5_MODULE}_INCLUDE_DIRS})
|
||||
endforeach()
|
||||
|
||||
if(NOT (CMAKE_CROSSCOMPILING AND ANDROID))
|
||||
pkg_check_modules(QT5_PKG_CONFIG REQUIRED ${QT5_LIBRARIES})
|
||||
else()
|
||||
set(QT5_LIBRARIES_ABI)
|
||||
foreach(QT5_MODULE ${QT5_LIBRARIES})
|
||||
list(APPEND QT5_LIBRARIES_ABI "${QT5_MODULE}_${CMAKE_ANDROID_ARCH_ABI}")
|
||||
endforeach()
|
||||
pkg_check_modules(QT5_PKG_CONFIG REQUIRED ${QT5_LIBRARIES_ABI})
|
||||
endif()
|
||||
|
||||
if(QT5_PKG_CONFIG_FOUND)
|
||||
set(QT5_PKG_CONFIG "QT5_PKG_CONFIG")
|
||||
if(STATIC)
|
||||
set(QT5_PKG_CONFIG "${QT5_PKG_CONFIG}_STATIC")
|
||||
endif()
|
||||
|
||||
if(UNIX AND CMAKE_PREFIX_PATH)
|
||||
if(APPLE)
|
||||
list(JOIN ${QT5_PKG_CONFIG}_LDFLAGS_OTHER " " ${QT5_PKG_CONFIG}_LDFLAGS_OTHER)
|
||||
endif()
|
||||
# temporal workaround for https://bugreports.qt.io/browse/QTBUG-80922
|
||||
STRING(REPLACE "${QT5_PKG_CONFIG_Qt5Core_PREFIX}" "${CMAKE_PREFIX_PATH}" ${QT5_PKG_CONFIG}_LDFLAGS_OTHER "${${QT5_PKG_CONFIG}_LDFLAGS_OTHER}")
|
||||
STRING(REPLACE "${QT5_PKG_CONFIG_Qt5Core_PREFIX}" "${CMAKE_PREFIX_PATH}" ${QT5_PKG_CONFIG}_LIBRARIES "${${QT5_PKG_CONFIG}_LIBRARIES}")
|
||||
STRING(REPLACE "${QT5_PKG_CONFIG_Qt5Core_PREFIX}" "${CMAKE_PREFIX_PATH}" ${QT5_PKG_CONFIG}_INCLUDE_DIRS "${${QT5_PKG_CONFIG}_INCLUDE_DIRS}")
|
||||
STRING(REPLACE "${QT5_PKG_CONFIG_Qt5Core_PREFIX}" "${CMAKE_PREFIX_PATH}" ${QT5_PKG_CONFIG}_LIBRARY_DIRS "${${QT5_PKG_CONFIG}_LIBRARY_DIRS}")
|
||||
endif()
|
||||
|
||||
set(QT5_LIBRARIES ${${QT5_PKG_CONFIG}_LIBRARIES} ${${QT5_PKG_CONFIG}_LDFLAGS_OTHER})
|
||||
include_directories(${${QT5_PKG_CONFIG}_INCLUDE_DIRS})
|
||||
link_directories(${${QT5_PKG_CONFIG}_LIBRARY_DIRS})
|
||||
endif()
|
||||
|
||||
list(APPEND QT5_LIBRARIES
|
||||
${Qt5Gui_PLUGINS}
|
||||
${Qt5Svg_PLUGINS}
|
||||
${Qt5Qml_PLUGINS}
|
||||
${Qt5Network_PLUGINS}
|
||||
)
|
||||
|
||||
if(STATIC)
|
||||
set(QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/Qt/labs/folderlistmodel)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/Qt/labs/settings)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtGraphicalEffects)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtGraphicalEffects/private)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtMultimedia)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick.2)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Controls)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Controls.2)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Dialogs)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Dialogs/Private)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Layouts)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/PrivateWidgets)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Templates.2)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/Window.2)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtQuick/XmlListModel)
|
||||
|
||||
set(QT5_EXTRA_LIBRARIES_LIST
|
||||
qtquicktemplates2plugin
|
||||
Qt5QuickTemplates2
|
||||
qtquickcontrols2plugin
|
||||
Qt5QuickControls2
|
||||
dialogplugin
|
||||
dialogsprivateplugin
|
||||
qmlfolderlistmodelplugin
|
||||
qmlsettingsplugin
|
||||
qmlxmllistmodelplugin
|
||||
qquicklayoutsplugin
|
||||
)
|
||||
|
||||
if(WITH_SCANNER)
|
||||
list(APPEND QT5_EXTRA_LIBRARIES_LIST
|
||||
declarative_multimedia
|
||||
Qt5MultimediaQuick_p
|
||||
)
|
||||
endif()
|
||||
|
||||
list(APPEND QT5_EXTRA_LIBRARIES_LIST
|
||||
qtgraphicaleffectsplugin
|
||||
qtgraphicaleffectsprivate
|
||||
qtquick2plugin
|
||||
qtquickcontrolsplugin
|
||||
widgetsplugin
|
||||
windowplugin
|
||||
)
|
||||
|
||||
set(QT5_EXTRA_LIBRARIES)
|
||||
foreach(LIBRARY ${QT5_EXTRA_LIBRARIES_LIST})
|
||||
find_library(${LIBRARY}_LIBRARY ${LIBRARY} PATHS ${QT5_EXTRA_PATHS} REQUIRED)
|
||||
list(APPEND QT5_EXTRA_LIBRARIES ${${LIBRARY}_LIBRARY})
|
||||
endforeach()
|
||||
|
||||
if(MINGW)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
list(APPEND QT5_EXTRA_LIBRARIES D3D11 Dwrite D2d1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(QT5_LIBRARIES
|
||||
${QT5_EXTRA_LIBRARIES}
|
||||
${QT5_LIBRARIES}
|
||||
)
|
||||
|
||||
set(QT5_INTEGRATION_LIBRARIES_LIST
|
||||
Qt5EventDispatcherSupport
|
||||
Qt5PacketProtocol
|
||||
Qt5ThemeSupport
|
||||
Qt5FontDatabaseSupport
|
||||
)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
list(APPEND QT5_INTEGRATION_LIBRARIES_LIST
|
||||
Qt5XcbQpa
|
||||
xcb-static
|
||||
Qt5ServiceSupport
|
||||
Qt5GlxSupport
|
||||
)
|
||||
elseif(MINGW)
|
||||
list(APPEND QT5_INTEGRATION_LIBRARIES_LIST qtfreetype)
|
||||
endif()
|
||||
|
||||
foreach(LIBRARY ${QT5_INTEGRATION_LIBRARIES_LIST})
|
||||
find_library(${LIBRARY}_LIBRARY ${LIBRARY} PATHS ${QT5_EXTRA_PATHS} REQUIRED)
|
||||
list(APPEND QT5_LIBRARIES ${${LIBRARY}_LIBRARY})
|
||||
endforeach()
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
pkg_check_modules(X11XCB_XCBGLX_FONTCONFIG REQUIRED x11-xcb xcb-glx fontconfig)
|
||||
list(APPEND QT5_LIBRARIES ${X11XCB_XCBGLX_FONTCONFIG_STATIC_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ANDROID)
|
||||
set(QT5_EXTRA_LIBRARIES_LIST
|
||||
GLESv2
|
||||
log
|
||||
z
|
||||
jnigraphics
|
||||
android
|
||||
EGL
|
||||
Qt5VirtualKeyboard_${CMAKE_ANDROID_ARCH_ABI}
|
||||
c++_shared
|
||||
)
|
||||
foreach(LIBRARY ${QT5_EXTRA_LIBRARIES_LIST})
|
||||
find_library(${LIBRARY}_LIBRARY ${LIBRARY} PATHS "${ANDROID_TOOLCHAIN_ROOT}/sysroot/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/${ANDROID_PLATFORM_LEVEL}" REQUIRED)
|
||||
list(APPEND QT5_LIBRARIES ${${LIBRARY}_LIBRARY})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIRS}")
|
||||
message(STATUS "Using Boost libraries at ${Boost_LIBRARIES}")
|
||||
|
||||
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
|
||||
if(MINGW)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
|
||||
set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt)
|
||||
if(DEPENDS)
|
||||
set(ICU_LIBRARIES icuio icui18n icuuc icudata icutu iconv)
|
||||
else()
|
||||
set(ICU_LIBRARIES icuio icuin icuuc icudt icutu iconv)
|
||||
endif()
|
||||
elseif(APPLE)
|
||||
set(EXTRA_LIBRARIES "-framework AppKit")
|
||||
elseif(OPENBSD OR ANDROID)
|
||||
set(EXTRA_LIBRARIES "")
|
||||
elseif(FREEBSD)
|
||||
set(EXTRA_LIBRARIES execinfo)
|
||||
elseif(DRAGONFLY)
|
||||
find_library(COMPAT compat)
|
||||
set(EXTRA_LIBRARIES execinfo ${COMPAT})
|
||||
elseif(CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)")
|
||||
set(EXTRA_LIBRARIES socket nsl resolv)
|
||||
elseif(NOT MSVC AND NOT DEPENDS)
|
||||
find_library(RT rt)
|
||||
set(EXTRA_LIBRARIES ${RT})
|
||||
endif()
|
||||
|
||||
list(APPEND EXTRA_LIBRARIES ${CMAKE_DL_LIBS})
|
||||
|
||||
if(APPLE)
|
||||
include_directories(SYSTEM /usr/include/malloc)
|
||||
if(POLICY CMP0042)
|
||||
cmake_policy(SET CMP0042 NEW)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (APPLE AND NOT IOS)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11")
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -DGTEST_HAS_TR1_TUPLE=0")
|
||||
endif()
|
||||
|
||||
# warnings
|
||||
add_c_flag_if_supported(-Werror C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-Werror CXX_SECURITY_FLAGS)
|
||||
add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS)
|
||||
add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-Wformat-security CXX_SECURITY_FLAGS)
|
||||
|
||||
# -fstack-protector
|
||||
if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1)))
|
||||
add_c_flag_if_supported(-fstack-protector C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fstack-protector CXX_SECURITY_FLAGS)
|
||||
add_c_flag_if_supported(-fstack-protector-strong C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fstack-protector-strong CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
|
||||
# New in GCC 8.2
|
||||
if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1)))
|
||||
add_c_flag_if_supported(-fcf-protection=full C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fcf-protection=full CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
if (NOT WIN32 AND NOT OPENBSD)
|
||||
add_c_flag_if_supported(-fstack-clash-protection C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fstack-clash-protection CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
|
||||
# Removed in GCC 9.1 (or before ?), but still accepted, so spams the output
|
||||
if (NOT (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.1))
|
||||
add_c_flag_if_supported(-mmitigate-rop C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-mmitigate-rop CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
|
||||
# linker
|
||||
if (APPLE)
|
||||
add_linker_flag_if_supported(-Wl,-bind_at_load LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,-dead_strip LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,-dead_strip_dylibs LD_SECURITY_FLAGS)
|
||||
endif()
|
||||
if (NOT APPLE AND NOT (WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "GNU"))
|
||||
# Windows binaries die on startup with PIE when compiled with GCC
|
||||
add_linker_flag_if_supported(-pie LD_SECURITY_FLAGS)
|
||||
endif()
|
||||
add_linker_flag_if_supported(-Wl,-z,relro LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,-z,now LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,-z,noexecstack noexecstack_SUPPORTED)
|
||||
if (noexecstack_SUPPORTED)
|
||||
set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecstack")
|
||||
endif()
|
||||
add_linker_flag_if_supported(-Wl,-z,noexecheap noexecheap_SUPPORTED)
|
||||
if (noexecheap_SUPPORTED)
|
||||
set(LD_SECURITY_FLAGS "${LD_SECURITY_FLAGS} -Wl,-z,noexecheap")
|
||||
endif()
|
||||
|
||||
# some windows linker bits
|
||||
if (WIN32)
|
||||
add_linker_flag_if_supported(-Wl,--dynamicbase LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,--nxcompat LD_SECURITY_FLAGS)
|
||||
add_linker_flag_if_supported(-Wl,--high-entropy-va LD_SECURITY_FLAGS)
|
||||
endif()
|
||||
|
||||
if(STATIC)
|
||||
add_linker_flag_if_supported(-static-libgcc STATIC_FLAGS)
|
||||
add_linker_flag_if_supported(-static-libstdc++ STATIC_FLAGS)
|
||||
if(MINGW)
|
||||
add_linker_flag_if_supported(-static STATIC_FLAGS)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# With GCC 6.1.1 the compiled binary malfunctions due to aliasing. Until that
|
||||
# is fixed in the code (Issue #847), force compiler to be conservative.
|
||||
add_c_flag_if_supported(-fno-strict-aliasing C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fno-strict-aliasing CXX_SECURITY_FLAGS)
|
||||
|
||||
add_c_flag_if_supported(-fPIC C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fPIC CXX_SECURITY_FLAGS)
|
||||
|
||||
message(STATUS "Using C security hardening flags: ${C_SECURITY_FLAGS}")
|
||||
message(STATUS "Using C++ security hardening flags: ${CXX_SECURITY_FLAGS}")
|
||||
message(STATUS "Using linker security hardening flags: ${LD_SECURITY_FLAGS}")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 ${C_SECURITY_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${CXX_SECURITY_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LD_SECURITY_FLAGS} ${STATIC_FLAGS}")
|
||||
|
||||
if (HIDAPI_FOUND OR LibUSB_COMPILE_TEST_PASSED)
|
||||
if (APPLE)
|
||||
if(DEPENDS)
|
||||
list(APPEND EXTRA_LIBRARIES "-framework Foundation -framework IOKit")
|
||||
else()
|
||||
find_library(COREFOUNDATION CoreFoundation)
|
||||
find_library(IOKIT IOKit)
|
||||
list(APPEND EXTRA_LIBRARIES ${IOKIT})
|
||||
list(APPEND EXTRA_LIBRARIES ${COREFOUNDATION})
|
||||
endif()
|
||||
endif()
|
||||
if (WIN32)
|
||||
find_library(VERSION_LIBRARY version PATHS /usr/x86_64-w64-mingw32/lib)
|
||||
if(VERSION_LIBRARY STREQUAL "VERSION_LIBRARY-NOTFOUND")
|
||||
set(VERSION_LIBRARY Version)
|
||||
endif()
|
||||
list(APPEND EXTRA_LIBRARIES setupapi ${VERSION_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_subdirectory(translations)
|
||||
|
||||
add_subdirectory(src)
|
||||
42
DEPLOY.md
Normal file
42
DEPLOY.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# macOS:
|
||||
|
||||
Use macOS 10.12 - 10.13 for better backwards compability.
|
||||
|
||||
1. `HOMEBREW_OPTFLAGS="-march=core2" HOMEBREW_OPTIMIZATION_LEVEL="O0" brew install boost zmq libpgm miniupnpc libsodium expat libunwind-headers protobuf libgcrypt hidapi`
|
||||
|
||||
2. Get the latest LTS from here: https://www.qt.io/offline-installers and install
|
||||
|
||||
3. `git clone --recursive -b v0.X.Y.Z --depth 1 https://github.com/monero-project/monero-gui`
|
||||
|
||||
4. `CMAKE_PREFIX_PATH=~/Qt5.12.8/5.12.8/clang_64 make release`
|
||||
|
||||
5. `cd build/release && make deploy`
|
||||
|
||||
6. Replace the `monerod` binary inside `monero-wallet-gui.app/Contents/MacOS/` with one built using deterministic builds / gitian.
|
||||
|
||||
## Codesigning and notarizing
|
||||
|
||||
1. Save the following text as `entitlements.plist`
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
2. `codesign --deep --force --verify --verbose --options runtime --timestamp --entitlements entitlements.plist --sign 'XXXXXXXXXX' monero-wallet-gui.app`
|
||||
|
||||
You can check if this step worked by using `codesign -dvvv monero-wallet-gui.app`
|
||||
|
||||
3. `hdiutil create -fs HFS+ -srcfolder monero-gui-v0.X.Y.Z -volname monero-wallet-gui monero-gui-mac-x64-v0.X.Y.Z.dmg`
|
||||
|
||||
4. `xcrun altool -t osx --file monero-gui-mac-x64-v0.X.Y.Z.dmg --primary-bundle-id org.monero-project.monero-wallet-gui.dmg --notarize-app --username email@address.org`
|
||||
|
||||
5. `xcrun altool --notarization-info aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee -u email@address.org`
|
||||
|
||||
6. `xcrun stapler staple -v monero-gui-mac-x64-v0.X.Y.Z.dmg`
|
||||
217
Dockerfile.android
Normal file
217
Dockerfile.android
Normal file
@@ -0,0 +1,217 @@
|
||||
FROM debian:unstable
|
||||
|
||||
ARG THREADS=1
|
||||
ARG ANDROID_NDK_REVISION=21d
|
||||
ARG ANDROID_NDK_HASH=bcf4023eb8cb6976a4c7cff0a8a8f145f162bf4d
|
||||
ARG ANDROID_SDK_REVISION=4333796
|
||||
ARG ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
|
||||
ARG QT_VERSION=5.15.2
|
||||
|
||||
WORKDIR /opt/android
|
||||
ENV WORKDIR=/opt/android
|
||||
|
||||
ENV ANDROID_NATIVE_API_LEVEL=28
|
||||
ENV ANDROID_API=android-${ANDROID_NATIVE_API_LEVEL}
|
||||
ENV ANDROID_CLANG=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang
|
||||
ENV ANDROID_CLANGPP=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang++
|
||||
ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
|
||||
ENV ANDROID_SDK_ROOT=${WORKDIR}/tools
|
||||
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
ENV PATH=${JAVA_HOME}/bin:${PATH}
|
||||
ENV PREFIX=${WORKDIR}/prefix
|
||||
ENV TOOLCHAIN_DIR=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y ant automake build-essential ca-certificates-java cmake file gettext git libc6 libncurses5 \
|
||||
libstdc++6 libtinfo5 libtool libz1 openjdk-8-jdk-headless openjdk-8-jre-headless pkg-config python3 unzip wget
|
||||
|
||||
RUN wget -q https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
|
||||
&& unzip -q sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
|
||||
&& rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
|
||||
|
||||
RUN wget -q https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
|
||||
&& unzip -q android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
|
||||
&& rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
|
||||
|
||||
RUN cd ${ANDROID_SDK_ROOT} && echo y | ./bin/sdkmanager "platform-tools" "platforms;${ANDROID_API}" "tools" > /dev/null
|
||||
RUN cp -r ${WORKDIR}/platforms ${WORKDIR}/platform-tools ${ANDROID_SDK_ROOT}
|
||||
|
||||
ENV HOST_PATH=${PATH}
|
||||
ENV PATH=${TOOLCHAIN_DIR}/aarch64-linux-android/bin:${TOOLCHAIN_DIR}/bin:${PATH}
|
||||
|
||||
ARG ZLIB_VERSION=1.2.11
|
||||
ARG ZLIB_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
|
||||
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& rm zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& cd zlib-${ZLIB_VERSION} \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --static \
|
||||
&& make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 \
|
||||
&& cd qt5 \
|
||||
&& perl init-repository --module-subset=default,-qtwebengine \
|
||||
&& PATH=${HOST_PATH} ./configure -v -developer-build -release \
|
||||
-xplatform android-clang \
|
||||
-android-ndk-platform ${ANDROID_API} \
|
||||
-android-ndk ${ANDROID_NDK_ROOT} \
|
||||
-android-sdk ${ANDROID_SDK_ROOT} \
|
||||
-android-ndk-host linux-x86_64 \
|
||||
-no-dbus \
|
||||
-opengl es2 \
|
||||
-no-use-gold-linker \
|
||||
-no-sql-mysql \
|
||||
-opensource -confirm-license \
|
||||
-android-arch arm64-v8a \
|
||||
-prefix ${PREFIX} \
|
||||
-nomake tools -nomake tests -nomake examples \
|
||||
-skip qtwebengine \
|
||||
-skip qtserialport \
|
||||
-skip qtconnectivity \
|
||||
-skip qttranslations \
|
||||
-skip qtpurchasing \
|
||||
-skip qtgamepad -skip qtscript -skip qtdoc \
|
||||
-no-warnings-are-errors \
|
||||
&& sed -i '213,215d' qtbase/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} \
|
||||
&& PATH=${HOST_PATH} make -j${THREADS} install \
|
||||
&& cd qttools/src/linguist/lrelease && \
|
||||
../../../../qtbase/bin/qmake && \
|
||||
PATH=${HOST_PATH} make -j$THREADS install && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
ARG ICONV_VERSION=1.16
|
||||
ARG ICONV_HASH=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
|
||||
RUN wget -q http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& echo "${ICONV_HASH} libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
|
||||
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& rm -f libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& cd libiconv-${ICONV_VERSION} \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --build=x86_64-linux-gnu --host=aarch64 --prefix=${PREFIX} --disable-rpath \
|
||||
&& make -j${THREADS} \
|
||||
&& make -j${THREADS} install
|
||||
|
||||
ARG BOOST_VERSION=1_74_0
|
||||
ARG BOOST_VERSION_DOT=1.74.0
|
||||
ARG BOOST_HASH=83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1
|
||||
RUN wget -q https://dl.bintray.com/boostorg/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
|
||||
&& tar -xf boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& cd boost_${BOOST_VERSION} \
|
||||
&& PATH=${HOST_PATH} ./bootstrap.sh --prefix=${PREFIX} \
|
||||
&& PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} ./b2 --build-type=minimal link=static runtime-link=static \
|
||||
--with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization \
|
||||
--with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi \
|
||||
threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} \
|
||||
cflags='--target=aarch64-linux-android' \
|
||||
cxxflags='--target=aarch64-linux-android' \
|
||||
linkflags='--target=aarch64-linux-android --sysroot=${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm64 ${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so -nostdlib++' \
|
||||
install -j${THREADS} \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
ARG OPENSSL_VERSION=1.1.1g
|
||||
ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
|
||||
RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
|
||||
&& tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
|
||||
&& rm openssl-${OPENSSL_VERSION}.tar.gz \
|
||||
&& cd openssl-${OPENSSL_VERSION} \
|
||||
&& ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} ./Configure CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} \
|
||||
android-arm64 no-asm no-shared --static \
|
||||
--with-zlib-include=${PREFIX}/include --with-zlib-lib=${PREFIX}/lib \
|
||||
--prefix=${PREFIX} --openssldir=${PREFIX} \
|
||||
&& sed -i 's/CNF_EX_LIBS=-ldl -pthread//g;s/BIN_CFLAGS=-pie $(CNF_CFLAGS) $(CFLAGS)//g' Makefile \
|
||||
&& ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
ARG ZMQ_VERSION=v4.3.3
|
||||
ARG ZMQ_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3
|
||||
RUN git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} --depth 1 \
|
||||
&& cd libzmq \
|
||||
&& git checkout ${ZMQ_HASH} \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --host=aarch64-linux-android \
|
||||
--enable-static --disable-shared \
|
||||
&& make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
ARG SODIUM_VERSION=1.0.18
|
||||
ARG SODIUM_HASH=4f5e89fa84ce1d178a6765b8b46f2b6f91216677
|
||||
RUN set -ex \
|
||||
&& git clone https://github.com/jedisct1/libsodium.git -b ${SODIUM_VERSION} --depth 1 \
|
||||
&& cd libsodium \
|
||||
&& test `git rev-parse HEAD` = ${SODIUM_HASH} || exit 1 \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --host=aarch64-linux-android --enable-static --disable-shared \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN git clone https://github.com/ZBar/ZBar.git --depth 1 \
|
||||
&& cd ZBar \
|
||||
&& git reset --hard 854a5d97059e395807091ac4d80c53f7968abb8f \
|
||||
&& sed -i 's/SHARED/STATIC/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CPP_FEATURES := exceptions rtti features\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS := -Wno-multichar\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -D_ANDROID\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -DLIBDIR="\\".\\""\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -DBUILDING_LIBICONV\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -DBUILDING_LIBCHARSET\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -DIN_LIBRARY\n\0/' android/jni/Android.mk \
|
||||
&& sed -i -E 's/(.*BUILD_STATIC_LIBRARY.*)/LOCAL_CFLAGS += -fno-stack-protector\n\0/' android/jni/Android.mk \
|
||||
&& echo "APP_ABI := arm64-v8a \nAPP_STL := c++_shared \nTARGET_PLATFORM := ${ANDROID_API} \nTARGET_ARCH_ABI := arm64-v8a \nAPP_CFLAGS += -target aarch64-none-linux-android -fexceptions -fstack-protector-strong -fno-limit-debug-info -mfloat-abi=softfp -fno-builtin-memmove -fno-omit-frame-pointer -fno-stack-protector\n" \
|
||||
>> android/jni/Application.mk \
|
||||
&& cd android \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ${ANDROID_NDK_ROOT}/ndk-build ICONV_SRC=${WORKDIR}/libiconv-${ICONV_VERSION} -B V=1 NDK_APPLICATION_MK=jni/Application.mk \
|
||||
&& cp obj/local/arm64-v8a/lib* ${PREFIX}/lib \
|
||||
&& cp -r ../include/* ${PREFIX}/include
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git \
|
||||
&& cd libgpg-error \
|
||||
&& git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --disable-rpath --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
&& PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git \
|
||||
&& cd libgcrypt \
|
||||
&& git reset --hard 56606331bc2a80536db9fc11ad53695126007298 \
|
||||
&& ./autogen.sh \
|
||||
&& CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --with-gpg-error-prefix=${PREFIX} --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
&& PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \
|
||||
&& make -j${THREADS} install \
|
||||
&& rm -rf $(pwd)
|
||||
|
||||
RUN cd tools \
|
||||
&& wget -q http://dl-ssl.google.com/android/repository/tools_r25.2.5-linux.zip \
|
||||
&& unzip -q tools_r25.2.5-linux.zip \
|
||||
&& rm -f tools_r25.2.5-linux.zip \
|
||||
&& echo y | ${ANDROID_SDK_ROOT}/tools/android update sdk --no-ui --all --filter build-tools-28.0.3
|
||||
|
||||
CMD set -ex \
|
||||
&& cd /monero-gui \
|
||||
&& mkdir -p build/Android/release \
|
||||
&& cd build/Android/release \
|
||||
&& cmake \
|
||||
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \
|
||||
-DCMAKE_PREFIX_PATH="${PREFIX}" \
|
||||
-DCMAKE_FIND_ROOT_PATH="${PREFIX}" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DARCH="armv8-a" \
|
||||
-DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
|
||||
-DANDROID_ABI="arm64-v8a" \
|
||||
-DANDROID_TOOLCHAIN=clang \
|
||||
-DBoost_USE_STATIC_RUNTIME=ON \
|
||||
-DLRELEASE_PATH="${PREFIX}/bin" \
|
||||
-DQT_ANDROID_APPLICATION_BINARY="monero-wallet-gui" \
|
||||
-DWITH_SCANNER=ON \
|
||||
../../.. \
|
||||
&& PATH=${HOST_PATH} make generate_translations_header \
|
||||
&& make -j${THREADS} -C src \
|
||||
&& make -j${THREADS} apk
|
||||
208
Dockerfile.linux
Normal file
208
Dockerfile.linux
Normal file
@@ -0,0 +1,208 @@
|
||||
FROM ubuntu:16.04
|
||||
|
||||
ARG THREADS=1
|
||||
|
||||
ENV CFLAGS="-fPIC"
|
||||
ENV CXXFLAGS="-fPIC"
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
|
||||
RUN apt update
|
||||
|
||||
RUN apt install -y automake git pkg-config python xutils-dev && \
|
||||
git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||
cd xorgproto && \
|
||||
git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \
|
||||
./autogen.sh && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbproto && \
|
||||
cd xcbproto && \
|
||||
git reset --hard 6398e42131eedddde0d98759067dde933191f049 && \
|
||||
./autogen.sh && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libtool-bin && \
|
||||
git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||
cd libxau && \
|
||||
git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libpthread-stubs0-dev && \
|
||||
git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||
cd libxcb && \
|
||||
git reset --hard d34785a34f28fa6a00f8ce00d87e3132ff0f6467 && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v1.2.11 --depth 1 https://github.com/madler/zlib && \
|
||||
cd zlib && \
|
||||
git reset --hard cacf7f1d4e3d44d871b605da3b647f07d718623f && \
|
||||
./configure --static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b VER-2-10-2 --depth 1 https://git.savannah.gnu.org/git/freetype/freetype2.git && \
|
||||
cd freetype2 && \
|
||||
git reset --hard 132f19b779828b194b3fede187cee719785db4d8 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --with-zlib=no && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b R_2_2_9 --depth 1 https://github.com/libexpat/libexpat && \
|
||||
cd libexpat/expat && \
|
||||
git reset --hard a7bc26b69768f7fb24f0c7976fae24b157b85b13 && \
|
||||
./buildconf.sh && \
|
||||
./configure --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y autopoint gettext gperf libpng12-dev && \
|
||||
git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||
cd fontconfig && \
|
||||
git reset --hard b1df1101a643ae16cdfa1d83b939de2497b1bf27 && \
|
||||
./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \
|
||||
cd icu/icu4c/source && \
|
||||
git reset --hard e2d85306162d3a0691b070b4f0a73e4012433444 && \
|
||||
./configure --disable-shared --enable-static --disable-tests --disable-samples && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y wget && \
|
||||
wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz && \
|
||||
echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" | sha256sum -c && \
|
||||
tar -xzf boost_1_73_0.tar.gz && \
|
||||
rm boost_1_73_0.tar.gz && \
|
||||
cd boost_1_73_0 && \
|
||||
./bootstrap.sh && \
|
||||
./b2 --with-atomic --with-system --with-filesystem --with-thread --with-date_time --with-chrono --with-regex --with-serialization --with-program_options --with-locale variant=release link=static runtime-link=static cflags="${CFLAGS}" cxxflags="${CXXFLAGS}" install -a --prefix=/usr && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \
|
||||
echo "ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 openssl-1.1.1g.tar.gz" | sha256sum -c && \
|
||||
tar -xzf openssl-1.1.1g.tar.gz && \
|
||||
rm openssl-1.1.1g.tar.gz && \
|
||||
cd openssl-1.1.1g && \
|
||||
./config no-asm no-shared no-zlib-dynamic --openssldir=/usr && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libgl1-mesa-dev libglib2.0-dev libxkbcommon-dev && \
|
||||
wget https://download.qt.io/archive/qt/5.9/5.9.9/single/qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
echo "5ce285209290a157d7f42ec8eb22bf3f1d76f2e03a95fc0b99b553391be01642 qt-everywhere-opensource-src-5.9.9.tar.xz" | sha256sum -c && \
|
||||
tar -xf qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
rm qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
cd qt-everywhere-opensource-src-5.9.9 && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lexpat/ /usr/local/lib/pkgconfig/fontconfig.pc && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lz/ /usr/local/lib/pkgconfig/freetype2.pc && \
|
||||
sed -ri s/\(Libs:.*\)/\\1\ -lXau/ /usr/local/lib/pkgconfig/xcb.pc && \
|
||||
./configure --prefix=/usr -platform linux-g++-64 -opensource -confirm-license -release -static -no-avx \
|
||||
-opengl desktop -qpa xcb -system-freetype -fontconfig -glib \
|
||||
-no-dbus -no-openssl -no-sql-sqlite -no-use-gold-linker \
|
||||
-qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \
|
||||
-skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d \
|
||||
-skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing \
|
||||
-skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools \
|
||||
-skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview \
|
||||
-skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine \
|
||||
-nomake examples -nomake tests -nomake tools && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd qttools/src/linguist/lrelease && \
|
||||
../../../../qtbase/bin/qmake && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libudev-dev && \
|
||||
git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
cd libusb && \
|
||||
git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b hidapi-0.9.0 --depth 1 https://github.com/libusb/hidapi && \
|
||||
cd hidapi && \
|
||||
git reset --hard 7da5cc91fc0d2dbe4df4f08cd31f6ca1a262418f && \
|
||||
./bootstrap && \
|
||||
./configure --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libX11-1.6.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libx11 && \
|
||||
cd libx11 && \
|
||||
git reset --hard db7cca17ad7807e92a928da9d4c68a00f4836da2 && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libXext-1.3.4 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxext && \
|
||||
cd libxext && \
|
||||
git reset --hard ebb167f34a3514783966775fb12573c4ed209625 && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libsodium-dev && \
|
||||
git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
cd libzmq && \
|
||||
git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-libunwind --with-libsodium && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
cd libgpg-error && \
|
||||
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc --disable-tests && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
cd libgcrypt && \
|
||||
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b v3.10.0 --depth 1 https://github.com/protocolbuffers/protobuf && \
|
||||
cd protobuf && \
|
||||
git reset --hard 6d4e7fd7966c989e38024a8ea693db83758944f1 && \
|
||||
./autogen.sh && \
|
||||
./configure --enable-static --disable-shared && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y cmake libusb-1.0-0-dev
|
||||
71
Dockerfile.windows
Normal file
71
Dockerfile.windows
Normal file
@@ -0,0 +1,71 @@
|
||||
FROM ubuntu:20.04
|
||||
|
||||
ARG THREADS=1
|
||||
|
||||
RUN apt update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt install -y build-essential cmake g++-mingw-w64 gettext git libtool pkg-config \
|
||||
python && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN update-alternatives --set x86_64-w64-mingw32-g++ $(which x86_64-w64-mingw32-g++-posix) && \
|
||||
update-alternatives --set x86_64-w64-mingw32-gcc $(which x86_64-w64-mingw32-gcc-posix)
|
||||
|
||||
RUN git clone -b v0.17.0.0 --depth 1 https://github.com/monero-project/monero && \
|
||||
cd monero && \
|
||||
git reset --hard d27d4526fe89b7cdeb4b296280c4a6cf7efe21f8 && \
|
||||
cp -a contrib/depends / && \
|
||||
cd .. && \
|
||||
rm -rf monero
|
||||
|
||||
RUN make -j$THREADS -C /depends HOST=x86_64-w64-mingw32 NO_QT=1
|
||||
|
||||
RUN curl -LO https://download.qt.io/archive/qt/5.9/5.9.9/single/qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
echo "5ce285209290a157d7f42ec8eb22bf3f1d76f2e03a95fc0b99b553391be01642 qt-everywhere-opensource-src-5.9.9.tar.xz" > hashsum.txt && \
|
||||
sha256sum -c hashsum.txt && \
|
||||
tar -xf qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
rm qt-everywhere-opensource-src-5.9.9.tar.xz && \
|
||||
cd qt-everywhere-opensource-src-5.9.9 && \
|
||||
./configure --prefix=/depends/x86_64-w64-mingw32 -xplatform win32-g++ \
|
||||
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
|
||||
-I $(pwd)/qtbase/src/3rdparty/angle/include \
|
||||
-opensource -confirm-license -release -static -static-runtime -opengl dynamic -no-angle \
|
||||
-no-avx -no-openssl -no-sql-sqlite \
|
||||
-qt-freetype -qt-harfbuzz -qt-libjpeg -qt-libpng -qt-pcre -qt-zlib \
|
||||
-skip gamepad -skip location -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts \
|
||||
-skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras \
|
||||
-skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtscript -skip qtscxml -skip qtsensors \
|
||||
-skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools -skip qtvirtualkeyboard -skip qtwayland \
|
||||
-skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras \
|
||||
-skip serialbus -skip webengine \
|
||||
-nomake examples -nomake tests -nomake tools && \
|
||||
make QMAKE="$(pwd)/qtbase/bin/qmake CONFIG-='debug debug_and_release'" -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd qttools/src/linguist/lrelease && \
|
||||
../../../../qtbase/bin/qmake && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git && \
|
||||
cd libgpg-error && \
|
||||
git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc --disable-tests \
|
||||
--host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd .. && \
|
||||
rm -rf libgpg-error
|
||||
|
||||
RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git && \
|
||||
cd libgcrypt && \
|
||||
git reset --hard 56606331bc2a80536db9fc11ad53695126007298 && \
|
||||
./autogen.sh && \
|
||||
./configure --disable-shared --enable-static --disable-doc \
|
||||
--host=x86_64-w64-mingw32 --prefix=/depends/x86_64-w64-mingw32 \
|
||||
--with-gpg-error-prefix=/depends/x86_64-w64-mingw32 && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
cd .. && \
|
||||
rm -rf libgcrypt
|
||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, The Monero Project
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
||||
634
LeftPanel.qml
634
LeftPanel.qml
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,259 +26,369 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
import "components"
|
||||
import moneroComponents.NetworkType 1.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "components" as MoneroComponents
|
||||
import "components/effects/" as MoneroEffects
|
||||
|
||||
Rectangle {
|
||||
id: panel
|
||||
|
||||
property alias unlockedBalanceText: unlockedBalanceText.text
|
||||
property alias balanceLabelText: balanceLabel.text
|
||||
property alias balanceText: balanceText.text
|
||||
property int currentAccountIndex
|
||||
property alias currentAccountLabel: accountLabel.text
|
||||
property string balanceString: "?.??"
|
||||
property string balanceUnlockedString: "?.??"
|
||||
property string balanceFiatString: "?.??"
|
||||
property string minutesToUnlock: ""
|
||||
property bool isSyncing: false
|
||||
property alias networkStatus : networkStatus
|
||||
property alias progressBar : progressBar
|
||||
property alias minutesToUnlockTxt: unlockedBalanceLabel.text
|
||||
property alias daemonProgressBar : daemonProgressBar
|
||||
|
||||
property int titleBarHeight: 50
|
||||
property string copyValue: ""
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
signal dashboardClicked()
|
||||
signal historyClicked()
|
||||
signal transferClicked()
|
||||
signal receiveClicked()
|
||||
signal txkeyClicked()
|
||||
signal sharedringdbClicked()
|
||||
signal settingsClicked()
|
||||
signal addressBookClicked()
|
||||
signal miningClicked()
|
||||
signal signClicked()
|
||||
signal accountClicked()
|
||||
|
||||
function selectItem(pos) {
|
||||
menuColumn.previousButton.checked = false
|
||||
if(pos === "Dashboard") menuColumn.previousButton = dashboardButton
|
||||
else if(pos === "History") menuColumn.previousButton = historyButton
|
||||
if(pos === "History") menuColumn.previousButton = historyButton
|
||||
else if(pos === "Transfer") menuColumn.previousButton = transferButton
|
||||
else if(pos === "Receive") menuColumn.previousButton = receiveButton
|
||||
else if(pos === "AddressBook") menuColumn.previousButton = addressBookButton
|
||||
else if(pos === "Mining") menuColumn.previousButton = miningButton
|
||||
else if(pos === "TxKey") menuColumn.previousButton = txkeyButton
|
||||
else if(pos === "SharedRingDB") menuColumn.previousButton = sharedringdbButton
|
||||
else if(pos === "Sign") menuColumn.previousButton = signButton
|
||||
else if(pos === "Settings") menuColumn.previousButton = settingsButton
|
||||
else if(pos === "Advanced") menuColumn.previousButton = advancedButton
|
||||
|
||||
else if(pos === "Account") menuColumn.previousButton = accountButton
|
||||
menuColumn.previousButton.checked = true
|
||||
}
|
||||
|
||||
width: (isMobile)? appWindow.width : 260
|
||||
color: "#FFFFFF"
|
||||
width: 300
|
||||
color: "transparent"
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: parent.top
|
||||
|
||||
// Item with monero logo
|
||||
Item {
|
||||
visible: !isMobile
|
||||
id: logoItem
|
||||
MoneroEffects.GradientBackground {
|
||||
anchors.fill: parent
|
||||
fallBackColor: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
initialStartColor: MoneroComponents.Style.leftPanelBackgroundGradientStart
|
||||
initialStopColor: MoneroComponents.Style.leftPanelBackgroundGradientStop
|
||||
blackColorStart: MoneroComponents.Style._b_leftPanelBackgroundGradientStart
|
||||
blackColorStop: MoneroComponents.Style._b_leftPanelBackgroundGradientStop
|
||||
whiteColorStart: MoneroComponents.Style._w_leftPanelBackgroundGradientStart
|
||||
whiteColorStop: MoneroComponents.Style._w_leftPanelBackgroundGradientStop
|
||||
posStart: 0.6
|
||||
start: Qt.point(0, 0)
|
||||
end: Qt.point(height, width)
|
||||
}
|
||||
|
||||
// card with monero logo
|
||||
Column {
|
||||
visible: true
|
||||
z: 2
|
||||
id: column1
|
||||
height: 175
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: (persistentSettings.customDecorations)? 66 : 36
|
||||
height: logo.implicitHeight
|
||||
anchors.topMargin: (persistentSettings.customDecorations)? 50 : 0
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
source: "images/moneroLogo.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: testnetLabel
|
||||
visible: persistentSettings.testnet
|
||||
text: qsTr("Testnet") + translationManager.emptyString
|
||||
anchors.top: logo.bottom
|
||||
anchors.topMargin: 5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
font.bold: true
|
||||
color: "red"
|
||||
}
|
||||
|
||||
/* Disable twitter/news panel
|
||||
Image {
|
||||
anchors.left: parent.left
|
||||
anchors.verticalCenter: logo.verticalCenter
|
||||
anchors.leftMargin: 19
|
||||
source: appWindow.rightPanelExpanded ? "images/expandRightPanel.png" :
|
||||
"images/collapseRightPanel.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: appWindow.rightPanelExpanded = !appWindow.rightPanelExpanded
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
Column {
|
||||
visible: !isMobile
|
||||
id: column1
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: logoItem.bottom
|
||||
anchors.topMargin: 26
|
||||
spacing: 5
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: balanceLabel
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
}
|
||||
|
||||
Row {
|
||||
visible: !isMobile
|
||||
Item {
|
||||
Item {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
height: 26
|
||||
width: 50
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 20
|
||||
anchors.leftMargin: 20
|
||||
height: 490
|
||||
width: 260
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "images/lockIcon.png"
|
||||
id: card
|
||||
visible: !isOpenGL || MoneroComponents.Style.blackTheme
|
||||
width: 260
|
||||
height: 135
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: MoneroComponents.Style.blackTheme ? "qrc:///images/card-background-black.png" : "qrc:///images/card-background-white.png"
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
visible: isOpenGL && !MoneroComponents.Style.blackTheme
|
||||
anchors.fill: card
|
||||
horizontalOffset: 3
|
||||
verticalOffset: 3
|
||||
radius: 10.0
|
||||
samples: 15
|
||||
color: "#3B000000"
|
||||
source: card
|
||||
cached: true
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: testnetLabel
|
||||
visible: persistentSettings.nettype != NetworkType.MAINNET
|
||||
text: (persistentSettings.nettype == NetworkType.TESTNET ? qsTr("Testnet") : qsTr("Stagenet")) + translationManager.emptyString
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 8
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 192
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#f33434"
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: viewOnlyLabel
|
||||
visible: viewOnly
|
||||
text: qsTr("View Only") + translationManager.emptyString
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 8
|
||||
anchors.right: testnetLabel.visible ? testnetLabel.left : parent.right
|
||||
anchors.rightMargin: 8
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
color: "#ff9323"
|
||||
themeTransition: false
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
visible: !isMobile
|
||||
id: balanceText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
color: "#000000"
|
||||
text: "N/A"
|
||||
// dynamically adjust text size
|
||||
font.pixelSize: {
|
||||
var digits = text.split('.')[0].length
|
||||
var defaultSize = 25;
|
||||
if(digits > 2) {
|
||||
return defaultSize - 1.1*digits
|
||||
Item {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 20
|
||||
anchors.leftMargin: 20
|
||||
height: 490
|
||||
width: 50
|
||||
|
||||
MoneroComponents.Label {
|
||||
fontSize: 12
|
||||
id: accountIndex
|
||||
text: qsTr("Account") + translationManager.emptyString + " #" + currentAccountIndex
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "black"
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 60
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 23
|
||||
themeTransition: false
|
||||
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: appWindow.showPageRequest("Account")
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
fontSize: 16
|
||||
id: accountLabel
|
||||
textWidth: 170
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "black"
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 60
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 36
|
||||
themeTransition: false
|
||||
elide: Text.ElideRight
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: appWindow.showPageRequest("Account")
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
fontSize: 16
|
||||
visible: isSyncing
|
||||
text: qsTr("Syncing...") + translationManager.emptyString
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "black"
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.bottom: currencyLabel.top
|
||||
anchors.bottomMargin: 15
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: currencyLabel
|
||||
font.pixelSize: 16
|
||||
text: {
|
||||
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
|
||||
return appWindow.fiatApiCurrencySymbol();
|
||||
} else {
|
||||
return "XMR"
|
||||
}
|
||||
}
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "black"
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 100
|
||||
themeTransition: false
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
visible: persistentSettings.fiatPriceEnabled
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: persistentSettings.fiatPriceToggle = !persistentSettings.fiatPriceToggle
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: balancePart1
|
||||
themeTransition: false
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 58
|
||||
anchors.baseline: currencyLabel.baseline
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "black"
|
||||
Binding on color {
|
||||
when: balancePart1MouseArea.containsMouse || balancePart2MouseArea.containsMouse
|
||||
value: MoneroComponents.Style.orange
|
||||
}
|
||||
text: {
|
||||
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
|
||||
return balanceFiatString.split('.')[0] + "."
|
||||
} else {
|
||||
return balanceString.split('.')[0] + "."
|
||||
}
|
||||
}
|
||||
font.pixelSize: {
|
||||
var defaultSize = 29;
|
||||
var digits = (balancePart1.text.length - 1)
|
||||
if (digits > 2 && !(persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle)) {
|
||||
return defaultSize - 1.1 * digits
|
||||
} else {
|
||||
return defaultSize
|
||||
}
|
||||
}
|
||||
MouseArea {
|
||||
id: balancePart1MouseArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(balancePart1.text + balancePart2.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
}
|
||||
MoneroComponents.TextPlain {
|
||||
id: balancePart2
|
||||
themeTransition: false
|
||||
anchors.left: balancePart1.right
|
||||
anchors.leftMargin: 2
|
||||
anchors.baseline: currencyLabel.baseline
|
||||
color: balancePart1.color
|
||||
text: {
|
||||
if (persistentSettings.fiatPriceEnabled && persistentSettings.fiatPriceToggle) {
|
||||
return balanceFiatString.split('.')[1]
|
||||
} else {
|
||||
return balanceString.split('.')[1]
|
||||
}
|
||||
}
|
||||
font.pixelSize: 16
|
||||
MouseArea {
|
||||
id: balancePart2MouseArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: balancePart1MouseArea.clicked(mouse)
|
||||
}
|
||||
}
|
||||
|
||||
Item { //separator
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item { //separator
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
}
|
||||
|
||||
Label {
|
||||
id: unlockedBalanceLabel
|
||||
text: qsTr("Unlocked balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
}
|
||||
|
||||
Text {
|
||||
id: unlockedBalanceText
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
font.family: "Arial"
|
||||
color: "#000000"
|
||||
text: "N/A"
|
||||
// dynamically adjust text size
|
||||
font.pixelSize: {
|
||||
var digits = text.split('.')[0].length
|
||||
var defaultSize = 18;
|
||||
if(digits > 3) {
|
||||
return defaultSize - 0.6*digits
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: menuRect.top
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
|
||||
|
||||
Rectangle {
|
||||
id: menuRect
|
||||
z: 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: (isMobile)? parent.top : column1.bottom
|
||||
anchors.topMargin: (isMobile)? 0 : 25
|
||||
color: "#1C1C1C"
|
||||
|
||||
anchors.top: column1.bottom
|
||||
color: "transparent"
|
||||
|
||||
Flickable {
|
||||
contentHeight: 500
|
||||
anchors.fill: parent
|
||||
id:flicker
|
||||
contentHeight: menuColumn.height
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: progressBar.visible ? progressBar.top : networkStatus.top
|
||||
width: parent.width
|
||||
boundsBehavior: isMac ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
|
||||
clip: true
|
||||
|
||||
|
||||
Column {
|
||||
|
||||
id: menuColumn
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
|
||||
clip: true
|
||||
property var previousButton: transferButton
|
||||
|
||||
// ------------- Dashboard tab ---------------
|
||||
|
||||
/*
|
||||
MenuButton {
|
||||
id: dashboardButton
|
||||
// top border
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Dashboard") + translationManager.emptyString
|
||||
symbol: qsTr("D") + translationManager.emptyString
|
||||
dotColor: "#FFE00A"
|
||||
checked: true
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Account tab ---------------
|
||||
MoneroComponents.MenuButton {
|
||||
id: accountButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Account") + translationManager.emptyString
|
||||
symbol: qsTr("T") + translationManager.emptyString
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = dashboardButton
|
||||
panel.dashboardClicked()
|
||||
parent.previousButton = accountButton
|
||||
panel.accountClicked()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Rectangle {
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: accountButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// ------------- Transfer tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: transferButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Send") + translationManager.emptyString
|
||||
symbol: qsTr("S") + translationManager.emptyString
|
||||
dotColor: "#FF6C3C"
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = transferButton
|
||||
@@ -286,24 +396,21 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: transferButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- AddressBook tab ---------------
|
||||
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: addressBookButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Address book") + translationManager.emptyString
|
||||
symbol: qsTr("B") + translationManager.emptyString
|
||||
dotColor: "#FF4F41"
|
||||
under: transferButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
@@ -312,92 +419,85 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: addressBookButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Receive tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: receiveButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Receive") + translationManager.emptyString
|
||||
symbol: qsTr("R") + translationManager.emptyString
|
||||
dotColor: "#AAFFBB"
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = receiveButton
|
||||
panel.receiveClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: receiveButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- History tab ---------------
|
||||
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: historyButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("History") + translationManager.emptyString
|
||||
text: qsTr("Transactions") + translationManager.emptyString
|
||||
symbol: qsTr("H") + translationManager.emptyString
|
||||
dotColor: "#6B0072"
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = historyButton
|
||||
panel.historyClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: historyButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Advanced tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: advancedButton
|
||||
visible: appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Advanced") + translationManager.emptyString
|
||||
symbol: qsTr("D") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = advancedButton
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: advancedButton.present
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: advancedButton.present && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Mining tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: miningButton
|
||||
visible: !isAndroid && !isIOS && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Mining") + translationManager.emptyString
|
||||
symbol: qsTr("M") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
under: advancedButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
@@ -406,22 +506,21 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
visible: miningButton.present
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: miningButton.present && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- TxKey tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: txkeyButton
|
||||
visible: appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Check payment") + translationManager.emptyString
|
||||
text: qsTr("Prove/check") + translationManager.emptyString
|
||||
symbol: qsTr("K") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
under: advancedButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
@@ -429,23 +528,45 @@ Rectangle {
|
||||
panel.txkeyClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: txkeyButton.present
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: txkeyButton.present && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Shared RingDB tab ---------------
|
||||
MoneroComponents.MenuButton {
|
||||
id: sharedringdbButton
|
||||
visible: appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Shared RingDB") + translationManager.emptyString
|
||||
symbol: qsTr("G") + translationManager.emptyString
|
||||
under: advancedButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = sharedringdbButton
|
||||
panel.sharedringdbClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: sharedringdbButton.present && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Sign/verify tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: signButton
|
||||
visible: appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Sign/verify") + translationManager.emptyString
|
||||
symbol: qsTr("I") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
under: advancedButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
@@ -453,22 +574,21 @@ Rectangle {
|
||||
panel.signClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: signButton.present
|
||||
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: signButton.present && appWindow.walletMode >= 2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
height: 1
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
// ------------- Settings tab ---------------
|
||||
MenuButton {
|
||||
MoneroComponents.MenuButton {
|
||||
id: settingsButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Settings") + translationManager.emptyString
|
||||
symbol: qsTr("E") + translationManager.emptyString
|
||||
dotColor: "#36B25C"
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = settingsButton
|
||||
@@ -476,34 +596,58 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
MoneroComponents.MenuButtonDivider {
|
||||
visible: settingsButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 20
|
||||
}
|
||||
|
||||
}
|
||||
} // Column
|
||||
|
||||
NetworkStatusItem {
|
||||
id: networkStatus
|
||||
} // Flickable
|
||||
|
||||
Rectangle {
|
||||
id: separator
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: (progressBar.visible)? progressBar.top : parent.bottom;
|
||||
connected: Wallet.ConnectionStatus_Disconnected
|
||||
anchors.leftMargin: 0
|
||||
anchors.rightMargin: 0
|
||||
anchors.bottom: progressBar.visible ? progressBar.top : networkStatus.top
|
||||
height: 10
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
ProgressBar {
|
||||
MoneroComponents.ProgressBar {
|
||||
id: progressBar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: daemonProgressBar.top
|
||||
height: 48
|
||||
syncType: qsTr("Wallet") + translationManager.emptyString
|
||||
visible: !appWindow.disconnected
|
||||
}
|
||||
|
||||
MoneroComponents.ProgressBar {
|
||||
id: daemonProgressBar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: networkStatus.top
|
||||
syncType: qsTr("Daemon") + translationManager.emptyString
|
||||
visible: !appWindow.disconnected
|
||||
height: 62
|
||||
}
|
||||
|
||||
MoneroComponents.NetworkStatusItem {
|
||||
id: networkStatus
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 5
|
||||
anchors.rightMargin: 0
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 5
|
||||
connected: Wallet.ConnectionStatus_Disconnected
|
||||
height: 48
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// indicate disabled state
|
||||
// Desaturate {
|
||||
// anchors.fill: parent
|
||||
// source: parent
|
||||
// desaturation: panel.enabled ? 0.0 : 1.0
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
14
MainApp.cpp
14
MainApp.cpp
@@ -1,14 +0,0 @@
|
||||
#include "MainApp.h"
|
||||
#include <QCloseEvent>
|
||||
|
||||
bool MainApp::event (QEvent *event)
|
||||
{
|
||||
// Catch application exit event and signal to qml app to handle exit
|
||||
if(event->type() == QEvent::Close) {
|
||||
event->ignore();
|
||||
emit closing();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
18
MainApp.h
18
MainApp.h
@@ -1,18 +0,0 @@
|
||||
#ifndef MAINAPP_H
|
||||
#define MAINAPP_H
|
||||
#include <QApplication>
|
||||
|
||||
class MainApp : public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainApp(int &argc, char** argv) : QApplication(argc, argv) {};
|
||||
private:
|
||||
bool event(QEvent *e);
|
||||
signals:
|
||||
void closing();
|
||||
};
|
||||
|
||||
#endif // MAINAPP_H
|
||||
|
||||
|
||||
58
Makefile
Normal file
58
Makefile
Normal file
@@ -0,0 +1,58 @@
|
||||
ANDROID_STANDALONE_TOOLCHAIN_PATH ?= /usr/local/toolchain
|
||||
MANUAL_SUBMODULES ?= OFF
|
||||
|
||||
dotgit=$(shell ls -d .git/config)
|
||||
ifneq ($(dotgit), .git/config)
|
||||
USE_SINGLE_BUILDDIR=1
|
||||
endif
|
||||
|
||||
subbuilddir:=$(shell echo `uname | sed -e 's|[:/\\ \(\)]|_|g'`/`git branch | grep '\* ' | cut -f2- -d' '| sed -e 's|[:/\\ \(\)]|_|g'`)
|
||||
ifeq ($(USE_SINGLE_BUILDDIR), OFF)
|
||||
builddir := build/"$(subbuilddir)"
|
||||
topdir := ../../../..
|
||||
deldirs := $(builddir)
|
||||
else
|
||||
builddir := build
|
||||
topdir := ../..
|
||||
deldirs := $(builddir)/debug $(builddir)/release $(builddir)/fuzz
|
||||
endif
|
||||
|
||||
default:
|
||||
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
|
||||
debug:
|
||||
mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} .. && $(MAKE) VERBOSE=1
|
||||
|
||||
depends:
|
||||
mkdir -p build/$(target)/release
|
||||
cd build/$(target)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_TAG=$(tag) -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=$(root)/$(target)/share/toolchain.cmake ../../.. && $(MAKE)
|
||||
|
||||
devmode:
|
||||
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
|
||||
clean:
|
||||
mkdir -p build && cd build && rm -rf *
|
||||
scanner:
|
||||
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D WITH_SCANNER=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
|
||||
|
||||
release:
|
||||
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
|
||||
|
||||
release-linux-armv8:
|
||||
mkdir -p $(builddir)/release
|
||||
cd $(builddir)/release
|
||||
cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE)
|
||||
|
||||
release-static:
|
||||
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
|
||||
|
||||
debug-static-win64:
|
||||
mkdir -p $(builddir)/debug && cd $(builddir)/debug && cmake -D STATIC=ON -G "MSYS Makefiles" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Debug -D BUILD_TAG="win-x64" -D CMAKE_TOOLCHAIN_FILE=$(topdir)/cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=$(shell cd ${MINGW_PREFIX}/.. && pwd -W) -D MINGW=ON $(topdir) && $(MAKE)
|
||||
|
||||
debug-static-mac64:
|
||||
mkdir -p $(builddir)/debug
|
||||
cd $(builddir)/debug && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=release -D BUILD_TAG="mac-x64" $(topdir) && $(MAKE)
|
||||
|
||||
release-static-win64:
|
||||
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=ON -G "MSYS Makefiles" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="win-x64" -D CMAKE_TOOLCHAIN_FILE=$(topdir)/cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=$(shell cd ${MINGW_PREFIX}/.. && pwd -W) -D MINGW=ON $(topdir) && $(MAKE)
|
||||
|
||||
release-win64:
|
||||
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=OFF -G "MSYS Makefiles" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="win-x64" -D CMAKE_TOOLCHAIN_FILE=$(topdir)/cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=$(shell cd ${MINGW_PREFIX}/.. && pwd -W) -D MINGW=ON $(topdir) && $(MAKE)
|
||||
230
MiddlePanel.qml
230
MiddlePanel.qml
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -28,44 +28,70 @@
|
||||
|
||||
|
||||
import QtQml 2.0
|
||||
import QtQuick 2.2
|
||||
//import QtQuick.Controls 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
import "./pages"
|
||||
import "./pages/settings"
|
||||
import "./pages/merchant"
|
||||
import "./components" as MoneroComponents
|
||||
import "./components/effects/" as MoneroEffects
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
|
||||
property Item currentView
|
||||
property Item previousView
|
||||
property bool basicMode : isMobile
|
||||
property string balanceLabelText: qsTr("Balance") + translationManager.emptyString
|
||||
property string balanceText
|
||||
property string unlockedBalanceLabelText: qsTr("Unlocked Balance") + translationManager.emptyString
|
||||
property string unlockedBalanceText
|
||||
property int minHeight: (appWindow.height > 800) ? appWindow.height : 800
|
||||
// property int headerHeight: header.height
|
||||
property alias contentHeight: mainFlickable.contentHeight
|
||||
property alias flickable: mainFlickable
|
||||
|
||||
property Transfer transferView: Transfer { }
|
||||
property Transfer transferView: Transfer {
|
||||
onPaymentClicked: root.paymentClicked(address, paymentId, amount, mixinCount, priority, description)
|
||||
onSweepUnmixableClicked: root.sweepUnmixableClicked()
|
||||
}
|
||||
property Receive receiveView: Receive { }
|
||||
property Merchant merchantView: Merchant { }
|
||||
property TxKey txkeyView: TxKey { }
|
||||
property SharedRingDB sharedringdbView: SharedRingDB { }
|
||||
property History historyView: History { }
|
||||
property Sign signView: Sign { }
|
||||
property Settings settingsView: Settings { }
|
||||
property Mining miningView: Mining { }
|
||||
property AddressBook addressBookView: AddressBook { }
|
||||
|
||||
property Keys keysView: Keys { }
|
||||
property Account accountView: Account { }
|
||||
|
||||
signal paymentClicked(string address, string paymentId, string amount, int mixinCount, int priority, string description)
|
||||
signal sweepUnmixableClicked()
|
||||
signal generatePaymentIdInvoked()
|
||||
signal checkPaymentClicked(string address, string txid, string txkey);
|
||||
signal getProofClicked(string txid, string address, string message);
|
||||
signal checkProofClicked(string txid, string address, string message, string signature);
|
||||
|
||||
color: "#F0EEEE"
|
||||
Rectangle {
|
||||
// grey background on merchantView
|
||||
visible: currentView === merchantView
|
||||
color: MoneroComponents.Style.moneroGrey
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
MoneroEffects.GradientBackground {
|
||||
visible: currentView !== merchantView
|
||||
anchors.fill: parent
|
||||
fallBackColor: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
initialStartColor: MoneroComponents.Style.middlePanelBackgroundGradientStart
|
||||
initialStopColor: MoneroComponents.Style.middlePanelBackgroundGradientStop
|
||||
blackColorStart: MoneroComponents.Style._b_middlePanelBackgroundGradientStart
|
||||
blackColorStop: MoneroComponents.Style._b_middlePanelBackgroundGradientStop
|
||||
whiteColorStart: MoneroComponents.Style._w_middlePanelBackgroundGradientStart
|
||||
whiteColorStop: MoneroComponents.Style._w_middlePanelBackgroundGradientStop
|
||||
start: Qt.point(0, 0)
|
||||
end: Qt.point(height, width)
|
||||
}
|
||||
|
||||
onCurrentViewChanged: {
|
||||
if (previousView) {
|
||||
@@ -93,93 +119,69 @@ Rectangle {
|
||||
transferView.sendTo(address, paymentId, description);
|
||||
}
|
||||
|
||||
|
||||
// XXX: just for memo, to be removed
|
||||
// states: [
|
||||
// State {
|
||||
// name: "Dashboard"
|
||||
// PropertyChanges { target: loader; source: "pages/Dashboard.qml" }
|
||||
// }, State {
|
||||
// name: "History"
|
||||
// PropertyChanges { target: loader; source: "pages/History.qml" }
|
||||
// }, State {
|
||||
// name: "Transfer"
|
||||
// PropertyChanges { target: loader; source: "pages/Transfer.qml" }
|
||||
// }, State {
|
||||
// name: "Receive"
|
||||
// PropertyChanges { target: loader; source: "pages/Receive.qml" }
|
||||
// }, State {
|
||||
// name: "AddressBook"
|
||||
// PropertyChanges { target: loader; source: "pages/AddressBook.qml" }
|
||||
// }, State {
|
||||
// name: "Settings"
|
||||
// PropertyChanges { target: loader; source: "pages/Settings.qml" }
|
||||
// }, State {
|
||||
// name: "Mining"
|
||||
// PropertyChanges { target: loader; source: "pages/Mining.qml" }
|
||||
// }
|
||||
// ]
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "Dashboard"
|
||||
PropertyChanges { }
|
||||
}, State {
|
||||
name: "History"
|
||||
PropertyChanges { target: root; currentView: historyView }
|
||||
PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: historyView.contentHeight + 80}
|
||||
}, State {
|
||||
name: "Transfer"
|
||||
PropertyChanges { target: root; currentView: transferView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1000 }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: transferView.transferHeight1 + transferView.transferHeight2 + 80 }
|
||||
}, State {
|
||||
name: "Receive"
|
||||
PropertyChanges { target: root; currentView: receiveView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
name: "Receive"
|
||||
PropertyChanges { target: root; currentView: receiveView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: receiveView.receiveHeight + 80 }
|
||||
}, State {
|
||||
name: "TxKey"
|
||||
PropertyChanges { target: root; currentView: txkeyView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
name: "Merchant"
|
||||
PropertyChanges { target: root; currentView: merchantView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: merchantView.merchantHeight + 80 }
|
||||
}, State {
|
||||
name: "TxKey"
|
||||
PropertyChanges { target: root; currentView: txkeyView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: txkeyView.txkeyHeight + 80 }
|
||||
}, State {
|
||||
name: "SharedRingDB"
|
||||
PropertyChanges { target: root; currentView: sharedringdbView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: sharedringdbView.panelHeight + 80 }
|
||||
}, State {
|
||||
name: "AddressBook"
|
||||
PropertyChanges { target: root; currentView: addressBookView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
PropertyChanges { target: root; currentView: addressBookView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: addressBookView.addressbookHeight + 80 }
|
||||
}, State {
|
||||
name: "Sign"
|
||||
PropertyChanges { target: root; currentView: signView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
PropertyChanges { target: root; currentView: signView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: signView.signHeight + 80 }
|
||||
}, State {
|
||||
name: "Settings"
|
||||
PropertyChanges { target: root; currentView: settingsView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1200 }
|
||||
PropertyChanges { target: root; currentView: settingsView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: settingsView.settingsHeight }
|
||||
}, State {
|
||||
name: "Mining"
|
||||
PropertyChanges { target: root; currentView: miningView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}
|
||||
PropertyChanges { target: mainFlickable; contentHeight: miningView.miningHeight + 80 }
|
||||
}, State {
|
||||
name: "Keys"
|
||||
PropertyChanges { target: root; currentView: keysView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: keysView.keysHeight + 80}
|
||||
}, State {
|
||||
name: "Account"
|
||||
PropertyChanges { target: root; currentView: accountView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: accountView.accountHeight + 80 }
|
||||
}
|
||||
]
|
||||
|
||||
// color stripe at the top
|
||||
Row {
|
||||
id: styledRow
|
||||
height: 4
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
|
||||
Rectangle { height: 4; width: parent.width / 5; color: "#FFE00A" }
|
||||
Rectangle { height: 4; width: parent.width / 5; color: "#6B0072" }
|
||||
Rectangle { height: 4; width: parent.width / 5; color: "#FF6C3C" }
|
||||
Rectangle { height: 4; width: parent.width / 5; color: "#FFD781" }
|
||||
Rectangle { height: 4; width: parent.width / 5; color: "#FF4F41" }
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 2
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 30 : 0
|
||||
anchors.margins: {
|
||||
if(currentView === merchantView || currentView === historyView)
|
||||
return 0;
|
||||
|
||||
return 20;
|
||||
}
|
||||
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 50 : 0
|
||||
anchors.bottomMargin: 0
|
||||
spacing: 0
|
||||
|
||||
Flickable {
|
||||
@@ -187,19 +189,28 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
clip: true
|
||||
// Disabled scrollbars, gives crash on startup on windows
|
||||
// ScrollIndicator.vertical: ScrollIndicator { }
|
||||
// ScrollBar.vertical: ScrollBar { } // uncomment to test
|
||||
boundsBehavior: isMac ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
|
||||
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
parent: root
|
||||
anchors.left: parent.right
|
||||
anchors.leftMargin: -14 // 10 margin + 4 scrollbar width
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: persistentSettings.customDecorations ? 60 : 10
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: persistentSettings.customDecorations ? 15 : 10
|
||||
onActiveChanged: if (!active && !isMac) active = true
|
||||
}
|
||||
|
||||
onFlickingChanged: {
|
||||
releaseFocus();
|
||||
}
|
||||
|
||||
// Views container
|
||||
StackView {
|
||||
id: stackView
|
||||
initialItem: transferView
|
||||
// anchors.topMargin: 30
|
||||
// Layout.fillWidth: true
|
||||
// Layout.fillHeight: true
|
||||
anchors.fill:parent
|
||||
// anchors.margins: 4
|
||||
clip: true // otherwise animation will affect left panel
|
||||
|
||||
delegate: StackViewDelegate {
|
||||
@@ -210,6 +221,7 @@ Rectangle {
|
||||
from: 0 - target.width
|
||||
to: 0
|
||||
duration: 300
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
PropertyAnimation {
|
||||
target: exitItem
|
||||
@@ -217,6 +229,7 @@ Rectangle {
|
||||
from: 0
|
||||
to: target.width
|
||||
duration: 300
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -224,43 +237,30 @@ Rectangle {
|
||||
|
||||
}// flickable
|
||||
}
|
||||
|
||||
// border
|
||||
Rectangle {
|
||||
anchors.top: styledRow.bottom
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: styledRow.bottom
|
||||
id: borderLeft
|
||||
visible: middlePanel.state !== "Merchant"
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
// border shadow
|
||||
Image {
|
||||
source: "qrc:///images/middlePanelShadow.png"
|
||||
width: 12
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
|
||||
}
|
||||
|
||||
/* connect "payment" click */
|
||||
Connections {
|
||||
ignoreUnknownSignals: false
|
||||
target: transferView
|
||||
onPaymentClicked : {
|
||||
console.log("MiddlePanel: paymentClicked")
|
||||
paymentClicked(address, paymentId, amount, mixinCount, priority, description)
|
||||
}
|
||||
onSweepUnmixableClicked : {
|
||||
console.log("MiddlePanel: sweepUnmixableClicked")
|
||||
sweepUnmixableClicked()
|
||||
}
|
||||
anchors.left: borderLeft.right
|
||||
}
|
||||
}
|
||||
|
||||
328
README.md
328
README.md
@@ -1,14 +1,20 @@
|
||||
# Monero GUI
|
||||
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2019, The Monero Project
|
||||
|
||||
## Development Resources
|
||||
## Development resources
|
||||
|
||||
- Web: [getmonero.org](https://getmonero.org)
|
||||
- Forum: [forum.getmonero.org](https://forum.getmonero.org)
|
||||
- Mail: [dev@getmonero.org](mailto:dev@getmonero.org)
|
||||
- Github: [https://github.com/monero-project/monero-core](https://github.com/monero-project/monero-core)
|
||||
- Github: [https://github.com/monero-project/monero-gui](https://github.com/monero-project/monero-gui)
|
||||
- IRC: [#monero-dev on Freenode](irc://chat.freenode.net/#monero-dev)
|
||||
- Translation platform (Weblate): [translate.getmonero.org](https://translate.getmonero.org)
|
||||
- UI Design: [Monero-GUI on Figma](https://www.figma.com/file/DplJ2DDQfIKiuRvolHX2hN/Monero-GUI)
|
||||
|
||||
## Vulnerability response
|
||||
|
||||
- Our [Vulnerability Response Process](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md) encourages responsible disclosure
|
||||
- We are also available via [HackerOne](https://hackerone.com/monero)
|
||||
|
||||
## Introduction
|
||||
|
||||
@@ -20,31 +26,27 @@ Monero is a private, secure, untraceable, decentralised digital currency. You ar
|
||||
|
||||
**Untraceability:** By taking advantage of ring signatures, a special property of a certain type of cryptography, Monero is able to ensure that transactions are not only untraceable, but have an optional measure of ambiguity that ensures that transactions cannot easily be tied back to an individual user or computer.
|
||||
|
||||
## About this Project
|
||||
## About this project
|
||||
|
||||
This is the GUI for the [core Monero implementation](https://github.com/monero-project/monero). It is open source and completely free to use without restrictions, except for those specified in the license agreement below. There are no restrictions on anyone creating an alternative implementation of Monero that uses the protocol and network in a compatible manner.
|
||||
|
||||
As with many development projects, the repository on Github is considered to be the "staging" area for the latest changes. Before changes are merged into that branch on the main repository, they are tested by individual developers in their own branches, submitted as a pull request, and then subsequently tested by contributors who focus on testing and code reviews. That having been said, the repository should be carefully considered before using it in a production environment, unless there is a patch in the repository for a particular show-stopping issue you are experiencing. It is generally a better idea to use a tagged release for stability.
|
||||
|
||||
## Supporting the Project
|
||||
## Supporting the project
|
||||
|
||||
Monero development can be supported directly through donations.
|
||||
Monero is a 100% community-sponsored endeavor. If you want to join our efforts, the easiest thing you can do is support the project financially. Both Monero and Bitcoin donations can be made to **donate.getmonero.org** if using a client that supports the [OpenAlias](https://openalias.org) standard.
|
||||
|
||||
Both Monero and Bitcoin donations can be made to donate.getmonero.org if using a client that supports the [OpenAlias](https://openalias.org) standard
|
||||
|
||||
The Monero donation address is: `44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A` (viewkey: `f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501`)
|
||||
The Monero donation address is: `888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H` (viewkey: `f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501`)
|
||||
|
||||
The Bitcoin donation address is: `1KTexdemPdxSBcG55heUuTjDRYqbC5ZL8H`
|
||||
|
||||
Core development funding and/or some supporting services are also graciously provided by sponsors:
|
||||
GUI development funding and/or some supporting services are also graciously provided by [sponsors](https://www.getmonero.org/community/sponsorships/):
|
||||
|
||||
[<img width="80" src="https://static.getmonero.org/images/sponsors/mymonero.png"/>](https://mymonero.com)
|
||||
[<img width="150" src="https://static.getmonero.org/images/sponsors/kitware.png?1"/>](http://kitware.com)
|
||||
[<img width="100" src="https://static.getmonero.org/images/sponsors/dome9.png"/>](http://dome9.com)
|
||||
[<img width="150" src="https://static.getmonero.org/images/sponsors/araxis.png"/>](http://araxis.com)
|
||||
[<img width="150" src="https://static.getmonero.org/images/sponsors/jetbrains.png"/>](http://www.jetbrains.com/)
|
||||
[<img width="150" src="https://static.getmonero.org/images/sponsors/navicat.png"/>](http://www.navicat.com/)
|
||||
[<img width="150" src="https://static.getmonero.org/images/sponsors/symas.png"/>](http://www.symas.com/)
|
||||
[<img width="150" src="https://www.getmonero.org/img/sponsors/tarilabs.png"/>](https://tarilabs.com/)
|
||||
[<img width="150" src="https://www.getmonero.org/img/sponsors/globee.png"/>](https://globee.com/)
|
||||
[<img width="150" src="https://www.getmonero.org/img/sponsors/symas.png"/>](https://symas.com/)
|
||||
[<img width="150" src="https://www.getmonero.org/img/sponsors/forked_logo.png"/>](http://www.forked.net/)
|
||||
[<img width="150" src="https://www.getmonero.org/img/sponsors/macstadium.png"/>](https://www.macstadium.com/)
|
||||
|
||||
There are also several mining pools that kindly donate a portion of their fees, [a list of them can be found on our Bitcointalk post](https://bitcointalk.org/index.php?topic=583449.0).
|
||||
|
||||
@@ -52,51 +54,154 @@ There are also several mining pools that kindly donate a portion of their fees,
|
||||
|
||||
See [LICENSE](LICENSE).
|
||||
|
||||
## Installing Monero Core from a Package
|
||||
## Translations
|
||||
|
||||
Do you speak a second language and would like to help translate the Monero GUI? Check out Weblate, our localization platform, at [translate.getmonero.org](https://translate.getmonero.org/). Choose the language and suggest a translation for a string or review an existing one. The Localization Workgroup made [a guide with step-by-step instructions](https://github.com/monero-ecosystem/monero-translations/blob/master/weblate.md) for Weblate.
|
||||
|
||||
If you need help/support or any info you can contact the localization workgroup on the IRC channel #monero-translations (relayed on matrix/riot and MatterMost) or by email at translate[at]getmonero[dot]org. For more info about the Localization workgroup: [github.com/monero-ecosystem/monero-translations](https://github.com/monero-ecosystem/monero-translations)
|
||||
|
||||
Status of the translations:
|
||||
<a href="https://translate.getmonero.org/engage/monero/?utm_source=widget">
|
||||
<img src="https://translate.getmonero.org/widgets/monero/-/gui-wallet/horizontal-auto.svg" alt="Translation status" />
|
||||
</a>
|
||||
|
||||
## Installing the Monero GUI from a package
|
||||
|
||||
Packages are available for
|
||||
|
||||
* Arch Linux via AUR: [monero-core-git](https://aur.archlinux.org/packages/monero-core-git/)
|
||||
* Arch Linux: [monero-gui](https://www.archlinux.org/packages/community/x86_64/monero-gui/)
|
||||
* Debian: See the [whonix/monero-gui repository](https://gitlab.com/whonix/monero-gui#how-to-install-monero-using-apt-get)
|
||||
* Void Linux: `xbps-install -S monero-gui`
|
||||
* GuixSD: `guix package -i monero-gui`
|
||||
* macOS (homebrew): `brew cask install monero-wallet`
|
||||
|
||||
Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
## Compiling Monero Core from Source
|
||||
## Compiling the Monero GUI from source
|
||||
|
||||
*Note*: Qt 5.9.7 is the minimum version required to build the GUI.
|
||||
|
||||
### Building Windows static binaries with Docker (any OS)
|
||||
|
||||
1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
|
||||
2. Clone the repository
|
||||
```
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
3. Prepare build environment
|
||||
```
|
||||
cd monero-gui
|
||||
docker build --tag monero:build-env-windows --build-arg THREADS=4 --file Dockerfile.windows .
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
|
||||
4. Build
|
||||
```
|
||||
docker run --rm -it -v <MONERO_GUI_DIR_FULL_PATH>:/monero-gui -w /monero-gui monero:build-env-windows sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j4'
|
||||
```
|
||||
\* `<MONERO_GUI_DIR_FULL_PATH>` - absolute path to `monero-gui` directory
|
||||
\* `4` - number of CPU threads to use
|
||||
5. Monero GUI Windows static binaries will be placed in `monero-gui/build/x86_64-w64-mingw32/release/bin` directory
|
||||
|
||||
### Building Linux static binaries with Docker (any OS)
|
||||
|
||||
1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
|
||||
2. Clone the repository
|
||||
```
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
3. Prepare build environment
|
||||
```
|
||||
cd monero-gui
|
||||
docker build --tag monero:build-env-linux --build-arg THREADS=4 --file Dockerfile.linux .
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
|
||||
4. Build
|
||||
```
|
||||
docker run --rm -it -v <MONERO_GUI_DIR_FULL_PATH>:/monero-gui -w /monero-gui monero:build-env-linux sh -c 'make release-static -j4'
|
||||
```
|
||||
\* `<MONERO_GUI_DIR_FULL_PATH>` - absolute path to `monero-gui` directory
|
||||
\* `4` - number of CPU threads to use
|
||||
5. Monero GUI Linux static binaries will be placed in `monero-gui/build/release/bin` directory
|
||||
|
||||
### Building Android APK with Docker (any OS) *Experimental*
|
||||
- Minimum Android 9 Pie (API 28)
|
||||
- ARMv8-A 64-bit CPU
|
||||
1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
|
||||
2. Clone the repository
|
||||
```
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
3. Prepare build environment
|
||||
```
|
||||
cd monero-gui
|
||||
docker build --tag monero:build-env-android --build-arg THREADS=4 --file Dockerfile.android .
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
|
||||
4. Build
|
||||
```
|
||||
docker run --rm -it -v <MONERO_GUI_DIR_FULL_PATH>:/monero-gui -e THREADS=4 monero:build-env-android
|
||||
```
|
||||
\* `<MONERO_GUI_DIR_FULL_PATH>` - absolute path to `monero-gui` directory
|
||||
\* `4` - number of CPU threads to use
|
||||
5. Monero GUI APK will be placed in `monero-gui/build/Android/release/android-build` directory
|
||||
6. Deploy
|
||||
* Using ADB (Android debugger bridge)
|
||||
- [Enable adb debugging on your device](https://developer.android.com/studio/command-line/adb.html#Enabling)
|
||||
* Connect your device with USB and install Monero GUI APK with adb:
|
||||
```
|
||||
adb install build/Android/release/android-build/monero-gui.apk
|
||||
```
|
||||
* Troubleshooting:
|
||||
```
|
||||
adb devices -l
|
||||
adb logcat
|
||||
```
|
||||
* If using adb inside docker, make sure you did
|
||||
```
|
||||
docker run -v /dev/bus/usb:/dev/bus/usb --privileged
|
||||
```
|
||||
* Using a web server
|
||||
```
|
||||
mkdir /usr/tmp
|
||||
cp build/Android/release/android-build/monero-gui.apk /usr/tmp
|
||||
docker run -d -v /usr/tmp:/usr/share/nginx/html:ro -p 8080:80 nginx
|
||||
```
|
||||
Now it should be accessible through a web browser at
|
||||
```
|
||||
http://<your.local.ip>:8080/QtApp-debug.apk
|
||||
```
|
||||
|
||||
### On Linux:
|
||||
|
||||
(Tested on Ubuntu 16.04 x86, 16.10 x64, Gentoo x64 and Linux Mint 18 "Sarah" - Cinnamon x64)
|
||||
(Tested on Ubuntu 17.10 x64, Ubuntu 18.04 x64 and Gentoo x64)
|
||||
|
||||
1. Install Monero dependencies
|
||||
|
||||
- For Ubuntu and Mint
|
||||
- For Debian distributions (Debian, Ubuntu, Mint, Tails...)
|
||||
|
||||
`sudo apt install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev`
|
||||
`sudo apt install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev libprotobuf-dev protobuf-compiler libgcrypt20-dev`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/ldns net-libs/miniupnpc sys-libs/libunwind`
|
||||
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/ldns net-libs/miniupnpc net-libs/zeromq sys-libs/libunwind dev-libs/libsodium dev-libs/hidapi dev-libs/libgcrypt`
|
||||
|
||||
2. Grab an up-to-date copy of the monero-core repository
|
||||
- For Fedora
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
`sudo dnf install make automake cmake gcc-c++ boost-devel miniupnpc-devel graphviz doxygen unbound-devel libunwind-devel pkgconfig openssl-devel libcurl-devel hidapi-devel libusb-devel zeromq-devel libgcrypt-devel`
|
||||
|
||||
3. Go into the repository
|
||||
2. Install Qt:
|
||||
|
||||
`cd monero-core`
|
||||
*Note*: The Qt 5.9.7 or newer requirement makes **some** distributions (mostly based on debian, like Ubuntu 16.x or Linux Mint 18.x) obsolete due to their repositories containing an older Qt version.
|
||||
|
||||
4. Install the GUI dependencies
|
||||
The recommended way is to install 5.9.7 from the [official Qt installer](https://www.qt.io/download-qt-installer) or [compiling it yourself](https://wiki.qt.io/Install_Qt_5_on_Ubuntu). This ensures you have the correct version. Higher versions *can* work but as it differs from our production build target, slight differences may occur.
|
||||
|
||||
- For Ubuntu 16.04 x86
|
||||
The following instructions will fetch Qt from your distribution's repositories instead. Take note of what version it installs. Your mileage may vary.
|
||||
|
||||
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs`
|
||||
- For Ubuntu 17.10+
|
||||
|
||||
- For Ubuntu 16.04+ x64
|
||||
|
||||
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs qml-module-qt-labs-settings libqt5qml-graphicaleffects`
|
||||
|
||||
- For Linux Mint 18 "Sarah" - Cinnamon x64
|
||||
|
||||
`sudo apt install qml-module-qt-labs-settings qml-module-qtgraphicaleffects`
|
||||
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
@@ -104,7 +209,7 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
- Optional : To build the flag `WITH_SCANNER`
|
||||
|
||||
- For Ubuntu and Mint
|
||||
- For Ubuntu
|
||||
|
||||
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia libzbar-dev`
|
||||
|
||||
@@ -114,124 +219,107 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
`emerge dev-qt/qtmultimedia:5 media-gfx/zbar`
|
||||
|
||||
5. Build the GUI
|
||||
|
||||
- For Ubuntu and Mint
|
||||
3. Clone repository
|
||||
|
||||
`./build.sh`
|
||||
```
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
cd monero-gui
|
||||
```
|
||||
|
||||
- For Gentoo
|
||||
4. Build
|
||||
|
||||
`QT_SELECT=5 ./build.sh`
|
||||
```
|
||||
make release -j4
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/gcc_64 make release -j4`
|
||||
|
||||
The executable can be found in the build/release/bin folder.
|
||||
|
||||
### On OS X:
|
||||
|
||||
1. Install Xcode from AppStore
|
||||
|
||||
2. Install [homebrew](http://brew.sh/)
|
||||
|
||||
3. Install [monero](https://github.com/monero-project/monero) dependencies:
|
||||
|
||||
`brew install boost --c++11`
|
||||
`brew install boost hidapi zmq libpgm miniupnpc ldns expat libunwind-headers protobuf libgcrypt`
|
||||
|
||||
`brew install openssl` - to install openssl headers
|
||||
4. Install Qt:
|
||||
|
||||
`brew install pkgconfig`
|
||||
`brew install qt5` (or download QT 5.9.7+ from [qt.io](https://www.qt.io/download-open-source/))
|
||||
|
||||
`brew install cmake`
|
||||
5. Grab an up-to-date copy of the monero-gui repository
|
||||
|
||||
`brew install qt5` (or download QT 5.8+ from [qt.io](https://www.qt.io/download-open-source/))
|
||||
```
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
cd monero-gui
|
||||
```
|
||||
|
||||
If you have an older version of Qt installed via homebrew, you can force it to use 5.x like so:
|
||||
|
||||
`brew link --force --overwrite qt5`
|
||||
6. Start the build
|
||||
|
||||
5. Add the Qt bin directory to your path
|
||||
|
||||
Example: `export PATH=$PATH:$HOME/Qt/5.8/clang_64/bin`
|
||||
|
||||
This is the directory where Qt 5.x is installed on **your** system
|
||||
|
||||
6. Grab an up-to-date copy of the monero-core repository
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
|
||||
7. Go into the repository
|
||||
|
||||
`cd monero-core`
|
||||
|
||||
8. Start the build
|
||||
|
||||
`./build.sh`
|
||||
```
|
||||
make release -j4
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/clang_64 make release -j4`
|
||||
|
||||
The executable can be found in the `build/release/bin` folder.
|
||||
|
||||
**Note:** Workaround for "ERROR: Xcode not set up properly"
|
||||
|
||||
Edit `$HOME/Qt/5.8/clang_64/mkspecs/features/mac/default_pre.prf`
|
||||
|
||||
replace
|
||||
`isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null")))`
|
||||
|
||||
with
|
||||
`isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null")))`
|
||||
|
||||
More info: http://stackoverflow.com/a/35098040/1683164
|
||||
|
||||
For building an application bundle see `DEPLOY.md`.
|
||||
|
||||
### On Windows:
|
||||
|
||||
1. Install [msys2](http://msys2.github.io/), follow the instructions on that page on how to update packages to the latest versions
|
||||
The Monero GUI on Windows is 64 bits only; 32-bit Windows GUI builds are not officially supported anymore.
|
||||
|
||||
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment
|
||||
**As we only build application for x86, install only dependencies for x86 architecture (i686 in package name)**
|
||||
```
|
||||
pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost
|
||||
1. Install [MSYS2](https://www.msys2.org/), follow the instructions on that page on how to update system and packages to the latest versions
|
||||
|
||||
```
|
||||
2. Open an 64-bit MSYS2 shell: Use the *MSYS2 MinGW 64-bit* shortcut, or use the `msys2_shell.cmd` batch file with a `-mingw64` parameter
|
||||
|
||||
3. Install git into msys2 environment
|
||||
3. Install MSYS2 packages for Monero dependencies; the needed 64-bit packages have `x86_64` in their names
|
||||
|
||||
```
|
||||
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-libgcrypt
|
||||
```
|
||||
|
||||
Optional : To build the flag `WITH_SCANNER`
|
||||
|
||||
```
|
||||
pacman -S mingw-w64-x86_64-zbar
|
||||
```
|
||||
|
||||
You find more details about those dependencies in the [Monero documentation](https://github.com/monero-project/monero). Note that that there is no more need to compile Boost from source; like everything else, you can install it now with a MSYS2 package.
|
||||
|
||||
4. Install Qt5
|
||||
|
||||
```
|
||||
pacman -S mingw-w64-x86_64-qt5
|
||||
```
|
||||
|
||||
There is no more need to download some special installer from the Qt website, the standard MSYS2 package for Qt will do in almost all circumstances.
|
||||
|
||||
5. Install git
|
||||
|
||||
```
|
||||
pacman -S git
|
||||
```
|
||||
|
||||
4. Install Qt5 from [official site](https://www.qt.io/download-open-source/)
|
||||
- download unified installer, run and select following options:
|
||||
- Qt > Qt 5.7 > MinGW 5.3.0 32 bit
|
||||
- Tools > MinGW 5.3.0
|
||||
- continue with installation
|
||||
6. Clone repository
|
||||
|
||||
5. Open ```MinGW-w64 Win32 Shell``` shell
|
||||
|
||||
```%MSYS_ROOT%\msys2_shell.cmd -mingw32```
|
||||
|
||||
Where ```%MSYS_ROOT%``` will be ```c:\msys32``` if your host OS is x86-based or ```c:\msys64``` if your host OS
|
||||
is x64-based
|
||||
|
||||
6. Install the latest version of boost, specificly the required static libraries
|
||||
```
|
||||
cd
|
||||
wget http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2
|
||||
tar xjf boost_1_63_0.tar.bz2
|
||||
cd boost_1_63_0
|
||||
./bootstrap.sh mingw
|
||||
./b2 --prefix=/mingw32/boost --layout=tagged --without-mpi --without-python toolset=gcc address-model=32 variant=debug,release link=static threading=multi runtime-link=static -j$(nproc) install
|
||||
git clone --recursive https://github.com/monero-project/monero-gui.git
|
||||
cd monero-gui
|
||||
```
|
||||
|
||||
7. Clone repository
|
||||
```
|
||||
cd
|
||||
git clone https://github.com/monero-project/monero-core.git
|
||||
```
|
||||
7. Build
|
||||
|
||||
8. Build the GUI
|
||||
```
|
||||
cd monero-core
|
||||
export PATH=$(ls -rd /c/Qt/5.[6,7,8]/mingw53_32/bin | head -1):$PATH
|
||||
./build.sh
|
||||
cd build
|
||||
make release-win64 -j4
|
||||
cd build/release
|
||||
make deploy
|
||||
```
|
||||
\* `4` - number of CPU threads to use
|
||||
|
||||
The executable can be found in the ```.\release\bin``` directory.
|
||||
The executable can be found in the `.\bin` directory.
|
||||
|
||||
158
RightPanel.qml
158
RightPanel.qml
@@ -1,158 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "tabs"
|
||||
import "components"
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
width: 330
|
||||
color: "#FFFFFF"
|
||||
|
||||
function updateTweets() {
|
||||
tabView.twitter.item.updateTweets()
|
||||
}
|
||||
|
||||
|
||||
TabView {
|
||||
id: tabView
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: styledRow.top
|
||||
anchors.leftMargin: 14
|
||||
anchors.rightMargin: 14
|
||||
anchors.topMargin: 40
|
||||
property alias twitter: twitter
|
||||
|
||||
|
||||
|
||||
|
||||
Tab { id: twitter; title: qsTr("Twitter"); source: "tabs/Twitter.qml" }
|
||||
Tab { title: qsTr("News") + translationManager.emptyString }
|
||||
Tab { title: qsTr("Help") + translationManager.emptyString }
|
||||
Tab { title: qsTr("About") + translationManager.emptyString }
|
||||
|
||||
|
||||
|
||||
style: TabViewStyle {
|
||||
frameOverlap: 0
|
||||
tabOverlap: 0
|
||||
|
||||
tab: Rectangle {
|
||||
implicitHeight: 31
|
||||
implicitWidth: styleData.index === tabView.count - 1 ? tabView.width - (tabView.count - 1) * 68 : 68
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 12
|
||||
elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: styleData.selected ? "#FF4E40" : "#4A4646"
|
||||
text: styleData.title
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
visible: styleData.index !== tabView.count - 1
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: -1
|
||||
height: 1
|
||||
color: styleData.selected ? "#FFFFFF" : "#DBDBDB"
|
||||
}
|
||||
}
|
||||
|
||||
frame: Rectangle {
|
||||
color: "#FFFFFF"
|
||||
anchors.fill: parent
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
//anchors.topMargin: 1
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: styledRow
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
Rectangle { height: 8; width: parent.width / 5; color: "#FFE00A" }
|
||||
Rectangle { height: 8; width: parent.width / 5; color: "#6B0072" }
|
||||
Rectangle { height: 8; width: parent.width / 5; color: "#FF6C3C" }
|
||||
Rectangle { height: 8; width: parent.width / 5; color: "#FFD781" }
|
||||
Rectangle { height: 8; width: parent.width / 5 - 30; color: "#FF4F41" }
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
// indicate disabled state
|
||||
// Desaturate {
|
||||
// anchors.fill: parent
|
||||
// source: parent
|
||||
// desaturation: root.enabled ? 0.0 : 1.0
|
||||
// }
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
#include "TranslationManager.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QTranslator>
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QFileInfo>
|
||||
|
||||
|
||||
TranslationManager * TranslationManager::m_instance = nullptr;
|
||||
|
||||
|
||||
TranslationManager::TranslationManager(QObject *parent) : QObject(parent)
|
||||
{
|
||||
m_translator = new QTranslator(this);
|
||||
}
|
||||
|
||||
bool TranslationManager::setLanguage(const QString &language)
|
||||
{
|
||||
qDebug() << __FUNCTION__ << " " << language;
|
||||
// if language is "en", remove translator
|
||||
if (language.toLower() == "en") {
|
||||
qApp->removeTranslator(m_translator);
|
||||
emit languageChanged();
|
||||
return true;
|
||||
}
|
||||
|
||||
// translations are compiled into app binary
|
||||
#ifdef Q_OS_MACX
|
||||
QString dir = qApp->applicationDirPath() + "/../Resources/translations";
|
||||
#else
|
||||
QString dir = qApp->applicationDirPath() + "/translations";
|
||||
#endif
|
||||
|
||||
QString filename = "monero-core_" + language;
|
||||
|
||||
qDebug("%s: loading translation file '%s' from '%s",
|
||||
__FUNCTION__, qPrintable(filename), qPrintable(dir));
|
||||
|
||||
|
||||
if (m_translator->load(filename, dir)) {
|
||||
qDebug("%s: translation for language '%s' loaded successfully",
|
||||
__FUNCTION__, qPrintable(language));
|
||||
// TODO: apply locale?
|
||||
qApp->installTranslator(m_translator);
|
||||
emit languageChanged();
|
||||
return true;
|
||||
} else {
|
||||
qCritical("%s: error loading translation for language '%s'",
|
||||
__FUNCTION__, qPrintable(language));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
TranslationManager *TranslationManager::instance()
|
||||
{
|
||||
if (!m_instance) {
|
||||
m_instance = new TranslationManager();
|
||||
}
|
||||
return m_instance;
|
||||
}
|
||||
|
||||
QString TranslationManager::emptyString()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef TRANSLATIONMANAGER_H
|
||||
#define TRANSLATIONMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class QTranslator;
|
||||
class TranslationManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QString emptyString READ emptyString NOTIFY languageChanged)
|
||||
public:
|
||||
Q_INVOKABLE bool setLanguage(const QString &language);
|
||||
static TranslationManager *instance();
|
||||
|
||||
QString emptyString();
|
||||
|
||||
signals:
|
||||
void languageChanged();
|
||||
|
||||
private:
|
||||
explicit TranslationManager(QObject *parent = 0);
|
||||
|
||||
private:
|
||||
static TranslationManager * m_instance;
|
||||
QTranslator * m_translator;
|
||||
|
||||
};
|
||||
|
||||
#endif // TRANSLATIONMANAGER_H
|
||||
@@ -1,147 +0,0 @@
|
||||
# Monero GUI Vulnerability Response Process
|
||||
|
||||
## Preamble
|
||||
|
||||
Researchers/Hackers: while you research/hack, we ask that you please refrain from committing the following:
|
||||
- Denial of Service / Active exploiting against the network
|
||||
- Social Engineering of Monero staff or contractors
|
||||
- Any physical or electronic attacks against Monero community property and/or data centers
|
||||
|
||||
## I. Points of Contact for Security Issues
|
||||
|
||||
```
|
||||
ric@getmonero.org
|
||||
BDA6 BD70 42B7 21C4 67A9 759D 7455 C5E3 C0CD CEB9
|
||||
|
||||
luigi1111@getmonero.org
|
||||
8777 AB8F 778E E894 87A2 F8E7 F4AC A018 3641 E010
|
||||
|
||||
moneromooo.monero@gmail.com
|
||||
48B0 8161 FBDA DFE3 93AD FC3E 686F 0745 4D6C EFC3
|
||||
|
||||
jaquee.monero@gmail.com
|
||||
D21E 9CC1 2F51 C4FE A9E0 52FF 384E 52B0 9F45 DC39
|
||||
```
|
||||
|
||||
## II. Security Response Team
|
||||
|
||||
- fluffypony
|
||||
- luigi1111
|
||||
- moneromooo
|
||||
- Jaquee
|
||||
|
||||
## III. Incident Response
|
||||
|
||||
1. Researcher submits report via one or both of two methods:
|
||||
- a. Email
|
||||
- b. [HackerOne](https://hackerone.com/monero)
|
||||
|
||||
2. Response Team designates a Response Manager who is in charge of the particular report based on availability and/or knowledge-set
|
||||
|
||||
3. In no more than 3 working days, Response Team should gratefully respond to researcher using only encrypted, secure channels
|
||||
|
||||
4. Response Manager makes inquiries to satisfy any needed information to confirm if submission is indeed a vulnerability
|
||||
- a. If submission proves to be vulnerable, proceed to next step
|
||||
- b. If not vulnerable:
|
||||
- i. Response Manager responds with reasons why submission is not a vulnerability
|
||||
- ii. Response Manager moves discussion to a new or existing ticket on GitHub if necessary
|
||||
|
||||
5. If over email, Response Manager opens a HackerOne issue for new submission
|
||||
|
||||
6. Establish severity of vulnerability:
|
||||
- a. HIGH: impacts network as a whole, has potential to break entire network, results in the loss of monero, or is on a scale of great catastrophe
|
||||
- b. MEDIUM: impacts individual nodes, wallets, or must be carefully exploited
|
||||
- c. LOW: is not easily exploitable
|
||||
|
||||
7. Respond according to the severity of the vulnerability:
|
||||
- a. HIGH severities must be notified on website and reddit /r/Monero within 3 working days of classification
|
||||
- i. The notification should list appropriate steps for users to take, if any
|
||||
- ii. The notification must not include any details that could suggest an exploitation path
|
||||
- iii. The latter takes precedence over the former
|
||||
- b. MEDIUM and HIGH severities will require a Point Release
|
||||
- c. LOW severities will be addressed in the next Regular Release
|
||||
|
||||
8. Response Team applies appropriate patch(es)
|
||||
- a. Response Manager designates a PRIVATE git "hotfix branch" to work in
|
||||
- b. Patches are reviewed with the researcher
|
||||
- c. Any messages associated with PUBLIC commits during the time of review should not make reference to the security nature of the PRIVATE branch or its commits
|
||||
- d. Vulnerability announcement is drafted
|
||||
- i. Include the severity of the vulnerability
|
||||
- ii. Include all vulnerable systems/apps/code
|
||||
- iii. Include solutions (if any) if patch cannot be applied
|
||||
- e. Release date is discussed
|
||||
|
||||
9. At release date, Response Team coordinates with developers to finalize update:
|
||||
- a. Response Manager propagates the "hotfix branch" to trunk
|
||||
- b. Response Manager includes vulnerability announcement draft in release notes
|
||||
- c. Proceed with the Point or Regular Release
|
||||
|
||||
## IV. Post-release Disclosure Process
|
||||
|
||||
1. Response Team has 90 days to fulfill all points within section III
|
||||
|
||||
2. If the Incident Response process in section III is successfully completed:
|
||||
- a. Response Manager contacts researcher and asks if researcher wishes for credit
|
||||
- b. Finalize vulnerability announcement draft and include the following:
|
||||
- i. Project name and URL
|
||||
- ii. Versions known to be affected
|
||||
- iii. Versions known to be not affected (for example, the vulnerable code was introduced in a recent version, and older versions are therefore unaffected)
|
||||
- iv. Versions not checked
|
||||
- v. Type of vulnerability and its impact
|
||||
- vi. If already obtained or applicable, a CVE-ID
|
||||
- vii. The planned, coordinated release date
|
||||
- viii. Mitigating factors (for example, the vulnerability is only exposed in uncommon, non-default configurations)
|
||||
- ix. Workarounds (configuration changes users can make to reduce their exposure to the vulnerability)
|
||||
- x. If applicable, credits to the original reporter
|
||||
- c. Release finalized vulnerability announcement on website and reddit /r/Monero
|
||||
- d. For HIGH severities, release finalized vulnerability announcement on well-known mailing lists:
|
||||
- i. oss-security@lists.openwall.com
|
||||
- ii. bugtraq@securityfocus.com
|
||||
- e. If applicable, developers request a CVE-ID
|
||||
- i. The commit that applied the fix is made reference too in a future commit and includes a CVE-ID
|
||||
|
||||
3. If the Incident Response process in section III is *not* successfully completed:
|
||||
- a. Response Team and developers organize an IRC meeting to discuss why/what points in section III were not resolved and how the team can resolve them in the future
|
||||
- b. Any developer meetings immediately following the incident should include points made in section V
|
||||
- c. If disputes arise about whether or when to disclose information about a vulnerability, the Response Team will publicly discuss the issue via IRC and attempt to reach consensus
|
||||
- d. If consensus on a timely disclosure is not met (no later than 90 days), the researcher (after 90 days) has every right to expose the vulnerability to the public
|
||||
|
||||
## V. Incident Analysis
|
||||
|
||||
1. Isolate codebase
|
||||
- a. Response Team and developers should coordinate to work on the following:
|
||||
- i. Problematic implementation of classes/libraries/functions, etc.
|
||||
- ii. Focus on apps/distro packaging, etc.
|
||||
- iii. Operator/config error, etc.
|
||||
|
||||
2. Auditing
|
||||
- a. Response Team and developers should coordinate to work on the following:
|
||||
- i. Auditing of problem area(s) as discussed in point 1
|
||||
- ii. Generate internal reports and store for future reference
|
||||
- iii. If results are not sensitive, share with the public via IRC or GitHub
|
||||
|
||||
3. Response Team has 45 days following completion of section III to ensure completion of section V
|
||||
|
||||
## VI. Resolutions
|
||||
|
||||
Any further questions or resolutions regarding the incident(s) between the researcher and response + development team after public disclosure can be addressed via the following:
|
||||
|
||||
- [GitHub](https://github.com/monero-project/monero/issues/)
|
||||
- [HackerOne](https://hackerone.com/monero)
|
||||
- [Reddit /r/Monero](https://reddit.com/r/Monero/)
|
||||
- IRC
|
||||
- Email
|
||||
|
||||
## VII. Continuous Improvement
|
||||
|
||||
1. Response Team and developers should hold annual meetings to review the previous year's incidents
|
||||
|
||||
2. Response Team or designated person(s) should give a brief presentation, including:
|
||||
- a. Areas of Monero affected by the incidents
|
||||
- b. Any network downtime or monetary cost (if any) of the incidents
|
||||
- c. Ways in which the incidents could have been avoided (if any)
|
||||
- d. How effective this process was in dealing with the incidents
|
||||
|
||||
3. After the presentation, Response Team and developers should discuss:
|
||||
- a. Potential changes to development processes to reduce future incidents
|
||||
- b. Potential changes to this process to improve future responses
|
||||
@@ -1,53 +0,0 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
|
||||
|
||||
## Current status : ALPHA
|
||||
|
||||
- Minimum Android 5.0 (api level 21)
|
||||
- Modal dialogs can appear in background giving the feeling that the application is frozen (Work around : turn screen off/on or switch to another app and back)
|
||||
|
||||
## Build using Docker
|
||||
|
||||
# Base environnement
|
||||
|
||||
cd monero/utils/build_scripts
|
||||
docker build -f android32.Dockerfile -t monero-android .
|
||||
cd ..
|
||||
|
||||
# Build GUI
|
||||
|
||||
cd android/docker
|
||||
docker build -t monero-gui-android .
|
||||
docker create -it --name monero-gui-android monero-gui-android bash
|
||||
|
||||
# Get the apk
|
||||
|
||||
docker cp monero-gui-android:/opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk .
|
||||
|
||||
## Deployment
|
||||
|
||||
- Using ADB (Android debugger bridge) :
|
||||
|
||||
First, see section [Enable adb debugging on your device](https://developer.android.com/studio/command-line/adb.html#Enabling)
|
||||
The only place where we are allowed to play is `/data/local/tmp`. So :
|
||||
|
||||
adb push /opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk /data/local/tmp
|
||||
adb shell pm install -r /data/local/tmp/QtApp-debug.apk
|
||||
|
||||
- Troubleshooting:
|
||||
|
||||
adb devices -l
|
||||
adb logcat
|
||||
|
||||
if using adb inside docker, make sure you did "docker run -v /dev/bus/usb:/dev/bus/usb --privileged"
|
||||
|
||||
- Using a web server
|
||||
|
||||
mkdir /usr/tmp
|
||||
cp QtApp-debug.apk /usr/tmp
|
||||
docker run -d -v /usr/tmp:/usr/share/nginx/html:ro -p 8080:80 nginx
|
||||
|
||||
Now it should be accessible through a web browser at
|
||||
|
||||
http://<your.local.ip>:8080/QtApp-debug.apk
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
FROM monero-android
|
||||
|
||||
#INSTALL JAVA
|
||||
RUN echo "deb http://ftp.fr.debian.org/debian/ jessie-backports main contrib non-free" >> /etc/apt/sources.list
|
||||
RUN dpkg --add-architecture i386 \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386 libz1:i386 \
|
||||
&& apt-get install -y -t jessie-backports ca-certificates-java openjdk-8-jdk-headless openjdk-8-jre-headless ant
|
||||
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
|
||||
ENV PATH $JAVA_HOME/bin:$PATH
|
||||
|
||||
#Get Qt
|
||||
ENV QT_VERSION 5.8
|
||||
|
||||
RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} \
|
||||
&& cd qt5 \
|
||||
&& perl init-repository
|
||||
|
||||
## Note: Need to use libc++ but Qt does not provide mkspec for libc++.
|
||||
## Their support of it is quite recent and they claim they don't use it by default
|
||||
## [only because it produces bigger binary objects](https://bugreports.qt.io/browse/QTBUG-50724).
|
||||
|
||||
#Create new mkspec for clang + libc++
|
||||
RUN cp -r qt5/qtbase/mkspecs/android-clang qt5/qtbase/mkspecs/android-clang-libc \
|
||||
&& cd qt5/qtbase/mkspecs/android-clang-libc \
|
||||
&& sed -i '16i ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$$ANDROID_TARGET_ARCH' qmake.conf \
|
||||
&& sed -i '17i ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/include' qmake.conf \
|
||||
&& echo "QMAKE_LIBS_PRIVATE = -lc++_shared -llog -lz -lm -ldl -lc -lgcc " >> qmake.conf \
|
||||
&& echo "QMAKE_CFLAGS -= -mfpu=vfp " >> qmake.conf \
|
||||
&& echo "QMAKE_CXXFLAGS -= -mfpu=vfp " >> qmake.conf \
|
||||
&& echo "QMAKE_CFLAGS += -mfpu=vfp4 " >> qmake.conf \
|
||||
&& echo "QMAKE_CXXFLAGS += -mfpu=vfp4 " >> qmake.conf
|
||||
|
||||
ENV ANDROID_API android-21
|
||||
|
||||
#ANDROID SDK TOOLS
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter platform-tools
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter ${ANDROID_API}
|
||||
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter build-tools-25.0.1
|
||||
|
||||
ENV CLEAN_PATH $JAVA_HOME/bin:/usr/cmake-3.6.3-Linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
#build Qt
|
||||
RUN cd qt5 && PATH=${CLEAN_PATH} ./configure -developer-build -release \
|
||||
-xplatform android-clang-libc \
|
||||
-android-ndk-platform ${ANDROID_API} \
|
||||
-android-ndk $ANDROID_NDK_ROOT \
|
||||
-android-sdk $ANDROID_SDK_ROOT \
|
||||
-opensource -confirm-license \
|
||||
-prefix ${WORKDIR}/Qt-${QT_VERSION} \
|
||||
-nomake tests -nomake examples \
|
||||
-skip qtserialport \
|
||||
-skip qtconnectivity \
|
||||
-skip qttranslations \
|
||||
-skip qtgamepad -skip qtscript -skip qtdoc
|
||||
|
||||
# build Qt tools : gnustl_shared.so is hard-coded in androiddeployqt
|
||||
# replace it with libc++_shared.so
|
||||
COPY androiddeployqt.patch qt5/qttools/androiddeployqt.patch
|
||||
RUN cd qt5/qttools \
|
||||
&& git apply androiddeployqt.patch \
|
||||
&& cd .. \
|
||||
&& PATH=${CLEAN_PATH} make -j4 \
|
||||
&& PATH=${CLEAN_PATH} make install
|
||||
|
||||
# Get iconv and ZBar
|
||||
ENV ICONV_VERSION 1.14
|
||||
RUN git clone https://github.com/ZBar/ZBar.git \
|
||||
&& curl -s -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
|
||||
&& cd libiconv-${ICONV_VERSION} \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ./configure --build=x86_64-linux-gnu --host=arm-eabi --prefix=${WORKDIR}/libiconv --disable-rpath
|
||||
|
||||
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$PATH
|
||||
|
||||
#Build libiconv.a and libzbarjni.a
|
||||
COPY android.mk.patch ZBar/android.mk.patch
|
||||
RUN cd ZBar \
|
||||
&& git apply android.mk.patch \
|
||||
&& echo \
|
||||
"APP_ABI := armeabi-v7a \n\
|
||||
APP_STL := c++_shared \n\
|
||||
TARGET_PLATFORM := ${ANDROID_API} \n\
|
||||
TARGET_ARCH_ABI := armeabi-v7a \n\
|
||||
APP_CFLAGS += -target armv7-none-linux-androideabi -fexceptions -fstack-protector-strong -fno-limit-debug-info -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -fno-omit-frame-pointer -fno-stack-protector\n"\
|
||||
>> android/jni/Application.mk \
|
||||
&& cd android \
|
||||
&& android update project --path . -t "${ANDROID_API}" \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ant -Dndk.dir=${ANDROID_NDK_ROOT} -Diconv.src=${WORKDIR}/libiconv-${ICONV_VERSION} zbar-clean zbar-ndk-build
|
||||
|
||||
#Can't directly call build.sh because of env variables
|
||||
RUN git clone https://github.com/monero-project/monero-core.git \
|
||||
&& cd monero-core \
|
||||
&& git submodule update \
|
||||
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ BOOST_ROOT=/opt/android/boost_1_62_0 BOOST_LIBRARYDIR=${WORKDIR}/boost_${BOOST_VERSION}/android32/lib/ OPENSSL_ROOT_DIR=${WORKDIR}/openssl/ ./get_libwallet_api.sh release-android
|
||||
|
||||
RUN cp openssl/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
RUN cp boost_${BOOST_VERSION}/android32/lib/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
RUN cp ZBar/android/obj/local/armeabi-v7a/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
|
||||
|
||||
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$CLEAN_PATH
|
||||
|
||||
# NB : zxcvbn-c needs to build a local binary and Qt don't care about these environnement variable
|
||||
RUN cd monero-core \
|
||||
&& CC="gcc" CXX="g++" ./build.sh release-android \
|
||||
&& cd build \
|
||||
&& make deploy
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
|
||||
index e442b07..158afd5 100644
|
||||
--- a/android/jni/Android.mk
|
||||
+++ b/android/jni/Android.mk
|
||||
@@ -12,14 +12,18 @@ LOCAL_PATH := $(ICONV_SRC)
|
||||
|
||||
LOCAL_MODULE := libiconv
|
||||
|
||||
+LOCAL_ARM_MODE := arm
|
||||
+LOCAL_CPP_FEATURES := exceptions rtti features
|
||||
LOCAL_CFLAGS := \
|
||||
-Wno-multichar \
|
||||
-D_ANDROID \
|
||||
- -DLIBDIR="c" \
|
||||
+ -DLIBDIR="\".\"" \
|
||||
-DBUILDING_LIBICONV \
|
||||
-DBUILDING_LIBCHARSET \
|
||||
-DIN_LIBRARY
|
||||
|
||||
+LOCAL_CFLAGS += -fno-stack-protector
|
||||
+
|
||||
LOCAL_SRC_FILES := \
|
||||
lib/iconv.c \
|
||||
libcharset/lib/localcharset.c \
|
||||
@@ -30,13 +34,14 @@ LOCAL_C_INCLUDES := \
|
||||
$(ICONV_SRC)/libcharset \
|
||||
$(ICONV_SRC)/libcharset/include
|
||||
|
||||
-include $(BUILD_SHARED_LIBRARY)
|
||||
+include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
LOCAL_LDLIBS := -llog -lcharset
|
||||
|
||||
# libzbarjni
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
+
|
||||
LOCAL_PATH := $(MY_LOCAL_PATH)
|
||||
LOCAL_MODULE := zbarjni
|
||||
LOCAL_SRC_FILES := ../../java/zbarjni.c \
|
||||
@@ -71,6 +76,17 @@ LOCAL_C_INCLUDES := ../include \
|
||||
../zbar \
|
||||
$(ICONV_SRC)/include
|
||||
|
||||
-LOCAL_SHARED_LIBRARIES := libiconv
|
||||
+LOCAL_STATIC_LIBRARIES := libiconv
|
||||
+LOCAL_ARM_MODE := arm
|
||||
+LOCAL_CPP_FEATURES := exceptions rtti features
|
||||
+
|
||||
+LOCAL_CFLAGS := \
|
||||
+ -Wno-multichar \
|
||||
+ -D_ANDROID \
|
||||
+ -DLIBDIR="\".\"" \
|
||||
+ -DBUILDING_LIBICONV \
|
||||
+ -DBUILDING_LIBCHARSET \
|
||||
+ -DIN_LIBRARY
|
||||
+
|
||||
|
||||
-include $(BUILD_SHARED_LIBRARY)
|
||||
\ No newline at end of file
|
||||
+include $(BUILD_STATIC_LIBRARY)
|
||||
@@ -1,62 +0,0 @@
|
||||
diff --git a/src/androiddeployqt/main.cpp b/src/androiddeployqt/main.cpp
|
||||
index 8a8e591..71d693e 100644
|
||||
--- a/src/androiddeployqt/main.cpp
|
||||
+++ b/src/androiddeployqt/main.cpp
|
||||
@@ -1122,7 +1122,7 @@ bool updateLibsXml(const Options &options)
|
||||
|
||||
QString libsPath = QLatin1String("libs/") + options.architecture + QLatin1Char('/');
|
||||
|
||||
- QString qtLibs = QLatin1String("<item>gnustl_shared</item>\n");
|
||||
+ QString qtLibs = QLatin1String("<item>c++_shared</item>\n");
|
||||
QString bundledInLibs;
|
||||
QString bundledInAssets;
|
||||
foreach (Options::BundledFile bundledFile, options.bundledFiles) {
|
||||
@@ -2519,6 +2519,39 @@ bool installApk(const Options &options)
|
||||
return true;
|
||||
}
|
||||
|
||||
+bool copyStl(Options *options)
|
||||
+{
|
||||
+ if (options->deploymentMechanism == Options::Debug && !options->installApk)
|
||||
+ return true;
|
||||
+
|
||||
+ if (options->verbose)
|
||||
+ fprintf(stdout, "Copying LIBC++ STL library\n");
|
||||
+
|
||||
+ QString filePath = options->ndkPath
|
||||
+ + QLatin1String("/sources/cxx-stl/llvm-libc++")
|
||||
+ + QLatin1String("/libs/")
|
||||
+ + options->architecture
|
||||
+ + QLatin1String("/libc++_shared.so");
|
||||
+ if (!QFile::exists(filePath)) {
|
||||
+ fprintf(stderr, "LIBC STL library does not exist at %s\n", qPrintable(filePath));
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ QString destinationDirectory =
|
||||
+ options->deploymentMechanism == Options::Debug
|
||||
+ ? options->temporaryDirectoryName + QLatin1String("/lib")
|
||||
+ : options->outputDirectory + QLatin1String("/libs/") + options->architecture;
|
||||
+
|
||||
+ if (!copyFileIfNewer(filePath, destinationDirectory
|
||||
+ + QLatin1String("/libc++_shared.so"), options->verbose)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (options->deploymentMechanism == Options::Debug && !deployToLocalTmp(options, QLatin1String("/lib/libc++_shared.so")))
|
||||
+ return false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
bool copyGnuStl(Options *options)
|
||||
{
|
||||
if (options->deploymentMechanism == Options::Debug && !options->installApk)
|
||||
@@ -2870,7 +2903,7 @@ int main(int argc, char *argv[])
|
||||
if (Q_UNLIKELY(options.timing))
|
||||
fprintf(stdout, "[TIMING] %d ms: Read dependencies\n", options.timer.elapsed());
|
||||
|
||||
- if (options.deploymentMechanism != Options::Ministro && !copyGnuStl(&options))
|
||||
+ if (options.deploymentMechanism != Options::Ministro && !copyStl(&options))
|
||||
return CannotCopyGnuStl;
|
||||
|
||||
if (Q_UNLIKELY(options.timing))
|
||||
98
build.sh
98
build.sh
@@ -1,98 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
BUILD_TYPE=$1
|
||||
source ./utils.sh
|
||||
platform=$(get_platform)
|
||||
# default build type
|
||||
if [ -z $BUILD_TYPE ]; then
|
||||
BUILD_TYPE=release
|
||||
fi
|
||||
|
||||
if [ "$BUILD_TYPE" == "release" ]; then
|
||||
echo "Building release"
|
||||
CONFIG="CONFIG+=release";
|
||||
BIN_PATH=release/bin
|
||||
elif [ "$BUILD_TYPE" == "release-static" ]; then
|
||||
echo "Building release-static"
|
||||
if [ "$platform" != "darwin" ]; then
|
||||
CONFIG="CONFIG+=release static";
|
||||
else
|
||||
# OS X: build static libwallet but dynamic Qt.
|
||||
echo "OS X: Building Qt project without static flag"
|
||||
CONFIG="CONFIG+=release";
|
||||
fi
|
||||
BIN_PATH=release/bin
|
||||
elif [ "$BUILD_TYPE" == "release-android" ]; then
|
||||
echo "Building release for ANDROID"
|
||||
CONFIG="CONFIG+=release static WITH_SCANNER";
|
||||
ANDROID=true
|
||||
BIN_PATH=release/bin
|
||||
elif [ "$BUILD_TYPE" == "debug-android" ]; then
|
||||
echo "Building debug for ANDROID : ultra INSECURE !!"
|
||||
CONFIG="CONFIG+=debug qml_debug WITH_SCANNER";
|
||||
ANDROID=true
|
||||
BIN_PATH=debug/bin
|
||||
elif [ "$BUILD_TYPE" == "debug" ]; then
|
||||
echo "Building debug"
|
||||
CONFIG="CONFIG+=debug"
|
||||
BIN_PATH=debug/bin
|
||||
else
|
||||
echo "Valid build types are release, release-static, release-android, debug-android and debug"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
|
||||
source ./utils.sh
|
||||
pushd $(pwd)
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
MONERO_DIR=monero
|
||||
MONEROD_EXEC=monerod
|
||||
|
||||
MAKE='make'
|
||||
if [[ $platform == *bsd* ]]; then
|
||||
MAKE='gmake'
|
||||
fi
|
||||
|
||||
# build libwallet
|
||||
$SHELL get_libwallet_api.sh $BUILD_TYPE
|
||||
|
||||
# build zxcvbn
|
||||
$MAKE -C src/zxcvbn-c || exit
|
||||
|
||||
if [ ! -d build ]; then mkdir build; fi
|
||||
|
||||
|
||||
# Platform indepenent settings
|
||||
if [ "$ANDROID" != true ] && ([ "$platform" == "linux32" ] || [ "$platform" == "linux64" ]); then
|
||||
distro=$(lsb_release -is)
|
||||
if [ "$distro" == "Ubuntu" ]; then
|
||||
CONFIG="$CONFIG libunwind_off"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$platform" == "darwin" ]; then
|
||||
BIN_PATH=$BIN_PATH/monero-wallet-gui.app/Contents/MacOS/
|
||||
elif [ "$platform" == "mingw64" ] || [ "$platform" == "mingw32" ]; then
|
||||
MONEROD_EXEC=monerod.exe
|
||||
fi
|
||||
|
||||
# force version update
|
||||
get_tag
|
||||
echo "var GUI_VERSION = \"$TAGNAME\"" > version.js
|
||||
pushd "$MONERO_DIR"
|
||||
get_tag
|
||||
popd
|
||||
echo "var GUI_MONERO_VERSION = \"$TAGNAME\"" >> version.js
|
||||
|
||||
cd build
|
||||
qmake ../monero-wallet-gui.pro "$CONFIG" || exit
|
||||
$MAKE || exit
|
||||
|
||||
# Copy monerod to bin folder
|
||||
if [ "$platform" != "mingw32" ] && [ "$ANDROID" != true ]; then
|
||||
cp ../$MONERO_DIR/bin/$MONEROD_EXEC $BIN_PATH
|
||||
fi
|
||||
|
||||
# make deploy
|
||||
popd
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
# MONERO_URL=https://github.com/monero-project/monero.git
|
||||
# MONERO_BRANCH=master
|
||||
CPU_CORE_COUNT=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
|
||||
pushd $(pwd)
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source $ROOT_DIR/utils.sh
|
||||
|
||||
|
||||
INSTALL_DIR=$ROOT_DIR/wallet
|
||||
MONERO_DIR=$ROOT_DIR/monero
|
||||
|
||||
|
||||
mkdir -p $MONERO_DIR/build/release
|
||||
pushd $MONERO_DIR/build/release
|
||||
|
||||
# reusing function from "utils.sh"
|
||||
platform=$(get_platform)
|
||||
|
||||
pushd $MONERO_DIR/build/release/src/wallet
|
||||
make -j$CPU_CORE_COUNT
|
||||
make install -j$CPU_CORE_COUNT
|
||||
popd
|
||||
|
||||
# unbound is one more dependency. can't be merged to the wallet_merged
|
||||
# since filename conflict (random.c.obj)
|
||||
# for Linux, we use libunbound shipped with the system, so we don't need to build it
|
||||
|
||||
if [ "$platform" != "linux" ]; then
|
||||
echo "Building libunbound..."
|
||||
pushd $MONERO_DIR/build/release/external/unbound
|
||||
# no need to make, it was already built as dependency for libwallet
|
||||
# make -j$CPU_CORE_COUNT
|
||||
make install -j$CPU_CORE_COUNT
|
||||
popd
|
||||
fi
|
||||
|
||||
popd
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
50
cmake/32-bit-toolchain.cmake
Normal file
50
cmake/32-bit-toolchain.cmake
Normal file
@@ -0,0 +1,50 @@
|
||||
# Copyright (c) 2014-2019, The Monero Project
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are
|
||||
# permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other
|
||||
# materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without specific
|
||||
# prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (NOT CMAKE_HOST_WIN32)
|
||||
set (CMAKE_SYSTEM_NAME Windows)
|
||||
endif()
|
||||
|
||||
set (GCC_PREFIX i686-w64-mingw32)
|
||||
set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc)
|
||||
set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++)
|
||||
set (CMAKE_AR ar CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_NM nm CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE)
|
||||
#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_RC_COMPILER windres)
|
||||
|
||||
set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw32")
|
||||
|
||||
# Ensure cmake doesn't find things in the wrong places
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target
|
||||
|
||||
set (MINGW_FLAG "-m32")
|
||||
set (USE_LTO_DEFAULT false)
|
||||
50
cmake/64-bit-toolchain.cmake
Normal file
50
cmake/64-bit-toolchain.cmake
Normal file
@@ -0,0 +1,50 @@
|
||||
# Copyright (c) 2014-2019, The Monero Project
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are
|
||||
# permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other
|
||||
# materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without specific
|
||||
# prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (NOT CMAKE_HOST_WIN32)
|
||||
set (CMAKE_SYSTEM_NAME Windows)
|
||||
endif()
|
||||
|
||||
set (GCC_PREFIX x86_64-w64-mingw32)
|
||||
set (CMAKE_C_COMPILER ${GCC_PREFIX}-gcc)
|
||||
set (CMAKE_CXX_COMPILER ${GCC_PREFIX}-g++)
|
||||
set (CMAKE_AR ar CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_NM nm CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_LINKER ld CACHE FILEPATH "" FORCE)
|
||||
#set (CMAKE_RANLIB ${GCC_PREFIX}-gcc-ranlib CACHE FILEPATH "" FORCE)
|
||||
set (CMAKE_RC_COMPILER windres)
|
||||
|
||||
set (CMAKE_FIND_ROOT_PATH "${MSYS2_FOLDER}/mingw64")
|
||||
|
||||
# Ensure cmake doesn't find things in the wrong places
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # Find programs on host
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # Find libs in target
|
||||
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Find includes in target
|
||||
|
||||
set (MINGW_FLAG "-m64")
|
||||
set (USE_LTO_DEFAULT false)
|
||||
14
cmake/CheckLinkerFlag.c
Normal file
14
cmake/CheckLinkerFlag.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifdef __CLASSIC_C__
|
||||
int main()
|
||||
{
|
||||
int ac;
|
||||
char* av[];
|
||||
#else
|
||||
int main(int ac, char* av[])
|
||||
{
|
||||
#endif
|
||||
if (ac > 1000) {
|
||||
return *av[0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
47
cmake/CheckLinkerFlag.cmake
Normal file
47
cmake/CheckLinkerFlag.cmake
Normal file
@@ -0,0 +1,47 @@
|
||||
include(CheckCCompilerFlag)
|
||||
|
||||
macro(CHECK_LINKER_FLAG flag VARIABLE)
|
||||
if(NOT DEFINED "${VARIABLE}")
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${flag} linker flag")
|
||||
endif()
|
||||
|
||||
set(_cle_source ${CMAKE_SOURCE_DIR}/cmake/CheckLinkerFlag.c)
|
||||
|
||||
set(saved_CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
|
||||
set(CMAKE_C_FLAGS "${flag}")
|
||||
try_compile(${VARIABLE}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${_cle_source}
|
||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${flag}
|
||||
CMAKE_FLAGS
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
unset(_cle_source)
|
||||
set(CMAKE_C_FLAGS ${saved_CMAKE_C_FLAGS})
|
||||
unset(saved_CMAKE_C_FLAGS)
|
||||
|
||||
if ("${OUTPUT}" MATCHES "warning.*ignored")
|
||||
set(${VARIABLE} 0)
|
||||
endif()
|
||||
|
||||
if(${VARIABLE})
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${flag} linker flag - found")
|
||||
endif()
|
||||
set(${VARIABLE} 1 CACHE INTERNAL "Have linker flag ${flag}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining if the ${flag} linker flag is supported "
|
||||
"passed with the following output:\n"
|
||||
"${OUTPUT}\n\n")
|
||||
else()
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${flag} linker flag - not found")
|
||||
endif()
|
||||
set(${VARIABLE} "" CACHE INTERNAL "Have linker flag ${flag}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining if the ${flag} linker flag is supported "
|
||||
"failed with the following output:\n"
|
||||
"${OUTPUT}\n\n")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
103
cmake/Deploy.cmake
Normal file
103
cmake/Deploy.cmake
Normal file
@@ -0,0 +1,103 @@
|
||||
if(APPLE OR (WIN32 AND NOT STATIC))
|
||||
add_custom_target(deploy)
|
||||
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
|
||||
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
|
||||
|
||||
if(APPLE AND NOT IOS)
|
||||
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND "${MACDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE_DIR:monero-wallet-gui>/../.." -always-overwrite -qmldir="${CMAKE_SOURCE_DIR}"
|
||||
COMMENT "Running macdeployqt..."
|
||||
)
|
||||
|
||||
# workaround for a Qt bug that requires manually adding libqsvg.dylib to bundle
|
||||
find_file(_qt_svg_dylib "libqsvg.dylib" PATHS "${CMAKE_PREFIX_PATH}/plugins/imageformats" NO_DEFAULT_PATH)
|
||||
if(_qt_svg_dylib)
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/ QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui. framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMENT "Copying libqsvg.dylib, running install_name_tool"
|
||||
)
|
||||
endif()
|
||||
|
||||
elseif(WIN32)
|
||||
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
|
||||
add_custom_command(TARGET monero-wallet-gui POST_BUILD
|
||||
COMMAND "${CMAKE_COMMAND}" -E env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}" "$<TARGET_FILE:monero-wallet-gui>" -no-translations -qmldir="${CMAKE_SOURCE_DIR}"
|
||||
COMMENT "Running windeployqt..."
|
||||
)
|
||||
set(WIN_DEPLOY_DLLS
|
||||
libboost_chrono-mt.dll
|
||||
libboost_filesystem-mt.dll
|
||||
libboost_locale-mt.dll
|
||||
libboost_program_options-mt.dll
|
||||
libboost_regex-mt.dll
|
||||
libboost_serialization-mt.dll
|
||||
libboost_thread-mt.dll
|
||||
libprotobuf.dll
|
||||
libbrotlicommon.dll
|
||||
libbrotlidec.dll
|
||||
libusb-1.0.dll
|
||||
zlib1.dll
|
||||
libzstd.dll
|
||||
libwinpthread-1.dll
|
||||
libtiff-5.dll
|
||||
libstdc++-6.dll
|
||||
libpng16-16.dll
|
||||
libpcre16-0.dll
|
||||
libpcre-1.dll
|
||||
libmng-2.dll
|
||||
liblzma-5.dll
|
||||
liblcms2-2.dll
|
||||
libjpeg-8.dll
|
||||
libintl-8.dll
|
||||
libiconv-2.dll
|
||||
libharfbuzz-0.dll
|
||||
libgraphite2.dll
|
||||
libglib-2.0-0.dll
|
||||
libfreetype-6.dll
|
||||
libbz2-1.dll
|
||||
libssp-0.dll
|
||||
libpcre2-16-0.dll
|
||||
libhidapi-0.dll
|
||||
libdouble-conversion.dll
|
||||
libgcrypt-20.dll
|
||||
libgpg-error-0.dll
|
||||
libsodium-23.dll
|
||||
libzmq.dll
|
||||
#platform files
|
||||
libgcc_s_seh-1.dll
|
||||
#openssl files
|
||||
libssl-1_1-x64.dll
|
||||
libcrypto-1_1-x64.dll
|
||||
)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudtd67.dll
|
||||
libicuind67.dll
|
||||
libicuiod67.dll
|
||||
libicutud67.dll
|
||||
libicuucd67.dll
|
||||
)
|
||||
else() # assume release
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudt67.dll
|
||||
libicuin67.dll
|
||||
libicuio67.dll
|
||||
libicutu67.dll
|
||||
libicuuc67.dll
|
||||
)
|
||||
endif()
|
||||
list(TRANSFORM WIN_DEPLOY_DLLS PREPEND "$ENV{MSYSTEM_PREFIX}/bin/")
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${WIN_DEPLOY_DLLS} "$<TARGET_FILE_DIR:monero-wallet-gui>"
|
||||
COMMENT "Copying DLLs to target folder"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
56
cmake/FindCcache.cmake
Normal file
56
cmake/FindCcache.cmake
Normal file
@@ -0,0 +1,56 @@
|
||||
# Copyright (c) 2014-2020, The Monero Project
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are
|
||||
# permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other
|
||||
# materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without specific
|
||||
# prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
# - Try to find readline include dirs and libraries
|
||||
#
|
||||
# Automatically finds ccache build accelerator, if it's found in PATH.
|
||||
#
|
||||
# Usage of this module as follows:
|
||||
#
|
||||
# project(monero)
|
||||
# include(FindCcache) # Include AFTER the project() macro to be able to reach the CMAKE_CXX_COMPILER variable
|
||||
#
|
||||
# Properties modified by this module:
|
||||
#
|
||||
# GLOBAL PROPERTY RULE_LAUNCH_COMPILE set to ccache, when ccache found
|
||||
# GLOBAL PROPERTY RULE_LAUNCH_LINK set to ccache, when ccache found
|
||||
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if (CCACHE_FOUND)
|
||||
set(TEMP_CPP_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test-program.cpp")
|
||||
file(WRITE "${TEMP_CPP_FILE}" "int main() { return 0; }")
|
||||
execute_process(COMMAND "${CCACHE_FOUND}" "${CMAKE_CXX_COMPILER}" "${TEMP_CPP_FILE}" RESULT_VARIABLE RET)
|
||||
if (${RET} EQUAL 0)
|
||||
message("found usable ccache: ${CCACHE_FOUND}")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_FOUND}")
|
||||
else()
|
||||
message("found ccache ${CCACHE_FOUND}, but is UNUSABLE! Return code: ${RET}")
|
||||
endif()
|
||||
else()
|
||||
message("ccache NOT found!")
|
||||
endif()
|
||||
60
cmake/FindHIDAPI.cmake
Normal file
60
cmake/FindHIDAPI.cmake
Normal file
@@ -0,0 +1,60 @@
|
||||
# - try to find HIDAPI library
|
||||
# from http://www.signal11.us/oss/hidapi/
|
||||
#
|
||||
# Cache Variables: (probably not for direct use in your scripts)
|
||||
# HIDAPI_INCLUDE_DIR
|
||||
# HIDAPI_LIBRARY
|
||||
#
|
||||
# Non-cache variables you might use in your CMakeLists.txt:
|
||||
# HIDAPI_FOUND
|
||||
# HIDAPI_INCLUDE_DIRS
|
||||
# HIDAPI_LIBRARIES
|
||||
#
|
||||
# Requires these CMake modules:
|
||||
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
|
||||
#
|
||||
# Original Author:
|
||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||
# http://academic.cleardefinition.com
|
||||
# Iowa State University HCI Graduate Program/VRAC
|
||||
#
|
||||
# Copyright Iowa State University 2009-2010.
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
find_library(HIDAPI_LIBRARY
|
||||
NAMES hidapi hidapi-libusb)
|
||||
|
||||
find_path(HIDAPI_INCLUDE_DIR
|
||||
NAMES hidapi.h
|
||||
PATH_SUFFIXES
|
||||
hidapi)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(HIDAPI
|
||||
DEFAULT_MSG
|
||||
HIDAPI_LIBRARY
|
||||
HIDAPI_INCLUDE_DIR)
|
||||
|
||||
if(HIDAPI_FOUND)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARY}")
|
||||
if((STATIC AND UNIX AND NOT APPLE) OR (DEPENDS AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
|
||||
find_library(LIBUSB-1.0_LIBRARY usb-1.0)
|
||||
find_library(LIBUDEV_LIBRARY udev)
|
||||
if(LIBUSB-1.0_LIBRARY)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARIES};${LIBUSB-1.0_LIBRARY}")
|
||||
if(LIBUDEV_LIBRARY)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARIES};${LIBUDEV_LIBRARY}")
|
||||
else()
|
||||
message(WARNING "libudev library not found, binaries may fail to link.")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "libusb-1.0 library not found, binaries may fail to link.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(HIDAPI_INCLUDE_DIRS "${HIDAPI_INCLUDE_DIR}")
|
||||
endif()
|
||||
|
||||
mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_LIBRARY)
|
||||
149
cmake/FindLibUSB.cmake
Normal file
149
cmake/FindLibUSB.cmake
Normal file
@@ -0,0 +1,149 @@
|
||||
# - Find libusb for portable USB support
|
||||
# This module will find libusb as published by
|
||||
# http://libusb.sf.net and
|
||||
# http://libusb-win32.sf.net
|
||||
#
|
||||
# It will use PkgConfig if present and supported, else search
|
||||
# it on its own. If the LibUSB_ROOT_DIR environment variable
|
||||
# is defined, it will be used as base path.
|
||||
# The following standard variables get defined:
|
||||
# LibUSB_FOUND: true if LibUSB was found
|
||||
# LibUSB_HEADER_FILE: the location of the C header file
|
||||
# LibUSB_INCLUDE_DIRS: the directory that contains the include file
|
||||
# LibUSB_LIBRARIES: the library
|
||||
# source: https://github.com/IntelRealSense/librealsense
|
||||
|
||||
include ( CheckLibraryExists )
|
||||
include ( CheckIncludeFile )
|
||||
|
||||
find_package ( PkgConfig )
|
||||
if ( PKG_CONFIG_FOUND )
|
||||
pkg_check_modules ( PKGCONFIG_LIBUSB libusb-1.0 )
|
||||
if ( NOT PKGCONFIG_LIBUSB_FOUND )
|
||||
pkg_check_modules ( PKGCONFIG_LIBUSB libusb )
|
||||
endif ( NOT PKGCONFIG_LIBUSB_FOUND )
|
||||
endif ( PKG_CONFIG_FOUND )
|
||||
|
||||
if ( PKGCONFIG_LIBUSB_FOUND )
|
||||
set ( LibUSB_INCLUDE_DIRS ${PKGCONFIG_LIBUSB_INCLUDE_DIRS} )
|
||||
foreach ( i ${PKGCONFIG_LIBUSB_LIBRARIES} )
|
||||
string ( REGEX MATCH "[^-]*" ibase "${i}" )
|
||||
find_library ( ${ibase}_LIBRARY
|
||||
NAMES ${i}
|
||||
PATHS ${PKGCONFIG_LIBUSB_LIBRARY_DIRS}
|
||||
)
|
||||
if ( ${ibase}_LIBRARY )
|
||||
list ( APPEND LibUSB_LIBRARIES ${${ibase}_LIBRARY} )
|
||||
endif ( ${ibase}_LIBRARY )
|
||||
mark_as_advanced ( ${ibase}_LIBRARY )
|
||||
endforeach ( i )
|
||||
|
||||
else ( PKGCONFIG_LIBUSB_FOUND )
|
||||
find_file ( LibUSB_HEADER_FILE
|
||||
NAMES
|
||||
libusb.h usb.h
|
||||
PATHS
|
||||
$ENV{ProgramFiles}/LibUSB-Win32
|
||||
$ENV{LibUSB_ROOT_DIR}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
libusb-1.0
|
||||
include/libusb-1.0
|
||||
)
|
||||
mark_as_advanced ( LibUSB_HEADER_FILE )
|
||||
get_filename_component ( LibUSB_INCLUDE_DIRS "${LibUSB_HEADER_FILE}" PATH )
|
||||
|
||||
if ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
|
||||
# LibUSB-Win32 binary distribution contains several libs.
|
||||
# Use the lib that got compiled with the same compiler.
|
||||
if ( MSVC )
|
||||
if ( WIN32 )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/msvc )
|
||||
else ( WIN32 )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/msvc_x64 )
|
||||
endif ( WIN32 )
|
||||
elseif ( BORLAND )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/bcc )
|
||||
elseif ( CMAKE_COMPILER_IS_GNUCC )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/gcc )
|
||||
endif ( MSVC )
|
||||
endif ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
|
||||
|
||||
find_library ( usb_LIBRARY
|
||||
NAMES
|
||||
usb-1.0 libusb usb
|
||||
PATHS
|
||||
$ENV{ProgramFiles}/LibUSB-Win32
|
||||
$ENV{LibUSB_ROOT_DIR}
|
||||
PATH_SUFFIXES
|
||||
${LibUSB_LIBRARY_PATH_SUFFIX}
|
||||
)
|
||||
mark_as_advanced ( usb_LIBRARY )
|
||||
if ( usb_LIBRARY )
|
||||
set ( LibUSB_LIBRARIES ${usb_LIBRARY} )
|
||||
endif ( usb_LIBRARY )
|
||||
|
||||
endif ( PKGCONFIG_LIBUSB_FOUND )
|
||||
|
||||
if ( LibUSB_INCLUDE_DIRS AND LibUSB_LIBRARIES )
|
||||
set ( LibUSB_FOUND true )
|
||||
endif ( LibUSB_INCLUDE_DIRS AND LibUSB_LIBRARIES )
|
||||
|
||||
if ( LibUSB_FOUND )
|
||||
set ( CMAKE_REQUIRED_INCLUDES "${LibUSB_INCLUDE_DIRS}" )
|
||||
check_include_file ( "${LibUSB_HEADER_FILE}" LibUSB_FOUND )
|
||||
endif ( LibUSB_FOUND )
|
||||
|
||||
if ( LibUSB_FOUND )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" usb_open "" LibUSB_FOUND )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" libusb_get_device_list "" LibUSB_VERSION_1.0 )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" libusb_get_port_numbers "" LibUSB_VERSION_1.0.16 )
|
||||
|
||||
if((STATIC AND UNIX AND NOT APPLE) OR (DEPENDS AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
|
||||
find_library(LIBUDEV_LIBRARY udev)
|
||||
if(LIBUDEV_LIBRARY)
|
||||
set(LibUSB_LIBRARIES "${LibUSB_LIBRARIES};${LIBUDEV_LIBRARY}")
|
||||
else()
|
||||
message(WARNING "libudev library not found, binaries may fail to link.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Library 1.0.16+ compilation test.
|
||||
# The check_library_exists does not work well on Apple with shared libs.
|
||||
if (APPLE OR LibUSB_VERSION_1.0.16 OR STATIC)
|
||||
if (APPLE)
|
||||
if(DEPENDS)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES "-framework Foundation -framework IOKit")
|
||||
else()
|
||||
find_library(COREFOUNDATION CoreFoundation)
|
||||
find_library(IOKIT IOKit)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${IOKIT})
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${COREFOUNDATION})
|
||||
endif()
|
||||
endif()
|
||||
if (WIN32)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES setupapi)
|
||||
endif()
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${LibUSB_LIBRARIES})
|
||||
|
||||
try_compile(LibUSB_COMPILE_TEST_PASSED
|
||||
${CMAKE_BINARY_DIR}
|
||||
"${CMAKE_SOURCE_DIR}/cmake/test-libusb-version.c"
|
||||
CMAKE_FLAGS
|
||||
"-DINCLUDE_DIRECTORIES=${LibUSB_INCLUDE_DIRS}"
|
||||
"-DLINK_DIRECTORIES=${LibUSB_LIBRARIES}"
|
||||
LINK_LIBRARIES ${TEST_COMPILE_EXTRA_LIBRARIES}
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
unset(TEST_COMPILE_EXTRA_LIBRARIES)
|
||||
message(STATUS "LibUSB Compilation test: ${LibUSB_COMPILE_TEST_PASSED}")
|
||||
endif()
|
||||
endif ( LibUSB_FOUND )
|
||||
|
||||
if ( NOT LibUSB_FOUND )
|
||||
if ( NOT LibUSB_FIND_QUIETLY )
|
||||
message ( STATUS "LibUSB not found, try setting LibUSB_ROOT_DIR environment variable." )
|
||||
endif ( NOT LibUSB_FIND_QUIETLY )
|
||||
if ( LibUSB_FIND_REQUIRED )
|
||||
message ( FATAL_ERROR "" )
|
||||
endif ( LibUSB_FIND_REQUIRED )
|
||||
endif ( NOT LibUSB_FOUND )
|
||||
38
cmake/FindZBar0.cmake
Normal file
38
cmake/FindZBar0.cmake
Normal file
@@ -0,0 +1,38 @@
|
||||
# from http://code.google.com/p/low-cost-vision-2012/source/browse/CMakeModules/FindZBar0.cmake?name=2-helium-1&r=d61f248bd5565b3c086bf4769a04bfd98f7079df
|
||||
# - Try to find ZBar
|
||||
# This will define
|
||||
#
|
||||
# ZBAR_FOUND -
|
||||
# ZBAR_LIBRARY_DIR -
|
||||
# ZBAR_INCLUDE_DIR -
|
||||
# ZBAR_LIBRARIES -
|
||||
#
|
||||
|
||||
find_package(PkgConfig)
|
||||
if(PkgConfig_FOUND)
|
||||
pkg_check_modules(PC_ZBAR QUIET zbar)
|
||||
if(PC_ZBAR_FOUND)
|
||||
set(ZBAR_DEFINITIONS ${PC_ZBAR_CFLAGS_OTHER})
|
||||
find_library(ZBAR_LIBRARIES NAMES zbar HINTS ${PC_ZBAR_LIBDIR} ${PC_ZBAR_LIBRARY_DIRS})
|
||||
find_path(ZBAR_INCLUDE_DIR Decoder.h HINTS ${PC_ZBAR_INCLUDEDIR} ${PC_ZBAR_INCLUDE_DIRS} PATH_SUFFIXES zbar)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ZBAR_LIBRARIES AND ANDROID)
|
||||
find_library(ZBARJNI_LIBRARY NAMES zbarjni)
|
||||
find_library(ICONV_LIBRARY NAMES iconv)
|
||||
if(ZBARJNI_LIBRARY AND ICONV_LIBRARY)
|
||||
set(ZBAR_LIBRARIES ${ZBARJNI_LIBRARY} ${ICONV_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ZBAR_INCLUDE_DIR)
|
||||
find_path(ZBAR_H_PATH zbar.h)
|
||||
if(ZBAR_H_PATH)
|
||||
set(ZBAR_INCLUDE_DIR "${ZBAR_H_PATH}/zbar")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(ZBAR DEFAULT_MSG ZBAR_LIBRARIES ZBAR_INCLUDE_DIR)
|
||||
message(STATUS "Found zbar libraries ${ZBAR_LIBRARIES}")
|
||||
67
cmake/GitGetVersionTag.cmake
Normal file
67
cmake/GitGetVersionTag.cmake
Normal file
@@ -0,0 +1,67 @@
|
||||
# Copyright (c) 2014-2019, The Monero Project
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are
|
||||
# permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other
|
||||
# materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without specific
|
||||
# prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
|
||||
|
||||
function (git_get_version_tag git directory result_var)
|
||||
execute_process(COMMAND "${git}" rev-parse --short HEAD
|
||||
WORKING_DIRECTORY ${directory}
|
||||
OUTPUT_VARIABLE COMMIT
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(NOT COMMIT)
|
||||
message(WARNING "${directory}: cannot determine current commit. Make sure that you are building from a Git working tree")
|
||||
set(${result_var} "unknown" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND "${git}" describe --tags --exact-match
|
||||
WORKING_DIRECTORY ${directory}
|
||||
OUTPUT_VARIABLE TAG
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(TAG)
|
||||
message(STATUS "${directory}: building tagged release ${TAG}-${COMMIT}")
|
||||
set(${result_var} "${TAG}-${COMMIT}" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND "${git}" describe --tags --long
|
||||
WORKING_DIRECTORY ${directory}
|
||||
OUTPUT_VARIABLE MOST_RECENT_TAG
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(MOST_RECENT_TAG)
|
||||
message(STATUS "${directory}: ahead of or behind a tagged release, building ${MOST_RECENT_TAG}")
|
||||
set(${result_var} "${MOST_RECENT_TAG}" PARENT_SCOPE)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "${directory}: building ${COMMIT} commit")
|
||||
set(${result_var} "${COMMIT}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
49
cmake/VersionGui.cmake
Normal file
49
cmake/VersionGui.cmake
Normal file
@@ -0,0 +1,49 @@
|
||||
# Copyright (c) 2014-2019, The Monero Project
|
||||
#
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification, are
|
||||
# permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other
|
||||
# materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without specific
|
||||
# prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
function (write_static_version_header VERSION_TAG_GUI)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/version.js.in" "${CMAKE_CURRENT_SOURCE_DIR}/version.js")
|
||||
endfunction ()
|
||||
|
||||
find_package(Git QUIET)
|
||||
if ("$Format:$" STREQUAL "")
|
||||
# We're in a tarball; use hard-coded variables.
|
||||
write_static_version_header("release")
|
||||
elseif (GIT_FOUND OR Git_FOUND)
|
||||
message(STATUS "Found Git: ${GIT_EXECUTABLE}")
|
||||
|
||||
include(GitGetVersionTag)
|
||||
git_get_version_tag(${GIT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR} VERSION_TAG_GUI)
|
||||
STRING(REGEX REPLACE "^v([0-9])" "\\1" VERSION_TAG_GUI ${VERSION_TAG_GUI})
|
||||
write_static_version_header(${VERSION_TAG_GUI})
|
||||
else()
|
||||
message(STATUS "WARNING: Git was not found!")
|
||||
write_static_version_header("unknown")
|
||||
endif ()
|
||||
add_custom_target(genversiongui ALL
|
||||
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/version.js")
|
||||
52
cmake/test-libusb-version.c
Normal file
52
cmake/test-libusb-version.c
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <libusb.h>
|
||||
|
||||
#define UNUSED(expr) (void)(expr)
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
libusb_device **devs;
|
||||
libusb_context *ctx = NULL;
|
||||
|
||||
int r = libusb_init(&ctx); UNUSED(r);
|
||||
ssize_t cnt = libusb_get_device_list(ctx, &devs); UNUSED(cnt);
|
||||
|
||||
struct libusb_device_descriptor desc;
|
||||
r = libusb_get_device_descriptor(devs[0], &desc); UNUSED(r);
|
||||
uint8_t bus_id = libusb_get_bus_number(devs[0]); UNUSED(bus_id);
|
||||
uint8_t addr = libusb_get_device_address(devs[0]); UNUSED(addr);
|
||||
|
||||
uint8_t tmp_path[16];
|
||||
r = libusb_get_port_numbers(devs[0], tmp_path, sizeof(tmp_path));
|
||||
UNUSED(r);
|
||||
UNUSED(tmp_path);
|
||||
|
||||
libusb_free_device_list(devs, 1);
|
||||
libusb_exit(ctx);
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
|
||||
footer: Rectangle {
|
||||
height: 127
|
||||
width: listView.width
|
||||
color: "#FFFFFF"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
property var previousItem
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: 64
|
||||
width: listView.width
|
||||
color: index % 2 ? "#F8F8F8" : "#FFFFFF"
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
Text {
|
||||
id: descriptionText
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 12
|
||||
width: text.length ? (descriptionArea.containsMouse ? dropdown.x - x - 12 : 139) : 0
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 19
|
||||
color: "#444444"
|
||||
elide: Text.ElideRight
|
||||
text: description
|
||||
|
||||
MouseArea {
|
||||
id: descriptionArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
}
|
||||
}
|
||||
|
||||
TextEdit {
|
||||
id: addressText
|
||||
selectByMouse: true
|
||||
anchors.bottom: descriptionText.bottom
|
||||
anchors.left: descriptionText.right
|
||||
anchors.right: dropdown.left
|
||||
anchors.leftMargin: description.length > 0 ? 12 : 0
|
||||
anchors.rightMargin: 40
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 16
|
||||
color: "#545454"
|
||||
text: address
|
||||
}
|
||||
|
||||
Text {
|
||||
id: paymentLabel
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 12
|
||||
|
||||
width: 139
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#535353"
|
||||
text: qsTr("Payment ID:") + translationManager.emptyString
|
||||
}
|
||||
|
||||
TextEdit {
|
||||
selectByMouse: true;
|
||||
anchors.bottom: paymentLabel.bottom
|
||||
anchors.left: paymentLabel.right
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 12
|
||||
anchors.right: dropdown.left
|
||||
|
||||
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 13
|
||||
color: "#545454"
|
||||
text: paymentId
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: dropModel
|
||||
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
// ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
ListElement { name: "<b>Remove from address book</b>"; icon: "../images/dropdownDel.png" }
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
TableDropdown {
|
||||
id: dropdown
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.rightMargin: 5
|
||||
dataModel: dropModel
|
||||
z: 1
|
||||
onExpandedChanged: {
|
||||
if(expanded) {
|
||||
listView.previousItem = delegate
|
||||
listView.currentIndex = index
|
||||
}
|
||||
}
|
||||
onOptionClicked: {
|
||||
// Ensure tooltip is closed
|
||||
appWindow.toolTip.visible = false;
|
||||
if(option === 0)
|
||||
clipboard.setText(address)
|
||||
else if(option === 1){
|
||||
console.log("Sending to: ", address +" "+ paymentId);
|
||||
middlePanel.sendTo(address, paymentId, description);
|
||||
leftPanel.selectItem(middlePanel.state)
|
||||
} else if(option === 2){
|
||||
console.log("Delete: ", rowId);
|
||||
currentWallet.addressBookModel.deleteRow(rowId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
}
|
||||
106
components/AdvancedOptionsItem.qml
Normal file
106
components/AdvancedOptionsItem.qml
Normal file
@@ -0,0 +1,106 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
RowLayout {
|
||||
id: advancedOptionsItem
|
||||
|
||||
property alias title: title.text
|
||||
property alias button1: button1
|
||||
property alias button2: button2
|
||||
property alias button3: button3
|
||||
property alias helpTextLarge: helpTextLarge
|
||||
property alias helpTextSmall: helpTextSmall
|
||||
|
||||
RowLayout {
|
||||
id: titlecolumn
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
Layout.preferredWidth: 195
|
||||
Layout.maximumWidth: 195
|
||||
Layout.leftMargin: 10
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: title
|
||||
fontSize: 14
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: iconLabel
|
||||
fontSize: 12
|
||||
text: FontAwesome.questionCircle
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
opacity: 0.3
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: helpText.visible = !helpText.visible
|
||||
onEntered: parent.opacity = 0.4
|
||||
onExited: parent.opacity = 0.3
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: separator
|
||||
Layout.fillWidth: true
|
||||
height: 10
|
||||
color: "transparent"
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: false
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
spacing: 4
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: false
|
||||
spacing: 12
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
StandardButton {
|
||||
id: button1
|
||||
small: true
|
||||
visible: button1.text
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
id: button2
|
||||
small: true
|
||||
visible: button2.text
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
id: button3
|
||||
small: true
|
||||
visible: button3.text
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: helpText
|
||||
visible: false
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: helpTextLarge
|
||||
visible: helpTextLarge.text
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 13
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: helpTextSmall
|
||||
visible: helpTextSmall.text
|
||||
Layout.leftMargin: 5
|
||||
textFormat: Text.RichText
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 12
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
47
components/CMakeLists.txt
Normal file
47
components/CMakeLists.txt
Normal file
@@ -0,0 +1,47 @@
|
||||
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
###
|
||||
|
||||
#configure_file(${CMAKE_CURRENT_SOURCE_DIR}/defines.h.cmake
|
||||
# ${CMAKE_CURRENT_BINARY_DIR}/defines.h)
|
||||
|
||||
file(GLOB_RECURSE UI_FILES *.ui)
|
||||
file(GLOB_RECURSE CODE_FILES *.cpp)
|
||||
|
||||
qt5_wrap_ui(UI_HEADERS ${UI_FILES})
|
||||
#qt5_add_resources(RESOURCE_FILES ../resources/resources.qrc)
|
||||
|
||||
# Windows application icon
|
||||
if (WIN32)
|
||||
set(WINDOWS_RES_FILE ${CMAKE_CURRENT_BINARY_DIR}/resources.obj)
|
||||
if (MSVC)
|
||||
add_custom_command(OUTPUT ${WINDOWS_RES_FILE}
|
||||
COMMAND rc.exe /fo ${WINDOWS_RES_FILE} resources.rc
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/win
|
||||
)
|
||||
else()
|
||||
add_custom_command(OUTPUT ${WINDOWS_RES_FILE}
|
||||
COMMAND windres.exe resources.rc ${WINDOWS_RES_FILE}
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/win
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_executable(${CMAKE_PROJECT_NAME} WIN32
|
||||
${UI_HEADERS}
|
||||
${CODE_FILES}
|
||||
${RESOURCE_FILES}
|
||||
${WINDOWS_RES_FILE}
|
||||
)
|
||||
target_link_libraries(${CMAKE_PROJECT_NAME}
|
||||
Qt5::Widgets
|
||||
)
|
||||
|
||||
if (UNIX)
|
||||
install(TARGETS ${CMAKE_PROJECT_NAME}
|
||||
RUNTIME DESTINATION bin)
|
||||
elseif (WIN32)
|
||||
install(TARGETS ${CMAKE_PROJECT_NAME}
|
||||
DESTINATION .)
|
||||
endif()
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,64 +26,98 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Item {
|
||||
id: checkBox
|
||||
property alias text: label.text
|
||||
property string checkedIcon
|
||||
property string checkedIcon: "qrc:///images/check-white.svg"
|
||||
property string uncheckedIcon
|
||||
property bool fontAwesomeIcons: false
|
||||
property int imgWidth: 13
|
||||
property int imgHeight: 13
|
||||
property bool toggleOnClick: true
|
||||
property bool checked: false
|
||||
property alias background: backgroundRect.color
|
||||
property bool border: true
|
||||
property int fontSize: 14
|
||||
property alias fontColor: label.color
|
||||
property bool iconOnTheLeft: true
|
||||
signal clicked()
|
||||
height: 25
|
||||
width: label.x + label.width
|
||||
Layout.minimumWidth: label.x + label.contentWidth
|
||||
clip: true
|
||||
width: checkBoxLayout.width
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
height: parent.height - 1
|
||||
width: 25
|
||||
//radius: 4
|
||||
y: 0
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: backgroundRect
|
||||
anchors.left: parent.left
|
||||
height: parent.height - 1
|
||||
width: 25
|
||||
//radius: 4
|
||||
y: 1
|
||||
color: "#FFFFFF"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: checkBox.checked ? checkBox.checkedIcon :
|
||||
checkBox.uncheckedIcon
|
||||
function toggle(){
|
||||
if (checkBox.toggleOnClick) {
|
||||
checkBox.checked = !checkBox.checked
|
||||
}
|
||||
checkBox.clicked()
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 25 + 12
|
||||
font.family: "Arial"
|
||||
font.pixelSize: checkBox.fontSize
|
||||
color: "#525252"
|
||||
RowLayout {
|
||||
id: checkBoxLayout
|
||||
layoutDirection: iconOnTheLeft ? Qt.LeftToRight : Qt.RightToLeft
|
||||
spacing: 10
|
||||
|
||||
Item {
|
||||
id: checkMark
|
||||
height: checkBox.height
|
||||
width: checkBox.height
|
||||
|
||||
Rectangle {
|
||||
id: backgroundRect
|
||||
visible: checkBox.border
|
||||
anchors.fill: parent
|
||||
radius: 3
|
||||
color: checkBox.enabled ? "transparent" : MoneroComponents.Style.inputBoxBackgroundDisabled
|
||||
border.color:
|
||||
if(checkBox.checked){
|
||||
return MoneroComponents.Style.inputBorderColorActive;
|
||||
} else {
|
||||
return MoneroComponents.Style.inputBorderColorInActive;
|
||||
}
|
||||
}
|
||||
|
||||
MoneroEffects.ImageMask {
|
||||
id: img
|
||||
visible: checkBox.checked || checkBox.uncheckedIcon != ""
|
||||
anchors.centerIn: parent
|
||||
width: checkBox.imgWidth
|
||||
height: checkBox.imgHeight
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackIcon: checkBox.fontAwesomeIcons ? getIcon() : FontAwesome.plus
|
||||
fontAwesomeFallbackSize: 14
|
||||
image: checkBox.fontAwesomeIcons ? "" : getIcon()
|
||||
|
||||
function getIcon() {
|
||||
if (checkBox.checked || checkBox.uncheckedIcon == "")
|
||||
return checkBox.checkedIcon;
|
||||
return checkBox.uncheckedIcon;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: checkBox.fontSize
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.NoWrap
|
||||
visible: text != ""
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
checkBox.checked = !checkBox.checked
|
||||
checkBox.clicked()
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
110
components/CheckBox2.qml
Normal file
110
components/CheckBox2.qml
Normal file
@@ -0,0 +1,110 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "." 1.0
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
RowLayout {
|
||||
id: checkBox
|
||||
property alias text: label.text
|
||||
property bool checked: false
|
||||
property int fontSize: 14
|
||||
property alias fontColor: label.color
|
||||
property int textMargin: 8
|
||||
signal clicked()
|
||||
height: 25
|
||||
|
||||
function toggle(){
|
||||
checkBox.checked = !checkBox.checked
|
||||
checkBox.clicked()
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
Rectangle{
|
||||
height: label.height
|
||||
width: (label.width + indicatorRect.width + checkBox.textMargin)
|
||||
color: "transparent"
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
font.family: Style.fontLight.name
|
||||
font.pixelSize: checkBox.fontSize
|
||||
color: Style.defaultFontColor
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true
|
||||
anchors.left: parent.left
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: indicatorRect
|
||||
width: indicatorImage.width
|
||||
height: label.height
|
||||
anchors.left: label.right
|
||||
anchors.leftMargin: textMargin
|
||||
color: "transparent"
|
||||
rotation: checkBox.checked ? 180 : 0
|
||||
|
||||
MoneroEffects.ImageMask {
|
||||
id: indicatorImage
|
||||
anchors.centerIn: parent
|
||||
width: 12
|
||||
height: 8
|
||||
image: "qrc:///images/whiteDropIndicator.png"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: MoneroComponents.Style.blackTheme ? 1 : 0.75
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowDown
|
||||
fontAwesomeFallbackSize: 14
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: indicatorImage
|
||||
blackColor: "white"
|
||||
whiteColor: "black"
|
||||
duration: 500
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
toggle();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
40
components/ContextMenu.qml
Normal file
40
components/ContextMenu.qml
Normal file
@@ -0,0 +1,40 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
import FontAwesome 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
MouseArea {
|
||||
signal paste()
|
||||
|
||||
id: root
|
||||
acceptedButtons: Qt.RightButton
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if (mouse.button === Qt.RightButton)
|
||||
contextMenu.open()
|
||||
}
|
||||
|
||||
Menu {
|
||||
id: contextMenu
|
||||
|
||||
background: Rectangle {
|
||||
border.color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
|
||||
border.width: 1
|
||||
radius: 2
|
||||
color: MoneroComponents.Style.buttonBackgroundColorDisabled
|
||||
}
|
||||
|
||||
padding: 1
|
||||
width: 100
|
||||
x: root.mouseX
|
||||
y: root.mouseY
|
||||
|
||||
MoneroComponents.ContextMenuItem {
|
||||
enabled: root.parent.canPaste === true
|
||||
glyphIcon: FontAwesome.paste
|
||||
onTriggered: root.paste()
|
||||
text: qsTr("Paste") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
}
|
||||
52
components/ContextMenuItem.qml
Normal file
52
components/ContextMenuItem.qml
Normal file
@@ -0,0 +1,52 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import FontAwesome 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
MenuItem {
|
||||
id: menuItem
|
||||
|
||||
property bool glyphIconSolid: true
|
||||
property alias glyphIcon: glyphIcon.text
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
|
||||
opacity: mouse.containsMouse ? 1 : 0
|
||||
|
||||
MouseArea {
|
||||
id: mouse
|
||||
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: menuItem.triggered()
|
||||
visible: menuItem.enabled
|
||||
}
|
||||
}
|
||||
|
||||
contentItem: RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 10
|
||||
anchors.rightMargin: 10
|
||||
opacity: menuItem.enabled ? 1 : 0.4
|
||||
spacing: 8
|
||||
|
||||
Text {
|
||||
id: glyphIcon
|
||||
|
||||
color: MoneroComponents.Style.buttonTextColor
|
||||
font.family: glyphIconSolid ? FontAwesome.fontFamilySolid : FontAwesome.fontFamily
|
||||
font.pixelSize: 14
|
||||
font.styleName: glyphIconSolid ? "Solid" : "Regular"
|
||||
}
|
||||
|
||||
Text {
|
||||
color: MoneroComponents.Style.buttonTextColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
Layout.fillWidth: true
|
||||
text: menuItem.text
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Window 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Window {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window | Qt.FramelessWindowHint
|
||||
property alias title: dialogTitle.text
|
||||
property alias text: dialogContent.text
|
||||
property alias content: root.text
|
||||
property alias okVisible: okButton.visible
|
||||
property alias textArea: dialogContent
|
||||
property var icon
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
|
||||
function open() {
|
||||
show()
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: 280
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
|
||||
RowLayout {
|
||||
id: column
|
||||
//anchors {fill: parent; margins: 16 }
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
Label {
|
||||
id: dialogTitle
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 32
|
||||
font.family: "Arial"
|
||||
color: "#555555"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
TextArea {
|
||||
id : dialogContent
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
font.family: "Arial"
|
||||
textFormat: TextEdit.AutoText
|
||||
readOnly: true
|
||||
font.pixelSize: 12
|
||||
}
|
||||
}
|
||||
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 60
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Close") + translationManager.emptyString
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.LineEdit {
|
||||
id: sendCommandText
|
||||
width: 300
|
||||
placeholderText: qsTr("command + enter (e.g help)") + translationManager.emptyString
|
||||
onAccepted: {
|
||||
if(text.length > 0)
|
||||
daemonManager.sendCommand(text,currentWallet.testnet);
|
||||
text = ""
|
||||
}
|
||||
}
|
||||
|
||||
// Status button
|
||||
// MoneroComponents.StandardButton {
|
||||
// id: sendCommandButton
|
||||
// enabled: sendCommandText.text.length > 0
|
||||
// fontSize: 14
|
||||
// shadowReleasedColor: "#FF4304"
|
||||
// shadowPressedColor: "#B32D00"
|
||||
// releasedColor: "#FF6C3C"
|
||||
// pressedColor: "#FF4304"
|
||||
// text: qsTr("Send command")
|
||||
// onClicked: {
|
||||
// daemonManager.sendCommand(sendCommandText.text,currentWallet.testnet);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,7 +26,7 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
@@ -39,13 +39,13 @@ Window {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window | Qt.FramelessWindowHint
|
||||
property int countDown: 5;
|
||||
property int countDown: 10;
|
||||
signal rejected()
|
||||
signal started();
|
||||
|
||||
function open() {
|
||||
show()
|
||||
countDown = 5;
|
||||
countDown = 10;
|
||||
timer.start();
|
||||
}
|
||||
|
||||
@@ -89,12 +89,14 @@ Window {
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("Starting Monero daemon in %1 seconds").arg(countDown);
|
||||
MoneroComponents.TextPlain {
|
||||
text: qsTr("Starting local node in %1 seconds").arg(countDown) + translationManager.emptyString;
|
||||
font.pixelSize: 18
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
themeTransition: false
|
||||
color: "black"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -108,11 +110,7 @@ Window {
|
||||
id: okButton
|
||||
visible:false
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Start daemon (%1)").arg(countDown)
|
||||
text: qsTr("Start daemon (%1)").arg(countDown) + translationManager.emptyString
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
timer.stop();
|
||||
@@ -125,11 +123,7 @@ Window {
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Use custom settings")
|
||||
text: qsTr("Use custom settings") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
timer.stop();
|
||||
|
||||
@@ -1,252 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
|
||||
footer: Rectangle {
|
||||
height: 127
|
||||
width: listView.width
|
||||
color: "#FFFFFF"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
property var previousItem
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: 90
|
||||
width: listView.width
|
||||
color: index % 2 ? "#F8F8F8" : "#FFFFFF"
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 14
|
||||
|
||||
Rectangle {
|
||||
id: dot
|
||||
width: 14
|
||||
height: width
|
||||
radius: width / 2
|
||||
color: out ? "#FF4F41" : "#36B05B"
|
||||
}
|
||||
|
||||
Item { //separator
|
||||
width: 12
|
||||
height: 14
|
||||
}
|
||||
|
||||
Text {
|
||||
id: descriptionText
|
||||
width: text.length ? (descriptionArea.containsMouse ? parent.width - x - 12 : 120) : 0
|
||||
anchors.verticalCenter: dot.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 19
|
||||
color: "#444444"
|
||||
elide: Text.ElideRight
|
||||
text: description
|
||||
|
||||
MouseArea {
|
||||
id: descriptionArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
}
|
||||
}
|
||||
|
||||
Item { //separator
|
||||
width: descriptionText.width ? 12 : 0
|
||||
height: 14
|
||||
visible: !descriptionArea.containsMouse
|
||||
}
|
||||
|
||||
Text {
|
||||
id: addressText
|
||||
anchors.verticalCenter: dot.verticalCenter
|
||||
width: parent.width - x - 12
|
||||
elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
text: address
|
||||
visible: !descriptionArea.containsMouse
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.top: row1.bottom
|
||||
anchors.topMargin: 8
|
||||
spacing: 12
|
||||
|
||||
Item { //separator
|
||||
width: 14
|
||||
height: 14
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 215
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Date") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
spacing: 33
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: date
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: time
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 148
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: balance
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 148
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Amount") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
spacing: 2
|
||||
Text {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 3
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 16
|
||||
color: out ? "#FF4F41" : "#36B05B"
|
||||
text: out ? "↓" : "↑"
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.bottom: parent.bottom
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: out ? "#FF4F41" : "#36B05B"
|
||||
text: amount
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: dropModel
|
||||
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
|
||||
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
TableDropdown {
|
||||
id: dropdown
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 11
|
||||
anchors.rightMargin: 5
|
||||
dataModel: dropModel
|
||||
z: 1
|
||||
onExpandedChanged: {
|
||||
if(expanded) {
|
||||
listView.previousItem = delegate
|
||||
listView.currentIndex = index
|
||||
}
|
||||
}
|
||||
onOptionClicked: {
|
||||
if(option === 0)
|
||||
clipboard.setText(address)
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,110 +26,86 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Controls 2.2 as QtQuickControls2
|
||||
import QtQuick.Layouts 1.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Item {
|
||||
id: datePicker
|
||||
property bool expanded: false
|
||||
readonly property alias expanded: popup.visible
|
||||
property date currentDate
|
||||
property bool showCurrentDate: true
|
||||
property color backgroundColor : "#FFFFFF"
|
||||
property color errorColor : "#FFDDDD"
|
||||
property color backgroundColor : MoneroComponents.Style.appWindowBorderColor
|
||||
property color errorColor : "red"
|
||||
property bool error: false
|
||||
property alias inputLabel: inputLabel
|
||||
|
||||
height: 37
|
||||
width: 156
|
||||
signal dateChanged();
|
||||
|
||||
height: 50
|
||||
|
||||
onExpandedChanged: if(expanded) appWindow.currentItem = datePicker
|
||||
|
||||
function hide() { datePicker.expanded = false }
|
||||
function containsPoint(px, py) {
|
||||
if(px < 0)
|
||||
return false
|
||||
if(px > width)
|
||||
return false
|
||||
if(py < 0)
|
||||
return false
|
||||
if(py > height + calendarRect.height)
|
||||
return false
|
||||
return true
|
||||
Rectangle {
|
||||
id: inputLabelRect
|
||||
color: "transparent"
|
||||
height: 22
|
||||
width: parent.width
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 2
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 14
|
||||
font.bold: false
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
themeTransition: false
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: head
|
||||
anchors.fill: parent
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height
|
||||
//radius: 4
|
||||
y: 0
|
||||
color: "#DBDBDB"
|
||||
|
||||
}
|
||||
anchors.top: inputLabelRect.bottom
|
||||
anchors.topMargin: 6
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 28
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
anchors.leftMargin: datePicker.expanded ? 1 : 0
|
||||
anchors.rightMargin: datePicker.expanded ? 1 : 0
|
||||
//radius: 4
|
||||
radius: 4
|
||||
y: 1
|
||||
color: datePicker.error ? datePicker.errorColor : datePicker.backgroundColor
|
||||
color: datePicker.backgroundColor
|
||||
}
|
||||
|
||||
Item {
|
||||
id: buttonItem
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.margins: 4
|
||||
width: height
|
||||
|
||||
StandardButton {
|
||||
id: button
|
||||
anchors.fill: parent
|
||||
shadowReleasedColor: "#DBDBDB"
|
||||
shadowPressedColor: "#888888"
|
||||
releasedColor: "#F0EEEE"
|
||||
pressedColor: "#DBDBDB"
|
||||
icon: "../images/datePicker.png"
|
||||
visible: !datePicker.expanded
|
||||
onClicked: datePicker.expanded = true
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/datePicker.png"
|
||||
visible: datePicker.expanded
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
enabled: datePicker.expanded
|
||||
onClicked: datePicker.expanded = false
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: separator
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: buttonItem.left
|
||||
anchors.rightMargin: 4
|
||||
height: 16
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
visible: datePicker.expanded
|
||||
}
|
||||
|
||||
Row {
|
||||
RowLayout {
|
||||
id: dateInput
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
anchors.leftMargin: 2
|
||||
anchors.right: parent.right
|
||||
property string headerFontColor: MoneroComponents.Style.blackTheme ? "#e6e6e6" : "#333333"
|
||||
spacing: 0
|
||||
|
||||
function setDate(date) {
|
||||
var day = date.getDate()
|
||||
@@ -141,7 +117,7 @@ Item {
|
||||
|
||||
Connections {
|
||||
target: datePicker
|
||||
onCurrentDateChanged: {
|
||||
function onCurrentDateChanged() {
|
||||
dateInput.setDate(datePicker.currentDate)
|
||||
}
|
||||
}
|
||||
@@ -149,12 +125,14 @@ Item {
|
||||
TextInput {
|
||||
id: dayInput
|
||||
readOnly: true
|
||||
width: 22
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
maximumLength: 2
|
||||
Layout.preferredWidth: childrenRect.width + 40
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : parent.headerFontColor
|
||||
selectionColor: MoneroComponents.Style.dimmedFontColor
|
||||
selectByMouse: true
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
maximumLength: 2
|
||||
validator: IntValidator{bottom: 01; top: 31;}
|
||||
KeyNavigation.tab: monthInput
|
||||
|
||||
@@ -172,22 +150,25 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
text: "."
|
||||
MoneroComponents.TextPlain {
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
text: "-"
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
TextInput {
|
||||
id: monthInput
|
||||
readOnly: true
|
||||
width: 22
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
maximumLength: 2
|
||||
Layout.preferredWidth: childrenRect.width + 40
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : parent.headerFontColor
|
||||
selectionColor: MoneroComponents.Style.dimmedFontColor
|
||||
selectByMouse: true
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
maximumLength: 2
|
||||
validator: IntValidator{bottom: 01; top: 12;}
|
||||
KeyNavigation.tab: yearInput
|
||||
text: {
|
||||
@@ -204,23 +185,27 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
text: "."
|
||||
MoneroComponents.TextPlain {
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
text: "-"
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
TextInput {
|
||||
id: yearInput
|
||||
width: 44
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
/// color: "#525252"
|
||||
maximumLength: 4
|
||||
Layout.preferredWidth: childrenRect.width + 60
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : parent.headerFontColor
|
||||
selectionColor: MoneroComponents.Style.dimmedFontColor
|
||||
selectByMouse: true
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
maximumLength: 4
|
||||
validator: IntValidator{bottom: 1000; top: 9999;}
|
||||
text: if(datePicker.showCurrentDate) datePicker.currentDate.getFullYear()
|
||||
|
||||
onFocusChanged: {
|
||||
if(focus === false) {
|
||||
var d = new Date()
|
||||
@@ -230,148 +215,238 @@ Item {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
Layout.preferredHeight: parent.height
|
||||
Layout.fillWidth: true
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
id: button
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
source: "qrc:///images/whiteDropIndicator.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: button
|
||||
anchors.fill: button
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
rotation: datePicker.expanded ? 180 : 0
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: datePicker.expanded ? popup.close() : popup.open()
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: calendarRect
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: head.bottom
|
||||
color: "#FFFFFF"
|
||||
border.width: 1
|
||||
border.color: "#DBDBDB"
|
||||
height: datePicker.expanded ? calendar.height + 2 : 0
|
||||
clip: true
|
||||
//radius: 4
|
||||
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
QtQuickControls2.Popup {
|
||||
id: popup
|
||||
padding: 0
|
||||
closePolicy: QtQuickControls2.Popup.CloseOnEscape | QtQuickControls2.Popup.CloseOnPressOutsideParent
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
anchors.top: parent.top
|
||||
color: "#FFFFFF"
|
||||
height: 1
|
||||
}
|
||||
id: calendarRect
|
||||
width: head.width
|
||||
x: head.x
|
||||
y: head.y + head.height + 10
|
||||
|
||||
Calendar {
|
||||
id: calendar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: 1
|
||||
height: 180
|
||||
frameVisible: false
|
||||
color: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
border.width: 1
|
||||
border.color: MoneroComponents.Style.appWindowBorderColor
|
||||
height: datePicker.expanded ? calendar.height + 2 : 0
|
||||
clip: true
|
||||
|
||||
style: CalendarStyle {
|
||||
gridVisible: false
|
||||
background: Rectangle { color: "transparent" }
|
||||
dayDelegate: Item {
|
||||
implicitHeight: implicitWidth
|
||||
implicitWidth: calendar.width / 7
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
radius: parent.implicitHeight / 2
|
||||
color: dayArea.pressed && styleData.visibleMonth ? "#FF6C3B" : "transparent"
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.bold: dayArea.pressed
|
||||
text: styleData.date.getDate()
|
||||
color: {
|
||||
if(!styleData.visibleMonth) return "#DBDBDB"
|
||||
if(dayArea.pressed) return "#FFFFFF"
|
||||
if(styleData.today) return "#FF6C3B"
|
||||
return "#4A4848"
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
anchors.top: parent.top
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
height: 1
|
||||
}
|
||||
|
||||
Calendar {
|
||||
id: calendar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: 1
|
||||
anchors.bottomMargin: 10
|
||||
height: 220
|
||||
frameVisible: false
|
||||
|
||||
style: CalendarStyle {
|
||||
gridVisible: false
|
||||
background: Rectangle { color: MoneroComponents.Style.middlePanelBackgroundColor }
|
||||
dayDelegate: Item {
|
||||
z: parent.z + 1
|
||||
implicitHeight: implicitWidth
|
||||
implicitWidth: calendar.width / 7
|
||||
|
||||
Rectangle {
|
||||
id: dayRect
|
||||
anchors.fill: parent
|
||||
radius: parent.implicitHeight / 2
|
||||
color: {
|
||||
if(dayArea.pressed && styleData.visibleMonth)
|
||||
return MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
|
||||
return "transparent";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: dayArea
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if(styleData.visibleMonth) {
|
||||
currentDate = styleData.date
|
||||
datePicker.expanded = false
|
||||
} else {
|
||||
var date = styleData.date
|
||||
if(date.getMonth() > calendar.visibleMonth)
|
||||
calendar.showNextMonth()
|
||||
else calendar.showPreviousMonth()
|
||||
MoneroComponents.TextPlain {
|
||||
id: dayText
|
||||
anchors.centerIn: parent
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name
|
||||
font.pixelSize: {
|
||||
if(!styleData.visibleMonth) return 12
|
||||
return 14
|
||||
}
|
||||
font.bold: {
|
||||
if(dayArea.pressed || styleData.visibleMonth) return true;
|
||||
return false;
|
||||
}
|
||||
text: styleData.date.getDate()
|
||||
themeTransition: false
|
||||
color: {
|
||||
if(!styleData.visibleMonth) return MoneroComponents.Style.lightGreyFontColor
|
||||
if(dayArea.pressed) return MoneroComponents.Style.defaultFontColor
|
||||
if(styleData.today) return MoneroComponents.Style.orange
|
||||
return MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: dayArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onEntered: dayRect.color = MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
|
||||
onExited: dayRect.color = "transparent"
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
if(styleData.visibleMonth) {
|
||||
currentDate = styleData.date
|
||||
popup.close()
|
||||
} else {
|
||||
var date = styleData.date
|
||||
if(date.getMonth() > calendar.visibleMonth)
|
||||
calendar.showNextMonth()
|
||||
else calendar.showPreviousMonth()
|
||||
}
|
||||
|
||||
datePicker.dateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dayOfWeekDelegate: Item {
|
||||
implicitHeight: 20
|
||||
implicitWidth: calendar.width / 7
|
||||
dayOfWeekDelegate: Item {
|
||||
implicitHeight: 20
|
||||
implicitWidth: calendar.width / 7
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 9
|
||||
color: "#535353"
|
||||
text: {
|
||||
var locale = Qt.locale()
|
||||
return locale.dayName(styleData.dayOfWeek, Locale.ShortFormat)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
navigationBar: Rectangle {
|
||||
implicitWidth: calendar.width
|
||||
implicitHeight: 30
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#4A4646"
|
||||
text: styleData.title
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
|
||||
Image {
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/prevMonth.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: calendar.showPreviousMonth()
|
||||
elide: Text.ElideRight
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name
|
||||
font.pixelSize: 12
|
||||
color: MoneroComponents.Style.lightGreyFontColor
|
||||
themeTransition: false
|
||||
text: {
|
||||
var locale = Qt.locale()
|
||||
return locale.dayName(styleData.dayOfWeek, Locale.ShortFormat)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
navigationBar: Rectangle {
|
||||
color: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
implicitWidth: calendar.width
|
||||
implicitHeight: 30
|
||||
|
||||
Image {
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/nextMonth.png"
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name
|
||||
font.pixelSize: 14
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
themeTransition: false
|
||||
text: styleData.title
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: calendar.showNextMonth()
|
||||
|
||||
Item {
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 4
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
|
||||
Image {
|
||||
id: prevMonthIcon
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/prevMonth.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: prevMonthIcon
|
||||
anchors.fill: prevMonthIcon
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
onClicked: calendar.showPreviousMonth()
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 4
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
|
||||
Image {
|
||||
id: nextMonthIcon
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/prevMonth.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: nextMonthIcon
|
||||
anchors.fill: nextMonthIcon
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
rotation: 180
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
onClicked: calendar.showNextMonth()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
104
components/DevicePassphraseDialog.qml
Normal file
104
components/DevicePassphraseDialog.qml
Normal file
@@ -0,0 +1,104 @@
|
||||
// Copyright (c) 2014-2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import "." as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
property var onAcceptedCallback
|
||||
property var onWalletEntryCallback
|
||||
property var onRejectedCallback
|
||||
|
||||
function open(canEnterOnDevice_) {
|
||||
var canEnterOnDevice = canEnterOnDevice_ !== null ? canEnterOnDevice_ : canEnterOnDevice
|
||||
root.visible = true;
|
||||
|
||||
if (canEnterOnDevice) {
|
||||
entryChooserDialog.okText = qsTr("Hardware wallet")
|
||||
entryChooserDialog.cancelText = qsTr("Computer")
|
||||
entryChooserDialog.open()
|
||||
} else {
|
||||
openPassphraseDialog()
|
||||
}
|
||||
}
|
||||
|
||||
function openPassphraseDialog() {
|
||||
root.visible = true
|
||||
passphraseDialog.openPassphraseDialog()
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
if (entryChooserDialog.visible)
|
||||
entryChooserDialog.close()
|
||||
if (passphraseDialog.visible)
|
||||
passphraseDialog.close()
|
||||
}
|
||||
|
||||
StandardDialog {
|
||||
id: entryChooserDialog
|
||||
title: qsTr("Hardware wallet passphrase") + translationManager.emptyString
|
||||
text: qsTr("Please select where you want to enter passphrase.\nIt is recommended to enter passphrase on the hardware wallet for better security.") + translationManager.emptyString
|
||||
|
||||
onAccepted: {
|
||||
if (onWalletEntryCallback){
|
||||
onWalletEntryCallback()
|
||||
}
|
||||
}
|
||||
|
||||
onRejected: {
|
||||
openPassphraseDialog()
|
||||
}
|
||||
|
||||
onCloseCallback: {
|
||||
root.close()
|
||||
}
|
||||
}
|
||||
|
||||
PasswordDialog {
|
||||
id: passphraseDialog
|
||||
anchors.fill: parent
|
||||
passphraseDialogMode: true
|
||||
|
||||
onAcceptedPassphrase: {
|
||||
if (onAcceptedCallback)
|
||||
onAcceptedCallback(passphraseDialog.password);
|
||||
}
|
||||
|
||||
onRejectedPassphrase: {
|
||||
if (onRejectedCallback)
|
||||
onRejectedCallback();
|
||||
}
|
||||
|
||||
onCloseCallback: {
|
||||
root.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,451 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.AddressBookModel 1.0
|
||||
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
property var previousItem
|
||||
property int rowSpacing: 12
|
||||
property var addressBookModel: null
|
||||
|
||||
function buildTxDetailsString(tx_id, paymentId, tx_key,tx_note, destinations) {
|
||||
var trStart = '<tr><td width="85" style="padding-top:5px"><b>',
|
||||
trMiddle = '</b></td><td style="padding-left:10px;padding-top:5px;">',
|
||||
trEnd = "</td></tr>";
|
||||
|
||||
return '<table border="0">'
|
||||
+ (tx_id ? trStart + qsTr("Tx ID:") + trMiddle + tx_id + trEnd : "")
|
||||
+ (paymentId ? trStart + qsTr("Payment ID:") + trMiddle + paymentId + trEnd : "")
|
||||
+ (tx_key ? trStart + qsTr("Tx key:") + trMiddle + tx_key + trEnd : "")
|
||||
+ (tx_note ? trStart + qsTr("Tx note:") + trMiddle + tx_note + trEnd : "")
|
||||
+ (destinations ? trStart + qsTr("Destinations:") + trMiddle + destinations + trEnd : "")
|
||||
+ "</table>"
|
||||
+ translationManager.emptyString;
|
||||
}
|
||||
|
||||
function lookupPaymentID(paymentId) {
|
||||
if (!addressBookModel)
|
||||
return ""
|
||||
var idx = addressBookModel.lookupPaymentID(paymentId)
|
||||
if (idx < 0)
|
||||
return ""
|
||||
idx = addressBookModel.index(idx, 0)
|
||||
return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole)
|
||||
}
|
||||
|
||||
|
||||
footer: Rectangle {
|
||||
height: 127
|
||||
width: listView.width
|
||||
color: "#FFFFFF"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
StandardDialog {
|
||||
id: detailsPopup
|
||||
cancelVisible: false
|
||||
okVisible: true
|
||||
width:850
|
||||
}
|
||||
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: 144
|
||||
width: listView.width
|
||||
color: index % 2 ? "#F8F8F8" : "#FFFFFF"
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
StandardButton {
|
||||
id: detailsButton
|
||||
anchors.right:parent.right
|
||||
anchors.rightMargin: 15
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: parent.height/2 - this.height/2
|
||||
width: 80
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Details")
|
||||
onClicked: {
|
||||
var tx_key = currentWallet.getTxKey(hash)
|
||||
var tx_note = currentWallet.getUserNote(hash)
|
||||
detailsPopup.title = "Transaction details";
|
||||
detailsPopup.content = buildTxDetailsString(hash,paymentId,tx_key,tx_note,destinations);
|
||||
detailsPopup.open();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 14
|
||||
// -- direction indicator
|
||||
Rectangle {
|
||||
id: dot
|
||||
width: 14
|
||||
height: width
|
||||
radius: width / 2
|
||||
color: isOut ? "#FF4F41" : "#36B05B"
|
||||
}
|
||||
|
||||
Item { //separator
|
||||
width: 12
|
||||
height: 14
|
||||
}
|
||||
|
||||
// -- description aka recepient name from address book (TODO)
|
||||
/*
|
||||
Text {
|
||||
id: descriptionText
|
||||
width: text.length ? (descriptionArea.containsMouse ? parent.width - x - 12 : 120) : 0
|
||||
anchors.verticalCenter: dot.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 19
|
||||
color: "#444444"
|
||||
elide: Text.ElideRight
|
||||
text: description
|
||||
|
||||
MouseArea {
|
||||
id: descriptionArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*
|
||||
Item { //separator
|
||||
width: descriptionText.width ? 12 : 0
|
||||
height: 14
|
||||
visible: !descriptionArea.containsMouse
|
||||
}
|
||||
*/
|
||||
// -- address (in case outgoing transaction) - N/A in case of incoming
|
||||
TextEdit {
|
||||
id: addressText
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
anchors.verticalCenter: dot.verticalCenter
|
||||
width: parent.width - x - 12
|
||||
//elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
text: hash
|
||||
// visible: !descriptionArea.containsMouse
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
// - Payment ID
|
||||
id: row2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 40
|
||||
anchors.leftMargin: 26
|
||||
|
||||
// -- "PaymentID" title
|
||||
Text {
|
||||
id: paymentLabel
|
||||
width: 86
|
||||
anchors.bottom: parent.bottom
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#535353"
|
||||
text: paymentId !== "" ? qsTr("Payment ID:") + translationManager.emptyString : ""
|
||||
}
|
||||
// -- "PaymentID" value
|
||||
TextEdit {
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
id: paymentIdValue
|
||||
width: 136
|
||||
anchors.bottom: parent.bottom
|
||||
//elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize:13
|
||||
color: "#545454"
|
||||
text: paymentId
|
||||
|
||||
}
|
||||
// Address book lookup
|
||||
TextEdit {
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
id: addressBookLookupValue
|
||||
width: 136
|
||||
anchors.bottom: parent.bottom
|
||||
//elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize:13
|
||||
color: "#545454"
|
||||
text: "(" + lookupPaymentID(paymentId) + ")"
|
||||
visible: text !== "()"
|
||||
}
|
||||
}
|
||||
Row {
|
||||
// block height row
|
||||
id: row3
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: row2.bottom
|
||||
anchors.topMargin: rowSpacing
|
||||
anchors.leftMargin: 26
|
||||
|
||||
// -- "BlockHeight" title
|
||||
Text {
|
||||
id: blockHeghtTitle
|
||||
anchors.bottom: parent.bottom
|
||||
width: 86
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#535353"
|
||||
text: qsTr("BlockHeight:") + translationManager.emptyString
|
||||
}
|
||||
// -- "BlockHeight" value
|
||||
TextEdit {
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
width: 85
|
||||
anchors.bottom: parent.bottom
|
||||
//elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 13
|
||||
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
|
||||
text: {
|
||||
if (!isPending)
|
||||
if(confirmations < confirmationsRequired)
|
||||
return blockHeight + " " + qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
|
||||
else
|
||||
return blockHeight
|
||||
if (!isOut)
|
||||
return qsTr("UNCONFIRMED") + translationManager.emptyString
|
||||
return qsTr("PENDING") + translationManager.emptyString
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -- "Date", "Balance" and "Amound" section
|
||||
Row {
|
||||
id: row4
|
||||
anchors.top: row3.bottom
|
||||
anchors.left: parent.left
|
||||
spacing: 12
|
||||
anchors.topMargin: rowSpacing
|
||||
|
||||
Item { //separator
|
||||
width: 14
|
||||
height: 14
|
||||
}
|
||||
|
||||
// -- "Date" column
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 215
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Date") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
spacing: 33
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: date
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: time
|
||||
}
|
||||
}
|
||||
}
|
||||
// -- "Balance" column
|
||||
// XXX: we don't have a balance
|
||||
/*
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 148
|
||||
visible: false
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#000000"
|
||||
text: balance
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// -- "Amount column
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Amount") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
spacing: 2
|
||||
Text {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 3
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 16
|
||||
color: isOut ? "#FF4F41" : "#36B05B"
|
||||
text: isOut ? "↓" : "↑"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: amountText
|
||||
anchors.bottom: parent.bottom
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: isOut ? "#FF4F41" : "#36B05B"
|
||||
text: displayAmount
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -- "Fee column
|
||||
Column {
|
||||
anchors.top: parent.top
|
||||
width: 148
|
||||
visible: isOut
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Fee") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Row {
|
||||
spacing: 2
|
||||
Text {
|
||||
anchors.bottom: parent.bottom
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: "#FF4F41"
|
||||
text: fee
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
// Transaction dropdown menu.
|
||||
// Disable for now until AddressBook implemented
|
||||
TableDropdown {
|
||||
id: dropdown
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 11
|
||||
anchors.rightMargin: 5
|
||||
dataModel: dropModel
|
||||
z: 1
|
||||
onExpandedChanged: {
|
||||
if(expanded) {
|
||||
listView.previousItem = delegate
|
||||
listView.currentIndex = index
|
||||
}
|
||||
}
|
||||
onOptionClicked: {
|
||||
if(option === 0)
|
||||
clipboard.setText(address)
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: dropModel
|
||||
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
|
||||
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
|
||||
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
|
||||
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,47 +26,33 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import "../components" as MoneroComponents
|
||||
import "../components/effects" as MoneroEffects
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
property alias imageSource : buttonImage.source
|
||||
MoneroEffects.ImageMask {
|
||||
id: button
|
||||
z: 666
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
image: ""
|
||||
|
||||
signal clicked(var mouse)
|
||||
|
||||
|
||||
id: button
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
Image {
|
||||
id: buttonImage
|
||||
source: ""
|
||||
x : (parent.width - width) / 2
|
||||
y : (parent.height - height) /2
|
||||
z: 100
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
|
||||
onPressed: {
|
||||
buttonImage.x = buttonImage.x + 2
|
||||
buttonImage.y = buttonImage.y + 2
|
||||
}
|
||||
onReleased: {
|
||||
buttonImage.x = buttonImage.x - 2
|
||||
buttonImage.y = buttonImage.y - 2
|
||||
onEntered: {
|
||||
button.width = button.width + 2
|
||||
button.height = button.height + 2
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
parent.clicked(mouse)
|
||||
onExited: {
|
||||
button.width = button.width - 2
|
||||
button.height = button.height - 2
|
||||
}
|
||||
|
||||
onClicked: button.clicked(mouse)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
133
components/InlineButton.qml
Normal file
133
components/InlineButton.qml
Normal file
@@ -0,0 +1,133 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "./effects/" as MoneroEffects
|
||||
|
||||
Item {
|
||||
id: inlineButton
|
||||
height: parent.height
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
property bool small: false
|
||||
property string shadowPressedColor: "#B32D00"
|
||||
property string shadowReleasedColor: "#FF4304"
|
||||
property string pressedColor: "#FF4304"
|
||||
property string releasedColor: "#FF6C3C"
|
||||
property string icon: ""
|
||||
property string textColor: MoneroComponents.Style.inlineButtonTextColor
|
||||
property int fontSize: small ? 14 : 16
|
||||
property int rectHeight: small ? 24 : 24
|
||||
property int rectHMargin: small ? 16 : 22
|
||||
property alias text: inlineText.text
|
||||
property alias fontPixelSize: inlineText.font.pixelSize
|
||||
property alias fontFamily: inlineText.font.family
|
||||
property alias buttonColor: rect.color
|
||||
property alias buttonHeight: rect.height
|
||||
signal clicked()
|
||||
|
||||
function doClick() {
|
||||
// Android workaround
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
id: rect
|
||||
color: MoneroComponents.Style.buttonInlineBackgroundColor
|
||||
height: 24
|
||||
width: inlineText.text ? (inlineText.width + 16) : inlineButton.icon ? (inlineImage.width + 16) : rect.height
|
||||
radius: 4
|
||||
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 4
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inlineText
|
||||
font.family: MoneroComponents.Style.fontBold.name
|
||||
font.bold: true
|
||||
font.pixelSize: inlineButton.fontSize
|
||||
color: inlineButton.textColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
themeTransition: false
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: inlineText
|
||||
blackColor: MoneroComponents.Style._b_inlineButtonTextColor
|
||||
whiteColor: MoneroComponents.Style._w_inlineButtonTextColor
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: inlineImage
|
||||
visible: inlineButton.icon !== ""
|
||||
anchors.centerIn: parent
|
||||
source: inlineButton.icon
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: doClick()
|
||||
onEntered: {
|
||||
rect.color = buttonColor ? buttonColor : "#707070";
|
||||
rect.opacity = 0.8;
|
||||
}
|
||||
onExited: {
|
||||
rect.opacity = 1.0;
|
||||
rect.color = buttonColor ? buttonColor : "#808080";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
visible: !MoneroComponents.Style.blackTheme
|
||||
anchors.fill: rect
|
||||
horizontalOffset: 2
|
||||
verticalOffset: 2
|
||||
radius: 7.0
|
||||
samples: 10
|
||||
color: "#1B000000"
|
||||
cached: true
|
||||
source: rect
|
||||
}
|
||||
|
||||
Keys.enabled: inlineButton.visible
|
||||
Keys.onSpacePressed: doClick()
|
||||
Keys.onEnterPressed: Keys.onReturnPressed(event)
|
||||
Keys.onReturnPressed: doClick()
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,21 +26,31 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick 2.9
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
TextField {
|
||||
font.family: "Arial"
|
||||
id: textField
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18
|
||||
font.bold: true
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
selectionColor: MoneroComponents.Style.textSelectionColor
|
||||
selectedTextColor: MoneroComponents.Style.textSelectedColor
|
||||
|
||||
style: TextFieldStyle {
|
||||
textColor: "#3F3F3F"
|
||||
placeholderTextColor: "#BABABA"
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
border.width: 0
|
||||
color: "transparent"
|
||||
MoneroComponents.ContextMenu {
|
||||
cursorShape: Qt.IBeamCursor
|
||||
onPaste: {
|
||||
textField.clear();
|
||||
textField.paste();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
157
components/InputDialog.qml
Normal file
157
components/InputDialog.qml
Normal file
@@ -0,0 +1,157 @@
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Window 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: root
|
||||
visible: false
|
||||
property alias labelText: label.text
|
||||
property alias inputText: input.text
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
function open(prepopulate) {
|
||||
leftPanel.enabled = false
|
||||
middlePanel.enabled = false
|
||||
titleBar.state = "essentials"
|
||||
root.visible = true;
|
||||
input.focus = true;
|
||||
input.text = prepopulate ? prepopulate : "";
|
||||
}
|
||||
|
||||
function close() {
|
||||
leftPanel.enabled = true
|
||||
middlePanel.enabled = true
|
||||
titleBar.state = "default"
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
z: parent.z + 1
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
|
||||
ColumnLayout {
|
||||
id: column
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 400
|
||||
|
||||
Label {
|
||||
id: label
|
||||
Layout.fillWidth: true
|
||||
|
||||
font.pixelSize: 16
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id : input
|
||||
focus: true
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 24
|
||||
KeyNavigation.tab: okButton
|
||||
bottomPadding: 10
|
||||
leftPadding: 10
|
||||
topPadding: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
selectionColor: MoneroComponents.Style.textSelectionColor
|
||||
selectedTextColor: MoneroComponents.Style.textSelectedColor
|
||||
|
||||
background: Rectangle {
|
||||
radius: 2
|
||||
border.color: MoneroComponents.Style.inputBorderColorActive
|
||||
border.width: 1
|
||||
color: MoneroComponents.Style.blackTheme ? "black" : "#A9FFFFFF"
|
||||
}
|
||||
|
||||
Keys.enabled: root.visible
|
||||
Keys.onEnterPressed: Keys.onReturnPressed(event)
|
||||
Keys.onReturnPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 16
|
||||
Layout.topMargin: 16
|
||||
Layout.alignment: Qt.AlignRight
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
small: true
|
||||
width: 120
|
||||
fontSize: 14
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
KeyNavigation.tab: input
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
small: true
|
||||
width: 120
|
||||
fontSize: 14
|
||||
text: qsTr("Ok") + translationManager.emptyString
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
@@ -26,59 +26,54 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick 2.9
|
||||
|
||||
Item {
|
||||
id: scrollItem
|
||||
property var flickable
|
||||
width: 15
|
||||
z: 1
|
||||
import "../js/TxUtils.js" as TxUtils
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
function flickableContentYChanged() {
|
||||
if(flickable === undefined)
|
||||
return
|
||||
TextArea {
|
||||
property int fontSize: 18
|
||||
property bool fontBold: false
|
||||
property string fontColor: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
var t = flickable.height - scroll.height
|
||||
scroll.y = (flickable.contentY / (flickable.contentHeight - flickable.height)) * t
|
||||
}
|
||||
property bool mouseSelection: true
|
||||
property bool error: false
|
||||
property bool addressValidation: false
|
||||
|
||||
MouseArea {
|
||||
id: scrollArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
}
|
||||
id: textArea
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
color: fontColor
|
||||
font.pixelSize: fontSize
|
||||
font.bold: fontBold
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
selectByMouse: mouseSelection
|
||||
selectionColor: MoneroComponents.Style.textSelectionColor
|
||||
selectedTextColor: MoneroComponents.Style.textSelectedColor
|
||||
|
||||
Rectangle {
|
||||
id: scroll
|
||||
property int minimumHeight: 100
|
||||
height: contentHeight > minimumHeight ? contentHeight : minimumHeight
|
||||
|
||||
width: 15
|
||||
height: {
|
||||
var t = (flickable.height * flickable.height) / flickable.contentHeight
|
||||
return t < 20 ? 20 : t
|
||||
}
|
||||
y: 0; x: 0
|
||||
color: "#DBDBDB"
|
||||
opacity: flickable.moving || handleArea.pressed || scrollArea.containsMouse ? 0.5 : 0
|
||||
visible: flickable.contentHeight > flickable.height
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: handleArea
|
||||
anchors.fill: parent
|
||||
drag.target: scroll
|
||||
drag.axis: Drag.YAxis
|
||||
drag.minimumY: 0
|
||||
drag.maximumY: flickable.height - height
|
||||
propagateComposedEvents: true
|
||||
|
||||
onPositionChanged: {
|
||||
if(!pressed) return
|
||||
var dy = scroll.y / (flickable.height - scroll.height)
|
||||
flickable.contentY = (flickable.contentHeight - flickable.height) * dy
|
||||
onTextChanged: {
|
||||
if(addressValidation){
|
||||
// js replacement for `RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g }`
|
||||
if (textArea.text.startsWith("monero:")) {
|
||||
error = false;
|
||||
return;
|
||||
}
|
||||
textArea.text = textArea.text.replace(/[^a-z0-9.@\-]/gi,'');
|
||||
var address_ok = TxUtils.checkAddress(textArea.text, appWindow.persistentSettings.nettype) || TxUtils.isValidOpenAliasAddress(textArea.text);
|
||||
if(!address_ok) error = true;
|
||||
else error = false;
|
||||
TextArea.cursorPosition = textArea.text.length;
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.ContextMenu {
|
||||
cursorShape: Qt.IBeamCursor
|
||||
onPaste: {
|
||||
textArea.clear();
|
||||
textArea.paste();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,58 +26,53 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property alias text: label.text
|
||||
property alias color: label.color
|
||||
property alias textFormat: label.textFormat
|
||||
property int textFormat: Text.PlainText
|
||||
property string tipText: ""
|
||||
property int fontSize: 12
|
||||
property int fontSize: 16
|
||||
property bool fontBold: false
|
||||
property string fontColor: MoneroComponents.Style.defaultFontColor
|
||||
property string fontFamily: ""
|
||||
property alias wrapMode: label.wrapMode
|
||||
property alias horizontalAlignment: label.horizontalAlignment
|
||||
property alias elide: label.elide
|
||||
property alias textWidth: label.width
|
||||
property alias styleName: label.font.styleName
|
||||
property alias themeTransition: label.themeTransition
|
||||
signal linkActivated()
|
||||
width: icon.x + icon.width
|
||||
height: icon.height
|
||||
height: label.height
|
||||
width: label.width
|
||||
Layout.topMargin: 10
|
||||
|
||||
Text {
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 2
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: parent.fontSize
|
||||
color: "#555555"
|
||||
font.family: {
|
||||
if(fontFamily){
|
||||
return fontFamily;
|
||||
} else {
|
||||
return MoneroComponents.Style.fontRegular.name;
|
||||
}
|
||||
}
|
||||
font.pixelSize: fontSize
|
||||
font.bold: fontBold
|
||||
color: fontColor
|
||||
onLinkActivated: item.linkActivated()
|
||||
textFormat: parent.textFormat
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: icon
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: label.right
|
||||
anchors.leftMargin: 5
|
||||
source: "../images/whatIsIcon.png"
|
||||
visible: appWindow.whatIsEnable
|
||||
}
|
||||
|
||||
// MouseArea {
|
||||
// anchors.fill: icon
|
||||
// enabled: appWindow.whatIsEnable
|
||||
// hoverEnabled: true
|
||||
// onEntered: {
|
||||
// icon.visible = false
|
||||
// var pos = appWindow.mapFromItem(icon, 0, -15)
|
||||
// tipItem.text = item.tipText
|
||||
// tipItem.x = pos.x
|
||||
// if(tipItem.height > 30)
|
||||
// pos.y -= tipItem.height - 28
|
||||
// tipItem.y = pos.y
|
||||
// tipItem.visible = true
|
||||
// }
|
||||
// onExited: {
|
||||
// icon.visible = Qt.binding(function(){ return appWindow.whatIsEnable; })
|
||||
// tipItem.visible = false
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
@@ -26,46 +26,48 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Item {
|
||||
id: delegateItem
|
||||
width: 1
|
||||
height: 48
|
||||
property bool mainTick: false
|
||||
property int currentIndex
|
||||
property int currentX
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Image {
|
||||
|
||||
Rectangle {
|
||||
signal clicked();
|
||||
property alias text: labelButtonText.text
|
||||
|
||||
id: labelButton
|
||||
color: MoneroComponents.Style.buttonBackgroundColorDisabled
|
||||
radius: 3
|
||||
height: 20
|
||||
width: labelButtonText.width + 14
|
||||
anchors.right: copyButton.left
|
||||
anchors.rightMargin: 6
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: labelButtonText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: parent.top
|
||||
visible: parent.mainTick
|
||||
source: "../images/privacyTick.png"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
text: ""
|
||||
color: MoneroComponents.Style.inlineButtonTextColor
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 12
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 2
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#4A4949"
|
||||
text: {
|
||||
if(currentIndex === 0) return qsTr("Normal") + translationManager.emptyString
|
||||
if(currentIndex === 3) return qsTr("Medium") + translationManager.emptyString
|
||||
if(currentIndex === 13) return qsTr("High") + translationManager.emptyString
|
||||
return ""
|
||||
}
|
||||
MouseArea {
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: labelButton.clicked()
|
||||
onEntered: {
|
||||
labelButton.color = MoneroComponents.Style.buttonBackgroundColorDisabledHover;
|
||||
labelButtonText.opacity = 0.8;
|
||||
}
|
||||
onExited: {
|
||||
labelButton.color = MoneroComponents.Style.buttonBackgroundColorDisabled;
|
||||
labelButtonText.opacity = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 14
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
height: currentIndex === 8 ? 16 : 8
|
||||
visible: !parent.mainTick
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,43 +26,27 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick 2.9
|
||||
|
||||
ColumnLayout {
|
||||
property alias password: password.text
|
||||
property alias placeholderText: password.placeholderText
|
||||
signal changed(string password)
|
||||
import "../components" as MoneroComponents
|
||||
import "../components/effects/" as MoneroEffects
|
||||
|
||||
|
||||
TextField {
|
||||
Layout.fillWidth: true
|
||||
id : password
|
||||
focus:true
|
||||
font.family: "Arial"
|
||||
font.pixelSize: (isMobile) ? 25 : 26
|
||||
echoMode: TextInput.Password
|
||||
style: TextFieldStyle {
|
||||
renderType: Text.NativeRendering
|
||||
textColor: "#35B05A"
|
||||
passwordCharacter: "•"
|
||||
background: Rectangle {
|
||||
radius: 0
|
||||
border.width: 0
|
||||
}
|
||||
}
|
||||
onTextChanged: changed(text)
|
||||
|
||||
Keys.onReleased: {
|
||||
changed(text)
|
||||
}
|
||||
}
|
||||
Label {
|
||||
id: item
|
||||
fontSize: 18
|
||||
|
||||
Rectangle {
|
||||
Layout.fillWidth:true
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
anchors.top: item.bottom
|
||||
anchors.topMargin: 4
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 2
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
// Copyright (c) 2017, The Monero Project
|
||||
//
|
||||
// Copyright (c) 2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
@@ -26,58 +26,42 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import moneroComponents.Wallet 1.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property string message: ""
|
||||
property bool active: false
|
||||
height: 120
|
||||
width: 240
|
||||
property int margin: 15
|
||||
x: parent.width - width - margin
|
||||
y: parent.height - height * scale.yScale - margin * scale.yScale
|
||||
implicitHeight: layout.height
|
||||
implicitWidth: layout.width
|
||||
|
||||
Rectangle {
|
||||
color: "#FF6C3C"
|
||||
border.color: "black"
|
||||
RowLayout {
|
||||
id: layout
|
||||
opacity: mouseArea.containsMouse ? 1 : 0.85
|
||||
spacing: 10
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.bottomMargin: 5
|
||||
fontColor: MoneroComponents.Style.defaultFontColor
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontSize: 26
|
||||
styleName: "Solid"
|
||||
text: FontAwesome.language
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
font.pixelSize: 14
|
||||
text: persistentSettings.language
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
|
||||
TextArea {
|
||||
id:versionText
|
||||
readOnly: true
|
||||
backgroundVisible: false
|
||||
textFormat: TextEdit.AutoText
|
||||
anchors.fill: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
textMargin: 20
|
||||
textColor: "white"
|
||||
text: item.message
|
||||
}
|
||||
}
|
||||
|
||||
transform: Scale {
|
||||
id: scale
|
||||
yScale: item.active ? 1 : 0
|
||||
|
||||
Behavior on yScale {
|
||||
NumberAnimation { duration: 500; easing.type: Easing.InOutCubic }
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: hider
|
||||
interval: 12000; running: false; repeat: false
|
||||
onTriggered: { item.active = false }
|
||||
}
|
||||
|
||||
function show(message) {
|
||||
item.visible = true
|
||||
item.message = message
|
||||
item.active = true
|
||||
hider.running = true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
onClicked: appWindow.toggleLanguageView()
|
||||
}
|
||||
}
|
||||
180
components/LanguageSidebar.qml
Normal file
180
components/LanguageSidebar.qml
Normal file
@@ -0,0 +1,180 @@
|
||||
// Copyright (c) 2014-2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.XmlListModel 2.0
|
||||
import QtQuick.Layouts 1.2
|
||||
import QtQuick.Controls 2.0
|
||||
|
||||
|
||||
Drawer {
|
||||
id: sideBar
|
||||
|
||||
// @TODO: Qt 5.10 introduces `opened` built-in for Drawer
|
||||
property bool isOpened: false
|
||||
|
||||
onClosed: {
|
||||
isOpened = false;
|
||||
}
|
||||
|
||||
onOpened: {
|
||||
isOpened = true;
|
||||
}
|
||||
|
||||
width: 240
|
||||
height: parent.height - (persistentSettings.customDecorations ? 50 : 0)
|
||||
y: titleBar.height
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.blackTheme ? "#0d0d0d" : "white"
|
||||
width: parent.width
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
color: "red"
|
||||
|
||||
ListView {
|
||||
clip: true
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
width: sideBar.width
|
||||
height: sideBar.height
|
||||
|
||||
model: langModel
|
||||
|
||||
delegate: Rectangle {
|
||||
id: item
|
||||
color: "transparent"
|
||||
width: sideBar.width
|
||||
height: 32
|
||||
|
||||
Rectangle {
|
||||
id: flagRect
|
||||
height: 24
|
||||
width: 24
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 4
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
source: flag
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 30
|
||||
font.bold: true
|
||||
font.pixelSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: display_name
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
color: MoneroComponents.Style.dividerColor
|
||||
opacity: MoneroComponents.Style.dividerOpacity
|
||||
height: 1
|
||||
}
|
||||
|
||||
// button gradient while checked
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
source: "qrc:///images/menuButtonGradient.png"
|
||||
opacity: 0.65
|
||||
visible: true
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
var locale_spl = locale.split("_");
|
||||
|
||||
// reload active translations
|
||||
console.log(locale_spl[0]);
|
||||
translationManager.setLanguage(locale_spl[0]);
|
||||
|
||||
// set wizard language settings
|
||||
wizard.language_locale = locale;
|
||||
wizard.language_wallet = wallet_language;
|
||||
wizard.language_language = display_name;
|
||||
|
||||
appWindow.showStatusMessage(qsTr("Language changed."), 3);
|
||||
appWindow.toggleLanguageView();
|
||||
}
|
||||
hoverEnabled: true
|
||||
onEntered: {
|
||||
// item.color = "#26FFFFFF"
|
||||
parent.opacity = 1
|
||||
}
|
||||
onExited: {
|
||||
// item.color = "transparent"
|
||||
parent.opacity = 0.65
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
onActiveChanged: if (!active && !isMac) active = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Flags model
|
||||
XmlListModel {
|
||||
id: langModel
|
||||
source: "/lang/languages.xml"
|
||||
query: "/languages/language"
|
||||
|
||||
XmlRole { name: "display_name"; query: "@display_name/string()" }
|
||||
XmlRole { name: "locale"; query: "@locale/string()" }
|
||||
XmlRole { name: "wallet_language"; query: "@wallet_language/string()" }
|
||||
XmlRole { name: "flag"; query: "@flag/string()" }
|
||||
// TODO: XmlListModel is read only, we should store current language somewhere else
|
||||
// and set current language accordingly
|
||||
XmlRole { name: "isCurrent"; query: "@enabled/string()" }
|
||||
|
||||
onStatusChanged: {
|
||||
if(status === XmlListModel.Ready){
|
||||
console.log("languages available: ",count);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,53 +26,247 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import FontAwesome 1.0
|
||||
import QtQuick 2.9
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property alias placeholderText: input.placeholderText
|
||||
property alias input: input
|
||||
property alias text: input.text
|
||||
|
||||
property bool password: false
|
||||
property bool passwordHidden: true
|
||||
property var passwordLinked: null
|
||||
|
||||
property alias placeholderText: placeholderLabel.text
|
||||
property bool placeholderCenter: false
|
||||
property string placeholderFontFamily: MoneroComponents.Style.fontRegular.name
|
||||
property bool placeholderFontBold: false
|
||||
property int placeholderFontSize: 18
|
||||
property string placeholderColor: MoneroComponents.Style.defaultFontColor
|
||||
property real placeholderOpacity: 0.35
|
||||
|
||||
property alias acceptableInput: input.acceptableInput
|
||||
property alias validator: input.validator
|
||||
property alias readOnly : input.readOnly
|
||||
property alias cursorPosition: input.cursorPosition
|
||||
property alias echoMode: input.echoMode
|
||||
property alias inlineButton: inlineButtonId
|
||||
property alias inlineButtonText: inlineButtonId.text
|
||||
property alias inlineIcon: inlineIcon.visible
|
||||
property bool copyButton: false
|
||||
property alias copyButtonText: copyButtonId.text
|
||||
property alias copyButtonEnabled: copyButtonId.enabled
|
||||
|
||||
property bool borderDisabled: false
|
||||
property string borderColor: {
|
||||
if(error && input.text !== ""){
|
||||
return MoneroComponents.Style.inputBorderColorInvalid;
|
||||
} else if(input.activeFocus){
|
||||
return MoneroComponents.Style.inputBorderColorActive;
|
||||
} else {
|
||||
return MoneroComponents.Style.inputBorderColorInActive;
|
||||
}
|
||||
}
|
||||
|
||||
property int fontSize: 18
|
||||
property bool fontBold: false
|
||||
property alias fontColor: input.color
|
||||
property bool error: false
|
||||
signal editingFinished()
|
||||
property alias labelText: inputLabel.text
|
||||
property alias labelColor: inputLabel.color
|
||||
property alias labelTextFormat: inputLabel.textFormat
|
||||
property string backgroundColor: "transparent"
|
||||
property string tipText: ""
|
||||
property int labelFontSize: 16
|
||||
property bool labelFontBold: false
|
||||
property alias labelWrapMode: inputLabel.wrapMode
|
||||
property alias labelHorizontalAlignment: inputLabel.horizontalAlignment
|
||||
property bool showingHeader: inputLabel.text !== "" || copyButton
|
||||
property int inputHeight: 42
|
||||
|
||||
signal labelLinkActivated(); // input label, rich text <a> signal
|
||||
signal editingFinished();
|
||||
signal accepted();
|
||||
signal textUpdated();
|
||||
|
||||
height: 37
|
||||
height: showingHeader ? (inputLabel.height + inputItem.height + 2) : 42
|
||||
|
||||
function getColor(error) {
|
||||
if (error)
|
||||
return "#FFDDDD"
|
||||
else
|
||||
return "#FFFFFF"
|
||||
onTextUpdated: {
|
||||
// check to remove placeholder text when there is content
|
||||
if(item.isEmpty()){
|
||||
placeholderLabel.visible = true;
|
||||
} else {
|
||||
placeholderLabel.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.bottomMargin: 1
|
||||
color: "#DBDBDB"
|
||||
//radius: 4
|
||||
function isEmpty(){
|
||||
var val = input.text;
|
||||
if(val === "") {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 1
|
||||
color: getColor(error)
|
||||
//radius: 4
|
||||
function isPasswordHidden() {
|
||||
if (password) {
|
||||
return passwordHidden;
|
||||
}
|
||||
if (passwordLinked) {
|
||||
return passwordLinked.passwordHidden;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Input {
|
||||
id: input
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 4
|
||||
anchors.rightMargin: 30
|
||||
font.pixelSize: parent.fontSize
|
||||
onEditingFinished: item.editingFinished()
|
||||
onAccepted: item.accepted();
|
||||
onTextChanged: item.textUpdated()
|
||||
function reset() {
|
||||
text = "";
|
||||
if (!passwordLinked) {
|
||||
passwordHidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
function passwordToggle() {
|
||||
if (passwordLinked) {
|
||||
passwordLinked.passwordHidden = !passwordLinked.passwordHidden;
|
||||
} else {
|
||||
passwordHidden = !passwordHidden;
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: labelFontSize
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
onLinkActivated: item.labelLinkActivated()
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
text: qsTr("Copy") + translationManager.emptyString
|
||||
anchors.right: parent.right
|
||||
onClicked: {
|
||||
if (input.text.length > 0) {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(input.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
|
||||
}
|
||||
}
|
||||
visible: copyButton && input.text !== ""
|
||||
}
|
||||
|
||||
Item{
|
||||
id: inputItem
|
||||
height: inputHeight
|
||||
anchors.top: showingHeader ? inputLabel.bottom : parent.top
|
||||
anchors.topMargin: showingHeader ? 12 : 2
|
||||
width: parent.width
|
||||
clip: true
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: placeholderLabel
|
||||
visible: input.text ? false : true
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: placeholderCenter ? parent.horizontalCenter : undefined
|
||||
anchors.left: placeholderCenter ? undefined : parent.left
|
||||
anchors.leftMargin: {
|
||||
if(placeholderCenter){
|
||||
return undefined;
|
||||
}
|
||||
else if(inlineIcon.visible){ return 50; }
|
||||
else { return 10; }
|
||||
}
|
||||
|
||||
opacity: item.placeholderOpacity
|
||||
color: item.placeholderColor
|
||||
font.family: item.placeholderFontFamily
|
||||
font.pixelSize: placeholderFontSize
|
||||
font.bold: item.placeholderFontBold
|
||||
text: ""
|
||||
z: 3
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 1
|
||||
color: item.enabled ? "transparent" : MoneroComponents.Style.inputBoxBackgroundDisabled
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: inputFill
|
||||
color: backgroundColor
|
||||
anchors.fill: parent
|
||||
border.width: borderDisabled ? 0 : 1
|
||||
border.color: borderColor
|
||||
radius: 4
|
||||
}
|
||||
|
||||
Image {
|
||||
id: inlineIcon
|
||||
width: 26
|
||||
height: 26
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 8
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12
|
||||
source: "qrc:///images/moneroIcon-28x28.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: input
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: inlineIcon.visible ? 44 : 0
|
||||
font.pixelSize: item.fontSize
|
||||
font.bold: item.fontBold
|
||||
onEditingFinished: item.editingFinished()
|
||||
onAccepted: item.accepted();
|
||||
onTextChanged: item.textUpdated()
|
||||
topPadding: 10
|
||||
bottomPadding: 10
|
||||
echoMode: isPasswordHidden() ? TextInput.Password : TextInput.Normal
|
||||
|
||||
MoneroComponents.Label {
|
||||
visible: password || passwordLinked
|
||||
fontSize: 20
|
||||
text: isPasswordHidden() ? FontAwesome.eye : FontAwesome.eyeSlash
|
||||
opacity: eyeMouseArea.containsMouse ? 0.9 : 0.7
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 15
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: 1
|
||||
|
||||
MouseArea {
|
||||
id: eyeMouseArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
onClicked: passwordToggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
id: inlineButtonId
|
||||
visible: item.inlineButtonText ? true : false
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 8
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
215
components/LineEditMulti.qml
Normal file
215
components/LineEditMulti.qml
Normal file
@@ -0,0 +1,215 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ColumnLayout {
|
||||
id: item
|
||||
|
||||
Layout.fillWidth: true
|
||||
|
||||
property alias text: input.text
|
||||
property alias labelText: inputLabel.text
|
||||
property alias labelButtonText: labelButton.text
|
||||
property alias placeholderText: placeholderLabel.text
|
||||
|
||||
property int inputPaddingLeft: 10
|
||||
property int inputPaddingRight: 10
|
||||
property int inputPaddingTop: 10
|
||||
property int inputPaddingBottom: 10
|
||||
property int inputRadius: 4
|
||||
|
||||
property bool placeholderCenter: false
|
||||
property string placeholderFontFamily: MoneroComponents.Style.fontRegular.name
|
||||
property bool placeholderFontBold: false
|
||||
property int placeholderFontSize: 18
|
||||
property string placeholderColor: MoneroComponents.Style.defaultFontColor
|
||||
property real placeholderOpacity: 0.35
|
||||
|
||||
property bool borderDisabled: false
|
||||
property string borderColor: {
|
||||
if(input.error && input.text !== ""){
|
||||
return MoneroComponents.Style.inputBorderColorInvalid;
|
||||
} else if(input.activeFocus){
|
||||
return MoneroComponents.Style.inputBorderColorActive;
|
||||
} else {
|
||||
return MoneroComponents.Style.inputBorderColorInActive;
|
||||
}
|
||||
}
|
||||
|
||||
property bool error: false
|
||||
|
||||
property string labelFontColor: MoneroComponents.Style.defaultFontColor
|
||||
property bool labelFontBold: false
|
||||
property int labelFontSize: 16
|
||||
property bool labelButtonVisible: false
|
||||
|
||||
property string fontColor: MoneroComponents.Style.defaultFontColor
|
||||
property bool fontBold: false
|
||||
property int fontSize: 16
|
||||
|
||||
property bool mouseSelection: true
|
||||
property alias readOnly: input.readOnly
|
||||
property bool copyButton: false
|
||||
property bool pasteButton: false
|
||||
property bool showingHeader: labelText != "" || copyButton || pasteButton
|
||||
property var wrapMode: Text.NoWrap
|
||||
property alias addressValidation: input.addressValidation
|
||||
property string backgroundColor: "" // mock
|
||||
|
||||
property alias inlineButton: inlineButtonId
|
||||
property bool inlineButtonVisible: false
|
||||
property alias inlineButton2: inlineButton2Id
|
||||
property bool inlineButton2Visible: false
|
||||
|
||||
signal labelButtonClicked();
|
||||
signal inputLabelLinkActivated();
|
||||
signal editingFinished();
|
||||
|
||||
spacing: 0
|
||||
Rectangle {
|
||||
id: inputLabelRect
|
||||
color: "transparent"
|
||||
Layout.fillWidth: true
|
||||
height: (inputLabel.height + 10)
|
||||
visible: showingHeader ? true : false
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: item.labelFontSize
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: item.labelFontColor
|
||||
onLinkActivated: inputLabelLinkActivated()
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.right: parent.right
|
||||
spacing: 16
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: labelButton
|
||||
onClicked: labelButtonClicked()
|
||||
visible: labelButtonVisible
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
visible: copyButton && input.text !== ""
|
||||
text: qsTr("Copy") + translationManager.emptyString
|
||||
onClicked: {
|
||||
if (input.text.length > 0) {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(input.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: pasteButtonId
|
||||
onClicked: {
|
||||
input.clear();
|
||||
input.paste();
|
||||
}
|
||||
text: qsTr("Paste") + translationManager.emptyString
|
||||
visible: pasteButton
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.InputMulti {
|
||||
id: input
|
||||
readOnly: false
|
||||
addressValidation: false
|
||||
Layout.fillWidth: true
|
||||
|
||||
leftPadding: item.inputPaddingLeft
|
||||
rightPadding: item.inputPaddingRight
|
||||
topPadding: item.inputPaddingTop
|
||||
bottomPadding: item.inputPaddingBottom
|
||||
|
||||
wrapMode: item.wrapMode
|
||||
fontSize: item.fontSize
|
||||
fontBold: item.fontBold
|
||||
fontColor: item.fontColor
|
||||
mouseSelection: item.mouseSelection
|
||||
onEditingFinished: item.editingFinished()
|
||||
error: item.error
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: placeholderLabel
|
||||
visible: input.text ? false : true
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
opacity: item.placeholderOpacity
|
||||
color: item.placeholderColor
|
||||
font.family: item.placeholderFontFamily
|
||||
font.bold: item.placeholderFontBold
|
||||
font.pixelSize: item.placeholderFontSize
|
||||
text: ""
|
||||
z: 3
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
border.width: 1
|
||||
border.color: item.borderColor
|
||||
radius: item.inputRadius
|
||||
anchors.fill: parent
|
||||
visible: !item.borderDisabled
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
id: inlineButtonId
|
||||
visible: (inlineButtonId.text || inlineButtonId.icon) && inlineButtonVisible ? true : false
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 8
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
id: inlineButton2Id
|
||||
visible: (inlineButton2Id.text || inlineButton2Id.icon) && inlineButton2Visible ? true : false
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: inlineButtonVisible ? 48 : 8
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,18 +26,27 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Rectangle {
|
||||
id: button
|
||||
property alias text: label.text
|
||||
property bool checked: false
|
||||
property alias dotColor: dot.color
|
||||
property alias symbol: symbolText.text
|
||||
property int numSelectedChildren: 0
|
||||
property var under: null
|
||||
signal clicked()
|
||||
|
||||
function doClick() {
|
||||
// Android workaround
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
function getOffset() {
|
||||
var offset = 0
|
||||
var item = button
|
||||
@@ -48,21 +57,106 @@ Rectangle {
|
||||
return offset
|
||||
}
|
||||
|
||||
color: checked ? "#FFFFFF" : "#1C1C1C"
|
||||
color: "transparent"
|
||||
property bool present: !under || under.checked || checked || under.numSelectedChildren > 0
|
||||
height: present ? ((appWindow.height >= 800) ? 64 : 52) : 0
|
||||
height: present ? ((appWindow.height >= 800) ? 44 : 38 ) : 0
|
||||
|
||||
LinearGradient {
|
||||
visible: isOpenGL && (button.checked || buttonArea.containsMouse)
|
||||
height: parent.height
|
||||
width: 260
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: -20
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
start: Qt.point(width, 0)
|
||||
end: Qt.point(0, 0)
|
||||
gradient: Gradient {
|
||||
GradientStop { position: 0.0; color: MoneroComponents.Style.menuButtonGradientStart }
|
||||
GradientStop { position: 1.0; color: MoneroComponents.Style.menuButtonGradientStop }
|
||||
}
|
||||
opacity: button.checked ? 1 : 0.3
|
||||
}
|
||||
|
||||
// fallback hover effect when opengl is not available
|
||||
Rectangle {
|
||||
visible: !isOpenGL && (button.checked || buttonArea.containsMouse)
|
||||
anchors.fill: parent
|
||||
color: MoneroComponents.Style.menuButtonFallbackBackgroundColor
|
||||
opacity: button.checked ? 1 : 0.3
|
||||
}
|
||||
|
||||
// button decorations that are subject to leftMargin offsets
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
height: parent.height
|
||||
width: 2
|
||||
color: button.checked ? MoneroComponents.Style.buttonBackgroundColor : "transparent"
|
||||
|
||||
// button text
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
color: MoneroComponents.Style.menuButtonTextColor
|
||||
themeTransitionBlackColor: MoneroComponents.Style._b_menuButtonTextColor
|
||||
themeTransitionWhiteColor: MoneroComponents.Style._w_menuButtonTextColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.right
|
||||
anchors.leftMargin: button.getOffset() + 8
|
||||
font.bold: true
|
||||
font.pixelSize: 14
|
||||
}
|
||||
}
|
||||
|
||||
// menu button right arrow
|
||||
MoneroEffects.ImageMask {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20
|
||||
height: 14
|
||||
width: 8
|
||||
image: MoneroComponents.Style.menuButtonImageRightSource
|
||||
color: button.checked ? MoneroComponents.Style.menuButtonImageRightColorActive : MoneroComponents.Style.menuButtonImageRightColor
|
||||
opacity: button.checked ? 0.8 : 0.25
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: symbolText
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 44
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
color: MoneroComponents.Style.menuButtonTextColor
|
||||
visible: appWindow.ctrlPressed
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
if(parent.checked)
|
||||
return
|
||||
button.doClick()
|
||||
parent.checked = true
|
||||
}
|
||||
}
|
||||
|
||||
transform: Scale {
|
||||
yScale: button.present ? 1 : 0
|
||||
|
||||
Behavior on yScale {
|
||||
NumberAnimation { duration: 500; easing.type: Easing.InOutCubic }
|
||||
NumberAnimation { duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
}
|
||||
|
||||
Behavior on height {
|
||||
SequentialAnimation {
|
||||
NumberAnimation { duration: 500; easing.type: Easing.InOutCubic }
|
||||
NumberAnimation { duration: 200; easing.type: Easing.OutCubic }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,77 +164,4 @@ Rectangle {
|
||||
// we get the value of checked before the change
|
||||
ScriptAction { script: if (under) under.numSelectedChildren += checked > 0 ? -1 : 1 }
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
width: 50
|
||||
|
||||
Rectangle {
|
||||
id: dot
|
||||
anchors.centerIn: parent
|
||||
width: 16
|
||||
height: width
|
||||
radius: height / 2
|
||||
|
||||
Rectangle {
|
||||
anchors.centerIn: parent
|
||||
width: 12
|
||||
height: width
|
||||
radius: height / 2
|
||||
color: "#1C1C1C"
|
||||
visible: !button.checked && !buttonArea.containsMouse
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: symbolText
|
||||
anchors.centerIn: parent
|
||||
font.pixelSize: 11
|
||||
font.bold: true
|
||||
color: button.checked || buttonArea.containsMouse ? "#FFFFFF" : dot.color
|
||||
visible: appWindow.ctrlPressed
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
visible: parent.checked
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
source: "../images/menuIndicator.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: parent.getOffset() + 50
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: parent.checked ? "#000000" : "#FFFFFF"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
if(parent.checked)
|
||||
return
|
||||
button.clicked()
|
||||
parent.checked = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
15
components/MenuButtonDivider.qml
Normal file
15
components/MenuButtonDivider.qml
Normal file
@@ -0,0 +1,15 @@
|
||||
import QtQuick 2.9
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Rectangle {
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
height: 1
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
import QtQuick 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
|
||||
// BasicPanel header
|
||||
Rectangle {
|
||||
id: header
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 64
|
||||
color: "#FFFFFF"
|
||||
// visible: basicMode
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
visible: appWindow.width > 460
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
source: "../images/moneroLogo2.png"
|
||||
}
|
||||
|
||||
Image {
|
||||
id: icon
|
||||
visible: !logo.visible
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
// anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
source: "../images/moneroIcon.png"
|
||||
}
|
||||
|
||||
Grid {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 10
|
||||
width: 256
|
||||
columns: 3
|
||||
|
||||
Text {
|
||||
id: balanceLabel
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: leftPanel.balanceLabelText + ":"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: balanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: leftPanel.balanceText
|
||||
}
|
||||
|
||||
Item {
|
||||
height: 20
|
||||
width: 20
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
source: "../images/lockIcon.png"
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
width: 116
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#535353"
|
||||
text: qsTr("Unlocked Balance:")
|
||||
}
|
||||
|
||||
Text {
|
||||
id: availableBalanceText
|
||||
width: 110
|
||||
height: 20
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignBottom
|
||||
color: "#000000"
|
||||
text: leftPanel.unlockedBalanceText
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,71 +26,182 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Row {
|
||||
import FontAwesome 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
id: item
|
||||
color: "transparent"
|
||||
property var connected: Wallet.ConnectionStatus_Disconnected
|
||||
|
||||
function getConnectionStatusImage(status) {
|
||||
if (status == Wallet.ConnectionStatus_Connected)
|
||||
return "../images/statusConnected.png"
|
||||
else
|
||||
return "../images/statusDisconnected.png"
|
||||
}
|
||||
|
||||
function getConnectionStatusColor(status) {
|
||||
if (status == Wallet.ConnectionStatus_Connected)
|
||||
return "#FF6C3B"
|
||||
else
|
||||
return "#AAAAAA"
|
||||
}
|
||||
|
||||
function getConnectionStatusString(status) {
|
||||
if (status == Wallet.ConnectionStatus_Connected) {
|
||||
if(!appWindow.daemonSynced)
|
||||
return qsTr("Synchronizing")
|
||||
return qsTr("Connected")
|
||||
switch (appWindow.daemonStartStopInProgress)
|
||||
{
|
||||
case 1:
|
||||
return qsTr("Starting the node");
|
||||
case 2:
|
||||
return qsTr("Stopping the node");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (status == Wallet.ConnectionStatus_WrongVersion)
|
||||
return qsTr("Wrong version")
|
||||
if (status == Wallet.ConnectionStatus_Disconnected)
|
||||
return qsTr("Disconnected")
|
||||
return qsTr("Invalid connection status")
|
||||
}
|
||||
|
||||
Item {
|
||||
id: iconItem
|
||||
anchors.bottom: parent.bottom
|
||||
width: 50
|
||||
height: 50
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: getConnectionStatusImage(item.connected)
|
||||
switch (status) {
|
||||
case Wallet.ConnectionStatus_Connected:
|
||||
if (!appWindow.daemonSynced)
|
||||
return qsTr("Synchronizing");
|
||||
if (persistentSettings.useRemoteNode)
|
||||
return qsTr("Remote node");
|
||||
return appWindow.isMining ? qsTr("Connected") + " + " + qsTr("Mining"): qsTr("Connected");
|
||||
case Wallet.ConnectionStatus_WrongVersion:
|
||||
return qsTr("Wrong version");
|
||||
case Wallet.ConnectionStatus_Disconnected:
|
||||
if (appWindow.walletMode <= 1) {
|
||||
return qsTr("Searching node") + translationManager.emptyString;
|
||||
}
|
||||
return qsTr("Disconnected");
|
||||
case Wallet.ConnectionStatus_Connecting:
|
||||
return qsTr("Connecting");
|
||||
default:
|
||||
return qsTr("Invalid connection status");
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.bottom: parent.bottom
|
||||
height: 53
|
||||
spacing: 3
|
||||
RowLayout {
|
||||
Layout.preferredHeight: 40
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Network status") + translationManager.emptyString
|
||||
Item {
|
||||
id: iconItem
|
||||
width: 40
|
||||
height: 40
|
||||
opacity: {
|
||||
if(item.connected == Wallet.ConnectionStatus_Connected){
|
||||
return 1
|
||||
} else {
|
||||
return 0.5
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: !appWindow.isMining ? 6 : 4
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: !appWindow.isMining ? 11 : 0
|
||||
source: {
|
||||
if(appWindow.isMining) {
|
||||
return "qrc:///images/miningxmr.png"
|
||||
} else if(item.connected == Wallet.ConnectionStatus_Connected) {
|
||||
return "qrc:///images/lightning.png"
|
||||
} else {
|
||||
return "qrc:///images/lightning-white.png"
|
||||
}
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
visible: appWindow.walletMode >= 2
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
if(!appWindow.isMining) {
|
||||
middlePanel.settingsView.settingsStateViewState = "Node";
|
||||
appWindow.showPageRequest("Settings");
|
||||
} else {
|
||||
appWindow.showPageRequest("Mining")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: getConnectionStatusColor(item.connected)
|
||||
text: getConnectionStatusString(item.connected) + translationManager.emptyString
|
||||
Item {
|
||||
height: 40
|
||||
width: 260
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: statusText
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 0
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.bold: true
|
||||
font.pixelSize: 13
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
opacity: MoneroComponents.Style.blackTheme ? 0.65 : 0.5
|
||||
text: qsTr("Network status") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: statusTextVal
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 14
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 20
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: getConnectionStatusString(item.connected) + translationManager.emptyString
|
||||
opacity: MoneroComponents.Style.blackTheme ? 1.0 : 0.7
|
||||
themeTransition: false
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
visible: appWindow.walletMode >= 2
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
if(!appWindow.isMining) {
|
||||
middlePanel.settingsView.settingsStateViewState = "Node";
|
||||
appWindow.showPageRequest("Settings");
|
||||
} else {
|
||||
appWindow.showPageRequest("Mining")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.left: statusTextVal.right
|
||||
anchors.leftMargin: 16
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: refreshMouseArea.containsMouse ? MoneroComponents.Style.dimmedFontColor : MoneroComponents.Style.defaultFontColor
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.pixelSize: 24
|
||||
font.styleName: "Solid"
|
||||
opacity: iconItem.opacity * (refreshMouseArea.visible ? 1 : 0.5)
|
||||
text: FontAwesome.random
|
||||
visible: (
|
||||
!appWindow.disconnected &&
|
||||
!persistentSettings.useRemoteNode &&
|
||||
(persistentSettings.bootstrapNodeAddress == "auto" || persistentSettings.walletMode < 2)
|
||||
)
|
||||
|
||||
MouseArea {
|
||||
id: refreshMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
visible: true
|
||||
onClicked: {
|
||||
const callback = function(result) {
|
||||
refreshMouseArea.visible = true;
|
||||
if (result) {
|
||||
appWindow.showStatusMessage(qsTr("Successfully switched to another public node"), 3);
|
||||
appWindow.currentWallet.refreshHeightAsync();
|
||||
} else {
|
||||
appWindow.showStatusMessage(qsTr("Failed to switch public node"), 3);
|
||||
}
|
||||
};
|
||||
|
||||
daemonManager.sendCommandAsync(
|
||||
["set_bootstrap_daemon", "auto"],
|
||||
appWindow.currentWallet.nettype,
|
||||
callback);
|
||||
|
||||
refreshMouseArea.visible = false;
|
||||
appWindow.showStatusMessage(qsTr("Switching to another public node"), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,43 +26,119 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Window 2.0
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
import "../js/Utils.js" as Utils
|
||||
|
||||
Window {
|
||||
Item {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window | Qt.FramelessWindowHint
|
||||
property alias password: passwordInput.text
|
||||
visible: false
|
||||
|
||||
property alias password: passwordInput1.text
|
||||
property string walletName
|
||||
property var okButtonText
|
||||
property string okButtonIcon
|
||||
property string errorText
|
||||
property bool passwordDialogMode
|
||||
property bool passphraseDialogMode
|
||||
property bool newPasswordDialogMode
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal acceptedNewPassword()
|
||||
signal acceptedPassphrase()
|
||||
signal rejected()
|
||||
signal rejectedNewPassword()
|
||||
signal rejectedPassphrase()
|
||||
signal closeCallback()
|
||||
|
||||
|
||||
function open(walletName) {
|
||||
function _openInit(walletName, errorText) {
|
||||
capsLockTextLabel.visible = oshelper.isCapsLock();
|
||||
passwordInput1.reset();
|
||||
passwordInput2.reset();
|
||||
if(!appWindow.currentWallet || appWindow.active)
|
||||
passwordInput1.input.forceActiveFocus();
|
||||
root.walletName = walletName ? walletName : ""
|
||||
show()
|
||||
errorTextLabel.text = errorText ? errorText : "";
|
||||
leftPanel.enabled = false
|
||||
middlePanel.enabled = false
|
||||
wizard.enabled = false
|
||||
titleBar.state = "essentials"
|
||||
root.visible = true;
|
||||
appWindow.hideBalanceForced = true;
|
||||
appWindow.updateBalance();
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: walletName ? 240 : 200
|
||||
function open(walletName, errorText, okButtonText, okButtonIcon) {
|
||||
passwordDialogMode = true;
|
||||
passphraseDialogMode = false;
|
||||
newPasswordDialogMode = false;
|
||||
root.okButtonText = okButtonText;
|
||||
root.okButtonIcon = okButtonIcon ? okButtonIcon : "";
|
||||
_openInit(walletName, errorText);
|
||||
}
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
property point lastMousePos: Qt.point(0, 0)
|
||||
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
|
||||
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
|
||||
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
|
||||
function openPassphraseDialog() {
|
||||
passwordDialogMode = false;
|
||||
passphraseDialogMode = true;
|
||||
newPasswordDialogMode = false;
|
||||
_openInit("", "");
|
||||
}
|
||||
|
||||
function openNewPasswordDialog() {
|
||||
passwordDialogMode = false;
|
||||
passphraseDialogMode = false;
|
||||
newPasswordDialogMode = true;
|
||||
_openInit("", "");
|
||||
}
|
||||
|
||||
function showError(errorText) {
|
||||
open(root.walletName, errorText);
|
||||
}
|
||||
|
||||
function close() {
|
||||
leftPanel.enabled = true
|
||||
middlePanel.enabled = true
|
||||
wizard.enabled = true
|
||||
titleBar.state = "default"
|
||||
|
||||
root.visible = false;
|
||||
appWindow.hideBalanceForced = false;
|
||||
appWindow.updateBalance();
|
||||
closeCallback();
|
||||
}
|
||||
|
||||
function onOk() {
|
||||
if (!passwordDialogMode && passwordInput1.text !== passwordInput2.text) {
|
||||
return;
|
||||
}
|
||||
root.close()
|
||||
if (passwordDialogMode) {
|
||||
root.accepted()
|
||||
} else if (newPasswordDialogMode) {
|
||||
root.acceptedNewPassword()
|
||||
} else if (passphraseDialogMode) {
|
||||
root.acceptedPassphrase()
|
||||
}
|
||||
}
|
||||
|
||||
function onCancel() {
|
||||
root.close()
|
||||
if (passwordDialogMode) {
|
||||
root.rejected()
|
||||
} else if (newPasswordDialogMode) {
|
||||
root.rejectedNewPassword()
|
||||
} else if (passphraseDialogMode) {
|
||||
root.rejectedPassphrase()
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
@@ -72,112 +148,154 @@ Window {
|
||||
|
||||
ColumnLayout {
|
||||
id: column
|
||||
//anchors {fill: parent; margins: 16 }
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 400
|
||||
|
||||
Label {
|
||||
text: root.walletName.length > 0 ? qsTr("Please enter wallet password for:<br>") + root.walletName : qsTr("Please enter wallet password")
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.columnSpan: 2
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 24
|
||||
font.family: "Arial"
|
||||
color: "#555555"
|
||||
}
|
||||
|
||||
TextField {
|
||||
id : passwordInput
|
||||
focus: true
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 32
|
||||
echoMode: TextInput.Password
|
||||
KeyNavigation.tab: okButton
|
||||
|
||||
style: TextFieldStyle {
|
||||
renderType: Text.NativeRendering
|
||||
textColor: "#35B05A"
|
||||
passwordCharacter: "•"
|
||||
// no background
|
||||
background: Rectangle {
|
||||
radius: 0
|
||||
border.width: 0
|
||||
text: {
|
||||
if (newPasswordDialogMode) {
|
||||
return qsTr("Please enter new wallet password") + translationManager.emptyString;
|
||||
} else {
|
||||
var device = passwordDialogMode ? qsTr("wallet password") : qsTr("wallet device passphrase");
|
||||
return (root.walletName.length > 0 ? qsTr("Please enter %1 for: ").arg(device) + root.walletName : qsTr("Please enter %1").arg(device)) + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
Keys.onReturnPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
|
||||
}
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// underline
|
||||
Rectangle {
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
anchors.bottomMargin: 3
|
||||
|
||||
font.pixelSize: 16
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("Warning: passphrase entry on host is a security risk as it can be captured by malware. It is advised to prefer device-based passphrase entry.") + translationManager.emptyString
|
||||
visible: passphraseDialogMode
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.Wrap
|
||||
|
||||
font.pixelSize: 14
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.warningColor
|
||||
}
|
||||
|
||||
Label {
|
||||
id: errorTextLabel
|
||||
visible: root.errorText || text !== ""
|
||||
color: MoneroComponents.Style.errorColor
|
||||
font.pixelSize: 16
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
Label {
|
||||
id: capsLockTextLabel
|
||||
visible: false
|
||||
color: MoneroComponents.Style.errorColor
|
||||
font.pixelSize: 16
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.Wrap
|
||||
text: qsTr("CAPSLOCKS IS ON.") + translationManager.emptyString;
|
||||
}
|
||||
|
||||
MoneroComponents.LineEdit {
|
||||
id: passwordInput1
|
||||
password: true
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
KeyNavigation.tab: {
|
||||
if (passwordDialogMode) {
|
||||
return okButton
|
||||
} else {
|
||||
return passwordInput2
|
||||
}
|
||||
}
|
||||
onTextChanged: capsLockTextLabel.visible = oshelper.isCapsLock();
|
||||
|
||||
Keys.enabled: root.visible
|
||||
Keys.onEnterPressed: root.onOk()
|
||||
Keys.onReturnPressed: root.onOk()
|
||||
Keys.onEscapePressed: root.onCancel()
|
||||
}
|
||||
|
||||
// padding
|
||||
Rectangle {
|
||||
visible: !passwordDialogMode
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
height: 10
|
||||
opacity: 0
|
||||
color: "black"
|
||||
}
|
||||
}
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 60
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
KeyNavigation.tab: passwordInput
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !passwordDialogMode
|
||||
text: newPasswordDialogMode ? qsTr("Please confirm new password") : qsTr("Please confirm wallet device passphrase") + translationManager.emptyString
|
||||
Layout.fillWidth: true
|
||||
|
||||
font.pixelSize: 16
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Ok")
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
|
||||
MoneroComponents.LineEdit {
|
||||
id: passwordInput2
|
||||
passwordLinked: passwordInput1
|
||||
visible: !passwordDialogMode
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
KeyNavigation.tab: okButton
|
||||
onTextChanged: capsLockTextLabel.visible = oshelper.isCapsLock();
|
||||
|
||||
Keys.enabled: root.visible
|
||||
Keys.onEnterPressed: root.onOk()
|
||||
Keys.onReturnPressed: root.onOk()
|
||||
Keys.onEscapePressed: root.onCancel()
|
||||
}
|
||||
|
||||
// padding
|
||||
Rectangle {
|
||||
visible: !passwordDialogMode
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
height: 10
|
||||
opacity: 0
|
||||
color: "black"
|
||||
}
|
||||
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 16
|
||||
Layout.topMargin: 16
|
||||
Layout.alignment: Qt.AlignRight
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
primary: false
|
||||
small: true
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
KeyNavigation.tab: passwordInput1
|
||||
onClicked: onCancel()
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
fontAwesomeIcon: true
|
||||
rightIcon: okButtonIcon
|
||||
small: true
|
||||
text: okButtonText ? okButtonText : qsTr("Ok") + translationManager.emptyString
|
||||
KeyNavigation.tab: cancelButton
|
||||
enabled: (passwordDialogMode == true) ? true : passwordInput1.text === passwordInput2.text
|
||||
onClicked: onOk()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property int fillLevel: 0
|
||||
height: 70
|
||||
clip: true
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 24
|
||||
//radius: 4
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 1
|
||||
height: 24
|
||||
//radius: 4
|
||||
color: "#FFFFFF"
|
||||
|
||||
Rectangle {
|
||||
id: fillRect
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.margins: 4
|
||||
//radius: 2
|
||||
width: row.x
|
||||
|
||||
color: {
|
||||
if(item.fillLevel < 3) return "#FF6C3C"
|
||||
if(item.fillLevel < 13) return "#AAFFBB"
|
||||
return "#36B25C"
|
||||
}
|
||||
|
||||
Timer {
|
||||
interval: 500
|
||||
running: true
|
||||
repeat: false
|
||||
onTriggered: fillRect.loaded = true
|
||||
}
|
||||
|
||||
property bool loaded: false
|
||||
Behavior on width {
|
||||
enabled: fillRect.loaded
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
function positionBar() {
|
||||
var xDiff = 999999
|
||||
var index = -1
|
||||
for(var i = 0; i < 14; ++i) {
|
||||
var tmp = Math.abs(row.positions[i].currentX + row.x - mouseX)
|
||||
if(tmp < xDiff) {
|
||||
xDiff = tmp
|
||||
index = i
|
||||
}
|
||||
}
|
||||
|
||||
if(index !== -1) {
|
||||
fillRect.width = Qt.binding(function(){ return row.positions[index].currentX + row.x })
|
||||
item.fillLevel = index
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: positionBar()
|
||||
onMouseXChanged: positionBar()
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row
|
||||
anchors.right: bar.right
|
||||
anchors.rightMargin: 8
|
||||
anchors.top: bar.bottom
|
||||
anchors.topMargin: -1
|
||||
property var positions: new Array()
|
||||
|
||||
Row {
|
||||
id: row2
|
||||
spacing: ((bar.width - 8) / 2) / 4
|
||||
|
||||
Repeater {
|
||||
model: 4
|
||||
|
||||
delegate: TickDelegate {
|
||||
id: delegateItem2
|
||||
currentX: x + row2.x
|
||||
currentIndex: index
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
spacing: ((bar.width - 8) / 2) / 10
|
||||
|
||||
Repeater {
|
||||
model: 10
|
||||
|
||||
delegate: TickDelegate {
|
||||
id: delegateItem1
|
||||
currentX: x + row1.x
|
||||
currentIndex: index + 4
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,195 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property alias interactive: mouseArea.enabled
|
||||
property alias background: bar.color
|
||||
property int fillLevel: 0
|
||||
height: 40
|
||||
clip: true
|
||||
|
||||
onFillLevelChanged: {
|
||||
if (!interactive) {
|
||||
//print("fillLevel: " + fillLevel)
|
||||
fillRect.width = row.positions[fillLevel].currentX + row.x
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 24
|
||||
//radius: 4
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 1
|
||||
height: 24
|
||||
//radius: 4
|
||||
color: "#FFFFFF"
|
||||
|
||||
Rectangle {
|
||||
id: fillRect
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.margins: 4
|
||||
//radius: 2
|
||||
width: row.x
|
||||
|
||||
color: {
|
||||
if(item.fillLevel < 5) return "#FF6C3C"
|
||||
if(item.fillLevel < 13) return "#AAFFBB"
|
||||
return "#36B25C"
|
||||
}
|
||||
|
||||
Timer {
|
||||
interval: 500
|
||||
running: true
|
||||
repeat: false
|
||||
onTriggered: fillRect.loaded = true
|
||||
}
|
||||
|
||||
property bool loaded: false
|
||||
Behavior on width {
|
||||
enabled: fillRect.loaded
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 15
|
||||
color: "#000000"
|
||||
x: row.x + (row.positions[0] !== undefined ? row.positions[0].currentX - 3 : 0) - width
|
||||
text: qsTr("Low") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 15
|
||||
color: "#000000"
|
||||
x: row.x + (row.positions[4] !== undefined ? row.positions[4].currentX - 3 : 0) - width
|
||||
text: qsTr("Medium") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 15
|
||||
color: "#000000"
|
||||
x: row.x + (row.positions[13] !== undefined ? row.positions[13].currentX - 3 : 0) - width
|
||||
text: qsTr("High") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
function positionBar() {
|
||||
var xDiff = 999999
|
||||
var index = -1
|
||||
for(var i = 0; i < 14; ++i) {
|
||||
var tmp = Math.abs(row.positions[i].currentX + row.x - mouseX)
|
||||
if(tmp < xDiff) {
|
||||
xDiff = tmp
|
||||
index = i
|
||||
}
|
||||
}
|
||||
|
||||
if(index !== -1) {
|
||||
fillRect.width = Qt.binding(function(){ return row.positions[index].currentX + row.x })
|
||||
item.fillLevel = index
|
||||
print ("fillLevel: " + item.fillLevel)
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: positionBar()
|
||||
onMouseXChanged: positionBar()
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row
|
||||
anchors.right: bar.right
|
||||
anchors.rightMargin: 8
|
||||
anchors.top: bar.bottom
|
||||
anchors.topMargin: 5
|
||||
property var positions: []
|
||||
|
||||
Row {
|
||||
id: row2
|
||||
spacing: ((bar.width - 8) / 2.23) / 4
|
||||
|
||||
Repeater {
|
||||
model: 4
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegateItem2
|
||||
property int currentX: x + row2.x
|
||||
height: 8
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
Component.onCompleted: {
|
||||
row.positions[index] = delegateItem2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
spacing: ((bar.width - 8) / 2.23) / 10
|
||||
|
||||
Repeater {
|
||||
model: 10
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegateItem1
|
||||
property int currentX: x + row1.x
|
||||
height: index === 4 ? 8 : 4
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
Component.onCompleted: {
|
||||
row.positions[index + 4] = delegateItem1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,57 +26,87 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Window 2.1
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Window {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window
|
||||
property alias messageText: messageTitle.text
|
||||
property alias heightProgressText : heightProgress.text
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
width: 200
|
||||
height: 100
|
||||
opacity: 0.7
|
||||
Rectangle {
|
||||
id: root
|
||||
color: MoneroComponents.Style.blackTheme ? "black" : "white"
|
||||
visible: false
|
||||
radius: 10
|
||||
border.color: MoneroComponents.Style.blackTheme ? Qt.rgba(255, 255, 255, 0.25) : Qt.rgba(0, 0, 0, 0.25)
|
||||
border.width: 1
|
||||
z: 11
|
||||
property alias messageText: messageTitle.text
|
||||
|
||||
width: 100
|
||||
height: 50
|
||||
|
||||
function show() {
|
||||
root.visible = true;
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: rootLayout
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.centerIn: parent
|
||||
|
||||
anchors.leftMargin: 30
|
||||
anchors.rightMargin: 30
|
||||
|
||||
BusyIndicator {
|
||||
running: parent.visible
|
||||
spacing: 21
|
||||
|
||||
Item {
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
||||
Layout.preferredHeight: 80
|
||||
|
||||
Image {
|
||||
id: imgLogo
|
||||
width: 60
|
||||
height: 60
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/monero-vector.svg"
|
||||
mipmap: true
|
||||
}
|
||||
|
||||
BusyIndicator {
|
||||
running: parent.visible
|
||||
anchors.centerIn: imgLogo
|
||||
style: BusyIndicatorStyle {
|
||||
indicator: Image {
|
||||
visible: control.running
|
||||
source: "qrc:///images/busy-indicator.png"
|
||||
RotationAnimator on rotation {
|
||||
running: control.running
|
||||
loops: Animation.Infinite
|
||||
duration: 1000
|
||||
from: 0
|
||||
to: 360
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: messageTitle
|
||||
text: "Please wait..."
|
||||
font {
|
||||
pixelSize: 22
|
||||
}
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
|
||||
Text {
|
||||
id: heightProgress
|
||||
font {
|
||||
pixelSize: 18
|
||||
}
|
||||
text: qsTr("Please wait...") + translationManager.emptyString
|
||||
font.pixelSize: 24
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
themeTransition: false
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,81 +26,111 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
Item {
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
id: item
|
||||
property int fillLevel: 0
|
||||
height: 22
|
||||
anchors.margins:15
|
||||
property string syncType // Wallet or Daemon
|
||||
property string syncText: qsTr("%1 blocks remaining: ").arg(syncType)
|
||||
visible: false
|
||||
//clip: true
|
||||
|
||||
function updateProgress(currentBlock,targetBlock, blocksToSync){
|
||||
if(targetBlock == 1) {
|
||||
fillLevel = 0
|
||||
progressText.text = qsTr("Establishing connection...");
|
||||
progressBar.visible = true
|
||||
return
|
||||
}
|
||||
color: "transparent"
|
||||
|
||||
function updateProgress(currentBlock,targetBlock, blocksToSync, statusTxt){
|
||||
if(targetBlock > 0) {
|
||||
var remaining = targetBlock - currentBlock
|
||||
// wallet sync
|
||||
if(blocksToSync > 0)
|
||||
var progressLevel = (100*(blocksToSync - remaining)/blocksToSync).toFixed(0);
|
||||
// Daemon sync
|
||||
else
|
||||
var progressLevel = (100*(currentBlock/targetBlock)).toFixed(0);
|
||||
var remaining = (currentBlock < targetBlock) ? targetBlock - currentBlock : 0
|
||||
var progressLevel = (blocksToSync > 0 ) ? (100*(blocksToSync - remaining)/blocksToSync).toFixed(0) : 100
|
||||
fillLevel = progressLevel
|
||||
progressText.text = qsTr("Blocks remaining: %1").arg(remaining.toFixed(0));
|
||||
progressBar.visible = currentBlock < targetBlock
|
||||
if(typeof statusTxt != "undefined" && statusTxt != "") {
|
||||
progressText.text = statusTxt;
|
||||
progressTextValue.text = "";
|
||||
} else {
|
||||
progressText.text = syncText;
|
||||
progressTextValue.text = remaining.toFixed(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 22
|
||||
radius: 2
|
||||
color: "#FFFFFF"
|
||||
Item {
|
||||
anchors.top: item.top
|
||||
anchors.topMargin: 10
|
||||
anchors.leftMargin: 15
|
||||
anchors.rightMargin: 15
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
id: fillRect
|
||||
MoneroComponents.TextPlain {
|
||||
id: progressText
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.margins: 2
|
||||
height: bar.height
|
||||
property int maxWidth: parent.width - 4
|
||||
width: (maxWidth * fillLevel) / 100
|
||||
color: {
|
||||
if(item.fillLevel < 99 ) return "#FF6C3C"
|
||||
//if(item.fillLevel < 99) return "#FFE00A"
|
||||
return "#36B25C"
|
||||
}
|
||||
anchors.topMargin: 6
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 13
|
||||
font.bold: MoneroComponents.Style.progressBarProgressTextBold
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: qsTr("Synchronizing %1").arg(syncType) + translationManager.emptyString
|
||||
height: 18
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: progressTextValue
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 6
|
||||
anchors.right: parent.right
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 13
|
||||
font.bold: MoneroComponents.Style.progressBarProgressTextBold
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
height:18
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color:"#333"
|
||||
anchors.bottom: parent.bottom
|
||||
id: bar
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 8
|
||||
anchors.right: parent.right
|
||||
anchors.top: progressText.bottom
|
||||
anchors.topMargin: 4
|
||||
height: 8
|
||||
radius: 8
|
||||
color: MoneroComponents.Style.progressBarBackgroundColor
|
||||
|
||||
Text {
|
||||
id:progressText
|
||||
states: [
|
||||
State {
|
||||
name: "black";
|
||||
when: MoneroComponents.Style.blackTheme
|
||||
PropertyChanges { target: bar; color: MoneroComponents.Style._b_progressBarBackgroundColor}
|
||||
}, State {
|
||||
name: "white";
|
||||
when: !MoneroComponents.Style.blackTheme
|
||||
PropertyChanges { target: bar; color: MoneroComponents.Style._w_progressBarBackgroundColor}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: Transition {
|
||||
enabled: appWindow.themeTransition
|
||||
ColorAnimation { properties: "color"; easing.type: Easing.InOutQuad; duration: 300 }
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: fillRect
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#000"
|
||||
text: qsTr("Synchronizing blocks")
|
||||
height:18
|
||||
anchors.left: parent.left
|
||||
height: bar.height
|
||||
property int maxWidth: bar.width
|
||||
width: (maxWidth * fillLevel) / 100
|
||||
radius: 8
|
||||
color: "#FA6800"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color:"#333"
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 8
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2017, The Monero Project
|
||||
// Copyright (c) 2014-2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,7 +26,7 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtMultimedia 5.4
|
||||
import QtQuick.Dialogs 1.2
|
||||
import moneroComponents.QRCodeScanner 1.0
|
||||
@@ -44,7 +44,7 @@ Rectangle {
|
||||
color: "black"
|
||||
state: "Stopped"
|
||||
|
||||
signal qrcode_decoded(string address, string payment_id, string amount, string tx_description, string recipient_name)
|
||||
signal qrcode_decoded(string address, string payment_id, string amount, string tx_description, string recipient_name, var extra_parameters)
|
||||
|
||||
states: [
|
||||
State {
|
||||
@@ -53,6 +53,7 @@ Rectangle {
|
||||
script: {
|
||||
root.visible = true
|
||||
camera.captureMode = Camera.CaptureStillImage
|
||||
camera.cameraState = Camera.ActiveState
|
||||
camera.start()
|
||||
finder.enabled = true
|
||||
}
|
||||
@@ -65,6 +66,7 @@ Rectangle {
|
||||
camera.stop()
|
||||
root.visible = false
|
||||
finder.enabled = false
|
||||
camera.cameraState = Camera.UnloadedState
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,6 +76,7 @@ Rectangle {
|
||||
id: camera
|
||||
objectName: "qrCameraQML"
|
||||
captureMode: Camera.CaptureStillImage
|
||||
cameraState: Camera.UnloadedState
|
||||
|
||||
focus {
|
||||
focusMode: Camera.FocusContinuous
|
||||
@@ -83,9 +86,14 @@ Rectangle {
|
||||
id : finder
|
||||
objectName: "QrFinder"
|
||||
onDecoded : {
|
||||
root.qrcode_decoded(address, payment_id, amount, tx_description, recipient_name)
|
||||
root.state = "Stopped"
|
||||
}
|
||||
const parsed = walletManager.parse_uri_to_object(data);
|
||||
if (!parsed.error) {
|
||||
root.qrcode_decoded(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name, parsed.extra_parameters);
|
||||
root.state = "Stopped";
|
||||
} else {
|
||||
onNotifyError(parsed.error);
|
||||
}
|
||||
}
|
||||
onNotifyError : {
|
||||
if( warning )
|
||||
messageDialog.icon = StandardIcon.Critical
|
||||
@@ -126,7 +134,7 @@ Rectangle {
|
||||
|
||||
MessageDialog {
|
||||
id: messageDialog
|
||||
title: "Scanning QrCode"
|
||||
title: qsTr("QrCode Scanned") + translationManager.emptyString
|
||||
onAccepted: {
|
||||
root.state = "Stopped"
|
||||
}
|
||||
|
||||
92
components/RadioButton.qml
Normal file
92
components/RadioButton.qml
Normal file
@@ -0,0 +1,92 @@
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: radioButton
|
||||
property alias text: label.text
|
||||
property bool checked: false
|
||||
property int fontSize: 14
|
||||
property alias fontColor: label.color
|
||||
signal clicked()
|
||||
height: 26
|
||||
width: layout.width
|
||||
// legacy properties
|
||||
property var checkedColor: MoneroComponents.Style.blackTheme ? "white" : "#666666"
|
||||
property var borderColor: checked ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
|
||||
|
||||
function toggle(){
|
||||
radioButton.checked = !radioButton.checked
|
||||
radioButton.clicked()
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: layout
|
||||
|
||||
Rectangle {
|
||||
id: button
|
||||
color: "transparent"
|
||||
border.color: borderColor
|
||||
height: radioButton.height
|
||||
width: radioButton.height
|
||||
radius: radioButton.height
|
||||
|
||||
Rectangle {
|
||||
visible: radioButton.checked
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: checkedColor
|
||||
width: 10
|
||||
height: 10
|
||||
radius: 10
|
||||
opacity: 0.8
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
Layout.leftMargin: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: radioButton.fontSize
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
129
components/RemoteNodeEdit.qml
Normal file
129
components/RemoteNodeEdit.qml
Normal file
@@ -0,0 +1,129 @@
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../js/Utils.js" as Utils
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
GridLayout {
|
||||
columns: 2
|
||||
columnSpacing: 32
|
||||
id: root
|
||||
property alias daemonAddrText: daemonAddr.text
|
||||
property alias daemonPortText: daemonPort.text
|
||||
property alias daemonAddrLabelText: daemonAddr.labelText
|
||||
property alias daemonPortLabelText: daemonPort.labelText
|
||||
|
||||
property string initialAddress: ""
|
||||
property var initialHostPort: initialAddress.match(/^(.*?)(?:\:?(\d*))$/)
|
||||
|
||||
// TODO: LEGACY; remove these placeHolder variables when
|
||||
// the wizards get redesigned to the black-theme
|
||||
property string placeholderFontFamily: MoneroComponents.Style.fontRegular.name
|
||||
property bool placeholderFontBold: false
|
||||
property int placeholderFontSize: 15
|
||||
property string placeholderColor: MoneroComponents.Style.defaultFontColor
|
||||
property real placeholderOpacity: 0.35
|
||||
property int labelFontSize: 14
|
||||
|
||||
property string lineEditBackgroundColor: "transparent"
|
||||
property string lineEditBorderColor: MoneroComponents.Style.inputBorderColorInActive
|
||||
property string lineEditFontColor: MoneroComponents.Style.defaultFontColor
|
||||
property bool lineEditFontBold: false
|
||||
property int lineEditFontSize: 15
|
||||
|
||||
// Author: David M. Syzdek https://github.com/syzdek https://gist.github.com/syzdek/6086792
|
||||
readonly property var ipv6Regex: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe08:(:[0-9a-fA-F]{1,4}){2,2}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/
|
||||
|
||||
signal editingFinished()
|
||||
signal textChanged()
|
||||
|
||||
function isValid() {
|
||||
return daemonAddr.text.trim().length > 0 && daemonPort.acceptableInput
|
||||
}
|
||||
|
||||
function getAddress() {
|
||||
var addr = daemonAddr.text.trim();
|
||||
var port = daemonPort.text.trim();
|
||||
|
||||
// validation
|
||||
if(addr === "" || addr.length < 2) return "";
|
||||
if(!Utils.isNumeric(port)) return "";
|
||||
|
||||
return addr + ":" + port;
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
id: daemonAddr
|
||||
Layout.fillWidth: true
|
||||
placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString
|
||||
placeholderFontFamily: root.placeholderFontFamily
|
||||
placeholderFontBold: root.placeholderFontBold
|
||||
placeholderFontSize: root.placeholderFontSize
|
||||
placeholderColor: root.placeholderColor
|
||||
placeholderOpacity: root.placeholderOpacity
|
||||
labelFontSize: root.labelFontSize
|
||||
borderColor: lineEditBorderColor
|
||||
backgroundColor: lineEditBackgroundColor
|
||||
fontColor: lineEditFontColor
|
||||
fontBold: lineEditFontBold
|
||||
fontSize: lineEditFontSize
|
||||
onEditingFinished: {
|
||||
text = text.replace(ipv6Regex, "[$1]");
|
||||
root.editingFinished();
|
||||
}
|
||||
onTextChanged: root.textChanged()
|
||||
text: initialHostPort[1]
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
id: daemonPort
|
||||
Layout.fillWidth: true
|
||||
placeholderText: qsTr("Port") + translationManager.emptyString
|
||||
placeholderFontFamily: root.placeholderFontFamily
|
||||
placeholderFontBold: root.placeholderFontBold
|
||||
placeholderFontSize: root.placeholderFontSize
|
||||
placeholderColor: root.placeholderColor
|
||||
placeholderOpacity: root.placeholderOpacity
|
||||
labelFontSize: root.labelFontSize
|
||||
borderColor: lineEditBorderColor
|
||||
backgroundColor: lineEditBackgroundColor
|
||||
fontColor: lineEditFontColor
|
||||
fontBold: lineEditFontBold
|
||||
fontSize: lineEditFontSize
|
||||
validator: IntValidator{bottom: 1; top: 65535;}
|
||||
|
||||
onEditingFinished: root.editingFinished()
|
||||
onTextChanged: root.textChanged()
|
||||
text: initialHostPort[2]
|
||||
}
|
||||
}
|
||||
@@ -1,232 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
id: item
|
||||
signal searchClicked(string text, int option)
|
||||
height: 50
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#DBDBDB"
|
||||
//radius: 4
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 1
|
||||
color: "#FFFFFF"
|
||||
//radius: 4
|
||||
|
||||
Item {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
width: 45
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/magnifier.png"
|
||||
}
|
||||
}
|
||||
|
||||
Input {
|
||||
id: input
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: dropdown.left
|
||||
anchors.leftMargin: 45
|
||||
font.pixelSize: 18
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
placeholderText: qsTr("Search by...") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Item {
|
||||
id: dropdown
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: button.left
|
||||
width: 154
|
||||
|
||||
function hide() { droplist.height = 0 }
|
||||
function containsPoint(px, py) {
|
||||
if(px < 0)
|
||||
return false
|
||||
if(px > width)
|
||||
return false
|
||||
if(py < 0)
|
||||
return false
|
||||
if(py > height + droplist.height)
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
Text {
|
||||
id: dropText
|
||||
width: 114 - 12
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
color: "#4A4747"
|
||||
text: "NAME"
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
source: "../images/hseparator.png"
|
||||
}
|
||||
|
||||
Item {
|
||||
height: dropdown.height
|
||||
width: 38
|
||||
|
||||
Image {
|
||||
id: dropIndicator
|
||||
anchors.centerIn: parent
|
||||
source: "../images/dropIndicator.png"
|
||||
rotation: droplist.height === 0 ? 0 : 180
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if(droplist.height === 0) {
|
||||
appWindow.currentItem = dropdown
|
||||
droplist.height = dropcolumn.height + 2
|
||||
} else {
|
||||
droplist.height = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: droplist
|
||||
property int currentOption: 0
|
||||
|
||||
width: 154
|
||||
height: 0
|
||||
clip: true
|
||||
x: dropdown.x
|
||||
y: dropdown.height
|
||||
border.width: 1
|
||||
border.color: "#DBDBDB"
|
||||
color: "#FFFFFF"
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
height: 1
|
||||
color: "#FFFFFF"
|
||||
}
|
||||
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
ListModel {
|
||||
id: dropdownModel
|
||||
ListElement { name: "NAME" }
|
||||
ListElement { name: "DESCRIPTION" }
|
||||
ListElement { name: "ADDRESS" }
|
||||
}
|
||||
|
||||
Column {
|
||||
id: dropcolumn
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: 1
|
||||
|
||||
Repeater {
|
||||
model: dropdownModel
|
||||
delegate: Rectangle {
|
||||
property bool isCurrent: name === dropText.text
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
color: delegateArea.pressed || isCurrent ? "#4A4646" : "#FFFFFF"
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
elide: Text.ElideRight
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 12
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: delegateArea.pressed || parent.isCurrent ? "#FFFFFF" : "#4A4646"
|
||||
text: name
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: delegateArea
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
droplist.currentOption = index
|
||||
droplist.height = 0
|
||||
dropText.text = name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
id: button
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 6
|
||||
width: 80
|
||||
|
||||
shadowReleasedColor: "#C60F00"
|
||||
shadowPressedColor: "#8C0B00"
|
||||
pressedColor: "#C60F00"
|
||||
releasedColor: "#FF4F41"
|
||||
text: qsTr("SEARCH")
|
||||
onClicked: item.searchClicked(input.text, droplist.currentOption)
|
||||
}
|
||||
}
|
||||
}
|
||||
115
components/SettingsListItem.qml
Normal file
115
components/SettingsListItem.qml
Normal file
@@ -0,0 +1,115 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ColumnLayout {
|
||||
id: settingsListItem
|
||||
property alias iconText: iconLabel.text
|
||||
property alias description: area.text
|
||||
property alias title: header.text
|
||||
property bool isLast: false
|
||||
signal clicked()
|
||||
|
||||
Layout.fillWidth: true
|
||||
spacing: 0
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
Layout.fillWidth: true
|
||||
Layout.minimumHeight: 75
|
||||
Layout.preferredHeight: rect.height + 15
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
id: divider
|
||||
anchors.topMargin: 0
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
color: MoneroComponents.Style.dividerColor
|
||||
opacity: MoneroComponents.Style.dividerOpacity
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: rect
|
||||
width: parent.width
|
||||
height: header.height + area.contentHeight
|
||||
color: "transparent";
|
||||
anchors.left: parent.left
|
||||
anchors.bottomMargin: 4
|
||||
anchors.topMargin: 4
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
Rectangle {
|
||||
id: icon
|
||||
color: "transparent"
|
||||
height: 32
|
||||
width: 32
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 16
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: iconLabel
|
||||
fontSize: 32
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
anchors.centerIn: parent
|
||||
fontColor: MoneroComponents.Style.defaultFontColor
|
||||
styleName: "Solid"
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: header
|
||||
anchors.left: icon.right
|
||||
anchors.leftMargin: 16
|
||||
anchors.top: parent.top
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: MoneroComponents.Style.blackTheme ? 1.0 : 0.8
|
||||
font.bold: true
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16
|
||||
}
|
||||
|
||||
Text {
|
||||
id: area
|
||||
anchors.top: header.bottom
|
||||
anchors.topMargin: 4
|
||||
anchors.left: icon.right
|
||||
anchors.leftMargin: 16
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 15
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
wrapMode: Text.WordWrap;
|
||||
leftPadding: 0
|
||||
topPadding: 0
|
||||
width: parent.width - (icon.width + icon.anchors.leftMargin + anchors.leftMargin)
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bottomDivider
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
color: MoneroComponents.Style.dividerColor
|
||||
opacity: MoneroComponents.Style.dividerOpacity
|
||||
visible: settingsListItem.isLast
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onEntered: root.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: root.color = "transparent"
|
||||
onClicked: {
|
||||
settingsListItem.clicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
68
components/Slider.qml
Normal file
68
components/Slider.qml
Normal file
@@ -0,0 +1,68 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0 as QtQuickControls
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ColumnLayout {
|
||||
property alias from: slider.from
|
||||
property alias stepSize: slider.stepSize
|
||||
property alias to: slider.to
|
||||
property alias value: slider.value
|
||||
|
||||
property alias text: label.text
|
||||
|
||||
signal moved()
|
||||
|
||||
spacing: 0
|
||||
|
||||
Text {
|
||||
id: label
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.pixelSize: 14
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
QtQuickControls.Slider {
|
||||
id: slider
|
||||
leftPadding: 0
|
||||
snapMode: QtQuickControls.Slider.SnapAlways
|
||||
|
||||
background: Rectangle {
|
||||
x: parent.leftPadding
|
||||
y: parent.topPadding + parent.availableHeight / 2 - height / 2
|
||||
implicitWidth: 200
|
||||
implicitHeight: 4
|
||||
width: parent.availableWidth
|
||||
height: implicitHeight
|
||||
radius: 2
|
||||
color: MoneroComponents.Style.progressBarBackgroundColor
|
||||
|
||||
Rectangle {
|
||||
width: parent.visualPosition * parent.width
|
||||
height: parent.height
|
||||
color: MoneroComponents.Style.green
|
||||
radius: 2
|
||||
}
|
||||
}
|
||||
|
||||
handle: Rectangle {
|
||||
x: parent.leftPadding + parent.visualPosition * (parent.availableWidth - width)
|
||||
y: parent.topPadding + parent.availableHeight / 2 - height / 2
|
||||
implicitWidth: 18
|
||||
implicitHeight: 18
|
||||
radius: 8
|
||||
color: parent.pressed ? "#f0f0f0" : "#f6f6f6"
|
||||
border.color: MoneroComponents.Style.grey
|
||||
}
|
||||
|
||||
onMoved: parent.moved()
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,81 +26,151 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: button
|
||||
height: 37
|
||||
property string shadowPressedColor
|
||||
property string shadowReleasedColor
|
||||
property string pressedColor
|
||||
property string releasedColor
|
||||
property string icon: ""
|
||||
property string textColor: "#FFFFFF"
|
||||
property int fontSize: 12
|
||||
property bool fontAwesomeIcon: false
|
||||
property bool primary: true
|
||||
property string rightIcon: ""
|
||||
property string rightIconInactive: ""
|
||||
property color textColor: !button.enabled
|
||||
? MoneroComponents.Style.buttonTextColorDisabled
|
||||
: primary
|
||||
? MoneroComponents.Style.buttonTextColor
|
||||
: MoneroComponents.Style.buttonSecondaryTextColor;
|
||||
property bool small: false
|
||||
property alias text: label.text
|
||||
property alias fontBold: label.font.bold
|
||||
property int fontSize: {
|
||||
if(small) return 14;
|
||||
else return 16;
|
||||
}
|
||||
property alias label: label
|
||||
signal clicked()
|
||||
|
||||
// Dynamic label width
|
||||
Layout.minimumWidth: (label.contentWidth > 80)? label.contentWidth + 20 : 100
|
||||
height: small ? 30 : 36
|
||||
width: buttonLayout.width + 22
|
||||
implicitHeight: height
|
||||
implicitWidth: width
|
||||
|
||||
function doClick(){
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: buttonArea.pressed ? 0 : 1
|
||||
//radius: 4
|
||||
color: {
|
||||
parent.enabled ? (buttonArea.pressed ? parent.shadowPressedColor : parent.shadowReleasedColor)
|
||||
: Qt.lighter(parent.shadowReleasedColor)
|
||||
}
|
||||
border.color: Qt.darker(parent.releasedColor)
|
||||
id: buttonRect
|
||||
anchors.fill: parent
|
||||
radius: 3
|
||||
border.width: parent.focus ? 1 : 0
|
||||
|
||||
}
|
||||
state: button.enabled ? "active" : "disabled"
|
||||
Component.onCompleted: state = state
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: buttonArea.pressed ? 1 : 0
|
||||
color: {
|
||||
parent.enabled ? (buttonArea.pressed ? parent.pressedColor : parent.releasedColor)
|
||||
: Qt.lighter(parent.releasedColor)
|
||||
states: [
|
||||
State {
|
||||
name: "hover"
|
||||
when: buttonArea.containsMouse || button.focus
|
||||
PropertyChanges {
|
||||
target: buttonRect
|
||||
color: primary
|
||||
? MoneroComponents.Style.buttonBackgroundColorHover
|
||||
: MoneroComponents.Style.buttonSecondaryBackgroundColorHover
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "active"
|
||||
when: button.enabled
|
||||
PropertyChanges {
|
||||
target: buttonRect
|
||||
color: primary
|
||||
? MoneroComponents.Style.buttonBackgroundColor
|
||||
: MoneroComponents.Style.buttonSecondaryBackgroundColor
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "disabled"
|
||||
when: !button.enabled
|
||||
PropertyChanges {
|
||||
target: buttonRect
|
||||
color: MoneroComponents.Style.buttonBackgroundColorDisabled
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: Transition {
|
||||
enabled: appWindow.themeTransition
|
||||
ColorAnimation { duration: 100 }
|
||||
}
|
||||
//radius: 4
|
||||
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: button.fontSize
|
||||
color: parent.textColor
|
||||
visible: parent.icon === ""
|
||||
// font.capitalization : Font.Capitalize
|
||||
}
|
||||
|
||||
Image {
|
||||
RowLayout {
|
||||
id: buttonLayout
|
||||
height: button.height
|
||||
spacing: 11
|
||||
anchors.centerIn: parent
|
||||
visible: parent.icon !== ""
|
||||
source: parent.icon
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
font.family: MoneroComponents.Style.fontBold.name
|
||||
font.bold: true
|
||||
font.pixelSize: button.fontSize
|
||||
color: !buttonArea.pressed ? button.textColor : "transparent"
|
||||
visible: text !== ""
|
||||
themeTransition: false
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.centerIn: parent
|
||||
color: button.textColor
|
||||
font.bold: label.font.bold
|
||||
font.family: label.font.family
|
||||
font.pixelSize: label.font.pixelSize - 1
|
||||
text: label.text
|
||||
opacity: buttonArea.pressed ? 1 : 0
|
||||
themeTransition: false
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
visible: !fontAwesomeIcon && button.rightIcon !== ""
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||
width: button.small ? 16 : 20
|
||||
height: button.small ? 16 : 20
|
||||
source: {
|
||||
if(button.rightIconInactive !== "" && !button.enabled) {
|
||||
return button.rightIconInactive;
|
||||
}
|
||||
return button.rightIcon;
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.pixelSize: button.small ? 16 : 20
|
||||
font.styleName: "Solid"
|
||||
text: button.rightIcon
|
||||
visible: fontAwesomeIcon && button.rightIcon !== ""
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
onClicked: parent.clicked()
|
||||
hoverEnabled: true
|
||||
onClicked: doClick()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
|
||||
Keys.onSpacePressed: clicked()
|
||||
Keys.onReturnPressed: clicked()
|
||||
Keys.enabled: button.visible
|
||||
Keys.onSpacePressed: doClick()
|
||||
Keys.onEnterPressed: Keys.onReturnPressed(event)
|
||||
Keys.onReturnPressed: doClick()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,19 +26,20 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Window 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Window {
|
||||
Rectangle {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window | Qt.FramelessWindowHint
|
||||
color: "transparent"
|
||||
visible: false
|
||||
property alias title: dialogTitle.text
|
||||
property alias text: dialogContent.text
|
||||
property alias content: root.text
|
||||
@@ -47,12 +48,28 @@ Window {
|
||||
property alias textArea: dialogContent
|
||||
property alias okText: okButton.text
|
||||
property alias cancelText: cancelButton.text
|
||||
property alias closeVisible: closeButton.visible
|
||||
|
||||
property var icon
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
signal closeCallback();
|
||||
|
||||
// background
|
||||
MoneroEffects.GradientBackground {
|
||||
anchors.fill: parent
|
||||
fallBackColor: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
initialStartColor: MoneroComponents.Style.middlePanelBackgroundGradientStart
|
||||
initialStopColor: MoneroComponents.Style.middlePanelBackgroundGradientStop
|
||||
blackColorStart: MoneroComponents.Style._b_middlePanelBackgroundGradientStart
|
||||
blackColorStop: MoneroComponents.Style._b_middlePanelBackgroundGradientStop
|
||||
whiteColorStart: MoneroComponents.Style._w_middlePanelBackgroundGradientStart
|
||||
whiteColorStop: MoneroComponents.Style._w_middlePanelBackgroundGradientStop
|
||||
start: Qt.point(0, 0)
|
||||
end: Qt.point(height, width)
|
||||
}
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
@@ -64,42 +81,85 @@ Window {
|
||||
}
|
||||
|
||||
function open() {
|
||||
show()
|
||||
// Center
|
||||
root.x = parent.width/2 - root.width/2
|
||||
root.y = 100
|
||||
root.z = 11
|
||||
root.visible = true;
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
// reset button text
|
||||
okButton.text = qsTr("OK")
|
||||
cancelButton.text = qsTr("Cancel")
|
||||
|
||||
closeCallback();
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: 280
|
||||
width: 520
|
||||
height: 380
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
|
||||
RowLayout {
|
||||
id: column
|
||||
//anchors {fill: parent; margins: 16 }
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: 14
|
||||
Layout.fillWidth: true
|
||||
|
||||
Label {
|
||||
MoneroComponents.Label {
|
||||
id: dialogTitle
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 32
|
||||
font.family: "Arial"
|
||||
color: "#555555"
|
||||
fontSize: 18
|
||||
fontFamily: "Arial"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
TextArea {
|
||||
id : dialogContent
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
font.family: "Arial"
|
||||
textFormat: TextEdit.AutoText
|
||||
readOnly: true
|
||||
font.pixelSize: 12
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 240
|
||||
|
||||
Flickable {
|
||||
id: flickable
|
||||
anchors.fill: parent
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
onActiveChanged: if (!active && !isMac) active = true
|
||||
}
|
||||
boundsBehavior: isMac ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
|
||||
|
||||
TextArea.flickable: TextArea {
|
||||
id: dialogContent
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
renderType: Text.QtRendering
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
textFormat: TextEdit.AutoText
|
||||
readOnly: true
|
||||
font.pixelSize: 14
|
||||
selectByMouse: false
|
||||
wrapMode: TextEdit.Wrap
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
appWindow.showStatusMessage(qsTr("Double tap to copy"),3)
|
||||
}
|
||||
onDoubleClicked: {
|
||||
parent.selectAll()
|
||||
parent.copy()
|
||||
parent.deselect()
|
||||
console.log("copied to clipboard");
|
||||
appWindow.showStatusMessage(qsTr("Content copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,12 +171,6 @@ Window {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
onClicked: {
|
||||
root.close()
|
||||
@@ -126,24 +180,76 @@ Window {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Ok")
|
||||
text: qsTr("OK") + translationManager.emptyString
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// close icon
|
||||
Rectangle {
|
||||
id: closeButton
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
width: 48
|
||||
height: 48
|
||||
color: "transparent"
|
||||
|
||||
MoneroEffects.ImageMask {
|
||||
anchors.centerIn: parent
|
||||
width: 16
|
||||
height: 16
|
||||
image: MoneroComponents.Style.titleBarCloseSource
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: closeButton.color = "#262626";
|
||||
onExited: closeButton.color = "transparent";
|
||||
}
|
||||
}
|
||||
|
||||
// window borders
|
||||
Rectangle{
|
||||
width: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
width: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
height: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
height: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,112 +26,66 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "../components/effects/" as MoneroEffects
|
||||
|
||||
Item {
|
||||
id: dropdown
|
||||
property int itemTopMargin: 0
|
||||
property alias dataModel: repeater.model
|
||||
property string shadowPressedColor
|
||||
property string shadowReleasedColor
|
||||
property string pressedColor
|
||||
property string releasedColor
|
||||
property string textColor: "#FFFFFF"
|
||||
property alias currentIndex: column.currentIndex
|
||||
property bool expanded: false
|
||||
height: 37
|
||||
property string pressedColor: MoneroComponents.Style.appWindowBorderColor
|
||||
property string releasedColor: MoneroComponents.Style.titleBarButtonHoverColor
|
||||
property string textColor: MoneroComponents.Style.defaultFontColor
|
||||
property alias currentIndex: columnid.currentIndex
|
||||
readonly property alias expanded: popup.visible
|
||||
property int dropdownHeight: 42
|
||||
property int fontHeaderSize: 16
|
||||
property int fontItemSize: 14
|
||||
property string colorBorder: MoneroComponents.Style.inputBorderColorInActive
|
||||
property string colorHeaderBackground: "transparent"
|
||||
property bool headerBorder: true
|
||||
property bool headerFontBold: false
|
||||
|
||||
height: dropdownHeight
|
||||
|
||||
signal changed();
|
||||
|
||||
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
|
||||
function hide() { dropdown.expanded = false }
|
||||
function containsPoint(px, py) {
|
||||
if(px < 0)
|
||||
return false
|
||||
if(px > width)
|
||||
return false
|
||||
if(py < 0)
|
||||
return false
|
||||
if(py > height + droplist.height)
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
Item {
|
||||
id: head
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 37
|
||||
anchors.topMargin: parent.itemTopMargin
|
||||
height: dropdown.dropdownHeight
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: dropdown.expanded || droplist.height > 0 ? 0 : 1
|
||||
color: dropdown.expanded || droplist.height > 0 ? dropdown.shadowPressedColor : dropdown.shadowReleasedColor
|
||||
//radius: 4
|
||||
color: "transparent"
|
||||
border.width: dropdown.headerBorder ? 1 : 0
|
||||
border.color: dropdown.colorBorder
|
||||
radius: 4
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: dropdown.expanded || droplist.height > 0 ? 1 : 0
|
||||
color: dropdown.expanded || droplist.height > 0 ? dropdown.pressedColor : dropdown.releasedColor
|
||||
//radius: 4
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
height: 3
|
||||
width: 3
|
||||
color: dropdown.pressedColor
|
||||
visible: dropdown.expanded || droplist.height > 0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 3
|
||||
width: 3
|
||||
color: dropdown.pressedColor
|
||||
visible: dropdown.expanded || droplist.height > 0
|
||||
}
|
||||
|
||||
Text {
|
||||
id: firstColText
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12
|
||||
elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#FFFFFF"
|
||||
text: column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column1) + translationManager.emptyString : ""
|
||||
}
|
||||
|
||||
Text {
|
||||
id: secondColText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: separator.left
|
||||
anchors.rightMargin: 12
|
||||
width: dropdown.expanded ? w : (separator.x - 12) - (firstColText.x + firstColText.width + 5)
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#FFFFFF"
|
||||
text: column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column2) + translationManager.emptyString : ""
|
||||
|
||||
property int w: 0
|
||||
Component.onCompleted: w = implicitWidth
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: separator
|
||||
anchors.right: dropIndicator.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
height: 18
|
||||
width: 1
|
||||
color: "#FFFFFF"
|
||||
anchors.rightMargin: 12
|
||||
elide: Text.ElideRight
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.bold: dropdown.headerFontBold
|
||||
font.pixelSize: dropdown.fontHeaderSize
|
||||
color: dropdown.textColor
|
||||
text: columnid.currentIndex < repeater.model.count ? qsTr(repeater.model.get(columnid.currentIndex).column1) + translationManager.emptyString : ""
|
||||
}
|
||||
|
||||
Item {
|
||||
@@ -139,125 +93,126 @@ Item {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 32
|
||||
anchors.rightMargin: 12
|
||||
width: dropdownIcon.width
|
||||
|
||||
Image {
|
||||
id: dropdownIcon
|
||||
anchors.centerIn: parent
|
||||
source: "../images/whiteDropIndicator.png"
|
||||
rotation: dropdown.expanded ? 180 : 0
|
||||
source: "qrc:///images/whiteDropIndicator.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: dropdownIcon
|
||||
anchors.fill: dropdownIcon
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
rotation: dropdown.expanded ? 180 : 0
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: dropArea
|
||||
anchors.fill: parent
|
||||
onClicked: dropdown.expanded = !dropdown.expanded
|
||||
onClicked: dropdown.expanded ? popup.close() : popup.open()
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: droplist
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: head.bottom
|
||||
clip: true
|
||||
height: dropdown.expanded ? column.height : 0
|
||||
color: dropdown.pressedColor
|
||||
//radius: 4
|
||||
Popup {
|
||||
id: popup
|
||||
padding: 0
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
id: droplist
|
||||
x: dropdown.x
|
||||
width: dropdown.width
|
||||
y: head.y + head.height
|
||||
clip: true
|
||||
height: dropdown.expanded ? columnid.height : 0
|
||||
color: dropdown.pressedColor
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: dropdown.pressedColor
|
||||
}
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
Column {
|
||||
id: columnid
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
property int currentIndex: 0
|
||||
|
||||
Column {
|
||||
id: column
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
property int currentIndex: 0
|
||||
Repeater {
|
||||
id: repeater
|
||||
|
||||
Repeater {
|
||||
id: repeater
|
||||
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
|
||||
property string stringAutomatic: qsTr("Automatic") + translationManager.emptyString
|
||||
property string stringSlow: qsTr("Slow (x0.2 fee)") + translationManager.emptyString
|
||||
property string stringNormal: qsTr("Normal (x1 fee)") + translationManager.emptyString
|
||||
property string stringFast: qsTr("Fast (x5 fee)") + translationManager.emptyString
|
||||
property string stringFastest: qsTr("Fastest (x200 fee)") + translationManager.emptyString
|
||||
|
||||
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
|
||||
property string stringLow: qsTr("Low (x1 fee)") + translationManager.emptyString
|
||||
property string stringMedium: qsTr("Medium (x20 fee)") + translationManager.emptyString
|
||||
property string stringHigh: qsTr("High (x166 fee)") + translationManager.emptyString
|
||||
property string stringSlow: qsTr("Slow (x0.25 fee)") + translationManager.emptyString
|
||||
property string stringDefault: qsTr("Default (x1 fee)") + translationManager.emptyString
|
||||
property string stringFast: qsTr("Fast (x5 fee)") + translationManager.emptyString
|
||||
property string stringFastest: qsTr("Fastest (x41.5 fee)") + translationManager.emptyString
|
||||
property string stringAll: qsTr("All") + translationManager.emptyString
|
||||
property string stringSent: qsTr("Sent") + translationManager.emptyString
|
||||
property string stringReceived: qsTr("Received") + translationManager.emptyString
|
||||
|
||||
|
||||
delegate: Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
//radius: index === repeater.count - 1 ? 4 : 0
|
||||
color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? dropdown.releasedColor : dropdown.pressedColor
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
delegate: Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: col2Text.left
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: column2.length > 0 ? 12 : 0
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#FFFFFF"
|
||||
text: qsTr(column1) + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
id: col2Text
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 45
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#FFFFFF"
|
||||
text: column2
|
||||
}
|
||||
height: (dropdown.dropdownHeight * 0.75)
|
||||
//radius: index === repeater.count - 1 ? 4 : 0
|
||||
color: itemArea.containsMouse || index === columnid.currentIndex || itemArea.containsMouse ? dropdown.releasedColor : dropdown.pressedColor
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
MoneroComponents.TextPlain {
|
||||
id: col1Text
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: col2Text.left
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 0
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.bold: true
|
||||
font.pixelSize: fontItemSize
|
||||
color: itemArea.containsMouse || index === columnid.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF"
|
||||
text: qsTr(column1) + translationManager.emptyString
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
MoneroComponents.TextPlain {
|
||||
id: col2Text
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 45
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: "#FFFFFF"
|
||||
text: ""
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
dropdown.expanded = false
|
||||
column.currentIndex = index
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
onClicked: {
|
||||
popup.close()
|
||||
columnid.currentIndex = index
|
||||
changed();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
197
components/Style.qml
Normal file
197
components/Style.qml
Normal file
@@ -0,0 +1,197 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick 2.5
|
||||
|
||||
QtObject {
|
||||
property bool blackTheme: true
|
||||
property QtObject fontMedium: FontLoader { id: _fontMedium; source: "qrc:/fonts/Roboto-Medium.ttf"; }
|
||||
property QtObject fontBold: FontLoader { id: _fontBold; source: "qrc:/fonts/Roboto-Bold.ttf"; }
|
||||
property QtObject fontLight: FontLoader { id: _fontLight; source: "qrc:/fonts/Roboto-Light.ttf"; }
|
||||
property QtObject fontRegular: FontLoader { id: _fontRegular; source: "qrc:/fonts/Roboto-Regular.ttf"; }
|
||||
|
||||
property QtObject fontMonoMedium: FontLoader { id: _fontMonoMedium; source: "qrc:/fonts/RobotoMono-Medium.ttf"; }
|
||||
property QtObject fontMonoBold: FontLoader { id: _fontMonoBold; source: "qrc:/fonts/RobotoMono-Bold.ttf"; }
|
||||
property QtObject fontMonoLight: FontLoader { id: _fontMonoLight; source: "qrc:/fonts/RobotoMono-Light.ttf"; }
|
||||
property QtObject fontMonoRegular: FontLoader { id: _fontMonoRegular; source: "qrc:/fonts/RobotoMono-Regular.ttf"; }
|
||||
|
||||
property string grey: "#404040"
|
||||
property string orange: "#FF6C3C"
|
||||
property string white: "#FFFFFF"
|
||||
property string green: "#2EB358"
|
||||
property string moneroGrey: "#4C4C4C"
|
||||
property string warningColor: "orange"
|
||||
|
||||
property string defaultFontColor: blackTheme ? _b_defaultFontColor : _w_defaultFontColor
|
||||
property string dimmedFontColor: blackTheme ? _b_dimmedFontColor : _w_dimmedFontColor
|
||||
property string lightGreyFontColor: blackTheme ? _b_lightGreyFontColor : _w_lightGreyFontColor
|
||||
property string errorColor: blackTheme ? _b_errorColor : _w_errorColor
|
||||
property string textSelectionColor: blackTheme ? _b_textSelectionColor : _w_textSelectionColor
|
||||
property string textSelectedColor: blackTheme ? _b_textSelectedColor : _w_textSelectedColor
|
||||
|
||||
property string inputBoxBackground: blackTheme ? _b_inputBoxBackground : _w_inputBoxBackground
|
||||
property string inputBoxBackgroundDisabled: blackTheme ? _b_inputBoxBackgroundDisabled : _w_inputBoxBackgroundDisabled
|
||||
property string inputBoxBackgroundError: blackTheme ? _b_inputBoxBackgroundError : _w_inputBoxBackgroundError
|
||||
property string inputBoxColor: blackTheme ? _b_inputBoxColor : _w_inputBoxColor
|
||||
property string legacy_placeholderFontColor: blackTheme ? _b_legacy_placeholderFontColor : _w_legacy_placeholderFontColor
|
||||
property string inputBorderColorActive: blackTheme ? _b_inputBorderColorActive : _w_inputBorderColorActive
|
||||
property string inputBorderColorInActive: blackTheme ? _b_inputBorderColorInActive : _w_inputBorderColorInActive
|
||||
property string inputBorderColorInvalid: blackTheme ? _b_inputBorderColorInvalid : _w_inputBorderColorInvalid
|
||||
|
||||
property string buttonBackgroundColor: blackTheme ? _b_buttonBackgroundColor : _w_buttonBackgroundColor
|
||||
property string buttonBackgroundColorHover: blackTheme ? _b_buttonBackgroundColorHover : _w_buttonBackgroundColorHover
|
||||
property string buttonBackgroundColorDisabled: blackTheme ? _b_buttonBackgroundColorDisabled : _w_buttonBackgroundColorDisabled
|
||||
property string buttonBackgroundColorDisabledHover: blackTheme ? _b_buttonBackgroundColorDisabledHover : _w_buttonBackgroundColorDisabledHover
|
||||
property string buttonInlineBackgroundColor: blackTheme ? _b_buttonInlineBackgroundColor : _w_buttonInlineBackgroundColor
|
||||
property string buttonTextColor: blackTheme ? _b_buttonTextColor : _w_buttonTextColor
|
||||
property string buttonTextColorDisabled: blackTheme ? _b_buttonTextColorDisabled : _w_buttonTextColorDisabled
|
||||
property string buttonSecondaryBackgroundColor: "#d9d9d9"
|
||||
property string buttonSecondaryBackgroundColorHover: "#a6a6a6"
|
||||
property string buttonSecondaryTextColor: "#4d4d4d"
|
||||
property string dividerColor: blackTheme ? _b_dividerColor : _w_dividerColor
|
||||
property real dividerOpacity: blackTheme ? _b_dividerOpacity : _w_dividerOpacity
|
||||
|
||||
property string titleBarBackgroundGradientStart: blackTheme ? _b_titleBarBackgroundGradientStart : _w_titleBarBackgroundGradientStart
|
||||
property string titleBarBackgroundGradientStop: blackTheme ? _b_titleBarBackgroundGradientStop : _w_titleBarBackgroundGradientStop
|
||||
property string titleBarBackgroundBorderColor: blackTheme ? _b_titleBarBackgroundBorderColor : _w_titleBarBackgroundBorderColor
|
||||
property string titleBarLogoSource: blackTheme ? _b_titleBarLogoSource : _w_titleBarLogoSource
|
||||
property string titleBarMinimizeSource: blackTheme ? _b_titleBarMinimizeSource : _w_titleBarMinimizeSource
|
||||
property string titleBarFullscreenSource: blackTheme ? _b_titleBarFullscreenSource : _w_titleBarFullscreenSource
|
||||
property string titleBarCloseSource: blackTheme ? _b_titleBarCloseSource : _w_titleBarCloseSource
|
||||
property string titleBarButtonHoverColor: blackTheme ? _b_titleBarButtonHoverColor : _w_titleBarButtonHoverColor
|
||||
|
||||
property string wizardBackgroundGradientStart: blackTheme ? _b_wizardBackgroundGradientStart : _w_wizardBackgroundGradientStart
|
||||
property string middlePanelBackgroundGradientStart: blackTheme ? _b_middlePanelBackgroundGradientStart : _w_middlePanelBackgroundGradientStart
|
||||
property string middlePanelBackgroundGradientStop: blackTheme ? _b_middlePanelBackgroundGradientStop : _w_middlePanelBackgroundGradientStop
|
||||
property string middlePanelBackgroundColor: blackTheme ? _b_middlePanelBackgroundColor : _w_middlePanelBackgroundColor
|
||||
property string menuButtonFallbackBackgroundColor: blackTheme ? _b_menuButtonFallbackBackgroundColor : _w_menuButtonFallbackBackgroundColor
|
||||
property string menuButtonGradientStart: blackTheme ? _b_menuButtonGradientStart : _w_menuButtonGradientStart
|
||||
property string menuButtonGradientStop: blackTheme ? _b_menuButtonGradientStop : _w_menuButtonGradientStop
|
||||
property string menuButtonTextColor: blackTheme ? _b_menuButtonTextColor : _w_menuButtonTextColor
|
||||
property string menuButtonImageRightColorActive: blackTheme ? _b_menuButtonImageRightColorActive : _w_menuButtonImageRightColorActive
|
||||
property string menuButtonImageRightColor: blackTheme ? _b_menuButtonImageRightColor : _w_menuButtonImageRightColor
|
||||
property string menuButtonImageRightSource: blackTheme ? _b_menuButtonImageRightSource : _w_menuButtonImageRightSource
|
||||
property string menuButtonImageDotArrowSource: blackTheme ? _b_menuButtonImageDotArrowSource : _w_menuButtonImageDotArrowSource
|
||||
property string inlineButtonTextColor: blackTheme ? _b_inlineButtonTextColor : _w_inlineButtonTextColor
|
||||
property string inlineButtonBorderColor: blackTheme ? _b_inlineButtonBorderColor : _w_inlineButtonBorderColor
|
||||
property string appWindowBackgroundColor: blackTheme ? _b_appWindowBackgroundColor : _w_appWindowBackgroundColor
|
||||
property string appWindowBorderColor: blackTheme ? _b_appWindowBorderColor : _w_appWindowBorderColor
|
||||
property bool progressBarProgressTextBold: blackTheme ? _b_progressBarProgressTextBold : _w_progressBarProgressTextBold
|
||||
property string progressBarBackgroundColor: blackTheme ? _b_progressBarBackgroundColor : _w_progressBarBackgroundColor
|
||||
property string leftPanelBackgroundGradientStart: blackTheme ? _b_leftPanelBackgroundGradientStart : _w_leftPanelBackgroundGradientStart
|
||||
property string leftPanelBackgroundGradientStop: blackTheme ? _b_leftPanelBackgroundGradientStop : _w_leftPanelBackgroundGradientStop
|
||||
property string historyHeaderTextColor: blackTheme ? _b_historyHeaderTextColor : _w_historyHeaderTextColor
|
||||
|
||||
property string _b_defaultFontColor: "white"
|
||||
property string _b_dimmedFontColor: "#BBBBBB"
|
||||
property string _b_lightGreyFontColor: "#DFDFDF"
|
||||
property string _b_errorColor: "#FA6800"
|
||||
property string _b_textSelectionColor: "#BBBBBB"
|
||||
property string _b_textSelectedColor: "white"
|
||||
|
||||
property string _b_inputBoxBackground: "black"
|
||||
property string _b_inputBoxBackgroundDisabled: Qt.rgba(255, 255, 255, 0.10)
|
||||
property string _b_inputBoxBackgroundError: "#FFDDDD"
|
||||
property string _b_inputBoxColor: "white"
|
||||
property string _b_legacy_placeholderFontColor: "#BABABA"
|
||||
property string _b_inputBorderColorActive: Qt.rgba(255, 255, 255, 0.38)
|
||||
property string _b_inputBorderColorInActive: Qt.rgba(255, 255, 255, 0.32)
|
||||
property string _b_inputBorderColorInvalid: Qt.rgba(255, 0, 0, 0.40)
|
||||
|
||||
property string _b_buttonBackgroundColor: "#FA6800"
|
||||
property string _b_buttonBackgroundColorHover: "#E65E00"
|
||||
property string _b_buttonBackgroundColorDisabled: "#707070"
|
||||
property string _b_buttonBackgroundColorDisabledHover: "#808080"
|
||||
property string _b_buttonInlineBackgroundColor: "#707070"
|
||||
property string _b_buttonTextColor: "white"
|
||||
property string _b_buttonTextColorDisabled: "black"
|
||||
property string _b_dividerColor: "white"
|
||||
property real _b_dividerOpacity: 0.20
|
||||
|
||||
property string _b_titleBarBackgroundGradientStart: "#262626";
|
||||
property string _b_titleBarBackgroundGradientStop: "#191919"
|
||||
property string _b_titleBarBackgroundBorderColor: "#2f2f2f"
|
||||
property string _b_titleBarLogoSource: "qrc:///images/titlebarLogo.png"
|
||||
property string _b_titleBarMinimizeSource: "qrc:///images/minimize.svg"
|
||||
property string _b_titleBarFullscreenSource: "qrc:///images/fullscreen.svg"
|
||||
property string _b_titleBarCloseSource: "qrc:///images/close.svg"
|
||||
property string _b_titleBarButtonHoverColor: "#10FFFFFF"
|
||||
|
||||
property string _b_wizardBackgroundGradientStart: "#1e1e1e"
|
||||
property string _b_middlePanelBackgroundGradientStart: "#232323"
|
||||
property string _b_middlePanelBackgroundGradientStop: "#101010"
|
||||
property string _b_middlePanelBackgroundColor: "#181818"
|
||||
property string _b_menuButtonFallbackBackgroundColor: "#09FFFFFF"
|
||||
property string _b_menuButtonGradientStart: "#11FFFFFF"
|
||||
property string _b_menuButtonGradientStop: "#00000000"
|
||||
property string _b_menuButtonTextColor: "white"
|
||||
property string _b_menuButtonImageRightColorActive: "white"
|
||||
property string _b_menuButtonImageRightColor: "white"
|
||||
property string _b_menuButtonImageRightSource: "qrc:///images/right.svg"
|
||||
property string _b_menuButtonImageDotArrowSource: "qrc:///images/arrow-right-medium-white.png"
|
||||
property string _b_inlineButtonTextColor: "white"
|
||||
property string _b_inlineButtonBorderColor: "black"
|
||||
property string _b_appWindowBackgroundColor: "white"
|
||||
property string _b_appWindowBorderColor: "#313131"
|
||||
property bool _b_progressBarProgressTextBold: true
|
||||
property string _b_progressBarBackgroundColor: "#24FFFFFF"
|
||||
property string _b_leftPanelBackgroundGradientStart: "#222222"
|
||||
property string _b_leftPanelBackgroundGradientStop: "#1a1a1a"
|
||||
property string _b_historyHeaderTextColor: "#C0C0C0"
|
||||
|
||||
property string _w_defaultFontColor: "black"
|
||||
property string _w_dimmedFontColor: "#3f3f3f"
|
||||
property string _w_lightGreyFontColor: "#515151"
|
||||
property string _w_errorColor: "#FA6800"
|
||||
property string _w_textSelectionColor: "#BBBBBB"
|
||||
property string _w_textSelectedColor: "black"
|
||||
|
||||
property string _w_inputBoxBackground: "white"
|
||||
property string _w_inputBoxBackgroundDisabled: Qt.rgba(0, 0, 0, 0.20)
|
||||
property string _w_inputBoxBackgroundError: "#FFDDDD"
|
||||
property string _w_inputBoxColor: "black"
|
||||
property string _w_legacy_placeholderFontColor: "#BABABA"
|
||||
property string _w_inputBorderColorActive: Qt.rgba(0, 0, 0, 0.30)
|
||||
property string _w_inputBorderColorInActive: Qt.rgba(0, 0, 0, 0.16)
|
||||
property string _w_inputBorderColorInvalid: Qt.rgba(255, 0, 0, 0.50)
|
||||
|
||||
property string _w_buttonBackgroundColor: "#FA6800"
|
||||
property string _w_buttonBackgroundColorHover: "#E65E00"
|
||||
property string _w_buttonBackgroundColorDisabled: "#bbbbbb"
|
||||
property string _w_buttonBackgroundColorDisabledHover: "#D1D1D1"
|
||||
property string _w_buttonInlineBackgroundColor: "#bbbbbb"
|
||||
property string _w_buttonTextColor: "white"
|
||||
property string _w_buttonTextColorDisabled: "black"
|
||||
property string _w_dividerColor: "black"
|
||||
property real _w_dividerOpacity: 0.20
|
||||
|
||||
property string _w_titleBarBackgroundGradientStart: "#fcfcfc"
|
||||
property string _w_titleBarBackgroundGradientStop: "#FBFBFB"
|
||||
property string _w_titleBarBackgroundBorderColor: "#DEDEDE"
|
||||
property string _w_titleBarLogoSource: "qrc:///images/themes/white/titlebarLogo.png"
|
||||
property string _w_titleBarMinimizeSource: "qrc:///images/themes/white/minimize.svg"
|
||||
property string _w_titleBarFullscreenSource: "qrc:///images/themes/white/fullscreen.svg"
|
||||
property string _w_titleBarCloseSource: "qrc:///images/themes/white/close.svg"
|
||||
property string _w_titleBarButtonHoverColor: "#11000000"
|
||||
|
||||
property string _w_wizardBackgroundGradientStart: "white"
|
||||
property string _w_middlePanelBackgroundGradientStart: "white"
|
||||
property string _w_middlePanelBackgroundGradientStop: "#ededed"
|
||||
property string _w_middlePanelBackgroundColor: "#f5f5f5"
|
||||
property string _w_menuButtonFallbackBackgroundColor: "#09000000"
|
||||
property string _w_menuButtonGradientStart: "#08000000"
|
||||
property string _w_menuButtonGradientStop: "#10FFFFFF"
|
||||
property string _w_menuButtonTextColor: "#787878"
|
||||
property string _w_menuButtonImageRightSource: "qrc:///images/right.svg"
|
||||
property string _w_menuButtonImageRightColorActive: "#FA6800"
|
||||
property string _w_menuButtonImageRightColor: "#808080"
|
||||
property string _w_menuButtonImageDotArrowSource: "qrc:///images/arrow-right-medium-white.png"
|
||||
property string _w_inlineButtonTextColor: "black"
|
||||
property string _w_inlineButtonBorderColor: "transparent"
|
||||
property string _w_appWindowBackgroundColor: "black"
|
||||
property string _w_appWindowBorderColor: "#dedede"
|
||||
property bool _w_progressBarProgressTextBold: false
|
||||
property string _w_progressBarBackgroundColor: "#24000000"
|
||||
property string _w_leftPanelBackgroundGradientStart: "white"
|
||||
property string _w_leftPanelBackgroundGradientStop: "#f5f5f5"
|
||||
property string _w_historyHeaderTextColor: "#515151"
|
||||
}
|
||||
191
components/SuccessfulTxDialog.qml
Normal file
191
components/SuccessfulTxDialog.qml
Normal file
@@ -0,0 +1,191 @@
|
||||
// Copyright (c) 2014-2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
x: parent.width/2 - root.width/2
|
||||
y: parent.height/2 - root.height/2
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 580
|
||||
height: 400
|
||||
color: MoneroComponents.Style.blackTheme ? "black" : "white"
|
||||
visible: false
|
||||
radius: 10
|
||||
border.color: MoneroComponents.Style.blackTheme ? Qt.rgba(255, 255, 255, 0.25) : Qt.rgba(0, 0, 0, 0.25)
|
||||
border.width: 1
|
||||
focus: true
|
||||
Keys.enabled: true
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
Keys.onEnterPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
Keys.onReturnPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
KeyNavigation.tab: doneButton
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
property var transactionID;
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
function open(txid) {
|
||||
root.transactionID = txid;
|
||||
root.visible = true;
|
||||
root.forceActiveFocus();
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 10
|
||||
anchors.fill: parent
|
||||
anchors.margins: 25
|
||||
|
||||
ColumnLayout{
|
||||
Layout.topMargin: 10
|
||||
Layout.leftMargin: 0
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
MoneroComponents.Label {
|
||||
fontSize: 18
|
||||
fontFamily: "Arial"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
text: {
|
||||
if (appWindow.viewOnly){
|
||||
return qsTr("Transaction file successfully saved!") + translationManager.emptyString;
|
||||
} else {
|
||||
return qsTr("Transaction successfully sent!") + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
id: successImage
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
width: 140
|
||||
height: 140
|
||||
source: "qrc:///images/success.png"
|
||||
|
||||
SequentialAnimation{
|
||||
running: successImage.visible
|
||||
ScaleAnimator { target: successImage; from: 0.4; to: 1.3; duration: 125}
|
||||
ScaleAnimator { target: successImage; from: 1.3; to: 1; duration: 80}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.LineEditMulti {
|
||||
visible: !appWindow.viewOnly
|
||||
Layout.leftMargin: 25
|
||||
Layout.rightMargin: 25
|
||||
borderDisabled: true
|
||||
readOnly: true
|
||||
copyButton: true
|
||||
wrapMode: Text.Wrap
|
||||
labelText: qsTr("Transaction ID:") + translationManager.emptyString
|
||||
text: root.transactionID ? root.transactionID : "";
|
||||
fontSize: 16
|
||||
}
|
||||
|
||||
MoneroComponents.LineEditMulti {
|
||||
visible: appWindow.viewOnly
|
||||
Layout.leftMargin: 25
|
||||
borderDisabled: true
|
||||
readOnly: true
|
||||
wrapMode: Text.Wrap
|
||||
labelText: qsTr("Transaction file location:") + translationManager.emptyString
|
||||
text: walletManager.urlToLocalPath(saveTxDialog.fileUrl)
|
||||
fontSize: 16
|
||||
}
|
||||
|
||||
// open folder / done buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 70
|
||||
Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 50
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: openFolderButton
|
||||
visible: appWindow.viewOnly
|
||||
text: qsTr("Open folder") + translationManager.emptyString;
|
||||
width: 200
|
||||
KeyNavigation.tab: doneButton
|
||||
Keys.enabled: openFolderButton.visible
|
||||
Keys.onReturnPressed: openFolderButton.onClicked
|
||||
Keys.onEnterPressed: openFolderButton.onClicked
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
onClicked: {
|
||||
oshelper.openContainingFolder(walletManager.urlToLocalPath(saveTxDialog.fileUrl))
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: doneButton
|
||||
text: qsTr("Done") + translationManager.emptyString;
|
||||
width: 200
|
||||
focus: true
|
||||
KeyNavigation.tab: openFolderButton
|
||||
Keys.enabled: doneButton.visible
|
||||
Keys.onReturnPressed: doneButton.onClicked
|
||||
Keys.onEnterPressed: doneButton.onClicked
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,237 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
id: dropdown
|
||||
property bool expanded: false
|
||||
property alias dataModel: repeater.model
|
||||
signal collapsed()
|
||||
signal optionClicked(int option)
|
||||
width: 72
|
||||
height: 37
|
||||
|
||||
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
|
||||
function hide() { dropdown.expanded = false }
|
||||
function containsPoint(px, py) {
|
||||
if(px < 0)
|
||||
return false
|
||||
if(px > width)
|
||||
return false
|
||||
if(py < 0)
|
||||
return false
|
||||
if(py > height + dropArea.height)
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
Item {
|
||||
id: head
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: dropdown.expanded || dropArea.height > 0 ? 0 : 1
|
||||
//radius: 3
|
||||
color: dropdown.expanded || dropArea.height > 0 ? "#888888" : "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
y: dropdown.expanded || dropArea.height > 0 ? 1 : 0
|
||||
//radius: 3
|
||||
color: dropdown.expanded || dropArea.height > 0 ? "#DBDBDB" : "#F0EEEE"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
height: 3
|
||||
width: 3
|
||||
color: "#DBDBDB"
|
||||
visible: dropdown.expanded || dropArea.height > 0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 3
|
||||
width: 3
|
||||
color: "#DBDBDB"
|
||||
visible: dropdown.expanded || dropArea.height > 0
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
source: "../images/tableOptions.png"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.centerIn: parent
|
||||
anchors.horizontalCenterOffset: 1
|
||||
height: 23
|
||||
width: 1
|
||||
color: dropdown.expanded || dropArea.height > 0 ? "#FFFFFF" : "#DBDBDB"
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
source: "../images/dropIndicator.png"
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: timer
|
||||
interval: 50
|
||||
repeat: true
|
||||
running: false
|
||||
onTriggered: {
|
||||
if(((appWindow.toolTip.visible && !appWindow.toolTip.containsMouse) || !appWindow.toolTip.visible) && !mouseArea.containsMouse) {
|
||||
appWindow.toolTip.visible = false
|
||||
dropdown.expanded = false
|
||||
currentIndex = -1
|
||||
timer.stop()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.left: head.left
|
||||
anchors.right: head.right
|
||||
anchors.top: head.top
|
||||
height: head.height + dropArea.height
|
||||
hoverEnabled: true
|
||||
onEntered: dropdown.expanded = true
|
||||
|
||||
property int currentIndex: -1
|
||||
onMouseYChanged: {
|
||||
if(mouseY > head.height) {
|
||||
var posY = parseInt((mouseY - head.height) / 30)
|
||||
currentIndex = posY
|
||||
} else {
|
||||
currentIndex = -1
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
optionClicked(currentIndex)
|
||||
}
|
||||
|
||||
onExited: timer.start()
|
||||
preventStealing: true
|
||||
z: 1
|
||||
|
||||
Item {
|
||||
id: dropArea
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
y: head.height
|
||||
height: dropdown.expanded ? column.height : 0
|
||||
onHeightChanged: if(height === 0) dropdown.collapsed()
|
||||
clip: true
|
||||
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
Column {
|
||||
id: column
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
|
||||
Repeater {
|
||||
id: repeater
|
||||
|
||||
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
|
||||
property string stringCopy: qsTr("<b>Copy address to clipboard</b>") + translationManager.emptyString
|
||||
property string stringSend: qsTr("<b>Send to this address</b>") + translationManager.emptyString
|
||||
property string stringFind: qsTr("<b>Find similar transactions</b>") + translationManager.emptyString
|
||||
property string stringRemove: qsTr("<b>Remove from address book</b>") + translationManager.emptyString
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
property bool containsMouse: index === mouseArea.currentIndex
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
color: containsMouse ? "#F0EEEE" : "#DBDBDB"
|
||||
//radius: index === repeater.count - 1 ? 5 : 0
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 5
|
||||
height: 5
|
||||
color: delegate.color
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 5
|
||||
height: 5
|
||||
color: delegate.color
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
source: icon
|
||||
}
|
||||
|
||||
onContainsMouseChanged: {
|
||||
if(containsMouse) {
|
||||
var pos = rootItem.mapFromItem(delegate, 30, -25)
|
||||
appWindow.toolTip.text = qsTr(name) + translationManager.emptyString
|
||||
appWindow.toolTip.x = pos.x - appWindow.toolTip.width
|
||||
// if(appWindow.toolTip.height > 30)
|
||||
// pos.y -= appWindow.toolTip.height - 30
|
||||
appWindow.toolTip.y = pos.y
|
||||
appWindow.toolTip.visible = true
|
||||
appWindow.toolTip.z = 3
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,186 +0,0 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Rectangle {
|
||||
id: header
|
||||
signal sortRequest(bool desc, int column)
|
||||
property alias dataModel: columnsRepeater.model
|
||||
property int activeSortColumn: -1
|
||||
property int offset: 0
|
||||
|
||||
height: 31
|
||||
color: "#FFFFFF"
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row
|
||||
anchors.horizontalCenter: header.offset !== 0 ? undefined: parent.horizontalCenter
|
||||
anchors.left: header.offset !== 0 ? parent.left : undefined
|
||||
anchors.leftMargin: header.offset
|
||||
|
||||
Rectangle {
|
||||
height: 31
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Repeater {
|
||||
id: columnsRepeater
|
||||
|
||||
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
|
||||
property string stringPaymentID: qsTr("Payment ID") + translationManager.emptyString
|
||||
property string stringDate: qsTr("Date") + translationManager.emptyString
|
||||
property string stringBlockHeight: qsTr("Block height") + translationManager.emptyString
|
||||
property string stringAmount: qsTr("Amount") + translationManager.emptyString
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
property bool desc: false
|
||||
height: 31
|
||||
width: columnWidth
|
||||
|
||||
Text {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -2
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 13
|
||||
anchors.rightMargin: 13
|
||||
elide: Text.ElideRight
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: {
|
||||
if(delegateArea.pressed)
|
||||
return "#FF4304"
|
||||
return index === header.activeSortColumn || delegateArea.containsMouse ? "#FF6C3C" : "#4A4949"
|
||||
}
|
||||
text: qsTr(columnName) + translationManager.emptyString
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: delegateArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
delegate.desc = !delegate.desc
|
||||
header.activeSortColumn = index
|
||||
header.sortRequest(delegate.desc, index)
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.rightMargin: 9
|
||||
|
||||
Item {
|
||||
width: 14
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
anchors.verticalCenterOffset: -2
|
||||
source: {
|
||||
if(descArea.pressed)
|
||||
return "../images/descSortIndicatorPressed.png"
|
||||
return index === header.activeSortColumn || descArea.containsMouse ? "../images/descSortIndicatorActived.png" :
|
||||
"../images/descSortIndicator.png"
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: descArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
delegate.desc = true
|
||||
header.activeSortColumn = index
|
||||
header.sortRequest(delegate.desc, index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
width: 14
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
anchors.verticalCenterOffset: -3
|
||||
source: {
|
||||
if(ascArea.pressed)
|
||||
return "../images/ascSortIndicatorPressed.png"
|
||||
return index === header.activeSortColumn || ascArea.containsMouse ? "../images/ascSortIndicatorActived.png" :
|
||||
"../images/ascSortIndicator.png"
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: ascArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
delegate.desc = false
|
||||
header.activeSortColumn = index
|
||||
header.sortRequest(delegate.desc, index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: index === header.activeSortColumn ? "#FFFFFF" : "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,17 @@
|
||||
import QtQuick 2.0
|
||||
import QtQuick 2.9
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
TextEdit {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
selectionColor: MoneroComponents.Style.textSelectionColor
|
||||
wrapMode: Text.Wrap
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
// Workaround for https://bugreports.qt.io/browse/QTBUG-50587
|
||||
onFocusChanged: {
|
||||
if(focus === false)
|
||||
deselect()
|
||||
}
|
||||
}
|
||||
|
||||
28
components/TextPlain.qml
Normal file
28
components/TextPlain.qml
Normal file
@@ -0,0 +1,28 @@
|
||||
import QtQuick 2.9
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Text {
|
||||
// When using this component, please note that if you use a color different
|
||||
// than `defaultFontColor`, you are required to also define `themeTransitionXColor`.
|
||||
// If you do not set these the component will receive the wrong color after a transition.
|
||||
// If you do not want to set these, use `themeTransition: false`.
|
||||
id: root
|
||||
property bool themeTransition: true
|
||||
property string themeTransitionBlackColor: ""
|
||||
property string themeTransitionWhiteColor: ""
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.bold: false
|
||||
font.pixelSize: 14
|
||||
textFormat: Text.PlainText
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
enabled: root.themeTransition
|
||||
themeTransition: root.themeTransition
|
||||
targetObj: root
|
||||
duration: 750
|
||||
blackColor: root.themeTransitionBlackColor !== "" ? root.themeTransitionBlackColor : MoneroComponents.Style._b_defaultFontColor
|
||||
whiteColor: root.themeTransitionWhiteColor !== "" ? root.themeTransitionWhiteColor : MoneroComponents.Style._w_defaultFontColor
|
||||
}
|
||||
}
|
||||
48
components/TextPlainArea.qml
Normal file
48
components/TextPlainArea.qml
Normal file
@@ -0,0 +1,48 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
|
||||
TextArea {
|
||||
id: textArea
|
||||
property bool themeTransition: true
|
||||
property string colorWhiteTheme: ""
|
||||
property string colorBlackTheme: ""
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
selectByMouse: false
|
||||
wrapMode: Text.WordWrap;
|
||||
textMargin: 0
|
||||
leftPadding: 0
|
||||
topPadding: 0
|
||||
readOnly: true
|
||||
textFormat: TextEdit.PlainText
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "black";
|
||||
when: textArea.themeTransition && MoneroComponents.Style.blackTheme
|
||||
PropertyChanges {
|
||||
target: textArea
|
||||
color: {
|
||||
return textArea.colorBlackTheme ? textArea.colorBlackTheme : MoneroComponents.Style._b_defaultFontColor
|
||||
}
|
||||
}
|
||||
}, State {
|
||||
name: "white";
|
||||
when: textArea.themeTransition && !MoneroComponents.Style.blackTheme
|
||||
PropertyChanges {
|
||||
target: textArea
|
||||
color: {
|
||||
return textArea.colorWhiteTheme ? textArea.colorWhiteTheme : MoneroComponents.Style._w_defaultFontColor
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: Transition {
|
||||
enabled: appWindow.themeTransition
|
||||
ColorAnimation { properties: "color"; easing.type: Easing.InOutQuad; duration: 750 }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,9 +26,11 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Window 2.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Window {
|
||||
property alias text: content.text
|
||||
property alias containsMouse: tipArea.containsMouse
|
||||
@@ -55,10 +57,10 @@ Window {
|
||||
anchors.top: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 5
|
||||
source: "../images/tip.png"
|
||||
source: "qrc:///images/tip.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
MoneroComponents.TextPlain {
|
||||
id: content
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
y: 6
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,152 +26,337 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Window 2.0
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Layouts 1.2
|
||||
|
||||
import FontAwesome 1.0
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
Rectangle {
|
||||
id: titleBar
|
||||
color: "#000000"
|
||||
id: root
|
||||
property int mouseX: 0
|
||||
property bool containsMouse: false
|
||||
property alias basicButtonVisible: goToBasicVersionButton.visible
|
||||
property bool customDecorations: true
|
||||
signal goToBasicVersion(bool yes)
|
||||
height: customDecorations ? 30 : 0
|
||||
y: -height
|
||||
property string title
|
||||
property alias maximizeButtonVisible: maximizeButton.visible
|
||||
z: 1
|
||||
property bool customDecorations: persistentSettings.customDecorations
|
||||
property bool showMinimizeButton: true
|
||||
property bool showMaximizeButton: true
|
||||
property bool showCloseButton: true
|
||||
property string walletName: ""
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 15
|
||||
color: "#FFFFFF"
|
||||
text: titleBar.title
|
||||
visible: customDecorations
|
||||
height: {
|
||||
if(!persistentSettings.customDecorations) return 0;
|
||||
return 50;
|
||||
}
|
||||
|
||||
z: 1
|
||||
color: "transparent"
|
||||
|
||||
signal closeClicked
|
||||
signal maximizeClicked
|
||||
signal minimizeClicked
|
||||
signal languageClicked
|
||||
signal closeWalletClicked
|
||||
|
||||
state: "default"
|
||||
states: [
|
||||
State {
|
||||
name: "default";
|
||||
PropertyChanges { target: btnCloseWallet; visible: true}
|
||||
PropertyChanges { target: btnLanguageToggle; visible: true}
|
||||
}, State {
|
||||
// show only theme switcher and window controls
|
||||
name: "essentials";
|
||||
PropertyChanges { target: btnCloseWallet; visible: false}
|
||||
PropertyChanges { target: btnLanguageToggle; visible: false}
|
||||
}
|
||||
]
|
||||
|
||||
MoneroEffects.GradientBackground {
|
||||
anchors.fill: parent
|
||||
duration: 300
|
||||
fallBackColor: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
initialStartColor: MoneroComponents.Style.titleBarBackgroundGradientStart
|
||||
initialStopColor: MoneroComponents.Style.titleBarBackgroundGradientStop
|
||||
blackColorStart: MoneroComponents.Style._b_titleBarBackgroundGradientStart
|
||||
blackColorStop: MoneroComponents.Style._b_titleBarBackgroundGradientStop
|
||||
whiteColorStart: MoneroComponents.Style._w_titleBarBackgroundGradientStart
|
||||
whiteColorStop: MoneroComponents.Style._w_titleBarBackgroundGradientStop
|
||||
start: Qt.point(width, 0)
|
||||
end: Qt.point(0, 0)
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
z: parent.z + 2
|
||||
spacing: 0
|
||||
anchors.fill: parent
|
||||
|
||||
// collapse sidebar
|
||||
Rectangle {
|
||||
id: btnCloseWallet
|
||||
color: "transparent"
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
|
||||
Text {
|
||||
text: FontAwesome.signOutAlt
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.styleName: "Solid"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: root.closeWalletClicked(leftPanel.visible)
|
||||
}
|
||||
}
|
||||
|
||||
// language selection
|
||||
Rectangle {
|
||||
id: btnLanguageToggle
|
||||
color: "transparent"
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
Text {
|
||||
text: FontAwesome.globe
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.styleName: "Solid"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: root.languageClicked()
|
||||
}
|
||||
}
|
||||
|
||||
// switch theme
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
Text {
|
||||
text: FontAwesome.moonO
|
||||
font.family: MoneroComponents.Style.blackTheme ? FontAwesome.fontFamilySolid : FontAwesome.fontFamily
|
||||
font.styleName: MoneroComponents.Style.blackTheme ? "Solid" : "Regular"
|
||||
font.pixelSize: 15
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: {
|
||||
MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme;
|
||||
persistentSettings.blackTheme = MoneroComponents.Style.blackTheme;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
// make dummy space when hiding buttons when titlebar
|
||||
// state is 'essentials' in order for the
|
||||
// monero logo to still be centered
|
||||
Layout.preferredWidth: parent.height * 2 // amount of buttons we hide
|
||||
Layout.preferredHeight: parent.height
|
||||
visible: root.state == "essentials"
|
||||
}
|
||||
|
||||
// monero logo
|
||||
Item {
|
||||
visible: walletName.length === 0
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
Image {
|
||||
id: imgLogo
|
||||
width: 125
|
||||
height: 28
|
||||
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
source: MoneroComponents.Style.titleBarLogoSource
|
||||
visible: {
|
||||
if(!isOpenGL) return true;
|
||||
if(!MoneroComponents.Style.blackTheme) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Colorize {
|
||||
visible: isOpenGL && MoneroComponents.Style.blackTheme
|
||||
anchors.fill: imgLogo
|
||||
source: imgLogo
|
||||
saturation: 0.0
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
visible: walletName.length > 0
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
font.pixelSize: 20
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
elide: Text.ElideRight
|
||||
text: walletName
|
||||
}
|
||||
}
|
||||
|
||||
// minimize
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
visible: root.showMinimizeButton
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
MoneroEffects.ImageMask {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 18
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
height: 3
|
||||
width: 15
|
||||
image: MoneroComponents.Style.titleBarMinimizeSource
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackIcon: FontAwesome.minus
|
||||
fontAwesomeFallbackSize: 18
|
||||
fontAwesomeFallbackOpacity: MoneroComponents.Style.blackTheme ? 0.8 : 0.6
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: root.minimizeClicked();
|
||||
}
|
||||
}
|
||||
|
||||
// maximize
|
||||
Rectangle {
|
||||
id: test
|
||||
visible: root.showMaximizeButton
|
||||
color: "transparent"
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
source: MoneroComponents.Style.titleBarFullscreenSource
|
||||
sourceSize.width: 16
|
||||
sourceSize.height: 16
|
||||
smooth: true
|
||||
mipmap: true
|
||||
opacity: 0.75
|
||||
rotation: appWindow.visibility === Window.FullScreen ? 180 : 0
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: root.maximizeClicked();
|
||||
}
|
||||
}
|
||||
|
||||
// close
|
||||
Rectangle {
|
||||
visible: root.showCloseButton
|
||||
color: "transparent"
|
||||
Layout.preferredWidth: parent.height
|
||||
Layout.preferredHeight: parent.height
|
||||
|
||||
MoneroEffects.ImageMask {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
height: 16
|
||||
width: 16
|
||||
image: MoneroComponents.Style.titleBarCloseSource
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackIcon: FontAwesome.times
|
||||
fontAwesomeFallbackSize: 21
|
||||
fontAwesomeFallbackOpacity: MoneroComponents.Style.blackTheme ? 0.8 : 0.6
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onClicked: root.closeClicked();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: goToBasicVersionButton
|
||||
property bool containsMouse: titleBar.mouseX >= x && titleBar.mouseX <= x + width
|
||||
property bool checked: false
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
color: basicMouseArea.containsMouse || !leftPanel.visible ? "#FFE00A" : "#000000"
|
||||
height: 30
|
||||
width: height
|
||||
visible: isMobile
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
rotation: !leftPanel.visible ? 180 : 0
|
||||
source: parent.customDecorations || !leftPanel.visible ? "../images/goToBasicVersionHovered.png" :
|
||||
"../images/gotoBasicVersion.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: basicMouseArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
parent.checked = !parent.checked
|
||||
titleBar.goToBasicVersion(leftPanel.visible)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
z: parent.z + 3
|
||||
anchors.bottom: parent.bottom
|
||||
visible: parent.customDecorations
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: MoneroComponents.Style.blackTheme ? 1 : 1
|
||||
color: MoneroComponents.Style.titleBarBackgroundBorderColor
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#6B0072" : "#000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/helpIcon.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: whatIsArea
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#3665B3" : "#000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/minimizeIcon.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: minimizeArea
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
appWindow.visibility = Window.Minimized
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: maximizeButton
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#FF6C3C" : "#000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: appWindow.visibility === Window.FullScreen ? "../images/backToWindowIcon.png" :
|
||||
"../images/maximizeIcon.png"
|
||||
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: maximizeArea
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
appWindow.visibility = appWindow.visibility !== Window.FullScreen ? Window.FullScreen :
|
||||
Window.Windowed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#E04343" : "#000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/closeIcon.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: appWindow.close();
|
||||
}
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_titleBarBackgroundBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_titleBarBackgroundBorderColor
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
enabled: persistentSettings.customDecorations
|
||||
property var previousPosition
|
||||
anchors.fill: parent
|
||||
propagateComposedEvents: true
|
||||
onPressed: previousPosition = globalCursor.getPosition()
|
||||
onPositionChanged: {
|
||||
if (pressedButtons == Qt.LeftButton) {
|
||||
var pos = globalCursor.getPosition()
|
||||
var dx = pos.x - previousPosition.x
|
||||
var dy = pos.y - previousPosition.y
|
||||
|
||||
appWindow.x += dx
|
||||
appWindow.y += dy
|
||||
previousPosition = pos
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
466
components/TxConfirmationDialog.qml
Normal file
466
components/TxConfirmationDialog.qml
Normal file
@@ -0,0 +1,466 @@
|
||||
// Copyright (c) 2014-2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import FontAwesome 1.0
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
x: parent.width/2 - root.width/2
|
||||
y: parent.height/2 - root.height/2
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 580
|
||||
height: 400
|
||||
color: MoneroComponents.Style.blackTheme ? "black" : "white"
|
||||
visible: false
|
||||
radius: 10
|
||||
border.color: MoneroComponents.Style.blackTheme ? Qt.rgba(255, 255, 255, 0.25) : Qt.rgba(0, 0, 0, 0.25)
|
||||
border.width: 1
|
||||
focus: true
|
||||
Keys.enabled: true
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
Keys.onEnterPressed: {
|
||||
if (root.state == "default") {
|
||||
root.close()
|
||||
root.accepted()
|
||||
} else if (root.state == "error") {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
Keys.onReturnPressed: {
|
||||
if (root.state == "default") {
|
||||
root.close()
|
||||
root.accepted()
|
||||
} else if (root.state == "error") {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
KeyNavigation.tab: confirmButton
|
||||
|
||||
property var transactionAmount: ""
|
||||
property var transactionAddress: ""
|
||||
property var transactionDescription: ""
|
||||
property var transactionFee: ""
|
||||
property var transactionPriority: ""
|
||||
property bool sweepUnmixable: false
|
||||
property alias errorText: errorText
|
||||
property alias confirmButton: confirmButton
|
||||
property alias backButton: backButton
|
||||
property alias bottomText: bottomText
|
||||
property alias bottomTextAnimation: bottomTextAnimation
|
||||
|
||||
state: "default"
|
||||
states: [
|
||||
State {
|
||||
// waiting for user action, show tx details + back and confirm buttons
|
||||
name: "default";
|
||||
when: errorText.text == "" && bottomText.text == ""
|
||||
PropertyChanges { target: errorText; visible: false }
|
||||
PropertyChanges { target: txAmountText; visible: root.transactionAmount !== "(all)" || (root.transactionAmount === "(all)" && currentWallet.isHwBacked() === true) }
|
||||
PropertyChanges { target: txAmountBusyIndicator; visible: !txAmountText.visible }
|
||||
PropertyChanges { target: txFiatAmountText; visible: txAmountText.visible && persistentSettings.fiatPriceEnabled && root.transactionAmount !== "(all)" }
|
||||
PropertyChanges { target: txDetails; visible: true }
|
||||
PropertyChanges { target: bottom; visible: true }
|
||||
PropertyChanges { target: bottomMessage; visible: false }
|
||||
PropertyChanges { target: buttons; visible: true }
|
||||
PropertyChanges { target: backButton; visible: true; primary: false }
|
||||
PropertyChanges { target: confirmButton; visible: true }
|
||||
}, State {
|
||||
// error message being displayed, show only back button
|
||||
name: "error";
|
||||
when: errorText.text !== ""
|
||||
PropertyChanges { target: dialogTitle; text: "Error" }
|
||||
PropertyChanges { target: errorText; visible: true }
|
||||
PropertyChanges { target: txAmountText; visible: false }
|
||||
PropertyChanges { target: txAmountBusyIndicator; visible: false }
|
||||
PropertyChanges { target: txFiatAmountText; visible: false }
|
||||
PropertyChanges { target: txDetails; visible: false }
|
||||
PropertyChanges { target: bottom; visible: true }
|
||||
PropertyChanges { target: bottomMessage; visible: false }
|
||||
PropertyChanges { target: buttons; visible: true }
|
||||
PropertyChanges { target: backButton; visible: true; primary: true }
|
||||
PropertyChanges { target: confirmButton; visible: false }
|
||||
}, State {
|
||||
// creating or sending transaction, show tx details and don't show any button
|
||||
name: "bottomText";
|
||||
when: errorText.text == "" && bottomText.text !== ""
|
||||
PropertyChanges { target: errorText; visible: false }
|
||||
PropertyChanges { target: txAmountText; visible: root.transactionAmount !== "(all)" || (root.transactionAmount === "(all)" && currentWallet.isHwBacked() === true) }
|
||||
PropertyChanges { target: txAmountBusyIndicator; visible: !txAmountText.visible }
|
||||
PropertyChanges { target: txFiatAmountText; visible: txAmountText.visible && persistentSettings.fiatPriceEnabled && root.transactionAmount !== "(all)" }
|
||||
PropertyChanges { target: txDetails; visible: true }
|
||||
PropertyChanges { target: bottom; visible: true }
|
||||
PropertyChanges { target: bottomMessage; visible: true }
|
||||
PropertyChanges { target: buttons; visible: false }
|
||||
}
|
||||
]
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
function open() {
|
||||
root.visible = true;
|
||||
|
||||
//clean previous error message
|
||||
errorText.text = "";
|
||||
root.forceActiveFocus()
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
function clearFields() {
|
||||
root.transactionAmount = "";
|
||||
root.transactionAddress = "";
|
||||
root.transactionDescription = "";
|
||||
root.transactionFee = "";
|
||||
root.transactionPriority = "";
|
||||
root.sweepUnmixable = false;
|
||||
}
|
||||
|
||||
function showFiatConversion(valueXMR) {
|
||||
const fiatFee = fiatApiConvertToFiat(valueXMR);
|
||||
return "%1 %2".arg(fiatFee < 0.01 ? "<0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol());
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 10
|
||||
anchors.fill: parent
|
||||
anchors.margins: 25
|
||||
|
||||
RowLayout {
|
||||
Layout.topMargin: 10
|
||||
Layout.fillWidth: true
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: dialogTitle
|
||||
Layout.fillWidth: true
|
||||
fontSize: 18
|
||||
fontFamily: "Arial"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
text: {
|
||||
if (appWindow.viewOnly) {
|
||||
return qsTr("Create transaction file") + translationManager.emptyString;
|
||||
} else if (root.sweepUnmixable) {
|
||||
return qsTr("Sweep unmixable outputs") + translationManager.emptyString;
|
||||
} else {
|
||||
return qsTr("Confirm send") + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: errorText
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
wrapMode: Text.Wrap
|
||||
font.pixelSize: 15
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 71
|
||||
|
||||
BusyIndicator {
|
||||
id: txAmountBusyIndicator
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
|
||||
running: root.transactionAmount == "(all)"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: txAmountText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: root.transactionAmount == "(all)" && currentWallet.isHwBacked() === true ? 32 : 42
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: {
|
||||
if (root.transactionAmount == "(all)" && currentWallet.isHwBacked() === true) {
|
||||
return qsTr("All unlocked balance") + translationManager.emptyString;
|
||||
} else {
|
||||
return root.transactionAmount + " XMR " + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: txFiatAmountText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 20
|
||||
color: MoneroComponents.Style.buttonSecondaryTextColor
|
||||
text: showFiatConversion(transactionAmount) + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
columns: 2
|
||||
id: txDetails
|
||||
Layout.fillWidth: true
|
||||
columnSpacing: 15
|
||||
rowSpacing: 16
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
text: qsTr("From") + ":" + translationManager.emptyString
|
||||
font.pixelSize: 15
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
font.pixelSize: 15
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: {
|
||||
if (currentWallet) {
|
||||
var walletTitle = function() {
|
||||
if (currentWallet.isLedger()) {
|
||||
return "Ledger";
|
||||
} else if (currentWallet.isTrezor()) {
|
||||
return "Trezor";
|
||||
} else {
|
||||
return qsTr("My wallet");
|
||||
}
|
||||
}
|
||||
var walletName = appWindow.walletName;
|
||||
if (appWindow.currentWallet.numSubaddressAccounts() > 1) {
|
||||
var currentSubaddressAccount = currentWallet.currentSubaddressAccount;
|
||||
var currentAccountLabel = currentWallet.getSubaddressLabel(currentWallet.currentSubaddressAccount, 0);
|
||||
return walletTitle() + " (" + walletName + ")" + "<br>" + qsTr("Account #") + currentSubaddressAccount + (currentAccountLabel !== "" ? " (" + currentAccountLabel + ")" : "") + translationManager.emptyString;
|
||||
} else {
|
||||
return walletTitle() + " (" + walletName + ")" + translationManager.emptyString;
|
||||
}
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
font.pixelSize: 15
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
text: qsTr("To") + ":" + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
font.pixelSize: 15
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.Wrap
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: {
|
||||
if (root.transactionAddress) {
|
||||
const addressBookName = currentWallet ? currentWallet.addressBook.getDescription(root.transactionAddress) : null;
|
||||
var fulladdress = root.transactionAddress;
|
||||
var spacedaddress = fulladdress.match(/.{1,4}/g);
|
||||
var spacedaddress = spacedaddress.join(' ');
|
||||
if (!addressBookName) {
|
||||
return qsTr("Monero address") + "<br>" + spacedaddress + translationManager.emptyString;
|
||||
} else {
|
||||
return FontAwesome.addressBook + " " + addressBookName + "<br>" + spacedaddress;
|
||||
}
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
text: qsTr("Fee") + ":" + translationManager.emptyString
|
||||
font.pixelSize: 15
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.pixelSize: 15
|
||||
text: {
|
||||
if (currentWallet) {
|
||||
if (!root.transactionFee) {
|
||||
if (currentWallet.isHwBacked() === true) {
|
||||
return qsTr("See on device") + translationManager.emptyString;
|
||||
} else {
|
||||
return qsTr("Calculating fee") + "..." + translationManager.emptyString;
|
||||
}
|
||||
} else {
|
||||
return root.transactionFee + " XMR"
|
||||
}
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 8
|
||||
color: MoneroComponents.Style.buttonSecondaryTextColor
|
||||
visible: persistentSettings.fiatPriceEnabled && root.transactionFee
|
||||
font.pixelSize: 15
|
||||
text: showFiatConversion(root.transactionFee)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: bottom
|
||||
Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
|
||||
RowLayout {
|
||||
id: bottomMessage
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 50
|
||||
|
||||
BusyIndicator {
|
||||
visible: !bottomTextAnimation.running
|
||||
running: !bottomTextAnimation.running
|
||||
scale: .5
|
||||
}
|
||||
|
||||
Text {
|
||||
id: bottomText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: ""
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
wrapMode: Text.Wrap
|
||||
font.pixelSize: 17
|
||||
opacity: 1
|
||||
|
||||
SequentialAnimation{
|
||||
id:bottomTextAnimation
|
||||
running: false
|
||||
loops: Animation.Infinite
|
||||
alwaysRunToEnd: true
|
||||
NumberAnimation { target: bottomText; property: "opacity"; to: 0; duration: 500}
|
||||
NumberAnimation { target: bottomText; property: "opacity"; to: 1; duration: 500}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 70
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 50
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: backButton
|
||||
text: qsTr("Back") + translationManager.emptyString;
|
||||
width: 200
|
||||
focus: false
|
||||
primary: false
|
||||
KeyNavigation.tab: confirmButton
|
||||
Keys.enabled: backButton.visible
|
||||
Keys.onReturnPressed: backButton.onClicked
|
||||
Keys.onEnterPressed: backButton.onClicked
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: confirmButton
|
||||
text: qsTr("Confirm") + translationManager.emptyString;
|
||||
rightIcon: "qrc:///images/rightArrow.png"
|
||||
width: 200
|
||||
focus: false
|
||||
KeyNavigation.tab: backButton
|
||||
Keys.enabled: confirmButton.visible
|
||||
Keys.onReturnPressed: confirmButton.onClicked
|
||||
Keys.onEnterPressed: confirmButton.onClicked
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.clearFields()
|
||||
root.rejected()
|
||||
}
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
204
components/UpdateDialog.qml
Normal file
204
components/UpdateDialog.qml
Normal file
@@ -0,0 +1,204 @@
|
||||
// Copyright (c) 2020, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import moneroComponents.Downloader 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Popup {
|
||||
id: updateDialog
|
||||
|
||||
property bool active: false
|
||||
property bool allowed: true
|
||||
property string error: ""
|
||||
property string filename: ""
|
||||
property string hash: ""
|
||||
property double progress: url && downloader.total > 0 ? downloader.loaded * 100 / downloader.total : 0
|
||||
property string url: ""
|
||||
property bool valid: false
|
||||
property string version: ""
|
||||
|
||||
background: Rectangle {
|
||||
border.color: MoneroComponents.Style.appWindowBorderColor
|
||||
border.width: 1
|
||||
color: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
}
|
||||
closePolicy: Popup.NoAutoClose
|
||||
padding: 20
|
||||
visible: active && allowed
|
||||
|
||||
function show(version, url, hash) {
|
||||
updateDialog.error = "";
|
||||
updateDialog.hash = hash;
|
||||
updateDialog.url = url;
|
||||
updateDialog.valid = false;
|
||||
updateDialog.version = version;
|
||||
updateDialog.active = true;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: updateDialog.padding
|
||||
|
||||
Text {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.bold: true
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18
|
||||
text: qsTr("New Monero version v%1 is available.").arg(updateDialog.version)
|
||||
}
|
||||
|
||||
Text {
|
||||
id: errorText
|
||||
color: "red"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18
|
||||
text: updateDialog.error
|
||||
visible: text
|
||||
}
|
||||
|
||||
Text {
|
||||
id: statusText
|
||||
color: updateDialog.valid ? MoneroComponents.Style.green : MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18
|
||||
visible: !errorText.visible
|
||||
|
||||
text: {
|
||||
if (!updateDialog.url) {
|
||||
return qsTr("Please visit getmonero.org for details") + translationManager.emptyString;
|
||||
}
|
||||
if (downloader.active) {
|
||||
return "%1 (%2%)"
|
||||
.arg(qsTr("Downloading"))
|
||||
.arg(updateDialog.progress.toFixed(1))
|
||||
+ translationManager.emptyString;
|
||||
}
|
||||
if (updateDialog.valid) {
|
||||
return qsTr("Update downloaded, signature verified") + translationManager.emptyString;
|
||||
}
|
||||
return qsTr("Do you want to download and verify new version?") + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: progressBar
|
||||
color: MoneroComponents.Style.lightGreyFontColor
|
||||
height: 3
|
||||
Layout.fillWidth: true
|
||||
visible: updateDialog.valid || downloader.active
|
||||
|
||||
Rectangle {
|
||||
color: MoneroComponents.Style.buttonBackgroundColor
|
||||
height: parent.height
|
||||
width: parent.width * updateDialog.progress / 100
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.alignment: Qt.AlignRight
|
||||
spacing: parent.spacing
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
fontBold: false
|
||||
primary: !updateDialog.url
|
||||
text: {
|
||||
if (!updateDialog.url) {
|
||||
return qsTr("Ok") + translationManager.emptyString;
|
||||
}
|
||||
if (updateDialog.valid || downloader.active || errorText.visible) {
|
||||
return qsTr("Cancel") + translationManager.emptyString;
|
||||
}
|
||||
return qsTr("Download later") + translationManager.emptyString;
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
downloader.cancel();
|
||||
updateDialog.active = false;
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: downloadButton
|
||||
KeyNavigation.tab: cancelButton
|
||||
fontBold: false
|
||||
text: (updateDialog.error ? qsTr("Retry") : qsTr("Download")) + translationManager.emptyString
|
||||
visible: updateDialog.url && !updateDialog.valid && !downloader.active
|
||||
|
||||
onClicked: {
|
||||
updateDialog.error = "";
|
||||
updateDialog.filename = updateDialog.url.replace(/^.*\//, '');
|
||||
const downloadingStarted = downloader.get(updateDialog.url, updateDialog.hash, function(error) {
|
||||
if (error) {
|
||||
console.error("Download failed", error);
|
||||
updateDialog.error = qsTr("Download failed") + translationManager.emptyString;
|
||||
} else {
|
||||
updateDialog.valid = true;
|
||||
}
|
||||
});
|
||||
if (!downloadingStarted) {
|
||||
updateDialog.error = qsTr("Failed to start download") + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: saveButton
|
||||
KeyNavigation.tab: cancelButton
|
||||
fontBold: false
|
||||
onClicked: {
|
||||
const fullPath = oshelper.openSaveFileDialog(
|
||||
qsTr("Save as") + translationManager.emptyString,
|
||||
oshelper.downloadLocation(),
|
||||
updateDialog.filename);
|
||||
if (!fullPath) {
|
||||
return;
|
||||
}
|
||||
if (downloader.saveToFile(fullPath)) {
|
||||
cancelButton.clicked();
|
||||
oshelper.openContainingFolder(fullPath);
|
||||
} else {
|
||||
updateDialog.error = qsTr("Save operation failed") + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
text: qsTr("Save to file") + translationManager.emptyString
|
||||
visible: updateDialog.valid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Downloader {
|
||||
id: downloader
|
||||
proxyAddress: persistentSettings.getProxyAddress()
|
||||
}
|
||||
}
|
||||
62
components/WarningBox.qml
Normal file
62
components/WarningBox.qml
Normal file
@@ -0,0 +1,62 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls 2.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
property alias text: content.text
|
||||
property alias textColor: content.color
|
||||
property int fontSize: 15
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: warningLayout.height
|
||||
|
||||
color: MoneroComponents.Style.titleBarButtonHoverColor
|
||||
radius: 4
|
||||
border.color: MoneroComponents.Style.inputBorderColorInActive
|
||||
border.width: 1
|
||||
|
||||
signal linkActivated;
|
||||
|
||||
RowLayout {
|
||||
id: warningLayout
|
||||
spacing: 0
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
Image {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: 33
|
||||
Layout.preferredWidth: 33
|
||||
Layout.rightMargin: 12
|
||||
Layout.leftMargin: 18
|
||||
Layout.topMargin: 12
|
||||
Layout.bottomMargin: 12
|
||||
source: "qrc:///images/warning.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: content
|
||||
Layout.fillWidth: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: root.fontSize
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.WordWrap
|
||||
leftPadding: 4
|
||||
rightPadding: 18
|
||||
topPadding: 10
|
||||
bottomPadding: 10
|
||||
onLinkActivated: root.linkActivated();
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
58
components/effects/ColorTransition.qml
Normal file
58
components/effects/ColorTransition.qml
Normal file
@@ -0,0 +1,58 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: root
|
||||
property var targetObj
|
||||
property string blackColor: ""
|
||||
property string whiteColor: ""
|
||||
property int duration: 300
|
||||
property bool themeTransition: true
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "black";
|
||||
when: MoneroComponents.Style.blackTheme && root.themeTransition
|
||||
PropertyChanges { target: root.targetObj; color: root.blackColor}
|
||||
}, State {
|
||||
name: "white";
|
||||
when: !MoneroComponents.Style.blackTheme && root.themeTransition
|
||||
PropertyChanges { target: root.targetObj; color: root.whiteColor}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: Transition {
|
||||
enabled: appWindow.themeTransition
|
||||
ColorAnimation { properties: "color"; easing.type: Easing.InOutQuad; duration: root.duration }
|
||||
}
|
||||
}
|
||||
107
components/effects/GradientBackground.qml
Normal file
107
components/effects/GradientBackground.qml
Normal file
@@ -0,0 +1,107 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: root
|
||||
property string fallBackColor: ""
|
||||
property string blackColorStart: ""
|
||||
property string blackColorStop: ""
|
||||
property string whiteColorStart: ""
|
||||
property string whiteColorStop: ""
|
||||
property string initialStartColor: ""
|
||||
property string initialStopColor: ""
|
||||
property double posStart: 0.1
|
||||
property double posStop: 1.0
|
||||
property int duration: 300
|
||||
property variant start
|
||||
property variant end
|
||||
anchors.fill: parent
|
||||
|
||||
// background software renderer
|
||||
Rectangle {
|
||||
visible: !isOpenGL
|
||||
anchors.fill: parent
|
||||
color: root.fallBackColor
|
||||
}
|
||||
|
||||
// background opengl
|
||||
LinearGradient {
|
||||
visible: isOpenGL
|
||||
anchors.fill: parent
|
||||
start: root.start
|
||||
end: root.end
|
||||
gradient: Gradient {
|
||||
GradientStop {
|
||||
id: gradientStart
|
||||
position: root.posStart
|
||||
color: root.initialStartColor
|
||||
}
|
||||
GradientStop {
|
||||
id: gradientStop
|
||||
position: root.posStop
|
||||
color: root.initialStopColor
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "black";
|
||||
when: isOpenGL && MoneroComponents.Style.blackTheme
|
||||
PropertyChanges {
|
||||
target: gradientStart
|
||||
color: root.blackColorStart
|
||||
}
|
||||
PropertyChanges {
|
||||
target: gradientStop
|
||||
color: root.blackColorStop
|
||||
}
|
||||
}, State {
|
||||
name: "white";
|
||||
when: isOpenGL && !MoneroComponents.Style.blackTheme
|
||||
PropertyChanges {
|
||||
target: gradientStart
|
||||
color: root.whiteColorStart
|
||||
}
|
||||
PropertyChanges {
|
||||
target: gradientStop
|
||||
color: root.whiteColorStop
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: Transition {
|
||||
enabled: appWindow.themeTransition
|
||||
ColorAnimation { properties: "color"; easing.type: Easing.InOutQuad; duration: root.duration }
|
||||
}
|
||||
}
|
||||
}
|
||||
86
components/effects/ImageMask.qml
Normal file
86
components/effects/ImageMask.qml
Normal file
@@ -0,0 +1,86 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtGraphicalEffects 1.0
|
||||
|
||||
import "../" as MoneroComponents
|
||||
import FontAwesome 1.0
|
||||
|
||||
Item {
|
||||
// Use this component to color+opacity change images with transparency (svg/png)
|
||||
// Does not work in low graphics mode, use fontAwesome fallback option.
|
||||
|
||||
id: root
|
||||
property string image: ""
|
||||
property string color: ""
|
||||
property var fontAwesomeFallbackIcon: ""
|
||||
property string fontAwesomeFallbackFont: FontAwesome.fontFamilySolid
|
||||
property string fontAwesomeFallbackStyle: "Solid"
|
||||
property int fontAwesomeFallbackSize: 16
|
||||
property double fontAwesomeFallbackOpacity: 0.8
|
||||
property string fontAwesomeFallbackColor: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
property alias fontAwesomeFallback: fontAwesomeFallback
|
||||
property alias svgMask: svgMask
|
||||
property alias imgMockColor: imgMockColor
|
||||
|
||||
width: 0
|
||||
height: 0
|
||||
|
||||
Image {
|
||||
id: svgMask
|
||||
source: root.image
|
||||
sourceSize.width: root.width
|
||||
sourceSize.height: root.height
|
||||
smooth: true
|
||||
mipmap: true
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
id: imgMockColor
|
||||
anchors.fill: root
|
||||
source: svgMask
|
||||
color: root.color
|
||||
visible: image && isOpenGL
|
||||
}
|
||||
|
||||
Text {
|
||||
id: fontAwesomeFallback
|
||||
visible: !imgMockColor.visible
|
||||
text: root.fontAwesomeFallbackIcon
|
||||
font.family: root.fontAwesomeFallbackFont
|
||||
font.pixelSize: root.fontAwesomeFallbackSize
|
||||
font.styleName: root.fontAwesomeFallbackStyle
|
||||
color: root.fontAwesomeFallbackColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: root.fontAwesomeFallbackOpacity
|
||||
}
|
||||
}
|
||||
1
components/qmldir
Normal file
1
components/qmldir
Normal file
@@ -0,0 +1 @@
|
||||
singleton Style 1.0 Style.qml
|
||||
@@ -1,27 +0,0 @@
|
||||
android-no-sdk {
|
||||
target.path = /data/user/qt
|
||||
export(target.path)
|
||||
INSTALLS += target
|
||||
} else:android {
|
||||
x86 {
|
||||
target.path = /libs/x86
|
||||
} else: armeabi-v7a {
|
||||
target.path = /libs/armeabi-v7a
|
||||
} else {
|
||||
target.path = /libs/armeabi
|
||||
}
|
||||
export(target.path)
|
||||
INSTALLS += target
|
||||
} else:unix {
|
||||
isEmpty(target.path) {
|
||||
qnx {
|
||||
target.path = /tmp/$${TARGET}/bin
|
||||
} else {
|
||||
target.path = /opt/$${TARGET}/bin
|
||||
}
|
||||
export(target.path)
|
||||
}
|
||||
INSTALLS += target
|
||||
}
|
||||
|
||||
export(INSTALLS)
|
||||
1
fonts/CMakeLists.txt
Normal file
1
fonts/CMakeLists.txt
Normal file
@@ -0,0 +1 @@
|
||||
qt5_add_resources(RESOURCE_FILES *.otf)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user