Compare commits

...

142 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
selsta
57c205206c TransactionInfo: add isCoinbase and description 2021-06-18 03:34:47 +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
136 changed files with 47272 additions and 28832 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:
submodules: recursive
- 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
run: DEV_MODE=ON make release -j3
- name: test qml
@@ -52,7 +52,7 @@ jobs:
- uses: eine/setup-msys2@v2
with:
update: true
install: mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-protobuf-c mingw-w64-x86_64-libusb git mingw-w64-x86_64-qt5 mingw-w64-x86_64-libgcrypt
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
run: DEV_MODE=ON make release-win64 -j2
- name: test qml
@@ -65,14 +65,11 @@ jobs:
with:
submodules: recursive
- 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
run: pip3 install requests semantic_version lxml py7zr
run: pip3 install defusedxml
- name: download qt
run: |
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
run: python3 monero-gui/.github/qt_helper.py mac_x64 desktop 5.15.2 clang_64 c384008156fe63cc183bade0316828c598ff3e5074397c0c9ccc588d6cdc5aca
working-directory: ../
- name: build
run: CMAKE_PREFIX_PATH=/Users/runner/work/monero-gui/5.15.2/clang_64 make release -j3
@@ -96,6 +93,7 @@ jobs:
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
key: docker-linux-static-{hash}
@@ -125,6 +123,7 @@ jobs:
with:
submodules: recursive
- uses: satackey/action-docker-layer-caching@v0.0.10
if: "!startsWith(github.ref, 'refs/tags/v')"
continue-on-error: true
with:
key: docker-windows-static-{hash}

View File

@@ -4,8 +4,8 @@ project(monero-gui)
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
set(VERSION_MAJOR "17")
set(VERSION_MINOR "2")
set(VERSION_REVISION "3")
set(VERSION_MINOR "3")
set(VERSION_REVISION "1")
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
option(STATIC "Link libraries statically, requires static Qt")
@@ -18,14 +18,12 @@ list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckLinkerFlag)
include(FindCcache)
if(DEBUG)
set(CMAKE_VERBOSE_MAKEFILE ON)
endif()
set(BUILD_GUI_DEPS ON)
set(ARCH "x86-64" CACHE STRING "Target architecture")
set(BUILD_64 ON CACHE BOOL "Build 64-bit binaries")
if(NOT MANUAL_SUBMODULES)
@@ -71,8 +69,6 @@ endif()
if(STATIC)
message(STATUS "Initiating static build")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
add_definitions(-DMONERO_GUI_STATIC)
endif()
@@ -112,15 +108,6 @@ monero_gui_add_library(gui_version SOURCES version.js DEPENDS genversiongui)
message(STATUS "${CMAKE_MODULE_PATH}")
# OpenSSL
if(APPLE AND NOT OPENSSL_ROOT_DIR)
execute_process(COMMAND brew --prefix openssl OUTPUT_VARIABLE OPENSSL_ROOT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
find_package(OpenSSL REQUIRED)
message(STATUS "OpenSSL: Version ${OPENSSL_VERSION}")
message(STATUS "OpenSSL: include dir at ${OPENSSL_INCLUDE_DIR}")
message(STATUS "OpenSSL: libraries at ${OPENSSL_LIBRARIES} ${OPENSSL_SSL_LIBRARIES}")
if(WITH_SCANNER)
add_definitions(-DWITH_SCANNER)
endif()
@@ -129,27 +116,6 @@ endif()
find_library(SODIUM_LIBRARY sodium)
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)
set(CMAKE_SKIP_RPATH ON)
set(CMAKE_FIND_LIBRARY_SUFFIXES_PREV ${CMAKE_FIND_LIBRARY_SUFFIXES})
@@ -167,19 +133,6 @@ if(UNIX AND NOT APPLE AND NOT ANDROID)
endif()
endif()
if(MINGW)
string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}")
message(STATUS "MSYS location: ${msys2_install_path}")
set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include")
# This is necessary because otherwise CMake will make Boost libraries -lfoo
# rather than a full path. Unfortunately, this makes the shared libraries get
# linked due to a bug in CMake which misses putting -static flags around the
# -lfoo arguments.
set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib)
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
endif()
set(QT5_LIBRARIES
Qt5Core
Qt5Quick
@@ -392,10 +345,6 @@ if(ANDROID)
endforeach()
endif()
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIRS}")
message(STATUS "Using Boost libraries at ${Boost_LIBRARIES}")
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
if(MINGW)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
set(EXTRA_LIBRARIES mswsock;ws2_32;iphlpapi;crypt32;bcrypt)
@@ -430,7 +379,7 @@ if(APPLE)
endif()
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()
if(APPLE)
@@ -438,8 +387,6 @@ if(APPLE)
endif()
# warnings
add_c_flag_if_supported(-Werror C_SECURITY_FLAGS)
add_cxx_flag_if_supported(-Werror CXX_SECURITY_FLAGS)
add_c_flag_if_supported(-Wformat C_SECURITY_FLAGS)
add_cxx_flag_if_supported(-Wformat CXX_SECURITY_FLAGS)
add_c_flag_if_supported(-Wformat-security C_SECURITY_FLAGS)

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`
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

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_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
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 \
&& rm zlib-${ZLIB_VERSION}.tar.gz \
&& 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_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
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 \
&& rm openssl-${OPENSSL_VERSION}.tar.gz \
&& 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 \
&& 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_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3
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 && \
rm openssl-1.1.1g.tar.gz && \
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 install && \
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) && \
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 && \
git reset --hard d27d4526fe89b7cdeb4b296280c4a6cf7efe21f8 && \
git reset --hard ab18fea3500841fc312630d49ed6840b3aedb34d && \
cp -a contrib/depends / && \
cd .. && \
rm -rf monero

View File

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

View File

@@ -29,7 +29,7 @@ else
endif
default:
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
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:
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)
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:
mkdir -p build && cd build && rm -rf *
scanner:
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D WITH_SCANNER=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
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:
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:
mkdir -p $(builddir)/release
cd $(builddir)/release
cmake -D DEV_MODE=$(or ${DEV_MODE},OFF) -D ARCH="armv8-a" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D BUILD_TAG="linux-armv8" $(topdir) && $(MAKE)
release-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:
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

@@ -75,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.
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:
<a href="https://translate.getmonero.org/engage/monero/?utm_source=widget">
<img src="https://translate.getmonero.org/widgets/monero/-/gui-wallet/horizontal-auto.svg" alt="Translation status" />
</a>
@@ -88,6 +89,7 @@ Packages are available for
* Arch Linux: [monero-gui](https://www.archlinux.org/packages/community/x86_64/monero-gui/)
* Debian: See the [whonix/monero-gui repository](https://gitlab.com/whonix/monero-gui#how-to-install-monero-using-apt-get)
* Void Linux: `xbps-install -S monero-gui`
* Flatpak: [Monero GUI](https://flathub.org/apps/details/org.getmonero.Monero)
* GuixSD: `guix package -i monero-gui`
* macOS (homebrew): `brew install --cask monero-wallet`
@@ -97,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*: 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)
1. Install Docker [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
@@ -228,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`
- 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`
@@ -237,9 +244,7 @@ The following instructions will fetch Qt from your distribution's repositories i
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia`
- For Gentoo
The *qml* USE flag must be enabled.
- For Gentoo
`emerge dev-qt/qtmultimedia:5`
@@ -253,11 +258,20 @@ The following instructions will fetch Qt from your distribution's repositories i
4. Build
If on x86-64:
```
make release -j4
```
If on ppc64le:
```
make release-linux-ppc64le -j4
```
\* `4` - number of CPU threads to use
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/gcc_64 make release -j4`
\* 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.
@@ -269,7 +283,7 @@ The executable can be found in the build/release/bin folder.
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:
@@ -288,7 +302,7 @@ The executable can be found in the build/release/bin folder.
make release -j4
```
\* `4` - number of CPU threads to use
\* Add `CMAKE_PREFIX_PATH` enviroment variable to set a custom Qt install directory, e.g. `CMAKE_PREFIX_PATH=$HOME/Qt/5.9.7/clang_64 make release -j4`
\* 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.

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
# 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")
endfunction ()
@@ -36,11 +37,8 @@ if ("$Format:$" STREQUAL "")
write_static_version_header("release")
elseif (GIT_FOUND OR Git_FOUND)
message(STATUS "Found Git: ${GIT_EXECUTABLE}")
include(GitGetVersionTag)
git_get_version_tag(${GIT_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR} VERSION_TAG_GUI)
STRING(REGEX REPLACE "^v([0-9])" "\\1" VERSION_TAG_GUI ${VERSION_TAG_GUI})
write_static_version_header(${VERSION_TAG_GUI})
get_version_tag_from_git("${GIT_EXECUTABLE}")
write_static_version_header(${VERSIONTAG})
else()
message(STATUS "WARNING: Git was not found!")
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

@@ -37,27 +37,30 @@ RowLayout {
Layout.fillWidth: false
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
spacing: 4
RowLayout {
Layout.fillWidth: false
spacing: 12
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
StandardButton {
id: button1
small: true
primary: false
visible: button1.text
}
StandardButton {
id: button2
small: true
primary: false
visible: button2.text
}
StandardButton {
id: button3
small: true
primary: false
visible: button3.text
}
}

View File

@@ -5,14 +5,21 @@ import FontAwesome 1.0
import "../components" as MoneroComponents
MouseArea {
signal cut()
signal copy()
signal paste()
signal remove()
signal selectAll()
id: root
acceptedButtons: Qt.RightButton
anchors.fill: parent
onClicked: {
if (mouse.button === Qt.RightButton)
if (mouse.button === Qt.RightButton) {
root.parent.persistentSelection = true;
contextMenu.open()
root.parent.cursorVisible = true;
}
}
Menu {
@@ -22,19 +29,50 @@ MouseArea {
border.color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
border.width: 1
radius: 2
color: MoneroComponents.Style.buttonBackgroundColorDisabled
color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.buttonBackgroundColorDisabled : "#E5E5E5"
}
padding: 1
width: 100
width: 110
x: root.mouseX
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 {
enabled: root.parent.canPaste === true
glyphIcon: FontAwesome.paste
onTriggered: root.paste()
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 {
color: MoneroComponents.Style.buttonBackgroundColorDisabledHover
opacity: mouse.containsMouse ? 1 : 0
opacity: 0
MouseArea {
id: mouse
anchors.fill: parent
hoverEnabled: true
onClicked: menuItem.triggered()
visible: menuItem.enabled
onEntered: {
parent.opacity = 1;
}
onExited: {
parent.opacity = 0;
}
onClicked: {
if (menuItem.enabled) {
menuItem.triggered();
parent.opacity = 0;
}
}
}
}
contentItem: RowLayout {
anchors.fill: parent
anchors.leftMargin: 10
anchors.leftMargin: 20
anchors.rightMargin: 10
opacity: menuItem.enabled ? 1 : 0.4
spacing: 8
@@ -42,7 +52,7 @@ MenuItem {
}
Text {
color: MoneroComponents.Style.buttonTextColor
color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.buttonTextColor : MoneroComponents.Style.defaultFontColor
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14
Layout.fillWidth: true

View File

@@ -64,7 +64,7 @@ Item {
Rectangle{
id: rect
anchors.fill: parent
color: MoneroComponents.Style.buttonInlineBackgroundColor
color: buttonArea.containsMouse ? MoneroComponents.Style.buttonInlineBackgroundColorHover : MoneroComponents.Style.buttonInlineBackgroundColor
radius: 4
@@ -101,13 +101,9 @@ Item {
}
onEntered: {
tooltip.text ? tooltip.tooltipPopup.open() : ""
rect.color = buttonColor ? buttonColor : "#707070";
rect.opacity = 0.8;
}
onExited: {
tooltip.text ? tooltip.tooltipPopup.close() : ""
rect.opacity = 1.0;
rect.color = buttonColor ? buttonColor : "#808080";
}
}
}

View File

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

View File

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

View File

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

View File

@@ -218,7 +218,7 @@ ColumnLayout {
Layout.preferredHeight: inputHeight
leftPadding: item.inputPaddingLeft
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPaddingRight
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPaddingRight + (password || passwordLinked ? 45 : 0)
topPadding: item.inputPaddingTop
bottomPadding: item.inputPaddingBottom

View File

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

View File

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

View File

@@ -107,8 +107,9 @@ ColumnLayout {
MoneroComponents.Label {
id: trustedDaemonCheckMark
anchors.left: addressText.right
anchors.leftMargin: 6
anchors.leftMargin: 3
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: 2
z: itemMouseArea.z + 1
fontSize: 16
fontFamily: FontAwesome.fontFamilySolid
@@ -144,6 +145,9 @@ ColumnLayout {
tooltipLeft: true
onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) {
remoteNodesModel.set(index, remoteNode)
if (index === remoteNodesModel.selected) {
remoteNodesModel.applyRemoteNode(index)
}
})
}

View File

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

View File

@@ -39,16 +39,12 @@ Item {
property bool primary: true
property string rightIcon: ""
property string rightIconInactive: ""
property color textColor: !button.enabled
? MoneroComponents.Style.buttonTextColorDisabled
: primary
? MoneroComponents.Style.buttonTextColor
: MoneroComponents.Style.buttonSecondaryTextColor;
property color textColor: primary ? MoneroComponents.Style.buttonTextColor : MoneroComponents.Style.buttonSecondaryTextColor;
property bool small: false
property alias text: label.text
property alias fontBold: label.font.bold
property int fontSize: {
if(small) return 14;
if(small) return 13.5;
else return 16;
}
property alias label: label
@@ -72,6 +68,7 @@ Item {
anchors.fill: parent
radius: 3
border.width: parent.focus && parent.enabled ? 1 : 0
opacity: 1
state: button.enabled ? "active" : "disabled"
Component.onCompleted: state = state
@@ -102,7 +99,14 @@ Item {
when: !button.enabled
PropertyChanges {
target: buttonRect
color: MoneroComponents.Style.buttonBackgroundColorDisabled
opacity: 0.5
color: primary
? MoneroComponents.Style.buttonBackgroundColor
: MoneroComponents.Style.buttonSecondaryBackgroundColor
}
PropertyChanges {
target: label
opacity: 0.5
}
}
]
@@ -122,7 +126,7 @@ Item {
MoneroComponents.TextPlain {
id: label
font.family: MoneroComponents.Style.fontBold.name
font.bold: true
font.bold: button.primary ? true : false
font.pixelSize: button.fontSize
color: !buttonArea.pressed ? button.textColor : "transparent"
visible: text !== ""
@@ -145,6 +149,7 @@ Item {
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
width: button.small ? 16 : 20
height: button.small ? 16 : 20
opacity: buttonRect.opacity
source: {
if (fontAwesomeIcon) return "";
if(button.rightIconInactive !== "" && !button.enabled) {

View File

@@ -191,7 +191,7 @@ ColumnLayout {
anchors.leftMargin: 12
anchors.rightMargin: 0
font.family: MoneroComponents.Style.fontRegular.name
font.bold: true
font.bold: false
font.pixelSize: fontItemSize
color: itemArea.containsMouse || index === columnid.currentIndex || itemArea.containsMouse ? "#FA6800" : "#FFFFFF"
text: qsTr(column1) + translationManager.emptyString

View File

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

View File

@@ -48,7 +48,7 @@ Rectangle {
Text {
id: icon
visible: tooltipIconVisible
color: MoneroComponents.Style.orange
color: MoneroComponents.Style.defaultFontColor
font.family: FontAwesome.fontFamily
font.pixelSize: 10
font.styleName: "Regular"
@@ -95,11 +95,12 @@ Rectangle {
delay: 200
RowLayout {
Layout.maximumWidth: 350
Layout.maximumWidth: 370
Text {
id: tooltip
width: contentWidth
Layout.maximumWidth: 370
color: MoneroComponents.Style.defaultFontColor
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 12

View File

@@ -35,6 +35,7 @@ Object {
property string arrowLeft : "\uf060"
property string arrowRight : "\uf061"
property string cashRegister: "\uf788"
property string checkCircle: "\uf058"
property string clipboard : "\uf0ea"
property string clockO : "\uf017"
property string cloud : "\uf0c2"

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.

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

View File

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

View File

@@ -259,9 +259,6 @@ ApplicationWindow {
walletPassword,
persistentSettings.nettype,
persistentSettings.kdfRounds);
// Hide titlebar based on persistentSettings.customDecorations
titleBar.visible = persistentSettings.customDecorations;
}
function closeWallet(callback) {
@@ -733,14 +730,18 @@ ApplicationWindow {
function onDaemonStarted(){
console.log("daemon started");
daemonStartStopInProgress = 0;
currentWallet.connected(true);
// resume refresh
currentWallet.startRefresh();
if (currentWallet) {
currentWallet.connected(true);
// resume refresh
currentWallet.startRefresh();
}
// resume simplemode connection timer
appWindow.disconnectedEpoch = Utils.epoch();
}
function onDaemonStopped(){
currentWallet.connected(true);
if (currentWallet) {
currentWallet.connected(true);
}
}
function onDaemonStartFailure(error) {
@@ -1898,7 +1899,7 @@ ApplicationWindow {
TitleBar {
id: titleBar
visible: persistentSettings.customDecorations && middlePanel.state !== "Merchant"
walletName: persistentSettings.displayWalletNameInTitleBar ? appWindow.walletName : ""
walletName: persistentSettings.displayWalletNameInTitleBar && rootItem.state != "wizard" ? appWindow.walletName : ""
anchors.left: parent.left
anchors.right: parent.right
onCloseClicked: appWindow.close();

2
monero

Submodule monero updated: 2222bea92f...ab18fea350

View File

@@ -164,11 +164,48 @@ Rectangle {
id: addressRow
spacing: 0
MoneroComponents.LabelSubheader {
Layout.fillWidth: true
fontSize: 24
textFormat: Text.RichText
text: qsTr("Accounts") + translationManager.emptyString
RowLayout {
spacing: 0
MoneroComponents.LabelSubheader {
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 {
@@ -349,30 +386,6 @@ Rectangle {
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()
}
}
}
}

View File

@@ -97,6 +97,8 @@ Rectangle {
MoneroComponents.StandardButton {
id: addFirstEntryButton
Layout.topMargin: 20
Layout.alignment: Qt.AlignHCenter
small: true
text: qsTr("Add an address") + translationManager.emptyString
onClicked: {
root.showAddAddress();
@@ -115,6 +117,18 @@ Rectangle {
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 {
id: addressBookListRow
property int addressBookListItemHeight: 50
@@ -235,7 +249,7 @@ Rectangle {
}
MoneroComponents.IconButton {
id: renameButton
id: editEntryButton
image: "qrc:///images/edit.svg"
color: MoneroComponents.Style.defaultFontColor
opacity: isOpenGL ? 0.5 : 1
@@ -244,7 +258,7 @@ Rectangle {
fontAwesomeFallbackOpacity: 0.5
Layout.preferredWidth: 23
Layout.preferredHeight: 21
tooltip: qsTr("Edit address label") + translationManager.emptyString
tooltip: qsTr("Edit entry") + translationManager.emptyString
onClicked: {
addressBookListView.currentIndex = index;
@@ -287,23 +301,6 @@ Rectangle {
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 {
id: addContactLayout
@@ -313,11 +310,12 @@ Rectangle {
MoneroComponents.Label {
fontSize: 32
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 {
id: addressLine
visible: !root.editEntry
Layout.topMargin: 20
KeyNavigation.backtab: deleteButton.visible ? deleteButton: cancelButton
KeyNavigation.tab: resolveButton.visible ? resolveButton : descriptionLine
@@ -325,16 +323,16 @@ Rectangle {
.arg(qsTr("Address")) + translationManager.emptyString
placeholderText: {
if(persistentSettings.nettype == NetworkType.MAINNET){
return "4.. / 8.. / OpenAlias";
return "4.. / 8.. / monero:.. / OpenAlias";
} else if (persistentSettings.nettype == NetworkType.STAGENET){
return "5.. / 7..";
return "5.. / 7.. / monero:..";
} else if(persistentSettings.nettype == NetworkType.TESTNET){
return "9.. / B..";
return "9.. / B.. / monero:..";
}
}
wrapMode: Text.WrapAnywhere
addressValidation: true
pasteButton: true
pasteButton: false
onTextChanged: {
const parsed = walletManager.parse_uri_to_object(addressLine.text);
if (!parsed.error) {
@@ -436,15 +434,42 @@ Rectangle {
}
RowLayout {
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 {
id: addButton
KeyNavigation.backtab: descriptionLine
KeyNavigation.tab: cancelButton
small: true
text: (root.editEntry ? qsTr("Save") : qsTr("Add")) + translationManager.emptyString
enabled: root.checkInformation(addressLine.text, appWindow.persistentSettings.nettype)
onClicked: {
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;
// TODO: check currentWallet.addressBook.errorString() instead.
if(currentWallet.addressBook.errorCode() === AddressBook.Invalid_Address)
@@ -457,33 +482,9 @@ Rectangle {
informationPopup.onCloseCallback = null
informationPopup.open();
} else {
if (root.editEntry) {
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
}
root.showAddressBook();
currentWallet.addressBook.setDescription(addressBookListView.currentIndex, descriptionLine.text);
}
}
}
MoneroComponents.StandardButton {
id: cancelButton
KeyNavigation.backtab: addButton
KeyNavigation.tab: deleteButton.visible ? deleteButton : addressLine
text: qsTr("Cancel") + translationManager.emptyString
primary: false
onClicked: root.showAddressBook();
}
MoneroComponents.StandardButton {
id: deleteButton
KeyNavigation.backtab: cancelButton
KeyNavigation.tab: addressLine
visible: root.editEntry
text: qsTr("Delete") + translationManager.emptyString
primary: false
onClicked: {
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
root.showAddressBook();
root.showAddressBook()
}
}
}

View File

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

View File

@@ -37,6 +37,7 @@ Rectangle {
color: "transparent"
property alias miningHeight: mainLayout.height
property double currentHashRate: 0
property int threads: idealThreadCount / 2
ColumnLayout {
id: mainLayout
@@ -68,7 +69,7 @@ Rectangle {
MoneroComponents.TextPlain {
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
Layout.fillWidth: true
font.family: MoneroComponents.Style.fontRegular.name
@@ -106,30 +107,56 @@ Rectangle {
Layout.fillWidth: true
spacing: 16
MoneroComponents.LineEdit {
id: soloMinerThreadsLine
Layout.minimumWidth: 200
text: "1"
validator: IntValidator { bottom: 1; top: idealThreadCount }
}
RowLayout {
MoneroComponents.StandardButton {
id: removeThreadButton
small: true
primary: false
text: ""
enabled: threads > 1
onClicked: threads--
}
MoneroComponents.TextPlain {
id: numAvailableThreadsText
text: qsTr("Max # of CPU threads available for mining: ") + idealThreadCount + translationManager.emptyString
wrapMode: Text.WordWrap
font.family: MoneroComponents.Style.fontRegular.name
font.pixelSize: 14
color: MoneroComponents.Style.defaultFontColor
MoneroComponents.TextPlain {
Layout.bottomMargin: 1
Layout.minimumWidth: 45
color: MoneroComponents.Style.defaultFontColor
text: threads
horizontalAlignment: Text.AlignHCenter
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 {
MoneroComponents.StandardButton {
id: autoRecommendedThreadsButton
small: true
text: qsTr("Use recommended # of threads") + translationManager.emptyString
primary: false
text: qsTr("Use half (recommended)") + translationManager.emptyString
enabled: startSoloMinerButton.enabled
onClicked: {
soloMinerThreadsLine.text = Math.floor(idealThreadCount / 2);
threads = idealThreadCount / 2
appWindow.showStatusMessage(qsTr("Set to use recommended # of threads"),3)
}
}
@@ -137,25 +164,16 @@ Rectangle {
MoneroComponents.StandardButton {
id: autoSetMaxThreadsButton
small: true
text: qsTr("Use all threads") + translationManager.emptyString
primary: false
text: qsTr("Use all threads") + " (" + idealThreadCount + ")" + translationManager.emptyString
enabled: startSoloMinerButton.enabled
onClicked: {
soloMinerThreadsLine.text = idealThreadCount
threads = idealThreadCount
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 {
// Disable this option until stable
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 {
Layout.alignment : Qt.AlignTop | Qt.AlignLeft
@@ -191,9 +238,10 @@ Rectangle {
visible: true
id: startSoloMinerButton
small: true
primary: !stopSoloMinerButton.enabled
text: qsTr("Start mining") + translationManager.emptyString
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) {
update()
} else {
@@ -211,6 +259,7 @@ Rectangle {
visible: true
id: stopSoloMinerButton
small: true
primary: stopSoloMinerButton.enabled
text: qsTr("Stop mining") + translationManager.emptyString
onClicked: {
walletManager.stopMining()

View File

@@ -63,12 +63,11 @@ Rectangle {
function generateQRCodeString() {
if (pageReceive.state == "PaymentRequest") {
return TxUtils.makeQRCodeString(appWindow.current_address,
(amountToReceiveXMR.text != "" && parseFloat(amountToReceiveXMR.text) != 0 ? amountToReceiveXMR.text : ""),
(txDescriptionInput.text != "" ? txDescriptionInput.text : ""),
(receiverNameInput.text != "" ? receiverNameInput.text : ""));
return walletManager.make_uri(appWindow.current_address,
walletManager.amountFromString(amountToReceiveXMR.text),
txDescriptionInput.text, receiverNameInput.text);
} else {
return TxUtils.makeQRCodeString(appWindow.current_address);
return walletManager.make_uri(appWindow.current_address);
}
}
@@ -152,13 +151,16 @@ Rectangle {
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()
}
@@ -344,6 +346,7 @@ Rectangle {
id: txDescriptionInput
Layout.preferredWidth: 165
Layout.maximumWidth: 165
maximumLength: 800
topPadding: 7
leftPadding: 7
font.pixelSize: 14
@@ -391,6 +394,7 @@ Rectangle {
selectByMouse: true
color: MoneroComponents.Style.defaultFontColor
placeholderText: qsTr("Visible to the sender") + translationManager.emptyString
maximumLength: 100
background: Rectangle {
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"

View File

@@ -112,11 +112,8 @@ Rectangle {
MoneroComponents.LabelSubheader {
Layout.fillWidth: true
textFormat: Text.RichText
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>" +
qsTr("Outputs marked as spent") + " <a href='#'>" + qsTr("Help") + "</a>" + translationManager.emptyString
onLinkActivated: {
sharedRingDBDialog.title = qsTr("Outputs marked as spent") + translationManager.emptyString;
sharedRingDBDialog.text = qsTr(
text: qsTr("Outputs marked as spent") + translationManager.emptyString
tooltip: qsTr(
"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 " +
"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 " +
"using the monero-blockchain-mark-spent-outputs tool to create a list of known spent outputs.<br>"
) + translationManager.emptyString
sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open()
}
}
MoneroComponents.TextPlain {
@@ -249,11 +243,8 @@ Rectangle {
Layout.fillWidth: true
Layout.topMargin: 24
textFormat: Text.RichText
text: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>" +
qsTr("Rings") + " <a href='#'>" + qsTr("Help") + "</a>" + translationManager.emptyString
onLinkActivated: {
sharedRingDBDialog.title = qsTr("Rings") + translationManager.emptyString;
sharedRingDBDialog.text = qsTr(
text: qsTr("Rings") + translationManager.emptyString
tooltip: qsTr(
"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 " +
"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 " +
"as it is all automated.<br>"
) + translationManager.emptyString
sharedRingDBDialog.icon = StandardIcon.Information
sharedRingDBDialog.open()
}
}
MoneroComponents.TextPlain {

View File

@@ -394,11 +394,11 @@ Rectangle {
wrapMode: Text.WrapAnywhere
placeholderText: {
if(persistentSettings.nettype == NetworkType.MAINNET){
return "4.. / 8.. / OpenAlias";
return "4.. / 8.. / monero:.. / OpenAlias";
} else if (persistentSettings.nettype == NetworkType.STAGENET){
return "5.. / 7..";
return "5.. / 7.. / monero:..";
} else if(persistentSettings.nettype == NetworkType.TESTNET){
return "9.. / B..";
return "9.. / B.. / monero:..";
}
}
onTextChanged: {
@@ -855,7 +855,6 @@ Rectangle {
StandardButton {
id: sendButton
rightIcon: "qrc:///images/rightArrow.png"
rightIconInactive: "qrc:///images/rightArrowInactive.png"
Layout.topMargin: 4
text: qsTr("Send") + translationManager.emptyString
enabled: !sendButtonWarningBox.visible && !warningContent && !recipientModel.hasEmptyAddress() && !paymentIdWarningBox.visible
@@ -898,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 {
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
title: qsTr("Key images") + translationManager.emptyString
@@ -1072,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
FileDialog {
id: exportKeyImagesDialog
@@ -1079,7 +1139,11 @@ Rectangle {
selectExisting: false
onAccepted: {
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: {
console.log("Canceled");
@@ -1094,7 +1158,11 @@ Rectangle {
title: qsTr("Please choose a file") + translationManager.emptyString
onAccepted: {
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: {
console.log("Canceled");

View File

@@ -211,7 +211,7 @@ Item {
smooth: false
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 {
anchors.fill: parent
@@ -400,7 +400,7 @@ Item {
font.pixelSize: 12
font.bold: true
color: _color
text: TxUtils.makeQRCodeString(appWindow.current_address, amountToReceive.text)
text: walletManager.make_uri(appWindow.current_address, walletManager.amountFromString(amountToReceive.text))
themeTransition: false
MouseArea {
@@ -685,7 +685,7 @@ Item {
selectExisting: false
nameFilters: ["Image (*.png)"]
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) )
receivePageDialog.title = qsTr("Save QrCode") + 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
MoneroComponents.Navbar {
id: navbarId
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: height
Layout.bottomMargin: height
@@ -145,7 +146,7 @@ ColumnLayout {
PropertyAnimation {
target: enterItem
property: "x"
from: 0 - target.width
from: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * - target.width
to: 0
duration: 300
easing.type: Easing.OutCubic
@@ -154,7 +155,7 @@ ColumnLayout {
target: exitItem
property: "x"
from: 0
to: target.width
to: (navbarId.currentIndex < navbarId.previousIndex ? 1 : -1) * target.width
duration: 300
easing.type: Easing.OutCubic
}

View File

@@ -91,6 +91,7 @@ Rectangle {
}
MoneroComponents.SettingsListItem {
enabled: leftPanel.progressBar.fillLevel == 100
iconText: FontAwesome.repeat
description: qsTr("Use this feature if you think the shown balance is not accurate.") + translationManager.emptyString
title: qsTr("Rescan wallet balance") + translationManager.emptyString
@@ -100,7 +101,11 @@ Rectangle {
if (!currentWallet.rescanSpent()) {
console.error("Error: ", currentWallet.errorString);
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
if (currentWallet.errorString == "Rescan spent can only be used with a trusted daemon") {
informationPopup.text = qsTr("Error: ") + qsTr("Rescan spent can only be used with a trusted remote node. If you trust the current node you are connected to (%1), you can mark it as trusted in Settings > Node page.").arg(remoteNodesModel.currentRemoteNode().address) + translationManager.emptyString;
} else {
informationPopup.text = qsTr("Error: ") + currentWallet.errorString;
}
informationPopup.icon = StandardIcon.Critical
informationPopup.onCloseCallback = null
informationPopup.open();

12
qml.qrc
View File

@@ -159,8 +159,6 @@
<file>js/TxUtils.js</file>
<file>images/warning.png</file>
<file>images/warning@2x.png</file>
<file>images/rightArrowInactive.png</file>
<file>images/rightArrowInactive@2x.png</file>
<file>js/Windows.js</file>
<file>js/Utils.js</file>
<file>components/RadioButton.qml</file>
@@ -215,6 +213,16 @@
<file>images/restore-wallet-from-hardware.png</file>
<file>images/open-wallet-from-file@2x.png</file>
<file>images/open-wallet-from-file.png</file>
<file>images/open-wallet-from-file-mainnet@2x.png</file>
<file>images/open-wallet-from-file-mainnet.png</file>
<file>images/open-wallet-from-file-stagenet@2x.png</file>
<file>images/open-wallet-from-file-stagenet.png</file>
<file>images/open-wallet-from-file-testnet@2x.png</file>
<file>images/open-wallet-from-file-testnet.png</file>
<file>images/open-wallet-from-file-view-only@2x.png</file>
<file>images/open-wallet-from-file-view-only.png</file>
<file>images/open-wallet-from-file-trezor@2x.png</file>
<file>images/open-wallet-from-file-trezor.png</file>
<file>images/restore-wallet@2x.png</file>
<file>images/restore-wallet.png</file>
<file>images/create-wallet@2x.png</file>

View File

@@ -102,8 +102,6 @@ target_include_directories(monero-wallet-gui PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/QR-Code-scanner
${CMAKE_CURRENT_SOURCE_DIR}/zxcvbn-c
${X11_INCLUDE_DIR}
${Boost_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIR}
)
target_compile_definitions(monero-wallet-gui
@@ -124,13 +122,13 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
target_link_libraries(monero-wallet-gui
epee
common
net
wallet_api
qrcodegen
easylogging
${Boost_LIBRARIES}
${QT5_LIBRARIES}
${EXTRA_LIBRARIES}
${ICU_LIBRARIES}
openpgp
qrdecoder
translations

View File

@@ -132,3 +132,19 @@ QString AddressBook::getDescription(const QString &address) const
}
return QString::fromStdString(m_rows.value(*it)->getDescription());
}
void AddressBook::setDescription(int index, const QString &description)
{
bool result;
{
QWriteLocker locker(&m_lock);
result = m_addressBookImpl->setDescription(index, description.toStdString());
}
if (result)
{
getAll();
}
}

View File

@@ -52,6 +52,7 @@ public:
Q_INVOKABLE QString errorString() const;
Q_INVOKABLE int errorCode() const;
Q_INVOKABLE QString getDescription(const QString &address) const;
Q_INVOKABLE void setDescription(int index, const QString &label);
enum ErrorCode {
Status_Ok,

View File

@@ -170,7 +170,7 @@ QString TransactionHistory::writeCSV(quint32 accountIndex, QString out)
// write header
QTextStream output(&data);
output << "blockHeight,epoch,date,direction,amount,atomicAmount,fee,txid,label,subaddrAccount,paymentId\n";
output << "blockHeight,epoch,date,direction,amount,atomicAmount,fee,txid,label,subaddrAccount,paymentId,description\n";
QReadLocker locker(&m_lock);
for (const auto &tx : m_pimpl->getAll()) {
@@ -198,6 +198,8 @@ QString TransactionHistory::writeCSV(quint32 accountIndex, QString out)
}
QString label = info.label();
label.remove(QChar('"')); // reserved
QString description = info.description();
description.remove(QChar('"')); // reserved
quint64 blockHeight = info.blockHeight();
QDateTime timeStamp = info.timestamp();
QString date = info.date() + " " + info.time();
@@ -209,11 +211,11 @@ QString TransactionHistory::writeCSV(quint32 accountIndex, QString out)
}
// format and write
QString line = QString("%1,%2,%3,%4,%5,%6,%7,%8,\"%9\",%10,%11\n")
QString line = QString("%1,%2,%3,%4,%5,%6,%7,%8,\"%9\",%10,%11,\"%12\"\n")
.arg(QString::number(blockHeight), QString::number(epoch), date)
.arg(direction, displayAmount, QString::number(atomicAmount))
.arg(info.fee(), info.hash(), label, QString::number(subaddrAccount))
.arg(paymentId);
.arg(paymentId, description);
output << line;
}

View File

@@ -47,6 +47,10 @@ bool TransactionInfo::isFailed() const
return m_failed;
}
bool TransactionInfo::isCoinbase() const
{
return m_coinbase;
}
double TransactionInfo::amount() const
{
@@ -126,6 +130,11 @@ QString TransactionInfo::paymentId() const
return m_paymentId;
}
QString TransactionInfo::description() const
{
return m_description;
}
QString TransactionInfo::destinations_formatted() const
{
QString destinations;
@@ -144,10 +153,12 @@ TransactionInfo::TransactionInfo(const Monero::TransactionInfo *pimpl, QObject *
, m_confirmations(pimpl->confirmations())
, m_direction(static_cast<Direction>(pimpl->direction()))
, m_failed(pimpl->isFailed())
, m_coinbase(pimpl->isCoinbase())
, m_fee(pimpl->fee())
, m_hash(QString::fromStdString(pimpl->hash()))
, m_label(QString::fromStdString(pimpl->label()))
, m_paymentId(QString::fromStdString(pimpl->paymentId()))
, m_description(QString::fromStdString(pimpl->description()))
, m_pending(pimpl->isPending())
, m_subaddrAccount(pimpl->subaddrAccount())
, m_timestamp(QDateTime::fromTime_t(pimpl->timestamp()))

View File

@@ -42,6 +42,7 @@ class TransactionInfo : public QObject
Q_PROPERTY(Direction direction READ direction)
Q_PROPERTY(bool isPending READ isPending)
Q_PROPERTY(bool isFailed READ isFailed)
Q_PROPERTY(bool isCoinbase READ isCoinbase)
Q_PROPERTY(double amount READ amount)
Q_PROPERTY(quint64 atomicAmount READ atomicAmount)
Q_PROPERTY(QString displayAmount READ displayAmount)
@@ -57,6 +58,7 @@ class TransactionInfo : public QObject
Q_PROPERTY(QString date READ date)
Q_PROPERTY(QString time READ time)
Q_PROPERTY(QString paymentId READ paymentId)
Q_PROPERTY(QString description READ description)
Q_PROPERTY(QString destinations_formatted READ destinations_formatted)
public:
@@ -71,6 +73,7 @@ public:
Direction direction() const;
bool isPending() const;
bool isFailed() const;
bool isCoinbase() const;
double amount() const;
quint64 atomicAmount() const;
QString displayAmount() const;
@@ -87,6 +90,7 @@ public:
QString date() const;
QString time() const;
QString paymentId() const;
QString description() const;
//! only applicable for output transactions
//! used in tx details popup
QString destinations_formatted() const;
@@ -104,7 +108,9 @@ private:
QString m_hash;
QString m_label;
QString m_paymentId;
QString m_description;
bool m_pending;
bool m_coinbase;
quint32 m_subaddrAccount;
QSet<quint32> m_subaddrIndex;
QDateTime m_timestamp;

View File

@@ -489,9 +489,9 @@ quint64 Wallet::daemonBlockChainTargetHeight() const
return m_daemonBlockChainTargetHeight;
}
bool Wallet::exportKeyImages(const QString& path)
bool Wallet::exportKeyImages(const QString& path, bool all)
{
return m_walletImpl->exportKeyImages(path.toStdString());
return m_walletImpl->exportKeyImages(path.toStdString(), all);
}
bool Wallet::importKeyImages(const QString& path)
@@ -499,6 +499,14 @@ bool Wallet::importKeyImages(const QString& path)
return m_walletImpl->importKeyImages(path.toStdString());
}
bool Wallet::exportOutputs(const QString& path, bool all) {
return m_walletImpl->exportOutputs(path.toStdString(), all);
}
bool Wallet::importOutputs(const QString& path) {
return m_walletImpl->importOutputs(path.toStdString());
}
bool Wallet::refresh(bool historyAndSubaddresses /* = true */)
{
refreshingSet(true);
@@ -925,6 +933,12 @@ bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id
return res;
}
QString Wallet::make_uri(const QString &address, const quint64 &amount, const QString &tx_description, const QString &recipient_name) const
{
std::string error;
return QString::fromStdString(m_walletImpl->make_uri(address.toStdString(), "", amount, tx_description.toStdString(), recipient_name.toStdString(), error));
}
bool Wallet::rescanSpent()
{
QMutexLocker locker(&m_asyncMutex);

View File

@@ -205,9 +205,13 @@ public:
Q_INVOKABLE void refreshHeightAsync();
//! export/import key images
Q_INVOKABLE bool exportKeyImages(const QString& path);
Q_INVOKABLE bool exportKeyImages(const QString& path, bool all = false);
Q_INVOKABLE bool importKeyImages(const QString& path);
//! export/import outputs
Q_INVOKABLE bool exportOutputs(const QString& path, bool all = false);
Q_INVOKABLE bool importOutputs(const QString& path);
//! refreshes the wallet
Q_INVOKABLE bool refresh(bool historyAndSubaddresses = true);
@@ -296,6 +300,8 @@ public:
//! Parse URI
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error);
//! Make URI
Q_INVOKABLE QString make_uri(const QString &address, const quint64 &amount = 0, const QString &tx_description = "", const QString &recipient_name = "") const;
//! Namespace your cacheAttribute keys to avoid collisions
Q_INVOKABLE bool setCacheAttribute(const QString &key, const QString &val);

View File

@@ -441,6 +441,14 @@ QVariantMap WalletManager::parse_uri_to_object(const QString &uri) const
return result;
}
QString WalletManager::make_uri(const QString &address, const quint64 &amount, const QString &tx_description, const QString &recipient_name) const
{
QMutexLocker locker(&m_mutex);
if (m_currentWallet)
return m_currentWallet->make_uri(address, amount, tx_description, recipient_name);
return "";
}
void WalletManager::setLogLevel(int logLevel)
{
Monero::WalletManagerFactory::setLogLevel(logLevel);

View File

@@ -179,6 +179,7 @@ public:
Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const;
Q_INVOKABLE QVariantMap parse_uri_to_object(const QString &uri) const;
Q_INVOKABLE QString make_uri(const QString &address, const quint64 &amount = 0, const QString &tx_description = "", const QString &recipient_name = "") const;
Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const;
Q_INVOKABLE void saveQrCodeToClipboard(const QString &) const;
Q_INVOKABLE void checkUpdatesAsync(

View File

@@ -1 +1,3 @@
var GUI_VERSION = "@VERSION_TAG_GUI@";
var GUI_VERSION_NUMBER = "@VERSION@"
var GUI_VERSION_TAG = "@VERSION_TAG_GUI@";
var GUI_VERSION = GUI_VERSION_NUMBER + "-" + GUI_VERSION_TAG

View File

@@ -516,7 +516,7 @@ typedef struct
uint8_t LeetCnv[sizeof L33TCnv / LEET_NORM_MAP_SIZE + 1];
/* uint8_t LeetChr[3]; */
uint8_t First;
uint8_t PossChars[48];
uint8_t PossChars[49];
} DictWork_t;
/**********************************************************************************

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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