Compare commits
525 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
755977d1ba | ||
|
|
bb127744af | ||
|
|
76a105261e | ||
|
|
199ed44aae | ||
|
|
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 | ||
|
|
3e90c3d825 | ||
|
|
50b9281865 |
8
.gitignore
vendored
@@ -3,3 +3,11 @@
|
||||
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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
2
LICENSE
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, The Monero Project
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
||||
388
LeftPanel.qml
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -27,29 +27,37 @@
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtGraphicalEffects 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
import moneroComponents.NetworkType 1.0
|
||||
import "components"
|
||||
|
||||
Rectangle {
|
||||
id: panel
|
||||
|
||||
property alias unlockedBalanceText: unlockedBalanceText.text
|
||||
property alias unlockedBalanceVisible: unlockedBalanceText.visible
|
||||
property alias unlockedBalanceLabelVisible: unlockedBalanceLabel.visible
|
||||
property alias balanceLabelText: balanceLabel.text
|
||||
property alias balanceText: balanceText.text
|
||||
property alias networkStatus : networkStatus
|
||||
property alias progressBar : progressBar
|
||||
property alias daemonProgressBar : daemonProgressBar
|
||||
property alias minutesToUnlockTxt: unlockedBalanceLabel.text
|
||||
property int titleBarHeight: 50
|
||||
|
||||
signal dashboardClicked()
|
||||
signal historyClicked()
|
||||
signal transferClicked()
|
||||
signal receiveClicked()
|
||||
signal txkeyClicked()
|
||||
signal sharedringdbClicked()
|
||||
signal settingsClicked()
|
||||
signal addressBookClicked()
|
||||
signal miningClicked()
|
||||
signal signClicked()
|
||||
signal keysClicked()
|
||||
|
||||
function selectItem(pos) {
|
||||
menuColumn.previousButton.checked = false
|
||||
@@ -60,6 +68,7 @@ Rectangle {
|
||||
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
|
||||
@@ -67,168 +76,183 @@ Rectangle {
|
||||
menuColumn.previousButton.checked = true
|
||||
}
|
||||
|
||||
width: (isMobile)? appWindow.width : 260
|
||||
color: "#FFFFFF"
|
||||
width: (isMobile)? appWindow.width : 300
|
||||
color: "transparent"
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: parent.top
|
||||
|
||||
// Item with monero logo
|
||||
Item {
|
||||
visible: !isMobile
|
||||
id: logoItem
|
||||
Image {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: (persistentSettings.customDecorations)? 66 : 36
|
||||
height: logo.implicitHeight
|
||||
|
||||
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
|
||||
}
|
||||
*/
|
||||
height: panel.height
|
||||
source: "images/leftPanelBg.jpg"
|
||||
z: 1
|
||||
}
|
||||
|
||||
|
||||
|
||||
// card with monero logo
|
||||
Column {
|
||||
visible: !isMobile
|
||||
visible: true
|
||||
z: 2
|
||||
id: column1
|
||||
height: 200
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: logoItem.bottom
|
||||
anchors.topMargin: 26
|
||||
spacing: 5
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: (persistentSettings.customDecorations)? 50 : 0
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: balanceLabel
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 50
|
||||
}
|
||||
|
||||
Row {
|
||||
visible: !isMobile
|
||||
RowLayout {
|
||||
visible: true
|
||||
Item {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 20
|
||||
anchors.leftMargin: 20
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
height: 26
|
||||
width: 50
|
||||
height: 490 * scaleRatio
|
||||
width: 259 * scaleRatio
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "images/lockIcon.png"
|
||||
width: 259; height: 170
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: "images/card-background.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
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"
|
||||
}
|
||||
|
||||
Text {
|
||||
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"
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
visible: !isMobile
|
||||
id: balanceText
|
||||
Item {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 20
|
||||
anchors.leftMargin: 20
|
||||
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
|
||||
height: 490 * scaleRatio
|
||||
width: 50 * scaleRatio
|
||||
|
||||
Text {
|
||||
visible: !isMobile
|
||||
id: balanceText
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 76
|
||||
font.family: "Arial"
|
||||
color: "#FFFFFF"
|
||||
text: "N/A"
|
||||
// dynamically adjust text size
|
||||
font.pixelSize: {
|
||||
var digits = text.split('.')[0].length
|
||||
var defaultSize = 22;
|
||||
if(digits > 2) {
|
||||
return defaultSize - 1.1*digits
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
Text {
|
||||
id: unlockedBalanceText
|
||||
visible: true
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 126
|
||||
font.family: "Arial"
|
||||
color: "#FFFFFF"
|
||||
text: "N/A"
|
||||
// dynamically adjust text size
|
||||
font.pixelSize: {
|
||||
var digits = text.split('.')[0].length
|
||||
var defaultSize = 20;
|
||||
if(digits > 3) {
|
||||
return defaultSize - 0.6*digits
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
}
|
||||
return defaultSize;
|
||||
|
||||
Label {
|
||||
id: unlockedBalanceLabel
|
||||
visible: true
|
||||
text: qsTr("Unlocked balance") + translationManager.emptyString
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 110
|
||||
}
|
||||
|
||||
Label {
|
||||
visible: !isMobile
|
||||
id: balanceLabel
|
||||
text: qsTr("Balance") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 60
|
||||
}
|
||||
Item { //separator
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 1
|
||||
}
|
||||
/* 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
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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.topMargin: (isMobile)? 0 : 32
|
||||
color: "transparent"
|
||||
|
||||
|
||||
Flickable {
|
||||
contentHeight: 500
|
||||
id:flicker
|
||||
contentHeight: 500 * scaleRatio
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
@@ -239,7 +263,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
|
||||
clip: true
|
||||
property var previousButton: transferButton
|
||||
|
||||
// ------------- Dashboard tab ---------------
|
||||
@@ -265,11 +289,19 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#505050"
|
||||
color: dashboardButton.checked || transferButton.checked ? "#1C1C1C" : "#313131"
|
||||
height: 1
|
||||
}
|
||||
*/
|
||||
|
||||
// top border
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
// ------------- Transfer tab ---------------
|
||||
MenuButton {
|
||||
@@ -291,7 +323,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
@@ -317,7 +349,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
@@ -340,7 +372,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
@@ -364,7 +396,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
@@ -386,13 +418,14 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
// ------------- Mining tab ---------------
|
||||
MenuButton {
|
||||
id: miningButton
|
||||
visible: !isAndroid && !isIOS
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Mining") + translationManager.emptyString
|
||||
@@ -411,7 +444,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#505050"
|
||||
color: miningButton.checked || settingsButton.checked ? "#1C1C1C" : "#313131"
|
||||
height: 1
|
||||
}
|
||||
// ------------- TxKey tab ---------------
|
||||
@@ -419,7 +452,7 @@ Rectangle {
|
||||
id: txkeyButton
|
||||
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
|
||||
@@ -434,9 +467,33 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
// ------------- Shared RingDB tab ---------------
|
||||
MenuButton {
|
||||
id: sharedringdbButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Shared RingDB") + translationManager.emptyString
|
||||
symbol: qsTr("S") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
under: advancedButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = sharedringdbButton
|
||||
panel.sharedringdbClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: sharedringdbButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
|
||||
// ------------- Sign/verify tab ---------------
|
||||
MenuButton {
|
||||
@@ -458,7 +515,7 @@ Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#505050"
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
// ------------- Settings tab ---------------
|
||||
@@ -475,26 +532,73 @@ Rectangle {
|
||||
panel.settingsClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: settingsButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
// ------------- Sign/verify tab ---------------
|
||||
MenuButton {
|
||||
id: keysButton
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: qsTr("Seed & Keys") + translationManager.emptyString
|
||||
symbol: qsTr("Y") + translationManager.emptyString
|
||||
dotColor: "#FFD781"
|
||||
under: settingsButton
|
||||
onClicked: {
|
||||
parent.previousButton.checked = false
|
||||
parent.previousButton = keysButton
|
||||
panel.keysClicked()
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
visible: settingsButton.present
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 16
|
||||
color: "#313131"
|
||||
height: 1
|
||||
}
|
||||
|
||||
}
|
||||
} // Column
|
||||
|
||||
}
|
||||
} // Flickable
|
||||
|
||||
NetworkStatusItem {
|
||||
id: networkStatus
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 4
|
||||
anchors.rightMargin: 4
|
||||
anchors.bottom: (progressBar.visible)? progressBar.top : parent.bottom;
|
||||
connected: Wallet.ConnectionStatus_Disconnected
|
||||
height: 58 * scaleRatio
|
||||
}
|
||||
|
||||
ProgressBar {
|
||||
id: progressBar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottom: daemonProgressBar.top
|
||||
height: 35 * scaleRatio
|
||||
syncType: qsTr("Wallet")
|
||||
visible: networkStatus.connected
|
||||
}
|
||||
}
|
||||
|
||||
ProgressBar {
|
||||
id: daemonProgressBar
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
syncType: qsTr("Daemon")
|
||||
visible: networkStatus.connected
|
||||
height: 62 * scaleRatio
|
||||
}
|
||||
} // menuRect
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
import QtQml 2.0
|
||||
import QtQuick 2.2
|
||||
// QtQuick.Controls 2.0 isn't stable enough yet. Needs more testing.
|
||||
//import QtQuick.Controls 2.0
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
@@ -47,25 +48,35 @@ Rectangle {
|
||||
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 minHeight: (appWindow.height > 800) ? appWindow.height : 800 * scaleRatio
|
||||
property alias contentHeight: mainFlickable.contentHeight
|
||||
// property int headerHeight: header.height
|
||||
|
||||
property Transfer transferView: Transfer { }
|
||||
property Receive receiveView: Receive { }
|
||||
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 { }
|
||||
|
||||
|
||||
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"
|
||||
Image {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
source: "../images/middlePanelBg.jpg"
|
||||
}
|
||||
|
||||
onCurrentViewChanged: {
|
||||
if (previousView) {
|
||||
@@ -93,33 +104,6 @@ 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"
|
||||
@@ -128,18 +112,22 @@ Rectangle {
|
||||
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.tableHeight + 220 * scaleRatio }
|
||||
}, State {
|
||||
name: "Transfer"
|
||||
PropertyChanges { target: root; currentView: transferView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1000 }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1000 * scaleRatio }
|
||||
}, State {
|
||||
name: "Receive"
|
||||
PropertyChanges { target: root; currentView: receiveView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1000 * scaleRatio }
|
||||
}, State {
|
||||
name: "TxKey"
|
||||
PropertyChanges { target: root; currentView: txkeyView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1200 * scaleRatio }
|
||||
}, State {
|
||||
name: "SharedRingDB"
|
||||
PropertyChanges { target: root; currentView: sharedringdbView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "AddressBook"
|
||||
@@ -148,15 +136,19 @@ Rectangle {
|
||||
}, State {
|
||||
name: "Sign"
|
||||
PropertyChanges { target: root; currentView: signView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1200 * scaleRatio }
|
||||
}, State {
|
||||
name: "Settings"
|
||||
PropertyChanges { target: root; currentView: settingsView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 1200 }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: 2000 * scaleRatio }
|
||||
}, State {
|
||||
name: "Mining"
|
||||
PropertyChanges { target: root; currentView: miningView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
|
||||
}, State {
|
||||
name: "Keys"
|
||||
PropertyChanges { target: root; currentView: keysView }
|
||||
PropertyChanges { target: mainFlickable; contentHeight: minHeight + 200 * scaleRatio }
|
||||
}
|
||||
]
|
||||
|
||||
@@ -178,8 +170,8 @@ Rectangle {
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 2
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 30 : 0
|
||||
anchors.margins: 18
|
||||
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 50 : 0
|
||||
spacing: 0
|
||||
|
||||
Flickable {
|
||||
@@ -187,6 +179,11 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
clip: true
|
||||
|
||||
onFlickingChanged: {
|
||||
releaseFocus();
|
||||
}
|
||||
|
||||
// Disabled scrollbars, gives crash on startup on windows
|
||||
// ScrollIndicator.vertical: ScrollIndicator { }
|
||||
// ScrollBar.vertical: ScrollBar { } // uncomment to test
|
||||
@@ -195,11 +192,7 @@ Rectangle {
|
||||
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 +203,7 @@ Rectangle {
|
||||
from: 0 - target.width
|
||||
to: 0
|
||||
duration: 300
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
PropertyAnimation {
|
||||
target: exitItem
|
||||
@@ -217,6 +211,7 @@ Rectangle {
|
||||
from: 0
|
||||
to: target.width
|
||||
duration: 300
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -224,30 +219,14 @@ 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
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
|
||||
color: "#313131"
|
||||
}
|
||||
|
||||
/* connect "payment" click */
|
||||
|
||||
67
README.md
@@ -1,15 +1,20 @@
|
||||
# Monero GUI
|
||||
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, 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)
|
||||
|
||||
## 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
|
||||
|
||||
Monero is a private, secure, untraceable, decentralised digital currency. You are your bank, you control your funds, and nobody can trace your transfers unless you allow them to do so.
|
||||
@@ -20,23 +25,21 @@ 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.
|
||||
|
||||
Both Monero and Bitcoin donations can be made to donate.getmonero.org if using a client that supports the [OpenAlias](https://openalias.org) standard
|
||||
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.
|
||||
|
||||
The Monero donation address is: `44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A` (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:
|
||||
|
||||
[<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)
|
||||
@@ -52,15 +55,17 @@ There are also several mining pools that kindly donate a portion of their fees,
|
||||
|
||||
See [LICENSE](LICENSE).
|
||||
|
||||
## Installing Monero Core from a Package
|
||||
## 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 via AUR: [monero-wallet-qt](https://aur.archlinux.org/packages/monero-wallet-qt/)
|
||||
* Void Linux: xbps-install -S monero-core
|
||||
* GuixSD: guix package -i monero-core
|
||||
|
||||
Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
## Compiling Monero Core from Source
|
||||
## Compiling the Monero GUI from source
|
||||
|
||||
### On Linux:
|
||||
|
||||
@@ -70,29 +75,29 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
|
||||
- For Ubuntu and Mint
|
||||
|
||||
`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`
|
||||
|
||||
- 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`
|
||||
|
||||
2. Grab an up-to-date copy of the monero-core repository
|
||||
2. Grab an up-to-date copy of the monero-gui repository
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
`git clone https://github.com/monero-project/monero-gui.git`
|
||||
|
||||
3. Go into the repository
|
||||
|
||||
`cd monero-core`
|
||||
`cd monero-gui`
|
||||
|
||||
4. Install the GUI dependencies
|
||||
|
||||
- For Ubuntu 16.04 x86
|
||||
|
||||
`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`
|
||||
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs`
|
||||
|
||||
- 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`
|
||||
`sudo apt 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
|
||||
|
||||
@@ -129,7 +134,9 @@ 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`
|
||||
@@ -140,6 +147,12 @@ The executable can be found in the build/release/bin folder.
|
||||
|
||||
`brew install cmake`
|
||||
|
||||
`brew install zeromq`
|
||||
|
||||
*Note*: If cmake can not find zmq.hpp file on OS X, installing `zmq.hpp` from https://github.com/zeromq/cppzmq to `/usr/local/include` should fix that error.
|
||||
|
||||
4. Install Qt:
|
||||
|
||||
`brew install qt5` (or download QT 5.8+ from [qt.io](https://www.qt.io/download-open-source/))
|
||||
|
||||
If you have an older version of Qt installed via homebrew, you can force it to use 5.x like so:
|
||||
@@ -152,13 +165,13 @@ The executable can be found in the build/release/bin folder.
|
||||
|
||||
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
|
||||
6. Grab an up-to-date copy of the monero-gui repository
|
||||
|
||||
`git clone https://github.com/monero-project/monero-core.git`
|
||||
`git clone https://github.com/monero-project/monero-gui.git`
|
||||
|
||||
7. Go into the repository
|
||||
|
||||
`cd monero-core`
|
||||
`cd monero-gui`
|
||||
|
||||
8. Start the build
|
||||
|
||||
@@ -183,10 +196,10 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
|
||||
1. Install [msys2](http://msys2.github.io/), follow the instructions on that page on how to update packages to the latest versions
|
||||
|
||||
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment
|
||||
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
|
||||
pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-zeromq mingw-w64-i686-libsodium
|
||||
|
||||
```
|
||||
|
||||
@@ -209,7 +222,7 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
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
|
||||
6. Install the latest version of boost, specifically the required static libraries
|
||||
```
|
||||
cd
|
||||
wget http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2
|
||||
@@ -222,12 +235,12 @@ More info: http://stackoverflow.com/a/35098040/1683164
|
||||
7. Clone repository
|
||||
```
|
||||
cd
|
||||
git clone https://github.com/monero-project/monero-core.git
|
||||
git clone https://github.com/monero-project/monero-gui.git
|
||||
```
|
||||
|
||||
8. Build the GUI
|
||||
```
|
||||
cd monero-core
|
||||
cd monero-gui
|
||||
export PATH=$(ls -rd /c/Qt/5.[6,7,8]/mingw53_32/bin | head -1):$PATH
|
||||
./build.sh
|
||||
cd build
|
||||
|
||||
119
RightPanel.qml
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -38,121 +38,4 @@ 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,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,4 +1,4 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, The Monero Project
|
||||
|
||||
|
||||
## Current status : ALPHA
|
||||
@@ -22,7 +22,7 @@ Copyright (c) 2014-2017, The Monero Project
|
||||
|
||||
# Get the apk
|
||||
|
||||
docker cp monero-gui-android:/opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk .
|
||||
docker cp monero-gui-android:/opt/android/monero-gui/build/release/bin/bin/QtApp-debug.apk .
|
||||
|
||||
## Deployment
|
||||
|
||||
@@ -31,7 +31,7 @@ Copyright (c) 2014-2017, The Monero Project
|
||||
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 push /opt/android/monero-gui/build/release/bin/bin/QtApp-debug.apk /data/local/tmp
|
||||
adb shell pm install -r /data/local/tmp/QtApp-debug.apk
|
||||
|
||||
- Troubleshooting:
|
||||
|
||||
@@ -88,21 +88,20 @@ APP_CFLAGS += -target armv7-none-linux-androideabi -fexceptions -fstack-protect
|
||||
&& 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 \
|
||||
RUN git clone https://github.com/monero-project/monero-gui.git \
|
||||
&& cd monero-gui \
|
||||
&& 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/ \
|
||||
CMAKE_INCLUDE_PATH=${WORKDIR}/cppzmq/ \
|
||||
CMAKE_LIBRARY_PATH=${WORKDIR}/zeromq4-1/.libs \
|
||||
CXXFLAGS="-I ${WORKDIR}/zeromq4-1/include/" \
|
||||
./build.sh release-android \
|
||||
&& cd build \
|
||||
&& make deploy
|
||||
|
||||
|
||||
38
build.sh
@@ -8,6 +8,22 @@ if [ -z $BUILD_TYPE ]; then
|
||||
BUILD_TYPE=release
|
||||
fi
|
||||
|
||||
# Return 0 if the command exists, 1 if it does not.
|
||||
exists() {
|
||||
command -v "$1" &>/dev/null
|
||||
}
|
||||
|
||||
# Return the first value in $@ that's a runnable command.
|
||||
find_command() {
|
||||
for arg in "$@"; do
|
||||
if exists "$arg"; then
|
||||
echo "$arg"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
if [ "$BUILD_TYPE" == "release" ]; then
|
||||
echo "Building release"
|
||||
CONFIG="CONFIG+=release";
|
||||
@@ -24,14 +40,16 @@ elif [ "$BUILD_TYPE" == "release-static" ]; then
|
||||
BIN_PATH=release/bin
|
||||
elif [ "$BUILD_TYPE" == "release-android" ]; then
|
||||
echo "Building release for ANDROID"
|
||||
CONFIG="CONFIG+=release static WITH_SCANNER";
|
||||
CONFIG="CONFIG+=release static WITH_SCANNER DISABLE_PASS_STRENGTH_METER";
|
||||
ANDROID=true
|
||||
BIN_PATH=release/bin
|
||||
DISABLE_PASS_STRENGTH_METER=true
|
||||
elif [ "$BUILD_TYPE" == "debug-android" ]; then
|
||||
echo "Building debug for ANDROID : ultra INSECURE !!"
|
||||
CONFIG="CONFIG+=debug qml_debug WITH_SCANNER";
|
||||
CONFIG="CONFIG+=debug qml_debug WITH_SCANNER DISABLE_PASS_STRENGTH_METER";
|
||||
ANDROID=true
|
||||
BIN_PATH=debug/bin
|
||||
DISABLE_PASS_STRENGTH_METER=true
|
||||
elif [ "$BUILD_TYPE" == "debug" ]; then
|
||||
echo "Building debug"
|
||||
CONFIG="CONFIG+=debug"
|
||||
@@ -54,18 +72,20 @@ if [[ $platform == *bsd* ]]; then
|
||||
fi
|
||||
|
||||
# build libwallet
|
||||
$SHELL get_libwallet_api.sh $BUILD_TYPE
|
||||
./get_libwallet_api.sh $BUILD_TYPE
|
||||
|
||||
# build zxcvbn
|
||||
$MAKE -C src/zxcvbn-c || exit
|
||||
if [ "$DISABLE_PASS_STRENGTH_METER" != true ]; then
|
||||
$MAKE -C src/zxcvbn-c || exit
|
||||
fi
|
||||
|
||||
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
|
||||
exists lsb_release && distro="$(lsb_release -is)"
|
||||
if [ "$distro" = "Ubuntu" ] || [ "$distro" = "Fedora" ] || test -f /etc/fedora-release; then
|
||||
CONFIG="$CONFIG libunwind_off"
|
||||
fi
|
||||
fi
|
||||
@@ -85,7 +105,11 @@ popd
|
||||
echo "var GUI_MONERO_VERSION = \"$TAGNAME\"" >> version.js
|
||||
|
||||
cd build
|
||||
qmake ../monero-wallet-gui.pro "$CONFIG" || exit
|
||||
if ! QMAKE=$(find_command qmake qmake-qt5); then
|
||||
echo "Failed to find suitable qmake command."
|
||||
exit 1
|
||||
fi
|
||||
$QMAKE ../monero-wallet-gui.pro "$CONFIG" || exit
|
||||
$MAKE || exit
|
||||
|
||||
# Copy monerod to bin folder
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -37,13 +37,13 @@ ListView {
|
||||
footer: Rectangle {
|
||||
height: 127
|
||||
width: listView.width
|
||||
color: "#FFFFFF"
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
color: "#545454"
|
||||
color: "#808080"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ ListView {
|
||||
id: delegate
|
||||
height: 64
|
||||
width: listView.width
|
||||
color: index % 2 ? "#F8F8F8" : "#FFFFFF"
|
||||
color: "transparent"
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
@@ -62,11 +62,11 @@ ListView {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 12
|
||||
width: text.length ? (descriptionArea.containsMouse ? dropdown.x - x - 12 : 139) : 0
|
||||
width: text.length ? (descriptionArea.containsMouse ? 139 : 139) : 0
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 19
|
||||
color: "#444444"
|
||||
color: "#ffffff"
|
||||
elide: Text.ElideRight
|
||||
text: description
|
||||
|
||||
@@ -87,8 +87,9 @@ ListView {
|
||||
anchors.rightMargin: 40
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 16
|
||||
color: "#545454"
|
||||
color: "#ffffff"
|
||||
text: address
|
||||
readOnly: true
|
||||
}
|
||||
|
||||
Text {
|
||||
@@ -100,7 +101,7 @@ ListView {
|
||||
width: 139
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#535353"
|
||||
color: "#ffffff"
|
||||
text: qsTr("Payment ID:") + translationManager.emptyString
|
||||
}
|
||||
|
||||
@@ -111,7 +112,7 @@ ListView {
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 12
|
||||
anchors.right: dropdown.left
|
||||
|
||||
readOnly: true
|
||||
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 13
|
||||
@@ -144,8 +145,10 @@ ListView {
|
||||
onOptionClicked: {
|
||||
// Ensure tooltip is closed
|
||||
appWindow.toolTip.visible = false;
|
||||
if(option === 0)
|
||||
if(option === 0) {
|
||||
clipboard.setText(address)
|
||||
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3)
|
||||
}
|
||||
else if(option === 1){
|
||||
console.log("Sending to: ", address +" "+ paymentId);
|
||||
middlePanel.sendTo(address, paymentId, description);
|
||||
@@ -162,7 +165,7 @@ ListView {
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
color: "#404040"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -29,61 +29,76 @@
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Item {
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
RowLayout {
|
||||
id: checkBox
|
||||
property alias text: label.text
|
||||
property string checkedIcon
|
||||
property string checkedIcon: "../images/checkedIcon-black.png"
|
||||
property string uncheckedIcon
|
||||
property bool checked: false
|
||||
property alias background: backgroundRect.color
|
||||
property int fontSize: 14
|
||||
property int fontSize: 14 * scaleRatio
|
||||
property alias fontColor: label.color
|
||||
signal clicked()
|
||||
height: 25
|
||||
width: label.x + label.width
|
||||
Layout.minimumWidth: label.x + label.contentWidth
|
||||
clip: true
|
||||
height: 25 * scaleRatio
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
height: parent.height - 1
|
||||
width: 25
|
||||
//radius: 4
|
||||
y: 0
|
||||
color: "#DBDBDB"
|
||||
function toggle(){
|
||||
checkBox.checked = !checkBox.checked
|
||||
checkBox.clicked()
|
||||
}
|
||||
|
||||
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
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
width: 25 * scaleRatio
|
||||
height: checkBox.height - 1
|
||||
radius: 3
|
||||
y: 0
|
||||
color: "transparent"
|
||||
border.color: checkBox.checked ? Qt.rgba(1, 1, 1, 0.35) : Qt.rgba(1, 1, 1, 0.25)
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 25 + 12
|
||||
font.family: "Arial"
|
||||
font.pixelSize: checkBox.fontSize
|
||||
color: "#525252"
|
||||
}
|
||||
Rectangle {
|
||||
id: backgroundRect
|
||||
anchors.left: parent.left
|
||||
width: 25 * scaleRatio
|
||||
height: checkBox.height - 1
|
||||
y: 1
|
||||
color: "transparent"
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
checkBox.checked = !checkBox.checked
|
||||
checkBox.clicked()
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: checkBox.checkedIcon
|
||||
visible: checkBox.checked
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: checkBox.fontSize
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true
|
||||
anchors.left: backgroundRect.right
|
||||
anchors.leftMargin: !isMobile ? 10 : 8
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
98
components/CheckBox2.qml
Normal file
@@ -0,0 +1,98 @@
|
||||
// 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.Layouts 1.1
|
||||
import "." 1.0
|
||||
|
||||
RowLayout {
|
||||
id: checkBox
|
||||
property alias text: label.text
|
||||
property string checkedIcon: "../images/checkedIcon-black.png"
|
||||
property string uncheckedIcon
|
||||
property bool checked: false
|
||||
property string background: "backgroundRect.color"
|
||||
property int fontSize: 14 * scaleRatio
|
||||
property alias fontColor: label.color
|
||||
property int textMargin: 8 * scaleRatio
|
||||
signal clicked()
|
||||
height: 25 * scaleRatio
|
||||
|
||||
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"
|
||||
anchors.left: parent.left
|
||||
|
||||
Text {
|
||||
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"
|
||||
|
||||
Image {
|
||||
id: indicatorImage
|
||||
anchors.centerIn: parent
|
||||
source: "../images/whiteDropIndicator.png"
|
||||
rotation: checkBox.checked ? 180 * scaleRatio : 0
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
toggle();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -110,10 +110,6 @@ Window {
|
||||
id: okButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Close") + translationManager.emptyString
|
||||
onClicked: {
|
||||
root.close()
|
||||
@@ -128,7 +124,7 @@ Window {
|
||||
placeholderText: qsTr("command + enter (e.g help)") + translationManager.emptyString
|
||||
onAccepted: {
|
||||
if(text.length > 0)
|
||||
daemonManager.sendCommand(text,currentWallet.testnet);
|
||||
daemonManager.sendCommand(text,currentWallet.nettype);
|
||||
text = ""
|
||||
}
|
||||
}
|
||||
@@ -138,10 +134,6 @@ Window {
|
||||
// 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.
|
||||
//
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ Window {
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("Starting Monero daemon in %1 seconds").arg(countDown);
|
||||
text: qsTr("Starting local node in %1 seconds").arg(countDown);
|
||||
font.pixelSize: 18
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
@@ -108,10 +108,6 @@ Window {
|
||||
id: okButton
|
||||
visible:false
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Start daemon (%1)").arg(countDown)
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
@@ -125,10 +121,6 @@ Window {
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Use custom settings")
|
||||
|
||||
onClicked: {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -30,17 +30,21 @@ import QtQuick 2.2
|
||||
import QtQuick.Controls 1.2
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: datePicker
|
||||
property bool expanded: false
|
||||
property date currentDate
|
||||
property bool showCurrentDate: true
|
||||
property color backgroundColor : "#FFFFFF"
|
||||
property color errorColor : "#FFDDDD"
|
||||
property color backgroundColor : "#404040"
|
||||
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
|
||||
|
||||
@@ -57,28 +61,49 @@ Item {
|
||||
return true
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: inputLabelRect
|
||||
color: "transparent"
|
||||
height: 22
|
||||
width: parent.width
|
||||
|
||||
Text {
|
||||
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
|
||||
|
||||
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 * scaleRatio
|
||||
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 {
|
||||
@@ -89,28 +114,18 @@ Item {
|
||||
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 {
|
||||
id: button
|
||||
anchors.centerIn: parent
|
||||
source: "../images/datePicker.png"
|
||||
visible: datePicker.expanded
|
||||
source: "../images/whiteDropIndicator.png"
|
||||
rotation: datePicker.expanded ? 180 : 0
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
enabled: datePicker.expanded
|
||||
onClicked: datePicker.expanded = false
|
||||
onClicked: datePicker.expanded = !datePicker.expanded
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +136,7 @@ Item {
|
||||
anchors.rightMargin: 4
|
||||
height: 16
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
color: "#808080"
|
||||
visible: datePicker.expanded
|
||||
}
|
||||
|
||||
@@ -150,9 +165,9 @@ Item {
|
||||
id: dayInput
|
||||
readOnly: true
|
||||
width: 22
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
maximumLength: 2
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
validator: IntValidator{bottom: 01; top: 31;}
|
||||
@@ -173,19 +188,19 @@ Item {
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
text: "."
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
text: "-"
|
||||
}
|
||||
|
||||
TextInput {
|
||||
id: monthInput
|
||||
readOnly: true
|
||||
width: 22
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
maximumLength: 2
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
validator: IntValidator{bottom: 01; top: 12;}
|
||||
@@ -205,18 +220,18 @@ Item {
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
// color: "#525252"
|
||||
text: "."
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
text: "-"
|
||||
}
|
||||
|
||||
TextInput {
|
||||
id: yearInput
|
||||
width: 44
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
/// color: "#525252"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: datePicker.error ? errorColor : MoneroComponents.Style.defaultFontColor
|
||||
maximumLength: 4
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
validator: IntValidator{bottom: 1000; top: 9999;}
|
||||
@@ -272,6 +287,7 @@ Item {
|
||||
gridVisible: false
|
||||
background: Rectangle { color: "transparent" }
|
||||
dayDelegate: Item {
|
||||
z: parent.z + 1
|
||||
implicitHeight: implicitWidth
|
||||
implicitWidth: calendar.width / 7
|
||||
|
||||
@@ -308,6 +324,8 @@ Item {
|
||||
calendar.showNextMonth()
|
||||
else calendar.showPreviousMonth()
|
||||
}
|
||||
|
||||
dateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -30,6 +30,8 @@ import QtQuick 2.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.AddressBookModel 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "../js/TxUtils.js" as TxUtils
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
@@ -39,7 +41,7 @@ ListView {
|
||||
property int rowSpacing: 12
|
||||
property var addressBookModel: null
|
||||
|
||||
function buildTxDetailsString(tx_id, paymentId, tx_key,tx_note, destinations) {
|
||||
function buildTxDetailsString(tx_id, paymentId, tx_key,tx_note, destinations, rings) {
|
||||
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>";
|
||||
@@ -50,6 +52,7 @@ ListView {
|
||||
+ (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 : "")
|
||||
+ (rings ? trStart + qsTr("Rings:") + trMiddle + rings + trEnd : "")
|
||||
+ "</table>"
|
||||
+ translationManager.emptyString;
|
||||
}
|
||||
@@ -64,11 +67,10 @@ ListView {
|
||||
return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole)
|
||||
}
|
||||
|
||||
|
||||
footer: Rectangle {
|
||||
height: 127
|
||||
height: 127 * scaleRatio
|
||||
width: listView.width
|
||||
color: "#FFFFFF"
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
@@ -79,372 +81,403 @@ ListView {
|
||||
}
|
||||
}
|
||||
|
||||
StandardDialog {
|
||||
id: detailsPopup
|
||||
cancelVisible: false
|
||||
okVisible: true
|
||||
width:850
|
||||
}
|
||||
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: 144
|
||||
property bool collapsed: index ? false : true
|
||||
height: collapsed ? 180 * scaleRatio : 70 * scaleRatio
|
||||
width: listView.width
|
||||
color: index % 2 ? "#F8F8F8" : "#FFFFFF"
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
color: "transparent"
|
||||
|
||||
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();
|
||||
|
||||
}
|
||||
function collapse(){
|
||||
delegate.height = 180 * scaleRatio;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
anchors.left: parent.left
|
||||
// borders
|
||||
Rectangle{
|
||||
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
|
||||
}
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Row {
|
||||
// - Payment ID
|
||||
id: row2
|
||||
Rectangle{
|
||||
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 !== "()"
|
||||
}
|
||||
anchors.bottom: parent.bottom
|
||||
width: collapsed ? 2 : 1
|
||||
color: collapsed ? "#BBBBBB" : "#404040"
|
||||
}
|
||||
Row {
|
||||
// block height row
|
||||
id: row3
|
||||
anchors.left: parent.left
|
||||
|
||||
Rectangle{
|
||||
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.bottom: parent.top
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
height: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
// Transaction dropdown menu.
|
||||
// Disable for now until AddressBook implemented
|
||||
TableDropdown {
|
||||
id: dropdown
|
||||
Rectangle{
|
||||
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
|
||||
}
|
||||
anchors.left: parent.left
|
||||
height: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: row1
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20 * scaleRatio
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 15 * scaleRatio
|
||||
height: 40 * scaleRatio
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
id: arrowImage
|
||||
source: isOut ? "../images/downArrow.png" : "../images/upArrow-green.png"
|
||||
height: 18 * scaleRatio
|
||||
width: 12 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 12 * scaleRatio
|
||||
}
|
||||
onOptionClicked: {
|
||||
if(option === 0)
|
||||
clipboard.setText(address)
|
||||
|
||||
Text {
|
||||
id: txrxLabel
|
||||
anchors.left: arrowImage.right
|
||||
anchors.leftMargin: 18 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: isOut ? "Sent" : "Received"
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: amountLabel
|
||||
anchors.left: arrowImage.right
|
||||
anchors.leftMargin: 18 * scaleRatio
|
||||
anchors.top: txrxLabel.bottom
|
||||
anchors.topMargin: 0 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontBold.name
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
font.bold: true
|
||||
text: {
|
||||
var _amount = amount;
|
||||
if(_amount === 0){
|
||||
// *sometimes* amount is 0, while the 'destinations string'
|
||||
// has the correct amount, so we try to fetch it from that instead.
|
||||
_amount = TxUtils.destinationsToAmount(destinations);
|
||||
_amount = (_amount *1);
|
||||
}
|
||||
|
||||
return _amount + " XMR";
|
||||
}
|
||||
color: isOut ? "white" : "#2eb358"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
width: 300 * scaleRatio
|
||||
height: parent.height
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
id: dateLabel
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: date
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: timeLabel
|
||||
anchors.left: dateLabel.right
|
||||
anchors.leftMargin: 7 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 3 * scaleRatio
|
||||
font.pixelSize: 12 * scaleRatio
|
||||
text: time
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: toLabel
|
||||
property string address: ""
|
||||
color: "#BBBBBB"
|
||||
anchors.left: parent.left
|
||||
anchors.top: dateLabel.bottom
|
||||
anchors.topMargin: 0
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
text: {
|
||||
if(isOut){
|
||||
address = TxUtils.destinationsToAddress(destinations);
|
||||
if(address){
|
||||
var truncated = TxUtils.addressTruncate(address);
|
||||
return "To " + truncated;
|
||||
} else {
|
||||
return "Unknown recipient";
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
MouseArea{
|
||||
visible: parent.address !== undefined
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: {
|
||||
toLabel.color = "white";
|
||||
}
|
||||
onExited: {
|
||||
toLabel.color = "#BBBBBB";
|
||||
}
|
||||
onClicked: {
|
||||
if(parent.address){
|
||||
console.log("Address copied to clipboard");
|
||||
clipboard.setText(parent.address);
|
||||
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
height: 24 * scaleRatio
|
||||
width: 24 * scaleRatio
|
||||
color: "transparent"
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
Image {
|
||||
id: dropdownImage
|
||||
height: 8 * scaleRatio
|
||||
width: 12 * scaleRatio
|
||||
source: "../images/whiteDropIndicator.png"
|
||||
rotation: delegate.collapsed ? 180 : 0
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
delegate.collapsed = !delegate.collapsed;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: row2
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20 * scaleRatio
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
}
|
||||
*/
|
||||
}
|
||||
anchors.rightMargin: 20 * scaleRatio
|
||||
anchors.top: row1.bottom
|
||||
anchors.topMargin: 15 * scaleRatio
|
||||
height: 40 * scaleRatio
|
||||
color: "transparent"
|
||||
visible: delegate.collapsed
|
||||
|
||||
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" }
|
||||
// left column
|
||||
MoneroComponents.HistoryTableInnerColumn{
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 30 * scaleRatio
|
||||
|
||||
labelHeader: "Transaction ID"
|
||||
labelValue: hash.substring(0, 18) + "..."
|
||||
copyValue: hash
|
||||
}
|
||||
|
||||
// right column
|
||||
MoneroComponents.HistoryTableInnerColumn{
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 100 * scaleRatio
|
||||
width: 200 * scaleRatio
|
||||
height: parent.height
|
||||
color: "transparent"
|
||||
|
||||
labelHeader: qsTr("Fee")
|
||||
labelValue: {
|
||||
if(!isOut && !fee){
|
||||
return "-";
|
||||
} else if(isOut && fee){
|
||||
return fee + " XMR";
|
||||
} else {
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
copyValue: {
|
||||
if(isOut && fee){ return fee }
|
||||
else { return "" }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: row3
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20 * scaleRatio
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20 * scaleRatio
|
||||
anchors.top: row2.bottom
|
||||
anchors.topMargin: 15 * scaleRatio
|
||||
height: 40 * scaleRatio
|
||||
color: "transparent"
|
||||
visible: delegate.collapsed
|
||||
|
||||
// left column
|
||||
MoneroComponents.HistoryTableInnerColumn{
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 30 * scaleRatio
|
||||
labelHeader: qsTr("Blockheight")
|
||||
labelValue: {
|
||||
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
|
||||
if (isFailed)
|
||||
return qsTr("FAILED") + translationManager.emptyString
|
||||
return qsTr("PENDING") + translationManager.emptyString
|
||||
}
|
||||
copyValue: labelValue
|
||||
}
|
||||
|
||||
// right column
|
||||
MoneroComponents.HistoryTableInnerColumn {
|
||||
visible: currentWallet.getUserNote(hash)
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 80 * scaleRatio
|
||||
width: 220 * scaleRatio
|
||||
height: parent.height
|
||||
color: "transparent"
|
||||
|
||||
labelHeader: qsTr("Description")
|
||||
labelValue: {
|
||||
var note = currentWallet.getUserNote(hash);
|
||||
if(note){
|
||||
if(note.length > 28) {
|
||||
return note.substring(0, 28) + "...";
|
||||
} else {
|
||||
return note;
|
||||
}
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
copyValue: {
|
||||
return currentWallet.getUserNote(hash);
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: proofButton
|
||||
visible: isOut
|
||||
color: "#404040"
|
||||
height: 24 * scaleRatio
|
||||
width: 24 * scaleRatio
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 36
|
||||
radius: 20 * scaleRatio
|
||||
|
||||
MouseArea {
|
||||
id: proofButtonMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
var address = TxUtils.destinationsToAddress(destinations);
|
||||
if(address === undefined){
|
||||
console.log('getProof: Error fetching address')
|
||||
return;
|
||||
}
|
||||
|
||||
var checked = (TxUtils.checkTxID(hash) && TxUtils.checkAddress(address, appWindow.persistentSettings.nettype));
|
||||
if(!checked){
|
||||
console.log('getProof: Error checking TxId and/or address');
|
||||
}
|
||||
|
||||
console.log("getProof: Generate clicked: txid " + hash + ", address " + address);
|
||||
root.getProofClicked(hash, address, '');
|
||||
}
|
||||
|
||||
onEntered: {
|
||||
proofButton.color = "#656565";
|
||||
}
|
||||
|
||||
onExited: {
|
||||
proofButton.color = "#404040";
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: "P"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: detailsButton
|
||||
color: "#404040"
|
||||
height: 24 * scaleRatio
|
||||
width: 24 * scaleRatio
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 6
|
||||
radius: 20 * scaleRatio
|
||||
|
||||
MouseArea {
|
||||
id: detailsButtonMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
var tx_key = currentWallet.getTxKey(hash)
|
||||
var tx_note = currentWallet.getUserNote(hash)
|
||||
var rings = currentWallet.getRings(hash)
|
||||
if (rings)
|
||||
rings = rings.replace(/\|/g, '\n')
|
||||
informationPopup.title = "Transaction details";
|
||||
informationPopup.content = buildTxDetailsString(hash,paymentId,tx_key,tx_note,destinations, rings);
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open();
|
||||
}
|
||||
|
||||
onEntered: {
|
||||
detailsButton.color = "#656565";
|
||||
}
|
||||
|
||||
onExited: {
|
||||
detailsButton.color = "#404040";
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: "?"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
91
components/HistoryTableInnerColumn.qml
Normal file
@@ -0,0 +1,91 @@
|
||||
// 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.Layouts 1.1
|
||||
import QtQuick.Dialogs 1.2
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.PendingTransaction 1.0
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
|
||||
Rectangle{
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
width: label1.width > label2.width ? label1.width : label2.width
|
||||
height: label1.height + label2.height
|
||||
color: "transparent"
|
||||
|
||||
property string copyValue: ""
|
||||
property alias labelHeader: label1.text
|
||||
property alias labelValue: label2.text
|
||||
|
||||
Text {
|
||||
id: label1
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: labelHeader
|
||||
color: MoneroComponents.Style.greyFontColor
|
||||
}
|
||||
|
||||
Text {
|
||||
id: label2
|
||||
anchors.left: parent.left
|
||||
anchors.top: label1.bottom
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
text: labelValue
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
}
|
||||
|
||||
// hover effect / copy value
|
||||
MouseArea {
|
||||
visible: copyValue !== ""
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: {
|
||||
label1.color = MoneroComponents.Style.defaultFontColor;
|
||||
label2.color = MoneroComponents.Style.defaultFontColor;
|
||||
}
|
||||
onExited: {
|
||||
label1.color = MoneroComponents.Style.greyFontColor;
|
||||
label2.color = MoneroComponents.Style.dimmedFontColor;
|
||||
}
|
||||
onClicked: {
|
||||
if(copyValue){
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(copyValue);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
222
components/HistoryTableMobile.qml
Normal file
@@ -0,0 +1,222 @@
|
||||
// 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.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import moneroComponents.Clipboard 1.0
|
||||
import moneroComponents.AddressBookModel 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
property var previousItem
|
||||
property var addressBookModel: null
|
||||
|
||||
function buildTxDetailsString(tx_id, paymentId, tx_key,tx_note, destinations, rings) {
|
||||
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 : "")
|
||||
+ (rings ? trStart + qsTr("Rings:") + trMiddle + rings + 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 * scaleRatio
|
||||
width: listView.width
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: "#545454"
|
||||
text: qsTr("No more results") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: tableContent.height + 20 * scaleRatio
|
||||
width: listView.width
|
||||
color: "transparent"
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
z: listView.count - index
|
||||
function collapseDropdown() { dropdown.expanded = false }
|
||||
|
||||
Rectangle{
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: parent.top
|
||||
width: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
height: 1
|
||||
color: "#404040"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
var tx_key = currentWallet.getTxKey(hash)
|
||||
var tx_note = currentWallet.getUserNote(hash)
|
||||
var rings = currentWallet.getRings(hash)
|
||||
if (rings)
|
||||
rings = rings.replace(/\|/g, '\n')
|
||||
informationPopup.title = "Transaction details";
|
||||
informationPopup.text = buildTxDetailsString(hash,paymentId,tx_key,tx_note,destinations, rings);
|
||||
informationPopup.open();
|
||||
informationPopup.onCloseCallback = null
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 15 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: parent.height/2 - this.height/2
|
||||
width: 30 * scaleRatio; height: 30 * scaleRatio
|
||||
radius: 25
|
||||
color: "#404040"
|
||||
|
||||
Image {
|
||||
width: 20 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
fillMode: Image.PreserveAspectFit
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/nextPage.png"
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: tableContent
|
||||
// Date
|
||||
RowLayout {
|
||||
Layout.topMargin: 20 * scaleRatio
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
Text {
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: date
|
||||
}
|
||||
|
||||
Text {
|
||||
font.family: Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
text: time
|
||||
}
|
||||
|
||||
// Show confirmations
|
||||
Text {
|
||||
visible: confirmations < confirmationsRequired || isPending
|
||||
Layout.leftMargin: 5 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
|
||||
text: {
|
||||
if (!isPending)
|
||||
if(confirmations < confirmationsRequired)
|
||||
return qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
|
||||
if (!isOut)
|
||||
return qsTr("UNCONFIRMED") + translationManager.emptyString
|
||||
if (isFailed)
|
||||
return qsTr("FAILED") + translationManager.emptyString
|
||||
return qsTr("PENDING") + translationManager.emptyString
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Amount & confirmations
|
||||
RowLayout {
|
||||
Layout.leftMargin: 10 * scaleRatio
|
||||
spacing: 2
|
||||
Text {
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: isOut ? MoneroComponents.Style.defaultFontColor : "#2eb358"
|
||||
text: isOut ? "↓" : "↑"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: amountText
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
color: isOut ? MoneroComponents.Style.defaultFontColor : "#2eb358"
|
||||
text: displayAmount
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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.
|
||||
//
|
||||
@@ -30,6 +30,7 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
property alias image : buttonImage
|
||||
property alias imageSource : buttonImage.source
|
||||
|
||||
signal clicked(var mouse)
|
||||
@@ -53,7 +54,8 @@ Item {
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
onPressed: {
|
||||
buttonImage.x = buttonImage.x + 2
|
||||
|
||||
93
components/InlineButton.qml
Normal file
@@ -0,0 +1,93 @@
|
||||
// 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.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: inlineButton
|
||||
height: rect.height * scaleRatio
|
||||
property string shadowPressedColor: "#B32D00"
|
||||
property string shadowReleasedColor: "#FF4304"
|
||||
property string pressedColor: "#FF4304"
|
||||
property string releasedColor: "#FF6C3C"
|
||||
property string icon: ""
|
||||
property string textColor: "#FFFFFF"
|
||||
property int fontSize: 12 * scaleRatio
|
||||
property alias text: inlineText.text
|
||||
signal clicked()
|
||||
|
||||
function doClick() {
|
||||
// Android workaround
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
id: rect
|
||||
color: MoneroComponents.Style.buttonBackgroundColorDisabled
|
||||
border.color: "black"
|
||||
height: 28 * scaleRatio
|
||||
width: inlineText.width + 22 * scaleRatio
|
||||
radius: 4
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
|
||||
Text {
|
||||
id: inlineText
|
||||
font.family: MoneroComponents.Style.fontBold.name
|
||||
font.bold: true
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
color: "black"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: doClick()
|
||||
onEntered: {
|
||||
rect.color = "#707070";
|
||||
rect.opacity = 0.8;
|
||||
}
|
||||
onExited: {
|
||||
rect.opacity = 1.0;
|
||||
rect.color = "#808080";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Keys.onSpacePressed: doClick()
|
||||
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,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.Controls 1.2
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
TextField {
|
||||
font.family: "Arial"
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
font.bold: true
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
style: TextFieldStyle {
|
||||
textColor: "#3F3F3F"
|
||||
placeholderTextColor: "#BABABA"
|
||||
|
||||
background: Rectangle {
|
||||
border.width: 0
|
||||
color: "transparent"
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
}
|
||||
}
|
||||
|
||||
164
components/InputDialog.qml
Normal file
@@ -0,0 +1,164 @@
|
||||
// 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.7
|
||||
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() {
|
||||
leftPanel.enabled = false
|
||||
middlePanel.enabled = false
|
||||
titleBar.enabled = false
|
||||
show()
|
||||
root.visible = true;
|
||||
input.focus = true;
|
||||
input.text = "";
|
||||
}
|
||||
|
||||
function close() {
|
||||
leftPanel.enabled = true
|
||||
middlePanel.enabled = true
|
||||
titleBar.enabled = true
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
z: bg.z + 1
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
|
||||
ColumnLayout {
|
||||
id: column
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 400 * scaleRatio
|
||||
|
||||
Label {
|
||||
id: label
|
||||
anchors.left: parent.left
|
||||
Layout.fillWidth: true
|
||||
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
TextField {
|
||||
id : input
|
||||
focus: true
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
anchors.left: parent.left
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 24 * scaleRatio
|
||||
KeyNavigation.tab: okButton
|
||||
bottomPadding: 10
|
||||
leftPadding: 10
|
||||
topPadding: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
background: Rectangle {
|
||||
radius: 2
|
||||
border.color: Qt.rgba(255, 255, 255, 0.35)
|
||||
border.width: 1
|
||||
color: "black"
|
||||
}
|
||||
|
||||
Keys.onReturnPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 16 * scaleRatio
|
||||
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")
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bg
|
||||
z: parent.z + 1
|
||||
anchors.fill: parent
|
||||
color: "black"
|
||||
opacity: 0.8
|
||||
}
|
||||
}
|
||||
68
components/InputMulti.qml
Normal file
@@ -0,0 +1,68 @@
|
||||
// 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.Controls 2.0
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../js/TxUtils.js" as TxUtils
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
|
||||
TextArea {
|
||||
property bool error: false
|
||||
property bool addressValidation: false
|
||||
property bool wrapAnywhere: true
|
||||
property int fontSize: 18 * scaleRatio
|
||||
property bool fontBold: false
|
||||
|
||||
id: textArea
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: fontSize
|
||||
font.bold: fontBold
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
wrapMode: {
|
||||
if(wrapAnywhere){
|
||||
return Text.WrapAnywhere;
|
||||
} else {
|
||||
return Text.WordWrap;
|
||||
}
|
||||
}
|
||||
onTextChanged: {
|
||||
if(addressValidation){
|
||||
// js replacement for `RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g }`
|
||||
textArea.text = textArea.text.replace(/[^a-z0-9]/gi,'');
|
||||
var address_ok = TxUtils.checkAddress(textArea.text, appWindow.persistentSettings.nettype);
|
||||
if(!address_ok) error = true;
|
||||
else error = false;
|
||||
TextArea.cursorPosition = textArea.text.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -29,55 +29,40 @@
|
||||
import QtQuick 2.0
|
||||
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 string tipText: ""
|
||||
property int fontSize: 12
|
||||
property int fontSize: 16 * scaleRatio
|
||||
property bool fontBold: false
|
||||
property string fontColor: MoneroComponents.Style.defaultFontColor
|
||||
property string fontFamily: ""
|
||||
property alias wrapMode: label.wrapMode
|
||||
property alias horizontalAlignment: label.horizontalAlignment
|
||||
signal linkActivated()
|
||||
width: icon.x + icon.width
|
||||
height: icon.height
|
||||
height: label.height * scaleRatio
|
||||
width: label.width * scaleRatio
|
||||
Layout.topMargin: 10 * scaleRatio
|
||||
|
||||
Text {
|
||||
id: label
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 2
|
||||
anchors.bottomMargin: 2 * scaleRatio
|
||||
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()
|
||||
}
|
||||
|
||||
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
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
74
components/LabelButton.qml
Normal file
@@ -0,0 +1,74 @@
|
||||
// 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.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
|
||||
Rectangle {
|
||||
signal clicked();
|
||||
property alias text: labelButtonText.text
|
||||
|
||||
id: labelButton
|
||||
color: "#808080"
|
||||
radius: 3
|
||||
height: 20
|
||||
width: labelButtonText.width + 14
|
||||
anchors.right: copyButton.left
|
||||
anchors.rightMargin: 6
|
||||
visible: isValidOpenAliasAddress(addressLine.text)
|
||||
|
||||
Text {
|
||||
id: labelButtonText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 12
|
||||
font.bold: true
|
||||
text: ""
|
||||
color: "black"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: labelButton.clicked()
|
||||
onEntered: {
|
||||
labelButton.color = "#707070";
|
||||
labelButtonText.opacity = 0.8;
|
||||
}
|
||||
onExited: {
|
||||
labelButton.color = "#808080";
|
||||
labelButtonText.opacity = 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
46
components/LabelSubheader.qml
Normal file
@@ -0,0 +1,46 @@
|
||||
// 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 "../components" as MoneroComponents
|
||||
|
||||
Label {
|
||||
id: item
|
||||
fontSize: 17 * scaleRatio
|
||||
|
||||
Rectangle {
|
||||
anchors.top: item.bottom
|
||||
anchors.topMargin: 4
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 2
|
||||
color: MoneroComponents.Style.dividerColor
|
||||
opacity: MoneroComponents.Style.dividerOpacity
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -28,51 +28,187 @@
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: item
|
||||
property alias placeholderText: input.placeholderText
|
||||
property alias text: input.text
|
||||
|
||||
property alias placeholderText: placeholderLabel.text
|
||||
property bool placeholderCenter: false
|
||||
property string placeholderFontFamily: MoneroComponents.Style.fontRegular.name
|
||||
property bool placeholderFontBold: false
|
||||
property int placeholderFontSize: 18 * scaleRatio
|
||||
property string placeholderColor: MoneroComponents.Style.defaultFontColor
|
||||
property real placeholderOpacity: 0.25
|
||||
|
||||
property alias validator: input.validator
|
||||
property alias readOnly : input.readOnly
|
||||
property alias cursorPosition: input.cursorPosition
|
||||
property alias echoMode: input.echoMode
|
||||
property int fontSize: 18
|
||||
property alias inlineButton: inlineButtonId
|
||||
property alias inlineButtonText: inlineButtonId.text
|
||||
property alias inlineIcon: inlineIcon.visible
|
||||
property bool copyButton: false
|
||||
property string borderColor: {
|
||||
if(input.activeFocus){
|
||||
return Qt.rgba(255, 255, 255, 0.35);
|
||||
} else {
|
||||
return Qt.rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
}
|
||||
property bool borderDisabled: false
|
||||
property int fontSize: 18 * scaleRatio
|
||||
property bool showBorder: true
|
||||
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 * scaleRatio
|
||||
property bool labelFontBold: false
|
||||
property alias labelWrapMode: inputLabel.wrapMode
|
||||
property alias labelHorizontalAlignment: inputLabel.horizontalAlignment
|
||||
property bool showingHeader: inputLabel.text !== "" || copyButton
|
||||
property int inputHeight: 42 * scaleRatio
|
||||
|
||||
signal labelLinkActivated(); // input label, rich text <a> signal
|
||||
signal editingFinished();
|
||||
signal accepted();
|
||||
signal textUpdated();
|
||||
|
||||
height: 37
|
||||
height: showingHeader ? (inputLabel.height + inputItem.height + 2) * scaleRatio : 42 * scaleRatio
|
||||
|
||||
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
|
||||
Text {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.topMargin: 2 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.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
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
text: qsTr("Copy")
|
||||
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 * scaleRatio
|
||||
anchors.top: showingHeader ? inputLabel.bottom : parent.top
|
||||
anchors.topMargin: showingHeader ? 12 * scaleRatio : 2 * scaleRatio
|
||||
width: parent.width
|
||||
|
||||
Text {
|
||||
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 * scaleRatio; }
|
||||
else { return 10 * scaleRatio; }
|
||||
}
|
||||
|
||||
opacity: item.placeholderOpacity
|
||||
color: item.placeholderColor
|
||||
font.family: item.placeholderFontFamily
|
||||
font.pixelSize: placeholderFontSize * scaleRatio
|
||||
font.bold: item.placeholderFontBold
|
||||
text: ""
|
||||
z: 3
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 1 * scaleRatio
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: inputFill
|
||||
color: backgroundColor
|
||||
anchors.fill: parent
|
||||
border.width: borderDisabled ? 0 : 1
|
||||
border.color: borderColor
|
||||
radius: 4
|
||||
}
|
||||
|
||||
Image {
|
||||
id: inlineIcon
|
||||
width: 26 * scaleRatio
|
||||
height: 26 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 8 * scaleRatio
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12 * scaleRatio
|
||||
source: "../images/moneroIcon-28x28.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: input
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: inlineIcon.visible ? 38 : 0
|
||||
font.pixelSize: item.fontSize
|
||||
font.bold: item.fontBold
|
||||
onEditingFinished: item.editingFinished()
|
||||
onAccepted: item.accepted();
|
||||
onTextChanged: item.textUpdated()
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
id: inlineButtonId
|
||||
visible: item.inlineButtonText ? true : false
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 8 * scaleRatio
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 6 * scaleRatio
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
140
components/LineEditMulti.qml
Normal file
@@ -0,0 +1,140 @@
|
||||
// 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.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ColumnLayout {
|
||||
id: lineditmulti
|
||||
property alias text: multiLine.text
|
||||
property alias placeholderText: placeholderLabel.text
|
||||
property alias labelText: inputLabel.text
|
||||
property alias error: multiLine.error
|
||||
property alias readOnly: multiLine.readOnly
|
||||
property alias addressValidation: multiLine.addressValidation
|
||||
property alias labelButtonText: labelButton.text
|
||||
property bool labelFontBold: false
|
||||
property bool labelButtonVisible: false
|
||||
property bool copyButton: false
|
||||
property bool wrapAnywhere: true
|
||||
property bool showingHeader: true
|
||||
property bool showBorder: true
|
||||
property bool fontBold: false
|
||||
property int fontSize: 16 * scaleRatio
|
||||
|
||||
signal labelButtonClicked();
|
||||
signal inputLabelLinkActivated();
|
||||
|
||||
spacing: 0
|
||||
Rectangle {
|
||||
id: inputLabelRect
|
||||
color: "transparent"
|
||||
Layout.fillWidth: true
|
||||
height: (inputLabel.height + 10) * scaleRatio
|
||||
visible: showingHeader ? true : false
|
||||
|
||||
Text {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
onLinkActivated: inputLabelLinkActivated()
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: labelButton
|
||||
onClicked: labelButtonClicked()
|
||||
visible: labelButtonVisible
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
visible: copyButton && multiLine.text !== ""
|
||||
text: qsTr("Copy")
|
||||
anchors.right: labelButton.visible ? inputLabel.right : parent.right
|
||||
anchors.rightMargin: labelButton.visible? 4 : 0
|
||||
onClicked: {
|
||||
if (multiLine.text.length > 0) {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(multiLine.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.InputMulti {
|
||||
id: multiLine
|
||||
readOnly: false
|
||||
addressValidation: true
|
||||
anchors.top: parent.showingHeader ? inputLabelRect.bottom : parent.top
|
||||
Layout.fillWidth: true
|
||||
topPadding: parent.showingHeader ? 10 * scaleRatio : 0
|
||||
bottomPadding: 10 * scaleRatio
|
||||
wrapAnywhere: parent.wrapAnywhere
|
||||
fontSize: parent.fontSize
|
||||
fontBold: parent.fontBold
|
||||
|
||||
Text {
|
||||
id: placeholderLabel
|
||||
visible: multiLine.text ? false : true
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10 * scaleRatio
|
||||
opacity: 0.25
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
text: ""
|
||||
z: 3
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
border.width: 1
|
||||
border.color: {
|
||||
if(multiLine.error && multiLine.text !== ""){
|
||||
return Qt.rgba(255, 0, 0, 0.45);
|
||||
} else if(multiLine.activeFocus){
|
||||
return Qt.rgba(255, 255, 255, 0.35);
|
||||
} else {
|
||||
return Qt.rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
}
|
||||
radius: 4
|
||||
anchors.fill: parent
|
||||
visible: lineditmulti.showBorder
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,7 +26,9 @@
|
||||
// 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.5
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
id: button
|
||||
@@ -38,31 +40,120 @@ Rectangle {
|
||||
property var under: null
|
||||
signal clicked()
|
||||
|
||||
function doClick() {
|
||||
// Android workaround
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
|
||||
function getOffset() {
|
||||
var offset = 0
|
||||
var item = button
|
||||
while (item.under) {
|
||||
offset += 20
|
||||
offset += 20 * scaleRatio
|
||||
item = item.under
|
||||
}
|
||||
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 * scaleRatio : 38 * scaleRatio ) : 0
|
||||
|
||||
// button gradient while checked
|
||||
Image {
|
||||
height: parent.height
|
||||
width: 260
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: -20
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
source: "../images/menuButtonGradient.png"
|
||||
visible: button.checked
|
||||
}
|
||||
|
||||
// button decorations that are subject to leftMargin offsets
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: parent.getOffset() + 20 * scaleRatio
|
||||
height: parent.height
|
||||
width: button.checked ? 20: 10
|
||||
color: "#00000000"
|
||||
|
||||
// dot if unchecked
|
||||
Rectangle {
|
||||
id: dot
|
||||
anchors.centerIn: parent
|
||||
width: button.checked ? 20 * scaleRatio : 8 * scaleRatio
|
||||
height: button.checked ? 20 * scaleRatio : 8 * scaleRatio
|
||||
radius: button.checked ? 20 * scaleRatio : 4 * scaleRatio
|
||||
color: button.dotColor
|
||||
// arrow if checked
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
anchors.left: parent.left
|
||||
source: "../images/arrow-right-medium-white.png"
|
||||
visible: button.checked
|
||||
}
|
||||
}
|
||||
|
||||
// button text
|
||||
Text {
|
||||
id: label
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.right
|
||||
anchors.leftMargin: 8 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.bold: true
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
color: "#FFFFFF"
|
||||
}
|
||||
}
|
||||
|
||||
// menu button right arrow
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20 * scaleRatio
|
||||
anchors.leftMargin: parent.getOffset()
|
||||
source: "../images/right.png"
|
||||
opacity: button.checked ? 1.0 : 0.4
|
||||
}
|
||||
|
||||
Text {
|
||||
id: symbolText
|
||||
anchors.centerIn: parent
|
||||
font.pixelSize: 11 * scaleRatio
|
||||
font.bold: true
|
||||
color: button.checked || buttonArea.containsMouse ? "#FFFFFF" : dot.color
|
||||
visible: appWindow.ctrlPressed
|
||||
}
|
||||
|
||||
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 +161,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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import QtQuick 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Layouts 1.1
|
||||
import moneroComponents.Wallet 1.0
|
||||
|
||||
import moneroComponents.Wallet 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
// BasicPanel header
|
||||
Rectangle {
|
||||
@@ -10,17 +11,16 @@ Rectangle {
|
||||
anchors.leftMargin: 1
|
||||
anchors.rightMargin: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 64
|
||||
Layout.preferredHeight: 64 * scaleRatio
|
||||
color: "#FFFFFF"
|
||||
// visible: basicMode
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
visible: appWindow.width > 460
|
||||
visible: appWindow.width > 460 * scaleRatio
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
anchors.leftMargin: 50 * scaleRatio
|
||||
source: "../images/moneroLogo2.png"
|
||||
}
|
||||
|
||||
@@ -28,9 +28,8 @@ Rectangle {
|
||||
id: icon
|
||||
visible: !logo.visible
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
// anchors.verticalCenterOffset: -5
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
|
||||
anchors.leftMargin: 40 * scaleRatio
|
||||
source: "../images/moneroIcon.png"
|
||||
}
|
||||
|
||||
@@ -38,16 +37,16 @@ Rectangle {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: 10
|
||||
width: 256
|
||||
anchors.topMargin: 10 * scaleRatio
|
||||
width: 256 * scaleRatio
|
||||
columns: 3
|
||||
|
||||
Text {
|
||||
id: balanceLabel
|
||||
width: 116
|
||||
height: 20
|
||||
width: 116 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.pixelSize: 12 * scaleRatio
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
@@ -58,10 +57,10 @@ Rectangle {
|
||||
|
||||
Text {
|
||||
id: balanceText
|
||||
width: 110
|
||||
height: 20
|
||||
width: 110 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
font.pixelSize: 18 * scaleRatio
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
@@ -71,8 +70,8 @@ Rectangle {
|
||||
}
|
||||
|
||||
Item {
|
||||
height: 20
|
||||
width: 20
|
||||
height: 20 * scaleRatio
|
||||
width: 20 * scaleRatio
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
@@ -82,10 +81,10 @@ Rectangle {
|
||||
}
|
||||
|
||||
Text {
|
||||
width: 116
|
||||
height: 20
|
||||
width: 116 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
font.pixelSize: 12 * scaleRatio
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
@@ -96,10 +95,10 @@ Rectangle {
|
||||
|
||||
Text {
|
||||
id: availableBalanceText
|
||||
width: 110
|
||||
height: 20
|
||||
width: 110 * scaleRatio
|
||||
height: 20 * scaleRatio
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 14
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
font.letterSpacing: -1
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -27,30 +27,22 @@
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import moneroComponents.Wallet 1.0
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Row {
|
||||
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")
|
||||
if(appWindow.remoteNodeConnected)
|
||||
return qsTr("Remote node")
|
||||
return qsTr("Connected")
|
||||
}
|
||||
if (status == Wallet.ConnectionStatus_WrongVersion)
|
||||
@@ -60,37 +52,68 @@ Row {
|
||||
return qsTr("Invalid connection status")
|
||||
}
|
||||
|
||||
Item {
|
||||
id: iconItem
|
||||
anchors.bottom: parent.bottom
|
||||
width: 50
|
||||
height: 50
|
||||
RowLayout {
|
||||
Layout.preferredHeight: 40 * scaleRatio
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: getConnectionStatusImage(item.connected)
|
||||
Item {
|
||||
id: iconItem
|
||||
anchors.top: parent.top
|
||||
width: 40 * scaleRatio
|
||||
height: 40 * scaleRatio
|
||||
opacity: {
|
||||
if(item.connected == Wallet.ConnectionStatus_Connected){
|
||||
return 1
|
||||
} else {
|
||||
return 0.5
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 6
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 11
|
||||
source: {
|
||||
if(item.connected == Wallet.ConnectionStatus_Connected){
|
||||
return "../images/lightning.png"
|
||||
} else {
|
||||
return "../images/lightning-white.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
anchors.top: parent.top
|
||||
anchors.left: iconItem.right
|
||||
height: 40 * scaleRatio
|
||||
width: 260 * scaleRatio
|
||||
|
||||
Text {
|
||||
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 * scaleRatio
|
||||
color: "white"
|
||||
opacity: 0.5
|
||||
text: qsTr("Network status") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
id: statusTextVal
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 14
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 20 * scaleRatio
|
||||
color: "white"
|
||||
text: getConnectionStatusString(item.connected) + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
anchors.bottom: parent.bottom
|
||||
height: 53
|
||||
spacing: 3
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
color: "#545454"
|
||||
text: qsTr("Network status") + translationManager.emptyString
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 18
|
||||
color: getConnectionStatusColor(item.connected)
|
||||
text: getConnectionStatusString(item.connected) + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
252
components/NewPasswordDialog.qml
Normal file
@@ -0,0 +1,252 @@
|
||||
// Copyright (c) 2017, 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.7
|
||||
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
|
||||
Rectangle {
|
||||
id: bg
|
||||
z: parent.z + 1
|
||||
anchors.fill: parent
|
||||
color: "black"
|
||||
opacity: 0.8
|
||||
}
|
||||
|
||||
property alias password: passwordInput1.text
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
signal closeCallback()
|
||||
|
||||
function open() {
|
||||
leftPanel.enabled = false
|
||||
middlePanel.enabled = false
|
||||
titleBar.enabled = false
|
||||
show();
|
||||
root.visible = true;
|
||||
passwordInput1.text = "";
|
||||
passwordInput2.text = "";
|
||||
passwordInput1.focus = true
|
||||
}
|
||||
|
||||
function close() {
|
||||
leftPanel.enabled = true
|
||||
middlePanel.enabled = true
|
||||
titleBar.enabled = true
|
||||
root.visible = false;
|
||||
closeCallback();
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: 360
|
||||
|
||||
// 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 {
|
||||
z: bg.z + 1
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 * scaleRatio }
|
||||
|
||||
ColumnLayout {
|
||||
id: column
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 400 * scaleRatio
|
||||
|
||||
Label {
|
||||
text: qsTr("Please enter new password")
|
||||
anchors.left: parent.left
|
||||
Layout.fillWidth: true
|
||||
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
TextField {
|
||||
id : passwordInput1
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
anchors.left: parent.left
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 24 * scaleRatio
|
||||
echoMode: TextInput.Password
|
||||
bottomPadding: 10
|
||||
leftPadding: 10
|
||||
topPadding: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
KeyNavigation.tab: passwordInput2
|
||||
|
||||
background: Rectangle {
|
||||
radius: 2
|
||||
border.color: Qt.rgba(255, 255, 255, 0.35)
|
||||
border.width: 1
|
||||
color: "black"
|
||||
|
||||
Image {
|
||||
width: 12
|
||||
height: 16
|
||||
source: "../images/lockIcon.png"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20
|
||||
}
|
||||
}
|
||||
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
// padding
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
height: 10
|
||||
opacity: 0
|
||||
color: "black"
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("Please confirm new password")
|
||||
anchors.left: parent.left
|
||||
Layout.fillWidth: true
|
||||
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
TextField {
|
||||
id : passwordInput2
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
anchors.left: parent.left
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 24 * scaleRatio
|
||||
echoMode: TextInput.Password
|
||||
KeyNavigation.tab: okButton
|
||||
bottomPadding: 10
|
||||
leftPadding: 10
|
||||
topPadding: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
background: Rectangle {
|
||||
radius: 2
|
||||
border.color: Qt.rgba(255, 255, 255, 0.35)
|
||||
border.width: 1
|
||||
color: "black"
|
||||
|
||||
Image {
|
||||
width: 12
|
||||
height: 16
|
||||
source: "../images/lockIcon.png"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20
|
||||
}
|
||||
}
|
||||
|
||||
Keys.onReturnPressed: {
|
||||
if (passwordInput1.text === passwordInput2.text) {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
Keys.onEscapePressed: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
// padding
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
height: 10
|
||||
opacity: 0
|
||||
color: "black"
|
||||
}
|
||||
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 16 * scaleRatio
|
||||
Layout.topMargin: 16
|
||||
Layout.alignment: Qt.AlignRight
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
KeyNavigation.tab: passwordInput1
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
text: qsTr("Continue")
|
||||
KeyNavigation.tab: cancelButton
|
||||
enabled: passwordInput1.text === passwordInput2.text
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2017, The Monero Project
|
||||
// Copyright (c) 2017-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -26,8 +26,8 @@
|
||||
// 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.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
@@ -35,79 +35,93 @@ import QtQuick.Window 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Window {
|
||||
Item {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window | Qt.FramelessWindowHint
|
||||
visible: false
|
||||
|
||||
property alias password: passwordInput.text
|
||||
property string walletName
|
||||
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
|
||||
signal closeCallback()
|
||||
|
||||
function open(walletName) {
|
||||
root.walletName = walletName ? walletName : ""
|
||||
leftPanel.enabled = false
|
||||
middlePanel.enabled = false
|
||||
titleBar.enabled = false
|
||||
show()
|
||||
root.visible = true;
|
||||
passwordInput.forceActiveFocus();
|
||||
passwordInput.text = ""
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: walletName ? 240 : 200
|
||||
|
||||
// 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 close() {
|
||||
leftPanel.enabled = true
|
||||
middlePanel.enabled = true
|
||||
titleBar.enabled = true
|
||||
root.visible = false;
|
||||
closeCallback();
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
z: bg.z + 1
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
anchors { fill: parent; margins: 35 * scaleRatio }
|
||||
|
||||
ColumnLayout {
|
||||
id: column
|
||||
//anchors {fill: parent; margins: 16 }
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 400 * scaleRatio
|
||||
|
||||
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
|
||||
text: root.walletName.length > 0 ? qsTr("Please enter wallet password for: ") + root.walletName : qsTr("Please enter wallet password")
|
||||
anchors.left: parent.left
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 24
|
||||
font.family: "Arial"
|
||||
color: "#555555"
|
||||
|
||||
font.pixelSize: 16 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
TextField {
|
||||
id : passwordInput
|
||||
focus: true
|
||||
Layout.topMargin: 6
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
anchors.left: parent.left
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 32
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
font.pixelSize: 24 * scaleRatio
|
||||
echoMode: TextInput.Password
|
||||
KeyNavigation.tab: okButton
|
||||
bottomPadding: 10
|
||||
leftPadding: 10
|
||||
topPadding: 10
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
|
||||
style: TextFieldStyle {
|
||||
renderType: Text.NativeRendering
|
||||
textColor: "#35B05A"
|
||||
passwordCharacter: "•"
|
||||
// no background
|
||||
background: Rectangle {
|
||||
radius: 0
|
||||
border.width: 0
|
||||
background: Rectangle {
|
||||
radius: 2
|
||||
border.color: Qt.rgba(255, 255, 255, 0.35)
|
||||
border.width: 1
|
||||
color: "black"
|
||||
|
||||
Image {
|
||||
width: 12
|
||||
height: 16
|
||||
source: "../images/lockIcon.png"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 20
|
||||
}
|
||||
}
|
||||
|
||||
Keys.onReturnPressed: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
@@ -118,66 +132,45 @@ Window {
|
||||
root.rejected()
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// underline
|
||||
Rectangle {
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
anchors.bottomMargin: 3
|
||||
|
||||
}
|
||||
// padding
|
||||
Rectangle {
|
||||
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()
|
||||
}
|
||||
}
|
||||
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()
|
||||
// Ok/Cancel buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 16 * scaleRatio
|
||||
Layout.topMargin: 16
|
||||
Layout.alignment: Qt.AlignRight
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
small: true
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
KeyNavigation.tab: passwordInput
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
small: true
|
||||
text: qsTr("Continue")
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
id: bg
|
||||
|
||||
anchors.fill: parent
|
||||
color: "black"
|
||||
opacity: 0.8
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -116,7 +116,7 @@ Item {
|
||||
|
||||
Row {
|
||||
id: row2
|
||||
spacing: ((bar.width - 8) / 2) / 4
|
||||
spacing: bar.width / 14
|
||||
|
||||
Repeater {
|
||||
model: 4
|
||||
@@ -125,7 +125,7 @@ Item {
|
||||
id: delegateItem2
|
||||
currentX: x + row2.x
|
||||
currentIndex: index
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
mainTick: currentIndex === 0
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem2
|
||||
}
|
||||
@@ -135,7 +135,7 @@ Item {
|
||||
|
||||
Row {
|
||||
id: row1
|
||||
spacing: ((bar.width - 8) / 2) / 10
|
||||
spacing: bar.width / 14
|
||||
|
||||
Repeater {
|
||||
model: 10
|
||||
@@ -144,7 +144,7 @@ Item {
|
||||
id: delegateItem1
|
||||
currentX: x + row1.x
|
||||
currentIndex: index + 4
|
||||
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
|
||||
mainTick: currentIndex === 13
|
||||
Component.onCompleted: {
|
||||
row.positions[currentIndex] = delegateItem1
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -31,17 +31,26 @@ import QtQuick.Window 2.1
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Window {
|
||||
Rectangle {
|
||||
id: root
|
||||
modality: Qt.ApplicationModal
|
||||
flags: Qt.Window
|
||||
color: "white"
|
||||
visible: false
|
||||
z:11
|
||||
property alias messageText: messageTitle.text
|
||||
property alias heightProgressText : heightProgress.text
|
||||
|
||||
width: 200
|
||||
height: 100
|
||||
width: 200 * scaleRatio
|
||||
height: 100 * scaleRatio
|
||||
opacity: 0.7
|
||||
|
||||
function show() {
|
||||
root.visible = true;
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: rootLayout
|
||||
|
||||
@@ -49,8 +58,8 @@ Window {
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
anchors.leftMargin: 30
|
||||
anchors.rightMargin: 30
|
||||
anchors.leftMargin: 30 * scaleRatio
|
||||
anchors.rightMargin: 30 * scaleRatio
|
||||
|
||||
BusyIndicator {
|
||||
running: parent.visible
|
||||
@@ -61,7 +70,7 @@ Window {
|
||||
id: messageTitle
|
||||
text: "Please wait..."
|
||||
font {
|
||||
pixelSize: 22
|
||||
pixelSize: 22 * scaleRatio
|
||||
}
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
||||
@@ -72,7 +81,7 @@ Window {
|
||||
Text {
|
||||
id: heightProgress
|
||||
font {
|
||||
pixelSize: 18
|
||||
pixelSize: 18 * scaleRatio
|
||||
}
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -29,78 +29,94 @@
|
||||
import QtQuick 2.0
|
||||
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 && blocksToSync != remaining) ? (100*(blocksToSync - remaining)/blocksToSync).toFixed(0) : 100*(currentBlock / targetBlock).toFixed(0)
|
||||
fillLevel = progressLevel
|
||||
progressText.text = qsTr("Blocks remaining: %1").arg(remaining.toFixed(0));
|
||||
progressBar.visible = currentBlock < targetBlock
|
||||
if(typeof statusTxt != "undefined" && statusTxt != "") {
|
||||
progressText.text = statusTxt;
|
||||
} else {
|
||||
progressText.text = syncText + 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 * scaleRatio
|
||||
anchors.leftMargin: 15 * scaleRatio
|
||||
anchors.rightMargin: 15 * scaleRatio
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
id: fillRect
|
||||
Text {
|
||||
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 * scaleRatio
|
||||
font.bold: true
|
||||
color: "white"
|
||||
text: qsTr("Synchronizing %1").arg(syncType)
|
||||
height: 18 * scaleRatio
|
||||
}
|
||||
|
||||
Text {
|
||||
id: progressTextValue
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 6
|
||||
anchors.right: parent.right
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.pixelSize: 13 * scaleRatio
|
||||
font.bold: true
|
||||
color: "white"
|
||||
height:18 * scaleRatio
|
||||
}
|
||||
|
||||
|
||||
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 * scaleRatio
|
||||
radius: 8 * scaleRatio
|
||||
color: "#333333" // progressbar bg
|
||||
|
||||
Text {
|
||||
id:progressText
|
||||
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 - 4 * scaleRatio
|
||||
width: (maxWidth * fillLevel) / 100
|
||||
radius: 8
|
||||
// could change color based on progressbar status; if(item.fillLevel < 99 )
|
||||
color: "#FA6800"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color:"#333"
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 8 * scaleRatio
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2017, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -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 {
|
||||
@@ -83,7 +83,7 @@ Rectangle {
|
||||
id : finder
|
||||
objectName: "QrFinder"
|
||||
onDecoded : {
|
||||
root.qrcode_decoded(address, payment_id, amount, tx_description, recipient_name)
|
||||
root.qrcode_decoded(address, payment_id, amount, tx_description, recipient_name, extra_parameters)
|
||||
root.state = "Stopped"
|
||||
}
|
||||
onNotifyError : {
|
||||
@@ -126,7 +126,7 @@ Rectangle {
|
||||
|
||||
MessageDialog {
|
||||
id: messageDialog
|
||||
title: "Scanning QrCode"
|
||||
title: qsTr("QrCode Scanned") + translationManager.emptyString
|
||||
onAccepted: {
|
||||
root.state = "Stopped"
|
||||
}
|
||||
|
||||
95
components/RemoteNodeEdit.qml
Normal file
@@ -0,0 +1,95 @@
|
||||
// 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.2
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
GridLayout {
|
||||
columns: (isMobile) ? 1 : 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
|
||||
|
||||
// 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: 18 * scaleRatio
|
||||
property string placeholderColor: MoneroComponents.Style.defaultFontColor
|
||||
property real placeholderOpacity: 0.25
|
||||
|
||||
property string lineEditBorderColor: Qt.rgba(0, 0, 0, 0.15)
|
||||
property string lineEditBackgroundColor: "white"
|
||||
property string lineEditFontColor: "black"
|
||||
property bool lineEditFontBold: true
|
||||
|
||||
signal editingFinished()
|
||||
|
||||
function getAddress() {
|
||||
return daemonAddr.text.trim() + ":" + daemonPort.text.trim()
|
||||
}
|
||||
|
||||
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
|
||||
onEditingFinished: root.editingFinished()
|
||||
borderColor: lineEditBorderColor
|
||||
backgroundColor: lineEditBackgroundColor
|
||||
fontColor: lineEditFontColor
|
||||
fontBold: lineEditFontBold
|
||||
}
|
||||
|
||||
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
|
||||
onEditingFinished: root.editingFinished()
|
||||
borderColor: lineEditBorderColor
|
||||
backgroundColor: lineEditBackgroundColor
|
||||
fontColor: lineEditFontColor
|
||||
fontBold: lineEditFontBold
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -51,7 +51,7 @@ Item {
|
||||
Rectangle {
|
||||
id: scroll
|
||||
|
||||
width: 15
|
||||
width: 4
|
||||
height: {
|
||||
var t = (flickable.height * flickable.height) / flickable.contentHeight
|
||||
return t < 20 ? 20 : t
|
||||
@@ -62,7 +62,7 @@ Item {
|
||||
visible: flickable.contentHeight > flickable.height
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
NumberAnimation { duration: 200; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: item
|
||||
signal searchClicked(string text, int option)
|
||||
@@ -213,18 +215,13 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
StandardButton {
|
||||
MoneroComponents.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)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -29,50 +29,57 @@
|
||||
import QtQuick 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: button
|
||||
height: 37
|
||||
property string shadowPressedColor
|
||||
property string shadowReleasedColor
|
||||
property string pressedColor
|
||||
property string releasedColor
|
||||
property string rightIcon: ""
|
||||
property string icon: ""
|
||||
property string textColor: "#FFFFFF"
|
||||
property int fontSize: 12
|
||||
property string textColor: button.enabled? MoneroComponents.Style.buttonTextColor: MoneroComponents.Style.buttonTextColorDisabled
|
||||
property bool small: false
|
||||
property alias text: label.text
|
||||
property int fontSize: {
|
||||
if(small) return 14 * scaleRatio;
|
||||
else return 16 * scaleRatio;
|
||||
}
|
||||
signal clicked()
|
||||
|
||||
// Dynamic label width
|
||||
Layout.minimumWidth: (label.contentWidth > 80)? label.contentWidth + 20 : 100
|
||||
// Dynamic height/width
|
||||
Layout.minimumWidth: (label.contentWidth > 50)? label.contentWidth + 22 : 60
|
||||
height: small ? 30 * scaleRatio : 36 * scaleRatio
|
||||
|
||||
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)
|
||||
border.width: parent.focus ? 1 : 0
|
||||
|
||||
function doClick() {
|
||||
// Android workaround
|
||||
releaseFocus();
|
||||
clicked();
|
||||
}
|
||||
|
||||
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)
|
||||
radius: 3
|
||||
color: parent.enabled ? MoneroComponents.Style.buttonBackgroundColor : MoneroComponents.Style.buttonBackgroundColorDisabled
|
||||
border.width: parent.focus ? 1 : 0
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
|
||||
propagateComposedEvents: true
|
||||
|
||||
// possibly do some hover effects here
|
||||
onEntered: {
|
||||
// if(button.enabled) parent.color = Style.buttonBackgroundColorHover;
|
||||
// else parent.color = Style.buttonBackgroundColorDisabledHover;
|
||||
}
|
||||
onExited: {
|
||||
// if(button.enabled) parent.color = Style.buttonBackgroundColor;
|
||||
// else parent.color = Style.buttonBackgroundColorDisabled;
|
||||
}
|
||||
}
|
||||
//radius: 4
|
||||
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
@@ -81,12 +88,11 @@ Item {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.family: "Arial"
|
||||
font.family: MoneroComponents.Style.fontBold.name
|
||||
font.bold: true
|
||||
font.pixelSize: button.fontSize
|
||||
font.pixelSize: buttonArea.pressed ? button.fontSize - 1 : button.fontSize
|
||||
color: parent.textColor
|
||||
visible: parent.icon === ""
|
||||
// font.capitalization : Font.Capitalize
|
||||
}
|
||||
|
||||
Image {
|
||||
@@ -98,9 +104,10 @@ Item {
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
onClicked: parent.clicked()
|
||||
onClicked: doClick()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
|
||||
Keys.onSpacePressed: clicked()
|
||||
Keys.onReturnPressed: clicked()
|
||||
Keys.onSpacePressed: doClick()
|
||||
Keys.onReturnPressed: doClick()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -27,7 +27,7 @@
|
||||
// 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 2.0
|
||||
import QtQuick.Dialogs 1.2
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
@@ -35,10 +35,10 @@ import QtQuick.Window 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
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
|
||||
@@ -53,6 +53,15 @@ Window {
|
||||
// same signals as Dialog has
|
||||
signal accepted()
|
||||
signal rejected()
|
||||
signal closeCallback();
|
||||
|
||||
Image {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
source: "../images/middlePanelBg.jpg"
|
||||
}
|
||||
|
||||
// Make window draggable
|
||||
MouseArea {
|
||||
@@ -64,29 +73,42 @@ Window {
|
||||
}
|
||||
|
||||
function open() {
|
||||
// Center
|
||||
if(!isMobile) {
|
||||
root.x = parent.width/2 - root.width/2
|
||||
root.y = 100
|
||||
}
|
||||
show()
|
||||
root.z = 11
|
||||
root.visible = true;
|
||||
}
|
||||
|
||||
function close() {
|
||||
root.visible = false;
|
||||
closeCallback();
|
||||
}
|
||||
|
||||
// TODO: implement without hardcoding sizes
|
||||
width: 480
|
||||
height: 280
|
||||
width: isMobile ? screenWidth : 520
|
||||
height: isMobile ? screenHeight : 380
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 10
|
||||
anchors { fill: parent; margins: 35 }
|
||||
anchors { fill: parent; margins: 15 }
|
||||
|
||||
RowLayout {
|
||||
id: column
|
||||
//anchors {fill: parent; margins: 16 }
|
||||
Layout.topMargin: 14 * scaleRatio
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
Label {
|
||||
MoneroComponents.Label {
|
||||
id: dialogTitle
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 32
|
||||
font.family: "Arial"
|
||||
color: "#555555"
|
||||
fontSize: 18 * scaleRatio
|
||||
fontFamily: "Arial"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
}
|
||||
@@ -96,10 +118,28 @@ Window {
|
||||
id : dialogContent
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
font.family: "Arial"
|
||||
renderType: Text.QtRendering
|
||||
font.family: MoneroComponents.Style.fontLight.name
|
||||
textFormat: TextEdit.AutoText
|
||||
readOnly: true
|
||||
font.pixelSize: 12
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
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 +151,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,13 +160,7 @@ Window {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: okButton
|
||||
width: 120
|
||||
fontSize: 14
|
||||
shadowReleasedColor: "#FF4304"
|
||||
shadowPressedColor: "#B32D00"
|
||||
releasedColor: "#FF6C3C"
|
||||
pressedColor: "#FF4304"
|
||||
text: qsTr("Ok")
|
||||
text: qsTr("OK")
|
||||
KeyNavigation.tab: cancelButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
@@ -143,7 +171,36 @@ Window {
|
||||
}
|
||||
}
|
||||
|
||||
// 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.
|
||||
//
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: dropdown
|
||||
property alias dataModel: repeater.model
|
||||
@@ -38,7 +40,16 @@ Item {
|
||||
property string textColor: "#FFFFFF"
|
||||
property alias currentIndex: column.currentIndex
|
||||
property bool expanded: false
|
||||
height: 37
|
||||
property int dropdownHeight: 42
|
||||
property int fontHeaderSize: 16 * scaleRatio
|
||||
property int fontItemSize: 14 * scaleRatio
|
||||
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 }
|
||||
@@ -54,83 +65,35 @@ Item {
|
||||
return true
|
||||
}
|
||||
|
||||
// Workaroud for suspected memory leak in 5.8 causing malloc crash on app exit
|
||||
function update() {
|
||||
firstColText.text = column.currentIndex < repeater.model.rowCount() ? qsTr(repeater.model.get(column.currentIndex).column1) + translationManager.emptyString : ""
|
||||
}
|
||||
|
||||
Item {
|
||||
id: head
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
height: 37
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
color: dropdown.colorHeaderBackground
|
||||
border.width: dropdown.headerBorder ? 1 : 0
|
||||
border.color: Qt.rgba(1, 1, 1, 0.25)
|
||||
radius: 4
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Text {
|
||||
id: firstColText
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12
|
||||
anchors.leftMargin: 12 * scaleRatio
|
||||
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
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.bold: dropdown.headerFontBold
|
||||
font.pixelSize: dropdown.fontHeaderSize
|
||||
color: "#FFFFFF"
|
||||
}
|
||||
|
||||
@@ -139,12 +102,12 @@ Item {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 32
|
||||
width: 32 * scaleRatio
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/whiteDropIndicator.png"
|
||||
rotation: dropdown.expanded ? 180 : 0
|
||||
rotation: dropdown.expanded ? 180 * scaleRatio : 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,6 +115,8 @@ Item {
|
||||
id: dropArea
|
||||
anchors.fill: parent
|
||||
onClicked: dropdown.expanded = !dropdown.expanded
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,14 +133,14 @@ Item {
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
width: 3 * scaleRatio; height: 3 * scaleRatio
|
||||
color: dropdown.pressedColor
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
width: 3 * scaleRatio; height: 3 * scaleRatio
|
||||
color: dropdown.pressedColor
|
||||
}
|
||||
|
||||
@@ -205,24 +170,24 @@ Item {
|
||||
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
|
||||
height: (dropdown.dropdownHeight * 0.75) * scaleRatio
|
||||
//radius: index === repeater.count - 1 ? 4 : 0
|
||||
color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? dropdown.releasedColor : dropdown.pressedColor
|
||||
|
||||
Text {
|
||||
id: col1Text
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: col2Text.left
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: column2.length > 0 ? 12 : 0
|
||||
font.family: "Arial"
|
||||
anchors.leftMargin: 12 * scaleRatio
|
||||
anchors.rightMargin: 0
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#FFFFFF"
|
||||
font.pixelSize: fontItemSize
|
||||
color: itemArea.containsMouse || index === column.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF"
|
||||
text: qsTr(column1) + translationManager.emptyString
|
||||
}
|
||||
|
||||
@@ -230,24 +195,24 @@ Item {
|
||||
id: col2Text
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 45
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 12
|
||||
anchors.rightMargin: 45 * scaleRatio
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14 * scaleRatio
|
||||
color: "#FFFFFF"
|
||||
text: column2
|
||||
text: ""
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
width: 3 * scaleRatio; height: 3 * scaleRatio
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
width: 3 * scaleRatio; height: 3 * scaleRatio
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
@@ -255,9 +220,13 @@ Item {
|
||||
id: itemArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
onClicked: {
|
||||
dropdown.expanded = false
|
||||
column.currentIndex = index
|
||||
changed();
|
||||
dropdown.update()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
29
components/Style.qml
Normal file
@@ -0,0 +1,29 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick 2.5
|
||||
|
||||
QtObject {
|
||||
property QtObject fontMedium: FontLoader { id: _fontMedium; source: "qrc:/fonts/SFUIDisplay-Medium.otf"; }
|
||||
property QtObject fontBold: FontLoader { id: _fontBold; source: "qrc:/fonts/SFUIDisplay-Bold.otf"; }
|
||||
property QtObject fontLight: FontLoader { id: _fontLight; source: "qrc:/fonts/SFUIDisplay-Light.otf"; }
|
||||
property QtObject fontRegular: FontLoader { id: _fontRegular; source: "qrc:/fonts/SFUIDisplay-Regular.otf"; }
|
||||
|
||||
property string grey: "#404040"
|
||||
|
||||
property string defaultFontColor: "white"
|
||||
property string greyFontColor: "#808080"
|
||||
property string dimmedFontColor: "#BBBBBB"
|
||||
property string inputBoxBackground: "black"
|
||||
property string inputBoxBackgroundError: "#FFDDDD"
|
||||
property string inputBoxColor: "white"
|
||||
property string legacy_placeholderFontColor: "#BABABA"
|
||||
|
||||
property string buttonBackgroundColor: "#FA6800"
|
||||
property string buttonBackgroundColorHover: "#E65E00"
|
||||
property string buttonBackgroundColorDisabled: "#707070"
|
||||
property string buttonBackgroundColorDisabledHover: "#808080"
|
||||
property string buttonTextColor: "white"
|
||||
property string buttonTextColorDisabled: "black"
|
||||
property string dividerColor: "white"
|
||||
property real dividerOpacity: 0.25
|
||||
}
|
||||
160
components/SubaddressTable.qml
Normal file
@@ -0,0 +1,160 @@
|
||||
// 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.0
|
||||
import moneroComponents.Clipboard 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
ListView {
|
||||
id: listView
|
||||
clip: true
|
||||
boundsBehavior: ListView.StopAtBounds
|
||||
highlightMoveDuration: 0
|
||||
highlightFollowsCurrentItem: true
|
||||
anchors.topMargin: 0
|
||||
spacing: 0
|
||||
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
height: 80
|
||||
color: 'transparent';
|
||||
anchors.topMargin: 0
|
||||
width: listView.width
|
||||
clip: true
|
||||
|
||||
MoneroComponents.LineEditMulti {
|
||||
id: addressLine
|
||||
|
||||
fontSize: 14
|
||||
readOnly: true
|
||||
width: parent.width
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 10
|
||||
anchors.topMargin: 12
|
||||
anchors.rightMargin: 54
|
||||
anchors.bottomMargin: 0
|
||||
text: address
|
||||
|
||||
showingHeader: false
|
||||
showBorder: false
|
||||
addressValidation: false
|
||||
}
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
id: clipboardButton
|
||||
imageSource: "../images/copyToClipboard.png"
|
||||
|
||||
onClicked: {
|
||||
console.log(addressLine.text + " copied to clipboard");
|
||||
clipboard.setText(addressLine.text);
|
||||
appWindow.showStatusMessage(qsTr("Address copied to clipboard"),3);
|
||||
}
|
||||
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 0
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
Text {
|
||||
id: indexText
|
||||
anchors.top: addressLine.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 20
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#444444"
|
||||
text: "#" + index
|
||||
}
|
||||
|
||||
Text {
|
||||
id: labelText
|
||||
anchors.top: addressLine.bottom
|
||||
anchors.left: indexText.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 10
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: MoneroComponents.Style.greyFontColor
|
||||
text: label
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
z: 5
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: clipboardButton.width
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
listView.currentIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
z: 6
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: MoneroComponents.Style.grey
|
||||
z: 6
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
anchors.bottom: parent.bottom
|
||||
color: MoneroComponents.Style.grey
|
||||
height: 1
|
||||
z: 6
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: 3
|
||||
color: 'white'
|
||||
visible: listView.currentIndex == index
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -36,26 +36,40 @@ Rectangle {
|
||||
property int offset: 0
|
||||
|
||||
height: 31
|
||||
color: "#FFFFFF"
|
||||
color: "transparent"
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: 1
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: "#DBDBDB"
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Row {
|
||||
id: row
|
||||
anchors.horizontalCenter: header.offset !== 0 ? undefined: parent.horizontalCenter
|
||||
anchors.left: header.offset !== 0 ? parent.left : undefined
|
||||
anchors.leftMargin: header.offset
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
Rectangle {
|
||||
height: 31
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
color: "#808080"
|
||||
}
|
||||
|
||||
Repeater {
|
||||
@@ -70,6 +84,7 @@ Rectangle {
|
||||
delegate: Rectangle {
|
||||
id: delegate
|
||||
property bool desc: false
|
||||
color: "transparent"
|
||||
height: 31
|
||||
width: columnWidth
|
||||
|
||||
@@ -86,7 +101,7 @@ Rectangle {
|
||||
color: {
|
||||
if(delegateArea.pressed)
|
||||
return "#FF4304"
|
||||
return index === header.activeSortColumn || delegateArea.containsMouse ? "#FF6C3C" : "#4A4949"
|
||||
return index === header.activeSortColumn || delegateArea.containsMouse ? "white" : "#808080"
|
||||
}
|
||||
text: qsTr(columnName) + translationManager.emptyString
|
||||
}
|
||||
@@ -95,6 +110,7 @@ Rectangle {
|
||||
id: delegateArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
delegate.desc = !delegate.desc
|
||||
header.activeSortColumn = index
|
||||
@@ -170,7 +186,7 @@ Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: index === header.activeSortColumn ? "#FFFFFF" : "#DBDBDB"
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
@@ -178,7 +194,7 @@ Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
color: "#808080"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
TextEdit {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
wrapMode: Text.Wrap
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
// Workaround for https://bugreports.qt.io/browse/QTBUG-50587
|
||||
onFocusChanged: {
|
||||
if(focus === false)
|
||||
deselect()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -28,6 +28,8 @@
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
id: delegateItem
|
||||
width: 1
|
||||
@@ -49,11 +51,10 @@ Item {
|
||||
anchors.bottomMargin: 2
|
||||
font.family: "Arial"
|
||||
font.bold: true
|
||||
font.pixelSize: 12
|
||||
color: "#4A4949"
|
||||
font.pixelSize: 12 * scaleRatio
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: {
|
||||
if(currentIndex === 0) return qsTr("Normal") + translationManager.emptyString
|
||||
if(currentIndex === 3) return qsTr("Medium") + translationManager.emptyString
|
||||
if(currentIndex === 0) return qsTr("Default") + translationManager.emptyString
|
||||
if(currentIndex === 13) return qsTr("High") + translationManager.emptyString
|
||||
return ""
|
||||
}
|
||||
@@ -65,7 +66,7 @@ Item {
|
||||
anchors.topMargin: 14
|
||||
width: 1
|
||||
color: "#DBDBDB"
|
||||
height: currentIndex === 8 ? 16 : 8
|
||||
height: 8
|
||||
visible: !parent.mainTick
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -28,53 +28,84 @@
|
||||
|
||||
import QtQuick 2.2
|
||||
import QtQuick.Window 2.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
Rectangle {
|
||||
id: titleBar
|
||||
color: "#000000"
|
||||
|
||||
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
|
||||
height: customDecorations && !isMobile ? 50 : 0
|
||||
y: -height
|
||||
property string title
|
||||
property alias maximizeButtonVisible: maximizeButton.visible
|
||||
z: 1
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
font.family: "Arial"
|
||||
font.pixelSize: 15
|
||||
color: "#FFFFFF"
|
||||
text: titleBar.title
|
||||
visible: customDecorations
|
||||
Item {
|
||||
id: test
|
||||
width: parent.width
|
||||
height: 50
|
||||
z: 1
|
||||
|
||||
// use jpg for gradiency
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
source: "../images/titlebarGradient.jpg"
|
||||
}
|
||||
}
|
||||
|
||||
Item{
|
||||
id: titlebarlogo
|
||||
width: 125
|
||||
height: 50
|
||||
anchors.centerIn: parent
|
||||
visible: customDecorations
|
||||
z: 1
|
||||
|
||||
Image {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 11
|
||||
width: 125
|
||||
height: 28
|
||||
source: "../images/titlebarLogo.png"
|
||||
}
|
||||
}
|
||||
|
||||
// collapse left panel
|
||||
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
|
||||
color: "transparent"
|
||||
height: 50 * scaleRatio
|
||||
width: height
|
||||
visible: isMobile
|
||||
z: 2
|
||||
|
||||
Image {
|
||||
width: 14
|
||||
height: 14
|
||||
anchors.centerIn: parent
|
||||
rotation: !leftPanel.visible ? 180 : 0
|
||||
source: parent.customDecorations || !leftPanel.visible ? "../images/goToBasicVersionHovered.png" :
|
||||
"../images/gotoBasicVersion.png"
|
||||
source: "../images/expand.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: basicMouseArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: goToBasicVersionButton.color = "#262626";
|
||||
onExited: goToBasicVersionButton.color = "transparent";
|
||||
onClicked: {
|
||||
releaseFocus()
|
||||
parent.checked = !parent.checked
|
||||
titleBar.goToBasicVersion(leftPanel.visible)
|
||||
}
|
||||
@@ -87,22 +118,28 @@ Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
visible: parent.customDecorations
|
||||
z: 2
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
id: whatIsAreaButton
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#6B0072" : "#000000"
|
||||
width: 42
|
||||
color: containsMouse ? "#6B0072" : "#00000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/helpIcon.png"
|
||||
width: 9
|
||||
height: 16
|
||||
source: "../images/question.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: whatIsArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: whatIsAreaButton.color = "#262626";
|
||||
onExited: whatIsAreaButton.color = "transparent";
|
||||
onClicked: {
|
||||
|
||||
}
|
||||
@@ -110,20 +147,24 @@ Rectangle {
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
id: minimizeButton
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#3665B3" : "#000000"
|
||||
width: 42
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/minimizeIcon.png"
|
||||
source: "../images/minimize.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: minimizeArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: minimizeButton.color = "#262626";
|
||||
onExited: minimizeButton.color = "transparent";
|
||||
onClicked: {
|
||||
appWindow.visibility = Window.Minimized
|
||||
}
|
||||
@@ -132,22 +173,26 @@ Rectangle {
|
||||
|
||||
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"
|
||||
width: 42
|
||||
color: "transparent";
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
height: 16
|
||||
width: 16
|
||||
source: appWindow.visibility === Window.FullScreen ? "../images/backToWindowIcon.png" :
|
||||
"../images/maximizeIcon.png"
|
||||
|
||||
"../images/fullscreen.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: maximizeArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: maximizeButton.color = "#262626";
|
||||
onExited: maximizeButton.color = "transparent";
|
||||
onClicked: {
|
||||
appWindow.visibility = appWindow.visibility !== Window.FullScreen ? Window.FullScreen :
|
||||
Window.Windowed
|
||||
@@ -156,20 +201,26 @@ Rectangle {
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
property bool containsMouse: titleBar.mouseX >= x + row.x && titleBar.mouseX <= x + row.x + width && titleBar.containsMouse
|
||||
id: closeButton
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
color: containsMouse ? "#E04343" : "#000000"
|
||||
width: 42
|
||||
color: containsMouse ? "#E04343" : "#00000000"
|
||||
|
||||
Image {
|
||||
anchors.centerIn: parent
|
||||
source: "../images/closeIcon.png"
|
||||
width: 16
|
||||
height: 16
|
||||
source: "../images/close.png"
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: appWindow.close();
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: closeButton.color = "#262626";
|
||||
onExited: closeButton.color = "transparent";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1
components/qmldir
Normal file
@@ -0,0 +1 @@
|
||||
singleton Style 1.0 Style.qml
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
@@ -71,6 +71,12 @@ bool filter::eventFilter(QObject *obj, QEvent *ev) {
|
||||
m_tabPressed = false;
|
||||
|
||||
QString sks;
|
||||
#ifdef Q_OS_ANDROID
|
||||
if(ke->key() == Qt::Key_Back) {
|
||||
qDebug() << "Android back hit";
|
||||
sks = "android_back";
|
||||
}
|
||||
#endif
|
||||
if(ke->key() == Qt::Key_Control) {
|
||||
sks = "Ctrl";
|
||||
#ifdef Q_OS_MAC
|
||||
|
||||
2
filter.h
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2014-2015, The Monero Project
|
||||
// Copyright (c) 2014-2018, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
|
||||
BIN
fonts/SFUIDisplay-Bold.otf
Normal file
BIN
fonts/SFUIDisplay-Light.otf
Normal file
BIN
fonts/SFUIDisplay-Medium.otf
Normal file
BIN
fonts/SFUIDisplay-Regular.otf
Normal file
@@ -17,13 +17,16 @@ if [ ! -d $MONERO_DIR/src ]; then
|
||||
fi
|
||||
git submodule update --remote
|
||||
git -C $MONERO_DIR fetch
|
||||
git -C $MONERO_DIR checkout release-v0.11.0.0
|
||||
git -C $MONERO_DIR checkout v0.12.0.0
|
||||
|
||||
# get monero core tag
|
||||
get_tag
|
||||
# create local monero branch
|
||||
git -C $MONERO_DIR checkout -B $VERSIONTAG
|
||||
|
||||
git -C $MONERO_DIR submodule init
|
||||
git -C $MONERO_DIR submodule update
|
||||
|
||||
# Merge monero PR dependencies
|
||||
|
||||
# Workaround for git username requirements
|
||||
@@ -108,6 +111,7 @@ elif [ "$BUILD_TYPE" == "debug-android" ]; then
|
||||
elif [ "$BUILD_TYPE" == "debug" ]; then
|
||||
echo "Building libwallet debug"
|
||||
CMAKE_BUILD_TYPE=Debug
|
||||
STATIC=true
|
||||
else
|
||||
echo "Valid build types are release, release-static, release-android, debug-android and debug"
|
||||
exit 1;
|
||||
@@ -115,14 +119,14 @@ fi
|
||||
|
||||
|
||||
echo "cleaning up existing monero build dir, libs and includes"
|
||||
#rm -fr $MONERO_DIR/build
|
||||
rm -fr $MONERO_DIR/build
|
||||
rm -fr $MONERO_DIR/lib
|
||||
rm -fr $MONERO_DIR/include
|
||||
rm -fr $MONERO_DIR/bin
|
||||
|
||||
|
||||
mkdir -p $MONERO_DIR/build/release
|
||||
pushd $MONERO_DIR/build/release
|
||||
mkdir -p $MONERO_DIR/build/$BUILD_TYPE
|
||||
pushd $MONERO_DIR/build/$BUILD_TYPE
|
||||
|
||||
# reusing function from "utils.sh"
|
||||
platform=$(get_platform)
|
||||
@@ -208,7 +212,7 @@ if test -z "$CPU_CORE_COUNT"; then
|
||||
fi
|
||||
|
||||
# Build libwallet_merged
|
||||
pushd $MONERO_DIR/build/release/src/wallet
|
||||
pushd $MONERO_DIR/build/$BUILD_TYPE/src/wallet
|
||||
eval $make_exec version -C ../..
|
||||
eval $make_exec -j$CPU_CORE_COUNT
|
||||
eval $make_exec install -j$CPU_CORE_COUNT
|
||||
@@ -217,21 +221,24 @@ popd
|
||||
# Build monerod
|
||||
# win32 need to build daemon manually with msys2 toolchain
|
||||
if [ "$platform" != "mingw32" ] && [ "$ANDROID" != true ]; then
|
||||
pushd $MONERO_DIR/build/release/src/daemon
|
||||
pushd $MONERO_DIR/build/$BUILD_TYPE/src/daemon
|
||||
eval make -j$CPU_CORE_COUNT
|
||||
eval make install -j$CPU_CORE_COUNT
|
||||
popd
|
||||
fi
|
||||
|
||||
# build install epee
|
||||
eval make -C $MONERO_DIR/build/release/contrib/epee all install
|
||||
eval make -C $MONERO_DIR/build/$BUILD_TYPE/contrib/epee all install
|
||||
|
||||
# install easylogging
|
||||
eval make -C $MONERO_DIR/build/release/external/easylogging++ all install
|
||||
eval make -C $MONERO_DIR/build/$BUILD_TYPE/external/easylogging++ all install
|
||||
|
||||
# Install libunwind
|
||||
# install lmdb
|
||||
eval make -C $MONERO_DIR/build/$BUILD_TYPE/external/db_drivers/liblmdb all install
|
||||
|
||||
# Install libunbound
|
||||
echo "Installing libunbound..."
|
||||
pushd $MONERO_DIR/build/release/external/unbound
|
||||
pushd $MONERO_DIR/build/$BUILD_TYPE/external/unbound
|
||||
# no need to make, it was already built as dependency for libwallet
|
||||
# make -j$CPU_CORE_COUNT
|
||||
$make_exec install -j$CPU_CORE_COUNT
|
||||
|
||||
BIN
images/arrow-right-medium-white.png
Normal file
|
After Width: | Height: | Size: 191 B |
BIN
images/card-background.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
images/checkedBlackIcon.png
Executable file
|
After Width: | Height: | Size: 15 KiB |
BIN
images/checkedIcon-black.png
Executable file
|
After Width: | Height: | Size: 18 KiB |
BIN
images/close.png
Normal file
|
After Width: | Height: | Size: 280 B |
BIN
images/downArrow.png
Normal file
|
After Width: | Height: | Size: 284 B |
BIN
images/expand.png
Normal file
|
After Width: | Height: | Size: 238 B |
BIN
images/fullscreen.png
Normal file
|
After Width: | Height: | Size: 185 B |
BIN
images/historyBorderRadius.png
Executable file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/leftPanelBg.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
images/lightning-white.png
Normal file
|
After Width: | Height: | Size: 362 B |
BIN
images/lightning.png
Normal file
|
After Width: | Height: | Size: 552 B |
BIN
images/menu.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
images/menuArrow.png
Executable file
|
After Width: | Height: | Size: 16 KiB |
BIN
images/menuButtonGradient.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/middlePanelBg.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
images/minimize.png
Normal file
|
After Width: | Height: | Size: 125 B |
BIN
images/moneroIcon-28x28.png
Normal file
|
After Width: | Height: | Size: 792 B |
BIN
images/moneroIcon-trans28x28.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
images/moneroIcon-trans56x56.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
images/moneroIcon-trans84x84.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
images/moneroLogo_white.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
images/question.png
Normal file
|
After Width: | Height: | Size: 334 B |
BIN
images/right.png
Normal file
|
After Width: | Height: | Size: 122 B |
BIN
images/rightArrow.png
Normal file
|
After Width: | Height: | Size: 437 B |
BIN
images/titlebarGradient.jpg
Normal file
|
After Width: | Height: | Size: 760 B |
BIN
images/titlebarLogo.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
images/upArrow-green.png
Normal file
|
After Width: | Height: | Size: 350 B |
BIN
images/warning.png
Executable file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, The Monero Project
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
; Monero GUI Wallet Beta 2 Installer for Windows
|
||||
; Copyright (c) 2014-2017, The Monero Project
|
||||
; Monero Lithium Luna GUI Wallet Installer for Windows
|
||||
; Copyright (c) 2014-2018, The Monero Project
|
||||
; See LICENSE
|
||||
|
||||
[Setup]
|
||||
AppName=Monero GUI Wallet
|
||||
AppVersion=0.10.3.1
|
||||
; For InnoSetup this is the property that uniquely identifies the application as such
|
||||
; Thus it's important to keep this stable over releases
|
||||
; With a different "AppName" InnoSetup would treat a mere update as a completely new application and thus mess up
|
||||
|
||||
AppVersion=0.12.0.0
|
||||
DefaultDirName={pf}\Monero GUI Wallet
|
||||
DefaultGroupName=Monero GUI Wallet
|
||||
UninstallDisplayIcon={app}\monero-wallet-gui.exe
|
||||
@@ -29,170 +33,190 @@ Name: "en"; MessagesFile: "compiler:Default.isl"
|
||||
|
||||
|
||||
[Files]
|
||||
Source: "ReadMe.htm"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
; The use of the flag "ignoreversion" for the following entries leads to the following behaviour:
|
||||
; When updating / upgrading an existing installation ALL existing files are replaced with the files in this
|
||||
; installer, regardless of file dates, version info within the files, or type of file (textual file or
|
||||
; .exe/.dll file possibly with version info).
|
||||
;
|
||||
; This is far more robust than relying on version info or on file dates (flag "comparetimestamp").
|
||||
; As of version 0.12.0.0, the Monero .exe files do not carry version info anyway in their .exe headers.
|
||||
; The only small drawback seems to be somewhat longer update times because each and every file is
|
||||
; copied again, even if already present with correct file date and identical content.
|
||||
;
|
||||
; Note that it would be very dangerous to use "ignoreversion" on files that may be shared with other
|
||||
; applications somehow. Luckily this is no issue here because ALL files are "private" to Monero.
|
||||
|
||||
Source: "ReadMe.htm"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "FinishImage.bmp"; Flags: dontcopy
|
||||
|
||||
; Monero GUI wallet
|
||||
Source: "bin\monero-wallet-gui.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-wallet-gui.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Monero GUI wallet log file
|
||||
; Beta 2 does not have the "--log-file" command-line option of the CLI wallet and insists to put the .log beside the .exe
|
||||
; The GUI wallet does not have the "--log-file" command-line option of the CLI wallet and insists to put the .log beside the .exe
|
||||
; so pre-create the file and give the necessary permissions to the wallet to write into it
|
||||
Source: "monero-wallet-gui.log"; DestDir: "{app}"; Flags: comparetimestamp; Permissions: users-modify
|
||||
; Flag is "onlyifdoesntexist": We do not want to overwrite an already existing log
|
||||
Source: "monero-wallet-gui.log"; DestDir: "{app}"; Flags: onlyifdoesntexist; Permissions: users-modify
|
||||
|
||||
; Monero CLI wallet
|
||||
Source: "bin\monero-wallet-cli.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-wallet-cli.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Monero wallet RPC interface implementation
|
||||
Source: "bin\monero-wallet-rpc.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-wallet-rpc.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Monero daemon
|
||||
Source: "bin\monerod.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monerod.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Monero daemon wrapped in a batch file that stops before the text window closes, to see any error messages
|
||||
Source: "monero-daemon.bat"; DestDir: "{app}"; Flags: comparetimestamp;
|
||||
Source: "monero-daemon.bat"; DestDir: "{app}"; Flags: ignoreversion;
|
||||
|
||||
; Monero blockchain utilities
|
||||
Source: "bin\monero-blockchain-export.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-blockchain-import.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-utils-deserialize.exe"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\monero-blockchain-export.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\monero-blockchain-import.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; was present in 0.10.3.1, not present anymore in 0.11.1.0 and after
|
||||
; Source: "bin\monero-utils-deserialize.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Various .qm files for translating the wallet UI "on the fly" into all supported languages
|
||||
Source: "bin\translations\*"; DestDir: "{app}\translations"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\translations\*"; DestDir: "{app}\translations"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Core Qt runtime
|
||||
Source: "bin\Qt5Core.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Gui.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Multimedia.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5MultimediaQuick_p.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Network.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Qml.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Quick.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Svg.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5Widgets.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\Qt5XmlPatterns.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
; Use wildcards to deal with differences in those files between Qt version, like
|
||||
; "Qt5MultimediaQuick_p.dll" versus "Qt5MultimediaQuick.dll" and "Qt5RemoteObjects.dll" as new file
|
||||
Source: "bin\Qt5*.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Qt QML elements like the local files selector "FolderListModel" and "Settings"
|
||||
Source: "bin\Qt\*"; DestDir: "{app}\Qt"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\Qt\*"; DestDir: "{app}\Qt"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt audio support
|
||||
Source: "bin\audio\*"; DestDir: "{app}\audio"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\audio\*"; DestDir: "{app}\audio"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt bearer / network connection management
|
||||
Source: "bin\bearer\*"; DestDir: "{app}\bearer"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\bearer\*"; DestDir: "{app}\bearer"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt Windows platform plugin
|
||||
Source: "bin\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: comparetimestamp
|
||||
; Qt Windows platform plugins
|
||||
Source: "bin\platforms\*"; DestDir: "{app}\platforms"; Flags: recursesubdirs ignoreversion
|
||||
Source: "bin\platforminputcontexts\*"; DestDir: "{app}\platforminputcontexts"; Flags: recursesubdirs ignoreversion
|
||||
Source: "bin\styles\*"; DestDir: "{app}\styles"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt support for SVG icons
|
||||
Source: "bin\iconengines\*"; DestDir: "{app}\iconengines"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\iconengines\*"; DestDir: "{app}\iconengines"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt support for various image formats (JPEG, BMP, SVG etc)
|
||||
Source: "bin\imageformats\*"; DestDir: "{app}\imageformats"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\imageformats\*"; DestDir: "{app}\imageformats"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt multimedia support
|
||||
Source: "bin\QtMultimedia\*"; DestDir: "{app}\QtMultimedia"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\mediaservice\*"; DestDir: "{app}\mediaservice"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtMultimedia\*"; DestDir: "{app}\QtMultimedia"; Flags: recursesubdirs ignoreversion
|
||||
Source: "bin\mediaservice\*"; DestDir: "{app}\mediaservice"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt support for "m3u" playlists
|
||||
; candidate for elimination? Don't think the GUI wallet needs such playlists
|
||||
Source: "bin\playlistformats\*"; DestDir: "{app}\playlistformats"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\playlistformats\*"; DestDir: "{app}\playlistformats"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt graphical effects as part of the core runtime, effects like blurring and blending
|
||||
Source: "bin\QtGraphicalEffects\*"; DestDir: "{app}\QtGraphicalEffects"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtGraphicalEffects\*"; DestDir: "{app}\QtGraphicalEffects"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Some more Qt graphical effects
|
||||
; "private" as a name for this directory looks a little strange. Historical reasons?
|
||||
Source: "bin\private\*"; DestDir: "{app}\private"; Flags: recursesubdirs comparetimestamp
|
||||
; No more Qt "private" directory in 0.12.0.0
|
||||
|
||||
; Qt QML files
|
||||
Source: "bin\QtQml\*"; DestDir: "{app}\QtQml"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtQml\*"; DestDir: "{app}\QtQml"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt Quick files
|
||||
Source: "bin\QtQuick\*"; DestDir: "{app}\QtQuick"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtQuick.2\*"; DestDir: "{app}\QtQuick.2"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\QtQuick\*"; DestDir: "{app}\QtQuick"; Flags: recursesubdirs ignoreversion
|
||||
Source: "bin\QtQuick.2\*"; DestDir: "{app}\QtQuick.2"; Flags: recursesubdirs ignoreversion
|
||||
|
||||
; Qt Quick 2D Renderer fallback for systems / environments with "low-level graphics" i.e. without 3D support
|
||||
Source: "bin\scenegraph\*"; DestDir: "{app}\scenegraph"; Flags: recursesubdirs comparetimestamp
|
||||
Source: "bin\start-low-graphics-mode.bat"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\scenegraph\*"; DestDir: "{app}\scenegraph"; Flags: recursesubdirs ignoreversion
|
||||
Source: "bin\start-low-graphics-mode.bat"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Mesa, open-source OpenGL implementation; part of "low-level graphics" support
|
||||
Source: "bin\opengl32sw.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\opengl32sw.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Left out subdirectory "qmltooling" with the Qt QML debugger: Probably not relevant in an end-user package
|
||||
|
||||
; Microsoft Direct3D runtime
|
||||
Source: "bin\D3Dcompiler_47.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\D3Dcompiler_47.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; bzip2 support
|
||||
Source: "bin\libbz2-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libbz2-1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; ANGLE ("Almost Native Graphics Layer Engine") support, as used by Qt
|
||||
Source: "bin\libEGL.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libGLESV2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libEGL.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libGLESV2.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; FreeType font engine, as used by Qt
|
||||
Source: "bin\libfreetype-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libfreetype-6.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; GCC runtime, x64 version
|
||||
Source: "bin\libgcc_s_seh-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libgcc_s_seh-1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; GLib, low level core library e.g. for GNOME and GTK+
|
||||
; Really needed under Windows?
|
||||
Source: "bin\libglib-2.0-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libglib-2.0-0.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Graphite font support
|
||||
; Really needed?
|
||||
Source: "bin\libgraphite2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libgraphite2.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; HarfBuzz OpenType text shaping engine
|
||||
; Really needed?
|
||||
Source: "bin\libharfbuzz-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libharfbuzz-0.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; LibIconv, conversions between character encodings
|
||||
Source: "bin\libiconv-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libiconv-2.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Part of cygwin? Needed by Qt somehow?
|
||||
Source: "bin\libicudt57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libicuin57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libicuuc57.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
; ICU, International Components for Unicode
|
||||
; After changes for supporting UTF-8 path and file names by using Boost Locale, all those 5
|
||||
; ICU libraries are needed in 0.12.0.0
|
||||
Source: "bin\libicudt58.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libicuin58.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libicuio58.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libicutu58.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libicuuc58.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Library for native language support, part of GNU gettext
|
||||
Source: "bin\libintl-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libintl-8.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; JasPer, support for JPEG-2000
|
||||
Source: "bin\libjasper-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
; was present in 0.10.3.1, not present anymore in 0.11.1.0 and after
|
||||
; Source: "bin\libjasper-1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; libjpeg, C library for reading and writing JPEG image files
|
||||
Source: "bin\libjpeg-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libjpeg-8.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Little CMS, color management system
|
||||
Source: "bin\liblcms2-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\liblcms2-2.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; XZ Utils, LZMA compression library
|
||||
Source: "bin\liblzma-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\liblzma-5.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; MNG / Portable Network Graphics ("animated PNG")
|
||||
Source: "bin\libmng-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libmng-2.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; PCRE, Perl Compatible Regular Expressions
|
||||
Source: "bin\libpcre-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libpcre16-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
; "libpcre2-16-0.dll" is new for 0.12.0.0; unclear whether "libpcre16-0.dll" is still needed
|
||||
Source: "bin\libpcre-1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libpcre16-0.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "bin\libpcre2-16-0.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; libpng, the official PNG reference library
|
||||
Source: "bin\libpng16-16.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libpng16-16.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; libstdc++, GNU Standard C++ Library
|
||||
Source: "bin\libstdc++-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libstdc++-6.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; LibTIFF, TIFF Library and Utilities
|
||||
Source: "bin\libtiff-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libtiff-5.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; C++ threading support
|
||||
Source: "bin\libwinpthread-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\libwinpthread-1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; zlib compression library
|
||||
Source: "bin\zlib1.dll"; DestDir: "{app}"; Flags: comparetimestamp
|
||||
Source: "bin\zlib1.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Stack protection
|
||||
; New for 0.12.0.0
|
||||
Source: "bin\libssp-0.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
|
||||
[Tasks]
|
||||
@@ -228,7 +252,7 @@ begin
|
||||
// Additional wizard page for entering a special blockchain location
|
||||
blockChainDefaultDir := ExpandConstant('{commonappdata}\bitmonero');
|
||||
s := 'The default folder to store the Monero blockchain is ' + blockChainDefaultDir;
|
||||
s := s + '. As this will need up to 20 GB of free space, you may want to use a folder on a different drive.';
|
||||
s := s + '. As this will need more than 50 GB of free space, you may want to use a folder on a different drive.';
|
||||
s := s + ' If yes, specify that folder here.';
|
||||
|
||||
BlockChainDirPage := CreateInputDirPage(wpSelectDir,
|
||||
@@ -334,7 +358,10 @@ Name: "{group}\Uninstall GUI Wallet"; Filename: "{uninstallexe}"
|
||||
; and insists on displaying ALL icons on one single level
|
||||
Name: "{group}\Utilities\Monero Daemon"; Filename: "{app}\monerod.exe"; Parameters: {code:DaemonFlags}
|
||||
Name: "{group}\Utilities\Read Me"; Filename: "{app}\ReadMe.htm"
|
||||
Name: "{group}\Utilities\Textual (CLI) Wallet"; Filename: "{app}\monero-wallet-cli.exe"
|
||||
|
||||
; CLI wallet: Needs a working directory ("Start in:") set in the icon, because with no such directory set
|
||||
; it tries to create new wallets without a path given in the probably non-writable program folder and will abort with an error
|
||||
Name: "{group}\Utilities\Textual (CLI) Wallet"; Filename: "{app}\monero-wallet-cli.exe"; WorkingDir: "{userdocs}\Monero\wallets"
|
||||
|
||||
; Icons for troubleshooting problems / testing / debugging
|
||||
; To show that they are in some way different (not for everyday use), make them visually different
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
# Monero GUI Wallet Beta 2 Windows Installer #
|
||||
# Monero GUI Wallet Windows Installer #
|
||||
|
||||
Copyright (c) 2014-2017, The Monero Project
|
||||
Copyright (c) 2014-2018, The Monero Project
|
||||
|
||||
## Introduction ##
|
||||
|
||||
This is a *Inno Setup* script `Monero.iss` plus some related files that
|
||||
allows you to build a standalone Windows installer (.exe) for the
|
||||
Monero GUI Wallet Beta 2.
|
||||
This is a *Inno Setup* script `Monero.iss` plus some related files
|
||||
that allows you to build a standalone Windows installer (.exe) for
|
||||
the GUI wallet that comes with the Lithium Luna release of Monero.
|
||||
|
||||
This turns the GUI Wallet into a more or less standard Windows program,
|
||||
This turns the GUI wallet into a more or less standard Windows program,
|
||||
by default installed into a subdirectory of `C:\Program Files`, a
|
||||
program group with some icons in the *Start* menu, and automatic
|
||||
uninstall support. It helps lower the "barrier to entry" somewhat,
|
||||
especially for less technically experienced users of Monero.
|
||||
uninstall support. It helps lowering the "barrier to entry"
|
||||
somewhat, especially for less technically experienced users of
|
||||
Monero.
|
||||
|
||||
As the setup script in file [Monero.iss](Monero.iss) has to list every
|
||||
single file of the GUI Wallet package to install by name, this version
|
||||
of the script only works with exactly the GUI Beta 2 that you find on
|
||||
single file of the GUI wallet package to install by name,
|
||||
this version of the script only works with exactly the GUI wallet
|
||||
for Monero release *Lithium Luna* that you find on
|
||||
[the official download page](https://getmonero.org/downloads/).
|
||||
|
||||
But of course it will be easy to modify the script for future versions
|
||||
of the GUI Wallet.
|
||||
But of course it will be easy to modify the script for future
|
||||
versions of the GUI wallet.
|
||||
|
||||
## License ##
|
||||
|
||||
@@ -28,14 +30,15 @@ See [LICENSE](LICENSE).
|
||||
|
||||
## Building ##
|
||||
|
||||
You can only build on Windows, and the result is always a Windows .exe
|
||||
file that can act as a standalone installer for the GUI Wallet Beta 2.
|
||||
You can only build on Windows, and the result is always a
|
||||
Windows .exe file that can act as a standalone installer for the
|
||||
Lithium Luna GUI wallet.
|
||||
|
||||
The build steps in detail:
|
||||
|
||||
1. Install *Inno Setup*. You can get it from [here](http://www.jrsoftware.org/isdl.php)
|
||||
2. Get the Inno Setup script plus related files by cloning the whole [monero-core](https://github.com/monero-project/monero-core) repository; you will only need the files in the installer directory `installers\windows` however
|
||||
3. The setup script is written to take the GUI Wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI Wallet Beta 2 from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the `monero-gui-0.10.3.1-beta2` directory to this `bin` subdirectory
|
||||
4. Start Inno Setup, load `Monero.iss` and compile it.
|
||||
2. Get the Inno Setup script plus related files by cloning the whole [monero-core GitHub repository](https://github.com/monero-project/monero-core); you will only need the files in the installer directory `installers\windows` however
|
||||
3. The setup script is written to take the GUI wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI wallet from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the `monero-gui-0.12.0.0` directory to this `bin` subdirectory
|
||||
4. Start Inno Setup, load `Monero.iss` and compile it
|
||||
5. The result i.e. the finished installer will be the file `mysetup.exe` in the `installers\windows\Output` subdirectory
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Monero GUI Wallet Beta 2</title>
|
||||
<title>Monero Lithium Luna GUI Wallet</title>
|
||||
</head>
|
||||
|
||||
<body style="font-family: Arial, Helvetica, sans-serif">
|
||||
<h1>Monero GUI Wallet Beta 2</h1>
|
||||
<h1>Monero Lithium Luna GUI Wallet</h1>
|
||||
|
||||
<p>Copyright (c) 2014-2017, The Monero Project<br>
|
||||
Date: June 28, 2017</p>
|
||||
<p>Copyright (c) 2014-2018, The Monero Project<br>
|
||||
Date: March 18, 2018</p>
|
||||
|
||||
<h2>Preface</h2>
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
|
||||
<h2>Content of the Package</h2>
|
||||
|
||||
<p>You just installed the Beta 2 of the <i>Monero GUI Wallet</i> for Windows, more exact version 0.10.3.1. The wallet
|
||||
enables you to send and receive moneroj in a secure and very private way.
|
||||
<p>You just installed the <i>Monero GUI wallet</i> for Windows, release Lithium Luna, more exact version 0.12.0.0.
|
||||
The wallet enables you to send and receive Moneroj in a secure and very private way.
|
||||
</p>
|
||||
|
||||
<p>Also included is the <i>Monero daemon</i>, so you have everything now to run a so-called <i>full node</i>
|
||||
@@ -33,7 +33,22 @@
|
||||
|
||||
<p>For checking whether there are already newer versions of this package you can go to the
|
||||
<a href="https://getmonero.org/downloads/">Downloads</a> page on <a href="https://getmonero.org/home">getmonero.org</a>,
|
||||
the official Monero site.</p>
|
||||
the official Monero site.</p>
|
||||
|
||||
<h2>Upgrading</h2>
|
||||
|
||||
<p>If you have already a release of the GUI wallet software on your computer that was installed with the help
|
||||
of this installer (in an earlier version), upgrading is easy: Just run the new installer; there is no need to
|
||||
uninstall the old Monero release first.</p>
|
||||
|
||||
<p>But if you run a release of the GUI wallet software that you downloaded as a .zip file and unzipped into a
|
||||
folder, if you "installed it manually" so to say, don't try to upgrade by pointing the installer to that folder,
|
||||
because this might lead to problems e.g. if you try to uninstall everything later.</p>
|
||||
|
||||
<p>It's better to let the installer put the software into another folder and then delete the old folder, either
|
||||
outright or after moving away any additional files that you may have stored there. (If you did not change
|
||||
default locations for wallets and the blockchain, you don't have to worry about them, they won't be in that
|
||||
particular folder, but elsewhere "in safety".)</p>
|
||||
|
||||
<h2>Access to the Blockchain</h2>
|
||||
|
||||
@@ -46,9 +61,9 @@
|
||||
provides the most security and privacy possible for you.</p>
|
||||
|
||||
<p>However if your Internet access makes it difficult to run a full node, or if you have simply no room to store
|
||||
the blockchain locally (over 17 GB in summer 2017, and of course growing), you can compromise and try to connect
|
||||
the blockchain locally (around 50 GB in spring 2018, and of course growing), you can compromise and try to connect
|
||||
to a remote node. One way of finding such a node is checking
|
||||
<a href="https://moneroworld.com/pages/nodes.html">this page</a>.
|
||||
<a href="https://moneroworld.com/#nodes">this page</a>.
|
||||
</p>
|
||||
|
||||
<h2>Initial Blockchain Download</h2>
|
||||
@@ -90,21 +105,13 @@
|
||||
|
||||
<h2>Troubleshooting</h2>
|
||||
|
||||
<p>The Monero software and especially the GUI wallet are "work in progress", as you can expect seeing the word
|
||||
<i>Beta</i> in the name of the package, and sometimes things go wrong.</p>
|
||||
<p>The Monero software and especially the GUI wallet are "work in progress", and sometimes things go wrong.</p>
|
||||
|
||||
<p>Please note that despite any technical problems that you may encounter your moneroj are almost always safe: You may
|
||||
not be able to move them or you even may not see how many you currently have, but you most probably won't loose any.
|
||||
But do remember that the seed needed to re-create the wallet <b>is</b> critical, however: <b>Never loose your
|
||||
seed!</b></p>
|
||||
|
||||
<p>There is a <b>bug</b> in this beta of the GUI wallet that triggers if it is installed in a path that contains spaces /
|
||||
blank characters, like the default location for Windows programs <i>C:\Program Files</i> unfortunately does.
|
||||
Symptoms are problems in the communication between the wallet and the daemon, e.g. the wallet not "seeing" the
|
||||
daemon and then not knowing whether it is "synchronized" with the network and thus ready to work or not. You can
|
||||
avoid these problems by starting the daemon yourself, with the help of the <i>Monero Daemon</i> icon in the
|
||||
<i>Utilities</i> sub-folder of the Monero program group.</p>
|
||||
|
||||
<p>In the <i>Utilities</i> sub-folder there are several more icons that may help you to solve problems.
|
||||
These are the icons with a <i>x</i> in front and the name <i>(in parenthesis)</i> to make them visually stand
|
||||
apart from the "normal" ones because you will probably only need them in case of trouble, but not during normal
|
||||
@@ -142,15 +149,15 @@
|
||||
<tr>
|
||||
<td><i>x (Check GUI Wallet Log)</i></td>
|
||||
<td>Open the log with status and error messages of the GUI wallet program in Notepad;
|
||||
experienced people have a chance to diagnose technical problems with the wallet by looking at the last few lines
|
||||
of this log</td>
|
||||
experienced people have a chance to diagnose technical problems with the wallet,
|
||||
usually by looking at the last few lines of this log</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><i>x (Check Daemon Log)</i></td>
|
||||
<td>
|
||||
Open the log with status and error messages of the daemon in Notepad; again, the last few
|
||||
lines of this (possible very long) log are the most important for troubleshooting
|
||||
lines of this (possible very long) log are usually the most important for troubleshooting
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||