Compare commits

..

211 Commits

Author SHA1 Message Date
luigi1111
6f14fde89c Merge pull request #929
d8ebafa show correct height after switching wallets
2017-10-24 14:35:44 -05:00
Jaquee
d8ebafaec0 show correct height after switching wallets
requires #2724
2017-10-24 19:13:28 +02:00
luigi1111
7340371cc9 Merge pull request #921
e4177bb don't copy libjasper-1.dll
2017-10-24 09:20:01 -05:00
luigi1111
cc17b75a54 Merge pull request #922
8f73bac add option to change wallet creation height and rescan wallet cache (but to master)
2017-10-23 18:22:59 -05:00
Jaquee
8f73bac95c add option to change wallet creation height and rescan wallet cache 2017-10-23 18:16:27 -05:00
Dan Miller
e4177bb365 don't copy libjasper-1.dll 2017-10-23 14:01:47 -07:00
luigi1111
80a058c954 Merge pull request #920
0ae04fd use 10 as default required confirmations
2017-10-23 15:59:26 -05:00
luigi1111
ff1780aeaa Merge pull request #885
11df558 Windows installer: Updates for release Helium Hydra

8b94bd8 Windows Installer: Working dir of CLI wallet icon set to wallet dir

0d991b3 Windows Installer: Bumped version number from '0.11.0.0' to '0.11.1.0'
2017-10-23 14:33:47 -05:00
luigi1111
f1b70d08c6 Merge pull request #918
80618c8 wizard: reworked testnet settings
2017-10-23 14:29:52 -05:00
Jaquee
0ae04fde4b use 10 as default required confirmations 2017-10-23 21:24:50 +02:00
luigi1111
c64321ebe9 Merge pull request #912
aac7fc6 make privay level slider smoother
2017-10-23 14:02:11 -05:00
luigi1111
34e7eb4e6b Merge pull request #884
1f1d51d Show password dialog before making a transfer
2017-10-23 13:59:58 -05:00
luigi1111
b888396ab4 Merge pull request 901
61e8ac5 use array for files to copy, exit on error
2017-10-23 13:55:46 -05:00
luigi1111
508546c7c8 Merge pull request #880
3c46d6d Add separator below Settings menu button
2017-10-23 13:51:46 -05:00
Jaquee
80618c83fd wizard: reworked testnet settings 2017-10-23 20:35:17 +02:00
René Brunner
0d991b3792 Windows Installer: Bumped version number from '0.11.0.0' to '0.11.1.0' 2017-10-23 19:58:14 +02:00
Dan Miller
61e8ac5b95 use array for files to copy, exit on error
iterate each element of the array not only the head

double-quote
2017-10-22 16:12:35 -07:00
Jaquee
aac7fc613a make privay level slider smoother 2017-10-22 22:18:55 +02:00
luigi1111
e0d99cb1bb Merge pull request #897
8ba9b0e Run get_libwallet_api.sh using its own shebang
2017-10-22 13:27:04 -05:00
luigi1111
188eb064f4 Merge pull request #896
84d09c8
README: Add package installation instructions for Void Linux
2017-10-22 13:13:45 -05:00
Helmut Pozimski
84d09c85de README: Add package installation instructions for Void Linux 2017-10-22 18:23:53 +02:00
luigi1111
b853380db6 Merge pull request #872
7941f88 Repo: remove in-tree VRP, link to single-policy VRP
2017-10-22 08:54:44 -05:00
luigi1111
ea49e84215 Merge pull request #868
8750cc2 pro: add libreadline to link line for Linux
2017-10-21 12:01:49 -05:00
luigi1111
23d1d4a958 Merge pull request 867 2017-10-21 11:49:48 -05:00
luigi1111
f52990c8e4 Merge pull request #866 for real (previous should have said #856) 2017-10-21 08:20:03 -05:00
luigi1111
d69519f0aa Merge pull request #866 2017-10-21 08:14:26 -05:00
luigi1111
605f81314a Merge branch 'mandrill-pie-master' 2017-10-21 07:53:48 -05:00
Nexie Kind
8ba9b0e7c7 Run get_libwallet_api.sh using its own shebang
Not every system has bash as default shell. Running this script in zsh environment leads to build failure.
2017-10-04 21:07:09 +03:00
René Brunner
8b94bd80c9 Windows Installer: Working dir of CLI wallet icon set to wallet dir 2017-09-28 19:42:58 +02:00
stoffu
1f1d51d8e1 Show password dialog before making a transfer 2017-09-20 10:41:13 +09:00
René Brunner
11df558f8e Windows installer: Updates for release Helium Hydra 2017-09-19 19:50:38 +02:00
MaxXor
3c46d6d1bd Add separator below Settings menu button 2017-09-17 18:29:41 +02:00
anonimal
7941f88e53 Repo: remove in-tree VRP, link to single-policy VRP 2017-09-11 22:06:45 +00:00
redfish
8750cc2c13 pro: add libreadline to link line for Linux 2017-09-09 10:25:09 -04:00
mastad0n
f932d7a245 Superseded
Superseded according to package maintainer "redfish":

>redfish commented on 2017-08-20 08:49
>Package marked for deletion. Superceded by: monero-wallet-qt
2017-09-08 23:35:35 -07:00
Isaac
6d0847c39f Korean translation audit of monero-core_ko.ts
Some corrections of contextually obvious mistranslations made.
2017-09-08 13:35:30 +09:00
Light3rn
ba9a99a4c6 Update monero-core_fi.ts
Added some translations.
2017-09-05 20:19:08 +03:00
Mandrill Pie
b1675ab1cd Created Romanian translation file 2017-09-05 02:36:32 +08:00
Mandrill Pie
327cbd086f Added an entry for the Romanian flag file 2017-09-05 02:35:10 +08:00
Mandrill Pie
a681878344 Added an entry for the Romanian translation 2017-09-05 02:34:02 +08:00
Mandrill Pie
9b835599b8 Added an entry for Romanian to languages list 2017-09-05 02:32:00 +08:00
Mandrill Pie
5767ad9cd5 Added Romanian flag to flags folder
Added PNG of Romanian flag
2017-09-05 02:27:48 +08:00
Riccardo Spagni
4c75fe47f9 Merge pull request #841
2bc86d1 monero submodule: use release-v0.11.0.0 branch (Jaquee)
2017-09-04 17:27:59 +02:00
Riccardo Spagni
56868c06b5 Merge pull request #851
86e9f38 Only prompt for daemon auto start when daemon address is local (Jaquee)
2017-09-04 17:17:52 +02:00
Riccardo Spagni
3df70ff98c Merge pull request #849
fc576a8 Fix collapsing of transaction filter (MaxXor)
2017-09-04 17:17:36 +02:00
Riccardo Spagni
83ea363932 Merge pull request #846
b8da85d Fix IconButton (MaxXor)
2017-09-04 17:16:38 +02:00
Riccardo Spagni
6d09555cd4 Merge pull request #845
3d0a571 Fix verifySignatureLine positioning (MaxXor)
2017-09-04 17:16:24 +02:00
Riccardo Spagni
4d9d10013b Merge pull request #844
7c366dd Fix mining status positioning (MaxXor)
2017-09-04 17:16:13 +02:00
Riccardo Spagni
ece743e22a Merge pull request #834
f7c883a Settings: add wallet creation height and log file paths (Jaquee)
31f318a add wallet creation height getter (Jaquee)
94c92ba add daemon/wallet log path getters (Jaquee)
8480c70 add textBlock component (Jaquee)
2017-09-04 17:15:46 +02:00
Jaquee
86e9f3811b Only prompt for daemon auto start when daemon address is local 2017-09-04 13:42:46 +02:00
Jaquee
2bc86d1d9f monero submodule: use release-v0.11.0.0 branch 2017-09-04 13:27:06 +02:00
MaxXor
fc576a8680 Fix collapsing of transaction filter 2017-09-03 14:44:28 +02:00
MaxXor
b8da85d0a4 Fix IconButton 2017-08-31 14:44:44 +02:00
MaxXor
3d0a571cc7 Fix verifySignatureLine positioning 2017-08-31 14:07:55 +02:00
MaxXor
7c366ddf04 Fix mining status positioning 2017-08-31 14:04:11 +02:00
Riccardo Spagni
d0f3194574 Merge pull request #840
98f768d Finished monero-core_ja.ts (Scott Anecito)
2017-08-30 16:08:38 +02:00
Scott Anecito
98f768d2a6 Finished monero-core_ja.ts 2017-08-26 23:38:23 -07:00
Riccardo Spagni
77cd5a7a62 Merge pull request #837
649f819 Update swedish translation (Mattias Eriksson)
2017-08-26 23:40:20 +02:00
Riccardo Spagni
0d1b709def Merge pull request #836
c84abc7 mrsmonero review (erciccione)
1a156b8 Korean translation (erciccione)
2017-08-26 23:40:08 +02:00
Riccardo Spagni
5f052964a9 Merge pull request #833
ee2b0fa Update zh-tw translation (Lafudoci)
2017-08-26 23:39:56 +02:00
Riccardo Spagni
39facceee6 Merge pull request #832
9f4f2b5 Farmer's rebase of PR #815 (ProkhorZ)
2017-08-26 23:38:43 +02:00
erciccione
c84abc7224 mrsmonero review 2017-08-26 13:56:58 +02:00
Mattias Eriksson
649f81954e Update swedish translation 2017-08-24 16:44:15 +02:00
erciccione
1a156b8840 Korean translation 2017-08-24 16:02:16 +02:00
Jaquee
f7c883a6c3 Settings: add wallet creation height and log file paths 2017-08-24 12:09:00 +02:00
Jaquee
31f318aaea add wallet creation height getter 2017-08-24 11:31:06 +02:00
Jaquee
94c92ba73c add daemon/wallet log path getters 2017-08-24 11:30:50 +02:00
Jaquee
8480c70571 add textBlock component 2017-08-24 11:27:00 +02:00
Lafudoci
ee2b0fa713 Update zh-tw translation 2017-08-24 10:07:26 +08:00
ProkhorZ
9f4f2b582b Farmer's rebase of PR #815
Updated Dutch translations

Changes:

- Translated some new strings.
- Removed spaces in compound nouns.
- Made the form of address consistently formal (je->u).
- Improved grammar and style in longer text.
- Removed overly formal words like 'gelieve' and 'alstublieft'.
- For the verb Sign, changed 'Signeren' to 'Ondertekenen'.
2017-08-23 23:11:01 +02:00
Riccardo Spagni
d670f6d321 Merge pull request #827
234fd1b fix clipped height (Jaquee)
2017-08-23 21:24:01 +02:00
Riccardo Spagni
4ca5e82fca Merge pull request #824
3adb29b Remove unnecessary synchronous call to useForkRules (Jaquee)
2017-08-23 21:23:33 +02:00
Riccardo Spagni
c29ccc13ae Merge pull request #808
3f7e3ba check updates async (Jaquee)
2017-08-23 21:23:13 +02:00
Riccardo Spagni
c04417d37b Merge pull request #807
a7f52db History: Support coinbase txs requires #2247 (Jaquee)
2017-08-23 21:22:50 +02:00
Riccardo Spagni
7521472325 Merge pull request #806
7f4fec7 use testnet bool from wallet2 (Jaquee)
2017-08-23 21:22:11 +02:00
Riccardo Spagni
73ba192a58 Merge pull request #799
995a5e0 updated translations (Jona)
13a6550 added hebrew translation file and flag (Jona)
2017-08-23 21:21:28 +02:00
Riccardo Spagni
0fdc21e7fd Merge pull request #791
105336b Change window title (MaxXor)
5339fbd Add window title (MaxXor)
2017-08-23 21:20:36 +02:00
Riccardo Spagni
ba0796b9ca Merge pull request #788
c39875d Remove nonsense "Test tip" + vanished / obsolete translations (Jonathan Cross)
47927e4 Refresh translations (Jonathan Cross)
2017-08-23 21:20:01 +02:00
Riccardo Spagni
1ce573afe2 Merge pull request #786
6730b63 Add dockerfile for android NDK build (MoroccanMalinois)
2017-08-23 21:19:24 +02:00
Jaquee
234fd1bcda fix clipped height 2017-08-21 08:49:51 +02:00
Jaquee
3adb29bc16 Remove unnecessary synchronous call to useForkRules 2017-08-19 16:52:22 +02:00
Jaquee
3f7e3ba3c4 check updates async 2017-08-06 00:10:59 +02:00
Jaquee
a7f52db613 History: Support coinbase txs
requires #2247
2017-08-03 21:43:01 +02:00
Jaquee
7f4fec7777 use testnet bool from wallet2 2017-07-31 15:11:01 +02:00
Jona
995a5e0046 updated translations
more translations

Hebrew translation

added hebrew to mnemonics

changed wallet_language so mnemonics are in English

updated Hebrew translation

fixed typo

updated translations
2017-07-25 20:28:23 +03:00
Jona
13a65505a5 added hebrew translation file and flag 2017-07-14 18:09:44 +03:00
MaxXor
105336ba08 Change window title
Monero GUI → Monero
2017-07-13 17:39:51 +02:00
Jonathan Cross
c39875de44 Remove nonsense "Test tip" + vanished / obsolete translations 2017-07-13 16:55:44 +02:00
MaxXor
5339fbde8b Add window title 2017-07-09 15:11:49 +02:00
Jonathan Cross
47927e4822 Refresh translations 2017-07-04 00:15:34 +02:00
Riccardo Spagni
c68c317776 Merge pull request #785
7cc924d Update monero-core_pl.ts (s0ds0ds0d)
2017-07-03 12:14:32 +02:00
Riccardo Spagni
b2cd48ceaf Merge pull request #783
8a14e36 Update monero-core_de.ts (Schnoffel)
2017-07-03 12:14:15 +02:00
Riccardo Spagni
0eaebb01c4 Merge pull request #779
e43b719 Removing unused tipText strings which clutter up translations. (Jonathan Cross)
2017-07-03 11:55:05 +02:00
Riccardo Spagni
c321147e36 Merge pull request #778
b41c981 Repo: add Vulnerability Response Process (anonimal)
2017-07-03 11:54:21 +02:00
Riccardo Spagni
27349d111d Merge pull request #777
c65ee4e fix windows crash on startup requires #2101 (Jaquee)
03af067 Disabled update check requires #2101 (Jaquee)
2017-07-03 11:53:43 +02:00
Riccardo Spagni
602a393d59 Merge pull request #776
b4ce56a Update dependency list for compiling on Gentoo (Guillaume LE VAILLANT)
2017-07-03 11:51:52 +02:00
Riccardo Spagni
e9b6c510f4 Merge pull request #775
92c0e00 Add missing strings for ListElement property workaround (Guillaume LE VAILLANT)
2017-07-03 11:45:25 +02:00
Riccardo Spagni
5d78941712 Merge pull request #774
e8bd548 Update swidish translation (Mattias Eriksson)
2017-07-03 11:45:09 +02:00
Riccardo Spagni
fa27982650 Merge pull request #773
ed17399 Fixed typos, added translations, removed unfinished types (Fabio)
2017-07-03 11:44:48 +02:00
Riccardo Spagni
f3eca6eadb Merge pull request #771
04869f0 Remove duplicate in list of flags (Guillaume LE VAILLANT)
2017-07-03 11:44:23 +02:00
Riccardo Spagni
009994b212 Merge pull request #770
16122d6 Update french translation (Guillaume LE VAILLANT)
2017-07-03 11:44:00 +02:00
Riccardo Spagni
57a282c72a Merge pull request #762
a0e38aa Uninstall icon; 'Utilities' sub-folder; optional desktop icon (René Brunner)
4bac8fd Switched naming from 'Monero Core + GUI Wallet' to 'Monero GUI Wallet' (René Brunner)
ff9d79d Added Output subdirectory to installer .gitignore (René Brunner)
b8a4dab GUI Wallet Beta 2 installer for Windows, initial version (René Brunner)
2017-07-03 11:42:24 +02:00
Riccardo Spagni
96808441cd Merge pull request #759
7d66cc5 italian translation updates (erciccione)
2017-07-03 11:36:31 +02:00
MoroccanMalinois
6730b63018 Add dockerfile for android NDK build 2017-07-01 18:48:32 +00:00
s0ds0ds0d
7cc924d478 Update monero-core_pl.ts
Partially added/updated translations.
2017-07-01 13:51:04 +02:00
Schnoffel
8a14e367d8 Update monero-core_de.ts
Some improvements
2017-06-29 04:24:26 +02:00
René Brunner
a0e38aafb2 Uninstall icon; 'Utilities' sub-folder; optional desktop icon 2017-06-28 21:46:37 +02:00
René Brunner
4bac8fdb57 Switched naming from 'Monero Core + GUI Wallet' to 'Monero GUI Wallet' 2017-06-23 17:50:24 +02:00
anonimal
b41c981454 Repo: add Vulnerability Response Process 2017-06-22 22:17:52 +00:00
Jaquee
c65ee4e71c fix windows crash on startup
requires #2101
2017-06-22 12:22:38 +02:00
erciccione
7d66cc5b25 italian translation updates 2017-06-22 00:57:47 +01:00
Jonathan Cross
e43b719b19 Removing unused tipText strings which clutter up translations. 2017-06-21 20:33:57 +02:00
Jaquee
03af06718c Disabled update check
requires #2101
2017-06-21 17:08:57 +02:00
Guillaume LE VAILLANT
b4ce56a994 Update dependency list for compiling on Gentoo 2017-06-21 15:37:39 +02:00
Guillaume LE VAILLANT
92c0e00b12 Add missing strings for ListElement property workaround 2017-06-21 11:55:58 +02:00
Mattias Eriksson
e8bd548219 Update swidish translation 2017-06-20 14:50:02 +03:00
Fabio
ed17399b74 Fixed typos, added translations, removed unfinished types 2017-06-19 19:02:57 -03:00
Guillaume LE VAILLANT
04869f0aac Remove duplicate in list of flags 2017-06-19 15:55:39 +02:00
Guillaume LE VAILLANT
16122d6e17 Update french translation 2017-06-19 15:32:09 +02:00
Riccardo Spagni
73895f5a7b Merge pull request #736
a492cb9 Updating translations to pick up new strings (ru is removed) (Jonathan Cross)
2017-06-18 18:00:33 +02:00
Riccardo Spagni
535f1fc446 Merge pull request #732
9dc8879 Ignore unstaged files in 'monero' submodule by default. (Jonathan Cross)
2017-06-18 18:00:09 +02:00
Riccardo Spagni
5d4f519a40 Merge pull request #731
037fa32 Russian translation (Jonathan Cross)
2017-06-18 17:59:26 +02:00
René Brunner
ff9d79da7a Added Output subdirectory to installer .gitignore 2017-06-11 08:49:12 +02:00
René Brunner
b8a4dab9b2 GUI Wallet Beta 2 installer for Windows, initial version 2017-06-11 08:28:54 +02:00
Jonathan Cross
a492cb9f7e Updating translations to pick up new strings (ru is removed) 2017-06-04 17:05:55 +02:00
Riccardo Spagni
5043250a2a Merge pull request #734
8e986b3 German translation fixes (from PR #724) (Jonathan Cross)
2017-06-04 12:19:09 +02:00
Riccardo Spagni
fe78f20c7c Merge pull request #733
08b54f6 Restore wallet: Adding space after 'Your wallet is stored in' (Jonathan Cross)
2017-06-04 12:18:46 +02:00
Riccardo Spagni
ecaa1a8e23 Merge pull request #709
62e1dc4 Setttings: blockchain folder location (Jaquee)
9037eed DaemonManager: support dataDir parameter + validator (Jaquee)
2017-06-04 12:17:58 +02:00
Riccardo Spagni
9e121fb676 Merge pull request #707
443eb47 UX: move 'rescan spent' to settings and rename to 'Rescan wallet balance' (Jaquee)
1375305 UX: remove wide header (Jaquee)
2017-06-04 12:17:06 +02:00
Jaquee
62e1dc490f Setttings: blockchain folder location 2017-06-02 23:49:16 +02:00
Jaquee
9037eed805 DaemonManager: support dataDir parameter + validator 2017-06-02 23:39:30 +02:00
Jaquee
443eb47824 UX: move 'rescan spent' to settings and rename to 'Rescan wallet balance' 2017-06-02 23:37:48 +02:00
Jaquee
13753052bc UX: remove wide header 2017-06-02 23:06:18 +02:00
Jonathan Cross
08b54f69a5 Restore wallet: Adding space after 'Your wallet is stored in' 2017-06-02 01:20:32 +02:00
Jonathan Cross
037fa32c41 Russian translation 2017-06-02 00:55:08 +02:00
Jonathan Cross
8e986b3a2d German translation fixes (from PR #724) 2017-06-02 00:46:27 +02:00
Riccardo Spagni
0cb6900295 Merge pull request #743
a3e0589 Updates and fixes to the Dutch translation (L.C. Karssen)
2017-05-30 21:50:24 +02:00
Riccardo Spagni
affbb454fa Merge pull request #737
41b2c28 Fallback to english seed lang if not set (Jaquee)
127790e set correct seed lang when recovering from keys (Jaquee)
2017-05-30 21:49:51 +02:00
Riccardo Spagni
a6f13f7ba2 Merge pull request #730
72a7f13 Small edits to Build Instructions (xmr-eric)
2017-05-30 21:45:35 +02:00
Riccardo Spagni
8e14b8bc3e Merge pull request #725
cfa2f81 Fix Italian translation (xmr-eric)
de4ff29 Capitalize Create-tx-file translations (xmr-eric)
2017-05-30 21:45:04 +02:00
Riccardo Spagni
5cd05a51d4 Merge pull request #723
a046163 made changes so that start-gui.sh script can be called from anywhere and also from or with symbolic links (8go)
2017-05-30 21:44:35 +02:00
Riccardo Spagni
c2c5f0c13d Merge pull request #722
5ec575b Do not output seed in log (Jaquee)
2017-05-30 21:43:38 +02:00
Riccardo Spagni
f11d2bc702 Merge pull request #704
af1edc0 fix version info (Jaquee)
2017-05-30 21:42:03 +02:00
Riccardo Spagni
77448a6b73 Merge pull request #692
6beadba Activate German in languages.xml (Nano Akron)
6a0ed3c Change wallet languages to native names and scripts (Nano Akron)
2017-05-30 21:41:26 +02:00
L.C. Karssen
a3e0589a5e Updates and fixes to the Dutch translation 2017-05-25 11:17:13 +02:00
Jaquee
41b2c282bd Fallback to english seed lang if not set 2017-05-23 14:03:23 +02:00
Jaquee
127790e4a1 set correct seed lang when recovering from keys 2017-05-23 14:03:03 +02:00
Jonathan Cross
9dc8879e2c Ignore unstaged files in 'monero' submodule by default. 2017-05-16 21:57:47 +02:00
xmr-eric
72a7f1348f Small edits to Build Instructions 2017-05-14 22:44:48 -04:00
xmr-eric
cfa2f816a5 Fix Italian translation 2017-05-12 12:29:30 -04:00
xmr-eric
de4ff2992e Capitalize Create-tx-file translations 2017-05-10 14:05:20 -04:00
Nano Akron
6beadba9cc Activate German in languages.xml 2017-05-10 12:19:17 +01:00
Nano Akron
6a0ed3ceae Change wallet languages to native names and scripts 2017-05-10 12:19:13 +01:00
8go
a046163477 made changes so that start-gui.sh script can be called from anywhere and also from or with symbolic links 2017-05-10 08:29:14 +02:00
Jaquee
5ec575b376 Do not output seed in log 2017-05-09 13:08:40 +02:00
Riccardo Spagni
009362451d Merge pull request #718
25852b4 fix borked desktop size (Jaquee)
2017-05-06 19:42:59 +02:00
Riccardo Spagni
f6e7b79e81 Merge pull request #717
336726e add easylogging requires #2015 (Jaquee)
2017-05-06 19:42:37 +02:00
Riccardo Spagni
d744d393f9 Merge pull request #715
afac713 pin monero submodule to HEAD (Jaquee)
2017-05-06 19:42:22 +02:00
Jaquee
25852b4676 fix borked desktop size 2017-05-06 17:49:43 +02:00
Jaquee
336726e82f add easylogging
requires #2015
2017-05-06 17:11:15 +02:00
Jaquee
afac71383b pin monero submodule to HEAD 2017-05-06 13:23:45 +02:00
Riccardo Spagni
2ac9e8eabb Merge pull request #658
fff5c71 add ios_get_libwallet.api.sh (Jaquee)
2e53c52 ios build settings (Jaquee)
2017-05-05 12:04:46 +02:00
Jaquee
fff5c716c8 add ios_get_libwallet.api.sh 2017-05-05 12:03:06 +02:00
Jaquee
2e53c524a1 ios build settings 2017-05-05 12:03:03 +02:00
Riccardo Spagni
da6aad33a4 Merge pull request #710
a4a44d7 clear populated fields when stepping back to page 1 in wizard (Jaquee)
2017-05-05 11:52:53 +02:00
Riccardo Spagni
f5450f9205 Merge pull request #706
f00a181 Disable rescan cache btn until we know if it's needed (Jaquee)
98b0406 Settings: Rescan wallet cache button (Jaquee)
2017-05-05 11:50:43 +02:00
Riccardo Spagni
1f23df7e66 Merge pull request #705
8cd6f3f Make dialogs draggable (Jaquee)
2017-05-05 11:49:58 +02:00
Riccardo Spagni
27e37f153f Merge pull request #703
45106e5 Enable smart mining (Jaquee)
2017-05-05 11:48:20 +02:00
Riccardo Spagni
58f24efd39 Merge pull request #702
f31b27d add wallet view/spend keys to seed dialog requires #2012 (Jaquee)
2017-05-05 11:48:03 +02:00
Riccardo Spagni
24bd3010bf Merge pull request #698
8da7c97 Update monero-core_sv.ts (Ordtrogen Översättning)
2017-05-05 11:47:19 +02:00
Riccardo Spagni
87ea145047 Merge pull request #694
1c1d158 Fix QT instruction and remove get_libwallet_api.sh (xmr-eric)
2017-05-05 11:42:33 +02:00
Riccardo Spagni
310df0befa Merge pull request #666
3a51c4b Spanish Translation (vdo)
2017-05-05 11:37:43 +02:00
Jaquee
a4a44d7c99 clear populated fields when stepping back to page 1 in wizard 2017-05-04 17:04:12 +02:00
Jaquee
f00a181843 Disable rescan cache btn until we know if it's needed 2017-05-03 15:57:41 +02:00
Jaquee
98b040670c Settings: Rescan wallet cache button 2017-05-03 14:37:33 +02:00
Jaquee
f31b27d3fd add wallet view/spend keys to seed dialog
requires #2012
2017-05-03 11:14:57 +02:00
Jaquee
8cd6f3f5b6 Make dialogs draggable 2017-05-03 11:08:59 +02:00
Jaquee
af1edc0c95 fix version info 2017-05-02 20:19:11 +02:00
Jaquee
45106e5150 Enable smart mining 2017-05-02 19:14:32 +02:00
vdo
3a51c4b963 Spanish Translation 2017-04-29 12:48:00 +02:00
Ordtrogen Översättning
8da7c972db Update monero-core_sv.ts
Fixed a few typos and minor things.
2017-04-28 11:20:40 +02:00
xmr-eric
1c1d15821e Fix QT instruction and remove get_libwallet_api.sh 2017-04-25 01:09:43 -04:00
Riccardo Spagni
ef4c2927b4 Merge pull request #686
798b273 Update LICENSE copyright (Mike C)
2017-04-24 11:38:55 +02:00
Riccardo Spagni
dd7732ce0c Merge pull request #685
e2bfe25 AddressBook menu improvment: Send to this address (Jonathan Cross)
2017-04-24 11:38:07 +02:00
Riccardo Spagni
c750ca9507 Merge pull request #680
7f12d48 Activate Simplified Chinese as a wallet language option (Nano Akron)
2017-04-24 11:37:32 +02:00
Riccardo Spagni
feabe6713c Merge pull request #678
949d852 Better titles for priority settings (xmr-eric)
cbc9dd0 Refactor fee copy (xmr-eric)
2017-04-24 11:28:51 +02:00
Riccardo Spagni
a550c03a0b Merge pull request #676
b2f7058 Initial version of the swedish translation (Mattias Eriksson)
2017-04-24 11:25:53 +02:00
Riccardo Spagni
1336055e80 Merge pull request #670
6633d30 translate to chinese zh-CN (hesen)
2017-04-24 11:25:17 +02:00
Riccardo Spagni
115102624e Merge pull request #647
0508442 Disable high dpi auto scaling (Jaquee)
2017-04-24 11:22:47 +02:00
Riccardo Spagni
5a0adb18d3 Merge pull request #646
1e7fbe5 DaemonManager: fix issues with spaces in path (Jaquee)
2017-04-24 11:21:24 +02:00
Riccardo Spagni
a055293b52 Merge pull request #643
57ab7da Update monero-core_it.ts (Luigi Maselli)
2017-04-24 11:13:24 +02:00
Riccardo Spagni
a00c083ece Merge pull request #640
fc0a44c remove monero-core_en.ts (Jaquee)
30e403f Update translations (Jaquee)
5297b23 Add translation source file (Jaquee)
2017-04-24 11:12:21 +02:00
Riccardo Spagni
22a769341a Merge pull request #638
06e01e3 Update monero-core_de.ts (louvetic)
2017-04-24 11:07:55 +02:00
Riccardo Spagni
91757b8039 Merge pull request #637
96c8df2 Intructions for building the GUI with Gentoo Linux (Guillaume LE VAILLANT)
2017-04-24 11:06:23 +02:00
Riccardo Spagni
74da45766e Merge pull request #634
06b12d1 Capitalize "Create tx file" button (xmr-eric)
2017-04-24 11:05:42 +02:00
xmr-eric
949d85288d Better titles for priority settings 2017-04-19 18:14:04 -04:00
Mike C
798b273888 Update LICENSE copyright
Since this is the general LICENSE file for monero-project/monero-core, the copyright year should be kept up to date with the newest copyright in any files in the repo.
2017-04-19 16:09:33 -06:00
Jonathan Cross
e2bfe25b9d AddressBook menu improvment: Send to this address 2017-04-18 18:15:30 +02:00
Nano Akron
7f12d4869e Activate Simplified Chinese as a wallet language option 2017-04-16 18:01:01 +01:00
Mattias Eriksson
b2f7058fcf Initial version of the swedish translation 2017-04-16 10:40:42 +02:00
louvetic
06e01e3771 Update monero-core_de.ts
Ich habe Zeilen 1-1042 Korrektur gelesen. // I've checked lines 1-1042.
2017-04-15 18:57:20 +02:00
xmr-eric
cbc9dd07c8 Refactor fee copy
Don't round up High fee to x42
2017-04-15 00:34:43 -04:00
hesen
6633d309b5 translate to chinese zh-CN
revert language to english

fix chinese word
2017-04-14 09:33:32 +08:00
Jaquee
1e7fbe5cb0 DaemonManager: fix issues with spaces in path 2017-04-12 20:23:11 +02:00
Jaquee
05084422a5 Disable high dpi auto scaling 2017-03-30 19:27:58 +02:00
Luigi Maselli
57ab7daa03 Update monero-core_it.ts 2017-03-30 01:27:18 +02:00
Jaquee
fc0a44cabc remove monero-core_en.ts 2017-03-29 17:57:22 +02:00
Jaquee
30e403fe58 Update translations 2017-03-29 17:51:21 +02:00
Jaquee
5297b23248 Add translation source file 2017-03-29 17:50:58 +02:00
Guillaume LE VAILLANT
96c8df23a4 Intructions for building the GUI with Gentoo Linux 2017-03-29 10:40:09 +02:00
xmr-eric
06b12d167b Capitalize "Create tx file" button 2017-03-28 19:15:55 -04:00
102 changed files with 20795 additions and 13627 deletions

2
.gitmodules vendored
View File

@@ -1,4 +1,4 @@
[submodule "monero"]
path = monero
url = https://github.com/monero-project/monero
ignore = dirty
ignore = all

View File

@@ -1,4 +1,4 @@
Copyright (c) 2014-2015, The Monero Project
Copyright (c) 2014-2017, The Monero Project
All rights reserved.

View File

@@ -67,11 +67,12 @@ Rectangle {
menuColumn.previousButton.checked = true
}
width: 260
width: (isMobile)? appWindow.width : 260
color: "#FFFFFF"
// Item with monero logo
Item {
visible: !isMobile
id: logoItem
anchors.left: parent.left
anchors.right: parent.right
@@ -115,7 +116,9 @@ Rectangle {
}
Column {
visible: !isMobile
id: column1
anchors.left: parent.left
anchors.right: parent.right
@@ -124,14 +127,15 @@ Rectangle {
spacing: 5
Label {
visible: !isMobile
id: balanceLabel
text: qsTr("Balance") + translationManager.emptyString
anchors.left: parent.left
anchors.leftMargin: 50
tipText: qsTr("Test tip 1<br/><br/>line 2") + translationManager.emptyString
}
Row {
visible: !isMobile
Item {
anchors.verticalCenter: parent.verticalCenter
height: 26
@@ -144,6 +148,7 @@ Rectangle {
}
Text {
visible: !isMobile
id: balanceText
anchors.verticalCenter: parent.verticalCenter
font.family: "Arial"
@@ -172,7 +177,6 @@ Rectangle {
text: qsTr("Unlocked balance") + translationManager.emptyString
anchors.left: parent.left
anchors.leftMargin: 50
tipText: qsTr("Test tip 2<br/><br/>line 2") + translationManager.emptyString
}
Text {
@@ -194,6 +198,7 @@ Rectangle {
}
}
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
@@ -210,16 +215,26 @@ Rectangle {
color: "#DBDBDB"
}
Rectangle {
id: menuRect
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.top: column1.bottom
anchors.topMargin: 25
anchors.top: (isMobile)? parent.top : column1.bottom
anchors.topMargin: (isMobile)? 0 : 25
color: "#1C1C1C"
Flickable {
contentHeight: 500
anchors.fill: parent
clip: true
Column {
id: menuColumn
anchors.left: parent.left
anchors.right: parent.right
@@ -460,6 +475,16 @@ Rectangle {
panel.settingsClicked()
}
}
Rectangle {
visible: settingsButton.present
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 16
color: "#505050"
height: 1
}
}
}
@@ -478,6 +503,9 @@ Rectangle {
anchors.bottom: parent.bottom
}
}
// indicate disabled state
// Desaturate {
// anchors.fill: parent

View File

@@ -29,6 +29,7 @@
import QtQml 2.0
import QtQuick 2.2
//import QtQuick.Controls 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0
@@ -41,11 +42,13 @@ Rectangle {
property Item currentView
property Item previousView
property bool basicMode : false
property bool basicMode : isMobile
property string balanceLabelText: qsTr("Balance") + translationManager.emptyString
property string balanceText
property string unlockedBalanceLabelText: qsTr("Unlocked Balance") + translationManager.emptyString
property string unlockedBalanceText
property int minHeight: (appWindow.height > 800) ? appWindow.height : 800
// property int headerHeight: header.height
property Transfer transferView: Transfer { }
property Receive receiveView: Receive { }
@@ -73,7 +76,6 @@ Rectangle {
previousView = currentView
if (currentView) {
stackView.replace(currentView)
// Component.onCompleted is called before wallet is initilized
if (typeof currentView.onPageCompleted === "function") {
currentView.onPageCompleted();
@@ -126,27 +128,35 @@ Rectangle {
name: "History"
PropertyChanges { target: root; currentView: historyView }
PropertyChanges { target: historyView; model: appWindow.currentWallet ? appWindow.currentWallet.historyModel : null }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}, State {
name: "Transfer"
PropertyChanges { target: root; currentView: transferView }
PropertyChanges { target: mainFlickable; contentHeight: 1000 }
}, State {
name: "Receive"
PropertyChanges { target: root; currentView: receiveView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}, State {
name: "TxKey"
PropertyChanges { target: root; currentView: txkeyView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}, State {
name: "AddressBook"
PropertyChanges { target: root; currentView: addressBookView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}, State {
name: "Sign"
PropertyChanges { target: root; currentView: signView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}, State {
name: "Settings"
PropertyChanges { target: root; currentView: settingsView }
PropertyChanges { target: mainFlickable; contentHeight: 1200 }
}, State {
name: "Mining"
PropertyChanges { target: root; currentView: miningView }
PropertyChanges { target: mainFlickable; contentHeight: minHeight }
}
]
@@ -172,136 +182,47 @@ Rectangle {
anchors.topMargin: appWindow.persistentSettings.customDecorations ? 30 : 0
spacing: 0
// BasicPanel header
Rectangle {
id: header
anchors.leftMargin: 1
anchors.rightMargin: 1
Layout.fillWidth: true
Layout.preferredHeight: 64
color: "#FFFFFF"
visible: basicMode
Image {
id: logo
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: -5
anchors.left: parent.left
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
source: "images/moneroLogo2.png"
}
Grid {
anchors.verticalCenter: parent.verticalCenter
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: 10
width: 256
columns: 3
Text {
id: balanceLabel
width: 116
height: 20
font.family: "Arial"
font.pixelSize: 12
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#535353"
text: root.balanceLabelText + ":"
}
Text {
id: balanceText
width: 110
height: 20
font.family: "Arial"
font.pixelSize: 18
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#000000"
text: root.balanceText
}
Item {
height: 20
width: 20
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
source: "images/lockIcon.png"
}
}
Text {
id: availableBalanceLabel
width: 116
height: 20
font.family: "Arial"
font.pixelSize: 12
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#535353"
text: root.unlockedBalanceLabelText + ":"
}
Text {
id: availableBalanceText
width: 110
height: 20
font.family: "Arial"
font.pixelSize: 14
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#000000"
text: root.unlockedBalanceText
}
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 1
color: "#DBDBDB"
}
}
// Views container
StackView {
id: stackView
initialItem: transferView
anchors.topMargin: 30
Flickable {
id: mainFlickable
Layout.fillWidth: true
Layout.fillHeight: true
anchors.margins: 4
clip: true // otherwise animation will affect left panel
clip: true
// Disabled scrollbars, gives crash on startup on windows
// ScrollIndicator.vertical: ScrollIndicator { }
// ScrollBar.vertical: ScrollBar { } // uncomment to test
delegate: StackViewDelegate {
pushTransition: StackViewTransition {
PropertyAnimation {
target: enterItem
property: "x"
from: 0 - target.width
to: 0
duration: 300
}
PropertyAnimation {
target: exitItem
property: "x"
from: 0
to: target.width
duration: 300
// Views container
StackView {
id: stackView
initialItem: transferView
// anchors.topMargin: 30
// Layout.fillWidth: true
// Layout.fillHeight: true
anchors.fill:parent
// anchors.margins: 4
clip: true // otherwise animation will affect left panel
delegate: StackViewDelegate {
pushTransition: StackViewTransition {
PropertyAnimation {
target: enterItem
property: "x"
from: 0 - target.width
to: 0
duration: 300
}
PropertyAnimation {
target: exitItem
property: "x"
from: 0
to: target.width
duration: 300
}
}
}
}
}
}// flickable
}
// border
Rectangle {

View File

@@ -10,6 +10,11 @@ Copyright (c) 2014-2017, The Monero Project
- Github: [https://github.com/monero-project/monero-core](https://github.com/monero-project/monero-core)
- IRC: [#monero-dev on Freenode](irc://chat.freenode.net/#monero-dev)
## Vulnerability Response
- Our [Vulnerability Response Process](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md) encourages responsible disclosure
- We are also available via [HackerOne](https://hackerone.com/monero)
## Introduction
Monero is a private, secure, untraceable, decentralised digital currency. You are your bank, you control your funds, and nobody can trace your transfers unless you allow them to do so.
@@ -56,7 +61,8 @@ See [LICENSE](LICENSE).
Packages are available for
* Arch Linux via AUR: [monero-core-git](https://aur.archlinux.org/packages/monero-core-git/)
* Arch Linux via AUR: [monero-wallet-qt](https://aur.archlinux.org/packages/monero-wallet-qt/)
* Void Linux: xbps-install -S monero-core
Packaging for your favorite distribution would be a welcome contribution!
@@ -64,26 +70,27 @@ Packaging for your favorite distribution would be a welcome contribution!
### On Linux:
(Tested on Ubuntu 16.04 x86, 16.10 x64 and Linux Mint 18 "Sarah" - Cinnamon x64)
(Tested on Ubuntu 16.04 x86, 16.10 x64, Gentoo x64 and Linux Mint 18 "Sarah" - Cinnamon x64)
1. Install Monero dependencies.
1. Install Monero dependencies
- For Ubuntu and Mint
`sudo apt install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev`
2. Grab an up-to-date copy of the monero-core repository.
- For Gentoo
`sudo emerge app-arch/xz-utils app-doc/doxygen dev-cpp/gtest dev-libs/boost dev-libs/expat dev-libs/openssl dev-util/cmake media-gfx/graphviz net-dns/unbound net-libs/ldns net-libs/miniupnpc sys-libs/libunwind`
2. Grab an up-to-date copy of the monero-core repository
`git clone https://github.com/monero-project/monero-core.git`
3. Go into the repository.
3. Go into the repository
`cd monero-core`
4. Use the script to compile the Monero libs necessary to run the GUI.
`./get_libwallet_api.sh`
5. Install the GUI dependencies.
4. Install the GUI dependencies
- For Ubuntu 16.04 x86
@@ -91,23 +98,39 @@ Packaging for your favorite distribution would be a welcome contribution!
- For Ubuntu 16.04+ x64
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs qml-module-qt-labs-settings libqt5qml-graphicaleffects`
`sudo apt-get install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-xmllistmodel qttools5-dev-tools qml-module-qtquick-dialogs qml-module-qt-labs-settings libqt5qml-graphicaleffects`
- For Linux Mint 18 "Sarah" - Cinnamon x64
`sudo apt install qml-module-qt-labs-settings qml-module-qtgraphicaleffects`
`sudo apt install qml-module-qt-labs-settings qml-module-qtgraphicaleffects`
- For Gentoo
`sudo emerge dev-qt/qtcore:5 dev-qt/qtdeclarative:5 dev-qt/qtquickcontrols:5 dev-qt/qtquickcontrols2:5 dev-qt/qtgraphicaleffects:5`
- Optional : To build the flag `WITH_SCANNER`
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia libzbar-dev`
- For Ubuntu and Mint
6. Build the GUI.
`sudo apt install qtmultimedia5-dev qml-module-qtmultimedia libzbar-dev`
- For Gentoo
The *qml* USE flag must be enabled.
`emerge dev-qt/qtmultimedia:5 media-gfx/zbar`
5. Build the GUI
- For Ubuntu and Mint
`./build.sh`
7. Run the GUI client.
- For Gentoo
`./build/release/bin/monero-wallet-gui`
`QT_SELECT=5 ./build.sh`
The executable can be found in the build/release/bin folder.
### On OS X:
@@ -129,30 +152,21 @@ Packaging for your favorite distribution would be a welcome contribution!
`brew link --force --overwrite qt5`
4. Install latest Qt using official installer from [qt.io](https://www.qt.io/download-open-source/) (homebrew version might be outdated).
5. Add Qt bin dir to your path (check first if directory exists; 5.8 is the current version)
5. Add the Qt bin directory to your path
`export PATH=$PATH:$HOME/Qt/5.8/clang_64/bin`
Example: `export PATH=$PATH:$HOME/Qt/5.8/clang_64/bin`
5. Add Qt bin dir to your path. Example:
This is the directory where Qt 5.x is installed on **your** system
`export PATH=$PATH:/usr/local/opt/qt5/bin`
make sure this is where Qt 5.x is installed on **your** system eg `$HOME/Qt/5.8/clang_64/bin` if you downloaded from qt.io.
6. Grab an up-to-date copy of the monero-core repository.
6. Grab an up-to-date copy of the monero-core repository
`git clone https://github.com/monero-project/monero-core.git`
7. Go into the repository.
7. Go into the repository
`cd monero-core`
8. Build libwallet
`./get_libwallet_api.sh`
9. Start the build:
8. Start the build
`./build.sh`
@@ -160,7 +174,7 @@ The executable can be found in the `build/release/bin` folder.
**Note:** Workaround for "ERROR: Xcode not set up properly"
Edit `$HOME/Qt/5.7/clang_64/mkspecs/features/mac/default_pre.prf`
Edit `$HOME/Qt/5.8/clang_64/mkspecs/features/mac/default_pre.prf`
replace
`isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null")))`
@@ -175,33 +189,33 @@ More info: http://stackoverflow.com/a/35098040/1683164
1. Install [msys2](http://msys2.github.io/), follow the instructions on that page on how to update packages to the latest versions
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment.
2. Install monero dependencies as described in [monero documentation](https://github.com/monero-project/monero) into msys2 environment
**As we only build application for x86, install only dependencies for x86 architecture (i686 in package name)**
```
pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost
```
3. Install git into msys2 environment:
3. Install git into msys2 environment
```
pacman -S git
```
4. Install Qt5 from [official site](https://www.qt.io/download-open-source/).
4. Install Qt5 from [official site](https://www.qt.io/download-open-source/)
- download unified installer, run and select following options:
- Qt > Qt 5.7 > MinGW 5.3.0 32 bit
- Tools > MinGW 5.3.0
- continue with installation
5. Open ```MinGW-w64 Win32 Shell``` shell:
5. Open ```MinGW-w64 Win32 Shell``` shell
```%MSYS_ROOT%\msys2_shell.cmd -mingw32```
Where ```%MSYS_ROOT%``` will be ```c:\msys32``` if your host OS is x86-based or ```c:\msys64``` if your host OS
is x64-based
6. Install the latest version of boost, specificly the required static libraries:
6. Install the latest version of boost, specificly the required static libraries
```
cd
wget http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2
@@ -211,13 +225,13 @@ More info: http://stackoverflow.com/a/35098040/1683164
./b2 --prefix=/mingw32/boost --layout=tagged --without-mpi --without-python toolset=gcc address-model=32 variant=debug,release link=static threading=multi runtime-link=static -j$(nproc) install
```
7. Clone repository:
7. Clone repository
```
cd
git clone https://github.com/monero-project/monero-core.git
```
8. Build the GUI:
8. Build the GUI
```
cd monero-core
export PATH=$(ls -rd /c/Qt/5.[6,7,8]/mingw53_32/bin | head -1):$PATH
@@ -225,4 +239,5 @@ More info: http://stackoverflow.com/a/35098040/1683164
cd build
make deploy
```
The resulting executable can be found in ```.\release\bin```
The executable can be found in the ```.\release\bin``` directory.

53
android/README.md Normal file
View File

@@ -0,0 +1,53 @@
Copyright (c) 2014-2017, The Monero Project
## Current status : ALPHA
- Minimum Android 5.0 (api level 21)
- Modal dialogs can appear in background giving the feeling that the application is frozen (Work around : turn screen off/on or switch to another app and back)
## Build using Docker
# Base environnement
cd monero/utils/build_scripts
docker build -f android32.Dockerfile -t monero-android .
cd ..
# Build GUI
cd android/docker
docker build -t monero-gui-android .
docker create -it --name monero-gui-android monero-gui-android bash
# Get the apk
docker cp monero-gui-android:/opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk .
## Deployment
- Using ADB (Android debugger bridge) :
First, see section [Enable adb debugging on your device](https://developer.android.com/studio/command-line/adb.html#Enabling)
The only place where we are allowed to play is `/data/local/tmp`. So :
adb push /opt/android/monero-core/build/release/bin/bin/QtApp-debug.apk /data/local/tmp
adb shell pm install -r /data/local/tmp/QtApp-debug.apk
- Troubleshooting:
adb devices -l
adb logcat
if using adb inside docker, make sure you did "docker run -v /dev/bus/usb:/dev/bus/usb --privileged"
- Using a web server
mkdir /usr/tmp
cp QtApp-debug.apk /usr/tmp
docker run -d -v /usr/tmp:/usr/share/nginx/html:ro -p 8080:80 nginx
Now it should be accessible through a web browser at
http://<your.local.ip>:8080/QtApp-debug.apk

108
android/docker/Dockerfile Normal file
View File

@@ -0,0 +1,108 @@
FROM monero-android
#INSTALL JAVA
RUN echo "deb http://ftp.fr.debian.org/debian/ jessie-backports main contrib non-free" >> /etc/apt/sources.list
RUN dpkg --add-architecture i386 \
&& apt-get update \
&& apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386 libz1:i386 \
&& apt-get install -y -t jessie-backports ca-certificates-java openjdk-8-jdk-headless openjdk-8-jre-headless ant
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV PATH $JAVA_HOME/bin:$PATH
#Get Qt
ENV QT_VERSION 5.8
RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} \
&& cd qt5 \
&& perl init-repository
## Note: Need to use libc++ but Qt does not provide mkspec for libc++.
## Their support of it is quite recent and they claim they don't use it by default
## [only because it produces bigger binary objects](https://bugreports.qt.io/browse/QTBUG-50724).
#Create new mkspec for clang + libc++
RUN cp -r qt5/qtbase/mkspecs/android-clang qt5/qtbase/mkspecs/android-clang-libc \
&& cd qt5/qtbase/mkspecs/android-clang-libc \
&& sed -i '16i ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$$ANDROID_TARGET_ARCH' qmake.conf \
&& sed -i '17i ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/include' qmake.conf \
&& echo "QMAKE_LIBS_PRIVATE = -lc++_shared -llog -lz -lm -ldl -lc -lgcc " >> qmake.conf \
&& echo "QMAKE_CFLAGS -= -mfpu=vfp " >> qmake.conf \
&& echo "QMAKE_CXXFLAGS -= -mfpu=vfp " >> qmake.conf \
&& echo "QMAKE_CFLAGS += -mfpu=vfp4 " >> qmake.conf \
&& echo "QMAKE_CXXFLAGS += -mfpu=vfp4 " >> qmake.conf
ENV ANDROID_API android-21
#ANDROID SDK TOOLS
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter platform-tools
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter ${ANDROID_API}
RUN echo y | $ANDROID_SDK_ROOT/tools/android update sdk --no-ui --all --filter build-tools-25.0.1
ENV CLEAN_PATH $JAVA_HOME/bin:/usr/cmake-3.6.3-Linux-x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#build Qt
RUN cd qt5 && PATH=${CLEAN_PATH} ./configure -developer-build -release \
-xplatform android-clang-libc \
-android-ndk-platform ${ANDROID_API} \
-android-ndk $ANDROID_NDK_ROOT \
-android-sdk $ANDROID_SDK_ROOT \
-opensource -confirm-license \
-prefix ${WORKDIR}/Qt-${QT_VERSION} \
-nomake tests -nomake examples \
-skip qtserialport \
-skip qtconnectivity \
-skip qttranslations \
-skip qtgamepad -skip qtscript -skip qtdoc
# build Qt tools : gnustl_shared.so is hard-coded in androiddeployqt
# replace it with libc++_shared.so
COPY androiddeployqt.patch qt5/qttools/androiddeployqt.patch
RUN cd qt5/qttools \
&& git apply androiddeployqt.patch \
&& cd .. \
&& PATH=${CLEAN_PATH} make -j4 \
&& PATH=${CLEAN_PATH} make install
# Get iconv and ZBar
ENV ICONV_VERSION 1.14
RUN git clone https://github.com/ZBar/ZBar.git \
&& curl -s -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
&& tar -xzf libiconv-${ICONV_VERSION}.tar.gz \
&& cd libiconv-${ICONV_VERSION} \
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ./configure --build=x86_64-linux-gnu --host=arm-eabi --prefix=${WORKDIR}/libiconv --disable-rpath
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$PATH
#Build libiconv.a and libzbarjni.a
COPY android.mk.patch ZBar/android.mk.patch
RUN cd ZBar \
&& git apply android.mk.patch \
&& echo \
"APP_ABI := armeabi-v7a \n\
APP_STL := c++_shared \n\
TARGET_PLATFORM := ${ANDROID_API} \n\
TARGET_ARCH_ABI := armeabi-v7a \n\
APP_CFLAGS += -target armv7-none-linux-androideabi -fexceptions -fstack-protector-strong -fno-limit-debug-info -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -fno-omit-frame-pointer -fno-stack-protector\n"\
>> android/jni/Application.mk \
&& cd android \
&& android update project --path . -t "${ANDROID_API}" \
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ ant -Dndk.dir=${ANDROID_NDK_ROOT} -Diconv.src=${WORKDIR}/libiconv-${ICONV_VERSION} zbar-clean zbar-ndk-build
#Can't directly call build.sh because of env variables
RUN git clone https://github.com/monero-project/monero-core.git \
&& cd monero-core \
&& git submodule update \
&& CC=arm-linux-androideabi-clang CXX=arm-linux-androideabi-clang++ BOOST_ROOT=/opt/android/boost_1_62_0 BOOST_LIBRARYDIR=${WORKDIR}/boost_${BOOST_VERSION}/android32/lib/ OPENSSL_ROOT_DIR=${WORKDIR}/openssl/ ./get_libwallet_api.sh release-android
RUN cp openssl/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
RUN cp boost_${BOOST_VERSION}/android32/lib/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
RUN cp ZBar/android/obj/local/armeabi-v7a/lib* ${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm/usr/lib
ENV PATH $ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:${WORKDIR}/Qt-${QT_VERSION}/bin:$CLEAN_PATH
# NB : zxcvbn-c needs to build a local binary and Qt don't care about these environnement variable
RUN cd monero-core \
&& CC="gcc" CXX="g++" ./build.sh release-android \
&& cd build \
&& make deploy

View File

@@ -0,0 +1,61 @@
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index e442b07..158afd5 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -12,14 +12,18 @@ LOCAL_PATH := $(ICONV_SRC)
LOCAL_MODULE := libiconv
+LOCAL_ARM_MODE := arm
+LOCAL_CPP_FEATURES := exceptions rtti features
LOCAL_CFLAGS := \
-Wno-multichar \
-D_ANDROID \
- -DLIBDIR="c" \
+ -DLIBDIR="\".\"" \
-DBUILDING_LIBICONV \
-DBUILDING_LIBCHARSET \
-DIN_LIBRARY
+LOCAL_CFLAGS += -fno-stack-protector
+
LOCAL_SRC_FILES := \
lib/iconv.c \
libcharset/lib/localcharset.c \
@@ -30,13 +34,14 @@ LOCAL_C_INCLUDES := \
$(ICONV_SRC)/libcharset \
$(ICONV_SRC)/libcharset/include
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
LOCAL_LDLIBS := -llog -lcharset
# libzbarjni
include $(CLEAR_VARS)
+
LOCAL_PATH := $(MY_LOCAL_PATH)
LOCAL_MODULE := zbarjni
LOCAL_SRC_FILES := ../../java/zbarjni.c \
@@ -71,6 +76,17 @@ LOCAL_C_INCLUDES := ../include \
../zbar \
$(ICONV_SRC)/include
-LOCAL_SHARED_LIBRARIES := libiconv
+LOCAL_STATIC_LIBRARIES := libiconv
+LOCAL_ARM_MODE := arm
+LOCAL_CPP_FEATURES := exceptions rtti features
+
+LOCAL_CFLAGS := \
+ -Wno-multichar \
+ -D_ANDROID \
+ -DLIBDIR="\".\"" \
+ -DBUILDING_LIBICONV \
+ -DBUILDING_LIBCHARSET \
+ -DIN_LIBRARY
+
-include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
+include $(BUILD_STATIC_LIBRARY)

View File

@@ -0,0 +1,62 @@
diff --git a/src/androiddeployqt/main.cpp b/src/androiddeployqt/main.cpp
index 8a8e591..71d693e 100644
--- a/src/androiddeployqt/main.cpp
+++ b/src/androiddeployqt/main.cpp
@@ -1122,7 +1122,7 @@ bool updateLibsXml(const Options &options)
QString libsPath = QLatin1String("libs/") + options.architecture + QLatin1Char('/');
- QString qtLibs = QLatin1String("<item>gnustl_shared</item>\n");
+ QString qtLibs = QLatin1String("<item>c++_shared</item>\n");
QString bundledInLibs;
QString bundledInAssets;
foreach (Options::BundledFile bundledFile, options.bundledFiles) {
@@ -2519,6 +2519,39 @@ bool installApk(const Options &options)
return true;
}
+bool copyStl(Options *options)
+{
+ if (options->deploymentMechanism == Options::Debug && !options->installApk)
+ return true;
+
+ if (options->verbose)
+ fprintf(stdout, "Copying LIBC++ STL library\n");
+
+ QString filePath = options->ndkPath
+ + QLatin1String("/sources/cxx-stl/llvm-libc++")
+ + QLatin1String("/libs/")
+ + options->architecture
+ + QLatin1String("/libc++_shared.so");
+ if (!QFile::exists(filePath)) {
+ fprintf(stderr, "LIBC STL library does not exist at %s\n", qPrintable(filePath));
+ return false;
+ }
+
+ QString destinationDirectory =
+ options->deploymentMechanism == Options::Debug
+ ? options->temporaryDirectoryName + QLatin1String("/lib")
+ : options->outputDirectory + QLatin1String("/libs/") + options->architecture;
+
+ if (!copyFileIfNewer(filePath, destinationDirectory
+ + QLatin1String("/libc++_shared.so"), options->verbose)) {
+ return false;
+ }
+
+ if (options->deploymentMechanism == Options::Debug && !deployToLocalTmp(options, QLatin1String("/lib/libc++_shared.so")))
+ return false;
+
+ return true;
+}
bool copyGnuStl(Options *options)
{
if (options->deploymentMechanism == Options::Debug && !options->installApk)
@@ -2870,7 +2903,7 @@ int main(int argc, char *argv[])
if (Q_UNLIKELY(options.timing))
fprintf(stdout, "[TIMING] %d ms: Read dependencies\n", options.timer.elapsed());
- if (options.deploymentMechanism != Options::Ministro && !copyGnuStl(&options))
+ if (options.deploymentMechanism != Options::Ministro && !copyStl(&options))
return CannotCopyGnuStl;
if (Q_UNLIKELY(options.timing))

View File

@@ -54,7 +54,7 @@ if [[ $platform == *bsd* ]]; then
fi
# build libwallet
$SHELL get_libwallet_api.sh $BUILD_TYPE
./get_libwallet_api.sh $BUILD_TYPE
# build zxcvbn
$MAKE -C src/zxcvbn-c || exit
@@ -78,11 +78,11 @@ fi
# force version update
get_tag
echo "var GUI_VERSION = \"$VERSIONTAG\"" > version.js
echo "var GUI_VERSION = \"$TAGNAME\"" > version.js
pushd "$MONERO_DIR"
get_tag
popd
echo "var GUI_MONERO_VERSION = \"$VERSIONTAG\"" >> version.js
echo "var GUI_MONERO_VERSION = \"$TAGNAME\"" >> version.js
cd build
qmake ../monero-wallet-gui.pro "$CONFIG" || exit

View File

@@ -122,7 +122,7 @@ ListView {
ListModel {
id: dropModel
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
ListElement { name: "<b>Send to same destination</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
// ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
ListElement { name: "<b>Remove from address book</b>"; icon: "../images/dropdownDel.png" }
}

View File

@@ -59,6 +59,15 @@ Window {
width: 480
height: 280
// Make window draggable
MouseArea {
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
}
ColumnLayout {
id: mainLayout
spacing: 10

View File

@@ -53,6 +53,15 @@ Window {
width: 480
height: 200
// Make window draggable
MouseArea {
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
}
ColumnLayout {
id: mainLayout
spacing: 10

View File

@@ -216,7 +216,7 @@ ListView {
id: dropModel
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
ListElement { name: "<b>Send to same destination</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
}

View File

@@ -259,11 +259,11 @@ ListView {
//elide: Text.ElideRight
font.family: "Arial"
font.pixelSize: 13
color: (confirmations < 10)? "#FF6C3C" : "#545454"
color: (confirmations < confirmationsRequired)? "#FF6C3C" : "#545454"
text: {
if (!isPending)
if(confirmations < 10)
return blockHeight + " " + qsTr("(%1/10 confirmations)").arg(confirmations)
if(confirmations < confirmationsRequired)
return blockHeight + " " + qsTr("(%1/%2 confirmations)").arg(confirmations).arg(confirmationsRequired)
else
return blockHeight
if (!isOut)
@@ -443,7 +443,7 @@ ListView {
id: dropModel
ListElement { name: "<b>Copy address to clipboard</b>"; icon: "../images/dropdownCopy.png" }
ListElement { name: "<b>Add to address book</b>"; icon: "../images/dropdownAdd.png" }
ListElement { name: "<b>Send to same destination</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Send to this address</b>"; icon: "../images/dropdownSend.png" }
ListElement { name: "<b>Find similar transactions</b>"; icon: "../images/dropdownSearch.png" }
}

View File

@@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0
import QtQuick.Layouts 1.1
Item {
id: item
@@ -35,6 +36,7 @@ Item {
property alias textFormat: label.textFormat
property string tipText: ""
property int fontSize: 12
property alias wrapMode: label.wrapMode
signal linkActivated()
width: icon.x + icon.width
height: icon.height
@@ -59,23 +61,23 @@ Item {
visible: appWindow.whatIsEnable
}
MouseArea {
anchors.fill: icon
enabled: appWindow.whatIsEnable
hoverEnabled: true
onEntered: {
icon.visible = false
var pos = appWindow.mapFromItem(icon, 0, -15)
tipItem.text = item.tipText
tipItem.x = pos.x
if(tipItem.height > 30)
pos.y -= tipItem.height - 28
tipItem.y = pos.y
tipItem.visible = true
}
onExited: {
icon.visible = Qt.binding(function(){ return appWindow.whatIsEnable; })
tipItem.visible = false
}
}
// MouseArea {
// anchors.fill: icon
// enabled: appWindow.whatIsEnable
// hoverEnabled: true
// onEntered: {
// icon.visible = false
// var pos = appWindow.mapFromItem(icon, 0, -15)
// tipItem.text = item.tipText
// tipItem.x = pos.x
// if(tipItem.height > 30)
// pos.y -= tipItem.height - 28
// tipItem.y = pos.y
// tipItem.visible = true
// }
// onExited: {
// icon.visible = Qt.binding(function(){ return appWindow.whatIsEnable; })
// tipItem.visible = false
// }
// }
}

119
components/MobileHeader.qml Normal file
View File

@@ -0,0 +1,119 @@
import QtQuick 2.2
import QtGraphicalEffects 1.0
import QtQuick.Layouts 1.1
import moneroComponents.Wallet 1.0
// BasicPanel header
Rectangle {
id: header
anchors.leftMargin: 1
anchors.rightMargin: 1
Layout.fillWidth: true
Layout.preferredHeight: 64
color: "#FFFFFF"
// visible: basicMode
Image {
id: logo
visible: appWindow.width > 460
anchors.verticalCenter: parent.verticalCenter
anchors.verticalCenterOffset: -5
anchors.left: parent.left
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
source: "../images/moneroLogo2.png"
}
Image {
id: icon
visible: !logo.visible
anchors.verticalCenter: parent.verticalCenter
// anchors.verticalCenterOffset: -5
anchors.left: parent.left
anchors.leftMargin: appWindow.persistentSettings.customDecorations ? 20 : 40
source: "../images/moneroIcon.png"
}
Grid {
anchors.verticalCenter: parent.verticalCenter
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: 10
width: 256
columns: 3
Text {
id: balanceLabel
width: 116
height: 20
font.family: "Arial"
font.pixelSize: 12
font.letterSpacing: -1
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#535353"
text: leftPanel.balanceLabelText + ":"
}
Text {
id: balanceText
width: 110
height: 20
font.family: "Arial"
font.pixelSize: 18
font.letterSpacing: -1
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#000000"
text: leftPanel.balanceText
}
Item {
height: 20
width: 20
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
source: "../images/lockIcon.png"
}
}
Text {
width: 116
height: 20
font.family: "Arial"
font.pixelSize: 12
font.letterSpacing: -1
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#535353"
text: qsTr("Unlocked Balance:")
}
Text {
id: availableBalanceText
width: 110
height: 20
font.family: "Arial"
font.pixelSize: 14
font.letterSpacing: -1
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
color: "#000000"
text: leftPanel.unlockedBalanceText
}
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 1
color: "#DBDBDB"
}
}

View File

@@ -75,6 +75,7 @@ Item {
}
function show(message) {
item.visible = true
item.message = message
item.active = true
hider.running = true

View File

@@ -56,6 +56,15 @@ Window {
width: 480
height: walletName ? 240 : 200
// Make window draggable
MouseArea {
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
}
ColumnLayout {
id: mainLayout
spacing: 10

View File

@@ -116,7 +116,7 @@ Item {
Row {
id: row2
spacing: ((bar.width - 8) / 2) / 4
spacing: bar.width / 14
Repeater {
model: 4
@@ -125,7 +125,7 @@ Item {
id: delegateItem2
currentX: x + row2.x
currentIndex: index
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
mainTick: currentIndex === 0
Component.onCompleted: {
row.positions[currentIndex] = delegateItem2
}
@@ -135,7 +135,7 @@ Item {
Row {
id: row1
spacing: ((bar.width - 8) / 2) / 10
spacing: bar.width / 14
Repeater {
model: 10
@@ -144,7 +144,7 @@ Item {
id: delegateItem1
currentX: x + row1.x
currentIndex: index + 4
mainTick: currentIndex === 0 || currentIndex === 3 || currentIndex === 13
mainTick: currentIndex === 13
Component.onCompleted: {
row.positions[currentIndex] = delegateItem1
}

View File

@@ -45,8 +45,6 @@ Item {
// Dynamic label width
Layout.minimumWidth: (label.contentWidth > 80)? label.contentWidth + 20 : 100
Rectangle {
anchors.left: parent.left
anchors.right: parent.right

View File

@@ -54,6 +54,14 @@ Window {
signal accepted()
signal rejected()
// Make window draggable
MouseArea {
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: root.x += (mouseX - lastMousePos.x)
onMouseYChanged: root.y += (mouseY - lastMousePos.y)
}
function open() {
show()

View File

@@ -197,6 +197,10 @@ Item {
property string stringLow: qsTr("Low (x1 fee)") + translationManager.emptyString
property string stringMedium: qsTr("Medium (x20 fee)") + translationManager.emptyString
property string stringHigh: qsTr("High (x166 fee)") + translationManager.emptyString
property string stringSlow: qsTr("Slow (x0.25 fee)") + translationManager.emptyString
property string stringDefault: qsTr("Default (x1 fee)") + translationManager.emptyString
property string stringFast: qsTr("Fast (x5 fee)") + translationManager.emptyString
property string stringFastest: qsTr("Fastest (x41.5 fee)") + translationManager.emptyString
property string stringAll: qsTr("All") + translationManager.emptyString
property string stringSent: qsTr("Sent") + translationManager.emptyString
property string stringReceived: qsTr("Received") + translationManager.emptyString

View File

@@ -180,7 +180,7 @@ Item {
// Workaround for translations in listElements. All translated strings needs to be listed in this file.
property string stringCopy: qsTr("<b>Copy address to clipboard</b>") + translationManager.emptyString
property string stringSend: qsTr("<b>Send to same destination</b>") + translationManager.emptyString
property string stringSend: qsTr("<b>Send to this address</b>") + translationManager.emptyString
property string stringFind: qsTr("<b>Find similar transactions</b>") + translationManager.emptyString
property string stringRemove: qsTr("<b>Remove from address book</b>") + translationManager.emptyString

7
components/TextBlock.qml Normal file
View File

@@ -0,0 +1,7 @@
import QtQuick 2.0
TextEdit {
wrapMode: Text.Wrap
readOnly: true
selectByMouse: true
}

View File

@@ -53,7 +53,6 @@ Item {
color: "#4A4949"
text: {
if(currentIndex === 0) return qsTr("Normal") + translationManager.emptyString
if(currentIndex === 3) return qsTr("Medium") + translationManager.emptyString
if(currentIndex === 13) return qsTr("High") + translationManager.emptyString
return ""
}
@@ -65,7 +64,7 @@ Item {
anchors.topMargin: 14
width: 1
color: "#DBDBDB"
height: currentIndex === 8 ? 16 : 8
height: 8
visible: !parent.mainTick
}
}

View File

@@ -58,14 +58,15 @@ Rectangle {
property bool checked: false
anchors.top: parent.top
anchors.left: parent.left
color: basicMouseArea.containsMouse || checked ? "#FFE00A" : "#000000"
color: basicMouseArea.containsMouse || !leftPanel.visible ? "#FFE00A" : "#000000"
height: 30
width: height
visible: isMobile
Image {
anchors.centerIn: parent
rotation: parent.checked ? 180 : 0
source: parent.customDecorations || parent.checked ? "../images/goToBasicVersionHovered.png" :
rotation: !leftPanel.visible ? 180 : 0
source: parent.customDecorations || !leftPanel.visible ? "../images/goToBasicVersionHovered.png" :
"../images/gotoBasicVersion.png"
}
@@ -75,7 +76,7 @@ Rectangle {
anchors.fill: parent
onClicked: {
parent.checked = !parent.checked
titleBar.goToBasicVersion(parent.checked)
titleBar.goToBasicVersion(leftPanel.visible)
}
}
}

0
empty Normal file
View File

View File

@@ -15,9 +15,9 @@ BUILD_LIBWALLET=false
if [ ! -d $MONERO_DIR/src ]; then
git submodule init monero
fi
git submodule update
git -C $MONERO_DIR fetch --tags
git -C $MONERO_DIR checkout v0.10.3.1
git submodule update --remote
git -C $MONERO_DIR fetch
git -C $MONERO_DIR checkout release-v0.11.0.0
# get monero core tag
get_tag
@@ -226,6 +226,8 @@ fi
# build install epee
eval make -C $MONERO_DIR/build/release/contrib/epee all install
# install easylogging
eval make -C $MONERO_DIR/build/release/external/easylogging++ all install
# Install libunwind
echo "Installing libunbound..."

5
installers/windows/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
# The subdirectory with the individual GUI Wallet files
bin/
# The subdirectory with the generated installer "mysetup.exe"
Output/

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

View File

@@ -0,0 +1,31 @@
Copyright (c) 2014-2017, The Monero Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Parts of the project are originally copyright (c) 2012-2013 The Cryptonote
developers

View File

@@ -0,0 +1,371 @@
; Monero Helium Hydra GUI Wallet Installer for Windows
; Copyright (c) 2014-2017, The Monero Project
; See LICENSE
[Setup]
AppName=Monero GUI Wallet
; For InnoSetup this is the property that uniquely identifies the application as such
; Thus it's important to keep this stable over releases
; With a different "AppName" InnoSetup would treat a mere update as a completely new application and thus mess up
AppVersion=0.11.1.0
DefaultDirName={pf}\Monero GUI Wallet
DefaultGroupName=Monero GUI Wallet
UninstallDisplayIcon={app}\monero-wallet-gui.exe
PrivilegesRequired=admin
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
WizardSmallImageFile=WizardSmallImage.bmp
WizardImageFile=WelcomeImage.bmp
DisableWelcomePage=no
LicenseFile=LICENSE
[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"
; Without localized versions of special forms, messages etc. of the installer, and without translated ReadMe's
; it probably does not make much sense to offer other install-time languages beside English
; Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
; Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
; Name: "jp"; MessagesFile: "compiler:Languages\Japanese.isl"
; Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"
; Name: "pt"; MessagesFile: "compiler:Languages\Portuguese.isl"
[Files]
Source: "ReadMe.htm"; DestDir: "{app}"; Flags: comparetimestamp
Source: "FinishImage.bmp"; Flags: dontcopy
; Monero GUI wallet
Source: "bin\monero-wallet-gui.exe"; DestDir: "{app}"; Flags: comparetimestamp
; Monero GUI wallet log file
; The GUI wallet does not have the "--log-file" command-line option of the CLI wallet and insists to put the .log beside the .exe
; so pre-create the file and give the necessary permissions to the wallet to write into it
Source: "monero-wallet-gui.log"; DestDir: "{app}"; Flags: comparetimestamp; Permissions: users-modify
; Monero CLI wallet
Source: "bin\monero-wallet-cli.exe"; DestDir: "{app}"; Flags: comparetimestamp
; Monero wallet RPC interface implementation
Source: "bin\monero-wallet-rpc.exe"; DestDir: "{app}"; Flags: comparetimestamp
; Monero daemon
Source: "bin\monerod.exe"; DestDir: "{app}"; Flags: comparetimestamp
; Monero daemon wrapped in a batch file that stops before the text window closes, to see any error messages
Source: "monero-daemon.bat"; DestDir: "{app}"; Flags: comparetimestamp;
; Monero blockchain utilities
Source: "bin\monero-blockchain-export.exe"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\monero-blockchain-import.exe"; DestDir: "{app}"; Flags: comparetimestamp
; was present in 0.10.3.1, not present anymore in 0.11.1.0
; Source: "bin\monero-utils-deserialize.exe"; DestDir: "{app}"; Flags: comparetimestamp
; Various .qm files for translating the wallet UI "on the fly" into all supported languages
Source: "bin\translations\*"; DestDir: "{app}\translations"; Flags: recursesubdirs comparetimestamp
; Core Qt runtime
Source: "bin\Qt5Core.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Gui.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Multimedia.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5MultimediaQuick_p.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Network.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Qml.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Quick.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Svg.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5Widgets.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\Qt5XmlPatterns.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Qt QML elements like the local files selector "FolderListModel" and "Settings"
Source: "bin\Qt\*"; DestDir: "{app}\Qt"; Flags: recursesubdirs comparetimestamp
; Qt audio support
Source: "bin\audio\*"; DestDir: "{app}\audio"; Flags: recursesubdirs comparetimestamp
; Qt bearer / network connection management
Source: "bin\bearer\*"; DestDir: "{app}\bearer"; Flags: recursesubdirs comparetimestamp
; Qt Windows platform plugin
Source: "bin\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: comparetimestamp
; Qt support for SVG icons
Source: "bin\iconengines\*"; DestDir: "{app}\iconengines"; Flags: recursesubdirs comparetimestamp
; Qt support for various image formats (JPEG, BMP, SVG etc)
Source: "bin\imageformats\*"; DestDir: "{app}\imageformats"; Flags: recursesubdirs comparetimestamp
; Qt multimedia support
Source: "bin\QtMultimedia\*"; DestDir: "{app}\QtMultimedia"; Flags: recursesubdirs comparetimestamp
Source: "bin\mediaservice\*"; DestDir: "{app}\mediaservice"; Flags: recursesubdirs comparetimestamp
; Qt support for "m3u" playlists
; candidate for elimination? Don't think the GUI wallet needs such playlists
Source: "bin\playlistformats\*"; DestDir: "{app}\playlistformats"; Flags: recursesubdirs comparetimestamp
; Qt graphical effects as part of the core runtime, effects like blurring and blending
Source: "bin\QtGraphicalEffects\*"; DestDir: "{app}\QtGraphicalEffects"; Flags: recursesubdirs comparetimestamp
; Some more Qt graphical effects
; "private" as a name for this directory looks a little strange. Historical reasons?
Source: "bin\private\*"; DestDir: "{app}\private"; Flags: recursesubdirs comparetimestamp
; Qt QML files
Source: "bin\QtQml\*"; DestDir: "{app}\QtQml"; Flags: recursesubdirs comparetimestamp
; Qt Quick files
Source: "bin\QtQuick\*"; DestDir: "{app}\QtQuick"; Flags: recursesubdirs comparetimestamp
Source: "bin\QtQuick.2\*"; DestDir: "{app}\QtQuick.2"; Flags: recursesubdirs comparetimestamp
; Qt Quick 2D Renderer fallback for systems / environments with "low-level graphics" i.e. without 3D support
Source: "bin\scenegraph\*"; DestDir: "{app}\scenegraph"; Flags: recursesubdirs comparetimestamp
Source: "bin\start-low-graphics-mode.bat"; DestDir: "{app}"; Flags: comparetimestamp
; Mesa, open-source OpenGL implementation; part of "low-level graphics" support
Source: "bin\opengl32sw.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Left out subdirectory "qmltooling" with the Qt QML debugger: Probably not relevant in an end-user package
; Microsoft Direct3D runtime
Source: "bin\D3Dcompiler_47.dll"; DestDir: "{app}"; Flags: comparetimestamp
; bzip2 support
Source: "bin\libbz2-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
; ANGLE ("Almost Native Graphics Layer Engine") support, as used by Qt
Source: "bin\libEGL.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\libGLESV2.dll"; DestDir: "{app}"; Flags: comparetimestamp
; FreeType font engine, as used by Qt
Source: "bin\libfreetype-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
; GCC runtime, x64 version
Source: "bin\libgcc_s_seh-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
; GLib, low level core library e.g. for GNOME and GTK+
; Really needed under Windows?
Source: "bin\libglib-2.0-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Graphite font support
; Really needed?
Source: "bin\libgraphite2.dll"; DestDir: "{app}"; Flags: comparetimestamp
; HarfBuzz OpenType text shaping engine
; Really needed?
Source: "bin\libharfbuzz-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
; LibIconv, conversions between character encodings
Source: "bin\libiconv-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Part of cygwin? Needed by Qt somehow?
Source: "bin\libicudt57.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\libicuin57.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\libicuuc57.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Library for native language support, part of GNU gettext
Source: "bin\libintl-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
; JasPer, support for JPEG-2000
; was present in 0.10.3.1, not present anymore in 0.11.1.0
; Source: "bin\libjasper-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
; libjpeg, C library for reading and writing JPEG image files
Source: "bin\libjpeg-8.dll"; DestDir: "{app}"; Flags: comparetimestamp
; Little CMS, color management system
Source: "bin\liblcms2-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
; XZ Utils, LZMA compression library
Source: "bin\liblzma-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
; MNG / Portable Network Graphics ("animated PNG")
Source: "bin\libmng-2.dll"; DestDir: "{app}"; Flags: comparetimestamp
; PCRE, Perl Compatible Regular Expressions
Source: "bin\libpcre-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
Source: "bin\libpcre16-0.dll"; DestDir: "{app}"; Flags: comparetimestamp
; libpng, the official PNG reference library
Source: "bin\libpng16-16.dll"; DestDir: "{app}"; Flags: comparetimestamp
; libstdc++, GNU Standard C++ Library
Source: "bin\libstdc++-6.dll"; DestDir: "{app}"; Flags: comparetimestamp
; LibTIFF, TIFF Library and Utilities
Source: "bin\libtiff-5.dll"; DestDir: "{app}"; Flags: comparetimestamp
; C++ threading support
Source: "bin\libwinpthread-1.dll"; DestDir: "{app}"; Flags: comparetimestamp
; zlib compression library
Source: "bin\zlib1.dll"; DestDir: "{app}"; Flags: comparetimestamp
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:";
[Run]
Filename: "{app}\ReadMe.htm"; Description: "Show ReadMe"; Flags: postinstall shellexec skipifsilent
; DON'T offer to run the wallet right away, let the people read about initial blockchain download first in the ReadMe
; Filename: "{app}\monero-wallet-gui.exe"; Description: "Run GUI Wallet now"; Flags: postinstall nowait skipifsilent
[Code]
var
BlockChainDirPage: TInputDirWizardPage;
blockChainDefaultDir: String;
procedure InitializeWizard;
var s: String;
width: Integer;
begin
// Large image for the "Welcome" page, with page reconfigured
WizardForm.WelcomeLabel1.Visible := false;
WizardForm.WelcomeLabel2.Visible := false;
WizardForm.WizardBitmapImage.Height := 300;
WizardForm.WizardBitmapImage.Width := 500;
// Image for the "Finnish" screen, in standard WizardBitmapImage size of 164 x 314
ExtractTemporaryFile('FinishImage.bmp');
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\FinishImage.bmp'));
// Additional wizard page for entering a special blockchain location
blockChainDefaultDir := ExpandConstant('{commonappdata}\bitmonero');
s := 'The default folder to store the Monero blockchain is ' + blockChainDefaultDir;
s := s + '. As this will need more than 30 GB of free space, you may want to use a folder on a different drive.';
s := s + ' If yes, specify that folder here.';
BlockChainDirPage := CreateInputDirPage(wpSelectDir,
'Select Blockchain Directory', 'Where should the blockchain be installed?',
s,
False, '');
BlockChainDirPage.Add('');
BlockChainDirPage.Values[0] := GetPreviousData('BlockChainDir', '');
if BlockChainDirPage.Values[0] = '' then begin
// Unfortunately 'TInputDirWizardDirPage' does not allow empty field
BlockChainDirPage.Values[0] := blockChainDefaultDir;
end;
end;
procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
// Store the selected folder for further reinstall/upgrade
SetPreviousData(PreviousDataKey, 'BlockChainDir', BlockChainDirPage.Values[0]);
end;
function BlockChainDir(Param: String) : String;
// Directory of the blockchain
var s: String;
begin
s := BlockChainDirPage.Values[0];
Result := s;
// No quotes for folder name with blanks as this is never used as part of a command line
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var s: String;
begin
// Fill the 'Ready Memo' with the normal settings and the custom settings
s := '';
s := s + MemoDirInfo + NewLine + NewLine;
s := s + 'Blockchain folder' + NewLine;
s := s + Space + BlockChainDir('') + NewLine;
Result := s;
end;
function DaemonLog(Param: String) : String;
// Full filename of the log of the daemon
begin
Result := BlockChainDir('') + '\bitmonero.log';
// No quotes for filename with blanks as this is never used as part of a command line
end;
function DaemonFlags(Param: String): String;
// Flags to add to the shortcut to the daemon
var s: String;
begin
s := BlockChainDir('');
if s = blockChainDefaultDir then begin
// No need to add the default dir as flags for the daemon
s := '';
end;
if Pos(' ', s) > 0 then begin
// Quotes needed for filename with blanks
s := '"' + s + '"';
end;
if s <> '' then begin
s := '--data-dir ' + s;
end;
Result := s;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var s: TArrayOfString;
begin
if CurStep = ssPostInstall then begin
// Re-build "monero-daemon.bat" according to actual install and blockchain directory used
SetArrayLength(s, 3);
s[0] := 'REM Execute the Monero daemon and then stay with window open after it exits';
s[1] := '"' + ExpandConstant('{app}\monerod.exe') + '" ' + DaemonFlags('');
s[2] := 'PAUSE';
SaveStringsToFile(ExpandConstant('{app}\monero-daemon.bat'), s, false);
end;
end;
function InitializeUninstall(): Boolean;
var s: String;
begin
s := 'Please note: Uninstall will not delete any downloaded blockchain. ';
s := s + 'If you do not need it anymore you have to delete it manually.';
s := s + #13#10#13#10 + 'Uninstall will not delete any wallets that you created either.';
MsgBox(s, mbInformation, MB_OK);
Result := true;
end;
[Icons]
; Icons in the "Monero GUI Wallet" program group
; Windows will almost always display icons in alphabetical order, per level, so specify the text accordingly
Name: "{group}\GUI Wallet"; Filename: "{app}\monero-wallet-gui.exe"
Name: "{group}\Uninstall GUI Wallet"; Filename: "{uninstallexe}"
; Sub-folder "Utilities";
; Note that Windows 10, unlike Windows 7, ignores such sub-folders completely
; and insists on displaying ALL icons on one single level
Name: "{group}\Utilities\Monero Daemon"; Filename: "{app}\monerod.exe"; Parameters: {code:DaemonFlags}
Name: "{group}\Utilities\Read Me"; Filename: "{app}\ReadMe.htm"
; CLI wallet: Needs a working directory ("Start in:") set in the icon, because with no such directory set
; it tries to create new wallets without a path given in the probably non-writable program folder and will abort with an error
Name: "{group}\Utilities\Textual (CLI) Wallet"; Filename: "{app}\monero-wallet-cli.exe"; WorkingDir: "{userdocs}\Monero\wallets"
; Icons for troubleshooting problems / testing / debugging
; To show that they are in some way different (not for everyday use), make them visually different
; from the others by text, and make them sort at the end by the help of "x" in front
Name: "{group}\Utilities\x (Check Blockchain Folder)"; Filename: "{win}\Explorer.exe"; Parameters: {code:BlockChainDir}
Name: "{group}\Utilities\x (Check Daemon Log)"; Filename: "Notepad"; Parameters: {code:DaemonLog}
Name: "{group}\Utilities\x (Check Default Wallet Folder)"; Filename: "{win}\Explorer.exe"; Parameters: "{userdocs}\Monero\wallets"
Name: "{group}\Utilities\x (Check GUI Wallet Log)"; Filename: "Notepad"; Parameters: "{app}\monero-wallet-gui.log"
Name: "{group}\Utilities\x (Try Daemon, Exit Confirm)"; Filename: "{app}\monero-daemon.bat"
Name: "{group}\Utilities\x (Try GUI Wallet Low Graphics Mode)"; Filename: "{app}\start-low-graphics-mode.bat"
Name: "{group}\Utilities\x (Try Kill Daemon)"; Filename: "Taskkill.exe"; Parameters: "/IM monerod.exe /T /F"
; Desktop icons, optional with the help of the "Task" section
Name: "{userdesktop}\GUI Wallet"; Filename: "{app}\monero-wallet-gui.exe"; Tasks: desktopicon
[Registry]
; Store any special flags for the daemon in the registry location where the GUI wallet will take it from
; So if the wallet is used to start the daemon instead of the separate icon the wallet will pass the correct flags
; Side effect, mostly positive: The uninstaller will clean the registry
Root: HKCU; Subkey: "Software\monero-project"; Flags: uninsdeletekeyifempty
Root: HKCU; Subkey: "Software\monero-project\monero-core"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\monero-project\monero-core"; ValueType: string; ValueName: "daemonFlags"; ValueData: {code:DaemonFlags};

View File

@@ -0,0 +1,44 @@
# Monero GUI Wallet Windows Installer #
Copyright (c) 2014-2017, The Monero Project
## Introduction ##
This is a *Inno Setup* script `Monero.iss` plus some related files
that allows you to build a standalone Windows installer (.exe) for
the GUI wallet that comes with the Helium Hydra release of Monero.
This turns the GUI wallet into a more or less standard Windows program,
by default installed into a subdirectory of `C:\Program Files`, a
program group with some icons in the *Start* menu, and automatic
uninstall support. It helps lowering the "barrier to entry"
somewhat, especially for less technically experienced users of
Monero.
As the setup script in file [Monero.iss](Monero.iss) has to list every
single file of the GUI wallet package to install by name,
this version of the script only works with exactly the GUI wallet
for Monero release *Helium Hydra* that you find on
[the official download page](https://getmonero.org/downloads/).
But of course it will be easy to modify the script for future
versions of the GUI wallet.
## License ##
See [LICENSE](LICENSE).
## Building ##
You can only build on Windows, and the result is always a
Windows .exe file that can act as a standalone installer for the
Helium Hydra GUI wallet.
The build steps in detail:
1. Install *Inno Setup*. You can get it from [here](http://www.jrsoftware.org/isdl.php)
2. Get the Inno Setup script plus related files by cloning the whole [monero-core GitHub repository](https://github.com/monero-project/monero-core); you will only need the files in the installer directory `installers\windows` however
3. The setup script is written to take the GUI wallet files from a subdirectory named `bin`; so create `installers\windows\bin`, get the zip file of the GUI wallet from [here](https://getmonero.org/downloads/), unpack it somewhere, and copy all the files and subdirectories in the `monero-gui-0.11.1.0` directory to this `bin` subdirectory
4. Start Inno Setup, load `Monero.iss` and compile it
5. The result i.e. the finished installer will be the file `mysetup.exe` in the `installers\windows\Output` subdirectory

View File

@@ -0,0 +1,181 @@
<html>
<head>
<title>Monero Helium Hydra GUI Wallet</title>
</head>
<body style="font-family: Arial, Helvetica, sans-serif">
<h1>Monero Helium Hydra GUI Wallet</h1>
<p>Copyright (c) 2014-2017, The Monero Project<br>
Date: September 19, 2017</p>
<h2>Preface</h2>
<p>This ReadMe does not aim to be a complete introduction to Monero. If you are new to Monero or even to
cryptocurrencies in general you find a good introduction on reddit at
<a href="https://www.reddit.com/r/Monero/comments/5zgail/rmonero_newcomers_please_read_everything_you_need/">Newcomers Please Read. Everything You Need To Know</a>.
You also find a lot of good tutorials on <a href="https://www.monero.how/">Monero.How</a>.
</p>
<p>Please note that Monero and its software are constantly evolving and progressing; it probably won't take
long for some of the information here to become outdated.
</p>
<h2>Content of the Package</h2>
<p>You just installed the <i>Monero GUI wallet</i> for Windows, release Helium Hydra, more exact version 0.11.1.0.
The wallet enables you to send and receive Moneroj in a secure and very private way.
</p>
<p>Also included is the <i>Monero daemon</i>, so you have everything now to run a so-called <i>full node</i>
and become part of the network of nodes that manages the Monero blockchain; you don't need to install additional
packages in order to start.</p>
<p>For checking whether there are already newer versions of this package you can go to the
<a href="https://getmonero.org/downloads/">Downloads</a> page on <a href="https://getmonero.org/home">getmonero.org</a>,
the official Monero site.</p>
<h2>Upgrading</h2>
<p>If you have already a release of the GUI wallet software on your computer that was installed with the help
of this installer (in an earlier version), upgrading is easy: Just run the new installer; there is no need to
uninstall the old Monero release first.</p>
<p>But if you run a release of the GUI wallet software that you downloaded as a .zip file and unzipped into a
folder, if you "installed it manually" so to say, don't try to upgrade by pointing the installer to that folder,
because this might lead to problems e.g. if you try to uninstall everything later.</p>
<p>It's better to let the installer put the software into another folder and then delete the old folder, either
outright or after moving away any additional files that you may have stored there. (If you did not change
default locations for wallets and the blockchain, you don't have to worry about them, they won't be in that
particular folder, but elsewhere "in safety".)</p>
<h2>Access to the Blockchain</h2>
<p>Any Monero wallet needs access to the <i>blockchain</i>, the ongoing ledger of all Monero transactions. For the
GUI wallet there are two principal ways to get that access: You can let Monero sync with the network
i.e. let it download the blockchain and store it locally on your computer, or you can configure your wallet to
access a remote <i>open node</i> to get indirect access to the blockchain.</p>
<p>Working with your own copy of the blockchain is <b>preferred</b>: It strengthens the Monero network, and it
provides the most security and privacy possible for you.</p>
<p>However if your Internet access makes it difficult to run a full node, or if you have simply no room to store
the blockchain locally (over 30 GB in fall 2017, and of course growing), you can compromise and try to connect
to a remote node. One way of finding such a node is checking
<a href="https://moneroworld.com/pages/nodes.html">this page</a>.
</p>
<h2>Initial Blockchain Download</h2>
<p>Please do read the following <b>before</b> jumping right in and starting the GUI wallet:</p>
<p>If you decide to work with your own copy of the blockchain, which you should whenever possible, you have to
download it first; it's not part of the installed package.
Beside the GUI wallet there is second program, the so-called <i>Monero daemon</i>, which will carry out that download.
You find it in the <i>Utilities</i> sub-folder of the program group.</p>
<p>Depending on your Internet access and the speed of your computer this can take
<b>several hours</b>, in some cases <b>more than a day</b>. Furthermore there are unfortunate cases where the
download gets stuck somehow or doesn't work at all, e.g. because a firewall prevents access to other nodes of the
Monero network.</p>
<p>The GUI wallet can start the daemon for you, but that way you will not see much during initial blockchain
download, especially you probably won't see any error messages in case something goes wrong. By starting the
daemon yourself "by hand" using the <i>Monero Daemon</i> icon in the <i>Utilities</i> sub-folder of the
Monero program group you will see it running and displaying messages in a separate window.</p>
<p>If all goes well the daemon will finally display a message like this:
<i>You are now synchronized with the network.</i></p>
<p><b>Then</b> you are ready for sure to start your Monero adventures by starting the GUI wallet.</p>
<h2>Allowing Other Nodes to Connect to Your Node</h2>
<p>When the Monero daemon downloads the blockchain it does so by connecting to other nodes of the network.</p>
<p>If you allow incoming TCP/IP connections to port 18080 on your computer and let your daemon run for extended
periods of time you can "return the favor" and help others in turn to get access to Monero. However, depending on
your Internet connection, firewall, modem, router, ISP etc. this might not be possible, and opening a port in such
a way usually requires some technical knowledge.</p>
<p>If you want to try you may start e.g. with
<a href="https://monero.stackexchange.com/questions/2479/how-do-i-enable-incoming-connections-eli5">this Monero Stack Exchange</a>
question.</p>
<h2>Troubleshooting</h2>
<p>The Monero software and especially the GUI wallet are "work in progress", and sometimes things go wrong.</p>
<p>Please note that despite any technical problems that you may encounter your moneroj are almost always safe: You may
not be able to move them or you even may not see how many you currently have, but you most probably won't loose any.
But do remember that the seed needed to re-create the wallet <b>is</b> critical, however: <b>Never loose your
seed!</b></p>
<p>In the <i>Utilities</i> sub-folder there are several more icons that may help you to solve problems.
These are the icons with a <i>x</i> in front and the name <i>(in parenthesis)</i> to make them visually stand
apart from the "normal" ones because you will probably only need them in case of trouble, but not during normal
usage of Monero.</p>
<p>Here an overview and short info what each icon does:</p>
<table cellpadding="3" border="1">
<tr>
<td><i>x (Try GUI Wallet Low Graphics Mode)</i></td>
<td>Run the GUI wallet in a mode that allows for low-graphics
environments, e.g. systems with very simple non-hardware-accelerated or emulated / virtualized video cards;
also try if the display is simply slow or lags
</td>
</tr>
<tr>
<td><i>x (Try Daemon, Exit Confirm)</i></td>
<td>
Run the Monero daemon in a window that does not automatically close if
the daemon should exit because of a fatal error; useful in cases where the normal daemon icon
just leads to a window that closes right away
</td>
</tr>
<tr>
<td><i>x (Try Kill Daemon)</i></td>
<td>
Kill any running daemon (technically, any process called <i>monerod.exe</i>), whether
with or without any visible window, for starting "with a clean slate"; easier than
killing such tasks with the help of the Windows Task Manager
</td>
</tr>
<tr>
<td><i>x (Check GUI Wallet Log)</i></td>
<td>Open the log with status and error messages of the GUI wallet program in Notepad;
experienced people have a chance to diagnose technical problems with the wallet,
usually by looking at the last few lines of this log</td>
</tr>
<tr>
<td><i>x (Check Daemon Log)</i></td>
<td>
Open the log with status and error messages of the daemon in Notepad; again, the last few
lines of this (possible very long) log are usually the most important for troubleshooting
</td>
</tr>
<tr>
<td><i>x (Check Default Wallet Folder)</i></td>
<td>
Open the standard wallet folder in Windows Explorer; useful e.g. if you want to backup
your wallets
</td>
</tr>
<tr>
<td><i>x (Check Blockchain Folder)</i></td>
<td>
Open the folder containing the blockchain in Windows Explorer
</td>
</tr>
</table>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@@ -0,0 +1,3 @@
REM Execute the Monero daemon and then stay with window open after it exits
"C:\Program Files\Monero Core\monerod.exe"
PAUSE

View File

@@ -0,0 +1 @@
-----

41
ios_get_libwallet.api.sh Executable file
View File

@@ -0,0 +1,41 @@
#!/bin/bash -e
if [ -z $BUILD_TYPE ]; then
BUILD_TYPE=release
fi
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ -z $BOOST_LIBRARYDIR ]; then
BOOST_LIBRARYDIR=${ROOT_DIR}/../ofxiOSBoost/build/ios/prefix/lib
fi
if [ -z $BOOST_INCLUDEDIR ]; then
BOOST_INCLUDEDIR=${ROOT_DIR}/../ofxiOSBoost/build/ios/prefix/include
fi
if [ -z $OPENSSL_INCLUDE_DIR ]; then
OPENSSL_INCLUDE_DIR=${ROOT_DIR}/../openssl/1.0.2j/include
fi
if [ -z $OPENSSL_ROOT_DIR ]; then
OPENSSL_ROOT_DIR=${ROOT_DIR}/../openssl/1.0.2j
fi
echo "Building IOS armv7"
rm -r monero/build
mkdir -p monero/build/release
pushd monero/build/release
cmake -D IOS=ON -D ARCH=armv7 -D BOOST_LIBRARYDIR=${BOOST_INCLUDEDIR} -D BOOST_INCLUDEDIR=${BOOST_INCLUDEDIR} -D OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} -D OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -D CMAKE_BUILD_TYPE=debug -D STATIC=ON -D BUILD_GUI_DEPS=ON -D INSTALL_VENDORED_LIBUNBOUND=ON -D CMAKE_INSTALL_PREFIX="/Users/jacob/crypto/monero-core/monero" ../..
make -j4 && make install
popd
echo "Building IOS arm64"
rm -r monero/build
mkdir -p monero/build/release
pushd monero/build/release
cmake -D IOS=ON -D ARCH=arm64 -D BOOST_LIBRARYDIR=${BOOST_INCLUDEDIR} -D BOOST_INCLUDEDIR=${BOOST_INCLUDEDIR} -D OPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} -D OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -D CMAKE_BUILD_TYPE=debug -D STATIC=ON -D BUILD_GUI_DEPS=ON -D INSTALL_VENDORED_LIBUNBOUND=ON -D CMAKE_INSTALL_PREFIX="/Users/jacob/crypto/monero-core/monero" ../..
make -j4 && make install
popd
echo "Creating fat library for armv7 and arm64"
pushd monero
mkdir -p lib-ios
lipo -create lib-armv7/libwallet_merged.a lib-arm64/libwallet_merged.a -output lib-ios/libwallet_merged.a
lipo -create lib-armv7/libunbound.a lib-arm64/libunbound.a -output lib-ios/libunbound.a
lipo -create lib-armv7/libepee.a lib-arm64/libepee.a -output lib-ios/libepee.a
popd

BIN
lang/flags/israel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
lang/flags/romania.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
lang/flags/south_korea.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
lang/flags/sweden.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -1,34 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<languages>
<!--
List of available languages for your wallet's seed:
0 : English
1 : Spanish
2 : German
3 : Italian
4 : Portuguese
5 : Russian
6 : Japanese
0 : Deutsch (German)
1 : English
2 : Español (Spanish)
3 : Français (French)
4 : Italiano (Italian)
5 : Nederlands (Dutch)
6 : Português (Portuguese)
7 : русский язык (Russian)
8 : 日本語 (Japanese)
9 : 简体中文 (中国) (Simplified Chinese (Mainland))
-->
<language display_name="English (US)" locale="en_US" wallet_language="English" flag="/lang/flags/usa.png" qs="none"/>
<!-- <language display_name="English (GB)" locale="en_GB" wallet_language="English" flag="/lang/flags/uk.png" qs="none"/> -->
<!-- <language display_name="English (ZA)" locale="en_SA" wallet_language="English" flag="/lang/flags/rpa.png" qs="none"/> -->
<!-- <language display_name="العربية (PS)" locale="ar_PS" wallet_language="English" flag="/lang/flags/palestine.png" qs="none"/> -->
<!-- <language display_name="Deutsch" locale="de_DE" wallet_language="German" flag="/lang/flags/german.png" qs="none"/> -->
<language display_name="Deutsch" locale="de_DE" wallet_language="Deutsch" flag="/lang/flags/german.png" qs="none"/>
<language display_name="Esperanto" locale="eo" wallet_language="English" flag="/lang/flags/esperanto.png" qs="none"/>
<!-- <language display_name="Español" locale="es_ES" wallet_language="Spanish" flag="/lang/flags/spain.png" qs="none"/> -->
<language display_name="Español" locale="es_ES" wallet_language="Español" flag="/lang/flags/spain.png" qs="none"/>
<!-- <language display_name="Suomen kieli" locale="fi" wallet_language="English" flag="/lang/flags/finland.png" qs="none"/> -->
<language display_name="Français" locale="fr_FR" wallet_language="French" flag="/lang/flags/france.png" qs="none"/>
<language display_name="Français" locale="fr_FR" wallet_language="Français" flag="/lang/flags/france.png" qs="none"/>
<language display_name="Swedish" locale="sv_SE" wallet_language="English" flag="/lang/flags/sweden.png" qs="none"/>
<!-- <language display_name="Hrvatski" locale="hr_HR" wallet_language="English" flag="/lang/flags/croatia.png" qs="none"/> -->
<!-- <language display_name="हिन्दी" locale="hi_IN" wallet_language="English" flag="/lang/flags/india.png" qs="none"/> -->
<language display_name="Bahasa Indonesia" locale="id_ID" wallet_language="English" flag="/lang/flags/indonesia.png" qs="none"/>
<language display_name="Italiano" locale="it_IT" wallet_language="Italian" flag="/lang/flags/italy.png" qs="none"/>
<language display_name="日本語" locale="ja_JP" wallet_language="Japanese" flag="/lang/flags/japan.png" qs="none"/>
<language display_name="Nederlands" locale="nl_NL" wallet_language="Dutch" flag="/lang/flags/netherlands.png" qs="none"/>
<language display_name="Italiano" locale="it_IT" wallet_language="Italiano" flag="/lang/flags/italy.png" qs="none"/>
<language display_name="日本語" locale="ja_JP" wallet_language="日本語" flag="/lang/flags/japan.png" qs="none"/>
<language display_name="Nederlands" locale="nl_NL" wallet_language="Nederlands" flag="/lang/flags/netherlands.png" qs="none"/>
<!-- <language display_name="Polski" locale="pl_PL" wallet_language="English" flag="/lang/flags/poland.png" qs="none"/> -->
<language display_name="Português (BR)" locale="pt-br_BR" wallet_language="Portuguese" flag="/lang/flags/brazil.png" qs="none"/>
<!-- <language display_name="русский язык" locale="ru_RU" wallet_language="Russian" flag="/lang/flags/russia.png" qs="none"/> -->
<language display_name="简体中文 (中国)" locale="zh-cn_CN" wallet_language="English" flag="/lang/flags/china.png" qs="none"/>
<language display_name="Português (BR)" locale="pt-br_BR" wallet_language="Português" flag="/lang/flags/brazil.png" qs="none"/>
<language display_name="Русский язык" locale="ru_RU" wallet_language="русский язык" flag="/lang/flags/russia.png" qs="none"/>
<language display_name="简体中文 (中国)" locale="zh-cn_CN" wallet_language="简体中文 (中国)" flag="/lang/flags/china.png" qs="none"/>
<language display_name="繁體中文 (台灣)" locale="zh-tw_CN" wallet_language="English" flag="/lang/flags/taiwan.png" qs="none"/>
<language display_name="עברית" locale="he_HE" wallet_language="English" flag="/lang/flags/israel.png" qs="none"/>
<language display_name="한국어" locale="ko_KO" wallet_language="English" flag="/lang/flags/south_korea.png" qs="none"/>
<language display_name="Română" locale="ro_RO" wallet_language="English" flag="/lang/flags/romania.png" qs="none"/>
</languages>

View File

@@ -46,7 +46,9 @@ cat > $TARGET/start-gui.sh <<EOL
export LD_LIBRARY_PATH=\`pwd\`/libs
export QT_PLUGIN_PATH=\`pwd\`/plugins
export QML2_IMPORT_PATH=\`pwd\`/qml
./$GUI_EXEC
# make it so that it can be called from anywhere and also through soft links
SCRIPT_DIR="\$(dirname "\$(test -L "\${BASH_SOURCE[0]}" && readlink "\${BASH_SOURCE[0]}" || echo "\${BASH_SOURCE[0]}")")"
"\$SCRIPT_DIR"/$GUI_EXEC
EOL
chmod +x $TARGET/start-gui.sh
chmod +x $TARGET/start-gui.sh

View File

@@ -68,15 +68,15 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt
int main(int argc, char *argv[])
{
// Enable high DPI scaling on windows & linux
#if !defined(Q_OS_ANDROID) && QT_VERSION >= 0x050600
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
qDebug() << "High DPI auto scaling - enabled";
#endif
// // Enable high DPI scaling on windows & linux
//#if !defined(Q_OS_ANDROID) && QT_VERSION >= 0x050600
// QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
// qDebug() << "High DPI auto scaling - enabled";
//#endif
// Log settings
Monero::Wallet::init(argv[0], "monero-wallet-gui");
qInstallMessageHandler(messageHandler);
// qInstallMessageHandler(messageHandler);
MainApp app(argc, argv);

304
main.qml
View File

@@ -42,7 +42,7 @@ import "wizard"
ApplicationWindow {
id: appWindow
title: "Monero"
property var currentItem
property bool whatIsEnable: false
@@ -211,6 +211,8 @@ ApplicationWindow {
delete wizard.settings['wallet']
} else {
var wallet_path = walletPath();
if(isIOS)
wallet_path = moneroAccountsDir + wallet_path;
// console.log("opening wallet at: ", wallet_path, "with password: ", appWindow.password);
console.log("opening wallet at: ", wallet_path, ", testnet: ", persistentSettings.testnet);
walletManager.openWalletAsync(wallet_path, appWindow.password,
@@ -235,7 +237,11 @@ ApplicationWindow {
middlePanel.checkPaymentClicked.disconnect(handleCheckPayment);
}
currentWallet = undefined;
walletManager.closeWalletAsync();
if (isIOS) {
console.log("closing sync - ios")
walletManager.closeWallet();
} else
walletManager.closeWalletAsync();
}
function connectWallet(wallet) {
@@ -245,6 +251,12 @@ ApplicationWindow {
viewOnly = currentWallet.viewOnly;
// New wallets saves the testnet flag in keys file.
if(persistentSettings.testnet != currentWallet.testnet) {
console.log("Using testnet flag from keys file")
persistentSettings.testnet = currentWallet.testnet;
}
// connect handlers
currentWallet.refreshed.connect(onWalletRefresh)
currentWallet.updated.connect(onWalletUpdate)
@@ -290,7 +302,7 @@ ApplicationWindow {
middlePanel.transferView.updatePriorityDropdown();
// If wallet isnt connected and no daemon is running - Ask
if(!walletInitialized && status === Wallet.ConnectionStatus_Disconnected && !daemonManager.running(persistentSettings.testnet)){
if(isDaemonLocal() && !walletInitialized && status === Wallet.ConnectionStatus_Disconnected && !daemonManager.running(persistentSettings.testnet)){
daemonManagerDialog.open();
}
// initialize transaction history once wallet is initialized first time;
@@ -399,7 +411,7 @@ ApplicationWindow {
currentWallet.pauseRefresh();
appWindow.showProcessingSplash(qsTr("Waiting for daemon to start..."))
daemonManager.start(flags, persistentSettings.testnet);
daemonManager.start(flags, persistentSettings.testnet, persistentSettings.blockchainDataDir);
persistentSettings.daemonFlags = flags
}
@@ -467,7 +479,10 @@ ApplicationWindow {
function walletsFound() {
if (persistentSettings.wallet_path.length > 0) {
return walletManager.walletExists(persistentSettings.wallet_path);
if(isIOS)
return walletManager.walletExists(moneroAccountsDir + persistentSettings.wallet_path);
else
return walletManager.walletExists(persistentSettings.wallet_path);
}
return false;
}
@@ -491,7 +506,7 @@ ApplicationWindow {
currentWallet.disposeTransaction(transaction);
} else if (transaction.txCount == 0) {
informationPopup.title = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
informationPopup.title = qsTr("Error") + translationManager.emptyString
informationPopup.text = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
informationPopup.icon = StandardIcon.Information
informationPopup.onCloseCallback = null
@@ -604,7 +619,7 @@ ApplicationWindow {
currentWallet.disposeTransaction(transaction);
} else if (transaction.txCount == 0) {
informationPopup.title = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
informationPopup.title = qsTr("Error") + translationManager.emptyString
informationPopup.text = qsTr("No unmixable outputs to sweep") + translationManager.emptyString
informationPopup.icon = StandardIcon.Information
informationPopup.onCloseCallback = null
@@ -769,10 +784,21 @@ ApplicationWindow {
leftPanel.balanceText = leftPanel.unlockedBalanceText = walletManager.displayAmount(0);
}
function hideMenu() {
goToBasicAnimation.start();
console.log(appWindow.width)
}
function showMenu() {
goToProAnimation.start();
console.log(appWindow.width)
}
objectName: "appWindow"
visible: true
width: rightPanelExpanded ? 1269 : 1269 - 300
height: maxWindowHeight;
// width: Screen.width //rightPanelExpanded ? 1269 : 1269 - 300
// height: 900 //300//maxWindowHeight;
color: "#FFFFFF"
flags: persistentSettings.customDecorations ? (Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint) : (Qt.WindowSystemMenuHint | Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint | Qt.WindowMaximizeButtonHint)
onWidthChanged: x -= 0
@@ -801,10 +827,15 @@ ApplicationWindow {
//
walletManager.walletOpened.connect(onWalletOpened);
walletManager.walletClosed.connect(onWalletClosed);
walletManager.checkUpdatesComplete.connect(onWalletCheckUpdatesComplete);
if(typeof daemonManager != "undefined") {
daemonManager.daemonStarted.connect(onDaemonStarted);
daemonManager.daemonStartFailure.connect(onDaemonStartFailure);
daemonManager.daemonStopped.connect(onDaemonStopped);
}
daemonManager.daemonStarted.connect(onDaemonStarted);
daemonManager.daemonStartFailure.connect(onDaemonStartFailure);
daemonManager.daemonStopped.connect(onDaemonStopped);
// Connect app exit to qml window exit handling
mainApp.closing.connect(appWindow.close);
@@ -849,7 +880,7 @@ ApplicationWindow {
property bool allow_background_mining : false
property bool miningIgnoreBattery : true
property bool testnet: false
property string daemon_address: "localhost:18081"
property string daemon_address: testnet ? "localhost:28081" : "localhost:18081"
property string payment_id
property int restore_height : 0
property bool is_recovering : false
@@ -860,6 +891,7 @@ ApplicationWindow {
property string daemonUsername: ""
property string daemonPassword: ""
property bool transferShowAdvanced: false
property string blockchainDataDir: ""
}
// Information dialog
@@ -880,13 +912,25 @@ ApplicationWindow {
id: transactionConfirmationPopup
onAccepted: {
close();
// Save transaction to file if view only wallet
if(viewOnly) {
saveTxDialog.open();
return;
} else
handleTransactionConfirmed()
transactionConfirmationPasswordDialog.onAcceptedCallback = function() {
if(appWindow.password === transactionConfirmationPasswordDialog.password){
// Save transaction to file if view only wallet
if(viewOnly) {
saveTxDialog.open();
} else {
handleTransactionConfirmed()
}
} else {
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Wrong password");
informationPopup.open()
informationPopup.onCloseCallback = function() {
transactionConfirmationPasswordDialog.open()
}
}
transactionConfirmationPasswordDialog.password = ""
}
transactionConfirmationPasswordDialog.open()
}
}
@@ -936,6 +980,15 @@ ApplicationWindow {
}
PasswordDialog {
id: transactionConfirmationPasswordDialog
property var onAcceptedCallback
onAccepted: {
if (onAcceptedCallback())
onAcceptedCallback();
}
}
DaemonManagerDialog {
id: daemonManagerDialog
onRejected: {
@@ -967,53 +1020,60 @@ ApplicationWindow {
PropertyChanges { target: middlePanel; visible: false }
PropertyChanges { target: titleBar; basicButtonVisible: false }
PropertyChanges { target: wizard; visible: true }
PropertyChanges { target: appWindow; width: 930; }
PropertyChanges { target: appWindow; height: 650; }
PropertyChanges { target: appWindow; width: (Screen.width < 930)? Screen.width : 930; }
PropertyChanges { target: appWindow; height: maxWindowHeight; }
PropertyChanges { target: resizeArea; visible: false }
PropertyChanges { target: titleBar; maximizeButtonVisible: false }
PropertyChanges { target: frameArea; blocked: true }
// PropertyChanges { target: frameArea; blocked: true }
PropertyChanges { target: titleBar; visible: false }
PropertyChanges { target: titleBar; y: 0 }
PropertyChanges { target: titleBar; title: qsTr("Program setup wizard") + translationManager.emptyString }
}, State {
name: "normal"
PropertyChanges { target: leftPanel; visible: true }
PropertyChanges { target: leftPanel; visible: (isMobile)? false : true }
PropertyChanges { target: rightPanel; visible: true }
PropertyChanges { target: middlePanel; visible: true }
PropertyChanges { target: titleBar; basicButtonVisible: true }
PropertyChanges { target: wizard; visible: false }
PropertyChanges { target: appWindow; width: rightPanelExpanded ? 1269 : 1269 - 300; }
PropertyChanges { target: appWindow; width: (Screen.width < 969)? Screen.width : 969 } //rightPanelExpanded ? 1269 : 1269 - 300;
PropertyChanges { target: appWindow; height: maxWindowHeight; }
PropertyChanges { target: resizeArea; visible: true }
PropertyChanges { target: titleBar; maximizeButtonVisible: true }
PropertyChanges { target: frameArea; blocked: false }
// PropertyChanges { target: frameArea; blocked: true }
PropertyChanges { target: titleBar; visible: true }
PropertyChanges { target: titleBar; y: 0 }
// PropertyChanges { target: titleBar; y: 0 }
PropertyChanges { target: titleBar; title: qsTr("Monero") + translationManager.emptyString }
}
]
MobileHeader {
id: mobileHeader
visible: isMobile
anchors.left: parent.left
anchors.right: parent.right
height: visible? 65 : 0
}
LeftPanel {
id: leftPanel
anchors.top: mobileHeader.bottom
anchors.left: parent.left
anchors.bottom: parent.bottom
height: parent.height
onDashboardClicked: middlePanel.state = "Dashboard"
onTransferClicked: middlePanel.state = "Transfer"
onReceiveClicked: middlePanel.state = "Receive"
onTxkeyClicked: middlePanel.state = "TxKey"
onHistoryClicked: middlePanel.state = "History"
onAddressBookClicked: middlePanel.state = "AddressBook"
onMiningClicked: middlePanel.state = "Mining"
onSignClicked: middlePanel.state = "Sign"
onSettingsClicked: middlePanel.state = "Settings"
onDashboardClicked: {middlePanel.state = "Dashboard"; if(isMobile) hideMenu()}
onTransferClicked: {middlePanel.state = "Transfer"; if(isMobile) hideMenu()}
onReceiveClicked: {middlePanel.state = "Receive"; if(isMobile) hideMenu()}
onTxkeyClicked: {middlePanel.state = "TxKey"; if(isMobile) hideMenu()}
onHistoryClicked: {middlePanel.state = "History"; if(isMobile) hideMenu()}
onAddressBookClicked: {middlePanel.state = "AddressBook"; if(isMobile) hideMenu()}
onMiningClicked: {middlePanel.state = "Mining"; if(isMobile) hideMenu()}
onSignClicked: {middlePanel.state = "Sign"; if(isMobile) hideMenu()}
onSettingsClicked: {middlePanel.state = "Settings"; if(isMobile) hideMenu()}
}
RightPanel {
id: rightPanel
anchors.right: parent.right
anchors.bottom: parent.bottom
height: parent.height
width: appWindow.rightPanelExpanded ? 300 : 0
visible: appWindow.rightPanelExpanded
}
@@ -1021,10 +1081,10 @@ ApplicationWindow {
MiddlePanel {
id: middlePanel
anchors.top: mobileHeader.bottom
anchors.bottom: parent.bottom
anchors.left: leftPanel.visible ? leftPanel.right : parent.left
anchors.right: rightPanel.left
height: parent.height
anchors.right: parent.right
state: "Transfer"
}
@@ -1034,54 +1094,54 @@ ApplicationWindow {
visible: false
}
MouseArea {
id: frameArea
property bool blocked: false
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
height: 30
z: 1
hoverEnabled: true
propagateComposedEvents: true
onPressed: mouse.accepted = false
onReleased: mouse.accepted = false
onMouseXChanged: titleBar.mouseX = mouseX
onContainsMouseChanged: titleBar.containsMouse = containsMouse
}
// MouseArea {
// id: frameArea
// property bool blocked: false
// anchors.top: parent.top
// anchors.left: parent.left
// anchors.right: parent.right
// height: 30
// z: 1
// hoverEnabled: true
// propagateComposedEvents: true
// onPressed: mouse.accepted = false
// onReleased: mouse.accepted = false
// onMouseXChanged: titleBar.mouseX = mouseX
// onContainsMouseChanged: titleBar.containsMouse = containsMouse
// }
SequentialAnimation {
id: goToBasicAnimation
PropertyAction {
target: appWindow
properties: "visibility"
value: Window.Windowed
}
PropertyAction {
target: titleBar
properties: "maximizeButtonVisible"
value: false
}
PropertyAction {
target: frameArea
properties: "blocked"
value: true
}
// PropertyAction {
// target: appWindow
// properties: "visibility"
// value: Window.Windowed
// }
// PropertyAction {
// target: titleBar
// properties: "maximizeButtonVisible"
// value: false
// }
// PropertyAction {
// target: frameArea
// properties: "blocked"
// value: true
// }
PropertyAction {
target: resizeArea
properties: "visible"
value: false
}
PropertyAction {
target: appWindow
properties: "height"
value: 30
}
PropertyAction {
target: appWindow
properties: "width"
value: 470
value: true
}
// PropertyAction {
// target: appWindow
// properties: "height"
// value: 30
// }
// PropertyAction {
// target: appWindow
// properties: "width"
// value: 326
// }
PropertyAction {
targets: [leftPanel, rightPanel]
properties: "visible"
@@ -1093,11 +1153,11 @@ ApplicationWindow {
value: true
}
PropertyAction {
target: appWindow
properties: "height"
value: middlePanel.height
}
// PropertyAction {
// target: appWindow
// properties: "height"
// value: middlePanel.height
// }
onStopped: {
// middlePanel.visible = false
@@ -1108,11 +1168,11 @@ ApplicationWindow {
SequentialAnimation {
id: goToProAnimation
PropertyAction {
target: appWindow
properties: "height"
value: 30
}
// PropertyAction {
// target: appWindow
// properties: "height"
// value: 30
// }
PropertyAction {
target: middlePanel
properties: "basicMode"
@@ -1123,26 +1183,26 @@ ApplicationWindow {
properties: "visible"
value: true
}
PropertyAction {
target: appWindow
properties: "width"
value: rightPanelExpanded ? 1269 : 1269 - 300
}
PropertyAction {
target: appWindow
properties: "height"
value: maxWindowHeight
}
PropertyAction {
target: frameArea
properties: "blocked"
value: false
}
PropertyAction {
target: titleBar
properties: "maximizeButtonVisible"
value: true
}
// PropertyAction {
// target: appWindow
// properties: "width"
// value: rightPanelExpanded ? 1269 : 1269 - 300
// }
// PropertyAction {
// target: appWindow
// properties: "height"
// value: maxWindowHeight
// }
// PropertyAction {
// target: frameArea
// properties: "blocked"
// value: false
// }
// PropertyAction {
// target: titleBar
// properties: "maximizeButtonVisible"
// value: true
// }
}
WizardMain {
@@ -1159,7 +1219,7 @@ ApplicationWindow {
}
property int minWidth: 326
property int minHeight: 720
property int minHeight: 400
MouseArea {
id: resizeArea
hoverEnabled: true
@@ -1270,6 +1330,7 @@ ApplicationWindow {
}
Notifier {
visible:false
id: notifier
}
}
@@ -1277,7 +1338,7 @@ ApplicationWindow {
onClosing: {
// If daemon is running - prompt user before exiting
if(typeof daemonManager != undefined && daemonManager.running(persistentSettings.testnet)) {
if(typeof daemonManager != "undefined" && daemonManager.running(persistentSettings.testnet)) {
close.accepted = false;
// Show confirmation dialog
@@ -1308,8 +1369,7 @@ ApplicationWindow {
Qt.quit();
}
function checkUpdates() {
var update = walletManager.checkUpdates("monero-gui", "gui")
function onWalletCheckUpdatesComplete(update) {
if (update === "")
return
print("Update found: " + update)
@@ -1327,10 +1387,24 @@ ApplicationWindow {
}
}
function checkUpdates() {
walletManager.checkUpdatesAsync("monero-gui", "gui")
}
Timer {
id: updatesTimer
interval: 3600*1000; running: true; repeat: true
onTriggered: checkUpdates()
}
function isDaemonLocal() {
var daemonAddress = appWindow.persistentSettings.daemon_address
if (daemonAddress === "")
return false
var daemonHost = daemonAddress.split(":")[0]
if (daemonHost === "127.0.0.1" || daemonHost === "localhost")
return true
return false
}
}

2
monero

Submodule monero updated: c9063c0b8f...ab594cfee9

View File

@@ -79,20 +79,23 @@ SOURCES = *.qml \
ios:armv7 {
message("target is armv7")
LIBS += \
-L$$PWD/ofxiOSBoost/build/libs/boost/lib/armv7 \
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/armv7 \
}
ios:arm64 {
message("target is arm64")
LIBS += \
-L$$PWD/ofxiOSBoost/build/libs/boost/lib/arm64 \
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/arm64 \
}
!ios {
LIBS += -L$$WALLET_ROOT/lib \
-lwallet_merged \
-lepee \
-lunbound
-lunbound \
-leasylogging \
-lreadline \
}
ios {
message("Host is IOS")
@@ -105,7 +108,8 @@ ios {
-lunbound
LIBS+= \
-L$$PWD/OpenSSL-for-iPhone/lib \
-L$$PWD/../OpenSSL-for-iPhone/lib \
-L$$PWD/../ofxiOSBoost/build/libs/boost/lib/arm64 \
-lboost_serialization \
-lboost_thread \
-lboost_system \
@@ -279,6 +283,7 @@ macx {
# translation stuff
TRANSLATIONS = \ # English is default language, no explicit translation file
$$PWD/translations/monero-core.ts \ # translation source (copy this file when creating a new translation)
$$PWD/translations/monero-core_ar.ts \ # Arabic
$$PWD/translations/monero-core_pt-br.ts \ # Portuguese (Brazil)
$$PWD/translations/monero-core_de.ts \ # German
@@ -294,8 +299,12 @@ TRANSLATIONS = \ # English is default language, no explicit translation file
$$PWD/translations/monero-core_nl.ts \ # Dutch
$$PWD/translations/monero-core_pl.ts \ # Polish
$$PWD/translations/monero-core_ru.ts \ # Russian
$$PWD/translations/monero-core_sv.ts \ # Swedish
$$PWD/translations/monero-core_zh-cn.ts \ # Chinese (Simplified-China)
$$PWD/translations/monero-core_zh-tw.ts \ # Chinese (Traditional-Taiwan)
$$PWD/translations/monero-core_he.ts \ # Hebrew
$$PWD/translations/monero-core_ko.ts \ # Korean
$$PWD/translations/monero-core_ro.ts \ # Romanian
CONFIG(release, debug|release) {
DESTDIR = release/bin
@@ -357,6 +366,7 @@ macx {
PRE_TARGETDEPS += langupd compiler_langrel_make_all
RESOURCES += qml.qrc
CONFIG += qtquickcompiler
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
@@ -390,7 +400,8 @@ OTHER_FILES += \
DISTFILES += \
notes.txt \
monero/src/wallet/CMakeLists.txt
monero/src/wallet/CMakeLists.txt \
components/MobileHeader.qml
# windows application icon

View File

@@ -60,7 +60,6 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("Address") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
StandardButton {
@@ -102,8 +101,6 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("Payment ID <font size='2'>(Optional)</font>") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Payment ID</b><br/><br/>A unique user name used in<br/>the address book. It is not a<br/>transfer of information sent<br/>during the transfer")
+ translationManager.emptyString
}
LineEdit {
@@ -125,7 +122,6 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("Description <font size='2'>(Optional)</font>") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip test test</b><br/><br/>test line 2") + translationManager.emptyString
}
LineEdit {

View File

@@ -120,6 +120,7 @@ Rectangle {
Text {
visible: !isMobile
id: filterHeaderText
anchors.left: parent.left
anchors.right: parent.right
@@ -135,6 +136,7 @@ Rectangle {
}
Label {
visible: !isMobile
id: selectedAmount
anchors.right: parent.right
anchors.top: parent.top
@@ -142,7 +144,6 @@ Rectangle {
anchors.topMargin: 17
text: getSelectedAmount()
fontSize: 14
tipText: qsTr("<b>Total amount of selected payments</b>") + translationManager.emptyString
}
@@ -156,7 +157,6 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("Address")
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
LineEdit {
@@ -172,6 +172,7 @@ Rectangle {
// Filter by string
LineEdit {
visible: !isMobile
id: searchLine
anchors.left: parent.left
anchors.right: parent.right
@@ -196,7 +197,6 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("Description <font size='2'>(Local database)</font>") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b><br/><br/>test line 2") + translationManager.emptyString
}
LineEdit {
@@ -213,6 +213,7 @@ Rectangle {
// DateFrom picker
Label {
visible: !isMobile
id: dateFromText
anchors.left: parent.left
anchors.top: searchLine.bottom // descriptionLine.bottom
@@ -221,10 +222,10 @@ Rectangle {
width: 156
text: qsTr("Date from") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
DatePicker {
visible: !isMobile
id: fromDatePicker
anchors.left: parent.left
anchors.top: dateFromText.bottom
@@ -239,6 +240,7 @@ Rectangle {
// DateTo picker
Label {
visible: !isMobile
id: dateToText
anchors.left: dateFromText.right
anchors.top: searchLine.bottom //descriptionLine.bottom
@@ -246,10 +248,10 @@ Rectangle {
anchors.topMargin: 17
text: qsTr("To") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
DatePicker {
visible: !isMobile
id: toDatePicker
anchors.left: fromDatePicker.right
anchors.top: dateToText.bottom
@@ -265,6 +267,7 @@ Rectangle {
StandardButton {
visible: !isMobile
id: filterButton
anchors.bottom: toDatePicker.bottom
anchors.left: toDatePicker.right
@@ -306,6 +309,7 @@ Rectangle {
}
CheckBox {
visible: !isMobile
id: advancedFilteringCheckBox
text: qsTr("Advanced filtering") + translationManager.emptyString
anchors.left: filterButton.right
@@ -320,6 +324,7 @@ Rectangle {
}
Label {
visible: !isMobile
id: transactionTypeText
anchors.left: parent.left
anchors.top: fromDatePicker.bottom
@@ -328,7 +333,6 @@ Rectangle {
width: 156
text: qsTr("Type of transaction") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
ListModel {
@@ -340,6 +344,7 @@ Rectangle {
}
StandardDropdown {
visible: !isMobile
id: transactionTypeDropdown
anchors.left: parent.left
anchors.top: transactionTypeText.bottom
@@ -355,6 +360,7 @@ Rectangle {
}
Label {
visible: !isMobile
id: amountFromText
anchors.left: transactionTypeText.right
anchors.top: fromDatePicker.bottom
@@ -363,10 +369,10 @@ Rectangle {
width: 156
text: qsTr("Amount from") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
LineEdit {
visible: !isMobile
id: amountFromLine
anchors.left: transactionTypeDropdown.right
anchors.top: amountFromText.bottom
@@ -387,6 +393,7 @@ Rectangle {
}
Label {
visible: !isMobile
id: amountToText
anchors.left: amountFromText.right
anchors.top: fromDatePicker.bottom
@@ -395,10 +402,10 @@ Rectangle {
width: 156
text: qsTr("To") + translationManager.emptyString
fontSize: 14
tipText: qsTr("<b>Tip tekst test</b>") + translationManager.emptyString
}
LineEdit {
visible: !isMobile
id: amountToLine
anchors.left: amountFromLine.right
anchors.top: amountToText.bottom
@@ -420,6 +427,7 @@ Rectangle {
}
Item {
visible: !isMobile
id: expandItem
property bool expanded: false
@@ -449,16 +457,17 @@ Rectangle {
Rectangle {
id: tableRect
property int expandedHeight: parent.height - filterHeaderText.y - filterHeaderText.height - 17
property int expandedHeight: parent.height - filterHeaderText.y - filterHeaderText.height - 5
property int middleHeight: parent.height - fromDatePicker.y - fromDatePicker.height - 17
property int collapsedHeight: parent.height - transactionTypeDropdown.y - transactionTypeDropdown.height - 17
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
// anchors.top: parent.top
color: "#FFFFFF"
z: 1
height: middleHeight
height: (isMobile)? parent.height : middleHeight
onHeightChanged: {
if(height === middleHeight) z = 1
else if(height === collapsedHeight) z = 0

View File

@@ -37,22 +37,10 @@ Rectangle {
color: "#F0EEEE"
property var currentHashRate: 0
function isDaemonLocal() {
var daemonAddress = appWindow.persistentSettings.daemon_address
if (daemonAddress === "")
return false
var daemonHost = daemonAddress.split(":")[0]
if (daemonHost === "127.0.0.1" || daemonHost === "localhost")
return true
return false
}
/* main layout */
ColumnLayout {
id: mainLayout
anchors.margins: 40
anchors.bottomMargin: 10
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
@@ -107,8 +95,6 @@ Rectangle {
}
RowLayout {
// Disable this option until stable
visible: false
Layout.leftMargin: 125
CheckBox {
id: backgroundMining
@@ -190,7 +176,6 @@ Rectangle {
Text {
id: statusText
anchors.topMargin: 17
text: qsTr("Status: not mining")
textFormat: Text.RichText
wrapMode: Text.Wrap

View File

@@ -168,8 +168,9 @@ Rectangle {
/* main layout */
ColumnLayout {
id: mainLayout
anchors.margins: 17
anchors.margins: (isMobile)? 17 : 40
anchors.topMargin: 40
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
@@ -181,9 +182,8 @@ Rectangle {
property int qrCodeSize: 240
RowLayout {
ColumnLayout {
id: addressRow
Label {
id: addressLabel
fontSize: 14
@@ -204,6 +204,7 @@ Rectangle {
imageSource: "../images/copyToClipboard.png"
onClicked: {
if (addressLine.text.length > 0) {
console.log(addressLine.text + " copied to clipboard")
clipboard.setText(addressLine.text)
}
}
@@ -211,9 +212,11 @@ Rectangle {
}
}
RowLayout {
GridLayout {
id: paymentIdRow
columns:2
Label {
Layout.columnSpan: 2
id: paymentIdLabel
fontSize: 14
text: qsTr("Payment ID") + translationManager.emptyString
@@ -264,8 +267,8 @@ Rectangle {
onClicked: updatePaymentId("")
}
}
RowLayout {
ColumnLayout {
id: integratedAddressRow
Label {
id: integratedAddressLabel
@@ -298,7 +301,7 @@ Rectangle {
}
}
RowLayout {
ColumnLayout {
id: amountRow
Label {
id: amountLabel

View File

@@ -40,6 +40,7 @@ import moneroComponents.Clipboard 1.0
Rectangle {
property var daemonAddress
property bool viewOnly: false
id: page
color: "#F0EEEE"
@@ -54,10 +55,9 @@ Rectangle {
// try connecting to daemon
}
ColumnLayout {
id: mainLayout
anchors.margins: 40
anchors.margins: 17
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
@@ -81,7 +81,8 @@ Rectangle {
color: "#DEDEDE"
}
RowLayout {
GridLayout {
columns: (isMobile)? 2 : 4
StandardButton {
id: closeWalletButton
text: qsTr("Close wallet") + translationManager.emptyString
@@ -116,11 +117,71 @@ Rectangle {
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Show seed") + translationManager.emptyString
text: qsTr("Show seed & keys") + translationManager.emptyString
onClicked: {
settingsPasswordDialog.open();
}
}
/* Rescan cache - Disabled until we know it's needed
StandardButton {
id: rescanWalletbutton
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
text: qsTr("Rescan wallet cache") + translationManager.emptyString
onClicked: {
// Show confirmation dialog
confirmationDialog.title = qsTr("Rescan wallet cache") + translationManager.emptyString;
confirmationDialog.text = qsTr("Are you sure you want to rebuild the wallet cache?\n"
+ "The following information will be deleted\n"
+ "- Recipient addresses\n"
+ "- Tx keys\n"
+ "- Tx descriptions\n\n"
+ "The old wallet cache file will be renamed and can be restored later.\n"
);
confirmationDialog.icon = StandardIcon.Question
confirmationDialog.cancelText = qsTr("Cancel")
confirmationDialog.onAcceptedCallback = function() {
walletManager.closeWallet();
walletManager.clearWalletCache(persistentSettings.wallet_path);
walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.password,
persistentSettings.testnet);
}
confirmationDialog.onRejectedCallback = null;
confirmationDialog.open()
}
}
*/
StandardButton {
id: rescanSpentButton
text: qsTr("Rescan wallet balance") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: {
if (!currentWallet.rescanSpent()) {
console.error("Error: ", currentWallet.errorString);
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
informationPopup.icon = StandardIcon.Critical
informationPopup.onCloseCallback = null
informationPopup.open();
} else {
informationPopup.title = qsTr("Information") + translationManager.emptyString
informationPopup.text = qsTr("Sucessfully rescanned spent outputs") + translationManager.emptyString
informationPopup.icon = StandardIcon.Information
informationPopup.onCloseCallback = null
informationPopup.open();
}
}
}
}
//! Manage daemon
@@ -141,10 +202,9 @@ Rectangle {
color: "#DEDEDE"
}
RowLayout {
GridLayout {
id: daemonStatusRow
Layout.fillWidth: true
columns: (isMobile) ? 2 : 4
StandardButton {
visible: true
enabled: !appWindow.daemonRunning
@@ -187,8 +247,35 @@ Rectangle {
}
}
}
RowLayout {
id: blockchainFolderRow
Label {
id: blockchainFolderLabel
color: "#4A4949"
text: qsTr("Blockchain location") + translationManager.emptyString
fontSize: 16
}
LineEdit {
id: blockchainFolder
Layout.preferredWidth: 200
Layout.fillWidth: true
text: persistentSettings.blockchainDataDir
placeholderText: qsTr("(optional)") + translationManager.emptyString
MouseArea {
anchors.fill: parent
onClicked: {
mouse.accepted = false
if(persistentSettings.blockchainDataDir != "")
blockchainFileDialog.folder = "file://" + persistentSettings.blockchainDataDir
blockchainFileDialog.open()
blockchainFolder.focus = true
}
}
}
}
RowLayout {
@@ -209,22 +296,27 @@ Rectangle {
}
RowLayout {
id: daemonAddrRow
Layout.fillWidth: true
spacing: 10
Label {
id: daemonAddrLabel
Layout.fillWidth: true
color: "#4A4949"
text: qsTr("Daemon address") + translationManager.emptyString
fontSize: 16
}
}
GridLayout {
id: daemonAddrRow
Layout.fillWidth: true
columnSpacing: 10
columns: (isMobile) ? 2 : 3
LineEdit {
id: daemonAddr
Layout.preferredWidth: 200
Layout.preferredWidth: 100
Layout.fillWidth: true
text: (daemonAddress !== undefined) ? daemonAddress[0] : ""
placeholderText: qsTr("Hostname / IP") + translationManager.emptyString
@@ -241,7 +333,8 @@ Rectangle {
}
RowLayout {
Layout.fillWidth: true
spacing: 10
Label {
id: daemonLoginLabel
Layout.fillWidth: true
@@ -250,6 +343,10 @@ Rectangle {
fontSize: 16
}
}
RowLayout {
LineEdit {
id: daemonUsername
Layout.preferredWidth: 100
@@ -277,7 +374,6 @@ Rectangle {
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
visible: true
onClicked: {
console.log("saving daemon adress settings")
var newDaemon = daemonAddr.text.trim() + ":" + daemonPort.text.trim()
@@ -323,14 +419,22 @@ Rectangle {
}
// Log level
RowLayout {
Label {
id: logLevelLabel
color: "#4A4949"
text: qsTr("Log level") + translationManager.emptyString
fontSize: 16
anchors.topMargin: 30
Layout.topMargin: 30
}
}
Rectangle {
Layout.fillWidth: true
height: 1
color: "#DEDEDE"
}
ColumnLayout {
ComboBox {
id: logLevel
model: [0,1,2,3,4,"custom"]
@@ -369,7 +473,7 @@ Rectangle {
RowLayout {
Label {
color: "#4A4949"
text: qsTr("Version") + translationManager.emptyString
text: qsTr("Debug info") + translationManager.emptyString
fontSize: 16
anchors.topMargin: 30
Layout.topMargin: 30
@@ -381,19 +485,95 @@ Rectangle {
color: "#DEDEDE"
}
Label {
id: guiVersion
TextBlock {
Layout.topMargin: 8
color: "#4A4949"
Layout.fillWidth: true
text: qsTr("GUI version: ") + Version.GUI_VERSION + translationManager.emptyString
fontSize: 16
}
Label {
TextBlock {
id: guiMoneroVersion
color: "#4A4949"
Layout.fillWidth: true
text: qsTr("Embedded Monero version: ") + Version.GUI_MONERO_VERSION + translationManager.emptyString
fontSize: 16
}
TextBlock {
id: restoreHeightText
Layout.fillWidth: true
textFormat: Text.RichText
property var txt: "<style type='text/css'>a {text-decoration: none; color: #FF6C3C}</style>" + qsTr("Wallet creation height: ") + currentWallet.walletCreationHeight + translationManager.emptyString
property var linkTxt: qsTr(" <a href='#'>(Click to change)</a>") + translationManager.emptyString
text: (typeof currentWallet == "undefined") ? "" : txt + linkTxt
onLinkActivated: {
restoreHeightRow.visible = true;
}
}
RowLayout {
id: restoreHeightRow
visible: false
LineEdit {
id: restoreHeight
Layout.preferredWidth: 80
Layout.fillWidth: true
text: currentWallet.walletCreationHeight
validator: IntValidator {
bottom:0
}
}
StandardButton {
id: restoreHeightSave
Layout.fillWidth: false
Layout.leftMargin: 30
text: qsTr("Save") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
onClicked: {
currentWallet.walletCreationHeight = restoreHeight.text
// Restore height is saved in .keys file. Set password to trigger rewrite.
currentWallet.setPassword(appWindow.password)
restoreHeightRow.visible = false
// Show confirmation dialog
confirmationDialog.title = qsTr("Rescan wallet cache") + translationManager.emptyString;
confirmationDialog.text = qsTr("Are you sure you want to rebuild the wallet cache?\n"
+ "The following information will be deleted\n"
+ "- Recipient addresses\n"
+ "- Tx keys\n"
+ "- Tx descriptions\n\n"
+ "The old wallet cache file will be renamed and can be restored later.\n"
);
confirmationDialog.icon = StandardIcon.Question
confirmationDialog.cancelText = qsTr("Cancel")
confirmationDialog.onAcceptedCallback = function() {
walletManager.closeWallet();
walletManager.clearWalletCache(persistentSettings.wallet_path);
walletManager.openWalletAsync(persistentSettings.wallet_path, appWindow.password,
persistentSettings.testnet);
}
confirmationDialog.onRejectedCallback = null;
confirmationDialog.open()
}
}
}
TextBlock {
Layout.fillWidth: true
text: (typeof currentWallet == "undefined") ? "" : qsTr("Wallet log path: ") + currentWallet.walletLogPath + translationManager.emptyString
}
TextBlock {
Layout.fillWidth: true
text: (typeof currentWallet == "undefined") ? "" : qsTr("Daemon log path: ") + currentWallet.daemonLogPath + translationManager.emptyString
}
}
@@ -413,11 +593,22 @@ Rectangle {
onAccepted: {
if(appWindow.password === settingsPasswordDialog.password){
informationPopup.title = qsTr("Wallet mnemonic seed") + translationManager.emptyString;
informationPopup.text = currentWallet.seed
informationPopup.open()
informationPopup.onCloseCallback = function() {
informationPopup.text = ""
if(currentWallet.seedLanguage == "") {
console.log("No seed language set. Using English as default");
currentWallet.setSeedLanguage("English");
}
seedPopup.title = qsTr("Wallet seed & keys") + translationManager.emptyString;
seedPopup.text = "<b>Wallet Mnemonic seed</b> <br>" + currentWallet.seed
+ "<br><br> <b>" + qsTr("Secret view key") + ":</b> " + currentWallet.secretViewKey
+ "<br><b>" + qsTr("Public view key") + ":</b> " + currentWallet.publicViewKey
+ "<br><b>" + qsTr("Secret spend key") + ":</b> " + currentWallet.secretSpendKey
+ "<br><b>" + qsTr("Public spend key") + ":</b> " + currentWallet.publicSpendKey
seedPopup.open()
seedPopup.width = 600
seedPopup.height = 300
seedPopup.onCloseCallback = function() {
seedPopup.text = ""
}
} else {
@@ -437,17 +628,93 @@ Rectangle {
}
StandardDialog {
id: seedPopup
cancelVisible: false
okVisible: true
width:600
height:400
property var onCloseCallback
onAccepted: {
if (onCloseCallback) {
onCloseCallback()
}
}
}
// Choose blockchain folder
FileDialog {
id: blockchainFileDialog
title: qsTr("Please choose a folder") + translationManager.emptyString;
selectFolder: true
folder: "file://" + persistentSettings.blockchainDataDir
onAccepted: {
var dataDir = walletManager.urlToLocalPath(blockchainFileDialog.fileUrl)
var validator = daemonManager.validateDataDir(dataDir);
if(!validator.valid) {
confirmationDialog.title = qsTr("Warning") + translationManager.emptyString;
confirmationDialog.text = "";
if(validator.readOnly) {
confirmationDialog.text += qsTr("Error: Filesystem is read only") + "\n\n"
}
if(validator.storageAvailable < 20) {
confirmationDialog.text += qsTr("Warning: There's only %1 GB available on the device. Blockchain requires ~%2 GB of data.").arg(validator.storageAvailable).arg(15) + "\n\n"
} else {
confirmationDialog.text += qsTr("Note: There's %1 GB available on the device. Blockchain requires ~%2 GB of data.").arg(validator.storageAvailable).arg(15) + "\n\n"
}
if(!validator.lmdbExists) {
confirmationDialog.text += qsTr("Note: lmdb folder not found. A new folder will be created.") + "\n\n"
}
confirmationDialog.icon = StandardIcon.Question
confirmationDialog.cancelText = qsTr("Cancel")
// Continue
confirmationDialog.onAcceptedCallback = function() {
persistentSettings.blockchainDataDir = dataDir
}
// Cancel
confirmationDialog.onRejectedCallback = function() {
};
confirmationDialog.open()
} else {
persistentSettings.blockchainDataDir = dataDir
}
delete validator;
}
onRejected: {
console.log("data dir selection canceled")
}
}
// fires on every page load
function onPageCompleted() {
console.log("Settings page loaded");
initSettings();
viewOnly = currentWallet.viewOnly;
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
if(typeof daemonManager != "undefined")
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
}
// fires only once
Component.onCompleted: {
daemonManager.daemonConsoleUpdated.connect(onDaemonConsoleUpdated)
if(typeof daemonManager != "undefined")
daemonManager.daemonConsoleUpdated.connect(onDaemonConsoleUpdated)
}
function onDaemonConsoleUpdated(message){

View File

@@ -40,7 +40,7 @@ Rectangle {
id: mainLayout
property int labelWidth: 120
property int editWidth: 400
// property int editWidth: 400
property int lineEditFontSize: 12
color: "#F0EEEE"
@@ -92,7 +92,7 @@ Rectangle {
// sign / verify
ColumnLayout {
anchors.margins: 10
anchors.margins: 17
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
@@ -100,21 +100,9 @@ Rectangle {
spacing: 20
Rectangle {
anchors.fill: signBox
color: "#00000000"
border.width: 2
border.color: "#CCCCCC"
anchors.margins: -15
}
// sign
ColumnLayout {
id: signBox
anchors.margins: 40
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
RowLayout {
ColumnLayout {
@@ -122,6 +110,7 @@ Rectangle {
Label {
text: qsTr("Sign a message or file contents with your address:") + translationManager.emptyString
fontSize: 16
wrapMode: Text.Wrap
}
Label {}
}
@@ -147,7 +136,7 @@ Rectangle {
fontSize: mainLayout.lineEditFontSize
placeholderText: qsTr("Message to sign") + translationManager.emptyString;
readOnly: false
Layout.fillWidth: true
// Layout.fillWidth: true
onTextChanged: signSignatureLine.text = ""
IconButton {
@@ -254,21 +243,16 @@ Rectangle {
RowLayout {
id: signSignatureRow
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 17
Label {
id: signSignatureLabel
fontSize: 14
text: qsTr("Signature") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit {
id: signSignatureLine
anchors.left: signSignatureLabel.right
anchors.right: parent.right
fontSize: mainLayout.lineEditFontSize
placeholderText: qsTr("Signature") + translationManager.emptyString;
readOnly: true
@@ -286,21 +270,10 @@ Rectangle {
}
}
Rectangle {
anchors.fill: verifyBox
color: "#00000000"
border.width: 2
border.color: "#CCCCCC"
anchors.margins: -15
}
// verify
ColumnLayout {
id: verifyBox
anchors.margins: 40
anchors.left: parent.left
anchors.right: parent.right
anchors.top: signBox.bottom
RowLayout {
ColumnLayout {
@@ -308,6 +281,8 @@ Rectangle {
Label {
text: qsTr("Verify a message or file signature from an address:") + translationManager.emptyString
fontSize: 16
// Layout.fillWidth: true
wrapMode: Text.Wrap
}
Label {}
}
@@ -444,6 +419,8 @@ Rectangle {
text: qsTr("<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>\
Signing address <font size='2'> ( Paste in or select from </font> <a href='#'>Address book</a><font size='2'> )</font>")
+ translationManager.emptyString
// Layout.fillWidth: true
wrapMode: Text.Wrap
onLinkActivated: appWindow.showPageRequest("AddressBook")
}
@@ -460,21 +437,16 @@ Rectangle {
RowLayout {
id: verifySignatureRow
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 17
Label {
id: verifySignatureLabel
fontSize: 14
text: qsTr("Signature") + translationManager.emptyString
width: mainLayout.labelWidth
}
LineEdit {
id: verifySignatureLine
anchors.left: verifySignatureLabel.right
anchors.right: parent.right
fontSize: mainLayout.lineEditFontSize
placeholderText: qsTr("Signature") + translationManager.emptyString;
Layout.fillWidth: true

View File

@@ -45,7 +45,7 @@ Rectangle {
property bool showAdvanced: false
function scaleValueToMixinCount(scaleValue) {
var scaleToMixinCount = [4,5,6,7,8,9,10,11,12,13,14,15,20,25];
var scaleToMixinCount = [4,5,6,7,8,9,10,11,12,14,16,18,21,25];
if (scaleValue < scaleToMixinCount.length) {
return scaleToMixinCount[scaleValue];
} else {
@@ -183,12 +183,16 @@ Rectangle {
}
// Note: workaround for translations in listElements
// ListElement: cannot use script for property value, so
// code like this wont work:
// ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low }
// For translations to work, the strings need to be listed in
// the file components/StandardDropdown.qml too.
// Priorities before v5
ListModel {
id: priorityModel
// ListElement: cannot use script for property value, so
// code like this wont work:
// ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low }
ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: PendingTransaction.Priority_Low }
ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: PendingTransaction.Priority_Medium }
@@ -199,10 +203,10 @@ Rectangle {
ListModel {
id: priorityModelV5
ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: 1}
ListElement { column1: qsTr("Default (x4 fee)") ; column2: ""; priority: 2 }
ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: 3 }
ListElement { column1: qsTr("High (x166 fee)") ; column2: ""; priority: 4 }
ListElement { column1: qsTr("Slow (x0.25 fee)") ; column2: ""; priority: 1}
ListElement { column1: qsTr("Default (x1 fee)") ; column2: ""; priority: 2 }
ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 }
ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 }
}
@@ -434,15 +438,6 @@ Rectangle {
enabled: !viewOnly || pageRoot.enabled
RowLayout {
// Label {
// id: manageWalletLabel
// Layout.fillWidth: true
// color: "#4A4949"
// text: qsTr("Advanced options") + translationManager.emptyString
// fontSize: 16
// Layout.topMargin: 20
// }
CheckBox {
id: showAdvancedCheckbox
checked: persistentSettings.transferShowAdvanced
@@ -463,7 +458,6 @@ Rectangle {
Layout.bottomMargin: 30
}
RowLayout {
visible: persistentSettings.transferShowAdvanced
anchors.left: parent.left
@@ -493,9 +487,13 @@ Rectangle {
}
RowLayout {
GridLayout {
visible: persistentSettings.transferShowAdvanced
Layout.topMargin: 50
columns: (isMobile) ? 2 : 6
StandardButton {
id: sweepUnmixableButton
text: qsTr("Sweep Unmixable") + translationManager.emptyString
@@ -512,7 +510,7 @@ Rectangle {
StandardButton {
id: saveTxButton
text: qsTr("create tx file") + translationManager.emptyString
text: qsTr("Create tx file") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
@@ -560,32 +558,6 @@ Rectangle {
submitTxDialog.open();
}
}
StandardButton {
id: rescanSpentButton
text: qsTr("Rescan spent") + translationManager.emptyString
shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00"
releasedColor: "#FF6C3C"
pressedColor: "#FF4304"
enabled: pageRoot.enabled
onClicked: {
if (!currentWallet.rescanSpent()) {
console.error("Error: ", currentWallet.errorString);
informationPopup.title = qsTr("Error") + translationManager.emptyString;
informationPopup.text = qsTr("Error: ") + currentWallet.errorString
informationPopup.icon = StandardIcon.Critical
informationPopup.onCloseCallback = null
informationPopup.open();
} else {
informationPopup.title = qsTr("Information") + translationManager.emptyString
informationPopup.text = qsTr("Sucessfully rescanned spent outputs") + translationManager.emptyString
informationPopup.icon = StandardIcon.Information
informationPopup.onCloseCallback = null
informationPopup.open();
}
}
}
}
@@ -714,15 +686,9 @@ Rectangle {
}
function updatePriorityDropdown() {
// Use new fee multipliers after v5 fork
if (typeof currentWallet != "undefined" && currentWallet.useForkRules(5)) {
priorityDropdown.dataModel = priorityModelV5;
priorityDropdown.currentIndex = 1
} else {
priorityDropdown.dataModel = priorityModel;
priorityDropdown.currentIndex = 0
}
priorityDropdown.dataModel = priorityModelV5;
priorityDropdown.currentIndex = 1
priorityDropdown.update()
}
//TODO: Add daemon sync status

View File

@@ -89,18 +89,22 @@ Rectangle {
Text {
text: qsTr("Verify that a third party made a payment by supplying:") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true;
}
Text {
text: qsTr(" - the recipient address") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true;
}
Text {
text: qsTr(" - the transaction ID") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true;
}
Text {
text: qsTr(" - the secret transaction key supplied by the sender") + translationManager.emptyString
wrapMode: Text.Wrap
Layout.fillWidth: true;
}
Text {
text: qsTr("If a payment had several transactions then each must be checked and the results combined.") + translationManager.emptyString

View File

@@ -106,6 +106,7 @@
<file>lang/flags/france.png</file>
<file>lang/flags/german.png</file>
<file>lang/flags/india.png</file>
<file>lang/flags/indonesia.png</file>
<file>lang/flags/italy.png</file>
<file>lang/flags/japan.png</file>
<file>lang/flags/netherlands.png</file>
@@ -114,10 +115,13 @@
<file>lang/flags/rpa.png</file>
<file>lang/flags/russia.png</file>
<file>lang/flags/spain.png</file>
<file>lang/flags/sweden.png</file>
<file>lang/flags/taiwan.png</file>
<file>lang/flags/uk.png</file>
<file>lang/flags/usa.png</file>
<file>lang/flags/indonesia.png</file>
<file>lang/flags/israel.png</file>
<file>lang/flags/south_korea.png</file>
<file>lang/flags/romania.png</file>
<file>wizard/WizardManageWalletUI.qml</file>
<file>wizard/WizardRecoveryWallet.qml</file>
<file>wizard/WizardMemoTextInput.qml</file>
@@ -125,7 +129,6 @@
<file>pages/Receive.qml</file>
<file>pages/TxKey.qml</file>
<file>components/IconButton.qml</file>
<file>lang/flags/italy.png</file>
<file>components/PasswordDialog.qml</file>
<file>components/ProcessingSplash.qml</file>
<file>components/ProgressBar.qml</file>
@@ -138,5 +141,7 @@
<file>components/DaemonConsole.qml</file>
<file>components/QRCodeScanner.qml</file>
<file>components/Notifier.qml</file>
<file>components/MobileHeader.qml</file>
<file>components/TextBlock.qml</file>
</qresource>
</RCC>

View File

@@ -8,6 +8,10 @@
#include <QApplication>
#include <QProcess>
#include <QTime>
#include <QStorageInfo>
#include <QVariantMap>
#include <QVariant>
#include <QMap>
namespace {
static const int DAEMON_START_TIMEOUT_SECONDS = 30;
@@ -28,7 +32,7 @@ DaemonManager *DaemonManager::instance(const QStringList *args)
return m_instance;
}
bool DaemonManager::start(const QString &flags, bool testnet)
bool DaemonManager::start(const QString &flags, bool testnet, const QString &dataDir)
{
// prepare command line arguments and pass to monerod
QStringList arguments;
@@ -54,8 +58,19 @@ bool DaemonManager::start(const QString &flags, bool testnet)
arguments << str;
}
// Custom data-dir
if(!dataDir.isEmpty()) {
if(testnet)
arguments << "--testnet-data-dir";
else
arguments << "--data-dir";
arguments << dataDir;
}
arguments << "--check-updates" << "disabled";
qDebug() << "starting monerod " + m_monerod;
qDebug() << "With command line arguments " << arguments;
@@ -212,15 +227,17 @@ bool DaemonManager::sendCommand(const QString &cmd,bool testnet) const
bool DaemonManager::sendCommand(const QString &cmd,bool testnet, QString &message) const
{
QProcess p;
QString external_cmd = m_monerod + " " + cmd;
qDebug() << "sending external cmd: " << external_cmd;
QStringList external_cmd;
external_cmd << cmd;
// Add testnet flag if needed
if (testnet)
external_cmd += " --testnet";
external_cmd += "\n";
external_cmd << "--testnet";
p.start(external_cmd);
qDebug() << "sending external cmd: " << external_cmd;
p.start(m_monerod, external_cmd);
bool started = p.waitForFinished(-1);
message = p.readAllStandardOutput();
@@ -234,6 +251,44 @@ void DaemonManager::exit()
m_app_exit = true;
}
QVariantMap DaemonManager::validateDataDir(const QString &dataDir) const
{
QVariantMap result;
bool valid = true;
bool readOnly = false;
int storageAvailable = 0;
bool lmdbExists = true;
QStorageInfo storage(dataDir);
if (storage.isValid() && storage.isReady()) {
if (storage.isReadOnly()) {
readOnly = true;
valid = false;
}
// Make sure there is 20GB storage available
storageAvailable = storage.bytesAvailable()/1000/1000/1000;
if (storageAvailable < 20) {
valid = false;
}
} else {
valid = false;
}
if (!QDir(dataDir+"/lmdb").exists()) {
lmdbExists = false;
valid = false;
}
result.insert("valid", valid);
result.insert("lmdbExists", lmdbExists);
result.insert("readOnly", readOnly);
result.insert("storageAvailable", storageAvailable);
return result;
}
DaemonManager::DaemonManager(QObject *parent)
: QObject(parent)
{

View File

@@ -4,6 +4,7 @@
#include <QObject>
#include <QUrl>
#include <QProcess>
#include <QVariantMap>
class DaemonManager : public QObject
{
@@ -13,7 +14,7 @@ public:
static DaemonManager * instance(const QStringList *args);
Q_INVOKABLE bool start(const QString &flags, bool testnet);
Q_INVOKABLE bool start(const QString &flags, bool testnet, const QString &dataDir = "");
Q_INVOKABLE bool stop(bool testnet);
// return true if daemon process is started
@@ -21,6 +22,7 @@ public:
// Send daemon command from qml and prints output in console window.
Q_INVOKABLE bool sendCommand(const QString &cmd, bool testnet) const;
Q_INVOKABLE void exit();
Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const;
private:

View File

@@ -45,11 +45,12 @@ QList<TransactionInfo *> TransactionHistory::getAll() const
if (ti->timestamp() <= firstDateTime) {
firstDateTime = ti->timestamp();
}
quint64 requiredConfirmations = (ti->blockHeight() < ti->unlockTime()) ? ti->unlockTime() - ti->blockHeight() : 10;
// store last tx height
if (ti->confirmations() < 10 && ti->blockHeight() >= lastTxHeight ){
if (ti->confirmations() < requiredConfirmations && ti->blockHeight() >= lastTxHeight) {
lastTxHeight = ti->blockHeight();
// TODO: Fetch block time and confirmations needed from wallet2?
m_minutesToUnlock = (10 - ti->confirmations()) * 2;
m_minutesToUnlock = (requiredConfirmations - ti->confirmations()) * 2;
m_locked = true;
}

View File

@@ -51,6 +51,11 @@ quint64 TransactionInfo::confirmations() const
return m_pimpl->confirmations();
}
quint64 TransactionInfo::unlockTime() const
{
return m_pimpl->unlockTime();
}
QString TransactionInfo::hash() const
{
return QString::fromStdString(m_pimpl->hash());

View File

@@ -19,6 +19,7 @@ class TransactionInfo : public QObject
Q_PROPERTY(QString fee READ fee)
Q_PROPERTY(quint64 blockHeight READ blockHeight)
Q_PROPERTY(quint64 confirmations READ confirmations)
Q_PROPERTY(quint64 unlockTime READ unlockTime)
Q_PROPERTY(QString hash READ hash)
Q_PROPERTY(QDateTime timestamp READ timestamp)
Q_PROPERTY(QString date READ date)
@@ -44,6 +45,7 @@ public:
QString fee() const;
quint64 blockHeight() const;
quint64 confirmations() const;
quint64 unlockTime() const;
//! transaction_id
QString hash() const;
QDateTime timestamp() const;

View File

@@ -207,6 +207,7 @@ void Wallet::initAsync(const QString &daemonAddress, quint64 upperTransactionLim
QFuture<bool> future = watcher->future();
watcher->deleteLater();
if(future.result()){
emit walletCreationHeightChanged();
qDebug() << "init async finished - starting refresh";
connected(true);
m_walletImpl->startRefresh();
@@ -599,6 +600,22 @@ bool Wallet::useForkRules(quint8 required_version, quint64 earlyBlocks) const
}
}
void Wallet::setWalletCreationHeight(quint64 height)
{
m_walletImpl->setRefreshFromBlockHeight(height);
emit walletCreationHeightChanged();
}
QString Wallet::getDaemonLogPath() const
{
return QString::fromStdString(m_walletImpl->getDefaultDataDir()) + "/bitmonero.log";
}
QString Wallet::getWalletLogPath() const
{
return QCoreApplication::applicationDirPath() + "/monero-wallet-gui.log";
}
Wallet::Wallet(Monero::Wallet *w, QObject *parent)
: QObject(parent)
, m_walletImpl(w)

View File

@@ -41,6 +41,13 @@ class Wallet : public QObject
Q_PROPERTY(AddressBookModel * addressBookModel READ addressBookModel)
Q_PROPERTY(AddressBook * addressBook READ addressBook)
Q_PROPERTY(bool viewOnly READ viewOnly)
Q_PROPERTY(QString secretViewKey READ getSecretViewKey)
Q_PROPERTY(QString publicViewKey READ getPublicViewKey)
Q_PROPERTY(QString secretSpendKey READ getSecretSpendKey)
Q_PROPERTY(QString publicSpendKey READ getPublicSpendKey)
Q_PROPERTY(QString daemonLogPath READ getDaemonLogPath CONSTANT)
Q_PROPERTY(QString walletLogPath READ getWalletLogPath CONSTANT)
Q_PROPERTY(quint64 walletCreationHeight READ getWalletCreationHeight WRITE setWalletCreationHeight NOTIFY walletCreationHeightChanged)
public:
@@ -231,6 +238,18 @@ public:
// check if fork rules should be used
Q_INVOKABLE bool useForkRules(quint8 version, quint64 earlyBlocks = 0) const;
//! Get wallet keys
QString getSecretViewKey() const {return QString::fromStdString(m_walletImpl->secretViewKey());}
QString getPublicViewKey() const {return QString::fromStdString(m_walletImpl->publicViewKey());}
QString getSecretSpendKey() const {return QString::fromStdString(m_walletImpl->secretSpendKey());}
QString getPublicSpendKey() const {return QString::fromStdString(m_walletImpl->publicSpendKey());}
quint64 getWalletCreationHeight() const {return m_walletImpl->getRefreshFromBlockHeight();}
void setWalletCreationHeight(quint64 height);
QString getDaemonLogPath() const;
QString getWalletLogPath() const;
// TODO: setListenter() when it implemented in API
signals:
// emitted on every event happened with wallet
@@ -246,6 +265,7 @@ signals:
void unconfirmedMoneyReceived(const QString &txId, quint64 amount);
void newBlock(quint64 height, quint64 targetHeight);
void historyModelChanged() const;
void walletCreationHeightChanged();
// emitted when transaction is created async
void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount);

View File

@@ -11,6 +11,7 @@
#include <QtConcurrent/QtConcurrent>
#include <QMutex>
#include <QMutexLocker>
#include <QString>
WalletManager * WalletManager::m_instance = nullptr;
@@ -330,14 +331,50 @@ bool WalletManager::saveQrCode(const QString &code, const QString &path) const
return QRCodeImageProvider::genQrImage(code, &size).scaled(size.expandedTo(QSize(240, 240)), Qt::KeepAspectRatio).save(path, "PNG", 100);
}
void WalletManager::checkUpdatesAsync(const QString &software, const QString &subdir) const
{
QFuture<QString> future = QtConcurrent::run(this, &WalletManager::checkUpdates,
software, subdir);
QFutureWatcher<QString> * watcher = new QFutureWatcher<QString>();
connect(watcher, &QFutureWatcher<Wallet*>::finished,
this, [this, watcher]() {
QFuture<QString> future = watcher->future();
watcher->deleteLater();
qDebug() << "Checking for updates - done";
emit checkUpdatesComplete(future.result());
});
watcher->setFuture(future);
}
QString WalletManager::checkUpdates(const QString &software, const QString &subdir) const
{
qDebug() << "Checking for updates";
const std::tuple<bool, std::string, std::string, std::string, std::string> result = Monero::WalletManager::checkUpdates(software.toStdString(), subdir.toStdString());
if (!std::get<0>(result))
return QString("");
return QString::fromStdString(std::get<1>(result) + "|" + std::get<2>(result) + "|" + std::get<3>(result) + "|" + std::get<4>(result));
}
bool WalletManager::clearWalletCache(const QString &wallet_path) const
{
QString fileName = wallet_path;
// Make sure wallet file is not .keys
fileName.replace(".keys","");
QFile walletCache(fileName);
QString suffix = ".old_cache";
QString newFileName = fileName + suffix;
// create unique file name
for (int i = 1; QFile::exists(newFileName); i++) {
newFileName = QString("%1%2.%3").arg(fileName).arg(suffix).arg(i);
}
return walletCache.rename(newFileName);
}
WalletManager::WalletManager(QObject *parent) : QObject(parent)
{
m_pimpl = Monero::WalletManagerFactory::getWalletManager();

View File

@@ -134,12 +134,17 @@ 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);
Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const;
Q_INVOKABLE void checkUpdatesAsync(const QString &software, const QString &subdir) const;
Q_INVOKABLE QString checkUpdates(const QString &software, const QString &subdir) const;
// clear/rename wallet cache
Q_INVOKABLE bool clearWalletCache(const QString &fileName) const;
signals:
void walletOpened(Wallet * wallet);
void walletClosed(const QString &walletAddress);
void checkUpdatesComplete(const QString &result) const;
public slots:
private:

View File

@@ -3,6 +3,7 @@
#include "TransactionInfo.h"
#include <QDateTime>
#include <QDebug>
TransactionHistoryModel::TransactionHistoryModel(QObject *parent)
@@ -85,6 +86,9 @@ QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const
case TransactionConfirmationsRole:
result = tInfo->confirmations();
break;
case TransactionConfirmationsRequiredRole:
result = (tInfo->blockHeight() < tInfo->unlockTime()) ? tInfo->unlockTime() - tInfo->blockHeight() : 10;
break;
case TransactionHashRole:
result = tInfo->hash();
break;
@@ -130,6 +134,7 @@ QHash<int, QByteArray> TransactionHistoryModel::roleNames() const
roleNames.insert(TransactionFeeRole, "fee");
roleNames.insert(TransactionBlockHeightRole, "blockHeight");
roleNames.insert(TransactionConfirmationsRole, "confirmations");
roleNames.insert(TransactionConfirmationsRequiredRole, "confirmationsRequired");
roleNames.insert(TransactionHashRole, "hash");
roleNames.insert(TransactionTimeStampRole, "timeStamp");
roleNames.insert(TransactionPaymentIdRole, "paymentId");

View File

@@ -26,6 +26,7 @@ public:
TransactionFeeRole,
TransactionBlockHeightRole,
TransactionConfirmationsRole,
TransactionConfirmationsRequiredRole,
TransactionHashRole,
TransactionTimeStampRole,
TransactionPaymentIdRole,

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

View File

@@ -1,839 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>AddressBook</name>
<message>
<location filename="../pages/AddressBook.qml" line="47"/>
<source>Add new entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="56"/>
<location filename="../pages/AddressBook.qml" line="173"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="58"/>
<source>&lt;b&gt;Tip tekst test&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="77"/>
<source>Payment ID &lt;font size=&apos;2&apos;&gt;(Optional)&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="79"/>
<source>&lt;b&gt;Payment ID&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;A unique user name used in&lt;br/&gt;the address book. It is not a&lt;br/&gt;transfer of information sent&lt;br/&gt;during thevtransfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="99"/>
<source>Description &lt;font size=&apos;2&apos;&gt;(Local database)&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="101"/>
<source>&lt;b&gt;Tip tekst test&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;test line 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="126"/>
<source>ADD</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="174"/>
<source>Payment ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/AddressBook.qml" line="175"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AddressBookTable</name>
<message>
<location filename="../components/AddressBookTable.qml" line="47"/>
<source>No more results</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/AddressBookTable.qml" line="106"/>
<source>Payment ID:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>BasicPanel</name>
<message>
<location filename="../BasicPanel.qml" line="78"/>
<source>Locked Balance:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="92"/>
<source>78.9239845</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="116"/>
<source>Available Balance:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="130"/>
<source>2324.9239845</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="155"/>
<source>amount...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="163"/>
<source>SEND</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="179"/>
<source>destination...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="191"/>
<source>Privacy level</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BasicPanel.qml" line="212"/>
<source>payment ID (optional)...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Dashboard</name>
<message>
<location filename="../pages/Dashboard.qml" line="57"/>
<source>Quick transfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Dashboard.qml" line="89"/>
<source>SEND</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Dashboard.qml" line="102"/>
<source>&lt;style type=&apos;text/css&apos;&gt;a {text-decoration: none; color: #FF6C3C; font-size: 14px;}&lt;/style&gt; lookng for security level and address book? go to &lt;a href=&apos;#&apos;&gt;Transfer&lt;/a&gt; tab</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DashboardTable</name>
<message>
<location filename="../components/DashboardTable.qml" line="47"/>
<source>No more results</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/DashboardTable.qml" line="137"/>
<source>Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/DashboardTable.qml" line="172"/>
<source>Balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/DashboardTable.qml" line="193"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>History</name>
<message>
<location filename="../pages/History.qml" line="47"/>
<source>Filter trasactions history</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="56"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="58"/>
<location filename="../pages/History.qml" line="123"/>
<location filename="../pages/History.qml" line="143"/>
<location filename="../pages/History.qml" line="191"/>
<location filename="../pages/History.qml" line="225"/>
<location filename="../pages/History.qml" line="246"/>
<source>&lt;b&gt;Tip tekst test&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="77"/>
<source>Payment ID &lt;font size=&apos;2&apos;&gt;(Optional)&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="79"/>
<source>&lt;b&gt;Payment ID&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;A unique user name used in&lt;br/&gt;the address book. It is not a&lt;br/&gt;transfer of information sent&lt;br/&gt;during thevtransfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="99"/>
<source>Description &lt;font size=&apos;2&apos;&gt;(Local database)&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="101"/>
<source>&lt;b&gt;Tip tekst test&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;test line 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="121"/>
<source>Date from</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="141"/>
<location filename="../pages/History.qml" line="244"/>
<source>To</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="161"/>
<source>FILTER</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="170"/>
<source>Advance filtering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="189"/>
<source>Type of transation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/History.qml" line="223"/>
<source>Amount from</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>HistoryTable</name>
<message>
<location filename="../components/HistoryTable.qml" line="47"/>
<source>No more results</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/HistoryTable.qml" line="129"/>
<source>Payment ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/HistoryTable.qml" line="167"/>
<source>Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/HistoryTable.qml" line="202"/>
<source>Balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/HistoryTable.qml" line="223"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LeftPanel</name>
<message>
<location filename="../LeftPanel.qml" line="103"/>
<source>Balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="106"/>
<source>Test tip 1&lt;br/&gt;&lt;br/&gt;line 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="138"/>
<source>Unlocked balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="141"/>
<source>Test tip 2&lt;br/&gt;&lt;br/&gt;line 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="222"/>
<source>Transfer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="223"/>
<source>T</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="245"/>
<source>Receive</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LeftPanel.qml" line="246"/>
<source>R</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NetworkStatusItem</name>
<message>
<location filename="../components/NetworkStatusItem.qml" line="58"/>
<source>Network status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/NetworkStatusItem.qml" line="66"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/NetworkStatusItem.qml" line="66"/>
<source>Disconnected</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PrivacyLevelSmall</name>
<message>
<location filename="../components/PrivacyLevelSmall.qml" line="102"/>
<source>LOW</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/PrivacyLevelSmall.qml" line="113"/>
<source>MEDIUM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/PrivacyLevelSmall.qml" line="124"/>
<source>HIGH</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Receive</name>
<message>
<location filename="../pages/Receive.qml" line="79"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="86"/>
<source>ReadOnly wallet address displayed here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="106"/>
<source>Integrated address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="115"/>
<source>ReadOnly wallet integrated address displayed here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="136"/>
<source>Payment ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="144"/>
<source>PaymentID here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Receive.qml" line="168"/>
<source>Generate</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RightPanel</name>
<message>
<location filename="../RightPanel.qml" line="58"/>
<source>Twitter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../RightPanel.qml" line="59"/>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../RightPanel.qml" line="60"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../RightPanel.qml" line="61"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SearchInput</name>
<message>
<location filename="../components/SearchInput.qml" line="69"/>
<source>Search by...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/SearchInput.qml" line="230"/>
<source>SEARCH</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TickDelegate</name>
<message>
<location filename="../components/TickDelegate.qml" line="55"/>
<source>LOW</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/TickDelegate.qml" line="56"/>
<source>MEDIUM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../components/TickDelegate.qml" line="57"/>
<source>HIGH</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TitleBar</name>
<message>
<location filename="../components/TitleBar.qml" line="38"/>
<source>Monero - Donations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Transfer</name>
<message>
<location filename="../pages/Transfer.qml" line="57"/>
<source>Amount</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="67"/>
<source>Transaction priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="89"/>
<source>Amount...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="96"/>
<source>LOW</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="97"/>
<source>MEDIUM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="98"/>
<source>HIGH</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="127"/>
<source>Privacy Level</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="153"/>
<source>Cost</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="167"/>
<source>&lt;style type=&apos;text/css&apos;&gt;a {text-decoration: none; color: #FF6C3C; font-size: 14px;}&lt;/style&gt; Address &lt;font size=&apos;2&apos;&gt; ( Type in or select from &lt;/font&gt; &lt;a href=&apos;#&apos;&gt;Address&lt;/a&gt;&lt;font size=&apos;2&apos;&gt; book )&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="194"/>
<source>Payment ID &lt;font size=&apos;2&apos;&gt;( Optional )&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="218"/>
<source>Description &lt;font size=&apos;2&apos;&gt;( An optional description that will be saved to the local address book if entered )&lt;/font&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../pages/Transfer.qml" line="239"/>
<source>SEND</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardConfigure</name>
<message>
<location filename="../wizard/WizardConfigure.qml" line="79"/>
<source>Were almost there - lets just configure some Monero preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="97"/>
<source>Kickstart the Monero blockchain?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="115"/>
<source>It is very important to write it down as this is the only backup you will need for your wallet. You will be asked to confirm the seed in the next screen to ensure it has copied down correctly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="127"/>
<source>Enable disk conservation mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="145"/>
<source>Disk conservation mode uses substantially less disk-space, but the same amount of bandwidth as a regular Monero instance. However, storing the full blockchain is beneficial to the security of the Monero network. If you are on a device with limited disk space, then this option is appropriate for you.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="158"/>
<source>Allow background mining?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardConfigure.qml" line="176"/>
<source>Mining secures the Monero network, and also pays a small reward for the work done. This option will let Monero mine when your computer is on mains power and is idle. It will stop mining when you continue working.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardCreateWallet</name>
<message>
<location filename="../wizard/WizardCreateWallet.qml" line="90"/>
<source>A new wallet has been created for you</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardCreateWallet.qml" line="91"/>
<source>This is the 25 word mnemonic for your wallet</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardDonation</name>
<message>
<location filename="../wizard/WizardDonation.qml" line="93"/>
<source>Monero development is solely supported by donations</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardDonation.qml" line="113"/>
<source>Enable auto-donations of?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardDonation.qml" line="153"/>
<source>% of my fee added to each transaction</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardDonation.qml" line="164"/>
<source>For every transaction, a small transaction fee is charged. This option lets you add an additional amount, as a percentage of that fee, to your transaction to support Monero development. For instance, a 50% autodonation take a transaction fee of 0.005 XMR and add a 0.0025 XMR to support Monero development.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardDonation.qml" line="176"/>
<source>Allow background mining?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardDonation.qml" line="194"/>
<source>Mining secures the Monero network, and also pays a small reward for the work done. This option will let Monero mine when your computer is on mains power and is idle. It will stop mining when you continue working.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardFinish</name>
<message>
<location filename="../wizard/WizardFinish.qml" line="41"/>
<source>&lt;b&gt;Language:&lt;/b&gt; </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="42"/>
<source>&lt;b&gt;Account name:&lt;/b&gt; </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="43"/>
<source>&lt;b&gt;Words:&lt;/b&gt; </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="44"/>
<source>&lt;b&gt;Wallet Path: &lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="45"/>
<source>&lt;b&gt;Enable auto donation: &lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="46"/>
<source>&lt;b&gt;Auto donation amount: &lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="47"/>
<source>&lt;b&gt;Allow background mining: &lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="52"/>
<source>An overview of your Monero configuration is below:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardFinish.qml" line="107"/>
<source>Youre all setup!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardMain</name>
<message>
<location filename="../wizard/WizardMain.qml" line="308"/>
<source>USE MONERO</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardManageWalletUI</name>
<message>
<location filename="../wizard/WizardManageWalletUI.qml" line="103"/>
<source>This is the name of your wallet. You can change it to a different name if youd like:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardManageWalletUI.qml" line="125"/>
<source>My account name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardManageWalletUI.qml" line="175"/>
<source>Your wallet is stored in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardManageWalletUI.qml" line="187"/>
<source>Please choose a directory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardMemoTextInput</name>
<message>
<location filename="../wizard/WizardMemoTextInput.qml" line="76"/>
<source>It is very important to write it down as this is the only backup you will need for your wallet. You will be asked to confirm the seed in the next screen to ensure it has copied down correctly.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardOptions</name>
<message>
<location filename="../wizard/WizardOptions.qml" line="62"/>
<source>Welcome to Monero!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardOptions.qml" line="74"/>
<source>Please select one of the following options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardOptions.qml" line="110"/>
<source>This is my first time, I want to&lt;br/&gt;create a new account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardOptions.qml" line="141"/>
<source>I want to recover my account&lt;br/&gt;from my 24 work seed</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardPassword</name>
<message>
<location filename="../wizard/WizardPassword.qml" line="51"/>
<source>Now that your wallet has been created, please set a password for the wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardPassword.qml" line="53"/>
<source>Now that your wallet has been restored, please set a password for the wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardPassword.qml" line="135"/>
<source>Note that this password cannot be recovered, and if forgotten you will need to restore your wallet from the mnemonic seed you were just given&lt;br/&gt;&lt;br/&gt;
Your password will be used to protect your wallet and to confirm actions, so make sure that your password is sufficiently secure.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardRecoveryWallet</name>
<message>
<location filename="../wizard/WizardRecoveryWallet.qml" line="78"/>
<source>My account name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardRecoveryWallet.qml" line="79"/>
<source>We&apos;re ready to recover your account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardRecoveryWallet.qml" line="80"/>
<source>Please enter your 25 word private key</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WizardWelcome</name>
<message>
<location filename="../wizard/WizardWelcome.qml" line="69"/>
<source>Welcome</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../wizard/WizardWelcome.qml" line="82"/>
<source>Please choose a language and regional format.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../main.qml" line="148"/>
<location filename="../main.qml" line="203"/>
<location filename="../main.qml" line="233"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="149"/>
<source>Couldn&apos;t open wallet: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="204"/>
<source>Can&apos;t create transaction: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="216"/>
<source>Confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="217"/>
<source>Please confirm transaction:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="218"/>
<source>
Address: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="219"/>
<source>
Payment ID: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="220"/>
<source>
Amount: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="221"/>
<source>
Fee: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="234"/>
<source>Couldn&apos;t send the money: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="237"/>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="238"/>
<source>Money sent successfully</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="310"/>
<source>Initializing Wallet...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="336"/>
<source>Program setup wizard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="350"/>
<source>Monero - Donations</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.qml" line="389"/>
<source>send to the same destination</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

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

View File

@@ -53,6 +53,12 @@ function get_tag()
echo "You are ahead of or behind a tagged release"
VERSIONTAG="$COMMIT"
fi
# save tag name + commit if availible
TAGNAME=$(git describe | sed -e 's/[\t ]*//')
if test -z "$TAGNAME"
then
TAGNAME="$VERSIONTAG"
fi
fi
fi
}

View File

@@ -17,13 +17,13 @@ fi
if [[ "$BUILD_TYPE" == "Release" ]]; then
echo "Release build"
ICU_FILES="libicuuc57.dll libicuin57.dll libicudt57.dll"
ICU_FILES=(libicuuc57.dll libicuin57.dll libicudt57.dll)
else
echo "Debug build"
ICU_FILES="libicuucd57.dll libicuind57.dll libicudtd57.dll"
ICU_FILES=(libicuucd57.dll libicuind57.dll libicudtd57.dll)
fi
FILES="zlib1.dll libwinpthread-1.dll libtiff-5.dll libstdc++-6.dll libpng16-16.dll libpcre16-0.dll libpcre-1.dll libmng-2.dll liblzma-5.dll liblcms2-2.dll libjpeg-8.dll libjasper-1.dll libintl-8.dll libiconv-2.dll libharfbuzz-0.dll libgraphite2.dll libglib-2.0-0.dll libfreetype-6.dll libbz2-1.dll"
FILES=(zlib1.dll libwinpthread-1.dll libtiff-5.dll libstdc++-6.dll libpng16-16.dll libpcre16-0.dll libpcre-1.dll libmng-2.dll liblzma-5.dll liblcms2-2.dll libjpeg-8.dll libintl-8.dll libiconv-2.dll libharfbuzz-0.dll libgraphite2.dll libglib-2.0-0.dll libfreetype-6.dll libbz2-1.dll)
platform=$(get_platform)
@@ -33,10 +33,9 @@ elif [[ "$platform" == "mingw32" ]]; then
PLATFORM_FILES="libgcc_s_dw2-1.dll"
fi
for f in $FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
for f in "${FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done
for f in $ICU_FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
for f in $PLATFORM_FILES; do cp $MSYSTEM_PREFIX/bin/$f $TARGET; done
for f in "${ICU_FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done
for f in "${PLATFORM_FILES[@]}"; do cp $MSYSTEM_PREFIX/bin/$f $TARGET || exit 1; done

View File

@@ -59,6 +59,7 @@ ColumnLayout {
settingsObject['account_name'] = uiItem.accountNameText
settingsObject['words'] = uiItem.wordsTexttext
settingsObject['wallet_path'] = uiItem.walletPath
console.log("path " +uiItem.walletPath);
var walletFullPath = wizard.createWalletPath(uiItem.walletPath,uiItem.accountNameText);
return wizard.walletPathValid(walletFullPath);
}

View File

@@ -50,7 +50,7 @@ ColumnLayout {
autoDonationAmount = wizard.settings["auto_donations_amount"] + " %",
backgroundMiningEnabled = wizard.settings["allow_background_mining"] === true,
backgroundMiningText = backgroundMiningEnabled ? qsTr("Enabled") : qsTr("Disabled"),
testnetEnabled = wizard.settings['testnet'] === true,
testnetEnabled = appWindow.persistentSettings.testnet,
testnetText = testnetEnabled ? qsTr("Enabled") : qsTr("Disabled"),
restoreHeightEnabled = wizard.settings['restore_height'] !== undefined;
@@ -64,7 +64,7 @@ ColumnLayout {
// ? trStart + qsTr("Donation amount") + trMiddle + autoDonationAmount + trEnd
// : "")
// + trStart + qsTr("Background mining") + trMiddle + backgroundMiningText + trEnd
+ trStart + qsTr("Daemon address") + trMiddle + wizard.settings["daemon_address"] + trEnd
+ trStart + qsTr("Daemon address") + trMiddle + persistentSettings.daemon_address + trEnd
+ trStart + qsTr("Testnet") + trMiddle + testnetText + trEnd
+ (restoreHeightEnabled
? trStart + qsTr("Restore height") + trMiddle + wizard.settings['restore_height'] + trEnd

View File

@@ -115,6 +115,7 @@ ColumnLayout {
function openCreateWalletPage() {
wizardRestarted();
print ("show create wallet page");
currentPath = "create_wallet"
pages = paths[currentPath]
@@ -125,6 +126,7 @@ ColumnLayout {
}
function openRecoveryWalletPage() {
wizardRestarted();
print ("show recovery wallet page");
currentPath = "recovery_wallet"
pages = paths[currentPath]
@@ -160,10 +162,16 @@ ColumnLayout {
folder_path = folder_path.substring(0,folder_path.length -1)
}
// Store releative path on ios.
if(isIOS)
folder_path = "";
return folder_path + "/" + account_name + "/" + account_name
}
function walletPathValid(path){
if(isIOS)
path = moneroAccountsDir + path;
if (walletManager.walletExists(path)) {
walletErrorDialog.text = qsTr("A wallet with same name already exists. Please change wallet name") + translationManager.emptyString;
walletErrorDialog.open();
@@ -193,8 +201,16 @@ ColumnLayout {
function applySettings() {
// Save wallet files in user specified location
var new_wallet_filename = createWalletPath(settings.wallet_path,settings.account_name)
console.log("saving in wizard: "+ new_wallet_filename)
settings.wallet.store(new_wallet_filename);
if(isIOS) {
console.log("saving in ios: "+ moneroAccountsDir + new_wallet_filename)
settings.wallet.store(moneroAccountsDir + new_wallet_filename);
} else {
console.log("saving in wizard: "+ new_wallet_filename)
settings.wallet.store(new_wallet_filename);
}
// make sure temporary wallet files are deleted
console.log("Removing temporary wallet: "+ settings.tmp_wallet_filename)
@@ -217,11 +233,8 @@ ColumnLayout {
appWindow.persistentSettings.allow_background_mining = false //settings.allow_background_mining
appWindow.persistentSettings.auto_donations_enabled = false //settings.auto_donations_enabled
appWindow.persistentSettings.auto_donations_amount = false //settings.auto_donations_amount
appWindow.persistentSettings.daemon_address = settings.daemon_address
appWindow.persistentSettings.testnet = settings.testnet
appWindow.persistentSettings.restore_height = (isNaN(settings.restore_height))? 0 : settings.restore_height
appWindow.persistentSettings.is_recovering = (settings.is_recovering === undefined)? false : settings.is_recovering
}
// reading settings from persistent storage

View File

@@ -56,10 +56,10 @@ ColumnLayout {
property int rowSpacing: 10
function checkFields(){
var addressOK = walletManager.addressValid(addressLine.text, wizard.settings.testnet)
var viewKeyOK = walletManager.keyValid(viewKeyLine.text, addressLine.text, true, wizard.settings.testnet)
var addressOK = walletManager.addressValid(addressLine.text, persistentSettings.testnet)
var viewKeyOK = walletManager.keyValid(viewKeyLine.text, addressLine.text, true, persistentSettings.testnet)
// Spendkey is optional
var spendKeyOK = (spendKeyLine.text.length > 0)? walletManager.keyValid(spendKeyLine.text, addressLine.text, false, wizard.settings.testnet) : true
var spendKeyOK = (spendKeyLine.text.length > 0)? walletManager.keyValid(spendKeyLine.text, addressLine.text, false, persistentSettings.testnet) : true
addressLine.error = !addressOK && addressLine.text.length != 0
viewKeyLine.error = !viewKeyOK && viewKeyLine.text.length != 0
@@ -242,8 +242,7 @@ ColumnLayout {
Layout.fillWidth: true
Layout.topMargin: 20
fontSize: 14
text: qsTr("Your wallet is stored in") + translationManager.emptyString
+ translationManager.emptyString
text: qsTr("Your wallet is stored in") + ": " + fileUrlInput.text;
}
LineEdit {

View File

@@ -44,25 +44,12 @@ ColumnLayout {
function onPageClosed() {
// Save settings used in open from file.
// other wizard settings are saved on last page in applySettings()
appWindow.persistentSettings.testnet = wizard.settings["testnet"]
appWindow.persistentSettings.daemon_address = wizard.settings["daemon_address"]
appWindow.persistentSettings.language = wizard.settings.language
appWindow.persistentSettings.locale = wizard.settings.locale
return true;
}
function saveDaemonAddress() {
wizard.settings["daemon_address"] = daemonAddress.text
wizard.settings["testnet"] = testNet.checked
}
QtObject {
id: d
readonly property string daemonAddressTestnet : "localhost:38081"
readonly property string daemonAddressMainnet : "localhost:18081"
}
Behavior on opacity {
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
}
@@ -139,7 +126,6 @@ ColumnLayout {
anchors.fill: parent
hoverEnabled: true
onClicked: {
page.saveDaemonAddress()
page.createWalletClicked()
}
}
@@ -182,7 +168,6 @@ ColumnLayout {
anchors.fill: parent
hoverEnabled: true
onClicked: {
page.saveDaemonAddress()
page.recoveryWalletClicked()
}
}
@@ -226,7 +211,6 @@ ColumnLayout {
anchors.fill: parent
hoverEnabled: true
onClicked: {
page.saveDaemonAddress()
page.openWalletClicked()
}
}
@@ -247,62 +231,30 @@ ColumnLayout {
}
// daemon select
// TODO: Move to separate page
ColumnLayout {
RowLayout {
Layout.leftMargin: wizardLeftMargin
Layout.rightMargin: wizardRightMargin
Layout.topMargin: 30
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
Label {
Layout.topMargin: 20
fontSize: 14
text: qsTr("Custom daemon address (optional)") + translationManager.emptyString
+ translationManager.emptyString
}
GridLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
columnSpacing: 20
rowSpacing: 20
flow: isMobile ? GridLayout.TopToBottom : GridLayout.LeftToRight
RowLayout {
spacing: 20
Layout.alignment: Qt.AlignCenter
LineEdit {
id: daemonAddress
Layout.alignment: Qt.AlignCenter
width: 200
fontSize: 14
text: {
if(appWindow.persistentSettings.daemon_address)
return appWindow.persistentSettings.daemon_address;
return testNet.checked ? d.daemonAddressTestnet : d.daemonAddressMainnet
}
}
CheckBox {
id: testNet
Layout.alignment: Qt.AlignCenter
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Testnet") + translationManager.emptyString
background: "#FFFFFF"
fontColor: "#4A4646"
fontSize: 16
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: appWindow.persistentSettings.testnet;
Rectangle {
width: 100
CheckBox {
id: testNet
text: qsTr("Testnet") + translationManager.emptyString
background: "#FFFFFF"
fontColor: "#4A4646"
fontSize: 16
checkedIcon: "../images/checkedVioletIcon.png"
uncheckedIcon: "../images/uncheckedIcon.png"
checked: appWindow.persistentSettings.testnet;
onClicked: {
persistentSettings.testnet = testNet.checked
console.log("testnet set to ", persistentSettings.testnet)
}
}
}
}
}

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