Compare commits

...

312 Commits

Author SHA1 Message Date
luigi1111
a959919b8a Merge pull request #3813
6f88ad0 Fixed English mistake in Mining.qml (Igor Voytov)
2022-01-02 14:50:40 -05:00
Igor Voytov
6f88ad0a13 Fixed English mistake in Mining.qml 2022-01-02 19:23:12 +03:00
luigi1111
cb169f11d4 Merge pull request #3811
9199f95 update translations (netrik182)
2022-01-01 12:55:09 -05:00
luigi1111
98b81fa1ee Merge pull request #3810
f2b4e1e README: add more missing macOS dependencies (selsta)
2022-01-01 12:54:49 -05:00
luigi1111
a6fadd2140 Merge pull request #3804
a4cc91c DEPLOY: use correct ARCH (selsta)
2022-01-01 12:54:25 -05:00
luigi1111
09bf4a1e71 Merge pull request #3803
db4123c build: prepare v0.17.3.1 (selsta)
2022-01-01 12:53:55 -05:00
luigi1111
f44fcb4459 Merge pull request #3802
98f8f19 SettingsWallet: improve and translate trusted remote node error message (rating89us)
2022-01-01 12:53:32 -05:00
luigi1111
c5d598f401 Merge pull request #3800
f8a3a26 RemoteNodeList: fix trusted daemon icon margin (selsta)
2022-01-01 12:52:55 -05:00
luigi1111
9476a9880c Merge pull request #3798
d160828 SettingsWallet, SettingsListItem: disable 'Rescan wallet balance' buton if wallet is not synced (rating89us)
2022-01-01 12:51:03 -05:00
luigi1111
487f2ceecb Merge pull request #3797
e85b51e RemoteNodeList: reconnect after editing remote node (rating89us)
2022-01-01 12:50:17 -05:00
luigi1111
d0950499da Merge pull request #3795
2566f44 wizard: clear password field after wallet creation (selsta)
2022-01-01 12:49:38 -05:00
luigi1111
56df20ba27 Merge pull request #3788
008a38a main: verify if currentWallet is loaded before calling it (rating89us)
2022-01-01 12:48:17 -05:00
luigi1111
41b827b65d Merge pull request #3783
70e3c2d Settings, Advanced: mirror stack transition when clicking on a button on the left (rating89us)
2022-01-01 12:47:25 -05:00
luigi1111
0b6ceab25b Merge pull request #3769
3e159e0 WizardCreateDevice1: Use 'Restore wallet' instead of 'Create wallet' on Next button when restoring (rating89us)
2022-01-01 12:46:27 -05:00
selsta
2566f445b2 wizard: clear password field after wallet creation 2021-12-26 02:15:07 +01:00
netrik182
9199f95af5 update translations
Afrikaans

Currently translated at 100.0% (724 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/af/
Author: netrik182 <netrik@tuta.io>

Romanian

Currently translated at 99.4% (720 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ro/
Author: netrik182 <netrik@tuta.io>

Dutch

Currently translated at 83.7% (642 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/nl/
Author: netrik182 <netrik@tuta.io>

Japanese

Currently translated at 97.5% (706 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/ja/
Author: netrik182 <netrik@tuta.io>

Hungarian

Currently translated at 94.3% (683 of 724 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/hu/
Author: netrik182 <netrik@tuta.io>

Hebrew

Currently translated at 42.5% (326 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/he/
Author: netrik182 <netrik@tuta.io>

Co-authored-by: netrik182 <netrik@tuta.io>

Dutch

Currently translated at 83.7% (642 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/nl/
Author: Snowden <edwardissexy.uninteresting@aleeas.com>

Co-authored-by: Snowden <edwardissexy.uninteresting@aleeas.com>

Polish

Currently translated at 90.0% (691 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/pl/
Author: Paul Janowitz <janowitz@gmail.com>

Co-authored-by: Paul Janowitz <janowitz@gmail.com>

Chinese (Simplified)

Currently translated at 77.7% (596 of 767 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/zh_Hans/
Author: Lekton Zhang <takato3000@gmail.com>

Co-authored-by: Lekton Zhang <takato3000@gmail.com>

German

Currently translated at 90.2% (693 of 768 strings)
Translate-URL: https://translate.getmonero.org/projects/monero/gui-wallet/de/
Author: Wobole <wobole@throwaway.io>

Co-authored-by: Wobole <wobole@throwaway.io>
2021-12-22 09:08:40 +01:00
selsta
f2b4e1ea3e README: add more missing macOS dependencies 2021-12-18 21:35:03 +01:00
selsta
a4cc91cca2 DEPLOY: use correct ARCH 2021-12-15 10:03:28 +01:00
selsta
db4123ccb5 build: prepare v0.17.3.1 2021-12-14 07:02:43 +01:00
rating89us
98f8f194cd SettingsWallet: improve and translate trusted remote node error message 2021-12-13 15:30:24 +01:00
selsta
f8a3a26e0d RemoteNodeList: fix trusted daemon icon margin 2021-12-13 04:44:44 +01:00
rating89us
d160828cda SettingsWallet, SettingsListItem: disable "Rescan wallet balance" buton if wallet is not synced 2021-12-12 18:26:44 +01:00
rating89us
e85b51e1c2 RemoteNodeList: reconnect after editing remote node 2021-12-12 16:32:45 +01:00
rating89us
008a38aae2 main: verify if currentWallet is loaded before calling it 2021-12-10 11:03:37 +01:00
rating89us
70e3c2d3ad Settings, Advanced: mirror stack transition when clicking on a button on the left 2021-12-08 13:00:10 +01:00
luigi1111
bddb9b0050 Merge pull request #3773
78f7b05 Translations from Weblate (Weblate)
2021-12-02 15:13:21 -06:00
Anonymous
78f7b05ecb Translations from Weblate
* Ukrainian
  * TheFuzzStone (1)
  * reketen (1)
  * castorp (1)
  * Alex Osinniy (3)
* Spanish
  * nemecis rojas (1)
  * Samuel (1)
  * Josep Mengual (2)
  * jaime diaz (6)
* Esperanto
  * Dynse Clyde Sacote (11)
* Romanian
  * devuana (8)
  * mihaipe (40)
* Russian
  * v1docq47 (76)
* Portuguese (Brazil)
  * L. P. Pereira (1)
  * netrik182 (35)
  * Gilberto F da Silva (47)
* Hungarian
  * Zsolt András Kovács (1)
  * Pozsonyi Péter (3)
  * Közepes Gábor (5)
  * anonym szeretnék maradni (35)
* German
  * Nicolas (1)
  * Martin (1)
  * MortiZ (1)
  * GreenPiece (3)
  * Crusty (8)
  * Paul Janowitz (10)
2021-12-02 20:57:23 +01:00
luigi1111
999bc21d6b Merge pull request #3767
d922c91 main: hide TitleBar when MerchantTitleBar is visible (rating89us)
2021-12-02 00:16:15 -06:00
luigi1111
901b4b0f77 Merge pull request #3765
fa35410 build: prepare v0.17.3.0 (selsta)
2021-12-02 00:12:36 -06:00
luigi1111
69dc0b3570 Merge pull request #3761
6e24930 WizardOpenWallet1: new wallet icons; hide 'Mainnet' label in simple mode (rating89us)
2021-12-02 00:08:19 -06:00
luigi1111
0bebf412fd Merge pull request #3760
b8b96ee PasswordDialog: display wizard title bar when returning to wizard after canceling password dialog (rating89us)
2021-12-02 00:07:03 -06:00
luigi1111
ce1c5aebf7 Merge pull request #3759
22450cb main: hide wallet name in wizard titlebar (rating89us)
2021-12-02 00:05:42 -06:00
luigi1111
7eef4f3364 Merge pull request #3758
a4b907a WizardCreateDevice1: hide advanced options in simple mode (rating89us)
2021-12-02 00:05:20 -06:00
luigi1111
ecadd44a16 Merge pull request #3756
31ae9b3 WizardCreateDevice1: reset fields when opening page (rating89us)
2021-12-02 00:04:49 -06:00
luigi1111
4bd7d43588 Merge pull request #3753
8a8a384 add _ to names of fonts (Malte J├╝rgens)
00a95c1 change ttf name of Roboto-Regular to Roboto-Regular_ (Malte J├╝rgens)
2021-12-02 00:04:16 -06:00
luigi1111
50c8f30d0b Merge pull request #3755
843536c WizardAskPassword: clean password fields when clicking on Back button (rating89us)
2021-12-02 00:02:47 -06:00
luigi1111
e2203a871c Merge pull request #3736
4d2186f README: add missing macOS dependencies (selsta)
2021-12-02 00:01:42 -06:00
rating89us
3e159e0ed6 WizardCreateDevice1: Use "Restore wallet" instead of "Create wallet" on Next button when restoring 2021-12-01 21:50:55 +01:00
rating89us
d922c91071 main: hide TitleBar when MerchantTitleBar is visible 2021-12-01 16:48:14 +01:00
selsta
fa35410851 build: prepare v0.17.3.0 2021-11-30 23:22:39 +01:00
rating89us
6e24930026 WizardOpenWallet1: new wallet icons; hide "Mainnet" label in simple mode 2021-11-29 20:16:23 +01:00
rating89us
b8b96ee719 PasswordDialog: display wizard title bar when returning to wizard after canceling password dialog 2021-11-28 13:39:45 +01:00
rating89us
22450cb68d main: hide wallet name in wizard titlebar 2021-11-28 13:33:54 +01:00
rating89us
a4b907a668 WizardCreateDevice1: hide advanced options in simple mode 2021-11-28 11:45:50 +01:00
rating89us
843536c7a1 WizardAskPassword: clean password fields when clicking on Back button 2021-11-27 19:50:09 +01:00
rating89us
31ae9b3947 WizardCreateDevice1: reset fields when opening page 2021-11-27 19:45:50 +01:00
luigi1111
c72729fa5d Merge pull request #3750
8f12e97 LeftPanel: display full keyboard shortcuts for Windows, Mac, and Linux (rating89us)
2021-11-26 22:57:54 -06:00
luigi1111
a07299f64d Merge pull request #3746
9e83942 Updated instructions for Gentoo (free-as-in-beer)
2021-11-26 22:57:26 -06:00
luigi1111
d55a001875 Merge pull request #3743
98b2727 StandardDropdown: remove bold text in dropdown items (rating89us)
2021-11-26 22:56:53 -06:00
luigi1111
917d6d4243 Merge pull request #3742
e390b43 Mining: add buttons/scroll to CPU threads input; improve button labels; set start mining button as primary (rating89us)
2021-11-26 22:56:26 -06:00
luigi1111
05e629c0eb Merge pull request #3740
9846bff AddressBook: use small StandardButton; adjust buttons alignment/order; remove paste button (rating89us)
2021-11-26 22:55:57 -06:00
luigi1111
9c901b33f0 Merge pull request #3739
a37c375 Account: use StandardButton for 'Create new account' (rating89us)
2021-11-26 22:55:24 -06:00
luigi1111
a0ff56fbef Merge pull request #3738
419a197 AddressBook: fix edit address button tooltip (rating89us)
2021-11-26 22:54:47 -06:00
luigi1111
fc8c1114b2 Merge pull request #3737
9961305 LabelSubheader: implement tooltip (rating89us)
2021-11-26 22:54:12 -06:00
luigi1111
93e5ef883c Merge pull request #3735
c844e3d zxcvbn: fix buffer overflow (selsta)
2021-11-26 22:50:17 -06:00
luigi1111
10a36f96f6 Merge pull request #3731
61d8b5e Makefile: don't hardcode x86_64 arch (selsta)
2021-11-26 22:49:47 -06:00
luigi1111
80cd2e08a4 Merge pull request #3689
d3780ab ContextMenu: add Cut, Copy, Delete and Select All (rating89us)
2021-11-26 22:48:40 -06:00
luigi1111
97755e1b34 Merge pull request #3635
cc8ddde Transfer: fix button colors, font size, bold; use secondary button for advanced options (rating89us)
2021-11-26 22:47:35 -06:00
Malte Jürgens
8a8a3847d7 add _ to names of fonts 2021-11-27 00:06:56 +01:00
Malte Jürgens
00a95c11a0 change ttf name of Roboto-Regular to Roboto-Regular_ 2021-11-26 23:39:01 +01:00
rating89us
8f12e97b79 LeftPanel: display full keyboard shortcuts for Windows, Mac, and Linux 2021-11-25 20:30:04 +01:00
rating89us
9961305867 LabelSubheader: implement tooltip 2021-11-22 23:19:41 +01:00
free-as-in-beer
9e83942920 Updated instructions for Gentoo 2021-11-22 22:28:58 +01:00
rating89us
e390b43bdc Mining: add buttons/scroll to CPU threads input; improve button labels; set start mining button as primary 2021-11-22 19:46:16 +01:00
rating89us
cc8ddde01b Transfer: fix button colors, font size, bold; use secondary button for advanced options 2021-11-21 19:28:36 +01:00
rating89us
98b2727857 StandardDropdown: remove bold text in dropdown items 2021-11-21 19:09:10 +01:00
selsta
4d2186fb75 README: add missing macOS dependencies 2021-11-21 03:36:36 +01:00
rating89us
419a1975eb AddressBook: fix edit address button tooltip 2021-11-20 20:18:49 +01:00
rating89us
9846bff226 AddressBook: use small StandardButton; adjust buttons alignment/order; remove paste button 2021-11-20 19:38:29 +01:00
rating89us
a37c3756b7 Account: use StandardButton for "Create new account" 2021-11-20 17:05:26 +01:00
selsta
c844e3d179 zxcvbn: fix buffer overflow
Original patch by hannob
2021-11-15 08:24:58 +01:00
selsta
61d8b5efb6 Makefile: don't hardcode x86_64 arch 2021-11-10 06:25:49 +01:00
luigi1111
ecf5c501d6 Merge pull request #3730
bdad630 remove reference from mattermost (netrik182)
2021-11-09 23:02:41 -06:00
luigi1111
db639b96a3 Merge pull request #3726
987bf92 Fix typos (Dimitris Apostolou)
2021-11-09 23:00:56 -06:00
luigi1111
e65956e910 Merge pull request #3723
f8e1b9b cmake: don't hardcode x86-64 arch (selsta)
2021-11-09 23:00:35 -06:00
luigi1111
09ce233f4b Merge pull request #3717
f91e179 Receive: set maximum length for qr string (selsta)
2021-11-09 23:00:14 -06:00
luigi1111
34893e169e Merge pull request #3716
49ade0d cmake: remove werror (selsta)
2021-11-09 22:59:55 -06:00
luigi1111
dd171c8b49 Merge pull request #3715
c970588 cmake: simplify version, fix tag if git isn't found (selsta)
2021-11-09 22:59:31 -06:00
luigi1111
985406e70f Merge pull request #3713
4aab43a add flatpak package (kinghat)
2021-11-09 22:59:06 -06:00
luigi1111
8bf457c864 Merge pull request #3711
c0aface workflows: add missing dependency, fix mac build (selsta)
2021-11-09 22:58:45 -06:00
luigi1111
96dab92f33 Merge pull request #3706
bd7bd43 AddressBook: add payment request URI prefix to address field placeholder (rating89us)
2021-11-09 22:58:20 -06:00
luigi1111
d348324f50 Merge pull request #3705
b44d359 Transfer: add payment request URI prefix to address field placeholder (rating89us)
2021-11-09 22:58:00 -06:00
luigi1111
4f5903e7fd Merge pull request #3697
4ec78b3 cmake: don't force -march=x86-64 (selsta)
2021-11-09 22:57:36 -06:00
luigi1111
bdadd98622 Merge pull request #3364
66d29a4 Makefile: Add ppc64le target (Jeremy Rand)
2021-11-09 22:57:10 -06:00
netrik182
bdad630d51 remove reference from mattermost
and add matrix room link
2021-11-09 10:22:18 +00:00
Dimitris Apostolou
987bf920c7 Fix typos 2021-11-04 21:19:11 +02:00
selsta
f8e1b9bdb6 cmake: don't hardcode x86-64 arch 2021-10-29 23:39:59 +02:00
selsta
f91e1791fe Receive: set maximum length for qr string 2021-10-21 02:28:41 +02:00
selsta
49ade0d689 cmake: remove werror 2021-10-19 18:02:45 +02:00
selsta
c970588c55 cmake: simplify version, fix tag if git isn't found 2021-10-19 17:58:39 +02:00
kinghat
4aab43a127 add flatpak package 2021-10-12 10:29:36 -05:00
selsta
c0aface962 workflows: add missing dependency, fix mac build 2021-10-07 04:34:07 +02:00
rating89us
bd7bd43504 AddressBook: add payment request URI prefix to address field placeholder 2021-09-27 12:23:23 +02:00
rating89us
b44d359f9e Transfer: add payment request URI prefix to address field placeholder 2021-09-27 12:22:25 +02:00
luigi1111
2f109d3333 Merge pull request #3702
1c31f2e Docker: add missing hash checks (selsta)
2021-09-23 21:56:49 -05:00
luigi1111
7cc225039c Merge pull request #3698
1173dd2 Docker: fix missing unbound on Android (selsta)
2021-09-23 21:56:24 -05:00
luigi1111
cef9be3d02 Merge pull request #3696
87b1518 Docker: fix missing unbound on Linux (selsta)
2021-09-23 21:55:38 -05:00
selsta
1c31f2e481 Docker: add missing hash checks 2021-09-15 17:52:12 +02:00
selsta
1173dd2826 Docker: fix missing unbound on Android 2021-09-15 17:49:23 +02:00
luigi1111
6239f949fe Merge pull request #3694
02c55e3 workflows: fix build on windows (selsta)
2021-09-13 01:47:04 -04:00
selsta
4ec78b35f8 cmake: don't force -march=x86-64 2021-09-13 02:33:34 +02:00
selsta
87b1518023 Docker: fix missing unbound on Linux 2021-09-12 20:55:29 +02:00
selsta
02c55e3fd1 workflows: fix build on windows 2021-09-11 02:24:11 +02:00
luigi1111
96762ebf09 Merge pull request #3687
f327d20 qml: use libwalletqt make_uri function (selsta)
dcc16a4 libwalletqt: add make_uri function (selsta)
2021-09-09 16:54:36 -04:00
luigi1111
702d3b8ec1 Merge pull request #3686
1ef9a5c Transfer: print success / error for key images (selsta)
2021-09-09 16:54:05 -04:00
luigi1111
a3069e4a58 Merge pull request #3472
bd9a2d7 cmake: cleanup openssl (selsta)
2021-09-09 16:53:34 -04:00
selsta
bd9a2d7bbb cmake: cleanup openssl 2021-09-06 02:21:00 +02:00
selsta
1ef9a5c2d7 Transfer: print success / error for key images 2021-09-06 02:19:10 +02:00
luigi1111
3f48e3ef1c Merge pull request #3685
5fa310c LineEdit: fix eye button overlap on password field (rating89us)
2021-09-05 13:06:00 -04:00
luigi1111
d9f7482ae8 Merge pull request #3684
27525b3 Add note about GUI releases to README.md (MoneroArbo)
2021-09-05 13:05:18 -04:00
luigi1111
facec65dfc Merge pull request #3683
d3d7841 Receive: remove highlight of QR code menu if no menu item is hovered (rating89us)
2021-09-05 13:04:38 -04:00
luigi1111
dc331f0e64 Merge pull request #3682
b99b333 WizardAskPassword: add colors to password strength meter; add 'Passwords match/do not match' message (rating89us)
2021-09-05 13:01:58 -04:00
luigi1111
67eb486e63 Merge pull request #3679
18a7629 cmake: cleanup redundant ccache file (selsta)
2021-09-05 13:00:20 -04:00
luigi1111
edb0358916 Merge pull request #3572
544cff7 TransactionHistory: add description to csv export (selsta)
57c2052 TransactionInfo: add isCoinbase and description (selsta)
2021-09-05 12:58:39 -04:00
luigi1111
569ba16df8 Merge pull request #3481
afb88ff workflows: don't use cache on release tag (selsta)
2021-09-05 12:57:33 -04:00
luigi1111
d48438aeef Merge pull request #3477
75746a8 cmake: explicitly link net and common (selsta)
2021-09-05 12:57:04 -04:00
luigi1111
92b3f5a2ee Merge pull request #3473
165817e cmake: cleanup test-libusb-version.c (selsta)
2021-09-05 12:56:31 -04:00
luigi1111
f430d49304 Merge pull request #3471
2f8f7c2 cmake: cleanup boost (selsta)
2021-09-05 12:55:47 -04:00
luigi1111
76c3b3cd1d Merge pull request #3452
95c07e1 workflows: replace qt download script for macos-bundle (selsta)
2021-09-05 12:55:07 -04:00
luigi1111
35aee155d7 Merge pull request #3435
36940f0 Transfer: add support for outputs import / export (selsta)
e36b166 Wallet: import / export output function (tobtoht)
2021-09-05 12:54:13 -04:00
luigi1111
d93af5a469 Merge pull request #3282
6dd7445 Transfer: export all key images by default (benevanoff)
2021-09-05 12:51:53 -04:00
luigi1111
051282931a Merge pull request #3096
AddressBook: description edits, remove hack (selsta)
2021-09-05 12:50:30 -04:00
rating89us
d3780abe33 ContextMenu: add Cut, Copy, Delete and Select All 2021-09-05 15:52:51 +02:00
selsta
f327d20deb qml: use libwalletqt make_uri function 2021-09-05 05:52:56 +02:00
selsta
dcc16a44be libwalletqt: add make_uri function 2021-09-05 05:52:53 +02:00
selsta
36940f07c9 Transfer: add support for outputs import / export 2021-09-04 00:14:07 +02:00
rating89us
b99b333b71 WizardAskPassword: add colors to password strength meter; add "Passwords match/do not match" message 2021-09-03 21:30:16 +02:00
rating89us
5fa310c961 LineEdit: fix eye button overlap on password field 2021-09-03 21:12:20 +02:00
tobtoht
e36b166edd Wallet: import / export output function 2021-09-03 05:36:58 +02:00
MoneroArbo
27525b37e0 Add note about GUI releases to README.md
Official GUI releases use monero-wallet-gui from the docker build process documented in the monero-gui README, alongisde the supporting binaries from the deterministic CLI builds. This should be noted for users looking for verify GUI builds against official releases.
2021-09-02 20:20:20 -04:00
rating89us
d3d78416d7 Receive: remove highlight of QR code menu if no menu item is hovered 2021-09-02 20:49:54 +02:00
selsta
544cff7dc1 TransactionHistory: add description to csv export 2021-08-31 05:50:54 +02:00
selsta
165817ec02 cmake: cleanup test-libusb-version.c 2021-08-31 05:50:33 +02:00
selsta
95c07e1a62 workflows: replace qt download script for macos-bundle 2021-08-31 05:48:53 +02:00
selsta
2f8f7c2054 cmake: cleanup boost 2021-08-31 05:31:30 +02:00
selsta
99ad8ef1ba AddressBook: description edits, remove hack
Co-authored-by: dsc <dsc@xmr.pm>
2021-08-31 05:26:49 +02:00
selsta
18a76299f2 cmake: cleanup redundant ccache file 2021-08-31 05:25:00 +02:00
luigi1111
113efbfdf0 Merge pull request #3678
0e1c6ae build: prepare v0.17.2.3 (selsta)
2021-08-30 16:14:30 -04:00
selsta
0e1c6ae60f build: prepare v0.17.2.3 2021-08-29 20:49:45 +02:00
luigi1111
b461373b8a Merge pull request #3674
3719f00 TxKey: fix get / check proof (selsta)
2021-08-26 21:30:02 -04:00
luigi1111
046124cd9b Merge pull request #3672
09003dd StandardDialog: use secondary color for cancel button (rating89us)
2021-08-26 21:29:18 -04:00
luigi1111
0ca7e4ec76 Merge pull request #3670
ac432fe InputDialog: use secondary color for cancel Button (rating89us)
2021-08-26 21:28:38 -04:00
luigi1111
376eaecf08 Merge pull request #3667
52c8d68 WizardRestoreWallet4: 'Open wallet' -> 'Create wallet'; add translation (rating89us)
2021-08-26 21:28:08 -04:00
luigi1111
316f8b1762 Merge pull request #3666
4fec3a4 WizardHeader: fix subtitle text width (rating89us)
2021-08-26 21:25:22 -04:00
luigi1111
cbed1ed6f7 Merge pull request #3665
02e0ac1 cmake: remove unnecessary steps (selsta)
2021-08-26 21:24:34 -04:00
luigi1111
3507e848cf Merge pull request #3650
946fa53 Receive: implement payment request (rating89us)
2021-08-26 21:23:23 -04:00
luigi1111
60967d3930 Merge pull request #3644
57f9cf9 History: fix transactions missing after midnight (selsta)
2021-08-26 21:22:05 -04:00
luigi1111
55a262b892 Merge pull request #3618
5234570 WizardCreateDevice1: display images; differentiate Ledger Nano X and S; add label to dropdown (rating89us)
2021-08-26 21:19:11 -04:00
selsta
3719f00953 TxKey: fix get / check proof 2021-08-20 23:51:04 +02:00
rating89us
09003dd140 StandardDialog: use secondary color for cancel button 2021-08-20 14:34:38 +02:00
rating89us
ac432fe947 InputDialog: use secondary color for cancel Button 2021-08-20 13:23:43 +02:00
rating89us
5234570afa WizardCreateDevice1: display images; differentiate Ledger Nano X and S; add label to dropdown 2021-08-19 17:26:32 +02:00
rating89us
946fa538b9 Receive: implement payment request 2021-08-19 17:13:57 +02:00
rating89us
52c8d68240 WizardRestoreWallet4: "Open wallet" -> "Create wallet"; add translation 2021-08-15 21:25:20 +02:00
rating89us
4fec3a4d6f WizardHeader: fix subtitle text width 2021-08-13 14:56:22 +02:00
selsta
02e0ac1309 cmake: remove unnecessary steps 2021-08-12 01:08:13 +02:00
luigi1111
51828babbb Merge pull request #3641
d8fb9ec Transfer: use defaultFontColor for text cursor when address field is blank (rating89us)
2021-07-26 15:37:47 -04:00
luigi1111
a13e4b622c Merge pull request #3640
7805430 Account, Receive, RemoteNodeList, SettingsNode: selection indicator in lists (rating89us)
2021-07-26 15:37:26 -04:00
luigi1111
56a17e0a85 Merge pull request #3638
faf9ec3 AddressBook: add Grab QR code inline button (rating89us)
2021-07-26 15:36:48 -04:00
luigi1111
e74ef368df Merge pull request #3637
22291b1 NetworkStatusItem: add tooltip to switch node button; adjust colors of lightning icon, switch node button and network status (rating89us)
2021-07-26 15:36:20 -04:00
luigi1111
857d034f18 Merge pull request #3634
b30be48 README: TOC, update building titles (rating89us)
2021-07-26 15:35:55 -04:00
luigi1111
3f4cedea54 Merge pull request #3630
284caf8 RemoteNodeList: truncate long addresses (rating89us)
2021-07-26 15:35:13 -04:00
luigi1111
4376880b46 Merge pull request #3627
d20c589 Tooltip: fix tooltip width (rating89us)
2021-07-26 15:34:50 -04:00
luigi1111
98057487f6 Merge pull request #3624
ea9ed3e openpgp: add missing include (selsta)
2021-07-26 15:34:29 -04:00
luigi1111
06025352ce Merge pull request #3620
c4c549e Upgrade Font Awesome icons to v5.15.3 (rating89us)
2021-07-26 15:31:58 -04:00
selsta
57f9cf9d85 History: fix transactions missing after midnight 2021-07-26 00:42:44 +02:00
rating89us
d8fb9ec081 Transfer: use defaultFontColor for text cursor when address field is blank 2021-07-25 20:09:52 +02:00
rating89us
faf9ec3027 AddressBook: add Grab QR code inline button
Co-authored-by: selsta <selsta@users.noreply.github.com>
2021-07-25 09:08:17 +02:00
rating89us
22291b1df1 NetworkStatusItem: add tooltip to switch node button; adjust colors of lightning icon, switch node button and network status 2021-07-23 08:14:20 +02:00
rating89us
7805430f4f Account, Receive, RemoteNodeList, SettingsNode: selection indicator in lists 2021-07-23 08:13:01 +02:00
rating89us
b30be48a24 README: TOC, update building titles 2021-07-22 18:06:44 +02:00
rating89us
284caf83f6 RemoteNodeList: truncate long addresses 2021-07-21 01:34:02 +02:00
rating89us
d20c589e42 Tooltip: fix tooltip width 2021-07-16 09:59:45 +02:00
selsta
ea9ed3e0be openpgp: add missing include 2021-07-15 19:43:41 +02:00
rating89us
c4c549e57a Upgrade Font Awesome icons to v5.15.3 2021-07-12 23:15:59 +02:00
luigi1111
b6682330a6 Merge pull request #3611
0ce3e4b WizardOpenWallet1: navigate with keyboard; enable accessibility (rating89us)
2021-07-11 22:19:28 -04:00
luigi1111
b54ee598d8 Merge pull request #3523
20106b2 Tooltip: fix binding loop (selsta)
2021-07-11 22:18:49 -04:00
luigi1111
7da11b050c Merge pull request #3617
94b6a5b cmake: fix incorrect rebase (selsta)
2021-07-10 20:08:56 -04:00
selsta
94b6a5bbf5 cmake: fix incorrect rebase 2021-07-11 02:03:46 +02:00
luigi1111
5a88d4a669 Merge pull request #3565
3d6e9ce cmake: remove unnecessary file globbing (selsta)
2021-07-10 18:02:58 -04:00
selsta
3d6e9ce571 cmake: remove unnecessary file globbing 2021-07-10 23:58:25 +02:00
luigi1111
987e716374 Merge pull request #3614
3631482 SettingsInfo: fix displaying of Graphics mode and Tails on clipboard output (rating89us)
2021-07-10 17:55:11 -04:00
luigi1111
f81bfa1865 Merge pull request #3613
6739b51 WizardWalletInput: red border if error; error messages; remove placeholders; smaller font; icon for browse button (rating89us)
2021-07-10 17:54:34 -04:00
luigi1111
e4a3e282b5 Merge pull request #3593
2c0cf0d WizardCreateDevice1: move 'choose your device' dropdown to the top (rating89us)
2021-07-10 17:53:26 -04:00
luigi1111
c017522a3c Merge pull request #3599
f82336c TxConfirmationDialog: fix displaying of '<' when using fontMonoRegular (rating89us)
2021-07-10 17:52:32 -04:00
rating89us
6739b51a5b WizardWalletInput: red border if error; error messages; remove placeholders; smaller font; icon for browse button
Update WizardWalletInput.qml
2021-07-10 20:14:23 +02:00
rating89us
3631482419 SettingsInfo: fix displaying of Graphics mode and Tails on clipboard output 2021-07-09 23:00:18 +02:00
luigi1111
1c61ec2511 Merge pull request #3603
8419fce LanguageSidebar: navigate/select language with keyboard; enable accessibility; selected indicator; remember previous focused item (rating89us)
2021-07-06 11:50:34 -04:00
luigi1111
d0707d78a1 Merge pull request #3602
15dbbaf cmake: enable position independent code for quirc (selsta)
2021-07-06 11:50:01 -04:00
luigi1111
083b0fb7a8 Merge pull request #3601
d8f9d2f Transfer: fix fee label alignment (selsta)
2021-07-06 11:49:37 -04:00
luigi1111
24d113377b Merge pull request #3598
dbc8c7d qr: scan valid addresses that miss an uri prefix (selsta)
2021-07-06 11:48:58 -04:00
luigi1111
5e076325cd Merge pull request #3590
2db8f77 Transfer: UI changes to description field (use LineEdit, decrease font size, new placeholder) (rating89us)
2021-07-06 11:48:27 -04:00
luigi1111
5aef186c8a Merge pull request #3588
0de95e3 RemoteNodeList: reduce spacing between icons (selsta)
2021-07-06 11:47:49 -04:00
luigi1111
81f0209006 Merge pull request #3582
54e183a SettingsInfo: add portable mode to wallet mode (selsta)
2021-07-06 11:47:06 -04:00
luigi1111
b4e6f20b53 Merge pull request #3580
0fd0fc5 Receive: selected address details on top; QR code click to ampliate/right click to save as image; click on description to edit; display full address; use standard button for 'create new address' (rating89us)
2021-07-06 11:46:35 -04:00
luigi1111
a278781abf Merge pull request #3562
6610f6f cmake: fix compilation with zxcvbn, always enable (selsta)
2021-07-06 11:44:20 -04:00
luigi1111
2d82439b56 Merge pull request #3559
3eae630 History: collapse 'Sort & Filter' when user types (rating89us)
2021-07-06 11:43:48 -04:00
luigi1111
0b0bc87184 Merge pull request #3544
f75a244 Wizard: set unused wallet name (selsta)
2021-07-06 11:43:09 -04:00
luigi1111
59fcda43c6 Merge pull request #3505
76be4b8 main: set correct size for pruned blockchain (selsta)
2021-07-06 11:42:37 -04:00
luigi1111
6e87e2cb5b Merge pull request #3504
8236277 main: simplify fiat ticker code (selsta)
2021-07-06 11:42:09 -04:00
luigi1111
8730743207 Merge pull request #3503
b2255cf main: use Utils.epoch() for epoch (selsta)
2021-07-06 11:41:11 -04:00
luigi1111
4c67007e5b Merge pull request #3502
aa8c1a5 main: remove redundant assignment (selsta)
2021-07-06 11:40:42 -04:00
luigi1111
0ae1c721ef Merge pull request #3491
dbda233 pages: set correct icon fallback opacity (selsta)
2021-07-06 11:40:10 -04:00
luigi1111
21cce4cfb4 Merge pull request #3487
b2fbe51 StandardButton: fix warning with fallbackicon (selsta)
2021-07-06 11:39:19 -04:00
luigi1111
d595957405 Merge pull request #3165
3907dac Account: remove 'Balance:' label; add XMR; align balances (rating89us)
2021-07-06 11:36:19 -04:00
rating89us
0ce3e4b1e7 WizardOpenWallet1: navigate with keyboard; enable accessibility 2021-07-06 10:41:03 +02:00
rating89us
8419fce062 LanguageSidebar: navigate/select language with keyboard; enable accessibility; selected indicator; remember previous focused item 2021-07-04 21:56:57 +02:00
selsta
15dbbaf691 cmake: enable position independent code for quirc 2021-07-01 18:36:43 +02:00
selsta
d8f9d2f160 Transfer: fix fee label alignment 2021-07-01 01:19:57 +02:00
selsta
dbda233b94 pages: set correct icon fallback opacity 2021-07-01 00:46:03 +02:00
rating89us
f82336ce8c TxConfirmationDialog: fix displaying of "<" when using fontMonoRegular 2021-06-29 12:34:39 +02:00
selsta
dbc8c7d473 qr: scan valid addresses that miss an uri prefix 2021-06-29 04:53:24 +02:00
rating89us
2c0cf0d652 WizardCreateDevice1: move "choose your device" dropdown to the top 2021-06-28 00:33:49 +02:00
rating89us
2db8f77a0a Transfer: UI changes to description field (use LineEdit, decrease font size, new placeholder) 2021-06-26 21:25:19 +02:00
rating89us
0fd0fc5ceb Receive: selected address details on top; QR code click to ampliate/right click to save as image; click on description to edit; display full address; use standard button for "create new address" 2021-06-26 16:01:59 +02:00
selsta
0de95e3071 RemoteNodeList: reduce spacing between icons 2021-06-25 01:58:07 +02:00
luigi1111
b58bff39a0 Merge pull request #3586
614a7a0 RemoteNodeList: display shield icon if trusted daemon (rating89us)
2021-06-24 13:55:08 -05:00
luigi1111
bea763d7f8 Merge pull request #3585
b9a1fa8 History: display Payment proof dialog immediately after clicking the button (rating89us)
2021-06-24 13:54:42 -05:00
luigi1111
59a0184ebd Merge pull request #3584
51ac3ca StandardDropdown: use ArrowCursor; remove rotation of dropdownIcon; change background color on mouse hover; smaller text (rating89us)
2021-06-24 13:54:16 -05:00
luigi1111
1a8e3111e4 Merge pull request #3583
192b36f StandardDropdown: remove dots from corners (rating89us)
2021-06-24 13:53:22 -05:00
rating89us
614a7a086a RemoteNodeList: display shield icon if trusted daemon 2021-06-23 03:09:29 +02:00
rating89us
b9a1fa8563 History: display Payment proof dialog immediately after clicking the button 2021-06-22 21:19:27 +02:00
rating89us
51ac3ca981 StandardDropdown: use ArrowCursor; remove rotation of dropdownIcon; change background color on mouse hover; smaller text 2021-06-22 20:38:21 +02:00
rating89us
192b36f74f StandardDropdown: remove dots from corners 2021-06-22 10:09:11 +02:00
selsta
54e183a7f5 SettingsInfo: add portable mode to wallet mode 2021-06-22 02:30:54 +02:00
luigi1111
453388f744 Merge pull request #3578
64dd55a TitleBar: maximize window when title bar is double clicked (rating89us)
2021-06-21 13:41:10 -05:00
luigi1111
afc2b35ed0 Merge pull request #3576
4e2b1ce Transfer: don't overlap inside borders; fix margins (rating89us)
2021-06-21 13:40:36 -05:00
luigi1111
9114887866 Merge pull request #3575
08dd89d Transfer: remove leftMargin of 'Address' label (rating89us)
2021-06-21 13:39:47 -05:00
luigi1111
2afb346563 Merge pull request #3574
eacc57f StandardDropdown: use ColumnLayout; use same height of LineEdit; include dropdownLabel (rating89us)
2021-06-21 13:39:00 -05:00
luigi1111
bc8f39c311 Merge pull request #3571
c15c5b5 TransactionHistory: use displayAmount for amount (selsta)
2021-06-21 13:38:37 -05:00
luigi1111
286a3d140d Merge pull request #3569
ffd31c5 AddressBook: use LineEdit on descriptionLine; add tab/backtab; forceActiveFocus on addressLine; use Enter/Return key to save; cancel/delete buttons (rating89us)
2021-06-21 13:38:02 -05:00
luigi1111
5f2b5d940c Merge pull request #3550
417eaea History: stay on the same page after editing description (rating89us)
2021-06-21 13:36:34 -05:00
rating89us
64dd55a9a6 TitleBar: maximize window when title bar is double clicked 2021-06-20 19:28:11 +02:00
rating89us
eacc57fb44 StandardDropdown: use ColumnLayout; use same height of LineEdit; include dropdownLabel 2021-06-20 00:02:59 +02:00
rating89us
4e2b1cec95 Transfer: don't overlap inside borders; fix margins 2021-06-19 21:16:54 +02:00
rating89us
08dd89de58 Transfer: remove leftMargin of "Address" label 2021-06-19 18:21:40 +02:00
selsta
57c205206c TransactionInfo: add isCoinbase and description 2021-06-18 03:34:47 +02:00
selsta
c15c5b5227 TransactionHistory: use displayAmount for amount 2021-06-18 02:08:37 +02:00
rating89us
ffd31c50da AddressBook: use LineEdit on descriptionLine; add tab/backtab; forceActiveFocus on addressLine; use Enter/Return key to save; cancel/delete buttons 2021-06-17 13:37:19 +02:00
luigi1111
b970cad48b Merge pull request #3564
dfe8146 SettingsInfo, WizardRestoreWallet1, WizardCreateDevice1: Correct restore height date when typed in wrong format (rating89us)
2021-06-16 14:53:44 -05:00
luigi1111
752f1faa93 Merge pull request #3563
b319dbb main: fixes bug not accepting new restore height (rating89us)
2021-06-16 14:53:17 -05:00
luigi1111
60b33d3a91 Merge pull request #3545
52aef11 LineEdit: use ColumnLayout instead of Item (also used in LineEditMulti) (rating89us)
2021-06-16 14:49:26 -05:00
luigi1111
5de306ab7a Merge pull request #3513
877fb9e README: freenode -> libera (selsta)
2021-06-16 14:47:59 -05:00
rating89us
dfe8146f5c SettingsInfo, WizardRestoreWallet1, WizardCreateDevice1: Correct restore height date when typed in wrong format 2021-06-15 16:34:07 +02:00
selsta
6610f6f2da cmake: fix compilation with zxcvbn, always enable 2021-06-14 21:47:54 +02:00
rating89us
b319dbb1b2 main: fixes bug not accepting new restore height 2021-06-14 21:21:16 +02:00
rating89us
3eae630cfe History: collapse "Sort & Filter" when user types 2021-06-12 20:43:35 +02:00
rating89us
52aef114fa LineEdit: use ColumnLayout instead of Item (also used in LineEditMulti) 2021-06-11 17:13:52 +02:00
luigi1111
7c379e2cda Merge pull request #3548
979e0da History: add fontAwesomeFallbackIcon (rating89us)
2021-06-10 11:07:53 -05:00
luigi1111
244459e606 Merge pull request #3546
8ac1b4e AddressBook: add 'See transactions' button (rating89us)
2021-06-10 11:07:10 -05:00
luigi1111
0e561de0a9 Merge pull request #3543
c5bad8e SettingsLog: fix text color bug on theme switch; new warning and green text colors (rating89us)
2021-06-10 11:06:31 -05:00
luigi1111
ceac6c8a47 Merge pull request #3542
f6a66b6 SettingsLog: ScrollBar always visible (except Mac) (rating89us)
2021-06-10 11:06:04 -05:00
luigi1111
b542f15531 Merge pull request #3541
2f1092d Slider: use MoneroComponents.TextPlain instead of Text on label (rating89us)
2021-06-10 11:05:38 -05:00
luigi1111
3621ab3344 Merge pull request #3539
b825f6e StandardDropdown: add FontAwesome fallback icons (rating89us)
2021-06-10 11:05:01 -05:00
luigi1111
4850e13895 Merge pull request #3538
ad38f15 DatePicker: date input with fixed size; longer animation; move up calendar rectangle (rating89us)
2021-06-10 11:04:39 -05:00
luigi1111
950e20d400 Merge pull request #3537
5a41849 SettingsLog: new placeholder text in command field (no commands in translation string) (rating89us)
2021-06-10 11:04:15 -05:00
luigi1111
124a8b5f4e Merge pull request #3536
cea712e History: close sortAndFilter when exiting Transactions page (rating89us)
2021-06-10 11:03:31 -05:00
luigi1111
0bd4d731d2 Merge pull request #3535
1f8aa0d History: change default dates of 'Date from' and 'Date to' DatePicker components (rating89us)
2021-06-10 11:02:36 -05:00
luigi1111
e3a17a66ff Merge pull request #3534
9ab104b DatePicker: display currently selected month when opening calendar (rating89us)
2021-06-10 11:01:52 -05:00
luigi1111
4f385b9a04 Merge pull request #3533
39d561d DatePicker: support mouse wheel to navigate months (rating89us)
2021-06-10 11:01:19 -05:00
luigi1111
2c54787644 Merge pull request #3532
23301da DatePicker: highlight selected date/today; hide invalid days (rating89us)
2021-06-10 10:27:42 -05:00
luigi1111
7770621a2f Merge pull request #3531
2c51762 DatePicker: FontAwesome fallback icons (rating89us)
2021-06-10 10:25:55 -05:00
luigi1111
b22fc4266c Merge pull request #3528
f06d6e0 Transfer: add XMR unit on transactions with a single recipient; move 'send all' button next to Amount label (rating89us)
2021-06-10 10:22:52 -05:00
luigi1111
2290e7e762 Merge pull request #3527
1512908 Transfer: fix y position of recipient elements (rating89us)
2021-06-10 10:21:07 -05:00
luigi1111
f8344ce7c6 Merge pull request #3525
ed1bc2e build: fix typo (rating89us)
2021-06-10 10:20:12 -05:00
luigi1111
1be9ea4828 Merge pull request #3524
aca6174 AddressBook: add Font Awesome fallback icons (rating89us)
2021-06-10 10:19:35 -05:00
luigi1111
b07016b7cd Merge pull request #3522
c9ee4bf History: move cursor to end of search input field after importing address (rating89us)
2021-06-10 10:18:59 -05:00
luigi1111
179b74e570 Merge pull request #3521
10a01fa Receive: add tooltip to search transactions button (rating89us)
2021-06-10 10:18:27 -05:00
luigi1111
0a6f6cb9ac Merge pull request #3520
0775b52 History: clean search bar inline button (rating89us)
2021-06-10 10:16:26 -05:00
rating89us
417eaeae28 History: stay on the same page after editing description 2021-06-10 12:59:39 +02:00
rating89us
8ac1b4ef58 AddressBook: add "See transactions" button 2021-06-10 09:05:09 +02:00
rating89us
979e0da9e0 History: add fontAwesomeFallbackIcon 2021-06-09 17:14:55 +02:00
rating89us
1f8aa0dff0 History: change default dates of "Date from" and "Date to" DatePicker components 2021-06-09 09:38:12 +02:00
selsta
f75a2447a7 Wizard: set unused wallet name 2021-06-09 01:00:16 +02:00
rating89us
f6a66b6779 SettingsLog: ScrollBar always visible (except Mac) 2021-06-07 22:37:39 +02:00
rating89us
c5bad8ec49 SettingsLog: fix text color bug on theme switch; new warning and green text colors 2021-06-07 22:35:54 +02:00
rating89us
2f1092de55 Slider: use MoneroComponents.TextPlain instead of Text on label 2021-06-07 15:30:18 +02:00
rating89us
b825f6e1bd StandardDropdown: add FontAwesome fallback icons 2021-06-07 14:02:19 +02:00
rating89us
ad38f155bc DatePicker: date input with fixed size; longer animation; move up calendar rectangle 2021-06-07 13:39:16 +02:00
rating89us
5a418499d4 SettingsLog: new placeholder text in command field (no commands in translation string) 2021-06-07 12:03:28 +02:00
rating89us
cea712e51d History: close sortAndFilter when exiting Transactions page 2021-06-07 11:31:40 +02:00
rating89us
39d561d9f2 DatePicker: support mouse wheel to navigate months 2021-06-06 23:21:32 +02:00
rating89us
23301da51b DatePicker: highlight selected date/today; hide invalid days 2021-06-06 23:15:53 +02:00
rating89us
9ab104b38a DatePicker: display currently selected month when opening calendar 2021-06-06 21:55:34 +02:00
rating89us
2c517623a1 DatePicker: FontAwesome fallback icons 2021-06-06 20:40:06 +02:00
rating89us
f06d6e067f Transfer: add XMR unit on transactions with a single recipient; move "send all" button next to Amount label 2021-06-04 19:39:21 +02:00
rating89us
1512908751 Transfer: fix y position of recipient elements 2021-06-04 19:35:19 +02:00
rating89us
ed1bc2eece build: fix typo 2021-06-02 19:33:22 +02:00
rating89us
0775b529c4 History: clean search bar inline button 2021-06-02 19:09:31 +02:00
rating89us
aca6174ef4 AddressBook: add Font Awesome fallback icons 2021-06-02 17:07:01 +02:00
selsta
20106b29ba Tooltip: fix binding loop 2021-06-02 17:06:45 +02:00
rating89us
c9ee4bf286 History: move cursor to end of search input field after importing address 2021-06-02 16:56:34 +02:00
rating89us
10a01fa5b4 Receive: add tooltip to search transactions button 2021-06-02 16:43:11 +02:00
luigi1111
2946127ed7 Merge pull request #3512
8411ec0 main: hide/show popups before/after inactivity screen lock (rating89us)
2021-06-01 01:39:21 -05:00
luigi1111
416979cdbd Merge pull request #3496
7997e6a AddressBook: highlight background when selecting contact for transfer page (rating89us)
2021-06-01 01:38:45 -05:00
luigi1111
1442215ce5 Merge pull request #3490
9d3864b Implement tooltips in multiple pages and components (rating89us)
2021-06-01 01:37:47 -05:00
luigi1111
ba3bdcd6a1 Merge pull request #3216
fa45b8f Receive: add search transactions button (rating89us)
2021-06-01 01:35:46 -05:00
selsta
877fb9ea87 README: freenode -> libera 2021-05-29 05:18:32 +02:00
rating89us
9d3864b7f0 Implement tooltips in multiple pages and components 2021-05-29 04:02:19 +02:00
rating89us
8411ec0787 main: hide/show popups before/after inactivity screen lock 2021-05-28 12:22:59 +02:00
selsta
76be4b8c0a main: set correct size for pruned blockchain 2021-05-26 03:39:35 +02:00
selsta
8236277906 main: simplify fiat ticker code 2021-05-26 01:09:30 +02:00
selsta
b2255cfd24 main: use Utils.epoch() for epoch 2021-05-26 00:55:50 +02:00
selsta
aa8c1a5421 main: remove redundant assignment 2021-05-26 00:28:58 +02:00
rating89us
7997e6aaf4 AddressBook: highlight background when selecting contact for transfer page 2021-05-22 11:31:05 +02:00
rating89us
fa45b8f96e Receive: add search transactions button 2021-05-22 10:59:17 +02:00
selsta
b2fbe51659 StandardButton: fix warning with fallbackicon 2021-05-19 02:01:10 +02:00
selsta
afb88ff511 workflows: don't use cache on release tag 2021-05-13 22:05:44 +02:00
selsta
75746a8153 cmake: explicitly link net and common 2021-05-10 23:35:40 +02:00
Jeremy Rand
66d29a4d40 Makefile: Add ppc64le target 2021-03-21 02:59:21 +00:00
benevanoff
6dd7445938 Transfer: export all key images by default 2020-12-25 02:16:15 -06:00
rating89us
3907dac198 Account: remove "Balance:" label; add XMR; align balances 2020-10-17 13:57:24 +02:00
193 changed files with 73839 additions and 312924 deletions

107
.github/qt_helper.py vendored Normal file
View File

@@ -0,0 +1,107 @@
#!/usr/bin/env python3
import defusedxml.ElementTree
import hashlib
import mmap
import pathlib
import subprocess
import sys
import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET
MAX_TRIES = 32
def fetch_links_to_archives(os, target, major, minor, patch, toolchain):
MAX_XML_SIZE = 1024 * 1024 * 1024
MIRROR = 'download.qt.io'
base_url = f'https://{MIRROR}/online/qtsdkrepository/{os}/{target}/qt{major}_{major}{minor}{patch}'
url = f'{base_url}/Updates.xml'
for _ in range(MAX_TRIES):
try:
resp = urllib.request.urlopen(url).read(MAX_XML_SIZE)
update_xml = defusedxml.ElementTree.fromstring(resp)
break
except KeyboardInterrupt:
raise
except BaseException as e:
print('error', e, flush=True)
else:
return
for pkg in update_xml.findall('./PackageUpdate'):
name = pkg.find('.//Name')
if name == None:
continue
if name.text != f'qt.qt{major}.{major}{minor}{patch}.{toolchain}':
continue
version = pkg.find('.//Version')
if version == None:
continue
archives = pkg.find('.//DownloadableArchives')
if archives == None or archives.text == None:
continue
for archive in archives.text.split(', '):
url = f'{base_url}/{name.text}/{version.text}{archive}'
file_name = pathlib.Path(urllib.parse.urlparse(url).path).name
yield {'name': file_name, 'url': url}
def download(links):
metalink = ET.Element('metalink', xmlns = "urn:ietf:params:xml:ns:metalink")
for link in links:
file = ET.SubElement(metalink, 'file', name = link['name'])
ET.SubElement(file, 'url').text = link['url']
data = ET.tostring(metalink, encoding='UTF-8', xml_declaration=True)
for _ in range(MAX_TRIES):
with subprocess.Popen([
'aria2c',
'--connect-timeout=8',
'--console-log-level=warn',
'--continue',
'--follow-metalink=mem',
'--max-concurrent-downloads=100',
'--max-connection-per-server=16',
'--max-file-not-found=100',
'--max-tries=100',
'--min-split-size=1MB',
'--retry-wait=1',
'--split=100',
'--summary-interval=0',
'--timeout=8',
'--user-agent=',
'--metalink-file=-',
], stdin=subprocess.PIPE) as aria:
aria.communicate(data)
if aria.wait() == 0:
return True
return False
def calc_hash_sum(files):
obj = hashlib.new('sha256')
for path in files:
with open(path, 'rb') as f:
with mmap.mmap(f.fileno(), 0, mmap.MAP_SHARED, mmap.PROT_READ) as m:
file_hash = hashlib.new('sha256', m).digest()
obj.update(file_hash)
return obj.digest().hex()
def extract_archives(files, out='.', targets=[]):
for path in files:
if subprocess.Popen(['7z', 'x', '-bd', '-y', '-aoa', f'-o{out}', path] + targets,
stdout=subprocess.DEVNULL,
).wait() != 0:
return False
return True
def main():
os, target, version, toolchain, expect = sys.argv[1:]
major, minor, patch = version.split('.')
links = [*fetch_links_to_archives(os, target, major, minor, patch, toolchain)]
print(*[l['url'].encode() for l in links], sep='\n', flush=True)
assert download(links)
result = calc_hash_sum([l['name'] for l in links])
print('result', result, 'expect', expect, flush=True)
assert result == expect
assert extract_archives([l['name'] for l in links], '.', ['{}.{}.{}'.format(major, minor, patch)])
[pathlib.Path(l['name']).unlink() for l in links]
if __name__ == '__main__':
main()

View File

@@ -10,7 +10,7 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- name: install dependencies - name: install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf qt5 pkg-config run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf qt5 pkg-config
- name: build - name: build
run: DEV_MODE=ON make release -j3 run: DEV_MODE=ON make release -j3
- name: test qml - name: test qml
@@ -52,7 +52,7 @@ jobs:
- uses: eine/setup-msys2@v2 - uses: eine/setup-msys2@v2
with: with:
update: true update: true
install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb mingw-w64-x86_64-unbound git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt
- name: build - name: build
run: DEV_MODE=ON make release-win64 -j2 run: DEV_MODE=ON make release-win64 -j2
- name: test qml - name: test qml
@@ -65,14 +65,11 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- name: install dependencies - name: install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi zmq libpgm miniupnpc ldns expat libunwind-headers protobuf pkg-config python3 p7zip run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc ldns expat libunwind-headers protobuf pkg-config python3 p7zip aria2
- name: install dependencies - name: install dependencies
run: pip3 install requests semantic_version lxml py7zr run: pip3 install defusedxml
- name: download qt - name: download qt
run: | run: python3 monero-gui/.github/qt_helper.py mac_x64 desktop 5.15.2 clang_64 c384008156fe63cc183bade0316828c598ff3e5074397c0c9ccc588d6cdc5aca
curl -O https://raw.githubusercontent.com/engnr/qt-downloader/master/qt-downloader
chmod +x qt-downloader
./qt-downloader macos desktop 5.15.2 clang_64
working-directory: ../ working-directory: ../
- name: build - name: build
run: CMAKE_PREFIX_PATH=/Users/runner/work/monero-gui/5.15.2/clang_64 make release -j3 run: CMAKE_PREFIX_PATH=/Users/runner/work/monero-gui/5.15.2/clang_64 make release -j3
@@ -96,6 +93,7 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10 - uses: satackey/action-docker-layer-caching@v0.0.10
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true continue-on-error: true
with: with:
key: docker-linux-static-{hash} key: docker-linux-static-{hash}
@@ -103,7 +101,7 @@ jobs:
docker-linux-static- docker-linux-static-
- name: install dependencies - name: install dependencies
run: sudo apt -y install xvfb libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xkb1 libxkbcommon-x11-0 run: sudo apt -y install xvfb libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xkb1 libxkbcommon-x11-0
- name: preprare build enviroment - name: prepare build environment
run: docker build --tag monero:build-env-linux --build-arg THREADS=3 --file Dockerfile.linux . run: docker build --tag monero:build-env-linux --build-arg THREADS=3 --file Dockerfile.linux .
- name: build - name: build
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-linux sh -c 'make release-static -j3' run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-linux sh -c 'make release-static -j3'
@@ -125,12 +123,13 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10 - uses: satackey/action-docker-layer-caching@v0.0.10
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true continue-on-error: true
with: with:
key: docker-windows-static-{hash} key: docker-windows-static-{hash}
restore-keys: | restore-keys: |
docker-windows-static- docker-windows-static-
- name: preprare build enviroment - name: prepare build environment
run: docker build --tag monero:build-env-windows --build-arg THREADS=3 --file Dockerfile.windows . run: docker build --tag monero:build-env-windows --build-arg THREADS=3 --file Dockerfile.windows .
- name: build - name: build
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-windows sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j3' run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-windows sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j3'
@@ -149,7 +148,7 @@ jobs:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
with: with:
submodules: recursive submodules: recursive
- name: preprare build enviroment - name: prepare build environment
run: docker build --tag monero:build-env-android --build-arg THREADS=3 --file Dockerfile.android . run: docker build --tag monero:build-env-android --build-arg THREADS=3 --file Dockerfile.android .
- name: build - name: build
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -e THREADS=3 monero:build-env-android run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -e THREADS=3 monero:build-env-android

View File

@@ -4,14 +4,13 @@ project(monero-gui)
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}") message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
set(VERSION_MAJOR "17") set(VERSION_MAJOR "17")
set(VERSION_MINOR "2") set(VERSION_MINOR "3")
set(VERSION_REVISION "2") set(VERSION_REVISION "1")
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}") set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
option(STATIC "Link libraries statically, requires static Qt") option(STATIC "Link libraries statically, requires static Qt")
option(USE_DEVICE_TREZOR "Trezor support compilation" ON) option(USE_DEVICE_TREZOR "Trezor support compilation" ON)
option(ENABLE_PASS_STRENGTH_METER "Enable zxcvbn library for password strength" OFF)
option(WITH_SCANNER "Enable webcam QR scanner" OFF) option(WITH_SCANNER "Enable webcam QR scanner" OFF)
option(DEV_MODE "Checkout latest monero master on build" OFF) option(DEV_MODE "Checkout latest monero master on build" OFF)
@@ -19,14 +18,12 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
include(CheckCCompilerFlag) include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
include(CheckLinkerFlag) include(CheckLinkerFlag)
include(FindCcache)
if(DEBUG) if(DEBUG)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
endif() endif()
set(BUILD_GUI_DEPS ON) set(BUILD_GUI_DEPS ON)
set(ARCH "x86-64" CACHE STRING "Target architecture")
set(BUILD_64 ON CACHE BOOL "Build 64-bit binaries") set(BUILD_64 ON CACHE BOOL "Build 64-bit binaries")
if(NOT MANUAL_SUBMODULES) if(NOT MANUAL_SUBMODULES)
@@ -72,19 +69,10 @@ endif()
if(STATIC) if(STATIC)
message(STATUS "Initiating static build") message(STATUS "Initiating static build")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ${CMAKE_FIND_LIBRARY_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
add_definitions(-DMONERO_GUI_STATIC) add_definitions(-DMONERO_GUI_STATIC)
endif() endif()
# Include password strength library
if(ENABLE_PASS_STRENGTH_METER)
message(STATUS "Building with pass strength meter support.")
else()
add_definitions(-DDISABLE_PASS_STRENGTH_METER)
endif()
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
# force version update # force version update
@@ -120,15 +108,6 @@ monero_gui_add_library(gui_version SOURCES version.js DEPENDS genversiongui)
message(STATUS "${CMAKE_MODULE_PATH}") message(STATUS "${CMAKE_MODULE_PATH}")
# OpenSSL
if(APPLE AND NOT OPENSSL_ROOT_DIR)
execute_process(COMMAND brew --prefix openssl OUTPUT_VARIABLE OPENSSL_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
find_package(OpenSSL REQUIRED)
message(STATUS "OpenSSL: Version ${OPENSSL_VERSION}")
message(STATUS "OpenSSL: include dir at ${OPENSSL_INCLUDE_DIR}")
message(STATUS "OpenSSL: libraries at ${OPENSSL_LIBRARIES} ${OPENSSL_SSL_LIBRARIES}")
if(WITH_SCANNER) if(WITH_SCANNER)
add_definitions(-DWITH_SCANNER) add_definitions(-DWITH_SCANNER)
endif() endif()
@@ -137,27 +116,6 @@ endif()
find_library(SODIUM_LIBRARY sodium) find_library(SODIUM_LIBRARY sodium)
message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}") message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}")
# Boost
if(DEBUG)
set(Boost_DEBUG ON)
endif()
if(APPLE AND NOT BOOST_ROOT)
execute_process(COMMAND brew --prefix boost OUTPUT_VARIABLE BOOST_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(MINGW)
set(Boost_THREADAPI win32)
endif()
find_package(Boost 1.58 REQUIRED COMPONENTS
system
filesystem
thread
date_time
chrono
regex
serialization
program_options
locale)
if(UNIX AND NOT APPLE AND NOT ANDROID) if(UNIX AND NOT APPLE AND NOT ANDROID)
set(CMAKE_SKIP_RPATH ON) set(CMAKE_SKIP_RPATH ON)
set(CMAKE_FIND_LIBRARY_SUFFIXES_PREV ${CMAKE_FIND_LIBRARY_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES_PREV ${CMAKE_FIND_LIBRARY_SUFFIXES})
@@ -175,19 +133,6 @@ if(UNIX AND NOT APPLE AND NOT ANDROID)
endif() endif()
endif() endif()
if(MINGW)
string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}")
message(STATUS "MSYS location: ${msys2_install_path}")
set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include")
# This is necessary because otherwise CMake will make Boost libraries -lfoo
# rather than a full path. Unfortunately, this makes the shared libraries get
# linked due to a bug in CMake which misses putting -static flags around the
# -lfoo arguments.
set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib)
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
endif()
set(QT5_LIBRARIES set(QT5_LIBRARIES
Qt5Core Qt5Core
Qt5Quick Qt5Quick
@@ -400,10 +345,6 @@ if(ANDROID)
endforeach() endforeach()
endif() endif()
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIRS}")
message(STATUS "Using Boost libraries at ${Boost_LIBRARIES}")
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
if(MINGW) if(MINGW)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt) set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt)
@@ -438,7 +379,7 @@ if(APPLE)
endif() endif()
if (APPLE AND NOT IOS) if (APPLE AND NOT IOS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -fvisibility=default -std=c++11") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=default -std=c++11")
endif() endif()
if(APPLE) if(APPLE)
@@ -446,8 +387,6 @@ if(APPLE)
endif() endif()
# warnings # warnings
add_c_flag_if_supported(-Werror C_SECURITY_FLAGS)
add_cxx_flag_if_supported(-Werror CXX_SECURITY_FLAGS)
add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS) add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS)
add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS) add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS)
add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS) add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS)

View File

@@ -8,11 +8,16 @@ Use macOS 10.12 - 10.13 for better backwards compability.
3. `git clone --recursive -b v0.X.Y.Z --depth 1 https://github.com/monero-project/monero-gui` 3. `git clone --recursive -b v0.X.Y.Z --depth 1 https://github.com/monero-project/monero-gui`
4. `CMAKE_PREFIX_PATH=~/Qt5.12.8/5.12.8/clang_64 make release` 4. Compile `monero-wallet-gui.app`
5. `cd build/release && make deploy` ```
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH=~/Qt5.12.8/5.12.8/clang_64 ..
make
make deploy
```
6. Replace the `monerod` binary inside `monero-wallet-gui.app/Contents/MacOS/` with one built using deterministic builds / gitian. 5. Replace the `monerod` binary inside `monero-wallet-gui.app/Contents/MacOS/` with one built using deterministic builds / gitian.
## Codesigning and notarizing ## Codesigning and notarizing

View File

@@ -43,6 +43,7 @@ ENV PATH=${TOOLCHAIN_DIR}/aarch64-linux-android/bin:${TOOLCHAIN_DIR}/bin:${PATH}
ARG ZLIB_VERSION=1.2.11 ARG ZLIB_VERSION=1.2.11
ARG ZLIB_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 ARG ZLIB_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \ RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
&& echo "${ZLIB_HASH} zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \ && tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
&& rm zlib-${ZLIB_VERSION}.tar.gz \ && rm zlib-${ZLIB_VERSION}.tar.gz \
&& cd zlib-${ZLIB_VERSION} \ && cd zlib-${ZLIB_VERSION} \
@@ -117,6 +118,7 @@ RUN wget -q https://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSIO
ARG OPENSSL_VERSION=1.1.1g ARG OPENSSL_VERSION=1.1.1g
ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
&& echo "${OPENSSL_HASH} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \
&& tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
&& rm openssl-${OPENSSL_VERSION}.tar.gz \ && rm openssl-${OPENSSL_VERSION}.tar.gz \
&& cd openssl-${OPENSSL_VERSION} \ && cd openssl-${OPENSSL_VERSION} \
@@ -129,6 +131,30 @@ RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
&& make -j${THREADS} install \ && make -j${THREADS} install \
&& rm -rf $(pwd) && rm -rf $(pwd)
ARG EXPAT_VERSION=2.4.1
ARG EXPAT_HASH=2f9b6a580b94577b150a7d5617ad4643a4301a6616ff459307df3e225bcfbf40
RUN wget https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-${EXPAT_VERSION}.tar.bz2 && \
echo "${EXPAT_HASH} expat-${EXPAT_VERSION}.tar.bz2" | sha256sum -c && \
tar -xf expat-${EXPAT_VERSION}.tar.bz2 && \
rm expat-${EXPAT_VERSION}.tar.bz2 && \
cd expat-${EXPAT_VERSION} && \
CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --enable-static --disable-shared --prefix=${PREFIX} --host=aarch64-linux-android && \
make -j$THREADS && \
make -j$THREADS install && \
rm -rf $(pwd)
ARG UNBOUND_VERSION=1.13.2
ARG UNBOUND_HASH=0a13b547f3b92a026b5ebd0423f54c991e5718037fd9f72445817f6a040e1a83
RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-${UNBOUND_VERSION}.tar.gz && \
echo "${UNBOUND_HASH} unbound-${UNBOUND_VERSION}.tar.gz" | sha256sum -c && \
tar -xzf unbound-${UNBOUND_VERSION}.tar.gz && \
rm unbound-${UNBOUND_VERSION}.tar.gz && \
cd unbound-${UNBOUND_VERSION} && \
CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --disable-shared --enable-static --without-pyunbound --with-libexpat=${PREFIX} --with-ssl=${PREFIX} --with-libevent=no --without-pythonmodule --disable-flto --with-pthreads --with-libunbound-only --host=aarch64-linux-android --with-pic --prefix=${PREFIX} && \
make -j$THREADS && \
make -j$THREADS install && \
rm -rf $(pwd)
ARG ZMQ_VERSION=v4.3.3 ARG ZMQ_VERSION=v4.3.3
ARG ZMQ_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3 ARG ZMQ_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3
RUN git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} --depth 1 \ RUN git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} --depth 1 \

View File

@@ -169,7 +169,27 @@ RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \
tar -xzf openssl-1.1.1g.tar.gz && \ tar -xzf openssl-1.1.1g.tar.gz && \
rm openssl-1.1.1g.tar.gz && \ rm openssl-1.1.1g.tar.gz && \
cd openssl-1.1.1g && \ cd openssl-1.1.1g && \
./config no-asm no-shared no-zlib-dynamic --openssldir=/usr && \ ./config no-asm no-shared no-zlib-dynamic --prefix=/usr --openssldir=/usr && \
make -j$THREADS && \
make -j$THREADS install && \
rm -rf $(pwd)
RUN wget https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-2.4.1.tar.bz2 && \
echo "2f9b6a580b94577b150a7d5617ad4643a4301a6616ff459307df3e225bcfbf40 expat-2.4.1.tar.bz2" | sha256sum -c && \
tar -xf expat-2.4.1.tar.bz2 && \
rm expat-2.4.1.tar.bz2 && \
cd expat-2.4.1 && \
./configure --enable-static --disable-shared --prefix=/usr && \
make -j$THREADS && \
make -j$THREADS install && \
rm -rf $(pwd)
RUN wget https://www.nlnetlabs.nl/downloads/unbound/unbound-1.13.2.tar.gz && \
echo "0a13b547f3b92a026b5ebd0423f54c991e5718037fd9f72445817f6a040e1a83 unbound-1.13.2.tar.gz" | sha256sum -c && \
tar -xzf unbound-1.13.2.tar.gz && \
rm unbound-1.13.2.tar.gz && \
cd unbound-1.13.2 && \
./configure --disable-shared --enable-static --without-pyunbound --with-libexpat=/usr --with-ssl=/usr --with-libevent=no --without-pythonmodule --disable-flto --with-pthreads --with-libunbound-only --with-pic && \
make -j$THREADS && \ make -j$THREADS && \
make -j$THREADS install && \ make -j$THREADS install && \
rm -rf $(pwd) rm -rf $(pwd)

View File

@@ -12,9 +12,9 @@ RUN apt update && \
RUN update-alternatives --set x86_64-w64-mingw32-g++ $(which x86_64-w64-mingw32-g++-posix) && \ RUN update-alternatives --set x86_64-w64-mingw32-g++ $(which x86_64-w64-mingw32-g++-posix) && \
update-alternatives --set x86_64-w64-mingw32-gcc $(which x86_64-w64-mingw32-gcc-posix) update-alternatives --set x86_64-w64-mingw32-gcc $(which x86_64-w64-mingw32-gcc-posix)
RUN git clone -b v0.17.0.0 --depth 1 https://github.com/monero-project/monero && \ RUN git clone -b v0.17.3.0 --depth 1 https://github.com/monero-project/monero && \
cd monero && \ cd monero && \
git reset --hard d27d4526fe89b7cdeb4b296280c4a6cf7efe21f8 && \ git reset --hard ab18fea3500841fc312630d49ed6840b3aedb34d && \
cp -a contrib/depends / && \ cp -a contrib/depends / && \
cd .. && \ cd .. && \
rm -rf monero rm -rf monero

View File

@@ -360,7 +360,8 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Account") + translationManager.emptyString text: qsTr("Account") + translationManager.emptyString
symbol: qsTr("T") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "T" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = accountButton parent.previousButton = accountButton
@@ -381,7 +382,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Send") + translationManager.emptyString text: qsTr("Send") + translationManager.emptyString
symbol: qsTr("S") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "S" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = transferButton parent.previousButton = transferButton
@@ -403,7 +404,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Address book") + translationManager.emptyString text: qsTr("Address book") + translationManager.emptyString
symbol: qsTr("B") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "B" + translationManager.emptyString
under: transferButton under: transferButton
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
@@ -425,7 +426,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Receive") + translationManager.emptyString text: qsTr("Receive") + translationManager.emptyString
symbol: qsTr("R") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "R" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = receiveButton parent.previousButton = receiveButton
@@ -447,7 +448,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Transactions") + translationManager.emptyString text: qsTr("Transactions") + translationManager.emptyString
symbol: qsTr("H") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "H" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = historyButton parent.previousButton = historyButton
@@ -469,7 +470,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Advanced") + translationManager.emptyString text: qsTr("Advanced") + translationManager.emptyString
symbol: qsTr("D") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "D" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = advancedButton parent.previousButton = advancedButton
@@ -490,7 +491,7 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
text: qsTr("Settings") + translationManager.emptyString text: qsTr("Settings") + translationManager.emptyString
symbol: qsTr("E") + translationManager.emptyString symbol: (isMac ? "⌘" : qsTr("Ctrl+")) + "E" + translationManager.emptyString
onClicked: { onClicked: {
parent.previousButton.checked = false parent.previousButton.checked = false
parent.previousButton = settingsButton parent.previousButton = settingsButton

View File

@@ -29,7 +29,7 @@ else
endif endif
default: default:
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE) mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
debug: debug:
mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D CMAKE_BUILD_TYPE=Debug .. && $(MAKE) VERBOSE=1 mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D CMAKE_BUILD_TYPE=Debug .. && $(MAKE) VERBOSE=1
@@ -38,20 +38,23 @@ depends:
cd build/$(target)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_TAG=$(tag) -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=$(root)/$(target)/share/toolchain.cmake ../../.. && $(MAKE) cd build/$(target)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_TAG=$(tag) -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=$(root)/$(target)/share/toolchain.cmake ../../.. && $(MAKE)
devmode: devmode:
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE) mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
clean: clean:
mkdir -p build && cd build && rm -rf * mkdir -p build && cd build && rm -rf *
scanner: scanner:
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D WITH_SCANNER=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE) mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D WITH_SCANNER=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
release: release:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE) mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
release-linux-armv8: release-linux-armv8:
mkdir -p $(builddir)/release mkdir -p $(builddir)/release
cd $(builddir)/release cd $(builddir)/release
cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE) cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE)
release-linux-ppc64le:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="ppc64le" -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)
release-static: release-static:
mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE) mkdir -p $(builddir)/release && cd $(builddir)/release && cmake -D STATIC=ON -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release $(topdir) && $(MAKE)

View File

@@ -2,12 +2,29 @@
Copyright (c) 2014-2019, The Monero Project Copyright (c) 2014-2019, The Monero Project
## Table of Contents
* [Development resources](#development-resources)
* [Vulnerability response](#vulnerability-response)
* [Introduction](#introduction)
* [About this project](#about-this-project)
* [Supporting the project](#supporting-the-project)
* [License](#license)
* [Translations](#translations)
* [Installing the Monero GUI from a package](#installing-the-monero-gui-from-a-package)
* [Compiling the Monero GUI from source](#compiling-the-monero-gui-from-source)
+ [Building Reproducible Windows static binaries with Docker (any OS)](#building-reproducible-windows-static-binaries-with-docker-any-os)
+ [Building Reproducible Linux static binaries with Docker (any OS)](#building-reproducible-linux-static-binaries-with-docker-any-os)
+ [Building Android APK with Docker (any OS) *Experimental*](#building-android-apk-with-docker-any-os-experimental)
+ [Building on Linux](#building-on-linux)
+ [Building on OS X](#building-on-os-x)
+ [Building on Windows](#building-on-windows)
## Development resources ## Development resources
- Web: [getmonero.org](https://getmonero.org) - Web: [getmonero.org](https://getmonero.org)
- Mail: [dev@getmonero.org](mailto:dev@getmonero.org) - Mail: [dev@getmonero.org](mailto:dev@getmonero.org)
- Github: [https://github.com/monero-project/monero-gui](https://github.com/monero-project/monero-gui) - 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) - IRC: [#monero-gui on Libera](irc://irc.libera.chat/#monero-gui)
- Translation platform (Weblate): [translate.getmonero.org](https://translate.getmonero.org) - Translation platform (Weblate): [translate.getmonero.org](https://translate.getmonero.org)
- UI Design: [Monero-GUI on Figma](https://www.figma.com/file/DplJ2DDQfIKiuRvolHX2hN/Monero-GUI) - UI Design: [Monero-GUI on Figma](https://www.figma.com/file/DplJ2DDQfIKiuRvolHX2hN/Monero-GUI)
@@ -58,9 +75,10 @@ See [LICENSE](LICENSE).
Do you speak a second language and would like to help translate the Monero GUI? Check out Weblate, our localization platform, at [translate.getmonero.org](https://translate.getmonero.org/). Choose the language and suggest a translation for a string or review an existing one. The Localization Workgroup made [a guide with step-by-step instructions](https://github.com/monero-ecosystem/monero-translations/blob/master/weblate.md) for Weblate. Do you speak a second language and would like to help translate the Monero GUI? Check out Weblate, our localization platform, at [translate.getmonero.org](https://translate.getmonero.org/). Choose the language and suggest a translation for a string or review an existing one. The Localization Workgroup made [a guide with step-by-step instructions](https://github.com/monero-ecosystem/monero-translations/blob/master/weblate.md) for Weblate.
If you need help/support or any info you can contact the localization workgroup on the IRC channel #monero-translations (relayed on matrix/riot and MatterMost) or by email at translate[at]getmonero[dot]org. For more info about the Localization workgroup: [github.com/monero-ecosystem/monero-translations](https://github.com/monero-ecosystem/monero-translations) If you need help/support or any info you can contact the localization workgroup on the IRC channel #monero-translations (relayed on [Matrix](https://matrix.to/#/!BKMbQLMDzHKzmtrBfg:matrix.org?via=monero.social&via=matrix.org&via=libera.chat)) or by email at translate[at]getmonero[dot]org. For more info about the Localization workgroup: [github.com/monero-ecosystem/monero-translations](https://github.com/monero-ecosystem/monero-translations)
Status of the translations: Status of the translations:
<a href="https://translate.getmonero.org/engage/monero/?utm_source=widget"> <a href="https://translate.getmonero.org/engage/monero/?utm_source=widget">
<img src="https://translate.getmonero.org/widgets/monero/-/gui-wallet/horizontal-auto.svg" alt="Translation status" /> <img src="https://translate.getmonero.org/widgets/monero/-/gui-wallet/horizontal-auto.svg" alt="Translation status" />
</a> </a>
@@ -71,6 +89,7 @@ Packages are available for
* Arch Linux: [monero-gui](https://www.archlinux.org/packages/community/x86_64/monero-gui/) * Arch Linux: [monero-gui](https://www.archlinux.org/packages/community/x86_64/monero-gui/)
* Debian: See the [whonix/monero-gui repository](https://gitlab.com/whonix/monero-gui#how-to-install-monero-using-apt-get) * Debian: See the [whonix/monero-gui repository](https://gitlab.com/whonix/monero-gui#how-to-install-monero-using-apt-get)
* Void Linux: `xbps-install -S monero-gui` * Void Linux: `xbps-install -S monero-gui`
* Flatpak: [Monero GUI](https://flathub.org/apps/details/org.getmonero.Monero)
* GuixSD: `guix package -i monero-gui` * GuixSD: `guix package -i monero-gui`
* macOS (homebrew): `brew install --cask monero-wallet` * macOS (homebrew): `brew install --cask monero-wallet`
@@ -80,6 +99,8 @@ Packaging for your favorite distribution would be a welcome contribution!
*Note*: Qt 5.9.7 is the minimum version required to build the GUI. *Note*: Qt 5.9.7 is the minimum version required to build the GUI.
*Note*: Official GUI releases use monero-wallet-gui from this process alongside the supporting binaries (monerod, etc) from the [CLI deterministic builds](https://github.com/monero-project/monero/blob/master/contrib/gitian/README.md).
### Building Reproducible Windows static binaries with Docker (any OS) ### Building Reproducible Windows static binaries with Docker (any OS)
1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/) 1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
@@ -180,7 +201,7 @@ Packaging for your favorite distribution would be a welcome contribution!
http://<your.local.ip>:8080/QtApp-debug.apk http://<your.local.ip>:8080/QtApp-debug.apk
``` ```
### On Linux: ### Building on Linux
(Tested on Ubuntu 17.10 x64, Ubuntu 18.04 x64 and Gentoo x64) (Tested on Ubuntu 17.10 x64, Ubuntu 18.04 x64 and Gentoo x64)
@@ -211,6 +232,9 @@ The following instructions will fetch Qt from your distribution's repositories i
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev` `sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
- For Gentoo - For Gentoo
The *qml* USE flag must be enabled.
`sudo emerge dev-qt/qtcore:5 dev-qt/qtdeclarative:5 dev-qt/qtquickcontrols:5 dev-qt/qtquickcontrols2:5 dev-qt/qtgraphicaleffects:5` `sudo emerge dev-qt/qtcore:5 dev-qt/qtdeclarative:5 dev-qt/qtquickcontrols:5 dev-qt/qtquickcontrols2:5 dev-qt/qtgraphicaleffects:5`
@@ -220,9 +244,7 @@ The following instructions will fetch Qt from your distribution's repositories i
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia` `sudo apt install qtmultimedia5-dev qml-module-qtmultimedia`
- For Gentoo - For Gentoo
The *qml* USE flag must be enabled.
`emerge dev-qt/qtmultimedia:5` `emerge dev-qt/qtmultimedia:5`
@@ -236,15 +258,24 @@ The following instructions will fetch Qt from your distribution's repositories i
4. Build 4. Build
If on x86-64:
``` ```
make release -j4 make release -j4
``` ```
If on ppc64le:
```
make release-linux-ppc64le -j4
```
\* `4` - number of CPU threads to use \* `4` - number of CPU threads to use
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/gcc_64 make release -j4` \* Add `CMAKE_PREFIX_PATH` environment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/gcc_64 make release -j4`
The executable can be found in the build/release/bin folder. The executable can be found in the build/release/bin folder.
### On OS X: ### Building on OS X
1. Install Xcode from AppStore 1. Install Xcode from AppStore
@@ -252,7 +283,7 @@ The executable can be found in the build/release/bin folder.
3. Install [monero](https://github.com/monero-project/monero) dependencies: 3. Install [monero](https://github.com/monero-project/monero) dependencies:
`brew install boost hidapi zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf libgcrypt` `brew install cmake pkg-config openssl boost unbound hidapi zmq libpgm libsodium miniupnpc ldns expat libunwind-headers protobuf libgcrypt`
4. Install Qt: 4. Install Qt:
@@ -271,13 +302,13 @@ The executable can be found in the build/release/bin folder.
make release -j4 make release -j4
``` ```
\* `4` - number of CPU threads to use \* `4` - number of CPU threads to use
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/clang_64 make release -j4` \* Add `CMAKE_PREFIX_PATH` environment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/clang_64 make release -j4`
The executable can be found in the `build/release/bin` folder. The executable can be found in the `build/release/bin` folder.
For building an application bundle see `DEPLOY.md`. For building an application bundle see `DEPLOY.md`.
### On Windows: ### Building on Windows
The Monero GUI on Windows is 64 bits only; 32-bit Windows GUI builds are not officially supported anymore. The Monero GUI on Windows is 64 bits only; 32-bit Windows GUI builds are not officially supported anymore.

View File

@@ -17,11 +17,7 @@ if(APPLE OR (WIN32 AND NOT STATIC))
add_custom_command(TARGET deploy add_custom_command(TARGET deploy
POST_BUILD POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/ COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib COMMENT "Copying libqsvg.dylib"
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/ QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui. framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
COMMENT "Copying libqsvg.dylib, running install_name_tool"
) )
endif() endif()

View File

@@ -1,56 +0,0 @@
# Copyright (c) 2014-2020, The Monero Project
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are
# permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be
# used to endorse or promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# - Try to find readline include dirs and libraries
#
# Automatically finds ccache build accelerator, if it's found in PATH.
#
# Usage of this module as follows:
#
# project(monero)
# include(FindCcache) # Include AFTER the project() macro to be able to reach the CMAKE_CXX_COMPILER variable
#
# Properties modified by this module:
#
# GLOBAL PROPERTY RULE_LAUNCH_COMPILE set to ccache, when ccache found
# GLOBAL PROPERTY RULE_LAUNCH_LINK set to ccache, when ccache found
find_program(CCACHE_FOUND ccache)
if (CCACHE_FOUND)
set(TEMP_CPP_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test-program.cpp")
file(WRITE "${TEMP_CPP_FILE}" "int main() { return 0; }")
execute_process(COMMAND "${CCACHE_FOUND}" "${CMAKE_CXX_COMPILER}" "${TEMP_CPP_FILE}" RESULT_VARIABLE RET)
if (${RET} EQUAL 0)
message("found usable ccache: ${CCACHE_FOUND}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_FOUND}")
else()
message("found ccache ${CCACHE_FOUND}, but is UNUSABLE! Return code: ${RET}")
endif()
else()
message("ccache NOT found!")
endif()

View File

@@ -1,67 +0,0 @@
# Copyright (c) 2014-2019, The Monero Project
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are
# permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be
# used to endorse or promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
function (git_get_version_tag git directory result_var)
execute_process(COMMAND "${git}" rev-parse --short HEAD
WORKING_DIRECTORY ${directory}
OUTPUT_VARIABLE COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT COMMIT)
message(WARNING "${directory}: cannot determine current commit. Make sure that you are building from a Git working tree")
set(${result_var} "unknown" PARENT_SCOPE)
return()
endif()
execute_process(COMMAND "${git}" describe --tags --exact-match
WORKING_DIRECTORY ${directory}
OUTPUT_VARIABLE TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(TAG)
message(STATUS "${directory}: building tagged release ${TAG}-${COMMIT}")
set(${result_var} "${TAG}-${COMMIT}" PARENT_SCOPE)
return()
endif()
execute_process(COMMAND "${git}" describe --tags --long
WORKING_DIRECTORY ${directory}
OUTPUT_VARIABLE MOST_RECENT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(MOST_RECENT_TAG)
message(STATUS "${directory}: ahead of or behind a tagged release, building ${MOST_RECENT_TAG}")
set(${result_var} "${MOST_RECENT_TAG}" PARENT_SCOPE)
return()
endif()
message(STATUS "${directory}: building ${COMMIT} commit")
set(${result_var} "${COMMIT}" PARENT_SCOPE)
endfunction()

View File

@@ -26,7 +26,8 @@
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF # 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. # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
function (write_static_version_header VERSION_TAG_GUI) function (write_static_version_header tag)
set(VERSION_TAG_GUI "${tag}" CACHE STRING "The tag portion of the Monero GUI software version" FORCE)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/version.js.in" "${CMAKE_CURRENT_SOURCE_DIR}/version.js") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/version.js.in" "${CMAKE_CURRENT_SOURCE_DIR}/version.js")
endfunction () endfunction ()
@@ -36,11 +37,8 @@ if ("$Format:$" STREQUAL "")
write_static_version_header("release") write_static_version_header("release")
elseif (GIT_FOUND OR Git_FOUND) elseif (GIT_FOUND OR Git_FOUND)
message(STATUS "Found Git: ${GIT_EXECUTABLE}") message(STATUS "Found Git: ${GIT_EXECUTABLE}")
get_version_tag_from_git("${GIT_EXECUTABLE}")
include(GitGetVersionTag) write_static_version_header(${VERSIONTAG})
git_get_version_tag(${GIT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR} VERSION_TAG_GUI)
STRING(REGEX REPLACE "^v([0-9])" "\\1" VERSION_TAG_GUI ${VERSION_TAG_GUI})
write_static_version_header(${VERSION_TAG_GUI})
else() else()
message(STATUS "WARNING: Git was not found!") message(STATUS "WARNING: Git was not found!")
write_static_version_header("unknown") write_static_version_header("unknown")

View File

@@ -1,52 +0,0 @@
// Copyright (c) 2014-2019, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <libusb.h>
#define UNUSED(expr) (void)(expr)
int main(int argc, char *argv[]) {
libusb_device **devs;
libusb_context *ctx = NULL;
int r = libusb_init(&ctx); UNUSED(r);
ssize_t cnt = libusb_get_device_list(ctx, &devs); UNUSED(cnt);
struct libusb_device_descriptor desc;
r = libusb_get_device_descriptor(devs[0], &desc); UNUSED(r);
uint8_t bus_id = libusb_get_bus_number(devs[0]); UNUSED(bus_id);
uint8_t addr = libusb_get_device_address(devs[0]); UNUSED(addr);
uint8_t tmp_path[16];
r = libusb_get_port_numbers(devs[0], tmp_path, sizeof(tmp_path));
UNUSED(r);
UNUSED(tmp_path);
libusb_free_device_list(devs, 1);
libusb_exit(ctx);
}

View File

@@ -22,6 +22,7 @@ RowLayout {
MoneroComponents.Label { MoneroComponents.Label {
id: title id: title
fontSize: 14 fontSize: 14
tooltipIconVisible: true
} }
Rectangle { Rectangle {
@@ -36,27 +37,30 @@ RowLayout {
Layout.fillWidth: false Layout.fillWidth: false
Layout.alignment: Qt.AlignTop | Qt.AlignLeft Layout.alignment: Qt.AlignTop | Qt.AlignLeft
spacing: 4 spacing: 4
RowLayout { RowLayout {
Layout.fillWidth: false Layout.fillWidth: false
spacing: 12 spacing: 12
Layout.alignment: Qt.AlignTop | Qt.AlignLeft Layout.alignment: Qt.AlignTop | Qt.AlignLeft
StandardButton { StandardButton {
id: button1 id: button1
small: true small: true
primary: false
visible: button1.text visible: button1.text
} }
StandardButton { StandardButton {
id: button2 id: button2
small: true small: true
primary: false
visible: button2.text visible: button2.text
} }
StandardButton { StandardButton {
id: button3 id: button3
small: true small: true
primary: false
visible: button3.text visible: button3.text
} }
} }

View File

@@ -48,6 +48,8 @@ Item {
property int fontSize: 14 property int fontSize: 14
property alias fontColor: label.color property alias fontColor: label.color
property bool iconOnTheLeft: true property bool iconOnTheLeft: true
property alias tooltipIconVisible: label.tooltipIconVisible
property alias tooltip: label.tooltip
signal clicked() signal clicked()
height: 25 height: 25
@@ -121,7 +123,10 @@ Item {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onEntered: !label.tooltipIconVisible && label.tooltip ? label.tooltipPopup.open() : ""
onExited: !label.tooltipIconVisible && label.tooltip ? label.tooltipPopup.close() : ""
onClicked: { onClicked: {
toggle() toggle()
} }

View File

@@ -5,14 +5,21 @@ import FontAwesome 1.0
import "../components" as MoneroComponents import "../components" as MoneroComponents
MouseArea { MouseArea {
signal cut()
signal copy()
signal paste() signal paste()
signal remove()
signal selectAll()
id: root id: root
acceptedButtons: Qt.RightButton acceptedButtons: Qt.RightButton
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
if (mouse.button === Qt.RightButton) if (mouse.button === Qt.RightButton) {
root.parent.persistentSelection = true;
contextMenu.open() contextMenu.open()
root.parent.cursorVisible = true;
}
} }
Menu { Menu {
@@ -22,19 +29,50 @@ MouseArea {
border.color: MoneroComponents.Style.buttonBackgroundColorDisabledHover border.color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
border.width: 1 border.width: 1
radius: 2 radius: 2
color: MoneroComponents.Style.buttonBackgroundColorDisabled color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.buttonBackgroundColorDisabled : "#E5E5E5"
} }
padding: 1 padding: 1
width: 100 width: 110
x: root.mouseX x: root.mouseX
y: root.mouseY y: root.mouseY
onClosed: {
if (!root.parent.activeFocus) {
root.parent.cursorVisible = false;
}
root.parent.persistentSelection = false;
root.parent.forceActiveFocus()
}
MoneroComponents.ContextMenuItem {
enabled: root.parent.selectedText != "" && !root.parent.readOnly
onTriggered: root.cut()
text: qsTr("Cut") + translationManager.emptyString
}
MoneroComponents.ContextMenuItem {
enabled: root.parent.selectedText != ""
onTriggered: root.copy()
text: qsTr("Copy") + translationManager.emptyString
}
MoneroComponents.ContextMenuItem { MoneroComponents.ContextMenuItem {
enabled: root.parent.canPaste === true enabled: root.parent.canPaste === true
glyphIcon: FontAwesome.paste
onTriggered: root.paste() onTriggered: root.paste()
text: qsTr("Paste") + translationManager.emptyString text: qsTr("Paste") + translationManager.emptyString
} }
MoneroComponents.ContextMenuItem {
enabled: root.parent.selectedText != "" && !root.parent.readOnly
onTriggered: root.remove()
text: qsTr("Delete") + translationManager.emptyString
}
MoneroComponents.ContextMenuItem {
enabled: root.parent.text != ""
onTriggered: root.selectAll()
text: qsTr("Select All") + translationManager.emptyString
}
} }
} }

View File

@@ -13,21 +13,31 @@ MenuItem {
background: Rectangle { background: Rectangle {
color: MoneroComponents.Style.buttonBackgroundColorDisabledHover color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
opacity: mouse.containsMouse ? 1 : 0 opacity: 0
MouseArea { MouseArea {
id: mouse id: mouse
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onClicked: menuItem.triggered() onEntered: {
visible: menuItem.enabled parent.opacity = 1;
}
onExited: {
parent.opacity = 0;
}
onClicked: {
if (menuItem.enabled) {
menuItem.triggered();
parent.opacity = 0;
}
}
} }
} }
contentItem: RowLayout { contentItem: RowLayout {
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 10 anchors.leftMargin: 20
anchors.rightMargin: 10 anchors.rightMargin: 10
opacity: menuItem.enabled ? 1 : 0.4 opacity: menuItem.enabled ? 1 : 0.4
spacing: 8 spacing: 8
@@ -42,7 +52,7 @@ MenuItem {
} }
Text { Text {
color: MoneroComponents.Style.buttonTextColor color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.buttonTextColor : MoneroComponents.Style.defaultFontColor
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14 font.pixelSize: 14
Layout.fillWidth: true Layout.fillWidth: true

View File

@@ -32,6 +32,7 @@ import QtQuick.Controls 2.2 as QtQuickControls2
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import QtQuick.Controls.Styles 1.2 import QtQuick.Controls.Styles 1.2
import FontAwesome 1.0
import "." as MoneroComponents import "." as MoneroComponents
import "effects/" as MoneroEffects import "effects/" as MoneroEffects
@@ -91,8 +92,8 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
height: parent.height - 1 height: parent.height - 1
anchors.leftMargin: datePicker.expanded ? 1 : 0 anchors.leftMargin: 0
anchors.rightMargin: datePicker.expanded ? 1 : 0 anchors.rightMargin: 0
radius: 4 radius: 4
y: 1 y: 1
color: datePicker.backgroundColor color: datePicker.backgroundColor
@@ -221,21 +222,18 @@ Item {
Layout.fillWidth: true Layout.fillWidth: true
color: "transparent" color: "transparent"
Image { MoneroEffects.ImageMask {
id: button id: button
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 10 anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
source: "qrc:///images/whiteDropIndicator.png" image: "qrc:///images/whiteDropIndicator.png"
visible: false height: 8
} width: 12
fontAwesomeFallbackIcon: FontAwesome.arrowDown
ColorOverlay { fontAwesomeFallbackSize: 14
source: button
anchors.fill: button
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
rotation: datePicker.expanded ? 180 : 0 rotation: datePicker.expanded ? 180 : 0
opacity: 1
} }
MouseArea { MouseArea {
@@ -252,12 +250,16 @@ Item {
id: popup id: popup
padding: 0 padding: 0
closePolicy: QtQuickControls2.Popup.CloseOnEscape | QtQuickControls2.Popup.CloseOnPressOutsideParent closePolicy: QtQuickControls2.Popup.CloseOnEscape | QtQuickControls2.Popup.CloseOnPressOutsideParent
onOpened: {
calendar.visibleMonth = currentDate.getMonth();
calendar.visibleYear = currentDate.getFullYear();
}
Rectangle { Rectangle {
id: calendarRect id: calendarRect
width: head.width width: head.width
x: head.x x: head.x
y: head.y + head.height + 10 y: head.y + head.height - 2
color: MoneroComponents.Style.middlePanelBackgroundColor color: MoneroComponents.Style.middlePanelBackgroundColor
border.width: 1 border.width: 1
@@ -266,11 +268,16 @@ Item {
clip: true clip: true
Behavior on height { Behavior on height {
NumberAnimation { duration: 100; easing.type: Easing.InQuad } NumberAnimation { duration: 150; easing.type: Easing.InQuad }
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
scrollGestureEnabled: false
onWheel: {
if (wheel.angleDelta.y > 0) return calendar.showPreviousMonth();
if (wheel.angleDelta.y < 0) return calendar.showNextMonth();
}
} }
Rectangle { Rectangle {
@@ -305,11 +312,6 @@ Item {
id: dayRect id: dayRect
anchors.fill: parent anchors.fill: parent
radius: parent.implicitHeight / 2 radius: parent.implicitHeight / 2
color: {
if(dayArea.pressed && styleData.visibleMonth)
return MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
return "transparent";
}
} }
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
@@ -327,19 +329,32 @@ Item {
text: styleData.date.getDate() text: styleData.date.getDate()
themeTransition: false themeTransition: false
color: { color: {
if(!styleData.visibleMonth) return MoneroComponents.Style.lightGreyFontColor if (currentDate.toDateString() === styleData.date.toDateString()) {
if(dayArea.pressed) return MoneroComponents.Style.defaultFontColor if (dayArea.containsMouse) {
if(styleData.today) return MoneroComponents.Style.orange dayRect.color = MoneroComponents.Style.buttonBackgroundColorHover;
return MoneroComponents.Style.defaultFontColor } else {
dayRect.color = MoneroComponents.Style.buttonBackgroundColor;
}
} else {
if (dayArea.containsMouse) {
dayRect.color = MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
} else {
dayRect.color = "transparent";
}
}
if(!styleData.valid) return "transparent"
if(styleData.date.toDateString() === (new Date()).toDateString()) return "#FFFF00"
if(!styleData.visibleMonth) return MoneroComponents.Style.lightGreyFontColor
if(dayArea.pressed) return MoneroComponents.Style.defaultFontColor
return MoneroComponents.Style.defaultFontColor
} }
} }
MouseArea { MouseArea {
id: dayArea id: dayArea
anchors.fill: parent anchors.fill: parent
visible: styleData.valid
hoverEnabled: true hoverEnabled: true
onEntered: dayRect.color = MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
onExited: dayRect.color = "transparent"
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
if(styleData.visibleMonth) { if(styleData.visibleMonth) {
@@ -397,18 +412,15 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: height
Image { MoneroEffects.ImageMask {
id: prevMonthIcon id: prevMonthIcon
anchors.centerIn: parent anchors.centerIn: parent
source: "qrc:///images/prevMonth.png" image: "qrc:///images/prevMonth.png"
visible: false height: 8
} width: 12
fontAwesomeFallbackIcon: FontAwesome.arrowLeft
ColorOverlay { fontAwesomeFallbackSize: 14
source: prevMonthIcon
anchors.fill: prevMonthIcon
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5
} }
MouseArea { MouseArea {
@@ -426,19 +438,16 @@ Item {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
width: height width: height
Image { MoneroEffects.ImageMask {
id: nextMonthIcon id: nextMonthIcon
anchors.centerIn: parent anchors.centerIn: parent
source: "qrc:///images/prevMonth.png" image: "qrc:///images/prevMonth.png"
visible: false height: 8
} width: 12
ColorOverlay {
source: nextMonthIcon
anchors.fill: nextMonthIcon
color: MoneroComponents.Style.defaultFontColor
opacity: 0.5
rotation: 180 rotation: 180
fontAwesomeFallbackIcon: FontAwesome.arrowLeft
fontAwesomeFallbackSize: 14
color: MoneroComponents.Style.defaultFontColor
} }
MouseArea { MouseArea {

View File

@@ -36,19 +36,28 @@ MoneroEffects.ImageMask {
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
image: "" image: ""
property alias tooltip: tooltip.text
signal clicked(var mouse) signal clicked(var mouse)
MoneroComponents.Tooltip {
id: tooltip
anchors.fill: parent
tooltipLeft: true
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onEntered: { onEntered: {
tooltip.text ? tooltip.tooltipPopup.open() : ""
button.width = button.width + 2 button.width = button.width + 2
button.height = button.height + 2 button.height = button.height + 2
} }
onExited: { onExited: {
tooltip.text ? tooltip.tooltipPopup.close() : ""
button.width = button.width - 2 button.width = button.width - 2
button.height = button.height - 2 button.height = button.height - 2
} }

View File

@@ -46,6 +46,9 @@ Item {
property alias fontStyleName: inlineText.font.styleName property alias fontStyleName: inlineText.font.styleName
property bool isFontAwesomeIcon: fontFamily == FontAwesome.fontFamily || fontFamily == FontAwesome.fontFamilySolid property bool isFontAwesomeIcon: fontFamily == FontAwesome.fontFamily || fontFamily == FontAwesome.fontFamilySolid
property alias buttonColor: rect.color property alias buttonColor: rect.color
property alias tooltip: tooltip.text
property alias tooltipLeft: tooltip.tooltipLeft
property alias tooltipBottom: tooltip.tooltipBottom
height: isFontAwesomeIcon ? 30 : 24 height: isFontAwesomeIcon ? 30 : 24
width: isFontAwesomeIcon ? height : inlineText.width + 16 width: isFontAwesomeIcon ? height : inlineText.width + 16
@@ -61,7 +64,7 @@ Item {
Rectangle{ Rectangle{
id: rect id: rect
anchors.fill: parent anchors.fill: parent
color: MoneroComponents.Style.buttonInlineBackgroundColor color: buttonArea.containsMouse ? MoneroComponents.Style.buttonInlineBackgroundColorHover : MoneroComponents.Style.buttonInlineBackgroundColor
radius: 4 radius: 4
@@ -82,19 +85,25 @@ Item {
} }
} }
MoneroComponents.Tooltip {
id: tooltip
anchors.fill: parent
}
MouseArea { MouseArea {
id: buttonArea id: buttonArea
cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
hoverEnabled: true hoverEnabled: true
anchors.fill: parent anchors.fill: parent
onClicked: doClick() onClicked: {
tooltip.text ? tooltip.tooltipPopup.close() : ""
doClick()
}
onEntered: { onEntered: {
rect.color = buttonColor ? buttonColor : "#707070"; tooltip.text ? tooltip.tooltipPopup.open() : ""
rect.opacity = 0.8;
} }
onExited: { onExited: {
rect.opacity = 1.0; tooltip.text ? tooltip.tooltipPopup.close() : ""
rect.color = buttonColor ? buttonColor : "#808080";
} }
} }
} }

View File

@@ -48,9 +48,16 @@ TextField {
MoneroComponents.ContextMenu { MoneroComponents.ContextMenu {
cursorShape: Qt.IBeamCursor cursorShape: Qt.IBeamCursor
onCut: textField.cut();
onCopy: textField.copy();
onPaste: { onPaste: {
textField.clear(); var previoustextFieldLength = textField.length
var previousCursorPosition = textField.cursorPosition;
textField.paste(); textField.paste();
textField.forceActiveFocus()
textField.cursorPosition = previousCursorPosition + (textField.length - previoustextFieldLength);
} }
onRemove: textField.remove(selectionStart, selectionEnd);
onSelectAll: textField.selectAll();
} }
} }

View File

@@ -129,6 +129,7 @@ Item {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
primary: false
small: true small: true
width: 120 width: 120
fontSize: 14 fontSize: 14

View File

@@ -71,9 +71,16 @@ TextArea {
MoneroComponents.ContextMenu { MoneroComponents.ContextMenu {
cursorShape: Qt.IBeamCursor cursorShape: Qt.IBeamCursor
onCut: textArea.cut();
onCopy: textArea.copy();
onPaste: { onPaste: {
textArea.clear(); var previoustextFieldLength = textArea.length
var previousCursorPosition = textArea.cursorPosition;
textArea.paste(); textArea.paste();
textArea.forceActiveFocus()
textArea.cursorPosition = previousCursorPosition + (textArea.length - previoustextFieldLength);
} }
onRemove: textArea.remove(selectionStart, selectionEnd);
onSelectAll: textArea.selectAll();
} }
} }

View File

@@ -35,7 +35,9 @@ Item {
id: item id: item
property alias text: label.text property alias text: label.text
property alias tooltip: label.tooltip property alias tooltip: label.tooltip
property alias tooltipIconVisible: label.tooltipIconVisible
property alias color: label.color property alias color: label.color
property alias labelMouseArea: labelMouseArea
property int textFormat: Text.PlainText property int textFormat: Text.PlainText
property string tipText: "" property string tipText: ""
property int fontSize: 16 property int fontSize: 16
@@ -71,9 +73,13 @@ Item {
onLinkActivated: item.linkActivated() onLinkActivated: item.linkActivated()
textFormat: parent.textFormat textFormat: parent.textFormat
MouseArea { MouseArea {
id: labelMouseArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton acceptedButtons: Qt.NoButton
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor cursorShape: parent.hoveredLink || (tooltip && !tooltipIconVisible) ? Qt.PointingHandCursor : Qt.ArrowCursor
onEntered: tooltip && !tooltipIconVisible ? parent.tooltipPopup.open() : undefined
onExited: tooltip && !tooltipIconVisible ? parent.tooltipPopup.close() : undefined
} }
} }
} }

View File

@@ -34,6 +34,7 @@ import "../components/effects/" as MoneroEffects
Label { Label {
id: item id: item
fontSize: 18 fontSize: 18
tooltipIconVisible: true
Rectangle { Rectangle {
anchors.top: item.bottom anchors.top: item.bottom

View File

@@ -53,26 +53,64 @@ Drawer {
color: "red" color: "red"
ListView { ListView {
id: languagesListView
clip: true clip: true
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
width: sideBar.width width: sideBar.width
height: sideBar.height height: sideBar.height
focus: true
model: langModel model: langModel
Keys.onUpPressed: currentIndex !== 0 ? currentIndex = currentIndex - 1 : ""
Keys.onBacktabPressed: currentIndex !== 0 ? currentIndex = currentIndex - 1 : ""
Keys.onDownPressed: currentIndex + 1 !== count ? currentIndex = currentIndex + 1 : ""
Keys.onTabPressed: currentIndex + 1 !== count ? currentIndex = currentIndex + 1 : ""
delegate: Rectangle { delegate: Rectangle {
id: item id: item
color: "transparent" color: index == languagesListView.currentIndex ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
width: sideBar.width width: sideBar.width
height: 32 height: 32
Accessible.role: Accessible.ListItem
Accessible.name: display_name
Keys.onEnterPressed: setSelectedItemAsLanguage();
Keys.onReturnPressed: setSelectedItemAsLanguage();
Keys.onSpacePressed: setSelectedItemAsLanguage();
function setSelectedItemAsLanguage() {
var locale_spl = locale.split("_");
// reload active translations
console.log(locale_spl[0]);
translationManager.setLanguage(locale_spl[0]);
// set wizard language settings
persistentSettings.locale = locale;
persistentSettings.language = display_name;
persistentSettings.language_wallet = wallet_language;
appWindow.showStatusMessage(qsTr("Language changed."), 3);
appWindow.toggleLanguageView();
}
Rectangle {
id: selectedIndicator
anchors.left: parent.left
anchors.leftMargin: 0
height: parent.height
width: 2
color: index == languagesListView.currentIndex ? MoneroComponents.Style.buttonBackgroundColor : "transparent"
}
Rectangle { Rectangle {
id: flagRect id: flagRect
height: 24 height: 24
width: 24 width: 24
anchors.left: parent.left anchors.left: selectedIndicator.right
anchors.leftMargin: 4 anchors.leftMargin: 4
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: "transparent" color: "transparent"
@@ -85,8 +123,8 @@ Drawer {
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 30 anchors.leftMargin: 32
font.bold: true font.bold: languagesListView.currentIndex == index ? true : false
font.pixelSize: 14 font.pixelSize: 14
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
text: display_name text: display_name
@@ -112,21 +150,7 @@ Drawer {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: setSelectedItemAsLanguage();
var locale_spl = locale.split("_");
// reload active translations
console.log(locale_spl[0]);
translationManager.setLanguage(locale_spl[0]);
// set wizard language settings
persistentSettings.locale = locale;
persistentSettings.language = display_name;
persistentSettings.language_wallet = wallet_language;
appWindow.showStatusMessage(qsTr("Language changed."), 3);
appWindow.toggleLanguageView();
}
hoverEnabled: true hoverEnabled: true
onEntered: { onEntered: {
// item.color = "#26FFFFFF" // item.color = "#26FFFFFF"
@@ -166,4 +190,12 @@ Drawer {
} }
} }
} }
function selectCurrentLanguage() {
for (var i = 0; i < langModel.count; ++i) {
if (langModel.get(i).display_name === persistentSettings.language) {
languagesListView.currentIndex = i;
}
}
}
} }

View File

@@ -33,14 +33,21 @@ import QtQuick.Layouts 1.1
import "../components" as MoneroComponents import "../components" as MoneroComponents
Item { ColumnLayout {
id: item id: item
Layout.fillWidth: true
default property alias content: inlineButtons.children default property alias content: inlineButtons.children
property alias input: input property alias input: input
property alias text: input.text property alias text: input.text
property int inputPaddingLeft: 10
property int inputPaddingRight: 10
property int inputPaddingTop: 10
property int inputPaddingBottom: 10
property int inputRadius: 4
property bool password: false property bool password: false
property bool passwordHidden: true property bool passwordHidden: true
property var passwordLinked: null property var passwordLinked: null
@@ -55,10 +62,8 @@ Item {
property real placeholderLeftMargin: { property real placeholderLeftMargin: {
if (placeholderCenter) { if (placeholderCenter) {
return undefined; return undefined;
} else if (inlineIcon.visible) {
return inlineIcon.width + inlineIcon.anchors.leftMargin + inputPadding;
} else { } else {
return inputPadding; return inputPaddingLeft;
} }
} }
@@ -66,16 +71,16 @@ Item {
property alias validator: input.validator property alias validator: input.validator
property alias readOnly : input.readOnly property alias readOnly : input.readOnly
property alias cursorPosition: input.cursorPosition property alias cursorPosition: input.cursorPosition
property alias inlineIcon: inlineIcon.visible
property bool copyButton: false property bool copyButton: false
property bool pasteButton: false
property alias copyButtonText: copyButtonId.text property alias copyButtonText: copyButtonId.text
property alias copyButtonEnabled: copyButtonId.enabled property alias copyButtonEnabled: copyButtonId.enabled
property bool borderDisabled: false property bool borderDisabled: false
property string borderColor: { property string borderColor: {
if(error && input.text !== ""){ if ((error && input.text !== "") || (errorWhenEmpty && input.text == "")) {
return MoneroComponents.Style.inputBorderColorInvalid; return MoneroComponents.Style.inputBorderColorInvalid;
} else if(input.activeFocus){ } else if (input.activeFocus) {
return MoneroComponents.Style.inputBorderColorActive; return MoneroComponents.Style.inputBorderColorActive;
} else { } else {
return MoneroComponents.Style.inputBorderColorInActive; return MoneroComponents.Style.inputBorderColorInActive;
@@ -87,6 +92,7 @@ Item {
property bool fontBold: false property bool fontBold: false
property alias fontColor: input.color property alias fontColor: input.color
property bool error: false property bool error: false
property bool errorWhenEmpty: false
property alias labelText: inputLabel.text property alias labelText: inputLabel.text
property alias labelColor: inputLabel.color property alias labelColor: inputLabel.color
property alias labelTextFormat: inputLabel.textFormat property alias labelTextFormat: inputLabel.textFormat
@@ -97,16 +103,13 @@ Item {
property alias labelWrapMode: inputLabel.wrapMode property alias labelWrapMode: inputLabel.wrapMode
property alias labelHorizontalAlignment: inputLabel.horizontalAlignment property alias labelHorizontalAlignment: inputLabel.horizontalAlignment
property bool showingHeader: inputLabel.text !== "" || copyButton property bool showingHeader: inputLabel.text !== "" || copyButton
property int inputHeight: 42 property int inputHeight: 39
property int inputPadding: 10
signal labelLinkActivated(); // input label, rich text <a> signal signal labelLinkActivated(); // input label, rich text <a> signal
signal editingFinished(); signal editingFinished();
signal accepted(); signal accepted();
signal textUpdated(); signal textUpdated();
height: showingHeader ? (inputLabel.height + inputItem.height + 2) : inputHeight
onActiveFocusChanged: activeFocus && input.forceActiveFocus() onActiveFocusChanged: activeFocus && input.forceActiveFocus()
onTextUpdated: { onTextUpdated: {
// check to remove placeholder text when there is content // check to remove placeholder text when there is content
@@ -152,45 +155,100 @@ Item {
} }
} }
MoneroComponents.TextPlain { spacing: 0
id: inputLabel Rectangle {
anchors.top: parent.top id: inputLabelRect
anchors.left: parent.left color: "transparent"
font.family: MoneroComponents.Style.fontRegular.name Layout.fillWidth: true
font.pixelSize: labelFontSize height: (inputLabel.height + 10)
font.bold: labelFontBold visible: showingHeader ? true : false
textFormat: Text.RichText
color: MoneroComponents.Style.defaultFontColor
onLinkActivated: item.labelLinkActivated()
MouseArea { MoneroComponents.TextPlain {
anchors.fill: parent id: inputLabel
acceptedButtons: Qt.NoButton anchors.top: parent.top
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor anchors.left: parent.left
} font.family: MoneroComponents.Style.fontRegular.name
} font.pixelSize: labelFontSize
font.bold: labelFontBold
textFormat: Text.RichText
color: MoneroComponents.Style.defaultFontColor
onLinkActivated: item.labelLinkActivated()
MoneroComponents.LabelButton { MouseArea {
id: copyButtonId anchors.fill: parent
text: qsTr("Copy") + translationManager.emptyString acceptedButtons: Qt.NoButton
anchors.right: parent.right cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
onClicked: { }
if (input.text.length > 0) { }
console.log("Copied to clipboard");
clipboard.setText(input.text); RowLayout {
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3); anchors.right: parent.right
spacing: 16
MoneroComponents.LabelButton {
id: copyButtonId
text: qsTr("Copy") + translationManager.emptyString
onClicked: {
if (input.text.length > 0) {
console.log("Copied to clipboard");
clipboard.setText(input.text);
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
}
}
visible: copyButton && input.text !== ""
}
MoneroComponents.LabelButton {
id: pasteButtonId
onClicked: {
input.clear();
input.paste();
}
text: qsTr("Paste") + translationManager.emptyString
visible: pasteButton
} }
} }
visible: copyButton && input.text !== ""
} }
Item{ MoneroComponents.Input {
id: inputItem id: input
height: inputHeight KeyNavigation.backtab: item.KeyNavigation.backtab
anchors.top: showingHeader ? inputLabel.bottom : parent.top KeyNavigation.tab: item.KeyNavigation.tab
anchors.topMargin: showingHeader ? 12 : 0 Layout.fillWidth: true
width: parent.width Layout.preferredHeight: inputHeight
clip: true
leftPadding: item.inputPaddingLeft
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPaddingRight + (password || passwordLinked ? 45 : 0)
topPadding: item.inputPaddingTop
bottomPadding: item.inputPaddingBottom
font.family: item.fontFamily
font.pixelSize: item.fontSize
font.bold: item.fontBold
onEditingFinished: item.editingFinished()
onAccepted: item.accepted();
onTextChanged: item.textUpdated()
echoMode: isPasswordHidden() ? TextInput.Password : TextInput.Normal
MoneroComponents.Label {
visible: password || passwordLinked
fontSize: 20
text: isPasswordHidden() ? FontAwesome.eye : FontAwesome.eyeSlash
opacity: eyeMouseArea.containsMouse ? 0.9 : 0.7
fontFamily: FontAwesome.fontFamily
anchors.right: parent.right
anchors.rightMargin: 15
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 1
MouseArea {
id: eyeMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onClicked: passwordToggle()
}
}
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: placeholderLabel id: placeholderLabel
@@ -221,69 +279,15 @@ Item {
anchors.fill: parent anchors.fill: parent
border.width: borderDisabled ? 0 : 1 border.width: borderDisabled ? 0 : 1
border.color: borderColor border.color: borderColor
radius: 4 radius: item.inputRadius
} }
Image { RowLayout {
id: inlineIcon id: inlineButtons
width: 26 anchors.verticalCenter: parent.verticalCenter
height: 26 anchors.right: parent.right
anchors.top: parent.top anchors.rightMargin: inputPaddingRight
anchors.topMargin: 8 spacing: 4
anchors.left: parent.left
anchors.leftMargin: 12
source: "qrc:///images/moneroIcon-28x28.png"
visible: false
}
MoneroComponents.Input {
id: input
anchors.fill: parent
anchors.leftMargin: inlineIcon.visible ? 44 : 0
font.family: item.fontFamily
font.pixelSize: item.fontSize
font.bold: item.fontBold
KeyNavigation.backtab: item.KeyNavigation.backtab
KeyNavigation.tab: item.KeyNavigation.tab
onEditingFinished: item.editingFinished()
onAccepted: item.accepted();
onTextChanged: item.textUpdated()
leftPadding: inputPadding
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPadding
topPadding: inputPadding
bottomPadding: inputPadding
echoMode: isPasswordHidden() ? TextInput.Password : TextInput.Normal
MoneroComponents.Label {
visible: password || passwordLinked
fontSize: 20
text: isPasswordHidden() ? FontAwesome.eye : FontAwesome.eyeSlash
opacity: eyeMouseArea.containsMouse ? 0.9 : 0.7
fontFamily: FontAwesome.fontFamily
anchors.right: parent.right
anchors.rightMargin: 15
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 1
MouseArea {
id: eyeMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onClicked: passwordToggle()
}
}
RowLayout {
id: inlineButtons
anchors.bottom: parent.bottom
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: inputPadding
anchors.bottomMargin: inputPadding
anchors.rightMargin: inputPadding
spacing: 4
}
} }
} }
} }

View File

@@ -68,6 +68,7 @@ ColumnLayout {
} }
property alias error: input.error property alias error: input.error
property alias cursorPosition: input.cursorPosition
property string labelFontColor: MoneroComponents.Style.defaultFontColor property string labelFontColor: MoneroComponents.Style.defaultFontColor
property bool labelFontBold: false property bool labelFontBold: false
@@ -91,6 +92,8 @@ ColumnLayout {
signal labelButtonClicked(); signal labelButtonClicked();
signal inputLabelLinkActivated(); signal inputLabelLinkActivated();
signal editingFinished(); signal editingFinished();
signal returnPressed();
signal enterPressed();
onActiveFocusChanged: activeFocus && input.forceActiveFocus() onActiveFocusChanged: activeFocus && input.forceActiveFocus()
@@ -176,6 +179,8 @@ ColumnLayout {
fontColor: item.fontColor fontColor: item.fontColor
mouseSelection: item.mouseSelection mouseSelection: item.mouseSelection
onEditingFinished: item.editingFinished() onEditingFinished: item.editingFinished()
Keys.onReturnPressed: item.returnPressed()
Keys.onEnterPressed: item.enterPressed()
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: placeholderLabel id: placeholderLabel

View File

@@ -32,6 +32,8 @@ import "." as MoneroComponents
Rectangle { Rectangle {
default property list<MoneroComponents.NavbarItem> items default property list<MoneroComponents.NavbarItem> items
property alias currentIndex: repeater.currentIndex
property alias previousIndex: repeater.previousIndex
color: "transparent" color: "transparent"
height: grid.height height: grid.height
@@ -100,7 +102,10 @@ Rectangle {
} }
Repeater { Repeater {
id: repeater
model: items.length model: items.length
property int currentIndex: 0
property int previousIndex: 0
RowLayout { RowLayout {
spacing: 0 spacing: 0
@@ -149,7 +154,11 @@ Rectangle {
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: items[index].selected() onClicked: {
repeater.previousIndex = repeater.currentIndex;
repeater.currentIndex = index;
items[index].selected()
}
} }
} }

View File

@@ -80,7 +80,7 @@ Rectangle {
if(item.connected == Wallet.ConnectionStatus_Connected){ if(item.connected == Wallet.ConnectionStatus_Connected){
return 1 return 1
} else { } else {
return 0.5 MoneroComponents.Style.blackTheme ? 0.5 : 0.3
} }
} }
@@ -92,7 +92,7 @@ Rectangle {
source: { source: {
if(appWindow.isMining) { if(appWindow.isMining) {
return "qrc:///images/miningxmr.png" return "qrc:///images/miningxmr.png"
} else if(item.connected == Wallet.ConnectionStatus_Connected) { } else if(item.connected == Wallet.ConnectionStatus_Connected || !MoneroComponents.Style.blackTheme) {
return "qrc:///images/lightning.png" return "qrc:///images/lightning.png"
} else { } else {
return "qrc:///images/lightning-white.png" return "qrc:///images/lightning-white.png"
@@ -126,8 +126,8 @@ Rectangle {
font.family: MoneroComponents.Style.fontMedium.name font.family: MoneroComponents.Style.fontMedium.name
font.bold: true font.bold: true
font.pixelSize: 13 font.pixelSize: 13
color: MoneroComponents.Style.dimmedFontColor color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.dimmedFontColor : MoneroComponents.Style.defaultFontColor
opacity: MoneroComponents.Style.blackTheme ? 0.65 : 0.5 opacity: MoneroComponents.Style.blackTheme ? 0.65 : 0.75
text: qsTr("Network status") + translationManager.emptyString text: qsTr("Network status") + translationManager.emptyString
themeTransition: false themeTransition: false
} }
@@ -159,16 +159,18 @@ Rectangle {
} }
} }
Text { MoneroComponents.TextPlain {
anchors.left: statusTextVal.right anchors.left: statusTextVal.right
anchors.leftMargin: 16 anchors.leftMargin: 16
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color: refreshMouseArea.containsMouse ? MoneroComponents.Style.dimmedFontColor : MoneroComponents.Style.defaultFontColor color: refreshMouseArea.containsMouse ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
font.family: FontAwesome.fontFamilySolid font.family: FontAwesome.fontFamilySolid
font.pixelSize: 24 font.pixelSize: 24
font.styleName: "Solid" font.styleName: "Solid"
opacity: iconItem.opacity * (refreshMouseArea.visible ? 1 : 0.5) opacity: 0.85
text: FontAwesome.random text: FontAwesome.random
themeTransition: false
tooltip: qsTr("Switch to another public remote node") + translationManager.emptyString;
visible: ( visible: (
!appWindow.disconnected && !appWindow.disconnected &&
!persistentSettings.useRemoteNode && !persistentSettings.useRemoteNode &&
@@ -181,6 +183,8 @@ Rectangle {
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
visible: true visible: true
onEntered: parent.tooltipPopup.open()
onExited: parent.tooltipPopup.close()
onClicked: { onClicked: {
const callback = function(result) { const callback = function(result) {
refreshMouseArea.visible = true; refreshMouseArea.visible = true;

View File

@@ -108,7 +108,11 @@ Item {
leftPanel.enabled = true leftPanel.enabled = true
middlePanel.enabled = true middlePanel.enabled = true
wizard.enabled = true wizard.enabled = true
titleBar.state = "default" if (rootItem.state == "wizard") {
titleBar.state = "essentials"
} else {
titleBar.state = "default"
}
root.visible = false; root.visible = false;
appWindow.hideBalanceForced = false; appWindow.hideBalanceForced = false;

View File

@@ -90,6 +90,9 @@ Rectangle {
if (!parsed.error) { if (!parsed.error) {
root.qrcode_decoded(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name, parsed.extra_parameters); root.qrcode_decoded(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name, parsed.extra_parameters);
root.state = "Stopped"; root.state = "Stopped";
} else if (walletManager.addressValid(data, appWindow.persistentSettings.nettype)) {
root.qrcode_decoded(data, "", "", "", "", null);
root.state = "Stopped";
} else { } else {
onNotifyError(parsed.error); onNotifyError(parsed.error);
} }

View File

@@ -82,9 +82,9 @@ GridLayout {
return addr + ":" + port; return addr + ":" + port;
} }
LineEdit { MoneroComponents.LineEdit {
id: daemonAddr id: daemonAddr
Layout.fillWidth: true Layout.preferredWidth: root.width/3
placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString
placeholderFontFamily: root.placeholderFontFamily placeholderFontFamily: root.placeholderFontFamily
placeholderFontBold: root.placeholderFontBold placeholderFontBold: root.placeholderFontBold
@@ -104,9 +104,9 @@ GridLayout {
text: initialHostPort[1] text: initialHostPort[1]
} }
LineEdit { MoneroComponents.LineEdit {
id: daemonPort id: daemonPort
Layout.fillWidth: true Layout.preferredWidth: root.width/3
placeholderText: qsTr("Port") + translationManager.emptyString placeholderText: qsTr("Port") + translationManager.emptyString
placeholderFontFamily: root.placeholderFontFamily placeholderFontFamily: root.placeholderFontFamily
placeholderFontBold: root.placeholderFontBold placeholderFontBold: root.placeholderFontBold

View File

@@ -59,7 +59,16 @@ ColumnLayout {
Rectangle { Rectangle {
height: 30 height: 30
Layout.fillWidth: true Layout.fillWidth: true
color: itemMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent" color: itemMouseArea.containsMouse || trustedDaemonCheckMark.labelMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
Rectangle {
visible: index === remoteNodesModel.selected
Layout.fillHeight: true
anchors.top: parent.top
anchors.bottom: parent.bottom
color: "darkgrey"
width: 2
}
Rectangle { Rectangle {
color: MoneroComponents.Style.appWindowBorderColor color: MoneroComponents.Style.appWindowBorderColor
@@ -80,8 +89,11 @@ ColumnLayout {
anchors.fill: parent anchors.fill: parent
anchors.rightMargin: 80 anchors.rightMargin: 80
color: "transparent" color: "transparent"
property var trusted: remoteNodesModel.get(index).trusted
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: addressText
width: parent.width - trustedDaemonCheckMark.width
color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
@@ -89,6 +101,24 @@ ColumnLayout {
font.pixelSize: 16 font.pixelSize: 16
text: address text: address
themeTransition: false themeTransition: false
elide: Text.ElideMiddle
}
MoneroComponents.Label {
id: trustedDaemonCheckMark
anchors.left: addressText.right
anchors.leftMargin: 3
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 2
z: itemMouseArea.z + 1
fontSize: 16
fontFamily: FontAwesome.fontFamilySolid
fontColor: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
styleName: "Solid"
visible: trusted
text: FontAwesome.shieldAlt
tooltip: qsTr("Trusted daemon") + translationManager.emptyString
themeTransition: false
} }
MouseArea { MouseArea {
@@ -103,17 +133,21 @@ ColumnLayout {
RowLayout { RowLayout {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 6
height: 30 height: 30
spacing: 10 spacing: 2
MoneroComponents.InlineButton { MoneroComponents.InlineButton {
buttonColor: "transparent" buttonColor: "transparent"
fontFamily: FontAwesome.fontFamily fontFamily: FontAwesome.fontFamily
fontPixelSize: 18 fontPixelSize: 18
text: FontAwesome.edit text: FontAwesome.edit
tooltip: qsTr("Edit remote node") + translationManager.emptyString
tooltipLeft: true
onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) { onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) {
remoteNodesModel.set(index, remoteNode) remoteNodesModel.set(index, remoteNode)
if (index === remoteNodesModel.selected) {
remoteNodesModel.applyRemoteNode(index)
}
}) })
} }
@@ -122,6 +156,8 @@ ColumnLayout {
fontFamily: FontAwesome.fontFamily fontFamily: FontAwesome.fontFamily
text: FontAwesome.times text: FontAwesome.times
visible: remoteNodesModel.count > 1 visible: remoteNodesModel.count > 1
tooltip: qsTr("Remove remote node") + translationManager.emptyString
tooltipLeft: true
onClicked: remoteNodesModel.removeSelectNextIfNeeded(index) onClicked: remoteNodesModel.removeSelectNextIfNeeded(index)
} }
} }

View File

@@ -10,6 +10,7 @@ ColumnLayout {
property alias description: area.text property alias description: area.text
property alias title: header.text property alias title: header.text
property bool isLast: false property bool isLast: false
property bool enabled: true
signal clicked() signal clicked()
Layout.fillWidth: true Layout.fillWidth: true
@@ -37,6 +38,7 @@ ColumnLayout {
width: parent.width width: parent.width
height: header.height + area.contentHeight height: header.height + area.contentHeight
color: "transparent"; color: "transparent";
opacity: settingsListItem.enabled ? 1 : 0.25
anchors.left: parent.left anchors.left: parent.left
anchors.bottomMargin: 4 anchors.bottomMargin: 4
anchors.topMargin: 4 anchors.topMargin: 4
@@ -102,6 +104,7 @@ ColumnLayout {
} }
MouseArea { MouseArea {
visible: settingsListItem.enabled
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true

View File

@@ -16,11 +16,11 @@ ColumnLayout {
spacing: 0 spacing: 0
Text { MoneroComponents.TextPlain {
id: label id: label
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
font.pixelSize: 14 font.pixelSize: 14
Layout.fillWidth: true font.family: MoneroComponents.Style.fontRegular.name
} }
QtQuickControls.Slider { QtQuickControls.Slider {

View File

@@ -39,19 +39,18 @@ Item {
property bool primary: true property bool primary: true
property string rightIcon: "" property string rightIcon: ""
property string rightIconInactive: "" property string rightIconInactive: ""
property color textColor: !button.enabled property color textColor: primary ? MoneroComponents.Style.buttonTextColor : MoneroComponents.Style.buttonSecondaryTextColor;
? MoneroComponents.Style.buttonTextColorDisabled
: primary
? MoneroComponents.Style.buttonTextColor
: MoneroComponents.Style.buttonSecondaryTextColor;
property bool small: false property bool small: false
property alias text: label.text property alias text: label.text
property alias fontBold: label.font.bold property alias fontBold: label.font.bold
property int fontSize: { property int fontSize: {
if(small) return 14; if(small) return 13.5;
else return 16; else return 16;
} }
property alias label: label property alias label: label
property alias tooltip: tooltip.text
property alias tooltipLeft: tooltip.tooltipLeft
property alias tooltipPopup: tooltip.tooltipPopup
signal clicked() signal clicked()
height: small ? 30 : 36 height: small ? 30 : 36
@@ -69,6 +68,7 @@ Item {
anchors.fill: parent anchors.fill: parent
radius: 3 radius: 3
border.width: parent.focus && parent.enabled ? 1 : 0 border.width: parent.focus && parent.enabled ? 1 : 0
opacity: 1
state: button.enabled ? "active" : "disabled" state: button.enabled ? "active" : "disabled"
Component.onCompleted: state = state Component.onCompleted: state = state
@@ -99,7 +99,14 @@ Item {
when: !button.enabled when: !button.enabled
PropertyChanges { PropertyChanges {
target: buttonRect target: buttonRect
color: MoneroComponents.Style.buttonBackgroundColorDisabled opacity: 0.5
color: primary
? MoneroComponents.Style.buttonBackgroundColor
: MoneroComponents.Style.buttonSecondaryBackgroundColor
}
PropertyChanges {
target: label
opacity: 0.5
} }
} }
] ]
@@ -119,7 +126,7 @@ Item {
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: label id: label
font.family: MoneroComponents.Style.fontBold.name font.family: MoneroComponents.Style.fontBold.name
font.bold: true font.bold: button.primary ? true : false
font.pixelSize: button.fontSize font.pixelSize: button.fontSize
color: !buttonArea.pressed ? button.textColor : "transparent" color: !buttonArea.pressed ? button.textColor : "transparent"
visible: text !== "" visible: text !== ""
@@ -142,7 +149,9 @@ Item {
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
width: button.small ? 16 : 20 width: button.small ? 16 : 20
height: button.small ? 16 : 20 height: button.small ? 16 : 20
opacity: buttonRect.opacity
source: { source: {
if (fontAwesomeIcon) return "";
if(button.rightIconInactive !== "" && !button.enabled) { if(button.rightIconInactive !== "" && !button.enabled) {
return button.rightIconInactive; return button.rightIconInactive;
} }
@@ -161,11 +170,18 @@ Item {
} }
} }
MoneroComponents.Tooltip {
id: tooltip
anchors.fill: parent
}
MouseArea { MouseArea {
id: buttonArea id: buttonArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onClicked: doClick() onClicked: doClick()
onEntered: tooltip.text ? tooltip.tooltipPopup.open() : ""
onExited: tooltip.text ? tooltip.tooltipPopup.close() : ""
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
} }

View File

@@ -171,6 +171,7 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: cancelButton id: cancelButton
primary: false
text: qsTr("Cancel") + translationManager.emptyString text: qsTr("Cancel") + translationManager.emptyString
onClicked: { onClicked: {
root.close() root.close()

View File

@@ -29,12 +29,16 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import FontAwesome 1.0
import QtQuick.Layouts 1.1
import "../components" as MoneroComponents import "../components" as MoneroComponents
import "../components/effects/" as MoneroEffects import "../components/effects/" as MoneroEffects
Item { ColumnLayout {
id: dropdown id: dropdown
Layout.fillWidth: true
property int itemTopMargin: 0 property int itemTopMargin: 0
property alias dataModel: repeater.model property alias dataModel: repeater.model
property string shadowPressedColor property string shadowPressedColor
@@ -44,46 +48,66 @@ Item {
property string textColor: MoneroComponents.Style.defaultFontColor property string textColor: MoneroComponents.Style.defaultFontColor
property alias currentIndex: columnid.currentIndex property alias currentIndex: columnid.currentIndex
readonly property alias expanded: popup.visible readonly property alias expanded: popup.visible
property int dropdownHeight: 42 property alias labelText: dropdownLabel.text
property int fontHeaderSize: 16 property alias labelColor: dropdownLabel.color
property alias labelTextFormat: dropdownLabel.textFormat
property alias labelWrapMode: dropdownLabel.wrapMode
property alias labelHorizontalAlignment: dropdownLabel.horizontalAlignment
property bool showingHeader: dropdownLabel.text !== ""
property int labelFontSize: 14
property bool labelFontBold: false
property int dropdownHeight: 39
property int fontSize: 14
property int fontItemSize: 14 property int fontItemSize: 14
property string colorBorder: MoneroComponents.Style.inputBorderColorInActive property string colorBorder: MoneroComponents.Style.inputBorderColorInActive
property string colorHeaderBackground: "transparent" property string colorHeaderBackground: "transparent"
property bool headerBorder: true property bool headerBorder: true
property bool headerFontBold: false property bool headerFontBold: false
height: dropdownHeight
signal changed(); signal changed();
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
Item { spacing: 0
id: head Rectangle {
anchors.left: parent.left id: dropdownLabelRect
anchors.right: parent.right color: "transparent"
anchors.top: parent.top Layout.fillWidth: true
anchors.topMargin: parent.itemTopMargin height: (dropdownLabel.height + 10)
height: dropdown.dropdownHeight visible: showingHeader ? true : false
Rectangle { MoneroComponents.TextPlain {
color: "transparent" id: dropdownLabel
border.width: dropdown.headerBorder ? 1 : 0 anchors.top: parent.top
border.color: dropdown.colorBorder anchors.left: parent.left
radius: 4 font.family: MoneroComponents.Style.fontRegular.name
anchors.fill: parent font.pixelSize: labelFontSize
font.bold: labelFontBold
textFormat: Text.RichText
color: MoneroComponents.Style.defaultFontColor
} }
}
Rectangle {
id: head
color: dropArea.containsMouse ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
border.width: dropdown.headerBorder ? 1 : 0
border.color: dropdown.colorBorder
radius: 4
Layout.fillWidth: true
Layout.preferredHeight: dropdownHeight
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 12 anchors.leftMargin: 10
anchors.right: dropIndicator.left anchors.right: dropIndicator.left
anchors.rightMargin: 12 anchors.rightMargin: 12
width: droplist.width
elide: Text.ElideRight elide: Text.ElideRight
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.bold: dropdown.headerFontBold font.bold: dropdown.headerFontBold
font.pixelSize: dropdown.fontHeaderSize font.pixelSize: dropdown.fontSize
color: dropdown.textColor color: dropdown.textColor
text: columnid.currentIndex < repeater.model.count ? qsTr(repeater.model.get(columnid.currentIndex).column1) + translationManager.emptyString : "" text: columnid.currentIndex < repeater.model.count ? qsTr(repeater.model.get(columnid.currentIndex).column1) + translationManager.emptyString : ""
} }
@@ -96,19 +120,15 @@ Item {
anchors.rightMargin: 12 anchors.rightMargin: 12
width: dropdownIcon.width width: dropdownIcon.width
Image { MoneroEffects.ImageMask {
id: dropdownIcon id: dropdownIcon
anchors.centerIn: parent anchors.centerIn: parent
source: "qrc:///images/whiteDropIndicator.png" image: "qrc:///images/whiteDropIndicator.png"
visible: false height: 8
} width: 12
fontAwesomeFallbackIcon: FontAwesome.arrowDown
ColorOverlay { fontAwesomeFallbackSize: 14
source: dropdownIcon
anchors.fill: dropdownIcon
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
rotation: dropdown.expanded ? 180 : 0
opacity: 1
} }
} }
@@ -117,7 +137,7 @@ Item {
anchors.fill: parent anchors.fill: parent
onClicked: dropdown.expanded ? popup.close() : popup.open() onClicked: dropdown.expanded ? popup.close() : popup.open()
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.ArrowCursor
} }
} }
@@ -128,7 +148,7 @@ Item {
Rectangle { Rectangle {
id: droplist id: droplist
x: dropdown.x anchors.left: parent.left
width: dropdown.width width: dropdown.width
y: head.y + head.height y: head.y + head.height
clip: true clip: true
@@ -171,7 +191,7 @@ Item {
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 0 anchors.rightMargin: 0
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.bold: true font.bold: false
font.pixelSize: fontItemSize font.pixelSize: fontItemSize
color: itemArea.containsMouse || index === columnid.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF" color: itemArea.containsMouse || index === columnid.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF"
text: qsTr(column1) + translationManager.emptyString text: qsTr(column1) + translationManager.emptyString
@@ -188,25 +208,11 @@ Item {
text: "" text: ""
} }
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
width: 3; height: 3
color: parent.color
}
Rectangle {
anchors.right: parent.right
anchors.top: parent.top
width: 3; height: 3
color: parent.color
}
MouseArea { MouseArea {
id: itemArea id: itemArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.ArrowCursor
onClicked: { onClicked: {
popup.close() popup.close()

View File

@@ -42,11 +42,12 @@ QtObject {
property string buttonBackgroundColorDisabled: blackTheme ? _b_buttonBackgroundColorDisabled : _w_buttonBackgroundColorDisabled property string buttonBackgroundColorDisabled: blackTheme ? _b_buttonBackgroundColorDisabled : _w_buttonBackgroundColorDisabled
property string buttonBackgroundColorDisabledHover: blackTheme ? _b_buttonBackgroundColorDisabledHover : _w_buttonBackgroundColorDisabledHover property string buttonBackgroundColorDisabledHover: blackTheme ? _b_buttonBackgroundColorDisabledHover : _w_buttonBackgroundColorDisabledHover
property string buttonInlineBackgroundColor: blackTheme ? _b_buttonInlineBackgroundColor : _w_buttonInlineBackgroundColor property string buttonInlineBackgroundColor: blackTheme ? _b_buttonInlineBackgroundColor : _w_buttonInlineBackgroundColor
property string buttonInlineBackgroundColorHover: blackTheme ? _b_buttonInlineBackgroundColorHover : _w_buttonInlineBackgroundColorHover
property string buttonTextColor: blackTheme ? _b_buttonTextColor : _w_buttonTextColor property string buttonTextColor: blackTheme ? _b_buttonTextColor : _w_buttonTextColor
property string buttonTextColorDisabled: blackTheme ? _b_buttonTextColorDisabled : _w_buttonTextColorDisabled property string buttonTextColorDisabled: blackTheme ? _b_buttonTextColorDisabled : _w_buttonTextColorDisabled
property string buttonSecondaryBackgroundColor: "#d9d9d9" property string buttonSecondaryBackgroundColor: blackTheme ? _b_buttonSecondaryBackgroundColor : _w_buttonSecondaryBackgroundColor
property string buttonSecondaryBackgroundColorHover: "#a6a6a6" property string buttonSecondaryBackgroundColorHover: blackTheme ? _b_buttonSecondaryBackgroundColorHover : _w_buttonSecondaryBackgroundColorHover
property string buttonSecondaryTextColor: "#4d4d4d" property string buttonSecondaryTextColor: blackTheme ? _b_buttonSecondaryTextColor : _w_buttonSecondaryTextColor
property string dividerColor: blackTheme ? _b_dividerColor : _w_dividerColor property string dividerColor: blackTheme ? _b_dividerColor : _w_dividerColor
property real dividerOpacity: blackTheme ? _b_dividerOpacity : _w_dividerOpacity property real dividerOpacity: blackTheme ? _b_dividerOpacity : _w_dividerOpacity
@@ -102,8 +103,12 @@ QtObject {
property string _b_buttonBackgroundColorDisabled: "#707070" property string _b_buttonBackgroundColorDisabled: "#707070"
property string _b_buttonBackgroundColorDisabledHover: "#808080" property string _b_buttonBackgroundColorDisabledHover: "#808080"
property string _b_buttonInlineBackgroundColor: "#707070" property string _b_buttonInlineBackgroundColor: "#707070"
property string _b_buttonInlineBackgroundColorHover: "#808080"
property string _b_buttonTextColor: "white" property string _b_buttonTextColor: "white"
property string _b_buttonTextColorDisabled: "black" property string _b_buttonTextColorDisabled: "black"
property string _b_buttonSecondaryBackgroundColor: "#707070"
property string _b_buttonSecondaryBackgroundColorHover: "#808080"
property string _b_buttonSecondaryTextColor: "white"
property string _b_dividerColor: "white" property string _b_dividerColor: "white"
property real _b_dividerOpacity: 0.20 property real _b_dividerOpacity: 0.20
@@ -158,9 +163,13 @@ QtObject {
property string _w_buttonBackgroundColorHover: "#E65E00" property string _w_buttonBackgroundColorHover: "#E65E00"
property string _w_buttonBackgroundColorDisabled: "#bbbbbb" property string _w_buttonBackgroundColorDisabled: "#bbbbbb"
property string _w_buttonBackgroundColorDisabledHover: "#D1D1D1" property string _w_buttonBackgroundColorDisabledHover: "#D1D1D1"
property string _w_buttonInlineBackgroundColor: "#bbbbbb" property string _w_buttonInlineBackgroundColor: "#d9d9d9"
property string _w_buttonInlineBackgroundColorHover: "#C8C8C8"
property string _w_buttonTextColor: "white" property string _w_buttonTextColor: "white"
property string _w_buttonTextColorDisabled: "black" property string _w_buttonTextColorDisabled: "black"
property string _w_buttonSecondaryBackgroundColor: "#d9d9d9"
property string _w_buttonSecondaryBackgroundColorHover: "#C8C8C8"
property string _w_buttonSecondaryTextColor: "#4d4d4d"
property string _w_dividerColor: "black" property string _w_dividerColor: "black"
property real _w_dividerOpacity: 0.20 property real _w_dividerOpacity: 0.20
@@ -185,7 +194,7 @@ QtObject {
property string _w_menuButtonImageRightColorActive: "#FA6800" property string _w_menuButtonImageRightColorActive: "#FA6800"
property string _w_menuButtonImageRightColor: "#808080" property string _w_menuButtonImageRightColor: "#808080"
property string _w_menuButtonImageDotArrowSource: "qrc:///images/arrow-right-medium-white.png" property string _w_menuButtonImageDotArrowSource: "qrc:///images/arrow-right-medium-white.png"
property string _w_inlineButtonTextColor: "black" property string _w_inlineButtonTextColor: "#4d4d4d"
property string _w_inlineButtonBorderColor: "transparent" property string _w_inlineButtonBorderColor: "transparent"
property string _w_appWindowBackgroundColor: "black" property string _w_appWindowBackgroundColor: "black"
property string _w_appWindowBorderColor: "#dedede" property string _w_appWindowBorderColor: "#dedede"

View File

@@ -13,6 +13,9 @@ Text {
property string themeTransitionBlackColor: "" property string themeTransitionBlackColor: ""
property string themeTransitionWhiteColor: "" property string themeTransitionWhiteColor: ""
property alias tooltip: tooltip.text property alias tooltip: tooltip.text
property alias tooltipLeft: tooltip.tooltipLeft
property alias tooltipIconVisible: tooltip.tooltipIconVisible
property alias tooltipPopup: tooltip.tooltipPopup
font.family: MoneroComponents.Style.fontMedium.name font.family: MoneroComponents.Style.fontMedium.name
font.bold: false font.bold: false
font.pixelSize: 14 font.pixelSize: 14
@@ -30,6 +33,6 @@ Text {
MoneroComponents.Tooltip { MoneroComponents.Tooltip {
id: tooltip id: tooltip
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.right anchors.left: tooltipIconVisible ? parent.right : parent.left
} }
} }

View File

@@ -110,12 +110,24 @@ Rectangle {
opacity: 0.75 opacity: 0.75
} }
MoneroComponents.Tooltip {
id: btnCloseWalletTooltip
anchors.fill: parent
text: qsTr("Close this wallet and return to main menu") + translationManager.emptyString
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor onEntered: {
onExited: parent.color = "transparent" parent.color = MoneroComponents.Style.titleBarButtonHoverColor
btnCloseWalletTooltip.tooltipPopup.open()
}
onExited: {
parent.color = "transparent"
btnCloseWalletTooltip.tooltipPopup.close()
}
onClicked: root.closeWalletClicked(leftPanel.visible) onClicked: root.closeWalletClicked(leftPanel.visible)
} }
} }
@@ -138,12 +150,24 @@ Rectangle {
opacity: 0.75 opacity: 0.75
} }
MoneroComponents.Tooltip {
id: btnLanguageToggleTooltip
anchors.fill: parent
text: qsTr("Change language") + translationManager.emptyString
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor onEntered: {
onExited: parent.color = "transparent" parent.color = MoneroComponents.Style.titleBarButtonHoverColor
btnLanguageToggleTooltip.tooltipPopup.open()
}
onExited: {
parent.color = "transparent"
btnLanguageToggleTooltip.tooltipPopup.close()
}
onClicked: root.languageClicked() onClicked: root.languageClicked()
} }
} }
@@ -165,12 +189,24 @@ Rectangle {
opacity: 0.75 opacity: 0.75
} }
MoneroComponents.Tooltip {
id: btnSwitchThemeTooltip
anchors.fill: parent
text: MoneroComponents.Style.blackTheme ? qsTr("Switch to light theme") : qsTr("Switch to dark theme") + translationManager.emptyString
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor onEntered: {
onExited: parent.color = "transparent" parent.color = MoneroComponents.Style.titleBarButtonHoverColor
btnSwitchThemeTooltip.tooltipPopup.open()
}
onExited: {
parent.color = "transparent"
btnSwitchThemeTooltip.tooltipPopup.close()
}
onClicked: { onClicked: {
MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme; MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme;
} }
@@ -346,6 +382,7 @@ Rectangle {
anchors.fill: parent anchors.fill: parent
propagateComposedEvents: true propagateComposedEvents: true
onPressed: previousPosition = globalCursor.getPosition() onPressed: previousPosition = globalCursor.getPosition()
onDoubleClicked: root.maximizeClicked()
onPositionChanged: { onPositionChanged: {
if (pressedButtons == Qt.LeftButton) { if (pressedButtons == Qt.LeftButton) {
var pos = globalCursor.getPosition() var pos = globalCursor.getPosition()

View File

@@ -35,15 +35,20 @@ import "." as MoneroComponents
Rectangle { Rectangle {
property alias text: tooltip.text property alias text: tooltip.text
property alias tooltipPopup: popup
property bool tooltipIconVisible: false
property bool tooltipLeft: false
property bool tooltipBottom: tooltipIconVisible ? false : true
color: "transparent" color: "transparent"
height: icon.height height: tooltipIconVisible ? icon.height : parent.height
width: icon.width width: tooltipIconVisible ? icon.width : parent.width
visible: text != "" visible: text != ""
Text { Text {
id: icon id: icon
color: MoneroComponents.Style.orange visible: tooltipIconVisible
color: MoneroComponents.Style.defaultFontColor
font.family: FontAwesome.fontFamily font.family: FontAwesome.fontFamily
font.pixelSize: 10 font.pixelSize: 10
font.styleName: "Regular" font.styleName: "Regular"
@@ -62,8 +67,9 @@ Rectangle {
} }
} }
Popup { ToolTip {
id: popup id: popup
height: tooltip.height + 20
background: Rectangle { background: Rectangle {
border.color: MoneroComponents.Style.buttonInlineBackgroundColor border.color: MoneroComponents.Style.buttonInlineBackgroundColor
@@ -73,14 +79,28 @@ Rectangle {
} }
closePolicy: Popup.NoAutoClose closePolicy: Popup.NoAutoClose
padding: 10 padding: 10
x: icon.x + icon.width x: tooltipLeft
y: icon.y - height ? (tooltipIconVisible ? icon.x - icon.width : parent.x - tooltip.width - 20 + parent.width/2)
: (tooltipIconVisible ? icon.x + icon.width : parent.x + parent.width/2)
y: tooltipBottom
? (tooltipIconVisible ? icon.y + height : parent.y + parent.height + 2)
: (tooltipIconVisible ? icon.y - height : parent.y - tooltip.height - 20)
enter: Transition {
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 150 }
}
exit: Transition {
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 150 }
}
delay: 200
RowLayout { RowLayout {
Layout.maximumWidth: 370
Text { Text {
id: tooltip id: tooltip
Layout.maximumWidth: 350 width: contentWidth
width: contentWidth > Layout.maximumWidth ? Layout.maximumWidth : contentWidth Layout.maximumWidth: 370
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 12 font.pixelSize: 12

View File

@@ -141,7 +141,7 @@ Rectangle {
function showFiatConversion(valueXMR) { function showFiatConversion(valueXMR) {
const fiatFee = fiatApiConvertToFiat(valueXMR); const fiatFee = fiatApiConvertToFiat(valueXMR);
return "%1 %2".arg(fiatFee < 0.01 ? "<0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol()); return "%1 %2".arg(fiatFee < 0.01 ? "&lt;0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol());
} }
ColumnLayout { ColumnLayout {

View File

@@ -4,4 +4,5 @@ add_library(quirc STATIC
quirc/lib/quirc.c quirc/lib/quirc.c
quirc/lib/version_db.c quirc/lib/version_db.c
) )
set_target_properties(quirc PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(quirc PUBLIC quirc/lib) target_include_directories(quirc PUBLIC quirc/lib)

View File

@@ -3,812 +3,72 @@ import QtQuick 2.9
Object { Object {
//Font Awesome version 5.15.3
FontLoader { FontLoader {
id: regular id: regular
source: "./fa-regular-400.ttf" source: "./fa-regular-400.otf"
} }
FontLoader { FontLoader {
id: brands id: brands
source: "./fa-brands-400.ttf" source: "./fa-brands-400.otf"
} }
FontLoader { FontLoader {
id: solid id: solid
source: "./fa-solid-900.ttf" source: "./fa-solid-900.otf"
} }
property string fontFamily: regular.name property string fontFamily: regular.name
property string fontFamilyBrands: brands.name property string fontFamilyBrands: brands.name
property string fontFamilySolid: solid.name property string fontFamilySolid: solid.name
// Icons // Icons used in Monero GUI (Font Awesome version 5.15.3)
// To add new icons, check unicodes in Font Awesome Free's Cheatsheet:
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/cheatsheet/free/regular
// https://fontawesome.com/v5/cheatsheet/free/brands
property string addressBook : "\uf2b9" property string addressBook : "\uf2b9"
property string addressBookO : "\uf2ba"
property string addressCard : "\uf2bb"
property string addressCardO : "\uf2bc"
property string adjust : "\uf042"
property string adn : "\uf170"
property string alignCenter : "\uf037"
property string alignJustify : "\uf039"
property string alignLeft : "\uf036"
property string alignRight : "\uf038"
property string amazon : "\uf270"
property string ambulance : "\uf0f9"
property string americanSignLanguageInterpreting : "\uf2a3"
property string anchor : "\uf13d"
property string android : "\uf17b"
property string angellist : "\uf209"
property string angleDoubleDown : "\uf103"
property string angleDoubleLeft : "\uf100"
property string angleDoubleRight : "\uf101"
property string angleDoubleUp : "\uf102"
property string angleDown : "\uf107"
property string angleLeft : "\uf104"
property string angleRight : "\uf105"
property string angleUp : "\uf106"
property string apple : "\uf179"
property string archive : "\uf187"
property string areaChart : "\uf1fe"
property string arrowCircleDown : "\uf0ab"
property string arrowCircleLeft : "\uf0a8"
property string arrowCircleODown : "\uf01a"
property string arrowCircleOLeft : "\uf190"
property string arrowCircleORight : "\uf18e"
property string arrowCircleOUp : "\uf01b"
property string arrowCircleRight : "\uf0a9" property string arrowCircleRight : "\uf0a9"
property string arrowCircleUp : "\uf0aa"
property string arrowDown : "\uf063" property string arrowDown : "\uf063"
property string arrowLeft : "\uf060" property string arrowLeft : "\uf060"
property string arrowRight : "\uf061" property string arrowRight : "\uf061"
property string arrowUp : "\uf062"
property string arrows : "\uf047"
property string arrowsAlt : "\uf0b2"
property string arrowsH : "\uf07e"
property string arrowsV : "\uf07d"
property string aslInterpreting : "\uf2a3"
property string assistiveListeningSystems : "\uf2a2"
property string asterisk : "\uf069"
property string at : "\uf1fa"
property string audioDescription : "\uf29e"
property string automobile : "\uf1b9"
property string backward : "\uf04a"
property string balanceScale : "\uf24e"
property string ban : "\uf05e"
property string bandcamp : "\uf2d5"
property string bank : "\uf19c"
property string barChart : "\uf080"
property string barChartO : "\uf080"
property string barcode : "\uf02a"
property string bars : "\uf0c9"
property string bath : "\uf2cd"
property string bathtub : "\uf2cd"
property string battery : "\uf240"
property string battery0 : "\uf244"
property string battery1 : "\uf243"
property string battery2 : "\uf242"
property string battery3 : "\uf241"
property string battery4 : "\uf240"
property string batteryEmpty : "\uf244"
property string batteryFull : "\uf240"
property string batteryHalf : "\uf242"
property string batteryQuarter : "\uf243"
property string batteryThreeQuarters : "\uf241"
property string bed : "\uf236"
property string beer : "\uf0fc"
property string behance : "\uf1b4"
property string behanceSquare : "\uf1b5"
property string bell : "\uf0f3"
property string bellO : "\uf0a2"
property string bellSlash : "\uf1f6"
property string bellSlashO : "\uf1f7"
property string bicycle : "\uf206"
property string binoculars : "\uf1e5"
property string birthdayCake : "\uf1fd"
property string bitbucket : "\uf171"
property string bitbucketSquare : "\uf172"
property string bitcoin : "\uf15a"
property string blackTie : "\uf27e"
property string blind : "\uf29d"
property string bluetooth : "\uf293"
property string bluetoothB : "\uf294"
property string bold : "\uf032"
property string bolt : "\uf0e7"
property string bomb : "\uf1e2"
property string book : "\uf02d"
property string bookmark : "\uf02e"
property string bookmarkO : "\uf097"
property string braille : "\uf2a1"
property string briefcase : "\uf0b1"
property string btc : "\uf15a"
property string bug : "\uf188"
property string building : "\uf1ad"
property string buildingO : "\uf0f7"
property string bullhorn : "\uf0a1"
property string bullseye : "\uf140"
property string bus : "\uf207"
property string buysellads : "\uf20d"
property string cab : "\uf1ba"
property string calculator : "\uf1ec"
property string calendar : "\uf073"
property string calendarCheckO : "\uf274"
property string calendarMinusO : "\uf272"
property string calendarO : "\uf133"
property string calendarPlusO : "\uf271"
property string calendarTimesO : "\uf273"
property string camera : "\uf030"
property string cameraRetro : "\uf083"
property string car : "\uf1b9"
property string caretDown : "\uf0d7"
property string caretLeft : "\uf0d9"
property string caretRight : "\uf0da"
property string caretSquareODown : "\uf150"
property string caretSquareOLeft : "\uf191"
property string caretSquareORight : "\uf152"
property string caretSquareOUp : "\uf151"
property string caretUp : "\uf0d8"
property string cartArrowDown : "\uf218"
property string cartPlus : "\uf217"
property string cashRegister: "\uf788" property string cashRegister: "\uf788"
property string cc : "\uf20a" property string checkCircle: "\uf058"
property string ccAmex : "\uf1f3"
property string ccDinersClub : "\uf24c"
property string ccDiscover : "\uf1f2"
property string ccJcb : "\uf24b"
property string ccMastercard : "\uf1f1"
property string ccPaypal : "\uf1f4"
property string ccStripe : "\uf1f5"
property string ccVisa : "\uf1f0"
property string certificate : "\uf0a3"
property string chain : "\uf0c1"
property string chainBroken : "\uf127"
property string check : "\uf00c"
property string checkCircle : "\uf058"
property string checkCircleO : "\uf05d"
property string checkSquare : "\uf14a"
property string checkSquareO : "\uf046"
property string chevronCircleDown : "\uf13a"
property string chevronCircleLeft : "\uf137"
property string chevronCircleRight : "\uf138"
property string chevronCircleUp : "\uf139"
property string chevronDown : "\uf078"
property string chevronLeft : "\uf053"
property string chevronRight : "\uf054"
property string chevronUp : "\uf077"
property string child : "\uf1ae"
property string chrome : "\uf268"
property string circle : "\uf111"
property string circleO : "\uf10c"
property string circleONotch : "\uf1ce"
property string circleThin : "\uf1db"
property string clipboard : "\uf0ea" property string clipboard : "\uf0ea"
property string clockO : "\uf017" property string clockO : "\uf017"
property string clone : "\uf24d"
property string close : "\uf00d"
property string cloud : "\uf0c2" property string cloud : "\uf0c2"
property string cloudDownload : "\uf0ed"
property string cloudUpload : "\uf0ee"
property string cny : "\uf157"
property string code : "\uf121"
property string codeFork : "\uf126"
property string codepen : "\uf1cb"
property string codiepie : "\uf284"
property string coffee : "\uf0f4"
property string cog : "\uf013"
property string cogs : "\uf085"
property string columns : "\uf0db"
property string comment : "\uf075"
property string commentO : "\uf0e5"
property string commenting : "\uf27a"
property string commentingO : "\uf27b"
property string comments : "\uf086"
property string commentsO : "\uf0e6"
property string compass : "\uf14e"
property string compress : "\uf066"
property string connectdevelop : "\uf20e"
property string contao : "\uf26d"
property string copy : "\uf0c5"
property string copyright : "\uf1f9"
property string creativeCommons : "\uf25e"
property string creditCard : "\uf09d"
property string creditCardAlt : "\uf283"
property string crop : "\uf125"
property string crosshairs : "\uf05b"
property string css3 : "\uf13c"
property string cube : "\uf1b2"
property string cubes : "\uf1b3"
property string cut : "\uf0c4"
property string cutlery : "\uf0f5"
property string dashboard : "\uf0e4"
property string dashcube : "\uf210"
property string database : "\uf1c0"
property string deaf : "\uf2a4"
property string deafness : "\uf2a4"
property string dedent : "\uf03b"
property string delicious : "\uf1a5"
property string desktop : "\uf108" property string desktop : "\uf108"
property string deviantart : "\uf1bd"
property string diamond : "\uf219"
property string digg : "\uf1a6"
property string dollar : "\uf155"
property string dotCircleO : "\uf192"
property string download : "\uf019"
property string dribbble : "\uf17d"
property string driversLicense : "\uf2c2"
property string driversLicenseO : "\uf2c3"
property string dropbox : "\uf16b"
property string drupal : "\uf1a9"
property string edge : "\uf282"
property string edit : "\uf044" property string edit : "\uf044"
property string eercast : "\uf2da"
property string eject : "\uf052"
property string ellipsisH : "\uf141" property string ellipsisH : "\uf141"
property string ellipsisV : "\uf142"
property string empire : "\uf1d1"
property string envelope : "\uf0e0"
property string envelopeO : "\uf003"
property string envelopeOpen : "\uf2b6"
property string envelopeOpenO : "\uf2b7"
property string envelopeSquare : "\uf199"
property string envira : "\uf299"
property string eraser : "\uf12d"
property string etsy : "\uf2d7"
property string eur : "\uf153"
property string euro : "\uf153"
property string exchange : "\uf0ec"
property string exclamation : "\uf12a"
property string exclamationCircle : "\uf06a" property string exclamationCircle : "\uf06a"
property string exclamationTriangle : "\uf071"
property string expand : "\uf065"
property string expeditedssl : "\uf23e"
property string externalLink : "\uf08e"
property string externalLinkSquare : "\uf14c"
property string eye : "\uf06e" property string eye : "\uf06e"
property string eyeSlash : "\uf070" property string eyeSlash : "\uf070"
property string eyedropper : "\uf1fb"
property string fa : "\uf2b4"
property string facebook : "\uf09a"
property string facebookF : "\uf09a"
property string facebookOfficial : "\uf230"
property string facebookSquare : "\uf082"
property string fastBackward : "\uf049"
property string fastForward : "\uf050"
property string fax : "\uf1ac"
property string feed : "\uf09e"
property string female : "\uf182"
property string fighterJet : "\uf0fb"
property string file : "\uf15b"
property string fileArchiveO : "\uf1c6"
property string fileAudioO : "\uf1c7"
property string fileCodeO : "\uf1c9"
property string fileExcelO : "\uf1c3"
property string fileImageO : "\uf1c5"
property string fileMovieO : "\uf1c8"
property string fileO : "\uf016"
property string filePdfO : "\uf1c1"
property string filePhotoO : "\uf1c5"
property string filePictureO : "\uf1c5"
property string filePowerpointO : "\uf1c4"
property string fileSoundO : "\uf1c7"
property string fileText : "\uf15c"
property string fileTextO : "\uf0f6"
property string fileVideoO : "\uf1c8"
property string fileWordO : "\uf1c2"
property string fileZipO : "\uf1c6"
property string filesO : "\uf0c5"
property string film : "\uf008"
property string filter : "\uf0b0"
property string fire : "\uf06d"
property string fireExtinguisher : "\uf134"
property string firefox : "\uf269"
property string firstOrder : "\uf2b0"
property string flag : "\uf024"
property string flagCheckered : "\uf11e"
property string flagO : "\uf11d"
property string flash : "\uf0e7"
property string flask : "\uf0c3"
property string flickr : "\uf16e"
property string floppyO : "\uf0c7"
property string folder : "\uf07b"
property string folderO : "\uf114"
property string folderOpen : "\uf07c" property string folderOpen : "\uf07c"
property string folderOpenO : "\uf115"
property string font : "\uf031"
property string fontAwesome : "\uf2b4"
property string fonticons : "\uf280"
property string fortAwesome : "\uf286"
property string forumbee : "\uf211"
property string forward : "\uf04e"
property string foursquare : "\uf180"
property string freeCodeCamp : "\uf2c5"
property string frownO : "\uf119"
property string futbolO : "\uf1e3"
property string gamepad : "\uf11b"
property string gavel : "\uf0e3"
property string gbp : "\uf154"
property string ge : "\uf1d1"
property string gear : "\uf013"
property string gears : "\uf085"
property string genderless : "\uf22d"
property string getPocket : "\uf265"
property string gg : "\uf260"
property string ggCircle : "\uf261"
property string gift : "\uf06b"
property string git : "\uf1d3"
property string gitSquare : "\uf1d2"
property string github : "\uf09b"
property string githubAlt : "\uf113"
property string githubSquare : "\uf092"
property string gitlab : "\uf296"
property string gittip : "\uf184"
property string glass : "\uf000"
property string glide : "\uf2a5"
property string glideG : "\uf2a6"
property string globe : "\uf0ac" property string globe : "\uf0ac"
property string google : "\uf1a0"
property string googlePlus : "\uf0d5"
property string googlePlusCircle : "\uf2b3"
property string googlePlusOfficial : "\uf2b3"
property string googlePlusSquare : "\uf0d4"
property string googleWallet : "\uf1ee"
property string graduationCap : "\uf19d"
property string gratipay : "\uf184"
property string grav : "\uf2d6"
property string group : "\uf0c0"
property string hSquare : "\uf0fd"
property string hackerNews : "\uf1d4"
property string handGrabO : "\uf255"
property string handLizardO : "\uf258"
property string handODown : "\uf0a7"
property string handOLeft : "\uf0a5"
property string handORight : "\uf0a4"
property string handOUp : "\uf0a6"
property string handPaperO : "\uf256"
property string handPeaceO : "\uf25b"
property string handPointerO : "\uf25a"
property string handRockO : "\uf255"
property string handScissorsO : "\uf257"
property string handSpockO : "\uf259"
property string handStopO : "\uf256"
property string handshakeO : "\uf2b5"
property string hardOfHearing : "\uf2a4"
property string hashtag : "\uf292"
property string hddO : "\uf0a0"
property string header : "\uf1dc"
property string headphones : "\uf025"
property string heart : "\uf004"
property string heartO : "\uf08a"
property string heartbeat : "\uf21e"
property string history : "\uf1da"
property string home : "\uf015" property string home : "\uf015"
property string hospitalO : "\uf0f8" property string houseUser : "\ue065"
property string hotel : "\uf236"
property string hourglass : "\uf254"
property string hourglass1 : "\uf251"
property string hourglass2 : "\uf252"
property string hourglass3 : "\uf253"
property string hourglassEnd : "\uf253"
property string hourglassHalf : "\uf252"
property string hourglassO : "\uf250"
property string hourglassStart : "\uf251"
property string houzz : "\uf27c"
property string html5 : "\uf13b"
property string iCursor : "\uf246"
property string idBadge : "\uf2c1"
property string idCard : "\uf2c2"
property string idCardO : "\uf2c3"
property string ils : "\uf20b"
property string image : "\uf03e"
property string imdb : "\uf2d8"
property string inbox : "\uf01c"
property string indent : "\uf03c"
property string industry : "\uf275"
property string infinity : "\uf534" property string infinity : "\uf534"
property string info : "\uf129" property string info : "\uf129"
property string infoCircle : "\uf05a"
property string inr : "\uf156"
property string instagram : "\uf16d"
property string institution : "\uf19c"
property string internetExplorer : "\uf26b"
property string intersex : "\uf224"
property string ioxhost : "\uf208"
property string italic : "\uf033"
property string joomla : "\uf1aa"
property string jpy : "\uf157"
property string jsfiddle : "\uf1cc"
property string key : "\uf084" property string key : "\uf084"
property string keyboardO : "\uf11c"
property string krw : "\uf159"
property string language : "\uf1ab" property string language : "\uf1ab"
property string laptop : "\uf109"
property string lastfm : "\uf202"
property string lastfmSquare : "\uf203"
property string leaf : "\uf06c"
property string leanpub : "\uf212"
property string legal : "\uf0e3"
property string lemonO : "\uf094"
property string levelDown : "\uf149"
property string levelUp : "\uf148"
property string lifeBouy : "\uf1cd"
property string lifeBuoy : "\uf1cd"
property string lifeRing : "\uf1cd"
property string lifeSaver : "\uf1cd"
property string lightbulbO : "\uf0eb"
property string lineChart : "\uf201"
property string link : "\uf0c1"
property string linkedin : "\uf0e1"
property string linkedinSquare : "\uf08c"
property string linode : "\uf2b8"
property string linux : "\uf17c"
property string list : "\uf03a"
property string listAlt : "\uf022"
property string listOl : "\uf0cb"
property string listUl : "\uf0ca"
property string locationArrow : "\uf124"
property string lock : "\uf023"
property string longArrowDown : "\uf175"
property string longArrowLeft : "\uf177"
property string longArrowRight : "\uf178"
property string longArrowUp : "\uf176"
property string lowVision : "\uf2a8"
property string magic : "\uf0d0"
property string magnet : "\uf076"
property string mailForward : "\uf064"
property string mailReply : "\uf112"
property string mailReplyAll : "\uf122"
property string male : "\uf183"
property string map : "\uf279"
property string mapMarker : "\uf041"
property string mapO : "\uf278"
property string mapPin : "\uf276"
property string mapSigns : "\uf277"
property string mars : "\uf222"
property string marsDouble : "\uf227"
property string marsStroke : "\uf229"
property string marsStrokeH : "\uf22b"
property string marsStrokeV : "\uf22a"
property string maxcdn : "\uf136"
property string meanpath : "\uf20c"
property string medium : "\uf23a"
property string medkit : "\uf0fa"
property string meetup : "\uf2e0"
property string mehO : "\uf11a"
property string mercury : "\uf223"
property string microchip : "\uf2db"
property string microphone : "\uf130"
property string microphoneSlash : "\uf131"
property string minus : "\uf068" property string minus : "\uf068"
property string minusCircle : "\uf056" property string minusCircle : "\uf056"
property string minusSquare : "\uf146"
property string minusSquareO : "\uf147"
property string mixcloud : "\uf289"
property string mobile : "\uf10b"
property string mobilePhone : "\uf10b"
property string modx : "\uf285"
property string money : "\uf0d6"
property string moonO : "\uf186" property string moonO : "\uf186"
property string mortarBoard : "\uf19d" property string monero : "\uf3d0"
property string motorcycle : "\uf21c"
property string mousePointer : "\uf245"
property string music : "\uf001"
property string navicon : "\uf0c9"
property string neuter : "\uf22c"
property string newspaperO : "\uf1ea"
property string objectGroup : "\uf247"
property string objectUngroup : "\uf248"
property string odnoklassniki : "\uf263"
property string odnoklassnikiSquare : "\uf264"
property string opencart : "\uf23d"
property string openid : "\uf19b"
property string opera : "\uf26a"
property string optinMonster : "\uf23c"
property string outdent : "\uf03b"
property string pagelines : "\uf18c"
property string paintBrush : "\uf1fc"
property string paperPlane : "\uf1d8"
property string paperPlaneO : "\uf1d9"
property string paperclip : "\uf0c6"
property string paragraph : "\uf1dd"
property string paste : "\uf0ea" property string paste : "\uf0ea"
property string pause : "\uf04c"
property string pauseCircle : "\uf28b"
property string pauseCircleO : "\uf28c"
property string paw : "\uf1b0"
property string paypal : "\uf1ed"
property string pencil : "\uf040"
property string pencilSquare : "\uf14b" property string pencilSquare : "\uf14b"
property string pencilSquareO : "\uf044"
property string percent : "\uf295"
property string phone : "\uf095"
property string phoneSquare : "\uf098"
property string photo : "\uf03e"
property string pictureO : "\uf03e"
property string pieChart : "\uf200"
property string piedPiper : "\uf2ae"
property string piedPiperAlt : "\uf1a8"
property string piedPiperPp : "\uf1a7"
property string pinterest : "\uf0d2"
property string pinterestP : "\uf231"
property string pinterestSquare : "\uf0d3"
property string plane : "\uf072"
property string play : "\uf04b"
property string playCircle : "\uf144"
property string playCircleO : "\uf01d"
property string plug : "\uf1e6"
property string plus : "\uf067" property string plus : "\uf067"
property string plusCircle : "\uf055" property string plusCircle : "\uf055"
property string plusSquare : "\uf0fe"
property string plusSquareO : "\uf196"
property string podcast : "\uf2ce"
property string powerOff : "\uf011"
property string printIcon : "\uf02f"
property string productHunt : "\uf288" property string productHunt : "\uf288"
property string puzzlePiece : "\uf12e"
property string qq : "\uf1d6"
property string qrcode : "\uf029" property string qrcode : "\uf029"
property string question : "\uf128"
property string questionCircle : "\uf059" property string questionCircle : "\uf059"
property string questionCircleO : "\uf29c"
property string quora : "\uf2c4"
property string quoteLeft : "\uf10d"
property string quoteRight : "\uf10e"
property string ra : "\uf1d0"
property string random : "\uf074" property string random : "\uf074"
property string ravelry : "\uf2d9"
property string rebel : "\uf1d0"
property string recycle : "\uf1b8"
property string reddit : "\uf1a1"
property string redditAlien : "\uf281"
property string redditSquare : "\uf1a2"
property string refresh : "\uf021"
property string registered : "\uf25d"
property string remove : "\uf00d"
property string renren : "\uf18b"
property string reorder : "\uf0c9"
property string repeat : "\uf01e" property string repeat : "\uf01e"
property string reply : "\uf112"
property string replyAll : "\uf122"
property string resistance : "\uf1d0"
property string retweet : "\uf079"
property string rmb : "\uf157"
property string road : "\uf018"
property string rocket : "\uf135"
property string rotateLeft : "\uf0e2"
property string rotateRight : "\uf01e"
property string rouble : "\uf158"
property string rss : "\uf09e"
property string rssSquare : "\uf143"
property string rub : "\uf158"
property string ruble : "\uf158"
property string rupee : "\uf156"
property string s15 : "\uf2cd"
property string safari : "\uf267"
property string save : "\uf0c7"
property string scissors : "\uf0c4"
property string scribd : "\uf28a"
property string search : "\uf002"
property string searchMinus : "\uf010"
property string searchPlus : "\uf00e" property string searchPlus : "\uf00e"
property string sellsy : "\uf213"
property string send : "\uf1d8"
property string sendO : "\uf1d9"
property string server : "\uf233" property string server : "\uf233"
property string share : "\uf064" property string shieldAlt : "\uf3ed"
property string shareAlt : "\uf1e0"
property string shareAltSquare : "\uf1e1"
property string shareSquare : "\uf14d"
property string shareSquareO : "\uf045"
property string shekel : "\uf20b"
property string sheqel : "\uf20b"
property string shield : "\uf132"
property string ship : "\uf21a"
property string shirtsinbulk : "\uf214"
property string shoppingBag : "\uf290"
property string shoppingBasket : "\uf291"
property string shoppingCart : "\uf07a"
property string shower : "\uf2cc"
property string signIn : "\uf090"
property string signLanguage : "\uf2a7"
property string signOutAlt : "\uf2f5" property string signOutAlt : "\uf2f5"
property string signOut : "\uf08b"
property string signal : "\uf012"
property string signing : "\uf2a7"
property string simplybuilt : "\uf215"
property string sitemap : "\uf0e8"
property string skyatlas : "\uf216"
property string skype : "\uf17e"
property string slack : "\uf198"
property string sliders : "\uf1de"
property string slideshare : "\uf1e7"
property string smileO : "\uf118"
property string snapchat : "\uf2ab"
property string snapchatGhost : "\uf2ac"
property string snapchatSquare : "\uf2ad"
property string snowflakeO : "\uf2dc"
property string soccerBallO : "\uf1e3"
property string sort : "\uf0dc"
property string sortAlphaAsc : "\uf15d"
property string sortAlphaDesc : "\uf15e"
property string sortAmountAsc : "\uf160"
property string sortAmountDesc : "\uf161"
property string sortAsc : "\uf0de"
property string sortDesc : "\uf0dd"
property string sortDown : "\uf0dd"
property string sortNumericAsc : "\uf162"
property string sortNumericDesc : "\uf163"
property string sortUp : "\uf0de"
property string soundcloud : "\uf1be"
property string spaceShuttle : "\uf197"
property string spinner : "\uf110"
property string spoon : "\uf1b1"
property string spotify : "\uf1bc"
property string square : "\uf0c8"
property string squareO : "\uf096"
property string stackExchange : "\uf18d"
property string stackOverflow : "\uf16c"
property string star : "\uf005"
property string starHalf : "\uf089"
property string starHalfEmpty : "\uf123"
property string starHalfFull : "\uf123"
property string starHalfO : "\uf123"
property string starO : "\uf006"
property string steam : "\uf1b6"
property string steamSquare : "\uf1b7"
property string stepBackward : "\uf048"
property string stepForward : "\uf051"
property string stethoscope : "\uf0f1"
property string stickyNote : "\uf249"
property string stickyNoteO : "\uf24a"
property string stop : "\uf04d"
property string stopCircle : "\uf28d"
property string stopCircleO : "\uf28e"
property string streetView : "\uf21d"
property string strikethrough : "\uf0cc"
property string stumbleupon : "\uf1a4"
property string stumbleuponCircle : "\uf1a3"
property string subscript : "\uf12c"
property string subway : "\uf239"
property string suitcase : "\uf0f2"
property string sunO : "\uf185"
property string superpowers : "\uf2dd"
property string superscript : "\uf12b"
property string support : "\uf1cd"
property string table : "\uf0ce"
property string tablet : "\uf10a"
property string tachometer : "\uf0e4"
property string tag : "\uf02b"
property string tags : "\uf02c"
property string tasks : "\uf0ae"
property string taxi : "\uf1ba"
property string telegram : "\uf2c6"
property string television : "\uf26c"
property string tencentWeibo : "\uf1d5"
property string terminal : "\uf120"
property string textHeight : "\uf034"
property string textWidth : "\uf035"
property string th : "\uf00a"
property string thLarge : "\uf009"
property string thList : "\uf00b"
property string themeisle : "\uf2b2"
property string thermometer : "\uf2c7"
property string thermometer0 : "\uf2cb"
property string thermometer1 : "\uf2ca"
property string thermometer2 : "\uf2c9"
property string thermometer3 : "\uf2c8"
property string thermometer4 : "\uf2c7"
property string thermometerEmpty : "\uf2cb"
property string thermometerFull : "\uf2c7"
property string thermometerHalf : "\uf2c9"
property string thermometerQuarter : "\uf2ca"
property string thermometerThreeQuarters : "\uf2c8"
property string thumbTack : "\uf08d"
property string thumbsDown : "\uf165"
property string thumbsODown : "\uf088"
property string thumbsOUp : "\uf087"
property string thumbsUp : "\uf164"
property string ticket : "\uf145"
property string times : "\uf00d" property string times : "\uf00d"
property string timesCircle : "\uf057"
property string timesCircleO : "\uf05c"
property string timesRectangle : "\uf2d3"
property string timesRectangleO : "\uf2d4"
property string tint : "\uf043"
property string toggleDown : "\uf150"
property string toggleLeft : "\uf191"
property string toggleOff : "\uf204"
property string toggleOn : "\uf205"
property string toggleRight : "\uf152"
property string toggleUp : "\uf151"
property string trademark : "\uf25c"
property string train : "\uf238"
property string transgender : "\uf224"
property string transgenderAlt : "\uf225"
property string trash : "\uf1f8"
property string trashO : "\uf014"
property string tree : "\uf1bb"
property string trello : "\uf181"
property string tripadvisor : "\uf262"
property string trophy : "\uf091"
property string truck : "\uf0d1"
property string tryIcon : "\uf195"
property string tty : "\uf1e4"
property string tumblr : "\uf173"
property string tumblrSquare : "\uf174"
property string turkishLira : "\uf195"
property string tv : "\uf26c"
property string twitch : "\uf1e8"
property string twitter : "\uf099"
property string twitterSquare : "\uf081"
property string umbrella : "\uf0e9"
property string underline : "\uf0cd"
property string undo : "\uf0e2"
property string universalAccess : "\uf29a"
property string university : "\uf19c"
property string unlink : "\uf127"
property string unlock : "\uf09c"
property string unlockAlt : "\uf13e"
property string unsorted : "\uf0dc"
property string upload : "\uf093"
property string usb : "\uf287"
property string usd : "\uf155"
property string user : "\uf007"
property string userCircle : "\uf2bd"
property string userCircleO : "\uf2be"
property string userMd : "\uf0f0"
property string userO : "\uf2c0"
property string userPlus : "\uf234"
property string userSecret : "\uf21b"
property string userTimes : "\uf235"
property string users : "\uf0c0"
property string vcard : "\uf2bb"
property string vcardO : "\uf2bc"
property string venus : "\uf221"
property string venusDouble : "\uf226"
property string venusMars : "\uf228"
property string viacoin : "\uf237"
property string viadeo : "\uf2a9"
property string viadeoSquare : "\uf2aa"
property string videoCamera : "\uf03d"
property string vimeo : "\uf27d"
property string vimeoSquare : "\uf194"
property string vine : "\uf1ca"
property string vk : "\uf189"
property string volumeControlPhone : "\uf2a0"
property string volumeDown : "\uf027"
property string volumeOff : "\uf026"
property string volumeUp : "\uf028"
property string warning : "\uf071"
property string wechat : "\uf1d7"
property string weibo : "\uf18a"
property string weixin : "\uf1d7"
property string whatsapp : "\uf232"
property string wheelchair : "\uf193"
property string wheelchairAlt : "\uf29b"
property string wifi : "\uf1eb"
property string wikipediaW : "\uf266"
property string windowClose : "\uf2d3"
property string windowCloseO : "\uf2d4"
property string windowMaximize : "\uf2d0"
property string windowMinimize : "\uf2d1"
property string windowRestore : "\uf2d2"
property string windows : "\uf17a"
property string won : "\uf159"
property string wordpress : "\uf19a"
property string wpbeginner : "\uf297"
property string wpexplorer : "\uf2de"
property string wpforms : "\uf298"
property string wrench : "\uf0ad"
property string xing : "\uf168"
property string xingSquare : "\uf169"
property string yCombinator : "\uf23b"
property string yCombinatorSquare : "\uf1d4"
property string yahoo : "\uf19e"
property string yc : "\uf23b"
property string ycSquare : "\uf1d4"
property string yelp : "\uf1e9"
property string yen : "\uf157"
property string yoast : "\uf2b1"
property string youtube : "\uf167"
property string youtubePlay : "\uf16a"
property string youtubeSquare : "\uf166"
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
images/ledgerNanoS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/ledgerNanoX.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 742 B

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/trezor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
images/trezor@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

View File

@@ -73,14 +73,3 @@ function isValidOpenAliasAddress(address) {
// we can get an awful lot of valid domains, including non ASCII chars... accept anything // we can get an awful lot of valid domains, including non ASCII chars... accept anything
return true return true
} }
function makeQRCodeString(addr, amount) {
var XMR_URI_SCHEME = "monero:"
var XMR_AMOUNT = "tx_amount"
var qrCodeString =""
qrCodeString += (XMR_URI_SCHEME + addr)
if (amount !== undefined && amount !== ""){
qrCodeString += ("?" + XMR_AMOUNT + "=" + amount)
}
return qrCodeString
}

View File

@@ -115,3 +115,18 @@ function capitalize(s){
function removeTrailingZeros(value) { function removeTrailingZeros(value) {
return (value + '').replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, ''); return (value + '').replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '');
} }
function parseDateStringOrRestoreHeightAsInteger(value) {
// Parse date string or restore height as integer
var restoreHeight = 0;
if (value.indexOf('-') === 4 && value.length === 10) {
restoreHeight = Wizard.getApproximateBlockchainHeight(value, Utils.netTypeToString());
} else if (parseInt(value.substring(0, 4)) >= 2014 && parseInt(value.substring(0, 4)) <= 2025 && value.length === 8) {
// Correct date typed in a wrong format (20201225 instead of 2020-12-25)
var restoreHeightHyphenated = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6, 8);
restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeightHyphenated, Utils.netTypeToString());
} else {
restoreHeight = parseInt(value);
}
return restoreHeight;
}

View File

@@ -82,6 +82,17 @@ function walletPathExists(accountsDir, directory, filename, isIOS, walletManager
return false; return false;
} }
function unusedWalletName(directory, filename, walletManager) {
for (var i = 0; i < 100; i++) {
var walletName = filename + (i > 0 ? "_" + i : "");
if (!walletManager.walletExists(directory + "/" + walletName + "/" + walletName)) {
return walletName;
}
}
return filename;
}
function isAscii(str){ function isAscii(str){
for (var i = 0; i < str.length; i++) { for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i) > 127) if (str.charCodeAt(i) > 127)

View File

@@ -62,6 +62,7 @@ ApplicationWindow {
minimumHeight: 450 minimumHeight: 450
property var currentItem property var currentItem
property var previousActiveFocusItem
property bool hideBalanceForced: false property bool hideBalanceForced: false
property bool ctrlPressed: false property bool ctrlPressed: false
property alias persistentSettings : persistentSettings property alias persistentSettings : persistentSettings
@@ -92,16 +93,14 @@ ApplicationWindow {
readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype) readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype)
property string currentDaemonAddress; property string currentDaemonAddress;
property int disconnectedEpoch: 0 property int disconnectedEpoch: 0
property int estimatedBlockchainSize: 105 // GB property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 40 : 105 // GB
property alias viewState: rootItem.state property alias viewState: rootItem.state
property string prevSplashText; property string prevSplashText;
property bool splashDisplayedBeforeButtonRequest; property bool splashDisplayedBeforeButtonRequest;
property int appEpoch: Math.floor((new Date).getTime() / 1000)
property bool themeTransition: false property bool themeTransition: false
// fiat price conversion // fiat price conversion
property real fiatPriceXMRUSD: 0 property real fiatPrice: 0
property real fiatPriceXMREUR: 0
property var fiatPriceAPIs: { property var fiatPriceAPIs: {
return { return {
"kraken": { "kraken": {
@@ -212,6 +211,9 @@ ApplicationWindow {
if (prevState) { if (prevState) {
appWindow.viewState = prevState; appWindow.viewState = prevState;
} }
if (wizard.wizardState == "wizardOpenWallet1") {
wizard.wizardStateView.wizardOpenWallet1View.pageRoot.forceActiveFocus();
}
}; };
passwordDialog.open(usefulName(persistentSettings.wallet_path)); passwordDialog.open(usefulName(persistentSettings.wallet_path));
} }
@@ -257,9 +259,6 @@ ApplicationWindow {
walletPassword, walletPassword,
persistentSettings.nettype, persistentSettings.nettype,
persistentSettings.kdfRounds); persistentSettings.kdfRounds);
// Hide titlebar based on persistentSettings.customDecorations
titleBar.visible = persistentSettings.customDecorations;
} }
function closeWallet(callback) { function closeWallet(callback) {
@@ -359,6 +358,7 @@ ApplicationWindow {
middlePanel.getProofClicked.connect(handleGetProof); middlePanel.getProofClicked.connect(handleGetProof);
middlePanel.checkProofClicked.connect(handleCheckProof); middlePanel.checkProofClicked.connect(handleCheckProof);
persistentSettings.restore_height = currentWallet.walletCreationHeight;
console.log("Recovering from seed: ", persistentSettings.is_recovering) console.log("Recovering from seed: ", persistentSettings.is_recovering)
console.log("restore Height", persistentSettings.restore_height) console.log("restore Height", persistentSettings.restore_height)
@@ -422,8 +422,8 @@ ApplicationWindow {
leftPanel.balanceString = balance leftPanel.balanceString = balance
leftPanel.balanceUnlockedString = balanceU leftPanel.balanceUnlockedString = balanceU
if (middlePanel.state === "Account") { if (middlePanel.state === "Account") {
middlePanel.accountView.balanceAllText = walletManager.displayAmount(appWindow.currentWallet.balanceAll()); middlePanel.accountView.balanceAllText = walletManager.displayAmount(appWindow.currentWallet.balanceAll()) + " XMR";
middlePanel.accountView.unlockedBalanceAllText = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()); middlePanel.accountView.unlockedBalanceAllText = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()) + " XMR";
} }
} }
@@ -730,14 +730,18 @@ ApplicationWindow {
function onDaemonStarted(){ function onDaemonStarted(){
console.log("daemon started"); console.log("daemon started");
daemonStartStopInProgress = 0; daemonStartStopInProgress = 0;
currentWallet.connected(true); if (currentWallet) {
// resume refresh currentWallet.connected(true);
currentWallet.startRefresh(); // resume refresh
currentWallet.startRefresh();
}
// resume simplemode connection timer // resume simplemode connection timer
appWindow.disconnectedEpoch = Utils.epoch(); appWindow.disconnectedEpoch = Utils.epoch();
} }
function onDaemonStopped(){ function onDaemonStopped(){
currentWallet.connected(true); if (currentWallet) {
currentWallet.connected(true);
}
} }
function onDaemonStartFailure(error) { function onDaemonStartFailure(error) {
@@ -1002,7 +1006,6 @@ ApplicationWindow {
} }
function txProofComputed(txid, result){ function txProofComputed(txid, result){
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
if (result.indexOf("error|") === 0) { if (result.indexOf("error|") === 0) {
var errorString = result.split("|")[1]; var errorString = result.split("|")[1];
informationPopup.text = qsTr("Couldn't generate a proof because of the following reason: \n") + errorString + translationManager.emptyString; informationPopup.text = qsTr("Couldn't generate a proof because of the following reason: \n") + errorString + translationManager.emptyString;
@@ -1011,8 +1014,6 @@ ApplicationWindow {
informationPopup.text = result; informationPopup.text = result;
informationPopup.icon = StandardIcon.Critical; informationPopup.icon = StandardIcon.Critical;
} }
informationPopup.onCloseCallback = null
informationPopup.open()
} }
// called on "checkProof" // called on "checkProof"
@@ -1204,10 +1205,7 @@ ApplicationWindow {
return; return;
} }
if(persistentSettings.fiatPriceCurrency === "xmrusd") appWindow.fiatPrice = ticker;
appWindow.fiatPriceXMRUSD = ticker;
else if(persistentSettings.fiatPriceCurrency === "xmreur")
appWindow.fiatPriceXMREUR = ticker;
appWindow.updateBalance(); appWindow.updateBalance();
} }
@@ -1246,7 +1244,7 @@ ApplicationWindow {
} }
function fiatApiConvertToFiat(amount) { function fiatApiConvertToFiat(amount) {
var ticker = persistentSettings.fiatPriceCurrency === "xmrusd" ? appWindow.fiatPriceXMRUSD : appWindow.fiatPriceXMREUR; const ticker = appWindow.fiatPrice;
if(ticker <= 0){ if(ticker <= 0){
fiatApiError("Invalid ticker value: " + ticker); fiatApiError("Invalid ticker value: " + ticker);
return "?.??"; return "?.??";
@@ -1254,6 +1252,15 @@ ApplicationWindow {
return (amount * ticker).toFixed(2); return (amount * ticker).toFixed(2);
} }
function fiatApiConvertToXMR(amount) {
const ticker = appWindow.fiatPrice;
if(ticker <= 0){
fiatApiError("Invalid ticker value: " + ticker);
return "?.??";
}
return (amount / ticker).toFixed(12);
}
function fiatApiUpdateBalance(balance){ function fiatApiUpdateBalance(balance){
// update balance card // update balance card
var bFiat = "?.??" var bFiat = "?.??"
@@ -1892,7 +1899,7 @@ ApplicationWindow {
TitleBar { TitleBar {
id: titleBar id: titleBar
visible: persistentSettings.customDecorations && middlePanel.state !== "Merchant" visible: persistentSettings.customDecorations && middlePanel.state !== "Merchant"
walletName: persistentSettings.displayWalletNameInTitleBar ? appWindow.walletName : "" walletName: persistentSettings.displayWalletNameInTitleBar && rootItem.state != "wizard" ? appWindow.walletName : ""
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
onCloseClicked: appWindow.close(); onCloseClicked: appWindow.close();
@@ -1944,6 +1951,7 @@ ApplicationWindow {
function toggleLanguageView(){ function toggleLanguageView(){
languageSidebar.visible ? languageSidebar.close() : languageSidebar.open(); languageSidebar.visible ? languageSidebar.close() : languageSidebar.open();
languageSidebar.selectCurrentLanguage()
resetLanguageFields() resetLanguageFields()
} }
@@ -2203,8 +2211,7 @@ ApplicationWindow {
function userActivity() { function userActivity() {
// register user activity // register user activity
var epoch = Math.floor((new Date).getTime()/1000); appWindow.userLastActive = Utils.epoch();
appWindow.userLastActive = epoch;
} }
function checkInUserActivity() { function checkInUserActivity() {
@@ -2212,24 +2219,32 @@ ApplicationWindow {
if(!persistentSettings.lockOnUserInActivity) return; if(!persistentSettings.lockOnUserInActivity) return;
if(passwordDialog.visible) return; if(passwordDialog.visible) return;
var inputDialogVisible = inputDialog && inputDialog.visible var inputDialogVisible = inputDialog && inputDialog.visible
var successfulTxPopupVisible = successfulTxPopup && successfulTxPopup.visible
var informationPopupVisible = informationPopup && informationPopup.visible
// prompt password after X seconds of inactivity // prompt password after X seconds of inactivity
var epoch = Math.floor((new Date).getTime() / 1000); var inactivity = Utils.epoch() - appWindow.userLastActive;
var inactivity = epoch - appWindow.userLastActive;
if(inactivity < (persistentSettings.lockOnUserInActivityInterval * 60)) return; if(inactivity < (persistentSettings.lockOnUserInActivityInterval * 60)) return;
passwordDialog.onAcceptedCallback = function() { passwordDialog.onAcceptedCallback = function() {
if(walletPassword === passwordDialog.password){ if(walletPassword === passwordDialog.password){
passwordDialog.close(); passwordDialog.close();
if (inputDialogVisible) inputDialog.open(inputDialog.inputText)
if (successfulTxPopupVisible) successfulTxPopup.open(successfulTxPopup.transactionID)
if (informationPopupVisible) informationPopup.open()
} else { } else {
passwordDialog.showError(qsTr("Wrong password")); passwordDialog.showError(qsTr("Wrong password"));
} }
if (inputDialogVisible) inputDialog.open(inputDialog.inputText)
} }
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); } passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
if (inputDialogVisible) inputDialog.close() if (inputDialogVisible) inputDialog.close()
remoteNodeDialog.close(); remoteNodeDialog.close();
informationPopup.close()
txConfirmationPopup.close()
txConfirmationPopup.clearFields()
txConfirmationPopup.rejected()
successfulTxPopup.close();
passwordDialog.open(); passwordDialog.open();
} }
@@ -2246,7 +2261,6 @@ ApplicationWindow {
function changeWalletMode(mode){ function changeWalletMode(mode){
appWindow.disconnectedEpoch = 0; appWindow.disconnectedEpoch = 0;
appWindow.walletMode = mode;
persistentSettings.walletMode = mode; persistentSettings.walletMode = mode;
applyWalletMode(mode); applyWalletMode(mode);
} }
@@ -2350,6 +2364,8 @@ ApplicationWindow {
MoneroComponents.LanguageSidebar { MoneroComponents.LanguageSidebar {
id: languageSidebar id: languageSidebar
dragMargin: 0 dragMargin: 0
onAboutToShow: previousActiveFocusItem = activeFocusItem;
onClosed: { if (previousActiveFocusItem) previousActiveFocusItem.forceActiveFocus() }
} }
MoneroComponents.MenuBar { } MoneroComponents.MenuBar { }

2
monero

Submodule monero updated: f6e63ef260...ab18fea350

View File

@@ -103,6 +103,7 @@ Rectangle {
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: balanceAll id: balanceAll
Layout.rightMargin: 87
font.family: MoneroComponents.Style.fontMonoRegular.name; font.family: MoneroComponents.Style.fontMonoRegular.name;
font.pixelSize: 16 font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
@@ -115,7 +116,8 @@ Rectangle {
onExited: parent.color = MoneroComponents.Style.defaultFontColor onExited: parent.color = MoneroComponents.Style.defaultFontColor
onClicked: { onClicked: {
console.log("Copied to clipboard"); console.log("Copied to clipboard");
clipboard.setText(parent.text); var balanceAllNumberOnly = parent.text.slice(0, -4);
clipboard.setText(balanceAllNumberOnly);
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3) appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
} }
} }
@@ -136,6 +138,7 @@ Rectangle {
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: unlockedBalanceAll id: unlockedBalanceAll
Layout.rightMargin: 87
font.family: MoneroComponents.Style.fontMonoRegular.name; font.family: MoneroComponents.Style.fontMonoRegular.name;
font.pixelSize: 16 font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
@@ -148,7 +151,8 @@ Rectangle {
onExited: parent.color = MoneroComponents.Style.defaultFontColor onExited: parent.color = MoneroComponents.Style.defaultFontColor
onClicked: { onClicked: {
console.log("Copied to clipboard"); console.log("Copied to clipboard");
clipboard.setText(parent.text); var unlockedBalanceAllNumberOnly = parent.text.slice(0, -4);
clipboard.setText(unlockedBalanceAllNumberOnly);
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3) appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
} }
} }
@@ -160,11 +164,48 @@ Rectangle {
id: addressRow id: addressRow
spacing: 0 spacing: 0
MoneroComponents.LabelSubheader { RowLayout {
Layout.fillWidth: true spacing: 0
fontSize: 24
textFormat: Text.RichText MoneroComponents.LabelSubheader {
text: qsTr("Accounts") + translationManager.emptyString Layout.fillWidth: true
fontSize: 24
textFormat: Text.RichText
text: qsTr("Accounts") + translationManager.emptyString
}
MoneroComponents.StandardButton {
id: createNewAccountButton
visible: !selectAndSend
small: true
text: qsTr("Create new account") + translationManager.emptyString
fontSize: 13
onClicked: {
inputDialog.labelText = qsTr("Set the label of the new account:") + translationManager.emptyString
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddressAccount.addRow(inputDialog.inputText)
appWindow.currentWallet.switchSubaddressAccount(appWindow.currentWallet.numSubaddressAccounts() - 1)
appWindow.onWalletUpdate();
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
Rectangle {
anchors.top: createNewAccountButton.bottom
anchors.topMargin: 8
anchors.left: createNewAccountButton.left
anchors.right: createNewAccountButton.right
height: 2
color: MoneroComponents.Style.appWindowBorderColor
MoneroEffects.ColorTransition {
targetObj: parent
blackColor: MoneroComponents.Style._b_appWindowBorderColor
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
}
}
}
} }
ColumnLayout { ColumnLayout {
@@ -192,6 +233,15 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
color: itemMouseArea.containsMouse || index === currentAccountIndex ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent" color: itemMouseArea.containsMouse || index === currentAccountIndex ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
Rectangle {
visible: index === currentAccountIndex
Layout.fillHeight: true
anchors.top: parent.top
anchors.bottom: parent.bottom
color: "darkgrey"
width: 2
}
Rectangle { Rectangle {
color: MoneroComponents.Style.appWindowBorderColor color: MoneroComponents.Style.appWindowBorderColor
anchors.right: parent.right anchors.right: parent.right
@@ -241,7 +291,7 @@ Rectangle {
id: addressLabel id: addressLabel
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: mainLayout.width >= 590 ? balanceTextLabel.left : balanceNumberLabel.left anchors.left: balanceNumberLabel.left
anchors.leftMargin: -addressLabel.width - 30 anchors.leftMargin: -addressLabel.width - 30
fontSize: 16 fontSize: 16
fontFamily: MoneroComponents.Style.fontMonoRegular.name; fontFamily: MoneroComponents.Style.fontMonoRegular.name;
@@ -249,18 +299,6 @@ Rectangle {
themeTransition: false themeTransition: false
} }
MoneroComponents.Label {
id: balanceTextLabel
visible: mainLayout.width >= 590
color: MoneroComponents.Style.defaultFontColor
anchors.verticalCenter: parent.verticalCenter
anchors.left: balanceNumberLabel.left
anchors.leftMargin: -balanceTextLabel.width - 5
fontSize: 16
text: qsTr("Balance: ") + translationManager.emptyString
themeTransition: false
}
MoneroComponents.Label { MoneroComponents.Label {
id: balanceNumberLabel id: balanceNumberLabel
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
@@ -269,9 +307,9 @@ Rectangle {
anchors.leftMargin: -balanceNumberLabel.width anchors.leftMargin: -balanceNumberLabel.width
fontSize: 16 fontSize: 16
fontFamily: MoneroComponents.Style.fontMonoRegular.name; fontFamily: MoneroComponents.Style.fontMonoRegular.name;
text: balance text: balance + " XMR"
elide: Text.ElideRight elide: Text.ElideRight
textWidth: mainLayout.width < 660 ? 70 : 135 textWidth: 180
themeTransition: false themeTransition: false
} }
@@ -301,9 +339,11 @@ Rectangle {
fontAwesomeFallbackIcon: FontAwesome.edit fontAwesomeFallbackIcon: FontAwesome.edit
fontAwesomeFallbackSize: 22 fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23 Layout.preferredWidth: 23
Layout.preferredHeight: 21 Layout.preferredHeight: 21
tooltip: qsTr("Edit account label") + translationManager.emptyString
onClicked: pageAccount.renameSubaddressAccountLabel(index); onClicked: pageAccount.renameSubaddressAccountLabel(index);
} }
@@ -314,9 +354,11 @@ Rectangle {
fontAwesomeFallbackIcon: FontAwesome.clipboard fontAwesomeFallbackIcon: FontAwesome.clipboard
fontAwesomeFallbackSize: 22 fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 16 Layout.preferredWidth: 16
Layout.preferredHeight: 21 Layout.preferredHeight: 21
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
onClicked: { onClicked: {
console.log("Address copied to clipboard"); console.log("Address copied to clipboard");
@@ -344,30 +386,6 @@ Rectangle {
whiteColor: MoneroComponents.Style._w_appWindowBorderColor whiteColor: MoneroComponents.Style._w_appWindowBorderColor
} }
} }
MoneroComponents.CheckBox {
id: addNewAccountCheckbox
visible: !selectAndSend
border: false
uncheckedIcon: FontAwesome.plusCircle
toggleOnClick: false
fontAwesomeIcons: true
fontSize: 16
iconOnTheLeft: true
Layout.fillWidth: true
Layout.topMargin: 10
text: qsTr("Create new account") + translationManager.emptyString;
onClicked: {
inputDialog.labelText = qsTr("Set the label of the new account:") + translationManager.emptyString
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddressAccount.addRow(inputDialog.inputText)
appWindow.currentWallet.switchSubaddressAccount(appWindow.currentWallet.numSubaddressAccounts() - 1)
appWindow.onWalletUpdate();
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
}
} }
} }
@@ -378,8 +396,8 @@ Rectangle {
subaddressAccountListView.model = appWindow.currentWallet.subaddressAccountModel; subaddressAccountListView.model = appWindow.currentWallet.subaddressAccountModel;
appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount) appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount)
balanceAll.text = walletManager.displayAmount(appWindow.currentWallet.balanceAll()) balanceAll.text = walletManager.displayAmount(appWindow.currentWallet.balanceAll()) + " XMR"
unlockedBalanceAll.text = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()) unlockedBalanceAll.text = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()) + " XMR"
} }
} }

View File

@@ -97,6 +97,8 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: addFirstEntryButton id: addFirstEntryButton
Layout.topMargin: 20 Layout.topMargin: 20
Layout.alignment: Qt.AlignHCenter
small: true
text: qsTr("Add an address") + translationManager.emptyString text: qsTr("Add an address") + translationManager.emptyString
onClicked: { onClicked: {
root.showAddAddress(); root.showAddAddress();
@@ -115,6 +117,18 @@ Rectangle {
text: qsTr("Address book") + translationManager.emptyString text: qsTr("Address book") + translationManager.emptyString
} }
MoneroComponents.StandardButton {
id: addAddressButton
Layout.bottomMargin: 8
Layout.alignment: Qt.AlignRight
small: true
text: qsTr("Add address") + translationManager.emptyString
fontSize: 13
onClicked: {
root.showAddAddress();
}
}
ColumnLayout { ColumnLayout {
id: addressBookListRow id: addressBookListRow
property int addressBookListItemHeight: 50 property int addressBookListItemHeight: 50
@@ -134,7 +148,7 @@ Rectangle {
height: addressBookListRow.addressBookListItemHeight height: addressBookListRow.addressBookListItemHeight
width: parent ? parent.width : undefined width: parent ? parent.width : undefined
Layout.fillWidth: true Layout.fillWidth: true
color: "transparent" color: itemMouseArea.containsMouse ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
function doSend() { function doSend() {
console.log("Sending to: ", address +" "+ paymentId); console.log("Sending to: ", address +" "+ paymentId);
@@ -159,7 +173,7 @@ Rectangle {
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 5 anchors.topMargin: 5
anchors.rightMargin: 110 anchors.rightMargin: 125
color: "transparent" color: "transparent"
MoneroComponents.Label { MoneroComponents.Label {
@@ -187,8 +201,10 @@ Rectangle {
} }
MouseArea { MouseArea {
id: itemMouseArea
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
hoverEnabled: true
visible: root.selectAndSend visible: root.selectAndSend
onClicked: { onClicked: {
doSend(); doSend();
@@ -207,21 +223,42 @@ Rectangle {
id: sendToButton id: sendToButton
image: "qrc:///images/arrow-right-in-circle-outline-medium-white.svg" image: "qrc:///images/arrow-right-in-circle-outline-medium-white.svg"
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackIcon: FontAwesome.arrowRight
fontAwesomeFallbackSize: 22
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 20 Layout.preferredWidth: 20
Layout.preferredHeight: 20 Layout.preferredHeight: 20
tooltip: qsTr("Send to this address") + translationManager.emptyString
onClicked: { onClicked: {
doSend(); doSend();
} }
} }
MoneroComponents.IconButton { MoneroComponents.IconButton {
id: renameButton fontAwesomeFallbackIcon: FontAwesome.searchPlus
image: "qrc:///images/edit.svg" fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23 Layout.preferredWidth: 23
Layout.preferredHeight: 21 Layout.preferredHeight: 21
tooltip: qsTr("See transactions") + translationManager.emptyString
onClicked: doSearchInHistory(address)
}
MoneroComponents.IconButton {
id: editEntryButton
image: "qrc:///images/edit.svg"
color: MoneroComponents.Style.defaultFontColor
opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackIcon: FontAwesome.edit
fontAwesomeFallbackSize: 22
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23
Layout.preferredHeight: 21
tooltip: qsTr("Edit entry") + translationManager.emptyString
onClicked: { onClicked: {
addressBookListView.currentIndex = index; addressBookListView.currentIndex = index;
@@ -232,10 +269,14 @@ Rectangle {
MoneroComponents.IconButton { MoneroComponents.IconButton {
id: copyButton id: copyButton
image: "qrc:///images/copy.svg" image: "qrc:///images/copy.svg"
color: MoneroComponents.Style.defaultFontColor
opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackIcon: FontAwesome.clipboard
fontAwesomeFallbackSize: 22
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 16 Layout.preferredWidth: 16
Layout.preferredHeight: 21 Layout.preferredHeight: 21
color: MoneroComponents.Style.defaultFontColor tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
opacity: 0.5
onClicked: { onClicked: {
console.log("Address copied to clipboard"); console.log("Address copied to clipboard");
@@ -260,23 +301,6 @@ Rectangle {
whiteColor: MoneroComponents.Style._w_appWindowBorderColor whiteColor: MoneroComponents.Style._w_appWindowBorderColor
} }
} }
MoneroComponents.CheckBox {
id: addNewEntryCheckbox
border: false
uncheckedIcon: FontAwesome.plusCircle
toggleOnClick: false
fontAwesomeIcons: true
fontSize: 16
iconOnTheLeft: true
Layout.fillWidth: true
Layout.topMargin: 10
text: qsTr("Add address") + translationManager.emptyString;
onClicked: {
root.showAddAddress();
}
}
} }
ColumnLayout { ColumnLayout {
id: addContactLayout id: addContactLayout
@@ -286,26 +310,29 @@ Rectangle {
MoneroComponents.Label { MoneroComponents.Label {
fontSize: 32 fontSize: 32
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: (root.editEntry ? qsTr("Edit an address") : qsTr("Add an address")) + translationManager.emptyString text: (root.editEntry ? qsTr("Edit entry") : qsTr("Add an address")) + translationManager.emptyString
} }
MoneroComponents.LineEditMulti { MoneroComponents.LineEditMulti {
id: addressLine id: addressLine
visible: !root.editEntry
Layout.topMargin: 20 Layout.topMargin: 20
KeyNavigation.backtab: deleteButton.visible ? deleteButton: cancelButton
KeyNavigation.tab: resolveButton.visible ? resolveButton : descriptionLine
labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1" labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1"
.arg(qsTr("Address")) + translationManager.emptyString .arg(qsTr("Address")) + translationManager.emptyString
placeholderText: { placeholderText: {
if(persistentSettings.nettype == NetworkType.MAINNET){ if(persistentSettings.nettype == NetworkType.MAINNET){
return "4.. / 8.. / OpenAlias"; return "4.. / 8.. / monero:.. / OpenAlias";
} else if (persistentSettings.nettype == NetworkType.STAGENET){ } else if (persistentSettings.nettype == NetworkType.STAGENET){
return "5.. / 7.."; return "5.. / 7.. / monero:..";
} else if(persistentSettings.nettype == NetworkType.TESTNET){ } else if(persistentSettings.nettype == NetworkType.TESTNET){
return "9.. / B.."; return "9.. / B.. / monero:..";
} }
} }
wrapMode: Text.WrapAnywhere wrapMode: Text.WrapAnywhere
addressValidation: true addressValidation: true
pasteButton: true pasteButton: false
onTextChanged: { onTextChanged: {
const parsed = walletManager.parse_uri_to_object(addressLine.text); const parsed = walletManager.parse_uri_to_object(addressLine.text);
if (!parsed.error) { if (!parsed.error) {
@@ -313,6 +340,31 @@ Rectangle {
descriptionLine.text = parsed.tx_description; descriptionLine.text = parsed.tx_description;
} }
} }
onEnterPressed: addButton.enabled ? addButton.clicked() : ""
onReturnPressed: addButton.enabled ? addButton.clicked() : ""
MoneroComponents.InlineButton {
fontFamily: FontAwesome.fontFamilySolid
fontStyleName: "Solid"
fontPixelSize: 18
text: FontAwesome.desktop
tooltip: qsTr("Grab QR code from screen") + translationManager.emptyString
onClicked: {
clearFields();
const codes = oshelper.grabQrCodesFromScreen();
for (var index = 0; index < codes.length; ++index) {
const parsed = walletManager.parse_uri_to_object(codes[index]);
if (!parsed.error) {
addressLine.text = parsed.address
descriptionLine.text = parsed.recipient_name
break;
} else if (walletManager.addressValid(codes[index], appWindow.persistentSettings.nettype)) {
addressLine.text = codes[index];
break;
}
}
}
}
MoneroComponents.InlineButton { MoneroComponents.InlineButton {
buttonColor: MoneroComponents.Style.orange buttonColor: MoneroComponents.Style.orange
@@ -328,6 +380,8 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: resolveButton id: resolveButton
KeyNavigation.backtab: addressLine
KeyNavigation.tab: descriptionLine
Layout.topMargin: 10 Layout.topMargin: 10
text: qsTr("Resolve") + translationManager.emptyString text: qsTr("Resolve") + translationManager.emptyString
visible: TxUtils.isValidOpenAliasAddress(addressLine.text) visible: TxUtils.isValidOpenAliasAddress(addressLine.text)
@@ -365,22 +419,57 @@ Rectangle {
} }
} }
MoneroComponents.LineEditMulti { MoneroComponents.LineEdit {
id: descriptionLine id: descriptionLine
KeyNavigation.backtab: resolveButton.visible ? resolveButton : addressLine
KeyNavigation.tab: addButton.enabled ? addButton : cancelButton
Layout.topMargin: 20 Layout.topMargin: 20
Layout.fillWidth: true
fontSize: 16
placeholderFontSize: 16
labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1" labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1"
.arg(qsTr("Description")) + translationManager.emptyString .arg(qsTr("Description")) + translationManager.emptyString
placeholderText: qsTr("Add a name...") + translationManager.emptyString placeholderText: qsTr("Add a name...") + translationManager.emptyString
onAccepted: addButton.enabled ? addButton.clicked() : ""
} }
RowLayout { RowLayout {
Layout.topMargin: 20 Layout.topMargin: 20
Layout.alignment: Qt.AlignRight
MoneroComponents.StandardButton {
id: cancelButton
KeyNavigation.backtab: addButton
KeyNavigation.tab: deleteButton.visible ? deleteButton : addressLine
small: true
text: qsTr("Cancel") + translationManager.emptyString
primary: false
onClicked: root.showAddressBook();
}
MoneroComponents.StandardButton {
id: deleteButton
KeyNavigation.backtab: cancelButton
KeyNavigation.tab: addressLine
small: true
visible: root.editEntry
text: qsTr("Delete") + translationManager.emptyString
primary: false
onClicked: {
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
root.showAddressBook();
}
}
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: addButton id: addButton
KeyNavigation.backtab: descriptionLine
KeyNavigation.tab: cancelButton
small: true
text: (root.editEntry ? qsTr("Save") : qsTr("Add")) + translationManager.emptyString text: (root.editEntry ? qsTr("Save") : qsTr("Add")) + translationManager.emptyString
enabled: root.checkInformation(addressLine.text, appWindow.persistentSettings.nettype) enabled: root.checkInformation(addressLine.text, appWindow.persistentSettings.nettype)
onClicked: { onClicked: {
console.log("Add") console.log("Add")
if (!currentWallet.addressBook.addRow(addressLine.text.trim(),"", descriptionLine.text)) { if (!root.editEntry && !currentWallet.addressBook.addRow(addressLine.text.trim(),"", descriptionLine.text)) {
informationPopup.title = qsTr("Error") + translationManager.emptyString; informationPopup.title = qsTr("Error") + translationManager.emptyString;
// TODO: check currentWallet.addressBook.errorString() instead. // TODO: check currentWallet.addressBook.errorString() instead.
if(currentWallet.addressBook.errorCode() === AddressBook.Invalid_Address) if(currentWallet.addressBook.errorCode() === AddressBook.Invalid_Address)
@@ -393,47 +482,9 @@ Rectangle {
informationPopup.onCloseCallback = null informationPopup.onCloseCallback = null
informationPopup.open(); informationPopup.open();
} else { } else {
if (root.editEntry) { currentWallet.addressBook.setDescription(addressBookListView.currentIndex, descriptionLine.text);
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
}
root.showAddressBook();
}
}
}
Text {
id: cancelButton
Layout.leftMargin: 20
font.pixelSize: 16
font.bold: false
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Cancel") + translationManager.emptyString
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: root.showAddressBook();
}
}
Text {
id: deleteButton
visible: root.editEntry
Layout.leftMargin: 20
font.pixelSize: 16
font.bold: false
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Delete") + translationManager.emptyString
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
root.showAddressBook();
} }
root.showAddressBook()
} }
} }
} }
@@ -464,6 +515,7 @@ Rectangle {
addressBookEmptyLayout.visible = false addressBookEmptyLayout.visible = false
addressBookLayout.visible = false; addressBookLayout.visible = false;
addContactLayout.visible = true; addContactLayout.visible = true;
addressLine.forceActiveFocus();
} }
function showEditAddress(address, description) { function showEditAddress(address, description) {
@@ -474,12 +526,14 @@ Rectangle {
addContactLayout.visible = true; addContactLayout.visible = true;
addressLine.text = address; addressLine.text = address;
descriptionLine.text = description; descriptionLine.text = description;
addressLine.forceActiveFocus();
addressLine.cursorPosition = addressLine.text.length;
} }
function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) { function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) {
console.log("updateFromQrCode") console.log("updateFromQrCode")
addressLine.text = address addressLine.text = address
descriptionLine.text = recipient_name + " " + tx_description descriptionLine.text = recipient_name
cameraUi.qrcode_decoded.disconnect(updateFromQrCode) cameraUi.qrcode_decoded.disconnect(updateFromQrCode)
} }

View File

@@ -43,6 +43,7 @@ ColumnLayout {
property alias state: stateView.state property alias state: stateView.state
MoneroComponents.Navbar { MoneroComponents.Navbar {
id: navbarId
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.topMargin: height Layout.topMargin: height
Layout.bottomMargin: height Layout.bottomMargin: height
@@ -128,7 +129,7 @@ ColumnLayout {
PropertyAnimation { PropertyAnimation {
target: enterItem target: enterItem
property: "x" property: "x"
from: 0 - target.width from: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * - target.width
to: 0 to: 0
duration: 300 duration: 300
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
@@ -137,7 +138,7 @@ ColumnLayout {
target: exitItem target: exitItem
property: "x" property: "x"
from: 0 from: 0
to: target.width to: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * target.width
duration: 300 duration: 300
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }

View File

@@ -154,12 +154,15 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
input.topPadding: 6 input.topPadding: 6
input.bottomPadding: 6 input.bottomPadding: 6
fontSize: 16 fontSize: 15
labelFontSize: 14 labelFontSize: 14
placeholderText: qsTr("Search by Transaction ID, Address, Description, Amount or Blockheight") + translationManager.emptyString placeholderText: qsTr("Search by Transaction ID, Address, Description, Amount or Blockheight") + translationManager.emptyString
placeholderFontSize: 16 placeholderFontSize: 15
inputHeight: 34 inputHeight: 34
onTextUpdated: { onTextUpdated: {
if (!sortAndFilter.collapsed) {
sortAndFilter.collapsed = true;
}
if(searchInput.text != null && searchInput.text.length >= 3){ if(searchInput.text != null && searchInput.text.length >= 3){
root.sortSearchString = searchInput.text; root.sortSearchString = searchInput.text;
root.reset(); root.reset();
@@ -170,6 +173,27 @@ Rectangle {
root.updateFilter(); root.updateFilter();
} }
} }
Rectangle {
color: "transparent"
height: cleanButton.height
width: cleanButton.width
Layout.rightMargin: -8
Layout.leftMargin: -2
MoneroComponents.InlineButton {
id: cleanButton
buttonColor: "transparent"
fontFamily: FontAwesome.fontFamilySolid
fontStyleName: "Solid"
fontPixelSize: 18
text: FontAwesome.times
tooltip: qsTr("Clean") + translationManager.emptyString
tooltipLeft: true
visible: searchInput.text != ""
onClicked: searchInput.text = ""
}
}
} }
} }
@@ -958,6 +982,8 @@ Rectangle {
label.font.family: FontAwesome.fontFamily label.font.family: FontAwesome.fontFamily
fontSize: 18 fontSize: 18
width: 34 width: 34
tooltip: qsTr("Transaction details") + translationManager.emptyString
tooltipLeft: true
MouseArea { MouseArea {
state: "details" state: "details"
@@ -965,8 +991,14 @@ Rectangle {
hoverEnabled: true hoverEnabled: true
z: parent.z + 1 z: parent.z + 1
onEntered: parent.opacity = 0.8; onEntered: {
onExited: parent.opacity = 1.0; parent.opacity = 0.8;
parent.tooltipPopup.open()
}
onExited: {
parent.opacity = 1.0;
parent.tooltipPopup.close()
}
} }
} }
@@ -988,6 +1020,8 @@ Rectangle {
label.font.family: FontAwesome.fontFamilyBrands label.font.family: FontAwesome.fontFamilyBrands
fontSize: 18 fontSize: 18
width: 34 width: 34
tooltip: qsTr("Generate payment proof") + translationManager.emptyString
tooltipLeft: true
MouseArea { MouseArea {
state: "proof" state: "proof"
@@ -995,8 +1029,14 @@ Rectangle {
hoverEnabled: true hoverEnabled: true
z: parent.z + 1 z: parent.z + 1
onEntered: parent.opacity = 0.8; onEntered: {
onExited: parent.opacity = 1.0; parent.opacity = 0.8;
parent.tooltipPopup.open()
}
onExited: {
parent.opacity = 1.0;
parent.tooltipPopup.close()
}
} }
} }
} }
@@ -1232,7 +1272,7 @@ Rectangle {
if(res[i].state === 'copyable_address') (address ? root.toClipboard(address) : root.toClipboard(addressField.text)); if(res[i].state === 'copyable_address') (address ? root.toClipboard(address) : root.toClipboard(addressField.text));
if(res[i].state === 'copyable_receiving_address') root.toClipboard(currentWallet.address(subaddrAccount, subaddrIndex)); if(res[i].state === 'copyable_receiving_address') root.toClipboard(currentWallet.address(subaddrAccount, subaddrIndex));
if(res[i].state === 'copyable_txkey') root.getTxKey(hash, res[i]); if(res[i].state === 'copyable_txkey') root.getTxKey(hash, res[i]);
if(res[i].state === 'set_tx_note') root.editDescription(hash, tx_note); if(res[i].state === 'set_tx_note') root.editDescription(hash, tx_note, root.txPage);
if(res[i].state === 'details') root.showTxDetails(hash, paymentId, destinations, subaddrAccount, subaddrIndex, dateTime, displayAmount, isout); if(res[i].state === 'details') root.showTxDetails(hash, paymentId, destinations, subaddrAccount, subaddrIndex, dateTime, displayAmount, isout);
if(res[i].state === 'proof') root.showTxProof(hash, paymentId, destinations, subaddrAccount, subaddrIndex); if(res[i].state === 'proof') root.showTxProof(hash, paymentId, destinations, subaddrAccount, subaddrIndex);
doCollapse = false; doCollapse = false;
@@ -1271,6 +1311,8 @@ Rectangle {
image: "qrc:///images/whiteDropIndicator.png" image: "qrc:///images/whiteDropIndicator.png"
rotation: delegate.collapsed ? 180 : 0 rotation: delegate.collapsed ? 180 : 0
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
fontAwesomeFallbackIcon: FontAwesome.arrowDown
fontAwesomeFallbackSize: 14
} }
} }
@@ -1393,7 +1435,7 @@ Rectangle {
} }
} }
function updateFilter(){ function updateFilter(currentPage){
// applying filters // applying filters
root.txData = JSON.parse(JSON.stringify(root.txModelData)); // deepcopy root.txData = JSON.parse(JSON.stringify(root.txModelData)); // deepcopy
@@ -1443,6 +1485,9 @@ Rectangle {
root.updateSort(); root.updateSort();
root.updateDisplay(root.txOffset, root.txMax); root.updateDisplay(root.txOffset, root.txMax);
if (currentPage) {
root.paginationJump(parseInt(currentPage));
}
} }
function updateSort(){ function updateSort(){
@@ -1581,20 +1626,20 @@ Rectangle {
root.txCount = root.txData.length; root.txCount = root.txData.length;
} }
function update() { function update(currentPage) {
// handle outside mutation of tx model; incoming/outgoing funds or new blocks. Update table. // handle outside mutation of tx model; incoming/outgoing funds or new blocks. Update table.
currentWallet.history.refresh(currentWallet.currentSubaddressAccount); currentWallet.history.refresh(currentWallet.currentSubaddressAccount);
root.updateTransactionsFromModel(); root.updateTransactionsFromModel();
root.updateFilter(); root.updateFilter(currentPage);
} }
function editDescription(_hash, _tx_note){ function editDescription(_hash, _tx_note, currentPage){
inputDialog.labelText = qsTr("Set description:") + translationManager.emptyString; inputDialog.labelText = qsTr("Set description:") + translationManager.emptyString;
inputDialog.onAcceptedCallback = function() { inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.setUserNote(_hash, inputDialog.inputText); appWindow.currentWallet.setUserNote(_hash, inputDialog.inputText);
appWindow.showStatusMessage(qsTr("Updated description."),3); appWindow.showStatusMessage(qsTr("Updated description."),3);
root.update(); root.update(currentPage);
} }
inputDialog.onRejectedCallback = null; inputDialog.onRejectedCallback = null;
inputDialog.open(_tx_note); inputDialog.open(_tx_note);
@@ -1675,6 +1720,10 @@ Rectangle {
console.log("getProof: Generate clicked: txid " + hash + ", address " + address); console.log("getProof: Generate clicked: txid " + hash + ", address " + address);
middlePanel.getProofClicked(hash, address, ''); middlePanel.getProofClicked(hash, address, '');
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
informationPopup.text = qsTr("Generating payment proof") + "..." + translationManager.emptyString;
informationPopup.onCloseCallback = null
informationPopup.open()
} }
function toClipboard(text){ function toClipboard(text){
@@ -1746,7 +1795,14 @@ Rectangle {
root.model = appWindow.currentWallet.historyModel; root.model = appWindow.currentWallet.historyModel;
root.model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole root.model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole
root.model.sort(0, Qt.DescendingOrder); root.model.sort(0, Qt.DescendingOrder);
fromDatePicker.currentDate = model.transactionHistory.firstDateTime var count = root.model.rowCount()
if (count > 0) {
//date of the first transaction
fromDatePicker.currentDate = root.model.data(root.model.index((count - 1), 0), TransactionHistoryModel.TransactionDateRole);
} else {
//date of monero birth (2014-04-18)
fromDatePicker.currentDate = model.transactionHistory.firstDateTime
}
} }
root.reset(); root.reset();
@@ -1763,10 +1819,13 @@ Rectangle {
function searchInHistory(searchTerm){ function searchInHistory(searchTerm){
searchInput.text = searchTerm; searchInput.text = searchTerm;
searchInput.forceActiveFocus();
searchInput.cursorPosition = searchInput.text.length;
sortAndFilter.collapsed = true; sortAndFilter.collapsed = true;
} }
function clearFields() { function clearFields() {
sortAndFilter.collapsed = false;
searchInput.text = ""; searchInput.text = "";
root.txDataCollapsed = []; root.txDataCollapsed = [];
} }

View File

@@ -37,6 +37,7 @@ Rectangle {
color: "transparent" color: "transparent"
property alias miningHeight: mainLayout.height property alias miningHeight: mainLayout.height
property double currentHashRate: 0 property double currentHashRate: 0
property int threads: idealThreadCount / 2
ColumnLayout { ColumnLayout {
id: mainLayout id: mainLayout
@@ -68,7 +69,7 @@ Rectangle {
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: soloMainLabel id: soloMainLabel
text: qsTr("Mining with your computer helps strengthen the Monero network. The more that people mine, the harder it is for the network to be attacked, and every little bit helps.\n\nMining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + translationManager.emptyString text: qsTr("Mining with your computer helps strengthen the Monero network. The more people mine, the harder it is for the network to be attacked, and every little bit helps.\n\nMining also gives you a small chance to earn some Monero. Your computer will create hashes looking for block solutions. If you find a block, you will get the associated reward. Good luck!") + translationManager.emptyString
wrapMode: Text.Wrap wrapMode: Text.Wrap
Layout.fillWidth: true Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
@@ -106,30 +107,56 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
spacing: 16 spacing: 16
MoneroComponents.LineEdit { RowLayout {
id: soloMinerThreadsLine MoneroComponents.StandardButton {
Layout.minimumWidth: 200 id: removeThreadButton
text: "1" small: true
validator: IntValidator { bottom: 1; top: idealThreadCount } primary: false
} text: ""
enabled: threads > 1
onClicked: threads--
}
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: numAvailableThreadsText Layout.bottomMargin: 1
text: qsTr("Max # of CPU threads available for mining: ") + idealThreadCount + translationManager.emptyString Layout.minimumWidth: 45
wrapMode: Text.WordWrap color: MoneroComponents.Style.defaultFontColor
font.family: MoneroComponents.Style.fontRegular.name text: threads
font.pixelSize: 14 horizontalAlignment: Text.AlignHCenter
color: MoneroComponents.Style.defaultFontColor font.pixelSize: 16
MouseArea {
anchors.fill: parent
scrollGestureEnabled: false
onWheel: {
if (wheel.angleDelta.y > 0 && threads < idealThreadCount) {
return threads++
} else if (wheel.angleDelta.y < 0 && threads > 1) {
return threads--
}
}
}
}
MoneroComponents.StandardButton {
id: addThreadButton
small: true
primary: false
text: "+"
enabled: threads < idealThreadCount
onClicked: threads++
}
} }
RowLayout { RowLayout {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: autoRecommendedThreadsButton id: autoRecommendedThreadsButton
small: true small: true
text: qsTr("Use recommended # of threads") + translationManager.emptyString primary: false
text: qsTr("Use half (recommended)") + translationManager.emptyString
enabled: startSoloMinerButton.enabled enabled: startSoloMinerButton.enabled
onClicked: { onClicked: {
soloMinerThreadsLine.text = Math.floor(idealThreadCount / 2); threads = idealThreadCount / 2
appWindow.showStatusMessage(qsTr("Set to use recommended # of threads"),3) appWindow.showStatusMessage(qsTr("Set to use recommended # of threads"),3)
} }
} }
@@ -137,25 +164,16 @@ Rectangle {
MoneroComponents.StandardButton { MoneroComponents.StandardButton {
id: autoSetMaxThreadsButton id: autoSetMaxThreadsButton
small: true small: true
text: qsTr("Use all threads") + translationManager.emptyString primary: false
text: qsTr("Use all threads") + " (" + idealThreadCount + ")" + translationManager.emptyString
enabled: startSoloMinerButton.enabled enabled: startSoloMinerButton.enabled
onClicked: { onClicked: {
soloMinerThreadsLine.text = idealThreadCount threads = idealThreadCount
appWindow.showStatusMessage(qsTr("Set to use all threads") + translationManager.emptyString,3) appWindow.showStatusMessage(qsTr("Set to use all threads") + translationManager.emptyString,3)
} }
} }
} }
RowLayout {
MoneroComponents.CheckBox {
id: backgroundMining
enabled: startSoloMinerButton.enabled
checked: persistentSettings.allow_background_mining
onClicked: {persistentSettings.allow_background_mining = checked}
text: qsTr("Background mining (experimental)") + translationManager.emptyString
}
}
RowLayout { RowLayout {
// Disable this option until stable // Disable this option until stable
visible: false visible: false
@@ -169,6 +187,35 @@ Rectangle {
} }
} }
ColumnLayout {
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
Layout.minimumWidth: 140
MoneroComponents.Label {
id: optionsLabel
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Options") + translationManager.emptyString
fontSize: 16
wrapMode: Text.Wrap
Layout.preferredWidth: manageSoloMinerLabel.textWidth
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 16
RowLayout {
MoneroComponents.CheckBox {
id: backgroundMining
enabled: startSoloMinerButton.enabled
checked: persistentSettings.allow_background_mining
onClicked: persistentSettings.allow_background_mining = checked
text: qsTr("Background mining (experimental)") + translationManager.emptyString
}
}
}
ColumnLayout { ColumnLayout {
Layout.alignment : Qt.AlignTop | Qt.AlignLeft Layout.alignment : Qt.AlignTop | Qt.AlignLeft
@@ -191,9 +238,10 @@ Rectangle {
visible: true visible: true
id: startSoloMinerButton id: startSoloMinerButton
small: true small: true
primary: !stopSoloMinerButton.enabled
text: qsTr("Start mining") + translationManager.emptyString text: qsTr("Start mining") + translationManager.emptyString
onClicked: { onClicked: {
var success = walletManager.startMining(appWindow.currentWallet.address(0, 0), soloMinerThreadsLine.text, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery) var success = walletManager.startMining(appWindow.currentWallet.address(0, 0), threads, persistentSettings.allow_background_mining, persistentSettings.miningIgnoreBattery)
if (success) { if (success) {
update() update()
} else { } else {
@@ -211,6 +259,7 @@ Rectangle {
visible: true visible: true
id: stopSoloMinerButton id: stopSoloMinerButton
small: true small: true
primary: stopSoloMinerButton.enabled
text: qsTr("Stop mining") + translationManager.emptyString text: qsTr("Stop mining") + translationManager.emptyString
onClicked: { onClicked: {
walletManager.stopMining() walletManager.stopMining()

View File

@@ -50,6 +50,7 @@ Rectangle {
color: "transparent" color: "transparent"
property var model property var model
property alias receiveHeight: mainLayout.height property alias receiveHeight: mainLayout.height
property var state: "Address"
function renameSubaddressLabel(_index){ function renameSubaddressLabel(_index){
inputDialog.labelText = qsTr("Set the label of the selected address:") + translationManager.emptyString; inputDialog.labelText = qsTr("Set the label of the selected address:") + translationManager.emptyString;
@@ -60,6 +61,16 @@ Rectangle {
inputDialog.open(appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, _index)) inputDialog.open(appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, _index))
} }
function generateQRCodeString() {
if (pageReceive.state == "PaymentRequest") {
return walletManager.make_uri(appWindow.current_address,
walletManager.amountFromString(amountToReceiveXMR.text),
txDescriptionInput.text, receiverNameInput.text);
} else {
return walletManager.make_uri(appWindow.current_address);
}
}
Clipboard { id: clipboard } Clipboard { id: clipboard }
/* main layout */ /* main layout */
@@ -72,17 +83,472 @@ Rectangle {
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
spacing: 20 spacing: 15
ColumnLayout {
id: selectedAddressDetailsColumn
Layout.alignment: Qt.AlignHCenter
spacing: 0
property int qrSize: 220
MoneroComponents.Navbar {
Layout.alignment: Qt.AlignHCenter
Layout.bottomMargin: 10
MoneroComponents.NavbarItem {
active: state == "Address"
text: qsTr("Address") + translationManager.emptyString
onSelected: state = "Address"
}
MoneroComponents.NavbarItem {
active: state == "PaymentRequest"
text: qsTr("Payment request") + translationManager.emptyString
onSelected: {
state = "PaymentRequest";
qrCodeTextMouseArea.hoverEnabled = true;
}
}
}
Rectangle {
id: qrContainer
color: MoneroComponents.Style.blackTheme ? "white" : "transparent"
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: parent.qrSize
Layout.preferredHeight: width
radius: 4
Image {
id: qrCode
anchors.fill: parent
anchors.margins: 1
smooth: false
fillMode: Image.PreserveAspectFit
source: "image://qrcode/" + generateQRCodeString();
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
onEntered: qrCodeTooltip.tooltipPopup.open()
onExited: qrCodeTooltip.tooltipPopup.close()
onClicked: {
if (mouse.button == Qt.LeftButton){
walletManager.saveQrCodeToClipboard(generateQRCodeString());
appWindow.showStatusMessage(qsTr("QR code copied to clipboard") + translationManager.emptyString, 3);
} else if (mouse.button == Qt.RightButton){
qrMenu.x = this.mouseX;
qrMenu.y = this.mouseY;
qrMenu.open()
}
}
}
}
Menu {
id: qrMenu
title: "QrCode"
currentIndex: menuItem1.hovered ? 0 : menuItem2.hovered ? 1 : -1
MenuItem {
id: menuItem1
text: qsTr("Copy to clipboard") + translationManager.emptyString;
onTriggered: walletManager.saveQrCodeToClipboard(generateQRCodeString())
}
MenuItem {
id: menuItem2
text: qsTr("Save as Image") + translationManager.emptyString;
onTriggered: qrFileDialog.open()
}
}
MoneroComponents.Tooltip {
id: qrCodeTooltip
text: qsTr("Left click: copy QR code to clipboard") + "<br>" + qsTr("Right click: save QR code as image file") + translationManager.emptyString
}
}
MoneroComponents.TextPlain {
id: qrCodeText
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: 6
Layout.maximumWidth: 285
Layout.minimumHeight: 75
verticalAlignment: Text.AlignVCenter
visible: paymentRequestGridLayout.visible
font.pixelSize: 12
color: qrCodeTextMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.defaultFontColor
text: generateQRCodeString();
wrapMode: Text.WrapAnywhere
tooltip: qsTr("Copy payment request to clipboard") + translationManager.emptyString
themeTransition: false
MouseArea {
id: qrCodeTextMouseArea
hoverEnabled: false //true when Payment request navbar button is clicked (fix bug displaying tooltip when navbar button is clicked)
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: parent.tooltipPopup.open()
onExited: parent.tooltipPopup.close()
onClicked: {
clipboard.setText(qrCodeText.text);
appWindow.showStatusMessage(qsTr("Payment request copied to clipboard") + translationManager.emptyString, 3);
}
}
}
GridLayout {
id: paymentRequestGridLayout
columns: 3
rows: 4
visible: pageReceive.state == "PaymentRequest"
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: 6
Layout.preferredWidth: 285
Layout.maximumWidth: 285
MoneroComponents.Label {
id: amountTitleFiat
Layout.bottomMargin: 3
Layout.preferredWidth: 90
visible: persistentSettings.fiatPriceEnabled
fontSize: 14
text: qsTr("Amount") + translationManager.emptyString
}
MoneroComponents.Input {
id: amountToReceiveFiat
Layout.preferredWidth: 165
Layout.maximumWidth: 165
visible: persistentSettings.fiatPriceEnabled
topPadding: 5
leftPadding: 5
font.family: MoneroComponents.Style.fontMonoRegular.name
font.pixelSize: 14
font.bold: false
horizontalAlignment: TextInput.AlignLeft
verticalAlignment: TextInput.AlignVCenter
selectByMouse: true
color: MoneroComponents.Style.defaultFontColor
placeholderText: "0.00"
background: Rectangle {
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
radius: 3
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
border.width: 1
}
onTextEdited: {
text = text.trim().replace(",", ".");
const match = text.match(/^0+(\d.*)/);
if (match) {
const cursorPosition = cursorPosition;
text = match[1];
cursorPosition = Math.max(cursorPosition, 1) - 1;
} else if(text.indexOf('.') === 0){
text = '0' + text;
if (text.length > 2) {
cursorPosition = 1;
}
}
if (amountToReceiveFiat.text == "") {
amountToReceiveXMR.text = "";
} else {
amountToReceiveXMR.text = fiatApiConvertToXMR(amountToReceiveFiat.text);
}
}
validator: RegExpValidator {
regExp: /^\s*(\d{1,8})?([\.,]\d{1,2})?\s*$/
}
}
MoneroComponents.Label {
Layout.bottomMargin: 3
visible: persistentSettings.fiatPriceEnabled
fontSize: 14
text: appWindow.fiatApiCurrencySymbol();
}
MoneroComponents.Label {
id: amountTitleXMR
Layout.bottomMargin: 3
Layout.preferredWidth: 90
fontSize: 14
text: persistentSettings.fiatPriceEnabled ? "" : qsTr("Amount") + translationManager.emptyString
}
MoneroComponents.Input {
id: amountToReceiveXMR
Layout.preferredWidth: 165
Layout.maximumWidth: 165
topPadding: 5
leftPadding: 5
font.family: MoneroComponents.Style.fontMonoRegular.name
font.pixelSize: 14
font.bold: false
horizontalAlignment: TextInput.AlignLeft
verticalAlignment: TextInput.AlignVCenter
selectByMouse: true
color: MoneroComponents.Style.defaultFontColor
placeholderText: "0.000000000000"
background: Rectangle {
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
radius: 3
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
border.width: 1
}
onTextEdited: {
text = text.trim().replace(",", ".");
const match = text.match(/^0+(\d.*)/);
if (match) {
const cursorPosition = cursorPosition;
text = match[1];
cursorPosition = Math.max(cursorPosition, 1) - 1;
} else if(text.indexOf('.') === 0){
text = '0' + text;
if (text.length > 2) {
cursorPosition = 1;
}
}
if (amountToReceiveXMR.text == "") {
amountToReceiveFiat.text = "";
} else {
amountToReceiveFiat.text = fiatApiConvertToFiat(amountToReceiveXMR.text);
}
}
validator: RegExpValidator {
regExp: /^\s*(\d{1,8})?([\.,]\d{1,12})?\s*$/
}
}
MoneroComponents.Label {
Layout.bottomMargin: 3
fontSize: 14
text: "XMR"
}
MoneroComponents.Label {
id: txDescription
Layout.bottomMargin: 3
Layout.preferredWidth: 90
fontSize: 14
text: qsTr("Description") + translationManager.emptyString
tooltip: qsTr("What is being payed for (a product, service, donation) (optional)") + translationManager.emptyString
tooltipIconVisible: true
}
MoneroComponents.Input {
id: txDescriptionInput
Layout.preferredWidth: 165
Layout.maximumWidth: 165
maximumLength: 800
topPadding: 7
leftPadding: 7
font.pixelSize: 14
font.bold: false
horizontalAlignment: TextInput.AlignLeft
verticalAlignment: TextInput.AlignVCenter
selectByMouse: true
color: MoneroComponents.Style.defaultFontColor
placeholderText: qsTr("Visible to the sender") + translationManager.emptyString
background: Rectangle {
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
radius: 3
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
border.width: 1
}
}
MoneroComponents.Label {
Layout.bottomMargin: 3
fontSize: 14
text: ""
}
MoneroComponents.Label {
id: receiverNameLabel
Layout.bottomMargin: 3
Layout.preferredWidth: 90
fontSize: 14
text: qsTr("Your name") + translationManager.emptyString
tooltip: qsTr("Your name, company or website (optional)") + translationManager.emptyString
tooltipIconVisible: true
}
MoneroComponents.Input {
id: receiverNameInput
Layout.preferredWidth: 165
Layout.maximumWidth: 165
topPadding: 7
leftPadding: 7
font.pixelSize: 14
font.bold: false
horizontalAlignment: TextInput.AlignLeft
verticalAlignment: TextInput.AlignVCenter
selectByMouse: true
color: MoneroComponents.Style.defaultFontColor
placeholderText: qsTr("Visible to the sender") + translationManager.emptyString
maximumLength: 100
background: Rectangle {
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
radius: 3
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
border.width: 1
}
}
MoneroComponents.Label {
Layout.bottomMargin: 3
fontSize: 14
text: ""
}
}
MoneroComponents.TextPlain {
id: selectedaddressIndex
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: 220
Layout.maximumWidth: 220
Layout.topMargin: 15
visible: pageReceive.state == "Address"
horizontalAlignment: Text.AlignHCenter
text: qsTr("Address #") + subaddressListView.currentIndex + translationManager.emptyString
wrapMode: Text.WordWrap
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 17
textFormat: Text.RichText
color: MoneroComponents.Style.defaultFontColor
themeTransition: false
}
MoneroComponents.TextPlain {
id: selectedAddressDrescription
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: 220
Layout.maximumWidth: 220
Layout.topMargin: 10
visible: pageReceive.state == "Address"
horizontalAlignment: Text.AlignHCenter
text: "(" + qsTr("no label") + ")" + translationManager.emptyString
wrapMode: Text.WordWrap
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 17
textFormat: Text.RichText
color: selectedAddressDrescriptionMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.dimmedFontColor
themeTransition: false
tooltip: subaddressListView.currentIndex > 0 ? qsTr("Edit address label") : "" + translationManager.emptyString
MouseArea {
id: selectedAddressDrescriptionMouseArea
visible: subaddressListView.currentIndex > 0
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: parent.tooltip ? parent.tooltipPopup.open() : ""
onExited: parent.tooltip ? parent.tooltipPopup.close() : ""
onClicked: {
renameSubaddressLabel(appWindow.current_subaddress_table_index);
}
}
}
MoneroComponents.TextPlain {
id: selectedAddress
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: 300
Layout.topMargin: 11
visible: pageReceive.state == "Address"
text: appWindow.current_address ? appWindow.current_address : ""
horizontalAlignment: TextInput.AlignHCenter
wrapMode: Text.Wrap
textFormat: Text.RichText
color: selectedAddressMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.defaultFontColor
font.pixelSize: 15
font.family: MoneroComponents.Style.fontRegular.name
themeTransition: false
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
MouseArea {
id: selectedAddressMouseArea
hoverEnabled: true
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onEntered: parent.tooltip ? parent.tooltipPopup.open() : ""
onExited: parent.tooltip ? parent.tooltipPopup.close() : ""
onClicked: {
clipboard.setText(appWindow.current_address);
appWindow.showStatusMessage(qsTr("Address copied to clipboard") + translationManager.emptyString, 3);
}
}
}
MoneroComponents.StandardButton {
Layout.preferredWidth: 220
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: 18
small: true
text: qsTr("Show on device") + translationManager.emptyString
fontSize: 14
visible: appWindow.currentWallet ? appWindow.currentWallet.isHwBacked() : false
onClicked: {
appWindow.currentWallet.deviceShowAddressAsync(
appWindow.currentWallet.currentSubaddressAccount,
appWindow.current_subaddress_table_index,
'');
}
}
}
ColumnLayout { ColumnLayout {
id: addressRow id: addressRow
spacing: 0 spacing: 0
MoneroComponents.LabelSubheader { RowLayout {
Layout.fillWidth: true spacing: 0
fontSize: 24
textFormat: Text.RichText MoneroComponents.LabelSubheader {
text: qsTr("Addresses") + translationManager.emptyString Layout.fillWidth: true
fontSize: 24
textFormat: Text.RichText
text: qsTr("Addresses") + translationManager.emptyString
}
MoneroComponents.StandardButton {
id: createAddressButton
small: true
text: qsTr("Create new address") + translationManager.emptyString
fontSize: 13
onClicked: {
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddress.addRow(appWindow.currentWallet.currentSubaddressAccount, inputDialog.inputText)
current_subaddress_table_index = appWindow.currentWallet.numSubaddresses(appWindow.currentWallet.currentSubaddressAccount) - 1
subaddressListView.currentIndex = current_subaddress_table_index
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
Rectangle {
anchors.top: createAddressButton.bottom
anchors.topMargin: 8
anchors.left: createAddressButton.left
anchors.right: createAddressButton.right
height: 2
color: MoneroComponents.Style.appWindowBorderColor
MoneroEffects.ColorTransition {
targetObj: parent
blackColor: MoneroComponents.Style._b_appWindowBorderColor
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
}
}
}
} }
ColumnLayout { ColumnLayout {
@@ -109,6 +575,15 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
color: itemMouseArea.containsMouse || index === appWindow.current_subaddress_table_index ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent" color: itemMouseArea.containsMouse || index === appWindow.current_subaddress_table_index ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
Rectangle {
visible: index === appWindow.current_subaddress_table_index
Layout.fillHeight: true
anchors.top: parent.top
anchors.bottom: parent.bottom
color: "darkgrey"
width: 2
}
Rectangle{ Rectangle{
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
@@ -127,7 +602,7 @@ Rectangle {
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 5 anchors.topMargin: 5
anchors.rightMargin: 80 anchors.rightMargin: 90
color: "transparent" color: "transparent"
MoneroComponents.Label { MoneroComponents.Label {
@@ -182,16 +657,30 @@ Rectangle {
height: 21 height: 21
spacing: 10 spacing: 10
MoneroComponents.IconButton {
fontAwesomeFallbackIcon: FontAwesome.searchPlus
fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23
Layout.preferredHeight: 21
tooltip: qsTr("See transactions") + translationManager.emptyString
onClicked: doSearchInHistory(address)
}
MoneroComponents.IconButton { MoneroComponents.IconButton {
id: renameButton id: renameButton
image: "qrc:///images/edit.svg" image: "qrc:///images/edit.svg"
fontAwesomeFallbackIcon: FontAwesome.edit fontAwesomeFallbackIcon: FontAwesome.edit
fontAwesomeFallbackSize: 22 fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23 Layout.preferredWidth: 23
Layout.preferredHeight: 21 Layout.preferredHeight: 21
visible: index !== 0 visible: index !== 0
tooltip: qsTr("Edit address label") + translationManager.emptyString
onClicked: { onClicked: {
renameSubaddressLabel(index); renameSubaddressLabel(index);
@@ -204,9 +693,11 @@ Rectangle {
fontAwesomeFallbackIcon: FontAwesome.clipboard fontAwesomeFallbackIcon: FontAwesome.clipboard
fontAwesomeFallbackSize: 22 fontAwesomeFallbackSize: 22
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
opacity: 0.5 opacity: isOpenGL ? 0.5 : 1
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 16 Layout.preferredWidth: 16
Layout.preferredHeight: 21 Layout.preferredHeight: 21
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
onClicked: { onClicked: {
console.log("Address copied to clipboard"); console.log("Address copied to clipboard");
@@ -223,6 +714,16 @@ Rectangle {
appWindow.currentWallet.currentSubaddressAccount, appWindow.currentWallet.currentSubaddressAccount,
subaddressListView.currentIndex subaddressListView.currentIndex
); );
if (subaddressListView.currentIndex == 0) {
selectedAddressDrescription.text = qsTr("Primary address") + translationManager.emptyString;
} else {
var selectedAddressLabel = appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, appWindow.current_subaddress_table_index);
if (selectedAddressLabel == "") {
selectedAddressDrescription.text = "(" + qsTr("no label") + ")" + translationManager.emptyString
} else {
selectedAddressDrescription.text = selectedAddressLabel
}
}
} }
} }
} }
@@ -238,84 +739,6 @@ Rectangle {
whiteColor: MoneroComponents.Style._w_appWindowBorderColor whiteColor: MoneroComponents.Style._w_appWindowBorderColor
} }
} }
MoneroComponents.CheckBox {
id: addNewAddressCheckbox
border: false
uncheckedIcon: FontAwesome.plusCircle
toggleOnClick: false
fontAwesomeIcons: true
fontSize: 16
iconOnTheLeft: true
Layout.fillWidth: true
Layout.topMargin: 10
text: qsTr("Create new address") + translationManager.emptyString;
onClicked: {
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
inputDialog.onAcceptedCallback = function() {
appWindow.currentWallet.subaddress.addRow(appWindow.currentWallet.currentSubaddressAccount, inputDialog.inputText)
current_subaddress_table_index = appWindow.currentWallet.numSubaddresses(appWindow.currentWallet.currentSubaddressAccount) - 1
subaddressListView.currentIndex = current_subaddress_table_index
}
inputDialog.onRejectedCallback = null;
inputDialog.open()
}
}
}
ColumnLayout {
Layout.alignment: Qt.AlignHCenter
spacing: 11
property int qrSize: 220
Rectangle {
id: qrContainer
color: MoneroComponents.Style.blackTheme ? "white" : "transparent"
Layout.fillWidth: true
Layout.maximumWidth: parent.qrSize
Layout.preferredHeight: width
radius: 4
Image {
id: qrCode
anchors.fill: parent
anchors.margins: 1
smooth: false
fillMode: Image.PreserveAspectFit
source: "image://qrcode/" + TxUtils.makeQRCodeString(appWindow.current_address)
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
onPressAndHold: qrFileDialog.open()
}
}
}
MoneroComponents.StandardButton {
Layout.preferredWidth: 220
small: true
text: FontAwesome.save + " %1".arg(qsTr("Save as image")) + translationManager.emptyString
label.font.family: FontAwesome.fontFamily
fontSize: 13
onClicked: qrFileDialog.open()
}
MoneroComponents.StandardButton {
Layout.preferredWidth: 220
small: true
text: FontAwesome.eye + " %1".arg(qsTr("Show on device")) + translationManager.emptyString
label.font.family: FontAwesome.fontFamily
fontSize: 13
visible: appWindow.currentWallet ? appWindow.currentWallet.isHwBacked() : false
onClicked: {
appWindow.currentWallet.deviceShowAddressAsync(
appWindow.currentWallet.currentSubaddressAccount,
appWindow.current_subaddress_table_index,
'');
}
}
} }
MessageDialog { MessageDialog {
@@ -330,12 +753,14 @@ Rectangle {
selectExisting: false selectExisting: false
nameFilters: ["Image (*.png)"] nameFilters: ["Image (*.png)"]
onAccepted: { onAccepted: {
if(!walletManager.saveQrCode(TxUtils.makeQRCodeString(appWindow.current_address), walletManager.urlToLocalPath(fileUrl))) { if(!walletManager.saveQrCode(generateQRCodeString(), walletManager.urlToLocalPath(fileUrl))) {
console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) ) console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) )
receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString; receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString;
receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString; receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString;
receivePageDialog.icon = StandardIcon.Error receivePageDialog.icon = StandardIcon.Error
receivePageDialog.open() receivePageDialog.open()
} else {
appWindow.showStatusMessage(qsTr("QR code saved to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString, 3);
} }
} }
} }
@@ -343,16 +768,23 @@ Rectangle {
function onPageCompleted() { function onPageCompleted() {
console.log("Receive page loaded"); console.log("Receive page loaded");
pageReceive.clearFields();
subaddressListView.model = appWindow.currentWallet.subaddressModel; subaddressListView.model = appWindow.currentWallet.subaddressModel;
if (appWindow.currentWallet) { if (appWindow.currentWallet) {
appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, 0) appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, 0)
appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount) appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount)
if (subaddressListView.currentIndex == -1) {
subaddressListView.currentIndex = 0;
}
} }
} }
function clearFields() { function clearFields() {
// @TODO: add fields amountToReceiveFiat.text = "";
amountToReceiveXMR.text = "";
txDescriptionInput.text = "";
receiverNameInput.text = "";
} }
function onPageClosed() { function onPageClosed() {

View File

@@ -112,11 +112,8 @@ Rectangle {
MoneroComponents.LabelSubheader { MoneroComponents.LabelSubheader {
Layout.fillWidth: true Layout.fillWidth: true
textFormat: Text.RichText textFormat: Text.RichText
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>" + text: qsTr("Outputs marked as spent") + translationManager.emptyString
qsTr("Outputs marked as spent") + " <a href='#'>" + qsTr("Help") + "</a>" + translationManager.emptyString tooltip: qsTr(
onLinkActivated: {
sharedRingDBDialog.title = qsTr("Outputs marked as spent") + translationManager.emptyString;
sharedRingDBDialog.text = qsTr(
"In order to obscure which inputs in a Monero transaction are being spent, a third party should not be able " + "In order to obscure which inputs in a Monero transaction are being spent, a third party should not be able " +
"to tell which inputs in a ring are already known to be spent. Being able to do so would weaken the protection " + "to tell which inputs in a ring are already known to be spent. Being able to do so would weaken the protection " +
"afforded by ring signatures. If all but one of the inputs are known to be already spent, then the input being " + "afforded by ring signatures. If all but one of the inputs are known to be already spent, then the input being " +
@@ -128,9 +125,6 @@ Rectangle {
"Alternatively, you can scan the blockchain (and the blockchain of key-reusing Monero clones) yourself " + "Alternatively, you can scan the blockchain (and the blockchain of key-reusing Monero clones) yourself " +
"using the monero-blockchain-mark-spent-outputs tool to create a list of known spent outputs.<br>" "using the monero-blockchain-mark-spent-outputs tool to create a list of known spent outputs.<br>"
) + translationManager.emptyString ) + translationManager.emptyString
sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open()
}
} }
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
@@ -249,11 +243,8 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
textFormat: Text.RichText textFormat: Text.RichText
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>" + text: qsTr("Rings") + translationManager.emptyString
qsTr("Rings") + " <a href='#'>" + qsTr("Help") + "</a>" + translationManager.emptyString tooltip: qsTr(
onLinkActivated: {
sharedRingDBDialog.title = qsTr("Rings") + translationManager.emptyString;
sharedRingDBDialog.text = qsTr(
"In order to avoid nullifying the protection afforded by Monero's ring signatures, an output should not " + "In order to avoid nullifying the protection afforded by Monero's ring signatures, an output should not " +
"be spent with different rings on different blockchains. While this is normally not a concern, it can become one " + "be spent with different rings on different blockchains. While this is normally not a concern, it can become one " +
"when a key-reusing Monero clone allows you to spend existing outputs. In this case, you need to ensure this " + "when a key-reusing Monero clone allows you to spend existing outputs. In this case, you need to ensure this " +
@@ -266,9 +257,6 @@ Rectangle {
"If you do not use a key-reusing Monero clone without these safety features, then you do not need to do anything " + "If you do not use a key-reusing Monero clone without these safety features, then you do not need to do anything " +
"as it is all automated.<br>" "as it is all automated.<br>"
) + translationManager.emptyString ) + translationManager.emptyString
sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open()
}
} }
MoneroComponents.TextPlain { MoneroComponents.TextPlain {

View File

@@ -102,7 +102,7 @@ Rectangle {
recipientModel.newRecipient(address, Utils.removeTrailingZeros(amount || "")); recipientModel.newRecipient(address, Utils.removeTrailingZeros(amount || ""));
setPaymentId(payment_id || ""); setPaymentId(payment_id || "");
setDescription((recipient_name ? recipient_name + " " : "") + (tx_description || "")); setDescription((recipient_name ? recipient_name + (tx_description ? " (" + tx_description + ")" : "") : (tx_description || "")));
} }
function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) { function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) {
@@ -265,7 +265,6 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
Layout.leftMargin: 10
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 16 font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
@@ -277,6 +276,7 @@ Rectangle {
fontStyleName: "Solid" fontStyleName: "Solid"
fontPixelSize: 18 fontPixelSize: 18
text: FontAwesome.desktop text: FontAwesome.desktop
tooltip: qsTr("Grab QR code from screen") + translationManager.emptyString
onClicked: { onClicked: {
clearFields(); clearFields();
const codes = oshelper.grabQrCodesFromScreen(); const codes = oshelper.grabQrCodesFromScreen();
@@ -285,6 +285,9 @@ Rectangle {
if (!parsed.error) { if (!parsed.error) {
fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name); fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name);
break; break;
} else if (walletManager.addressValid(codes[index], appWindow.persistentSettings.nettype)) {
fillPaymentDetails(codes[index]);
break;
} }
} }
} }
@@ -295,6 +298,7 @@ Rectangle {
fontStyleName: "Solid" fontStyleName: "Solid"
text: FontAwesome.qrcode text: FontAwesome.qrcode
visible: appWindow.qrScannerEnabled visible: appWindow.qrScannerEnabled
tooltip: qsTr("Scan QR code") + translationManager.emptyString
onClicked: { onClicked: {
cameraUi.state = "Capture" cameraUi.state = "Capture"
cameraUi.qrcode_decoded.connect(updateFromQrCode) cameraUi.qrcode_decoded.connect(updateFromQrCode)
@@ -304,6 +308,7 @@ Rectangle {
MoneroComponents.InlineButton { MoneroComponents.InlineButton {
fontFamily: FontAwesome.fontFamily fontFamily: FontAwesome.fontFamily
text: FontAwesome.addressBook text: FontAwesome.addressBook
tooltip: qsTr("Import from address book") + translationManager.emptyString
onClicked: { onClicked: {
middlePanel.addressBookView.selectAndSend = true; middlePanel.addressBookView.selectAndSend = true;
appWindow.showPageRequest("AddressBook"); appWindow.showPageRequest("AddressBook");
@@ -315,12 +320,32 @@ Rectangle {
} }
} }
MoneroComponents.TextPlain { RowLayout {
Layout.preferredWidth: recipientLayout.secondRowWidth id: amountLabel
font.family: MoneroComponents.Style.fontRegular.name spacing: 6
font.pixelSize: 16 Layout.preferredWidth: 125
color: MoneroComponents.Style.defaultFontColor Layout.maximumWidth: recipientLayout.secondRowWidth
text: qsTr("Amount") + translationManager.emptyString
MoneroComponents.TextPlain {
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 16
color: MoneroComponents.Style.defaultFontColor
text: qsTr("Amount") + translationManager.emptyString
}
MoneroComponents.InlineButton {
fontFamily: FontAwesome.fontFamilySolid
fontStyleName: "Solid"
fontPixelSize: 16
text: FontAwesome.infinity
visible: recipientModel.count == 1
tooltip: qsTr("Send all unlocked balance of this account") + translationManager.emptyString
onClicked: recipientRepeater.itemAt(0).children[1].children[2].text = "(all)";
}
Item {
Layout.fillWidth: true
}
} }
Item { Item {
@@ -337,7 +362,9 @@ Rectangle {
Rectangle { Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Layout.rightMargin: recipientLayout.thirdRowWidth Layout.topMargin: -1
Layout.leftMargin: 1
Layout.rightMargin: recipientLayout.thirdRowWidth + 1
color: MoneroComponents.Style.inputBorderColorInActive color: MoneroComponents.Style.inputBorderColorInActive
height: 1 height: 1
visible: index > 0 visible: index > 0
@@ -350,12 +377,12 @@ Rectangle {
KeyNavigation.backtab: index > 0 ? recipientRepeater.itemAt(index - 1).children[1].children[2] : sendButton KeyNavigation.backtab: index > 0 ? recipientRepeater.itemAt(index - 1).children[1].children[2] : sendButton
KeyNavigation.tab: parent.children[2] KeyNavigation.tab: parent.children[2]
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
Layout.topMargin: recipientLayout.rowSpacing / 2 Layout.topMargin: index > 0 ? 0 : 1
Layout.bottomMargin: recipientLayout.rowSpacing / 2 Layout.bottomMargin: 2
Layout.fillWidth: true Layout.fillWidth: true
addressValidation: true addressValidation: true
borderDisabled: true borderDisabled: true
fontColor: error ? MoneroComponents.Style.errorColor : MoneroComponents.Style.defaultFontColor fontColor: error && text != "" ? MoneroComponents.Style.errorColor : MoneroComponents.Style.defaultFontColor
fontFamily: MoneroComponents.Style.fontMonoRegular.name fontFamily: MoneroComponents.Style.fontMonoRegular.name
fontSize: 14 fontSize: 14
inputPaddingBottom: 0 inputPaddingBottom: 0
@@ -367,17 +394,17 @@ Rectangle {
wrapMode: Text.WrapAnywhere wrapMode: Text.WrapAnywhere
placeholderText: { placeholderText: {
if(persistentSettings.nettype == NetworkType.MAINNET){ if(persistentSettings.nettype == NetworkType.MAINNET){
return "4.. / 8.. / OpenAlias"; return "4.. / 8.. / monero:.. / OpenAlias";
} else if (persistentSettings.nettype == NetworkType.STAGENET){ } else if (persistentSettings.nettype == NetworkType.STAGENET){
return "5.. / 7.."; return "5.. / 7.. / monero:..";
} else if(persistentSettings.nettype == NetworkType.TESTNET){ } else if(persistentSettings.nettype == NetworkType.TESTNET){
return "9.. / B.."; return "9.. / B.. / monero:..";
} }
} }
onTextChanged: { onTextChanged: {
const parsed = walletManager.parse_uri_to_object(text); const parsed = walletManager.parse_uri_to_object(text);
if (!parsed.error) { if (!parsed.error) {
fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description); fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name);
} }
address = text; address = text;
} }
@@ -430,6 +457,8 @@ Rectangle {
Rectangle { Rectangle {
Layout.fillHeight: true Layout.fillHeight: true
Layout.topMargin: index > 0 ? 0 : 1
Layout.bottomMargin: 1
Layout.leftMargin: recipientLayout.colSpacing / 2 - width Layout.leftMargin: recipientLayout.colSpacing / 2 - width
Layout.rightMargin: recipientLayout.colSpacing / 2 Layout.rightMargin: recipientLayout.colSpacing / 2
color: MoneroComponents.Style.inputBorderColorInActive color: MoneroComponents.Style.inputBorderColorInActive
@@ -440,14 +469,18 @@ Rectangle {
KeyNavigation.backtab: parent.children[0] KeyNavigation.backtab: parent.children[0]
KeyNavigation.tab: index + 1 < recipientRepeater.count ? recipientRepeater.itemAt(index + 1).children[1].children[0] : sendButton KeyNavigation.tab: index + 1 < recipientRepeater.count ? recipientRepeater.itemAt(index + 1).children[1].children[0] : sendButton
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
Layout.topMargin: recipientLayout.rowSpacing / 2 Layout.topMargin: index > 0 ? 0 : 1
Layout.bottomMargin: recipientLayout.rowSpacing / 2 Layout.bottomMargin: 2
Layout.rightMargin: recipientLayout.colSpacing / 2 Layout.rightMargin: recipientLayout.colSpacing / 2
Layout.preferredWidth: 125 Layout.preferredWidth: 125
Layout.maximumWidth: 125
borderDisabled: true borderDisabled: true
fontFamily: MoneroComponents.Style.fontMonoRegular.name fontFamily: MoneroComponents.Style.fontMonoRegular.name
fontSize: 14 fontSize: 14
inputPadding: 0 inputPaddingLeft: 0
inputPaddingRight: 0
inputPaddingTop: 0
inputPaddingBottom: 0
placeholderFontFamily: MoneroComponents.Style.fontMonoRegular.name placeholderFontFamily: MoneroComponents.Style.fontMonoRegular.name
placeholderFontSize: 14 placeholderFontSize: 14
placeholderLeftMargin: 0 placeholderLeftMargin: 0
@@ -482,22 +515,30 @@ Rectangle {
font.styleName: "Solid" font.styleName: "Solid"
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
opacity: mouseArea.containsMouse ? 1 : 0.85 opacity: mouseArea.containsMouse ? 1 : 0.85
text: recipientModel.count == 1 ? FontAwesome.infinity : FontAwesome.times text: FontAwesome.times
tooltip: qsTr("Remove recipient") + translationManager.emptyString
tooltipLeft: true
visible: recipientModel.count > 1
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
hoverEnabled: true hoverEnabled: true
onClicked: { onEntered: parent.tooltipPopup.open()
if (recipientModel.count == 1) { onExited: parent.tooltipPopup.close()
parent.parent.children[2].text = "(all)"; onClicked: recipientModel.remove(index);
} else {
recipientModel.remove(index);
}
}
} }
} }
MoneroComponents.TextPlain {
Layout.leftMargin: recipientLayout.colSpacing / 2
Layout.preferredWidth: recipientLayout.thirdRowWidth
horizontalAlignment: Text.AlignHCenter
font.family: MoneroComponents.Style.fontRegular.name
text: "XMR"
visible: recipientModel.count == 1
}
} }
} }
} }
@@ -514,6 +555,7 @@ Rectangle {
Layout.column: 0 Layout.column: 0
Layout.row: 0 Layout.row: 0
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
spacing: 0 spacing: 0
CheckBox { CheckBox {
@@ -553,11 +595,16 @@ Rectangle {
Layout.column: 1 Layout.column: 1
Layout.row: 0 Layout.row: 0
Layout.preferredWidth: recipientLayout.secondRowWidth Layout.preferredWidth: recipientLayout.secondRowWidth
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
Layout.maximumWidth: recipientLayout.secondRowWidth
borderDisabled: true borderDisabled: true
fontFamily: MoneroComponents.Style.fontMonoRegular.name fontFamily: MoneroComponents.Style.fontMonoRegular.name
fontSize: 14 fontSize: 14
inputHeight: 30 inputHeight: 30
inputPadding: 0 inputPaddingLeft: 0
inputPaddingRight: 0
inputPaddingTop: 0
inputPaddingBottom: 0
readOnly: true readOnly: true
text: Utils.removeTrailingZeros(walletManager.displayAmount(recipientModel.getAmountTotal())) text: Utils.removeTrailingZeros(walletManager.displayAmount(recipientModel.getAmountTotal()))
visible: recipientModel.count > 1 visible: recipientModel.count > 1
@@ -567,6 +614,7 @@ Rectangle {
Layout.column: 2 Layout.column: 2
Layout.row: 0 Layout.row: 0
Layout.preferredWidth: recipientLayout.thirdRowWidth Layout.preferredWidth: recipientLayout.thirdRowWidth
Layout.maximumWidth: recipientLayout.thirdRowWidth
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
text: "XMR" text: "XMR"
@@ -577,11 +625,16 @@ Rectangle {
Layout.column: 1 Layout.column: 1
Layout.row: recipientModel.count > 1 ? 1 : 0 Layout.row: recipientModel.count > 1 ? 1 : 0
Layout.preferredWidth: recipientLayout.secondRowWidth Layout.preferredWidth: recipientLayout.secondRowWidth
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
Layout.maximumWidth: recipientLayout.secondRowWidth
borderDisabled: true borderDisabled: true
fontFamily: MoneroComponents.Style.fontMonoRegular.name fontFamily: MoneroComponents.Style.fontMonoRegular.name
fontSize: 14 fontSize: 14
inputHeight: 30 inputHeight: 30
inputPadding: 0 inputPaddingLeft: 0
inputPaddingRight: 0
inputPaddingTop: 0
inputPaddingBottom: 0
opacity: 0.7 opacity: 0.7
readOnly: true readOnly: true
text: fiatApiConvertToFiat(walletManager.displayAmount(recipientModel.getAmountTotal())) text: fiatApiConvertToFiat(walletManager.displayAmount(recipientModel.getAmountTotal()))
@@ -592,6 +645,8 @@ Rectangle {
Layout.column: 2 Layout.column: 2
Layout.row: recipientModel.count > 1 ? 1 : 0 Layout.row: recipientModel.count > 1 ? 1 : 0
Layout.preferredWidth: recipientLayout.thirdRowWidth Layout.preferredWidth: recipientLayout.thirdRowWidth
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
Layout.maximumWidth: recipientLayout.thirdRowWidth
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
opacity: 0.7 opacity: 0.7
@@ -620,13 +675,6 @@ Rectangle {
spacing: 0 spacing: 0
visible: appWindow.walletMode >= 2 visible: appWindow.walletMode >= 2
Label {
id: transactionPriority
Layout.topMargin: 0
text: qsTr("Transaction priority") + translationManager.emptyString
fontBold: false
fontSize: 16
}
// Note: workaround for translations in listElements // Note: workaround for translations in listElements
// ListElement: cannot use script for property value, so // ListElement: cannot use script for property value, so
// code like this wont work: // code like this wont work:
@@ -650,15 +698,18 @@ Rectangle {
spacing: 10 spacing: 10
StandardDropdown { StandardDropdown {
Layout.preferredWidth: 200 Layout.maximumWidth: 200
id: priorityDropdown id: priorityDropdown
currentIndex: 0 currentIndex: 0
dataModel: priorityModelV5 dataModel: priorityModelV5
labelText: qsTr("Transaction priority") + translationManager.emptyString
labelFontSize: 16
} }
MoneroComponents.TextPlain { MoneroComponents.TextPlain {
id: feeLabel id: feeLabel
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignBottom
Layout.bottomMargin: 11
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14 font.pixelSize: 14
color: MoneroComponents.Style.defaultFontColor color: MoneroComponents.Style.defaultFontColor
@@ -742,9 +793,11 @@ Rectangle {
} }
} }
LineEditMulti { LineEdit {
id: descriptionLine id: descriptionLine
placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString placeholderFontSize: 16
fontSize: 16
placeholderText: qsTr("Saved to local wallet history") + " (" + qsTr("only visible to you") + ")" + translationManager.emptyString
Layout.fillWidth: true Layout.fillWidth: true
visible: descriptionCheckbox.checked visible: descriptionCheckbox.checked
} }
@@ -802,7 +855,6 @@ Rectangle {
StandardButton { StandardButton {
id: sendButton id: sendButton
rightIcon: "qrc:///images/rightArrow.png" rightIcon: "qrc:///images/rightArrow.png"
rightIconInactive: "qrc:///images/rightArrowInactive.png"
Layout.topMargin: 4 Layout.topMargin: 4
text: qsTr("Send") + translationManager.emptyString text: qsTr("Send") + translationManager.emptyString
enabled: !sendButtonWarningBox.visible && !warningContent && !recipientModel.hasEmptyAddress() && !paymentIdWarningBox.visible enabled: !sendButtonWarningBox.visible && !warningContent && !recipientModel.hasEmptyAddress() && !paymentIdWarningBox.visible
@@ -845,6 +897,32 @@ Rectangle {
} }
} }
AdvancedOptionsItem {
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
title: qsTr("Outputs") + translationManager.emptyString
button1.text: qsTr("Export") + translationManager.emptyString
button1.enabled: appWindow.viewOnly
button1.onClicked: {
console.log("Transfer: export outputs clicked")
exportOutputsDialog.open();
}
button2.text: qsTr("Import") + translationManager.emptyString
button2.enabled: !appWindow.viewOnly
button2.onClicked: {
console.log("Transfer: import outputs clicked")
importOutputsDialog.open();
}
tooltip: {
var header = qsTr("Required for cold wallets to sign their corresponding key images") + translationManager.emptyString;
return "<style type='text/css'>.header{ font-size: 13px; } p{line-height:20px; margin-top:0px; margin-bottom:0px; " +
";} p.orange{color:#ff9323;}</style>" +
"<div class='header'>" + header + "</div>" +
"<p>" + qsTr("1. Using view-only wallet, export the outputs into a file") + "</p>" +
"<p>" + qsTr("2. Using cold wallet, import the outputs file") + "</p>" +
translationManager.emptyString
}
}
AdvancedOptionsItem { AdvancedOptionsItem {
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2 visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
title: qsTr("Key images") + translationManager.emptyString title: qsTr("Key images") + translationManager.emptyString
@@ -1019,6 +1097,41 @@ Rectangle {
} }
FileDialog {
id: exportOutputsDialog
selectMultiple: false
selectExisting: false
onAccepted: {
console.log(walletManager.urlToLocalPath(exportOutputsDialog.fileUrl))
if (currentWallet.exportOutputs(walletManager.urlToLocalPath(exportOutputsDialog.fileUrl), true)) {
appWindow.showStatusMessage(qsTr("Outputs successfully exported to file") + translationManager.emptyString, 3);
} else {
appWindow.showStatusMessage(currentWallet.errorString, 5);
}
}
onRejected: {
console.log("Canceled");
}
}
FileDialog {
id: importOutputsDialog
selectMultiple: false
selectExisting: true
title: qsTr("Please choose a file") + translationManager.emptyString
onAccepted: {
console.log(walletManager.urlToLocalPath(importOutputsDialog.fileUrl))
if (currentWallet.importOutputs(walletManager.urlToLocalPath(importOutputsDialog.fileUrl))) {
appWindow.showStatusMessage(qsTr("Outputs successfully imported to wallet") + translationManager.emptyString, 3);
} else {
appWindow.showStatusMessage(currentWallet.errorString, 5);
}
}
onRejected: {
console.log("Canceled");
}
}
//ExportKeyImagesDialog //ExportKeyImagesDialog
FileDialog { FileDialog {
id: exportKeyImagesDialog id: exportKeyImagesDialog
@@ -1026,7 +1139,11 @@ Rectangle {
selectExisting: false selectExisting: false
onAccepted: { onAccepted: {
console.log(walletManager.urlToLocalPath(exportKeyImagesDialog.fileUrl)) console.log(walletManager.urlToLocalPath(exportKeyImagesDialog.fileUrl))
currentWallet.exportKeyImages(walletManager.urlToLocalPath(exportKeyImagesDialog.fileUrl)); if (currentWallet.exportKeyImages(walletManager.urlToLocalPath(exportKeyImagesDialog.fileUrl), true)) {
appWindow.showStatusMessage(qsTr("Key images successfully exported to file") + translationManager.emptyString, 3);
} else {
appWindow.showStatusMessage(currentWallet.errorString, 5);
}
} }
onRejected: { onRejected: {
console.log("Canceled"); console.log("Canceled");
@@ -1041,7 +1158,11 @@ Rectangle {
title: qsTr("Please choose a file") + translationManager.emptyString title: qsTr("Please choose a file") + translationManager.emptyString
onAccepted: { onAccepted: {
console.log(walletManager.urlToLocalPath(importKeyImagesDialog.fileUrl)) console.log(walletManager.urlToLocalPath(importKeyImagesDialog.fileUrl))
currentWallet.importKeyImages(walletManager.urlToLocalPath(importKeyImagesDialog.fileUrl)); if (currentWallet.importKeyImages(walletManager.urlToLocalPath(importKeyImagesDialog.fileUrl))) {
appWindow.showStatusMessage(qsTr("Key images successfully imported to wallet") + translationManager.emptyString, 3);
} else {
appWindow.showStatusMessage(currentWallet.errorString, 5);
}
} }
onRejected: { onRejected: {
console.log("Canceled"); console.log("Canceled");

View File

@@ -116,7 +116,7 @@ Rectangle {
enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype)) enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype))
onClicked: { onClicked: {
console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text); console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text);
root.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text) middlePanel.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text)
} }
} }
@@ -201,7 +201,7 @@ Rectangle {
enabled: TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype))) enabled: TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))
onClicked: { onClicked: {
console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text); console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text);
root.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text) middlePanel.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text)
} }
} }

View File

@@ -211,7 +211,7 @@ Item {
smooth: false smooth: false
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
source: "image://qrcode/" + TxUtils.makeQRCodeString(appWindow.current_address, amountToReceive.text) source: "image://qrcode/" + walletManager.make_uri(appWindow.current_address, walletManager.amountFromString(amountToReceive.text))
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
@@ -400,7 +400,7 @@ Item {
font.pixelSize: 12 font.pixelSize: 12
font.bold: true font.bold: true
color: _color color: _color
text: TxUtils.makeQRCodeString(appWindow.current_address, amountToReceive.text) text: walletManager.make_uri(appWindow.current_address, walletManager.amountFromString(amountToReceive.text))
themeTransition: false themeTransition: false
MouseArea { MouseArea {
@@ -685,7 +685,7 @@ Item {
selectExisting: false selectExisting: false
nameFilters: ["Image (*.png)"] nameFilters: ["Image (*.png)"]
onAccepted: { onAccepted: {
if(!walletManager.saveQrCode(TxUtils.makeQRCodeString(appWindow.current_address, amountToReceive.text), walletManager.urlToLocalPath(fileUrl))) { if (!walletManager.saveQrCode(walletManager.make_uri(appWindow.current_address, walletManager.amountFromString(amountToReceive.text)), walletManager.urlToLocalPath(fileUrl))) {
console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) ) console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) )
receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString; receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString;
receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString; receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString;

View File

@@ -49,6 +49,7 @@ ColumnLayout {
property alias settingsStateViewState: settingsStateView.state property alias settingsStateViewState: settingsStateView.state
MoneroComponents.Navbar { MoneroComponents.Navbar {
id: navbarId
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.topMargin: height Layout.topMargin: height
Layout.bottomMargin: height Layout.bottomMargin: height
@@ -145,7 +146,7 @@ ColumnLayout {
PropertyAnimation { PropertyAnimation {
target: enterItem target: enterItem
property: "x" property: "x"
from: 0 - target.width from: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * - target.width
to: 0 to: 0
duration: 300 duration: 300
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
@@ -154,7 +155,7 @@ ColumnLayout {
target: exitItem target: exitItem
property: "x" property: "x"
from: 0 from: 0
to: target.width to: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * target.width
duration: 300 duration: 300
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }

View File

@@ -42,13 +42,15 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
property alias infoHeight: infoLayout.height property alias infoHeight: infoLayout.height
property string walletModeString: { property string walletModeString: {
var modeStr;
if(appWindow.walletMode === 0){ if(appWindow.walletMode === 0){
return qsTr("Simple mode") + translationManager.emptyString; modeStr = qsTr("Simple mode") + translationManager.emptyString;
} else if(appWindow.walletMode === 1){ } else if(appWindow.walletMode === 1){
return qsTr("Simple mode") + " (bootstrap)" + translationManager.emptyString; modeStr = qsTr("Simple mode") + " (bootstrap)" + translationManager.emptyString;
} else if(appWindow.walletMode === 2){ } else if(appWindow.walletMode === 2){
return "%1 (%2)".arg(qsTr("Advanced mode")).arg(persistentSettings.useRemoteNode ? qsTr("Remote node") : qsTr("Local node")) + translationManager.emptyString; modeStr = "%1 (%2)".arg(qsTr("Advanced mode")).arg(persistentSettings.useRemoteNode ? qsTr("Remote node") : qsTr("Local node")) + translationManager.emptyString;
} }
return modeStr + (persistentSettings.portable ? ", %1".arg(qsTr("portable")) : "");
} }
ColumnLayout { ColumnLayout {
@@ -189,13 +191,7 @@ Rectangle {
inputDialog.onAcceptedCallback = function() { inputDialog.onAcceptedCallback = function() {
var _restoreHeight; var _restoreHeight;
if (inputDialog.inputText) { if (inputDialog.inputText) {
var restoreHeightText = inputDialog.inputText; _restoreHeight = Utils.parseDateStringOrRestoreHeightAsInteger(inputDialog.inputText);
// Parse date string or restore height as integer
if(restoreHeightText.indexOf('-') === 4 && restoreHeightText.length === 10) {
_restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeightText, Utils.netTypeToString());
} else {
_restoreHeight = parseInt(restoreHeightText)
}
} }
if (!isNaN(_restoreHeight)) { if (!isNaN(_restoreHeight)) {
if(_restoreHeight >= 0) { if(_restoreHeight >= 0) {
@@ -399,9 +395,9 @@ Rectangle {
data += "\nWallet log path: " + logger.logFilePath; data += "\nWallet log path: " + logger.logFilePath;
data += "\nWallet mode: " + walletModeString; data += "\nWallet mode: " + walletModeString;
data += "\nGraphics mode: " + isOpenGL ? "OpenGL" : "Low graphics mode"; data += "\nGraphics mode: " + (isOpenGL ? "OpenGL" : "Low graphics mode");
if (isTails) if (isTails)
data += "\nTails: " + tailsUsePersistence ? "persistent" : "persistence disabled"; data += "\nTails: " + (tailsUsePersistence ? "persistent" : "persistence disabled");
console.log("Copied to clipboard"); console.log("Copied to clipboard");
clipboard.setText(data); clipboard.setText(data);

View File

@@ -178,52 +178,34 @@ Rectangle {
Layout.leftMargin: 36 Layout.leftMargin: 36
columnSpacing: 32 columnSpacing: 32
ColumnLayout { MoneroComponents.StandardDropdown {
spacing: 10 id: fiatPriceProviderDropDown
Layout.fillWidth: true Layout.maximumWidth: 200
labelText: qsTr("Price source") + translationManager.emptyString
labelFontSize: 14
dataModel: fiatPriceProvidersModel
onChanged: {
var obj = dataModel.get(currentIndex);
persistentSettings.fiatPriceProvider = obj.data;
MoneroComponents.Label { if(persistentSettings.fiatPriceEnabled)
Layout.fillWidth: true appWindow.fiatApiRefresh();
fontSize: 14
text: qsTr("Price source") + translationManager.emptyString
}
MoneroComponents.StandardDropdown {
id: fiatPriceProviderDropDown
Layout.fillWidth: true
dataModel: fiatPriceProvidersModel
onChanged: {
var obj = dataModel.get(currentIndex);
persistentSettings.fiatPriceProvider = obj.data;
if(persistentSettings.fiatPriceEnabled)
appWindow.fiatApiRefresh();
}
} }
} }
ColumnLayout { MoneroComponents.StandardDropdown {
spacing: 10 id: fiatPriceCurrencyDropdown
Layout.fillWidth: true Layout.maximumWidth: 100
labelText: qsTr("Currency") + translationManager.emptyString
labelFontSize: 14
currentIndex: persistentSettings.fiatPriceCurrency === "xmrusd" ? 0 : 1
dataModel: fiatPriceCurrencyModel
onChanged: {
var obj = dataModel.get(currentIndex);
persistentSettings.fiatPriceCurrency = obj.data;
MoneroComponents.Label { if(persistentSettings.fiatPriceEnabled)
Layout.fillWidth: true appWindow.fiatApiRefresh();
fontSize: 14
text: qsTr("Currency") + translationManager.emptyString
}
MoneroComponents.StandardDropdown {
id: fiatPriceCurrencyDropdown
Layout.fillWidth: true
currentIndex: persistentSettings.fiatPriceCurrency === "xmrusd" ? 0 : 1
dataModel: fiatPriceCurrencyModel
onChanged: {
var obj = dataModel.get(currentIndex);
persistentSettings.fiatPriceCurrency = obj.data;
if(persistentSettings.fiatPriceEnabled)
appWindow.fiatApiRefresh();
}
} }
} }

View File

@@ -28,7 +28,7 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0 import QtQuick.Controls 2.2
import "../../js/Utils.js" as Utils import "../../js/Utils.js" as Utils
import "../../components" as MoneroComponents import "../../components" as MoneroComponents
@@ -132,6 +132,18 @@ Rectangle {
font.pixelSize: 18 font.pixelSize: 18
font.family: MoneroComponents.Style.fontRegular.name font.family: MoneroComponents.Style.fontRegular.name
text: qsTr("Daemon log") + translationManager.emptyString text: qsTr("Daemon log") + translationManager.emptyString
themeTransition: false
onColorChanged: {
var flickableContentYBefore = flickable.contentY
var daemonLogText = consoleArea.text
consoleArea.clear();
if (MoneroComponents.Style.blackTheme) {
consoleArea.append(daemonLogText.replace(/#000000/g, '#ffffff').replace(/#008000/g, '#00ff00'));
} else {
consoleArea.append(daemonLogText.replace(/#ffffff/g, '#000000').replace(/#00ff00/g, '#008000'));
}
flickable.contentY = flickableContentYBefore
}
} }
Item { Item {
@@ -164,7 +176,7 @@ Rectangle {
wrapMode: TextEdit.Wrap wrapMode: TextEdit.Wrap
readOnly: true readOnly: true
function logCommand(msg){ function logCommand(msg){
msg = log_color(msg, "lime"); msg = log_color(msg, MoneroComponents.Style.blackTheme ? "lime" : "green");
consoleArea.append(msg); consoleArea.append(msg);
} }
function logMessage(msg){ function logMessage(msg){
@@ -173,7 +185,7 @@ Rectangle {
if(msg.toLowerCase().indexOf('error') >= 0){ if(msg.toLowerCase().indexOf('error') >= 0){
color = MoneroComponents.Style.errorColor; color = MoneroComponents.Style.errorColor;
} else if (msg.toLowerCase().indexOf('warning') >= 0){ } else if (msg.toLowerCase().indexOf('warning') >= 0){
color = MoneroComponents.Style.warningColor; color = "#fa6800"
} }
// format multi-lines // format multi-lines
@@ -206,6 +218,7 @@ Rectangle {
ScrollBar.vertical: ScrollBar { ScrollBar.vertical: ScrollBar {
onActiveChanged: if (!active && !isMac) active = true onActiveChanged: if (!active && !isMac) active = true
policy: isMac ? ScrollBar.AsNeeded : ScrollBar.AlwaysOn
} }
} }
} }
@@ -213,11 +226,14 @@ Rectangle {
MoneroComponents.LineEdit { MoneroComponents.LineEdit {
id: sendCommandText id: sendCommandText
Layout.fillWidth: true Layout.fillWidth: true
inputPaddingTop: 0
inputPaddingBottom: 0
property var lastCommands: [] property var lastCommands: []
property int currentCommandIndex property int currentCommandIndex
enabled: !persistentSettings.useRemoteNode enabled: !persistentSettings.useRemoteNode
fontBold: false fontBold: false
placeholderText: qsTr("command + enter (e.g 'help' or 'status')") + translationManager.emptyString fontSize: 16
placeholderText: qsTr("Type a command (e.g '%1' or '%2') and press Enter").arg("help").arg("status") + translationManager.emptyString
placeholderFontSize: 16 placeholderFontSize: 16
Keys.onUpPressed: { Keys.onUpPressed: {
if (currentCommandIndex != 0) { if (currentCommandIndex != 0) {

View File

@@ -72,7 +72,7 @@ Rectangle{
Layout.fillHeight: true Layout.fillHeight: true
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
color: MoneroComponents.Style.blackTheme ? "white" : "darkgrey" color: "darkgrey"
width: 2 width: 2
} }
@@ -165,7 +165,7 @@ Rectangle{
Layout.fillHeight: true Layout.fillHeight: true
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
color: MoneroComponents.Style.blackTheme ? "white" : "darkgrey" color: "darkgrey"
width: 2 width: 2
} }

Some files were not shown because too many files have changed in this diff Show More