mirror of
https://github.com/monero-project/monero-gui.git
synced 2026-04-02 02:37:25 -04:00
Compare commits
266 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
113efbfdf0 | ||
|
|
0e1c6ae60f | ||
|
|
b461373b8a | ||
|
|
046124cd9b | ||
|
|
0ca7e4ec76 | ||
|
|
376eaecf08 | ||
|
|
316f8b1762 | ||
|
|
cbed1ed6f7 | ||
|
|
3507e848cf | ||
|
|
60967d3930 | ||
|
|
55a262b892 | ||
|
|
3719f00953 | ||
|
|
09003dd140 | ||
|
|
ac432fe947 | ||
|
|
5234570afa | ||
|
|
946fa538b9 | ||
|
|
52c8d68240 | ||
|
|
4fec3a4d6f | ||
|
|
02e0ac1309 | ||
|
|
51828babbb | ||
|
|
a13e4b622c | ||
|
|
56a17e0a85 | ||
|
|
e74ef368df | ||
|
|
857d034f18 | ||
|
|
3f4cedea54 | ||
|
|
4376880b46 | ||
|
|
98057487f6 | ||
|
|
06025352ce | ||
|
|
57f9cf9d85 | ||
|
|
d8fb9ec081 | ||
|
|
faf9ec3027 | ||
|
|
22291b1df1 | ||
|
|
7805430f4f | ||
|
|
b30be48a24 | ||
|
|
284caf83f6 | ||
|
|
d20c589e42 | ||
|
|
ea9ed3e0be | ||
|
|
c4c549e57a | ||
|
|
b6682330a6 | ||
|
|
b54ee598d8 | ||
|
|
7da11b050c | ||
|
|
94b6a5bbf5 | ||
|
|
5a88d4a669 | ||
|
|
3d6e9ce571 | ||
|
|
987e716374 | ||
|
|
f81bfa1865 | ||
|
|
e4a3e282b5 | ||
|
|
c017522a3c | ||
|
|
6739b51a5b | ||
|
|
3631482419 | ||
|
|
1c61ec2511 | ||
|
|
d0707d78a1 | ||
|
|
083b0fb7a8 | ||
|
|
24d113377b | ||
|
|
5e076325cd | ||
|
|
5aef186c8a | ||
|
|
81f0209006 | ||
|
|
b4e6f20b53 | ||
|
|
a278781abf | ||
|
|
2d82439b56 | ||
|
|
0b0bc87184 | ||
|
|
59fcda43c6 | ||
|
|
6e87e2cb5b | ||
|
|
8730743207 | ||
|
|
4c67007e5b | ||
|
|
0ae1c721ef | ||
|
|
21cce4cfb4 | ||
|
|
d595957405 | ||
|
|
0ce3e4b1e7 | ||
|
|
8419fce062 | ||
|
|
15dbbaf691 | ||
|
|
d8f9d2f160 | ||
|
|
dbda233b94 | ||
|
|
f82336ce8c | ||
|
|
dbc8c7d473 | ||
|
|
2c0cf0d652 | ||
|
|
2db8f77a0a | ||
|
|
0fd0fc5ceb | ||
|
|
0de95e3071 | ||
|
|
b58bff39a0 | ||
|
|
bea763d7f8 | ||
|
|
59a0184ebd | ||
|
|
1a8e3111e4 | ||
|
|
614a7a086a | ||
|
|
b9a1fa8563 | ||
|
|
51ac3ca981 | ||
|
|
192b36f74f | ||
|
|
54e183a7f5 | ||
|
|
453388f744 | ||
|
|
afc2b35ed0 | ||
|
|
9114887866 | ||
|
|
2afb346563 | ||
|
|
bc8f39c311 | ||
|
|
286a3d140d | ||
|
|
5f2b5d940c | ||
|
|
64dd55a9a6 | ||
|
|
eacc57fb44 | ||
|
|
4e2b1cec95 | ||
|
|
08dd89de58 | ||
|
|
c15c5b5227 | ||
|
|
ffd31c50da | ||
|
|
b970cad48b | ||
|
|
752f1faa93 | ||
|
|
60b33d3a91 | ||
|
|
5de306ab7a | ||
|
|
dfe8146f5c | ||
|
|
6610f6f2da | ||
|
|
b319dbb1b2 | ||
|
|
3eae630cfe | ||
|
|
52aef114fa | ||
|
|
7c379e2cda | ||
|
|
244459e606 | ||
|
|
0e561de0a9 | ||
|
|
ceac6c8a47 | ||
|
|
b542f15531 | ||
|
|
3621ab3344 | ||
|
|
4850e13895 | ||
|
|
950e20d400 | ||
|
|
124a8b5f4e | ||
|
|
0bd4d731d2 | ||
|
|
e3a17a66ff | ||
|
|
4f385b9a04 | ||
|
|
2c54787644 | ||
|
|
7770621a2f | ||
|
|
b22fc4266c | ||
|
|
2290e7e762 | ||
|
|
f8344ce7c6 | ||
|
|
1be9ea4828 | ||
|
|
b07016b7cd | ||
|
|
179b74e570 | ||
|
|
0a6f6cb9ac | ||
|
|
417eaeae28 | ||
|
|
8ac1b4ef58 | ||
|
|
979e0da9e0 | ||
|
|
1f8aa0dff0 | ||
|
|
f75a2447a7 | ||
|
|
f6a66b6779 | ||
|
|
c5bad8ec49 | ||
|
|
2f1092de55 | ||
|
|
b825f6e1bd | ||
|
|
ad38f155bc | ||
|
|
5a418499d4 | ||
|
|
cea712e51d | ||
|
|
39d561d9f2 | ||
|
|
23301da51b | ||
|
|
9ab104b38a | ||
|
|
2c517623a1 | ||
|
|
f06d6e067f | ||
|
|
1512908751 | ||
|
|
ed1bc2eece | ||
|
|
0775b529c4 | ||
|
|
aca6174ef4 | ||
|
|
20106b29ba | ||
|
|
c9ee4bf286 | ||
|
|
10a01fa5b4 | ||
|
|
2946127ed7 | ||
|
|
416979cdbd | ||
|
|
1442215ce5 | ||
|
|
ba3bdcd6a1 | ||
|
|
877fb9ea87 | ||
|
|
9d3864b7f0 | ||
|
|
8411ec0787 | ||
|
|
76be4b8c0a | ||
|
|
8236277906 | ||
|
|
b2255cfd24 | ||
|
|
aa8c1a5421 | ||
|
|
7997e6aaf4 | ||
|
|
fa45b8f96e | ||
|
|
b2fbe51659 | ||
|
|
937cb98256 | ||
|
|
9cfeba9ba1 | ||
|
|
e730e3ff63 | ||
|
|
6b580cbb00 | ||
|
|
cb33fe2fc0 | ||
|
|
bff6f7587f | ||
|
|
12a72970fb | ||
|
|
16e1d64b74 | ||
|
|
9dbad4745d | ||
|
|
0e7d1ab65b | ||
|
|
b69eff367c | ||
|
|
54ef114370 | ||
|
|
e984949aa7 | ||
|
|
25be9d5b9b | ||
|
|
46dec78806 | ||
|
|
c8c8736cf3 | ||
|
|
380c5b5588 | ||
|
|
9360de4ef8 | ||
|
|
138e164878 | ||
|
|
410ad22821 | ||
|
|
8d59880d02 | ||
|
|
7d340869fc | ||
|
|
755d218594 | ||
|
|
b304140720 | ||
|
|
a021b71261 | ||
|
|
a89ac67d59 | ||
|
|
426dc3fa47 | ||
|
|
947a70a638 | ||
|
|
9041e73345 | ||
|
|
ea01a536ce | ||
|
|
56f471b1b6 | ||
|
|
9a216682c8 | ||
|
|
e2e5a3919b | ||
|
|
adc7c02782 | ||
|
|
4c85aea7c3 | ||
|
|
5c2076daa1 | ||
|
|
578324348d | ||
|
|
dc3e35a928 | ||
|
|
0ee5259466 | ||
|
|
c3e88adc6d | ||
|
|
c368ce2776 | ||
|
|
2cda1fca69 | ||
|
|
dac0c04d20 | ||
|
|
ab5cb01510 | ||
|
|
bc528ccb77 | ||
|
|
ad6f26c8b4 | ||
|
|
db8c4edb08 | ||
|
|
837dd6184e | ||
|
|
51ece5fd00 | ||
|
|
b3ad95fdfc | ||
|
|
d2fc4e60c6 | ||
|
|
1ea38be404 | ||
|
|
d69b1e0520 | ||
|
|
c11e32f511 | ||
|
|
7558a23243 | ||
|
|
14b1476786 | ||
|
|
989f135d9a | ||
|
|
e13d49f43e | ||
|
|
4e67cd0014 | ||
|
|
db0485c600 | ||
|
|
1f904d4cff | ||
|
|
0a4b017697 | ||
|
|
0fb93061b1 | ||
|
|
bc1131ce41 | ||
|
|
5667526ef6 | ||
|
|
fe5992debd | ||
|
|
ca09151092 | ||
|
|
4ddc6b1c90 | ||
|
|
46bc94fbe8 | ||
|
|
842a9278d0 | ||
|
|
f57e115e99 | ||
|
|
beb566f11e | ||
|
|
2fcacd1e84 | ||
|
|
341b267852 | ||
|
|
398e28ed24 | ||
|
|
69a6c6b821 | ||
|
|
becc74714b | ||
|
|
820b221fa5 | ||
|
|
23f71e1959 | ||
|
|
684fd941fb | ||
|
|
9fc617956d | ||
|
|
02ae14fd6b | ||
|
|
a84d7bd2cb | ||
|
|
84b9264d1d | ||
|
|
0ae6435429 | ||
|
|
c47332e2f1 | ||
|
|
7dcd33f203 | ||
|
|
bed56137e3 | ||
|
|
62faf4d82e | ||
|
|
ba62f9c686 | ||
|
|
6f7192bb12 | ||
|
|
767b9e05b3 | ||
|
|
d60bbb72f7 | ||
|
|
c60252d3ce | ||
|
|
475f26398d | ||
|
|
01c3c19653 | ||
|
|
3907dac198 |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
- name: install monero dependencies
|
||||
run: sudo apt -y install build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libzmq3-dev libsodium-dev libhidapi-dev libnorm-dev libusb-1.0-0-dev libpgm-dev libprotobuf-dev protobuf-compiler
|
||||
- name: install monero gui dependencies
|
||||
run: sudo apt -y install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev libgcrypt20-dev xvfb
|
||||
run: sudo apt -y install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev libgcrypt20-dev xvfb
|
||||
- name: build
|
||||
run: DEV_MODE=ON make release -j3
|
||||
- name: test qml
|
||||
@@ -103,7 +103,7 @@ jobs:
|
||||
docker-linux-static-
|
||||
- name: install dependencies
|
||||
run: sudo apt -y install xvfb libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xkb1 libxkbcommon-x11-0
|
||||
- name: preprare build enviroment
|
||||
- name: prepare build environment
|
||||
run: docker build --tag monero:build-env-linux --build-arg THREADS=3 --file Dockerfile.linux .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-linux sh -c 'make release-static -j3'
|
||||
@@ -130,7 +130,7 @@ jobs:
|
||||
key: docker-windows-static-{hash}
|
||||
restore-keys: |
|
||||
docker-windows-static-
|
||||
- name: preprare build enviroment
|
||||
- name: prepare build environment
|
||||
run: docker build --tag monero:build-env-windows --build-arg THREADS=3 --file Dockerfile.windows .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -w /monero-gui monero:build-env-windows sh -c 'make depends root=/depends target=x86_64-w64-mingw32 tag=win-x64 -j3'
|
||||
@@ -149,7 +149,7 @@ jobs:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: preprare build enviroment
|
||||
- name: prepare build environment
|
||||
run: docker build --tag monero:build-env-android --build-arg THREADS=3 --file Dockerfile.android .
|
||||
- name: build
|
||||
run: docker run --rm -v /home/runner/work/monero-gui/monero-gui:/monero-gui -e THREADS=3 monero:build-env-android
|
||||
|
||||
@@ -5,13 +5,12 @@ message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
|
||||
|
||||
set(VERSION_MAJOR "17")
|
||||
set(VERSION_MINOR "2")
|
||||
set(VERSION_REVISION "1")
|
||||
set(VERSION_REVISION "3")
|
||||
set(VERSION "0.${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}")
|
||||
|
||||
option(STATIC "Link libraries statically, requires static Qt")
|
||||
|
||||
option(USE_DEVICE_TREZOR "Trezor support compilation" ON)
|
||||
option(ENABLE_PASS_STRENGTH_METER "Enable zxcvbn library for password strength" OFF)
|
||||
option(WITH_SCANNER "Enable webcam QR scanner" OFF)
|
||||
option(DEV_MODE "Checkout latest monero master on build" OFF)
|
||||
|
||||
@@ -58,16 +57,13 @@ if(NOT MANUAL_SUBMODULES)
|
||||
endif()
|
||||
|
||||
add_subdirectory(monero)
|
||||
add_subdirectory(external)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
|
||||
set_property(TARGET wallet_merged PROPERTY FOLDER "monero")
|
||||
get_directory_property(ARCH_WIDTH DIRECTORY "monero" DEFINITION ARCH_WIDTH)
|
||||
get_directory_property(UNBOUND_LIBRARY DIRECTORY "monero" DEFINITION UNBOUND_LIBRARY)
|
||||
get_directory_property(DEVICE_TREZOR_READY DIRECTORY "monero" DEFINITION DEVICE_TREZOR_READY)
|
||||
get_directory_property(TREZOR_DEP_LIBS DIRECTORY "monero" DEFINITION TREZOR_DEP_LIBS)
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_definitions(-DQT_NO_DEBUG)
|
||||
@@ -81,13 +77,6 @@ if(STATIC)
|
||||
add_definitions(-DMONERO_GUI_STATIC)
|
||||
endif()
|
||||
|
||||
# Include password strength library
|
||||
if(ENABLE_PASS_STRENGTH_METER)
|
||||
message(STATUS "Building with pass strength meter support.")
|
||||
else()
|
||||
add_definitions(-DDISABLE_PASS_STRENGTH_METER)
|
||||
endif()
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
# force version update
|
||||
@@ -140,18 +129,6 @@ endif()
|
||||
find_library(SODIUM_LIBRARY sodium)
|
||||
message(STATUS "libsodium: libraries at ${SODIUM_LIBRARY}")
|
||||
|
||||
# LibUSB
|
||||
find_package(LibUSB)
|
||||
message(STATUS "libusb: include dir at ${LibUSB_INCLUDE_DIRS}")
|
||||
message(STATUS "libusb: libraries at ${LibUSB_LIBRARIES}")
|
||||
|
||||
# HIDApi
|
||||
if(NOT ANDROID)
|
||||
find_package(HIDAPI REQUIRED)
|
||||
message(STATUS "libhidapi: include dir at ${HIDAPI_INCLUDE_DIRS}")
|
||||
message(STATUS "libhidapi: libraries at ${HIDAPI_LIBRARIES}")
|
||||
endif()
|
||||
|
||||
# Boost
|
||||
if(DEBUG)
|
||||
set(Boost_DEBUG ON)
|
||||
@@ -299,6 +276,7 @@ list(APPEND QT5_LIBRARIES
|
||||
if(STATIC)
|
||||
set(QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/Qt/labs/folderlistmodel)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/Qt/labs/settings)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/Qt/labs/platform)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtGraphicalEffects)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtGraphicalEffects/private)
|
||||
list(APPEND QT5_EXTRA_PATHS ${QT5_PKG_CONFIG_Qt5Qml_PREFIX}/qml/QtMultimedia)
|
||||
@@ -324,6 +302,7 @@ if(STATIC)
|
||||
dialogsprivateplugin
|
||||
qmlfolderlistmodelplugin
|
||||
qmlsettingsplugin
|
||||
qtlabsplatformplugin
|
||||
qmlxmllistmodelplugin
|
||||
qquicklayoutsplugin
|
||||
modelsplugin
|
||||
@@ -332,7 +311,7 @@ if(STATIC)
|
||||
if(WITH_SCANNER)
|
||||
list(APPEND QT5_EXTRA_LIBRARIES_LIST
|
||||
declarative_multimedia
|
||||
Qt5MultimediaQuick_p
|
||||
Qt5MultimediaQuick
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -479,7 +458,7 @@ if (NOT OPENBSD AND NOT (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE
|
||||
add_c_flag_if_supported(-fcf-protection=full C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fcf-protection=full CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
if (NOT WIN32 AND NOT OPENBSD)
|
||||
if (NOT WIN32 AND NOT OPENBSD AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
add_c_flag_if_supported(-fstack-clash-protection C_SECURITY_FLAGS)
|
||||
add_cxx_flag_if_supported(-fstack-clash-protection CXX_SECURITY_FLAGS)
|
||||
endif()
|
||||
@@ -542,26 +521,5 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 ${C_SECURITY_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${CXX_SECURITY_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LD_SECURITY_FLAGS} ${STATIC_FLAGS}")
|
||||
|
||||
if (HIDAPI_FOUND OR LibUSB_COMPILE_TEST_PASSED)
|
||||
if (APPLE)
|
||||
if(DEPENDS)
|
||||
list(APPEND EXTRA_LIBRARIES "-framework Foundation -framework IOKit")
|
||||
else()
|
||||
find_library(COREFOUNDATION CoreFoundation)
|
||||
find_library(IOKIT IOKit)
|
||||
list(APPEND EXTRA_LIBRARIES ${IOKIT})
|
||||
list(APPEND EXTRA_LIBRARIES ${COREFOUNDATION})
|
||||
endif()
|
||||
endif()
|
||||
if (WIN32)
|
||||
find_library(VERSION_LIBRARY version PATHS /usr/x86_64-w64-mingw32/lib)
|
||||
if(VERSION_LIBRARY STREQUAL "VERSION_LIBRARY-NOTFOUND")
|
||||
set(VERSION_LIBRARY Version)
|
||||
endif()
|
||||
list(APPEND EXTRA_LIBRARIES setupapi ${VERSION_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_subdirectory(external)
|
||||
add_subdirectory(translations)
|
||||
add_subdirectory(src)
|
||||
|
||||
@@ -98,7 +98,7 @@ RUN wget -q http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz
|
||||
ARG BOOST_VERSION=1_74_0
|
||||
ARG BOOST_VERSION_DOT=1.74.0
|
||||
ARG BOOST_HASH=83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1
|
||||
RUN wget -q https://dl.bintray.com/boostorg/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \
|
||||
RUN wget -q https://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSION_DOT}/boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
|
||||
&& tar -xf boost_${BOOST_VERSION}.tar.bz2 \
|
||||
&& rm -f boost_${BOOST_VERSION}.tar.bz2 \
|
||||
|
||||
@@ -8,10 +8,12 @@ ENV CPPFLAGS="-fPIC"
|
||||
ENV CXXFLAGS="-fPIC"
|
||||
ENV SOURCE_DATE_EPOCH=1397818193
|
||||
|
||||
RUN apt update
|
||||
RUN apt update && \
|
||||
apt install -y automake autopoint bison gettext git gperf libgl1-mesa-dev libglib2.0-dev \
|
||||
libpng12-dev libpthread-stubs0-dev libsodium-dev libtool-bin libudev-dev libusb-1.0-0-dev mesa-common-dev \
|
||||
pkg-config python wget xutils-dev
|
||||
|
||||
RUN apt install -y automake git pkg-config python xutils-dev && \
|
||||
git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||
RUN git clone -b xorgproto-2020.1 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xorgproto && \
|
||||
cd xorgproto && \
|
||||
git reset --hard c62e8203402cafafa5ba0357b6d1c019156c9f36 && \
|
||||
./autogen.sh && \
|
||||
@@ -27,8 +29,7 @@ RUN git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/proto/xcbpro
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libtool-bin && \
|
||||
git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||
RUN git clone -b libXau-1.0.9 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxau && \
|
||||
cd libxau && \
|
||||
git reset --hard d9443b2c57b512cfb250b35707378654d86c7dea && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
@@ -36,8 +37,7 @@ RUN apt install -y libtool-bin && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libpthread-stubs0-dev && \
|
||||
git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||
RUN git clone -b 1.12 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb && \
|
||||
cd libxcb && \
|
||||
git reset --hard d34785a34f28fa6a00f8ce00d87e3132ff0f6467 && \
|
||||
./autogen.sh --enable-shared --disable-static && \
|
||||
@@ -105,8 +105,7 @@ RUN git clone -b 0.4.1 --depth 1 https://gitlab.freedesktop.org/xorg/lib/libxcb-
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y bison && \
|
||||
git clone -b xkbcommon-0.5.0 --depth 1 https://github.com/xkbcommon/libxkbcommon && \
|
||||
RUN git clone -b xkbcommon-0.5.0 --depth 1 https://github.com/xkbcommon/libxkbcommon && \
|
||||
cd libxkbcommon && \
|
||||
git reset --hard c43c3c866eb9d52cd8f61e75cbef1c30d07f3a28 && \
|
||||
./autogen.sh --prefix=/usr --enable-shared --disable-static --enable-x11 --disable-docs && \
|
||||
@@ -140,8 +139,7 @@ RUN git clone -b R_2_2_9 --depth 1 https://github.com/libexpat/libexpat && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y autopoint gettext gperf libpng12-dev && \
|
||||
git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||
RUN git clone -b 2.13.92 --depth 1 https://gitlab.freedesktop.org/fontconfig/fontconfig && \
|
||||
cd fontconfig && \
|
||||
git reset --hard b1df1101a643ae16cdfa1d83b939de2497b1bf27 && \
|
||||
./autogen.sh --disable-shared --enable-static --sysconfdir=/etc --localstatedir=/var && \
|
||||
@@ -157,8 +155,7 @@ RUN git clone -b release-64-2 --depth 1 https://github.com/unicode-org/icu && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y wget && \
|
||||
wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz && \
|
||||
RUN wget https://downloads.sourceforge.net/project/boost/boost/1.73.0/boost_1_73_0.tar.gz && \
|
||||
echo "9995e192e68528793755692917f9eb6422f3052a53c5e13ba278a228af6c7acf boost_1_73_0.tar.gz" | sha256sum -c && \
|
||||
tar -xzf boost_1_73_0.tar.gz && \
|
||||
rm boost_1_73_0.tar.gz && \
|
||||
@@ -177,8 +174,7 @@ RUN wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libgl1-mesa-dev libglib2.0-dev mesa-common-dev && \
|
||||
rm /usr/lib/x86_64-linux-gnu/libX11.a && \
|
||||
RUN rm /usr/lib/x86_64-linux-gnu/libX11.a && \
|
||||
rm /usr/lib/x86_64-linux-gnu/libXext.a && \
|
||||
rm /usr/lib/x86_64-linux-gnu/libX11-xcb.a && \
|
||||
git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 && \
|
||||
@@ -218,8 +214,7 @@ RUN apt install -y libgl1-mesa-dev libglib2.0-dev mesa-common-dev && \
|
||||
cd ../../../.. && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libudev-dev && \
|
||||
git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
RUN git clone -b v1.0.23 --depth 1 https://github.com/libusb/libusb && \
|
||||
cd libusb && \
|
||||
git reset --hard e782eeb2514266f6738e242cdcb18e3ae1ed06fa && \
|
||||
./autogen.sh --disable-shared --enable-static && \
|
||||
@@ -236,8 +231,7 @@ RUN git clone -b hidapi-0.9.0 --depth 1 https://github.com/libusb/hidapi && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libsodium-dev && \
|
||||
git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
RUN git clone -b v4.3.2 --depth 1 https://github.com/zeromq/libzmq && \
|
||||
cd libzmq && \
|
||||
git reset --hard a84ffa12b2eb3569ced199660bac5ad128bff1f0 && \
|
||||
./autogen.sh && \
|
||||
@@ -280,5 +274,3 @@ RUN git clone -b v3.18.4 --depth 1 https://github.com/Kitware/CMake && \
|
||||
make -j$THREADS && \
|
||||
make -j$THREADS install && \
|
||||
rm -rf $(pwd)
|
||||
|
||||
RUN apt install -y libusb-1.0-0-dev
|
||||
|
||||
2
Makefile
2
Makefile
@@ -31,7 +31,7 @@ endif
|
||||
default:
|
||||
mkdir -p build && cd build && cmake -D ARCH="x86-64" -D DEV_MODE=$(or ${DEV_MODE},OFF) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release .. && $(MAKE)
|
||||
debug:
|
||||
mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} .. && $(MAKE) VERBOSE=1
|
||||
mkdir -p build && cd build && cmake -D DEV_MODE=$(or ${DEV_MODE},ON) -DMANUAL_SUBMODULES=${MANUAL_SUBMODULES} -D CMAKE_BUILD_TYPE=Debug .. && $(MAKE) VERBOSE=1
|
||||
|
||||
depends:
|
||||
mkdir -p build/$(target)/release
|
||||
|
||||
@@ -116,6 +116,12 @@ Rectangle {
|
||||
transferView.sendTo(address, paymentId, description);
|
||||
}
|
||||
|
||||
// open Transactions page with search term in search field
|
||||
function searchInHistory(searchTerm){
|
||||
root.state = "History";
|
||||
historyView.searchInHistory(searchTerm);
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "History"
|
||||
|
||||
27
README.md
27
README.md
@@ -2,12 +2,29 @@
|
||||
|
||||
Copyright (c) 2014-2019, The Monero Project
|
||||
|
||||
## Table of Contents
|
||||
* [Development resources](#development-resources)
|
||||
* [Vulnerability response](#vulnerability-response)
|
||||
* [Introduction](#introduction)
|
||||
* [About this project](#about-this-project)
|
||||
* [Supporting the project](#supporting-the-project)
|
||||
* [License](#license)
|
||||
* [Translations](#translations)
|
||||
* [Installing the Monero GUI from a package](#installing-the-monero-gui-from-a-package)
|
||||
* [Compiling the Monero GUI from source](#compiling-the-monero-gui-from-source)
|
||||
+ [Building Reproducible Windows static binaries with Docker (any OS)](#building-reproducible-windows-static-binaries-with-docker-any-os)
|
||||
+ [Building Reproducible Linux static binaries with Docker (any OS)](#building-reproducible-linux-static-binaries-with-docker-any-os)
|
||||
+ [Building Android APK with Docker (any OS) *Experimental*](#building-android-apk-with-docker-any-os-experimental)
|
||||
+ [Building on Linux](#building-on-linux)
|
||||
+ [Building on OS X](#building-on-os-x)
|
||||
+ [Building on Windows](#building-on-windows)
|
||||
|
||||
## Development resources
|
||||
|
||||
- Web: [getmonero.org](https://getmonero.org)
|
||||
- Mail: [dev@getmonero.org](mailto:dev@getmonero.org)
|
||||
- Github: [https://github.com/monero-project/monero-gui](https://github.com/monero-project/monero-gui)
|
||||
- IRC: [#monero-dev on Freenode](irc://chat.freenode.net/#monero-dev)
|
||||
- IRC: [#monero-gui on Libera](irc://irc.libera.chat/#monero-gui)
|
||||
- Translation platform (Weblate): [translate.getmonero.org](https://translate.getmonero.org)
|
||||
- UI Design: [Monero-GUI on Figma](https://www.figma.com/file/DplJ2DDQfIKiuRvolHX2hN/Monero-GUI)
|
||||
|
||||
@@ -180,7 +197,7 @@ Packaging for your favorite distribution would be a welcome contribution!
|
||||
http://<your.local.ip>:8080/QtApp-debug.apk
|
||||
```
|
||||
|
||||
### On Linux:
|
||||
### Building on Linux
|
||||
|
||||
(Tested on Ubuntu 17.10 x64, Ubuntu 18.04 x64 and Gentoo x64)
|
||||
|
||||
@@ -208,7 +225,7 @@ The following instructions will fetch Qt from your distribution's repositories i
|
||||
|
||||
- For Ubuntu 17.10+
|
||||
|
||||
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
|
||||
`sudo apt install qtbase5-dev qt5-default qtdeclarative5-dev qml-module-qtqml-models2 qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs qml-module-qtquick-xmllistmodel qml-module-qt-labs-settings qml-module-qt-labs-platform qml-module-qt-labs-folderlistmodel qttools5-dev-tools qml-module-qtquick-templates2 libqt5svg5-dev`
|
||||
|
||||
- For Gentoo
|
||||
|
||||
@@ -244,7 +261,7 @@ The following instructions will fetch Qt from your distribution's repositories i
|
||||
|
||||
The executable can be found in the build/release/bin folder.
|
||||
|
||||
### On OS X:
|
||||
### Building on OS X
|
||||
|
||||
1. Install Xcode from AppStore
|
||||
|
||||
@@ -277,7 +294,7 @@ The executable can be found in the `build/release/bin` folder.
|
||||
|
||||
For building an application bundle see `DEPLOY.md`.
|
||||
|
||||
### On Windows:
|
||||
### Building on Windows
|
||||
|
||||
The Monero GUI on Windows is 64 bits only; 32-bit Windows GUI builds are not officially supported anymore.
|
||||
|
||||
|
||||
@@ -17,11 +17,7 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
||||
add_custom_command(TARGET deploy
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy ${_qt_svg_dylib} $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets" "@executable_path/../Frameworks/ QtGui.framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtSvg.framework/Versions/5/QtSvg" "@executable_path/../Frameworks/QtGui.fr amework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtGui. framework/Versions/5/QtGui" $<TARGET_FILE_DIR:monero-wallet-gui>/../PlugIns/imageformats/libqsvg.dylib
|
||||
COMMENT "Copying libqsvg.dylib, running install_name_tool"
|
||||
COMMENT "Copying libqsvg.dylib"
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -78,19 +74,19 @@ if(APPLE OR (WIN32 AND NOT STATIC))
|
||||
)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudtd67.dll
|
||||
libicuind67.dll
|
||||
libicuiod67.dll
|
||||
libicutud67.dll
|
||||
libicuucd67.dll
|
||||
libicudtd68.dll
|
||||
libicuind68.dll
|
||||
libicuiod68.dll
|
||||
libicutud68.dll
|
||||
libicuucd68.dll
|
||||
)
|
||||
else() # assume release
|
||||
list(APPEND WIN_DEPLOY_DLLS
|
||||
libicudt67.dll
|
||||
libicuin67.dll
|
||||
libicuio67.dll
|
||||
libicutu67.dll
|
||||
libicuuc67.dll
|
||||
libicudt68.dll
|
||||
libicuin68.dll
|
||||
libicuio68.dll
|
||||
libicutu68.dll
|
||||
libicuuc68.dll
|
||||
)
|
||||
endif()
|
||||
list(TRANSFORM WIN_DEPLOY_DLLS PREPEND "$ENV{MSYSTEM_PREFIX}/bin/")
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
# - try to find HIDAPI library
|
||||
# from http://www.signal11.us/oss/hidapi/
|
||||
#
|
||||
# Cache Variables: (probably not for direct use in your scripts)
|
||||
# HIDAPI_INCLUDE_DIR
|
||||
# HIDAPI_LIBRARY
|
||||
#
|
||||
# Non-cache variables you might use in your CMakeLists.txt:
|
||||
# HIDAPI_FOUND
|
||||
# HIDAPI_INCLUDE_DIRS
|
||||
# HIDAPI_LIBRARIES
|
||||
#
|
||||
# Requires these CMake modules:
|
||||
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
|
||||
#
|
||||
# Original Author:
|
||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||
# http://academic.cleardefinition.com
|
||||
# Iowa State University HCI Graduate Program/VRAC
|
||||
#
|
||||
# Copyright Iowa State University 2009-2010.
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
find_library(HIDAPI_LIBRARY
|
||||
NAMES hidapi hidapi-libusb)
|
||||
|
||||
find_path(HIDAPI_INCLUDE_DIR
|
||||
NAMES hidapi.h
|
||||
PATH_SUFFIXES
|
||||
hidapi)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(HIDAPI
|
||||
DEFAULT_MSG
|
||||
HIDAPI_LIBRARY
|
||||
HIDAPI_INCLUDE_DIR)
|
||||
|
||||
if(HIDAPI_FOUND)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARY}")
|
||||
if((STATIC AND UNIX AND NOT APPLE) OR (DEPENDS AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
|
||||
find_library(LIBUSB-1.0_LIBRARY usb-1.0)
|
||||
find_library(LIBUDEV_LIBRARY udev)
|
||||
if(LIBUSB-1.0_LIBRARY)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARIES};${LIBUSB-1.0_LIBRARY}")
|
||||
if(LIBUDEV_LIBRARY)
|
||||
set(HIDAPI_LIBRARIES "${HIDAPI_LIBRARIES};${LIBUDEV_LIBRARY}")
|
||||
else()
|
||||
message(WARNING "libudev library not found, binaries may fail to link.")
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "libusb-1.0 library not found, binaries may fail to link.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(HIDAPI_INCLUDE_DIRS "${HIDAPI_INCLUDE_DIR}")
|
||||
endif()
|
||||
|
||||
mark_as_advanced(HIDAPI_INCLUDE_DIR HIDAPI_LIBRARY)
|
||||
@@ -1,149 +0,0 @@
|
||||
# - Find libusb for portable USB support
|
||||
# This module will find libusb as published by
|
||||
# http://libusb.sf.net and
|
||||
# http://libusb-win32.sf.net
|
||||
#
|
||||
# It will use PkgConfig if present and supported, else search
|
||||
# it on its own. If the LibUSB_ROOT_DIR environment variable
|
||||
# is defined, it will be used as base path.
|
||||
# The following standard variables get defined:
|
||||
# LibUSB_FOUND: true if LibUSB was found
|
||||
# LibUSB_HEADER_FILE: the location of the C header file
|
||||
# LibUSB_INCLUDE_DIRS: the directory that contains the include file
|
||||
# LibUSB_LIBRARIES: the library
|
||||
# source: https://github.com/IntelRealSense/librealsense
|
||||
|
||||
include ( CheckLibraryExists )
|
||||
include ( CheckIncludeFile )
|
||||
|
||||
find_package ( PkgConfig )
|
||||
if ( PKG_CONFIG_FOUND )
|
||||
pkg_check_modules ( PKGCONFIG_LIBUSB libusb-1.0 )
|
||||
if ( NOT PKGCONFIG_LIBUSB_FOUND )
|
||||
pkg_check_modules ( PKGCONFIG_LIBUSB libusb )
|
||||
endif ( NOT PKGCONFIG_LIBUSB_FOUND )
|
||||
endif ( PKG_CONFIG_FOUND )
|
||||
|
||||
if ( PKGCONFIG_LIBUSB_FOUND )
|
||||
set ( LibUSB_INCLUDE_DIRS ${PKGCONFIG_LIBUSB_INCLUDE_DIRS} )
|
||||
foreach ( i ${PKGCONFIG_LIBUSB_LIBRARIES} )
|
||||
string ( REGEX MATCH "[^-]*" ibase "${i}" )
|
||||
find_library ( ${ibase}_LIBRARY
|
||||
NAMES ${i}
|
||||
PATHS ${PKGCONFIG_LIBUSB_LIBRARY_DIRS}
|
||||
)
|
||||
if ( ${ibase}_LIBRARY )
|
||||
list ( APPEND LibUSB_LIBRARIES ${${ibase}_LIBRARY} )
|
||||
endif ( ${ibase}_LIBRARY )
|
||||
mark_as_advanced ( ${ibase}_LIBRARY )
|
||||
endforeach ( i )
|
||||
|
||||
else ( PKGCONFIG_LIBUSB_FOUND )
|
||||
find_file ( LibUSB_HEADER_FILE
|
||||
NAMES
|
||||
libusb.h usb.h
|
||||
PATHS
|
||||
$ENV{ProgramFiles}/LibUSB-Win32
|
||||
$ENV{LibUSB_ROOT_DIR}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
libusb-1.0
|
||||
include/libusb-1.0
|
||||
)
|
||||
mark_as_advanced ( LibUSB_HEADER_FILE )
|
||||
get_filename_component ( LibUSB_INCLUDE_DIRS "${LibUSB_HEADER_FILE}" PATH )
|
||||
|
||||
if ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
|
||||
# LibUSB-Win32 binary distribution contains several libs.
|
||||
# Use the lib that got compiled with the same compiler.
|
||||
if ( MSVC )
|
||||
if ( WIN32 )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/msvc )
|
||||
else ( WIN32 )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/msvc_x64 )
|
||||
endif ( WIN32 )
|
||||
elseif ( BORLAND )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/bcc )
|
||||
elseif ( CMAKE_COMPILER_IS_GNUCC )
|
||||
set ( LibUSB_LIBRARY_PATH_SUFFIX lib/gcc )
|
||||
endif ( MSVC )
|
||||
endif ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" )
|
||||
|
||||
find_library ( usb_LIBRARY
|
||||
NAMES
|
||||
usb-1.0 libusb usb
|
||||
PATHS
|
||||
$ENV{ProgramFiles}/LibUSB-Win32
|
||||
$ENV{LibUSB_ROOT_DIR}
|
||||
PATH_SUFFIXES
|
||||
${LibUSB_LIBRARY_PATH_SUFFIX}
|
||||
)
|
||||
mark_as_advanced ( usb_LIBRARY )
|
||||
if ( usb_LIBRARY )
|
||||
set ( LibUSB_LIBRARIES ${usb_LIBRARY} )
|
||||
endif ( usb_LIBRARY )
|
||||
|
||||
endif ( PKGCONFIG_LIBUSB_FOUND )
|
||||
|
||||
if ( LibUSB_INCLUDE_DIRS AND LibUSB_LIBRARIES )
|
||||
set ( LibUSB_FOUND true )
|
||||
endif ( LibUSB_INCLUDE_DIRS AND LibUSB_LIBRARIES )
|
||||
|
||||
if ( LibUSB_FOUND )
|
||||
set ( CMAKE_REQUIRED_INCLUDES "${LibUSB_INCLUDE_DIRS}" )
|
||||
check_include_file ( "${LibUSB_HEADER_FILE}" LibUSB_FOUND )
|
||||
endif ( LibUSB_FOUND )
|
||||
|
||||
if ( LibUSB_FOUND )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" usb_open "" LibUSB_FOUND )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" libusb_get_device_list "" LibUSB_VERSION_1.0 )
|
||||
check_library_exists ( "${LibUSB_LIBRARIES}" libusb_get_port_numbers "" LibUSB_VERSION_1.0.16 )
|
||||
|
||||
if((STATIC AND UNIX AND NOT APPLE) OR (DEPENDS AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
|
||||
find_library(LIBUDEV_LIBRARY udev)
|
||||
if(LIBUDEV_LIBRARY)
|
||||
set(LibUSB_LIBRARIES "${LibUSB_LIBRARIES};${LIBUDEV_LIBRARY}")
|
||||
else()
|
||||
message(WARNING "libudev library not found, binaries may fail to link.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Library 1.0.16+ compilation test.
|
||||
# The check_library_exists does not work well on Apple with shared libs.
|
||||
if (APPLE OR LibUSB_VERSION_1.0.16 OR STATIC)
|
||||
if (APPLE)
|
||||
if(DEPENDS)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES "-framework Foundation -framework IOKit")
|
||||
else()
|
||||
find_library(COREFOUNDATION CoreFoundation)
|
||||
find_library(IOKIT IOKit)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${IOKIT})
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${COREFOUNDATION})
|
||||
endif()
|
||||
endif()
|
||||
if (WIN32)
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES setupapi)
|
||||
endif()
|
||||
list(APPEND TEST_COMPILE_EXTRA_LIBRARIES ${LibUSB_LIBRARIES})
|
||||
|
||||
try_compile(LibUSB_COMPILE_TEST_PASSED
|
||||
${CMAKE_BINARY_DIR}
|
||||
"${CMAKE_SOURCE_DIR}/cmake/test-libusb-version.c"
|
||||
CMAKE_FLAGS
|
||||
"-DINCLUDE_DIRECTORIES=${LibUSB_INCLUDE_DIRS}"
|
||||
"-DLINK_DIRECTORIES=${LibUSB_LIBRARIES}"
|
||||
LINK_LIBRARIES ${TEST_COMPILE_EXTRA_LIBRARIES}
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
unset(TEST_COMPILE_EXTRA_LIBRARIES)
|
||||
message(STATUS "LibUSB Compilation test: ${LibUSB_COMPILE_TEST_PASSED}")
|
||||
endif()
|
||||
endif ( LibUSB_FOUND )
|
||||
|
||||
if ( NOT LibUSB_FOUND )
|
||||
if ( NOT LibUSB_FIND_QUIETLY )
|
||||
message ( STATUS "LibUSB not found, try setting LibUSB_ROOT_DIR environment variable." )
|
||||
endif ( NOT LibUSB_FIND_QUIETLY )
|
||||
if ( LibUSB_FIND_REQUIRED )
|
||||
message ( FATAL_ERROR "" )
|
||||
endif ( LibUSB_FIND_REQUIRED )
|
||||
endif ( NOT LibUSB_FOUND )
|
||||
@@ -1,19 +1,17 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
RowLayout {
|
||||
id: advancedOptionsItem
|
||||
|
||||
|
||||
property alias title: title.text
|
||||
property alias tooltip: title.tooltip
|
||||
property alias button1: button1
|
||||
property alias button2: button2
|
||||
property alias button3: button3
|
||||
property alias helpTextLarge: helpTextLarge
|
||||
property alias helpTextSmall: helpTextSmall
|
||||
|
||||
|
||||
RowLayout {
|
||||
id: titlecolumn
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
@@ -24,24 +22,9 @@ RowLayout {
|
||||
MoneroComponents.Label {
|
||||
id: title
|
||||
fontSize: 14
|
||||
tooltipIconVisible: true
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: iconLabel
|
||||
fontSize: 12
|
||||
text: FontAwesome.questionCircle
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
opacity: 0.3
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: helpText.visible = !helpText.visible
|
||||
onEntered: parent.opacity = 0.4
|
||||
onExited: parent.opacity = 0.3
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: separator
|
||||
Layout.fillWidth: true
|
||||
@@ -78,29 +61,5 @@ RowLayout {
|
||||
visible: button3.text
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: helpText
|
||||
visible: false
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: helpTextLarge
|
||||
visible: helpTextLarge.text
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 13
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: helpTextSmall
|
||||
visible: helpTextSmall.text
|
||||
Layout.leftMargin: 5
|
||||
textFormat: Text.RichText
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 12
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,8 @@ Item {
|
||||
property int fontSize: 14
|
||||
property alias fontColor: label.color
|
||||
property bool iconOnTheLeft: true
|
||||
property alias tooltipIconVisible: label.tooltipIconVisible
|
||||
property alias tooltip: label.tooltip
|
||||
signal clicked()
|
||||
|
||||
height: 25
|
||||
@@ -121,7 +123,10 @@ Item {
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: !label.tooltipIconVisible && label.tooltip ? label.tooltipPopup.open() : ""
|
||||
onExited: !label.tooltipIconVisible && label.tooltip ? label.tooltipPopup.close() : ""
|
||||
onClicked: {
|
||||
toggle()
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ import QtQuick.Controls 2.2 as QtQuickControls2
|
||||
import QtQuick.Layouts 1.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import QtQuick.Controls.Styles 1.2
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
@@ -91,8 +92,8 @@ Item {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: parent.height - 1
|
||||
anchors.leftMargin: datePicker.expanded ? 1 : 0
|
||||
anchors.rightMargin: datePicker.expanded ? 1 : 0
|
||||
anchors.leftMargin: 0
|
||||
anchors.rightMargin: 0
|
||||
radius: 4
|
||||
y: 1
|
||||
color: datePicker.backgroundColor
|
||||
@@ -221,21 +222,18 @@ Item {
|
||||
Layout.fillWidth: true
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
MoneroEffects.ImageMask {
|
||||
id: button
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
source: "qrc:///images/whiteDropIndicator.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: button
|
||||
anchors.fill: button
|
||||
image: "qrc:///images/whiteDropIndicator.png"
|
||||
height: 8
|
||||
width: 12
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowDown
|
||||
fontAwesomeFallbackSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
rotation: datePicker.expanded ? 180 : 0
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
@@ -252,12 +250,16 @@ Item {
|
||||
id: popup
|
||||
padding: 0
|
||||
closePolicy: QtQuickControls2.Popup.CloseOnEscape | QtQuickControls2.Popup.CloseOnPressOutsideParent
|
||||
onOpened: {
|
||||
calendar.visibleMonth = currentDate.getMonth();
|
||||
calendar.visibleYear = currentDate.getFullYear();
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: calendarRect
|
||||
width: head.width
|
||||
x: head.x
|
||||
y: head.y + head.height + 10
|
||||
y: head.y + head.height - 2
|
||||
|
||||
color: MoneroComponents.Style.middlePanelBackgroundColor
|
||||
border.width: 1
|
||||
@@ -266,11 +268,16 @@ Item {
|
||||
clip: true
|
||||
|
||||
Behavior on height {
|
||||
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
|
||||
NumberAnimation { duration: 150; easing.type: Easing.InQuad }
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
scrollGestureEnabled: false
|
||||
onWheel: {
|
||||
if (wheel.angleDelta.y > 0) return calendar.showPreviousMonth();
|
||||
if (wheel.angleDelta.y < 0) return calendar.showNextMonth();
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
@@ -305,11 +312,6 @@ Item {
|
||||
id: dayRect
|
||||
anchors.fill: parent
|
||||
radius: parent.implicitHeight / 2
|
||||
color: {
|
||||
if(dayArea.pressed && styleData.visibleMonth)
|
||||
return MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
|
||||
return "transparent";
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
@@ -327,19 +329,32 @@ Item {
|
||||
text: styleData.date.getDate()
|
||||
themeTransition: false
|
||||
color: {
|
||||
if(!styleData.visibleMonth) return MoneroComponents.Style.lightGreyFontColor
|
||||
if(dayArea.pressed) return MoneroComponents.Style.defaultFontColor
|
||||
if(styleData.today) return MoneroComponents.Style.orange
|
||||
return MoneroComponents.Style.defaultFontColor
|
||||
if (currentDate.toDateString() === styleData.date.toDateString()) {
|
||||
if (dayArea.containsMouse) {
|
||||
dayRect.color = MoneroComponents.Style.buttonBackgroundColorHover;
|
||||
} else {
|
||||
dayRect.color = MoneroComponents.Style.buttonBackgroundColor;
|
||||
}
|
||||
} else {
|
||||
if (dayArea.containsMouse) {
|
||||
dayRect.color = MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
|
||||
} else {
|
||||
dayRect.color = "transparent";
|
||||
}
|
||||
}
|
||||
if(!styleData.valid) return "transparent"
|
||||
if(styleData.date.toDateString() === (new Date()).toDateString()) return "#FFFF00"
|
||||
if(!styleData.visibleMonth) return MoneroComponents.Style.lightGreyFontColor
|
||||
if(dayArea.pressed) return MoneroComponents.Style.defaultFontColor
|
||||
return MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: dayArea
|
||||
anchors.fill: parent
|
||||
visible: styleData.valid
|
||||
hoverEnabled: true
|
||||
onEntered: dayRect.color = MoneroComponents.Style.blackTheme ? "#20FFFFFF" : "#10000000"
|
||||
onExited: dayRect.color = "transparent"
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
if(styleData.visibleMonth) {
|
||||
@@ -397,18 +412,15 @@ Item {
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
|
||||
Image {
|
||||
MoneroEffects.ImageMask {
|
||||
id: prevMonthIcon
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/prevMonth.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: prevMonthIcon
|
||||
anchors.fill: prevMonthIcon
|
||||
image: "qrc:///images/prevMonth.png"
|
||||
height: 8
|
||||
width: 12
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowLeft
|
||||
fontAwesomeFallbackSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
@@ -426,19 +438,16 @@ Item {
|
||||
anchors.bottom: parent.bottom
|
||||
width: height
|
||||
|
||||
Image {
|
||||
MoneroEffects.ImageMask {
|
||||
id: nextMonthIcon
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/prevMonth.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: nextMonthIcon
|
||||
anchors.fill: nextMonthIcon
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
image: "qrc:///images/prevMonth.png"
|
||||
height: 8
|
||||
width: 12
|
||||
rotation: 180
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowLeft
|
||||
fontAwesomeFallbackSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
|
||||
@@ -36,19 +36,28 @@ MoneroEffects.ImageMask {
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
image: ""
|
||||
|
||||
property alias tooltip: tooltip.text
|
||||
signal clicked(var mouse)
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: tooltip
|
||||
anchors.fill: parent
|
||||
tooltipLeft: true
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
|
||||
onEntered: {
|
||||
tooltip.text ? tooltip.tooltipPopup.open() : ""
|
||||
button.width = button.width + 2
|
||||
button.height = button.height + 2
|
||||
}
|
||||
|
||||
onExited: {
|
||||
tooltip.text ? tooltip.tooltipPopup.close() : ""
|
||||
button.width = button.width - 2
|
||||
button.height = button.height - 2
|
||||
}
|
||||
|
||||
@@ -43,8 +43,12 @@ Item {
|
||||
property alias text: inlineText.text
|
||||
property alias fontPixelSize: inlineText.font.pixelSize
|
||||
property alias fontFamily: inlineText.font.family
|
||||
property alias fontStyleName: inlineText.font.styleName
|
||||
property bool isFontAwesomeIcon: fontFamily == FontAwesome.fontFamily || fontFamily == FontAwesome.fontFamilySolid
|
||||
property alias buttonColor: rect.color
|
||||
property alias tooltip: tooltip.text
|
||||
property alias tooltipLeft: tooltip.tooltipLeft
|
||||
property alias tooltipBottom: tooltip.tooltipBottom
|
||||
|
||||
height: isFontAwesomeIcon ? 30 : 24
|
||||
width: isFontAwesomeIcon ? height : inlineText.width + 16
|
||||
@@ -81,17 +85,27 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: tooltip
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
cursorShape: rect.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
onClicked: doClick()
|
||||
onClicked: {
|
||||
tooltip.text ? tooltip.tooltipPopup.close() : ""
|
||||
doClick()
|
||||
}
|
||||
onEntered: {
|
||||
tooltip.text ? tooltip.tooltipPopup.open() : ""
|
||||
rect.color = buttonColor ? buttonColor : "#707070";
|
||||
rect.opacity = 0.8;
|
||||
}
|
||||
onExited: {
|
||||
tooltip.text ? tooltip.tooltipPopup.close() : ""
|
||||
rect.opacity = 1.0;
|
||||
rect.color = buttonColor ? buttonColor : "#808080";
|
||||
}
|
||||
|
||||
@@ -129,6 +129,7 @@ Item {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
primary: false
|
||||
small: true
|
||||
width: 120
|
||||
fontSize: 14
|
||||
|
||||
@@ -34,7 +34,10 @@ import "../components" as MoneroComponents
|
||||
Item {
|
||||
id: item
|
||||
property alias text: label.text
|
||||
property alias tooltip: label.tooltip
|
||||
property alias tooltipIconVisible: label.tooltipIconVisible
|
||||
property alias color: label.color
|
||||
property alias labelMouseArea: labelMouseArea
|
||||
property int textFormat: Text.PlainText
|
||||
property string tipText: ""
|
||||
property int fontSize: 16
|
||||
@@ -70,9 +73,13 @@ Item {
|
||||
onLinkActivated: item.linkActivated()
|
||||
textFormat: parent.textFormat
|
||||
MouseArea {
|
||||
id: labelMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
cursorShape: parent.hoveredLink || (tooltip && !tooltipIconVisible) ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
onEntered: tooltip && !tooltipIconVisible ? parent.tooltipPopup.open() : undefined
|
||||
onExited: tooltip && !tooltipIconVisible ? parent.tooltipPopup.close() : undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,17 +37,6 @@ import QtQuick.Controls 2.0
|
||||
Drawer {
|
||||
id: sideBar
|
||||
|
||||
// @TODO: Qt 5.10 introduces `opened` built-in for Drawer
|
||||
property bool isOpened: false
|
||||
|
||||
onClosed: {
|
||||
isOpened = false;
|
||||
}
|
||||
|
||||
onOpened: {
|
||||
isOpened = true;
|
||||
}
|
||||
|
||||
width: 240
|
||||
height: parent.height - (persistentSettings.customDecorations ? 50 : 0)
|
||||
y: titleBar.height
|
||||
@@ -64,26 +53,64 @@ Drawer {
|
||||
color: "red"
|
||||
|
||||
ListView {
|
||||
id: languagesListView
|
||||
clip: true
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
width: sideBar.width
|
||||
height: sideBar.height
|
||||
focus: true
|
||||
|
||||
model: langModel
|
||||
|
||||
Keys.onUpPressed: currentIndex !== 0 ? currentIndex = currentIndex - 1 : ""
|
||||
Keys.onBacktabPressed: currentIndex !== 0 ? currentIndex = currentIndex - 1 : ""
|
||||
Keys.onDownPressed: currentIndex + 1 !== count ? currentIndex = currentIndex + 1 : ""
|
||||
Keys.onTabPressed: currentIndex + 1 !== count ? currentIndex = currentIndex + 1 : ""
|
||||
|
||||
delegate: Rectangle {
|
||||
id: item
|
||||
color: "transparent"
|
||||
color: index == languagesListView.currentIndex ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
width: sideBar.width
|
||||
height: 32
|
||||
|
||||
Accessible.role: Accessible.ListItem
|
||||
Accessible.name: display_name
|
||||
Keys.onEnterPressed: setSelectedItemAsLanguage();
|
||||
Keys.onReturnPressed: setSelectedItemAsLanguage();
|
||||
Keys.onSpacePressed: setSelectedItemAsLanguage();
|
||||
|
||||
function setSelectedItemAsLanguage() {
|
||||
var locale_spl = locale.split("_");
|
||||
|
||||
// reload active translations
|
||||
console.log(locale_spl[0]);
|
||||
translationManager.setLanguage(locale_spl[0]);
|
||||
|
||||
// set wizard language settings
|
||||
persistentSettings.locale = locale;
|
||||
persistentSettings.language = display_name;
|
||||
persistentSettings.language_wallet = wallet_language;
|
||||
|
||||
appWindow.showStatusMessage(qsTr("Language changed."), 3);
|
||||
appWindow.toggleLanguageView();
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: selectedIndicator
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 0
|
||||
height: parent.height
|
||||
width: 2
|
||||
color: index == languagesListView.currentIndex ? MoneroComponents.Style.buttonBackgroundColor : "transparent"
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: flagRect
|
||||
height: 24
|
||||
width: 24
|
||||
anchors.left: parent.left
|
||||
anchors.left: selectedIndicator.right
|
||||
anchors.leftMargin: 4
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: "transparent"
|
||||
@@ -96,8 +123,8 @@ Drawer {
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 30
|
||||
font.bold: true
|
||||
anchors.leftMargin: 32
|
||||
font.bold: languagesListView.currentIndex == index ? true : false
|
||||
font.pixelSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: display_name
|
||||
@@ -123,21 +150,7 @@ Drawer {
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
var locale_spl = locale.split("_");
|
||||
|
||||
// reload active translations
|
||||
console.log(locale_spl[0]);
|
||||
translationManager.setLanguage(locale_spl[0]);
|
||||
|
||||
// set wizard language settings
|
||||
persistentSettings.locale = locale;
|
||||
persistentSettings.language = display_name;
|
||||
persistentSettings.language_wallet = wallet_language;
|
||||
|
||||
appWindow.showStatusMessage(qsTr("Language changed."), 3);
|
||||
appWindow.toggleLanguageView();
|
||||
}
|
||||
onClicked: setSelectedItemAsLanguage();
|
||||
hoverEnabled: true
|
||||
onEntered: {
|
||||
// item.color = "#26FFFFFF"
|
||||
@@ -177,4 +190,12 @@ Drawer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function selectCurrentLanguage() {
|
||||
for (var i = 0; i < langModel.count; ++i) {
|
||||
if (langModel.get(i).display_name === persistentSettings.language) {
|
||||
languagesListView.currentIndex = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,14 +33,21 @@ import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
|
||||
Item {
|
||||
ColumnLayout {
|
||||
id: item
|
||||
Layout.fillWidth: true
|
||||
|
||||
default property alias content: inlineButtons.children
|
||||
|
||||
property alias input: input
|
||||
property alias text: input.text
|
||||
|
||||
property int inputPaddingLeft: 10
|
||||
property int inputPaddingRight: 10
|
||||
property int inputPaddingTop: 10
|
||||
property int inputPaddingBottom: 10
|
||||
property int inputRadius: 4
|
||||
|
||||
property bool password: false
|
||||
property bool passwordHidden: true
|
||||
property var passwordLinked: null
|
||||
@@ -55,10 +62,8 @@ Item {
|
||||
property real placeholderLeftMargin: {
|
||||
if (placeholderCenter) {
|
||||
return undefined;
|
||||
} else if (inlineIcon.visible) {
|
||||
return inlineIcon.width + inlineIcon.anchors.leftMargin + inputPadding;
|
||||
} else {
|
||||
return inputPadding;
|
||||
return inputPaddingLeft;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,16 +71,16 @@ Item {
|
||||
property alias validator: input.validator
|
||||
property alias readOnly : input.readOnly
|
||||
property alias cursorPosition: input.cursorPosition
|
||||
property alias inlineIcon: inlineIcon.visible
|
||||
property bool copyButton: false
|
||||
property bool pasteButton: false
|
||||
property alias copyButtonText: copyButtonId.text
|
||||
property alias copyButtonEnabled: copyButtonId.enabled
|
||||
|
||||
property bool borderDisabled: false
|
||||
property string borderColor: {
|
||||
if(error && input.text !== ""){
|
||||
if ((error && input.text !== "") || (errorWhenEmpty && input.text == "")) {
|
||||
return MoneroComponents.Style.inputBorderColorInvalid;
|
||||
} else if(input.activeFocus){
|
||||
} else if (input.activeFocus) {
|
||||
return MoneroComponents.Style.inputBorderColorActive;
|
||||
} else {
|
||||
return MoneroComponents.Style.inputBorderColorInActive;
|
||||
@@ -87,6 +92,7 @@ Item {
|
||||
property bool fontBold: false
|
||||
property alias fontColor: input.color
|
||||
property bool error: false
|
||||
property bool errorWhenEmpty: false
|
||||
property alias labelText: inputLabel.text
|
||||
property alias labelColor: inputLabel.color
|
||||
property alias labelTextFormat: inputLabel.textFormat
|
||||
@@ -97,16 +103,13 @@ Item {
|
||||
property alias labelWrapMode: inputLabel.wrapMode
|
||||
property alias labelHorizontalAlignment: inputLabel.horizontalAlignment
|
||||
property bool showingHeader: inputLabel.text !== "" || copyButton
|
||||
property int inputHeight: 42
|
||||
property int inputPadding: 10
|
||||
property int inputHeight: 39
|
||||
|
||||
signal labelLinkActivated(); // input label, rich text <a> signal
|
||||
signal editingFinished();
|
||||
signal accepted();
|
||||
signal textUpdated();
|
||||
|
||||
height: showingHeader ? (inputLabel.height + inputItem.height + 2) : inputHeight
|
||||
|
||||
onActiveFocusChanged: activeFocus && input.forceActiveFocus()
|
||||
onTextUpdated: {
|
||||
// check to remove placeholder text when there is content
|
||||
@@ -152,45 +155,100 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: labelFontSize
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
onLinkActivated: item.labelLinkActivated()
|
||||
spacing: 0
|
||||
Rectangle {
|
||||
id: inputLabelRect
|
||||
color: "transparent"
|
||||
Layout.fillWidth: true
|
||||
height: (inputLabel.height + 10)
|
||||
visible: showingHeader ? true : false
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
MoneroComponents.TextPlain {
|
||||
id: inputLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: labelFontSize
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
onLinkActivated: item.labelLinkActivated()
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
text: qsTr("Copy") + translationManager.emptyString
|
||||
anchors.right: parent.right
|
||||
onClicked: {
|
||||
if (input.text.length > 0) {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(input.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.right: parent.right
|
||||
spacing: 16
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: copyButtonId
|
||||
text: qsTr("Copy") + translationManager.emptyString
|
||||
onClicked: {
|
||||
if (input.text.length > 0) {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(input.text);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"), 3);
|
||||
}
|
||||
}
|
||||
visible: copyButton && input.text !== ""
|
||||
}
|
||||
|
||||
MoneroComponents.LabelButton {
|
||||
id: pasteButtonId
|
||||
onClicked: {
|
||||
input.clear();
|
||||
input.paste();
|
||||
}
|
||||
text: qsTr("Paste") + translationManager.emptyString
|
||||
visible: pasteButton
|
||||
}
|
||||
}
|
||||
visible: copyButton && input.text !== ""
|
||||
}
|
||||
|
||||
Item{
|
||||
id: inputItem
|
||||
height: inputHeight
|
||||
anchors.top: showingHeader ? inputLabel.bottom : parent.top
|
||||
anchors.topMargin: showingHeader ? 12 : 0
|
||||
width: parent.width
|
||||
clip: true
|
||||
MoneroComponents.Input {
|
||||
id: input
|
||||
KeyNavigation.backtab: item.KeyNavigation.backtab
|
||||
KeyNavigation.tab: item.KeyNavigation.tab
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: inputHeight
|
||||
|
||||
leftPadding: item.inputPaddingLeft
|
||||
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPaddingRight
|
||||
topPadding: item.inputPaddingTop
|
||||
bottomPadding: item.inputPaddingBottom
|
||||
|
||||
font.family: item.fontFamily
|
||||
font.pixelSize: item.fontSize
|
||||
font.bold: item.fontBold
|
||||
onEditingFinished: item.editingFinished()
|
||||
onAccepted: item.accepted();
|
||||
onTextChanged: item.textUpdated()
|
||||
echoMode: isPasswordHidden() ? TextInput.Password : TextInput.Normal
|
||||
|
||||
MoneroComponents.Label {
|
||||
visible: password || passwordLinked
|
||||
fontSize: 20
|
||||
text: isPasswordHidden() ? FontAwesome.eye : FontAwesome.eyeSlash
|
||||
opacity: eyeMouseArea.containsMouse ? 0.9 : 0.7
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 15
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: 1
|
||||
|
||||
MouseArea {
|
||||
id: eyeMouseArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
onClicked: passwordToggle()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: placeholderLabel
|
||||
@@ -221,69 +279,15 @@ Item {
|
||||
anchors.fill: parent
|
||||
border.width: borderDisabled ? 0 : 1
|
||||
border.color: borderColor
|
||||
radius: 4
|
||||
radius: item.inputRadius
|
||||
}
|
||||
|
||||
Image {
|
||||
id: inlineIcon
|
||||
width: 26
|
||||
height: 26
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 8
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12
|
||||
source: "qrc:///images/moneroIcon-28x28.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: input
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: inlineIcon.visible ? 44 : 0
|
||||
font.family: item.fontFamily
|
||||
font.pixelSize: item.fontSize
|
||||
font.bold: item.fontBold
|
||||
KeyNavigation.backtab: item.KeyNavigation.backtab
|
||||
KeyNavigation.tab: item.KeyNavigation.tab
|
||||
onEditingFinished: item.editingFinished()
|
||||
onAccepted: item.accepted();
|
||||
onTextChanged: item.textUpdated()
|
||||
leftPadding: inputPadding
|
||||
rightPadding: (inlineButtons.width > 0 ? inlineButtons.width + inlineButtons.spacing : 0) + inputPadding
|
||||
topPadding: inputPadding
|
||||
bottomPadding: inputPadding
|
||||
echoMode: isPasswordHidden() ? TextInput.Password : TextInput.Normal
|
||||
|
||||
MoneroComponents.Label {
|
||||
visible: password || passwordLinked
|
||||
fontSize: 20
|
||||
text: isPasswordHidden() ? FontAwesome.eye : FontAwesome.eyeSlash
|
||||
opacity: eyeMouseArea.containsMouse ? 0.9 : 0.7
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 15
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: 1
|
||||
|
||||
MouseArea {
|
||||
id: eyeMouseArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
onClicked: passwordToggle()
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: inlineButtons
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
anchors.topMargin: inputPadding
|
||||
anchors.bottomMargin: inputPadding
|
||||
anchors.rightMargin: inputPadding
|
||||
spacing: 4
|
||||
}
|
||||
RowLayout {
|
||||
id: inlineButtons
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: inputPaddingRight
|
||||
spacing: 4
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
property bool error: false
|
||||
property alias error: input.error
|
||||
property alias cursorPosition: input.cursorPosition
|
||||
|
||||
property string labelFontColor: MoneroComponents.Style.defaultFontColor
|
||||
property bool labelFontBold: false
|
||||
@@ -91,6 +92,8 @@ ColumnLayout {
|
||||
signal labelButtonClicked();
|
||||
signal inputLabelLinkActivated();
|
||||
signal editingFinished();
|
||||
signal returnPressed();
|
||||
signal enterPressed();
|
||||
|
||||
onActiveFocusChanged: activeFocus && input.forceActiveFocus()
|
||||
|
||||
@@ -176,7 +179,8 @@ ColumnLayout {
|
||||
fontColor: item.fontColor
|
||||
mouseSelection: item.mouseSelection
|
||||
onEditingFinished: item.editingFinished()
|
||||
error: item.error
|
||||
Keys.onReturnPressed: item.returnPressed()
|
||||
Keys.onEnterPressed: item.enterPressed()
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: placeholderLabel
|
||||
|
||||
55
components/MenuBar.qml
Normal file
55
components/MenuBar.qml
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright (c) 2014-2019, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import Qt.labs.platform 1.0 as PlatformLabs
|
||||
import "." as MoneroComponents
|
||||
|
||||
PlatformLabs.MenuBar {
|
||||
PlatformLabs.Menu {
|
||||
title: qsTr("File")
|
||||
PlatformLabs.MenuItem {
|
||||
enabled: appWindow.viewState === "normal"
|
||||
text: qsTr("Close Wallet")
|
||||
onTriggered: appWindow.showWizard()
|
||||
}
|
||||
}
|
||||
PlatformLabs.Menu {
|
||||
title: qsTr("View")
|
||||
PlatformLabs.MenuItem {
|
||||
text: MoneroComponents.Style.blackTheme ? qsTr("Light Theme") : qsTr("Dark Theme")
|
||||
onTriggered: {
|
||||
MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme;
|
||||
}
|
||||
}
|
||||
PlatformLabs.MenuItem {
|
||||
text: qsTr("Change Language")
|
||||
onTriggered: appWindow.toggleLanguageView();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,12 +127,13 @@ Rectangle {
|
||||
|
||||
Rectangle {
|
||||
Layout.minimumHeight: 30
|
||||
Layout.fillWidth: true
|
||||
color: items[index].active ? grid.borderColor : "transparent"
|
||||
height: children[0].height
|
||||
width: children[0].width
|
||||
implicitHeight: children[0].implicitHeight
|
||||
implicitWidth: children[0].implicitWidth
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.centerIn: parent
|
||||
font.family: grid.fontFamily
|
||||
font.pixelSize: grid.fontSize
|
||||
font.bold: grid.fontBold
|
||||
|
||||
@@ -80,7 +80,7 @@ Rectangle {
|
||||
if(item.connected == Wallet.ConnectionStatus_Connected){
|
||||
return 1
|
||||
} else {
|
||||
return 0.5
|
||||
MoneroComponents.Style.blackTheme ? 0.5 : 0.3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ Rectangle {
|
||||
source: {
|
||||
if(appWindow.isMining) {
|
||||
return "qrc:///images/miningxmr.png"
|
||||
} else if(item.connected == Wallet.ConnectionStatus_Connected) {
|
||||
} else if(item.connected == Wallet.ConnectionStatus_Connected || !MoneroComponents.Style.blackTheme) {
|
||||
return "qrc:///images/lightning.png"
|
||||
} else {
|
||||
return "qrc:///images/lightning-white.png"
|
||||
@@ -126,8 +126,8 @@ Rectangle {
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.bold: true
|
||||
font.pixelSize: 13
|
||||
color: MoneroComponents.Style.dimmedFontColor
|
||||
opacity: MoneroComponents.Style.blackTheme ? 0.65 : 0.5
|
||||
color: MoneroComponents.Style.blackTheme ? MoneroComponents.Style.dimmedFontColor : MoneroComponents.Style.defaultFontColor
|
||||
opacity: MoneroComponents.Style.blackTheme ? 0.65 : 0.75
|
||||
text: qsTr("Network status") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
}
|
||||
@@ -159,16 +159,18 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.left: statusTextVal.right
|
||||
anchors.leftMargin: 16
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: refreshMouseArea.containsMouse ? MoneroComponents.Style.dimmedFontColor : MoneroComponents.Style.defaultFontColor
|
||||
color: refreshMouseArea.containsMouse ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.pixelSize: 24
|
||||
font.styleName: "Solid"
|
||||
opacity: iconItem.opacity * (refreshMouseArea.visible ? 1 : 0.5)
|
||||
opacity: 0.85
|
||||
text: FontAwesome.random
|
||||
themeTransition: false
|
||||
tooltip: qsTr("Switch to another public remote node") + translationManager.emptyString;
|
||||
visible: (
|
||||
!appWindow.disconnected &&
|
||||
!persistentSettings.useRemoteNode &&
|
||||
@@ -181,6 +183,8 @@ Rectangle {
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
visible: true
|
||||
onEntered: parent.tooltipPopup.open()
|
||||
onExited: parent.tooltipPopup.close()
|
||||
onClicked: {
|
||||
const callback = function(result) {
|
||||
refreshMouseArea.visible = true;
|
||||
|
||||
@@ -90,6 +90,9 @@ Rectangle {
|
||||
if (!parsed.error) {
|
||||
root.qrcode_decoded(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name, parsed.extra_parameters);
|
||||
root.state = "Stopped";
|
||||
} else if (walletManager.addressValid(data, appWindow.persistentSettings.nettype)) {
|
||||
root.qrcode_decoded(data, "", "", "", "", null);
|
||||
root.state = "Stopped";
|
||||
} else {
|
||||
onNotifyError(parsed.error);
|
||||
}
|
||||
|
||||
@@ -73,19 +73,18 @@ GridLayout {
|
||||
}
|
||||
|
||||
function getAddress() {
|
||||
if (!isValid()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
var addr = daemonAddr.text.trim();
|
||||
var port = daemonPort.text.trim();
|
||||
|
||||
// validation
|
||||
if(addr === "" || addr.length < 2) return "";
|
||||
if(!Utils.isNumeric(port)) return "";
|
||||
|
||||
return addr + ":" + port;
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
MoneroComponents.LineEdit {
|
||||
id: daemonAddr
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredWidth: root.width/3
|
||||
placeholderText: qsTr("Remote Node Hostname / IP") + translationManager.emptyString
|
||||
placeholderFontFamily: root.placeholderFontFamily
|
||||
placeholderFontBold: root.placeholderFontBold
|
||||
@@ -105,9 +104,9 @@ GridLayout {
|
||||
text: initialHostPort[1]
|
||||
}
|
||||
|
||||
LineEdit {
|
||||
MoneroComponents.LineEdit {
|
||||
id: daemonPort
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredWidth: root.width/3
|
||||
placeholderText: qsTr("Port") + translationManager.emptyString
|
||||
placeholderFontFamily: root.placeholderFontFamily
|
||||
placeholderFontBold: root.placeholderFontBold
|
||||
|
||||
163
components/RemoteNodeList.qml
Normal file
163
components/RemoteNodeList.qml
Normal file
@@ -0,0 +1,163 @@
|
||||
// Copyright (c) 2021, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import FontAwesome 1.0
|
||||
|
||||
import "." as MoneroComponents
|
||||
import "effects/" as MoneroEffects
|
||||
|
||||
ColumnLayout {
|
||||
id: remoteNodeList
|
||||
spacing: 20
|
||||
|
||||
MoneroComponents.CheckBox {
|
||||
border: false
|
||||
checkedIcon: FontAwesome.minusCircle
|
||||
uncheckedIcon: FontAwesome.plusCircle
|
||||
fontAwesomeIcons: true
|
||||
fontSize: 16
|
||||
iconOnTheLeft: true
|
||||
text: qsTr("Add remote node") + translationManager.emptyString
|
||||
toggleOnClick: false
|
||||
onClicked: remoteNodeDialog.add(remoteNodesModel.append)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
|
||||
Repeater {
|
||||
model: remoteNodesModel
|
||||
|
||||
Rectangle {
|
||||
height: 30
|
||||
Layout.fillWidth: true
|
||||
color: itemMouseArea.containsMouse || trustedDaemonCheckMark.labelMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
|
||||
Rectangle {
|
||||
visible: index === remoteNodesModel.selected
|
||||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: "darkgrey"
|
||||
width: 2
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
height: 1
|
||||
visible: index > 0
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.rightMargin: 80
|
||||
color: "transparent"
|
||||
property var trusted: remoteNodesModel.get(index).trusted
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: addressText
|
||||
width: parent.width - trustedDaemonCheckMark.width
|
||||
color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 6
|
||||
font.pixelSize: 16
|
||||
text: address
|
||||
themeTransition: false
|
||||
elide: Text.ElideMiddle
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: trustedDaemonCheckMark
|
||||
anchors.left: addressText.right
|
||||
anchors.leftMargin: 6
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
z: itemMouseArea.z + 1
|
||||
fontSize: 16
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontColor: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
|
||||
styleName: "Solid"
|
||||
visible: trusted
|
||||
text: FontAwesome.shieldAlt
|
||||
tooltip: qsTr("Trusted daemon") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemMouseArea
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: remoteNodesModel.applyRemoteNode(index)
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
height: 30
|
||||
spacing: 2
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
buttonColor: "transparent"
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
fontPixelSize: 18
|
||||
text: FontAwesome.edit
|
||||
tooltip: qsTr("Edit remote node") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) {
|
||||
remoteNodesModel.set(index, remoteNode)
|
||||
})
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
buttonColor: "transparent"
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
text: FontAwesome.times
|
||||
visible: remoteNodesModel.count > 1
|
||||
tooltip: qsTr("Remove remote node") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
onClicked: remoteNodesModel.removeSelectNextIfNeeded(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,11 +16,11 @@ ColumnLayout {
|
||||
|
||||
spacing: 0
|
||||
|
||||
Text {
|
||||
MoneroComponents.TextPlain {
|
||||
id: label
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.pixelSize: 14
|
||||
Layout.fillWidth: true
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
}
|
||||
|
||||
QtQuickControls.Slider {
|
||||
|
||||
@@ -52,6 +52,9 @@ Item {
|
||||
else return 16;
|
||||
}
|
||||
property alias label: label
|
||||
property alias tooltip: tooltip.text
|
||||
property alias tooltipLeft: tooltip.tooltipLeft
|
||||
property alias tooltipPopup: tooltip.tooltipPopup
|
||||
signal clicked()
|
||||
|
||||
height: small ? 30 : 36
|
||||
@@ -143,6 +146,7 @@ Item {
|
||||
width: button.small ? 16 : 20
|
||||
height: button.small ? 16 : 20
|
||||
source: {
|
||||
if (fontAwesomeIcon) return "";
|
||||
if(button.rightIconInactive !== "" && !button.enabled) {
|
||||
return button.rightIconInactive;
|
||||
}
|
||||
@@ -161,11 +165,18 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: tooltip
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: buttonArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: doClick()
|
||||
onEntered: tooltip.text ? tooltip.tooltipPopup.open() : ""
|
||||
onExited: tooltip.text ? tooltip.tooltipPopup.close() : ""
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
|
||||
|
||||
@@ -171,6 +171,7 @@ Rectangle {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
primary: false
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
onClicked: {
|
||||
root.close()
|
||||
|
||||
@@ -29,12 +29,16 @@
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
import QtGraphicalEffects 1.0
|
||||
import FontAwesome 1.0
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import "../components" as MoneroComponents
|
||||
import "../components/effects/" as MoneroEffects
|
||||
|
||||
Item {
|
||||
ColumnLayout {
|
||||
id: dropdown
|
||||
Layout.fillWidth: true
|
||||
|
||||
property int itemTopMargin: 0
|
||||
property alias dataModel: repeater.model
|
||||
property string shadowPressedColor
|
||||
@@ -44,46 +48,66 @@ Item {
|
||||
property string textColor: MoneroComponents.Style.defaultFontColor
|
||||
property alias currentIndex: columnid.currentIndex
|
||||
readonly property alias expanded: popup.visible
|
||||
property int dropdownHeight: 42
|
||||
property int fontHeaderSize: 16
|
||||
property alias labelText: dropdownLabel.text
|
||||
property alias labelColor: dropdownLabel.color
|
||||
property alias labelTextFormat: dropdownLabel.textFormat
|
||||
property alias labelWrapMode: dropdownLabel.wrapMode
|
||||
property alias labelHorizontalAlignment: dropdownLabel.horizontalAlignment
|
||||
property bool showingHeader: dropdownLabel.text !== ""
|
||||
property int labelFontSize: 14
|
||||
property bool labelFontBold: false
|
||||
property int dropdownHeight: 39
|
||||
property int fontSize: 14
|
||||
property int fontItemSize: 14
|
||||
property string colorBorder: MoneroComponents.Style.inputBorderColorInActive
|
||||
property string colorHeaderBackground: "transparent"
|
||||
property bool headerBorder: true
|
||||
property bool headerFontBold: false
|
||||
|
||||
height: dropdownHeight
|
||||
|
||||
signal changed();
|
||||
|
||||
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
|
||||
|
||||
Item {
|
||||
id: head
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: parent.itemTopMargin
|
||||
height: dropdown.dropdownHeight
|
||||
spacing: 0
|
||||
Rectangle {
|
||||
id: dropdownLabelRect
|
||||
color: "transparent"
|
||||
Layout.fillWidth: true
|
||||
height: (dropdownLabel.height + 10)
|
||||
visible: showingHeader ? true : false
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
border.width: dropdown.headerBorder ? 1 : 0
|
||||
border.color: dropdown.colorBorder
|
||||
radius: 4
|
||||
anchors.fill: parent
|
||||
MoneroComponents.TextPlain {
|
||||
id: dropdownLabel
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: labelFontSize
|
||||
font.bold: labelFontBold
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: head
|
||||
color: dropArea.containsMouse ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
border.width: dropdown.headerBorder ? 1 : 0
|
||||
border.color: dropdown.colorBorder
|
||||
radius: 4
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: dropdownHeight
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 12
|
||||
anchors.leftMargin: 10
|
||||
anchors.right: dropIndicator.left
|
||||
anchors.rightMargin: 12
|
||||
width: droplist.width
|
||||
elide: Text.ElideRight
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.bold: dropdown.headerFontBold
|
||||
font.pixelSize: dropdown.fontHeaderSize
|
||||
font.pixelSize: dropdown.fontSize
|
||||
color: dropdown.textColor
|
||||
text: columnid.currentIndex < repeater.model.count ? qsTr(repeater.model.get(columnid.currentIndex).column1) + translationManager.emptyString : ""
|
||||
}
|
||||
@@ -96,19 +120,15 @@ Item {
|
||||
anchors.rightMargin: 12
|
||||
width: dropdownIcon.width
|
||||
|
||||
Image {
|
||||
MoneroEffects.ImageMask {
|
||||
id: dropdownIcon
|
||||
anchors.centerIn: parent
|
||||
source: "qrc:///images/whiteDropIndicator.png"
|
||||
visible: false
|
||||
}
|
||||
|
||||
ColorOverlay {
|
||||
source: dropdownIcon
|
||||
anchors.fill: dropdownIcon
|
||||
image: "qrc:///images/whiteDropIndicator.png"
|
||||
height: 8
|
||||
width: 12
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowDown
|
||||
fontAwesomeFallbackSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
rotation: dropdown.expanded ? 180 : 0
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +137,7 @@ Item {
|
||||
anchors.fill: parent
|
||||
onClicked: dropdown.expanded ? popup.close() : popup.open()
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
cursorShape: Qt.ArrowCursor
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +148,7 @@ Item {
|
||||
|
||||
Rectangle {
|
||||
id: droplist
|
||||
x: dropdown.x
|
||||
anchors.left: parent.left
|
||||
width: dropdown.width
|
||||
y: head.y + head.height
|
||||
clip: true
|
||||
@@ -188,25 +208,11 @@ Item {
|
||||
text: ""
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
width: 3; height: 3
|
||||
color: parent.color
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
cursorShape: Qt.ArrowCursor
|
||||
|
||||
onClicked: {
|
||||
popup.close()
|
||||
|
||||
@@ -132,7 +132,7 @@ Rectangle {
|
||||
fontSize: 16
|
||||
}
|
||||
|
||||
// open folder / done buttons
|
||||
// view progress / open folder / done buttons
|
||||
RowLayout {
|
||||
id: buttons
|
||||
spacing: 70
|
||||
@@ -140,6 +140,20 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 50
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: viewProgressButton
|
||||
visible: !appWindow.viewOnly
|
||||
text: qsTr("View progress") + translationManager.emptyString;
|
||||
width: 200
|
||||
primary: false
|
||||
KeyNavigation.tab: doneButton
|
||||
onClicked: {
|
||||
doSearchInHistory(root.transactionID);
|
||||
root.close()
|
||||
root.rejected()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: openFolderButton
|
||||
visible: appWindow.viewOnly
|
||||
@@ -156,7 +170,7 @@ Rectangle {
|
||||
text: qsTr("Done") + translationManager.emptyString;
|
||||
width: 200
|
||||
focus: root.visible
|
||||
KeyNavigation.tab: openFolderButton
|
||||
KeyNavigation.tab: appWindow.viewOnly ? openFolderButton : viewProgressButton
|
||||
onClicked: {
|
||||
root.close()
|
||||
root.accepted()
|
||||
|
||||
@@ -12,6 +12,10 @@ Text {
|
||||
property bool themeTransition: true
|
||||
property string themeTransitionBlackColor: ""
|
||||
property string themeTransitionWhiteColor: ""
|
||||
property alias tooltip: tooltip.text
|
||||
property alias tooltipLeft: tooltip.tooltipLeft
|
||||
property alias tooltipIconVisible: tooltip.tooltipIconVisible
|
||||
property alias tooltipPopup: tooltip.tooltipPopup
|
||||
font.family: MoneroComponents.Style.fontMedium.name
|
||||
font.bold: false
|
||||
font.pixelSize: 14
|
||||
@@ -25,4 +29,10 @@ Text {
|
||||
blackColor: root.themeTransitionBlackColor !== "" ? root.themeTransitionBlackColor : MoneroComponents.Style._b_defaultFontColor
|
||||
whiteColor: root.themeTransitionWhiteColor !== "" ? root.themeTransitionWhiteColor : MoneroComponents.Style._w_defaultFontColor
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: tooltip
|
||||
anchors.top: parent.top
|
||||
anchors.left: tooltipIconVisible ? parent.right : parent.left
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,12 +110,24 @@ Rectangle {
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: btnCloseWalletTooltip
|
||||
anchors.fill: parent
|
||||
text: qsTr("Close this wallet and return to main menu") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onEntered: {
|
||||
parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
btnCloseWalletTooltip.tooltipPopup.open()
|
||||
}
|
||||
onExited: {
|
||||
parent.color = "transparent"
|
||||
btnCloseWalletTooltip.tooltipPopup.close()
|
||||
}
|
||||
onClicked: root.closeWalletClicked(leftPanel.visible)
|
||||
}
|
||||
}
|
||||
@@ -138,12 +150,24 @@ Rectangle {
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: btnLanguageToggleTooltip
|
||||
anchors.fill: parent
|
||||
text: qsTr("Change language") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onEntered: {
|
||||
parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
btnLanguageToggleTooltip.tooltipPopup.open()
|
||||
}
|
||||
onExited: {
|
||||
parent.color = "transparent"
|
||||
btnLanguageToggleTooltip.tooltipPopup.close()
|
||||
}
|
||||
onClicked: root.languageClicked()
|
||||
}
|
||||
}
|
||||
@@ -165,15 +189,26 @@ Rectangle {
|
||||
opacity: 0.75
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: btnSwitchThemeTooltip
|
||||
anchors.fill: parent
|
||||
text: MoneroComponents.Style.blackTheme ? qsTr("Switch to light theme") : qsTr("Switch to dark theme") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
onExited: parent.color = "transparent"
|
||||
onEntered: {
|
||||
parent.color = MoneroComponents.Style.titleBarButtonHoverColor
|
||||
btnSwitchThemeTooltip.tooltipPopup.open()
|
||||
}
|
||||
onExited: {
|
||||
parent.color = "transparent"
|
||||
btnSwitchThemeTooltip.tooltipPopup.close()
|
||||
}
|
||||
onClicked: {
|
||||
MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme;
|
||||
persistentSettings.blackTheme = MoneroComponents.Style.blackTheme;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -347,6 +382,7 @@ Rectangle {
|
||||
anchors.fill: parent
|
||||
propagateComposedEvents: true
|
||||
onPressed: previousPosition = globalCursor.getPosition()
|
||||
onDoubleClicked: root.maximizeClicked()
|
||||
onPositionChanged: {
|
||||
if (pressedButtons == Qt.LeftButton) {
|
||||
var pos = globalCursor.getPosition()
|
||||
|
||||
111
components/Tooltip.qml
Normal file
111
components/Tooltip.qml
Normal file
@@ -0,0 +1,111 @@
|
||||
// Copyright (c) 2021, The Monero Project
|
||||
//
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
// conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
//
|
||||
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
// used to endorse or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Layouts 1.1
|
||||
|
||||
import FontAwesome 1.0
|
||||
import "." as MoneroComponents
|
||||
|
||||
Rectangle {
|
||||
property alias text: tooltip.text
|
||||
property alias tooltipPopup: popup
|
||||
property bool tooltipIconVisible: false
|
||||
property bool tooltipLeft: false
|
||||
property bool tooltipBottom: tooltipIconVisible ? false : true
|
||||
|
||||
color: "transparent"
|
||||
height: tooltipIconVisible ? icon.height : parent.height
|
||||
width: tooltipIconVisible ? icon.width : parent.width
|
||||
visible: text != ""
|
||||
|
||||
Text {
|
||||
id: icon
|
||||
visible: tooltipIconVisible
|
||||
color: MoneroComponents.Style.orange
|
||||
font.family: FontAwesome.fontFamily
|
||||
font.pixelSize: 10
|
||||
font.styleName: "Regular"
|
||||
leftPadding: 5
|
||||
rightPadding: 5
|
||||
text: FontAwesome.questionCircle
|
||||
opacity: mouseArea.containsMouse ? 0.7 : 1
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.WhatsThisCursor
|
||||
onEntered: popup.open()
|
||||
onExited: popup.close()
|
||||
}
|
||||
}
|
||||
|
||||
ToolTip {
|
||||
id: popup
|
||||
height: tooltip.height + 20
|
||||
|
||||
background: Rectangle {
|
||||
border.color: MoneroComponents.Style.buttonInlineBackgroundColor
|
||||
border.width: 1
|
||||
color: MoneroComponents.Style.titleBarBackgroundGradientStart
|
||||
radius: 4
|
||||
}
|
||||
closePolicy: Popup.NoAutoClose
|
||||
padding: 10
|
||||
x: tooltipLeft
|
||||
? (tooltipIconVisible ? icon.x - icon.width : parent.x - tooltip.width - 20 + parent.width/2)
|
||||
: (tooltipIconVisible ? icon.x + icon.width : parent.x + parent.width/2)
|
||||
y: tooltipBottom
|
||||
? (tooltipIconVisible ? icon.y + height : parent.y + parent.height + 2)
|
||||
: (tooltipIconVisible ? icon.y - height : parent.y - tooltip.height - 20)
|
||||
enter: Transition {
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 150 }
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 150 }
|
||||
}
|
||||
delay: 200
|
||||
|
||||
RowLayout {
|
||||
Layout.maximumWidth: 350
|
||||
|
||||
Text {
|
||||
id: tooltip
|
||||
width: contentWidth
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 12
|
||||
textFormat: Text.RichText
|
||||
wrapMode: Text.WordWrap
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -141,7 +141,7 @@ Rectangle {
|
||||
|
||||
function showFiatConversion(valueXMR) {
|
||||
const fiatFee = fiatApiConvertToFiat(valueXMR);
|
||||
return "%1 %2".arg(fiatFee < 0.01 ? "<0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol());
|
||||
return "%1 %2".arg(fiatFee < 0.01 ? "<0.01" : "~" + fiatFee).arg(fiatApiCurrencySymbol());
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
1
external/CMakeLists.txt
vendored
1
external/CMakeLists.txt
vendored
@@ -4,4 +4,5 @@ add_library(quirc STATIC
|
||||
quirc/lib/quirc.c
|
||||
quirc/lib/version_db.c
|
||||
)
|
||||
set_target_properties(quirc PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_include_directories(quirc PUBLIC quirc/lib)
|
||||
|
||||
@@ -3,812 +3,71 @@ import QtQuick 2.9
|
||||
|
||||
Object {
|
||||
|
||||
//Font Awesome version 5.15.3
|
||||
FontLoader {
|
||||
id: regular
|
||||
source: "./fa-regular-400.ttf"
|
||||
source: "./fa-regular-400.otf"
|
||||
}
|
||||
|
||||
FontLoader {
|
||||
id: brands
|
||||
source: "./fa-brands-400.ttf"
|
||||
source: "./fa-brands-400.otf"
|
||||
}
|
||||
|
||||
FontLoader {
|
||||
id: solid
|
||||
source: "./fa-solid-900.ttf"
|
||||
source: "./fa-solid-900.otf"
|
||||
}
|
||||
|
||||
property string fontFamily: regular.name
|
||||
property string fontFamilyBrands: brands.name
|
||||
property string fontFamilySolid: solid.name
|
||||
|
||||
// Icons
|
||||
// Icons used in Monero GUI (Font Awesome version 5.15.3)
|
||||
// To add new icons, check unicodes in Font Awesome Free's Cheatsheet:
|
||||
// https://fontawesome.com/v5/cheatsheet/free/solid
|
||||
// https://fontawesome.com/v5/cheatsheet/free/regular
|
||||
// https://fontawesome.com/v5/cheatsheet/free/brands
|
||||
|
||||
property string addressBook : "\uf2b9"
|
||||
property string addressBookO : "\uf2ba"
|
||||
property string addressCard : "\uf2bb"
|
||||
property string addressCardO : "\uf2bc"
|
||||
property string adjust : "\uf042"
|
||||
property string adn : "\uf170"
|
||||
property string alignCenter : "\uf037"
|
||||
property string alignJustify : "\uf039"
|
||||
property string alignLeft : "\uf036"
|
||||
property string alignRight : "\uf038"
|
||||
property string amazon : "\uf270"
|
||||
property string ambulance : "\uf0f9"
|
||||
property string americanSignLanguageInterpreting : "\uf2a3"
|
||||
property string anchor : "\uf13d"
|
||||
property string android : "\uf17b"
|
||||
property string angellist : "\uf209"
|
||||
property string angleDoubleDown : "\uf103"
|
||||
property string angleDoubleLeft : "\uf100"
|
||||
property string angleDoubleRight : "\uf101"
|
||||
property string angleDoubleUp : "\uf102"
|
||||
property string angleDown : "\uf107"
|
||||
property string angleLeft : "\uf104"
|
||||
property string angleRight : "\uf105"
|
||||
property string angleUp : "\uf106"
|
||||
property string apple : "\uf179"
|
||||
property string archive : "\uf187"
|
||||
property string areaChart : "\uf1fe"
|
||||
property string arrowCircleDown : "\uf0ab"
|
||||
property string arrowCircleLeft : "\uf0a8"
|
||||
property string arrowCircleODown : "\uf01a"
|
||||
property string arrowCircleOLeft : "\uf190"
|
||||
property string arrowCircleORight : "\uf18e"
|
||||
property string arrowCircleOUp : "\uf01b"
|
||||
property string arrowCircleRight : "\uf0a9"
|
||||
property string arrowCircleUp : "\uf0aa"
|
||||
property string arrowDown : "\uf063"
|
||||
property string arrowLeft : "\uf060"
|
||||
property string arrowRight : "\uf061"
|
||||
property string arrowUp : "\uf062"
|
||||
property string arrows : "\uf047"
|
||||
property string arrowsAlt : "\uf0b2"
|
||||
property string arrowsH : "\uf07e"
|
||||
property string arrowsV : "\uf07d"
|
||||
property string aslInterpreting : "\uf2a3"
|
||||
property string assistiveListeningSystems : "\uf2a2"
|
||||
property string asterisk : "\uf069"
|
||||
property string at : "\uf1fa"
|
||||
property string audioDescription : "\uf29e"
|
||||
property string automobile : "\uf1b9"
|
||||
property string backward : "\uf04a"
|
||||
property string balanceScale : "\uf24e"
|
||||
property string ban : "\uf05e"
|
||||
property string bandcamp : "\uf2d5"
|
||||
property string bank : "\uf19c"
|
||||
property string barChart : "\uf080"
|
||||
property string barChartO : "\uf080"
|
||||
property string barcode : "\uf02a"
|
||||
property string bars : "\uf0c9"
|
||||
property string bath : "\uf2cd"
|
||||
property string bathtub : "\uf2cd"
|
||||
property string battery : "\uf240"
|
||||
property string battery0 : "\uf244"
|
||||
property string battery1 : "\uf243"
|
||||
property string battery2 : "\uf242"
|
||||
property string battery3 : "\uf241"
|
||||
property string battery4 : "\uf240"
|
||||
property string batteryEmpty : "\uf244"
|
||||
property string batteryFull : "\uf240"
|
||||
property string batteryHalf : "\uf242"
|
||||
property string batteryQuarter : "\uf243"
|
||||
property string batteryThreeQuarters : "\uf241"
|
||||
property string bed : "\uf236"
|
||||
property string beer : "\uf0fc"
|
||||
property string behance : "\uf1b4"
|
||||
property string behanceSquare : "\uf1b5"
|
||||
property string bell : "\uf0f3"
|
||||
property string bellO : "\uf0a2"
|
||||
property string bellSlash : "\uf1f6"
|
||||
property string bellSlashO : "\uf1f7"
|
||||
property string bicycle : "\uf206"
|
||||
property string binoculars : "\uf1e5"
|
||||
property string birthdayCake : "\uf1fd"
|
||||
property string bitbucket : "\uf171"
|
||||
property string bitbucketSquare : "\uf172"
|
||||
property string bitcoin : "\uf15a"
|
||||
property string blackTie : "\uf27e"
|
||||
property string blind : "\uf29d"
|
||||
property string bluetooth : "\uf293"
|
||||
property string bluetoothB : "\uf294"
|
||||
property string bold : "\uf032"
|
||||
property string bolt : "\uf0e7"
|
||||
property string bomb : "\uf1e2"
|
||||
property string book : "\uf02d"
|
||||
property string bookmark : "\uf02e"
|
||||
property string bookmarkO : "\uf097"
|
||||
property string braille : "\uf2a1"
|
||||
property string briefcase : "\uf0b1"
|
||||
property string btc : "\uf15a"
|
||||
property string bug : "\uf188"
|
||||
property string building : "\uf1ad"
|
||||
property string buildingO : "\uf0f7"
|
||||
property string bullhorn : "\uf0a1"
|
||||
property string bullseye : "\uf140"
|
||||
property string bus : "\uf207"
|
||||
property string buysellads : "\uf20d"
|
||||
property string cab : "\uf1ba"
|
||||
property string calculator : "\uf1ec"
|
||||
property string calendar : "\uf073"
|
||||
property string calendarCheckO : "\uf274"
|
||||
property string calendarMinusO : "\uf272"
|
||||
property string calendarO : "\uf133"
|
||||
property string calendarPlusO : "\uf271"
|
||||
property string calendarTimesO : "\uf273"
|
||||
property string camera : "\uf030"
|
||||
property string cameraRetro : "\uf083"
|
||||
property string car : "\uf1b9"
|
||||
property string caretDown : "\uf0d7"
|
||||
property string caretLeft : "\uf0d9"
|
||||
property string caretRight : "\uf0da"
|
||||
property string caretSquareODown : "\uf150"
|
||||
property string caretSquareOLeft : "\uf191"
|
||||
property string caretSquareORight : "\uf152"
|
||||
property string caretSquareOUp : "\uf151"
|
||||
property string caretUp : "\uf0d8"
|
||||
property string cartArrowDown : "\uf218"
|
||||
property string cartPlus : "\uf217"
|
||||
property string cashRegister: "\uf788"
|
||||
property string cc : "\uf20a"
|
||||
property string ccAmex : "\uf1f3"
|
||||
property string ccDinersClub : "\uf24c"
|
||||
property string ccDiscover : "\uf1f2"
|
||||
property string ccJcb : "\uf24b"
|
||||
property string ccMastercard : "\uf1f1"
|
||||
property string ccPaypal : "\uf1f4"
|
||||
property string ccStripe : "\uf1f5"
|
||||
property string ccVisa : "\uf1f0"
|
||||
property string certificate : "\uf0a3"
|
||||
property string chain : "\uf0c1"
|
||||
property string chainBroken : "\uf127"
|
||||
property string check : "\uf00c"
|
||||
property string checkCircle : "\uf058"
|
||||
property string checkCircleO : "\uf05d"
|
||||
property string checkSquare : "\uf14a"
|
||||
property string checkSquareO : "\uf046"
|
||||
property string chevronCircleDown : "\uf13a"
|
||||
property string chevronCircleLeft : "\uf137"
|
||||
property string chevronCircleRight : "\uf138"
|
||||
property string chevronCircleUp : "\uf139"
|
||||
property string chevronDown : "\uf078"
|
||||
property string chevronLeft : "\uf053"
|
||||
property string chevronRight : "\uf054"
|
||||
property string chevronUp : "\uf077"
|
||||
property string child : "\uf1ae"
|
||||
property string chrome : "\uf268"
|
||||
property string circle : "\uf111"
|
||||
property string circleO : "\uf10c"
|
||||
property string circleONotch : "\uf1ce"
|
||||
property string circleThin : "\uf1db"
|
||||
property string clipboard : "\uf0ea"
|
||||
property string clockO : "\uf017"
|
||||
property string clone : "\uf24d"
|
||||
property string close : "\uf00d"
|
||||
property string cloud : "\uf0c2"
|
||||
property string cloudDownload : "\uf0ed"
|
||||
property string cloudUpload : "\uf0ee"
|
||||
property string cny : "\uf157"
|
||||
property string code : "\uf121"
|
||||
property string codeFork : "\uf126"
|
||||
property string codepen : "\uf1cb"
|
||||
property string codiepie : "\uf284"
|
||||
property string coffee : "\uf0f4"
|
||||
property string cog : "\uf013"
|
||||
property string cogs : "\uf085"
|
||||
property string columns : "\uf0db"
|
||||
property string comment : "\uf075"
|
||||
property string commentO : "\uf0e5"
|
||||
property string commenting : "\uf27a"
|
||||
property string commentingO : "\uf27b"
|
||||
property string comments : "\uf086"
|
||||
property string commentsO : "\uf0e6"
|
||||
property string compass : "\uf14e"
|
||||
property string compress : "\uf066"
|
||||
property string connectdevelop : "\uf20e"
|
||||
property string contao : "\uf26d"
|
||||
property string copy : "\uf0c5"
|
||||
property string copyright : "\uf1f9"
|
||||
property string creativeCommons : "\uf25e"
|
||||
property string creditCard : "\uf09d"
|
||||
property string creditCardAlt : "\uf283"
|
||||
property string crop : "\uf125"
|
||||
property string crosshairs : "\uf05b"
|
||||
property string css3 : "\uf13c"
|
||||
property string cube : "\uf1b2"
|
||||
property string cubes : "\uf1b3"
|
||||
property string cut : "\uf0c4"
|
||||
property string cutlery : "\uf0f5"
|
||||
property string dashboard : "\uf0e4"
|
||||
property string dashcube : "\uf210"
|
||||
property string database : "\uf1c0"
|
||||
property string deaf : "\uf2a4"
|
||||
property string deafness : "\uf2a4"
|
||||
property string dedent : "\uf03b"
|
||||
property string delicious : "\uf1a5"
|
||||
property string desktop : "\uf108"
|
||||
property string deviantart : "\uf1bd"
|
||||
property string diamond : "\uf219"
|
||||
property string digg : "\uf1a6"
|
||||
property string dollar : "\uf155"
|
||||
property string dotCircleO : "\uf192"
|
||||
property string download : "\uf019"
|
||||
property string dribbble : "\uf17d"
|
||||
property string driversLicense : "\uf2c2"
|
||||
property string driversLicenseO : "\uf2c3"
|
||||
property string dropbox : "\uf16b"
|
||||
property string drupal : "\uf1a9"
|
||||
property string edge : "\uf282"
|
||||
property string edit : "\uf044"
|
||||
property string eercast : "\uf2da"
|
||||
property string eject : "\uf052"
|
||||
property string ellipsisH : "\uf141"
|
||||
property string ellipsisV : "\uf142"
|
||||
property string empire : "\uf1d1"
|
||||
property string envelope : "\uf0e0"
|
||||
property string envelopeO : "\uf003"
|
||||
property string envelopeOpen : "\uf2b6"
|
||||
property string envelopeOpenO : "\uf2b7"
|
||||
property string envelopeSquare : "\uf199"
|
||||
property string envira : "\uf299"
|
||||
property string eraser : "\uf12d"
|
||||
property string etsy : "\uf2d7"
|
||||
property string eur : "\uf153"
|
||||
property string euro : "\uf153"
|
||||
property string exchange : "\uf0ec"
|
||||
property string exclamation : "\uf12a"
|
||||
property string exclamationCircle : "\uf06a"
|
||||
property string exclamationTriangle : "\uf071"
|
||||
property string expand : "\uf065"
|
||||
property string expeditedssl : "\uf23e"
|
||||
property string externalLink : "\uf08e"
|
||||
property string externalLinkSquare : "\uf14c"
|
||||
property string eye : "\uf06e"
|
||||
property string eyeSlash : "\uf070"
|
||||
property string eyedropper : "\uf1fb"
|
||||
property string fa : "\uf2b4"
|
||||
property string facebook : "\uf09a"
|
||||
property string facebookF : "\uf09a"
|
||||
property string facebookOfficial : "\uf230"
|
||||
property string facebookSquare : "\uf082"
|
||||
property string fastBackward : "\uf049"
|
||||
property string fastForward : "\uf050"
|
||||
property string fax : "\uf1ac"
|
||||
property string feed : "\uf09e"
|
||||
property string female : "\uf182"
|
||||
property string fighterJet : "\uf0fb"
|
||||
property string file : "\uf15b"
|
||||
property string fileArchiveO : "\uf1c6"
|
||||
property string fileAudioO : "\uf1c7"
|
||||
property string fileCodeO : "\uf1c9"
|
||||
property string fileExcelO : "\uf1c3"
|
||||
property string fileImageO : "\uf1c5"
|
||||
property string fileMovieO : "\uf1c8"
|
||||
property string fileO : "\uf016"
|
||||
property string filePdfO : "\uf1c1"
|
||||
property string filePhotoO : "\uf1c5"
|
||||
property string filePictureO : "\uf1c5"
|
||||
property string filePowerpointO : "\uf1c4"
|
||||
property string fileSoundO : "\uf1c7"
|
||||
property string fileText : "\uf15c"
|
||||
property string fileTextO : "\uf0f6"
|
||||
property string fileVideoO : "\uf1c8"
|
||||
property string fileWordO : "\uf1c2"
|
||||
property string fileZipO : "\uf1c6"
|
||||
property string filesO : "\uf0c5"
|
||||
property string film : "\uf008"
|
||||
property string filter : "\uf0b0"
|
||||
property string fire : "\uf06d"
|
||||
property string fireExtinguisher : "\uf134"
|
||||
property string firefox : "\uf269"
|
||||
property string firstOrder : "\uf2b0"
|
||||
property string flag : "\uf024"
|
||||
property string flagCheckered : "\uf11e"
|
||||
property string flagO : "\uf11d"
|
||||
property string flash : "\uf0e7"
|
||||
property string flask : "\uf0c3"
|
||||
property string flickr : "\uf16e"
|
||||
property string floppyO : "\uf0c7"
|
||||
property string folder : "\uf07b"
|
||||
property string folderO : "\uf114"
|
||||
property string folderOpen : "\uf07c"
|
||||
property string folderOpenO : "\uf115"
|
||||
property string font : "\uf031"
|
||||
property string fontAwesome : "\uf2b4"
|
||||
property string fonticons : "\uf280"
|
||||
property string fortAwesome : "\uf286"
|
||||
property string forumbee : "\uf211"
|
||||
property string forward : "\uf04e"
|
||||
property string foursquare : "\uf180"
|
||||
property string freeCodeCamp : "\uf2c5"
|
||||
property string frownO : "\uf119"
|
||||
property string futbolO : "\uf1e3"
|
||||
property string gamepad : "\uf11b"
|
||||
property string gavel : "\uf0e3"
|
||||
property string gbp : "\uf154"
|
||||
property string ge : "\uf1d1"
|
||||
property string gear : "\uf013"
|
||||
property string gears : "\uf085"
|
||||
property string genderless : "\uf22d"
|
||||
property string getPocket : "\uf265"
|
||||
property string gg : "\uf260"
|
||||
property string ggCircle : "\uf261"
|
||||
property string gift : "\uf06b"
|
||||
property string git : "\uf1d3"
|
||||
property string gitSquare : "\uf1d2"
|
||||
property string github : "\uf09b"
|
||||
property string githubAlt : "\uf113"
|
||||
property string githubSquare : "\uf092"
|
||||
property string gitlab : "\uf296"
|
||||
property string gittip : "\uf184"
|
||||
property string glass : "\uf000"
|
||||
property string glide : "\uf2a5"
|
||||
property string glideG : "\uf2a6"
|
||||
property string globe : "\uf0ac"
|
||||
property string google : "\uf1a0"
|
||||
property string googlePlus : "\uf0d5"
|
||||
property string googlePlusCircle : "\uf2b3"
|
||||
property string googlePlusOfficial : "\uf2b3"
|
||||
property string googlePlusSquare : "\uf0d4"
|
||||
property string googleWallet : "\uf1ee"
|
||||
property string graduationCap : "\uf19d"
|
||||
property string gratipay : "\uf184"
|
||||
property string grav : "\uf2d6"
|
||||
property string group : "\uf0c0"
|
||||
property string hSquare : "\uf0fd"
|
||||
property string hackerNews : "\uf1d4"
|
||||
property string handGrabO : "\uf255"
|
||||
property string handLizardO : "\uf258"
|
||||
property string handODown : "\uf0a7"
|
||||
property string handOLeft : "\uf0a5"
|
||||
property string handORight : "\uf0a4"
|
||||
property string handOUp : "\uf0a6"
|
||||
property string handPaperO : "\uf256"
|
||||
property string handPeaceO : "\uf25b"
|
||||
property string handPointerO : "\uf25a"
|
||||
property string handRockO : "\uf255"
|
||||
property string handScissorsO : "\uf257"
|
||||
property string handSpockO : "\uf259"
|
||||
property string handStopO : "\uf256"
|
||||
property string handshakeO : "\uf2b5"
|
||||
property string hardOfHearing : "\uf2a4"
|
||||
property string hashtag : "\uf292"
|
||||
property string hddO : "\uf0a0"
|
||||
property string header : "\uf1dc"
|
||||
property string headphones : "\uf025"
|
||||
property string heart : "\uf004"
|
||||
property string heartO : "\uf08a"
|
||||
property string heartbeat : "\uf21e"
|
||||
property string history : "\uf1da"
|
||||
property string home : "\uf015"
|
||||
property string hospitalO : "\uf0f8"
|
||||
property string hotel : "\uf236"
|
||||
property string hourglass : "\uf254"
|
||||
property string hourglass1 : "\uf251"
|
||||
property string hourglass2 : "\uf252"
|
||||
property string hourglass3 : "\uf253"
|
||||
property string hourglassEnd : "\uf253"
|
||||
property string hourglassHalf : "\uf252"
|
||||
property string hourglassO : "\uf250"
|
||||
property string hourglassStart : "\uf251"
|
||||
property string houzz : "\uf27c"
|
||||
property string html5 : "\uf13b"
|
||||
property string iCursor : "\uf246"
|
||||
property string idBadge : "\uf2c1"
|
||||
property string idCard : "\uf2c2"
|
||||
property string idCardO : "\uf2c3"
|
||||
property string ils : "\uf20b"
|
||||
property string image : "\uf03e"
|
||||
property string imdb : "\uf2d8"
|
||||
property string inbox : "\uf01c"
|
||||
property string indent : "\uf03c"
|
||||
property string industry : "\uf275"
|
||||
property string houseUser : "\ue065"
|
||||
property string infinity : "\uf534"
|
||||
property string info : "\uf129"
|
||||
property string infoCircle : "\uf05a"
|
||||
property string inr : "\uf156"
|
||||
property string instagram : "\uf16d"
|
||||
property string institution : "\uf19c"
|
||||
property string internetExplorer : "\uf26b"
|
||||
property string intersex : "\uf224"
|
||||
property string ioxhost : "\uf208"
|
||||
property string italic : "\uf033"
|
||||
property string joomla : "\uf1aa"
|
||||
property string jpy : "\uf157"
|
||||
property string jsfiddle : "\uf1cc"
|
||||
property string key : "\uf084"
|
||||
property string keyboardO : "\uf11c"
|
||||
property string krw : "\uf159"
|
||||
property string language : "\uf1ab"
|
||||
property string laptop : "\uf109"
|
||||
property string lastfm : "\uf202"
|
||||
property string lastfmSquare : "\uf203"
|
||||
property string leaf : "\uf06c"
|
||||
property string leanpub : "\uf212"
|
||||
property string legal : "\uf0e3"
|
||||
property string lemonO : "\uf094"
|
||||
property string levelDown : "\uf149"
|
||||
property string levelUp : "\uf148"
|
||||
property string lifeBouy : "\uf1cd"
|
||||
property string lifeBuoy : "\uf1cd"
|
||||
property string lifeRing : "\uf1cd"
|
||||
property string lifeSaver : "\uf1cd"
|
||||
property string lightbulbO : "\uf0eb"
|
||||
property string lineChart : "\uf201"
|
||||
property string link : "\uf0c1"
|
||||
property string linkedin : "\uf0e1"
|
||||
property string linkedinSquare : "\uf08c"
|
||||
property string linode : "\uf2b8"
|
||||
property string linux : "\uf17c"
|
||||
property string list : "\uf03a"
|
||||
property string listAlt : "\uf022"
|
||||
property string listOl : "\uf0cb"
|
||||
property string listUl : "\uf0ca"
|
||||
property string locationArrow : "\uf124"
|
||||
property string lock : "\uf023"
|
||||
property string longArrowDown : "\uf175"
|
||||
property string longArrowLeft : "\uf177"
|
||||
property string longArrowRight : "\uf178"
|
||||
property string longArrowUp : "\uf176"
|
||||
property string lowVision : "\uf2a8"
|
||||
property string magic : "\uf0d0"
|
||||
property string magnet : "\uf076"
|
||||
property string mailForward : "\uf064"
|
||||
property string mailReply : "\uf112"
|
||||
property string mailReplyAll : "\uf122"
|
||||
property string male : "\uf183"
|
||||
property string map : "\uf279"
|
||||
property string mapMarker : "\uf041"
|
||||
property string mapO : "\uf278"
|
||||
property string mapPin : "\uf276"
|
||||
property string mapSigns : "\uf277"
|
||||
property string mars : "\uf222"
|
||||
property string marsDouble : "\uf227"
|
||||
property string marsStroke : "\uf229"
|
||||
property string marsStrokeH : "\uf22b"
|
||||
property string marsStrokeV : "\uf22a"
|
||||
property string maxcdn : "\uf136"
|
||||
property string meanpath : "\uf20c"
|
||||
property string medium : "\uf23a"
|
||||
property string medkit : "\uf0fa"
|
||||
property string meetup : "\uf2e0"
|
||||
property string mehO : "\uf11a"
|
||||
property string mercury : "\uf223"
|
||||
property string microchip : "\uf2db"
|
||||
property string microphone : "\uf130"
|
||||
property string microphoneSlash : "\uf131"
|
||||
property string minus : "\uf068"
|
||||
property string minusCircle : "\uf056"
|
||||
property string minusSquare : "\uf146"
|
||||
property string minusSquareO : "\uf147"
|
||||
property string mixcloud : "\uf289"
|
||||
property string mobile : "\uf10b"
|
||||
property string mobilePhone : "\uf10b"
|
||||
property string modx : "\uf285"
|
||||
property string money : "\uf0d6"
|
||||
property string moonO : "\uf186"
|
||||
property string mortarBoard : "\uf19d"
|
||||
property string motorcycle : "\uf21c"
|
||||
property string mousePointer : "\uf245"
|
||||
property string music : "\uf001"
|
||||
property string navicon : "\uf0c9"
|
||||
property string neuter : "\uf22c"
|
||||
property string newspaperO : "\uf1ea"
|
||||
property string objectGroup : "\uf247"
|
||||
property string objectUngroup : "\uf248"
|
||||
property string odnoklassniki : "\uf263"
|
||||
property string odnoklassnikiSquare : "\uf264"
|
||||
property string opencart : "\uf23d"
|
||||
property string openid : "\uf19b"
|
||||
property string opera : "\uf26a"
|
||||
property string optinMonster : "\uf23c"
|
||||
property string outdent : "\uf03b"
|
||||
property string pagelines : "\uf18c"
|
||||
property string paintBrush : "\uf1fc"
|
||||
property string paperPlane : "\uf1d8"
|
||||
property string paperPlaneO : "\uf1d9"
|
||||
property string paperclip : "\uf0c6"
|
||||
property string paragraph : "\uf1dd"
|
||||
property string monero : "\uf3d0"
|
||||
property string paste : "\uf0ea"
|
||||
property string pause : "\uf04c"
|
||||
property string pauseCircle : "\uf28b"
|
||||
property string pauseCircleO : "\uf28c"
|
||||
property string paw : "\uf1b0"
|
||||
property string paypal : "\uf1ed"
|
||||
property string pencil : "\uf040"
|
||||
property string pencilSquare : "\uf14b"
|
||||
property string pencilSquareO : "\uf044"
|
||||
property string percent : "\uf295"
|
||||
property string phone : "\uf095"
|
||||
property string phoneSquare : "\uf098"
|
||||
property string photo : "\uf03e"
|
||||
property string pictureO : "\uf03e"
|
||||
property string pieChart : "\uf200"
|
||||
property string piedPiper : "\uf2ae"
|
||||
property string piedPiperAlt : "\uf1a8"
|
||||
property string piedPiperPp : "\uf1a7"
|
||||
property string pinterest : "\uf0d2"
|
||||
property string pinterestP : "\uf231"
|
||||
property string pinterestSquare : "\uf0d3"
|
||||
property string plane : "\uf072"
|
||||
property string play : "\uf04b"
|
||||
property string playCircle : "\uf144"
|
||||
property string playCircleO : "\uf01d"
|
||||
property string plug : "\uf1e6"
|
||||
property string plus : "\uf067"
|
||||
property string plusCircle : "\uf055"
|
||||
property string plusSquare : "\uf0fe"
|
||||
property string plusSquareO : "\uf196"
|
||||
property string podcast : "\uf2ce"
|
||||
property string powerOff : "\uf011"
|
||||
property string printIcon : "\uf02f"
|
||||
property string productHunt : "\uf288"
|
||||
property string puzzlePiece : "\uf12e"
|
||||
property string qq : "\uf1d6"
|
||||
property string qrcode : "\uf029"
|
||||
property string question : "\uf128"
|
||||
property string questionCircle : "\uf059"
|
||||
property string questionCircleO : "\uf29c"
|
||||
property string quora : "\uf2c4"
|
||||
property string quoteLeft : "\uf10d"
|
||||
property string quoteRight : "\uf10e"
|
||||
property string ra : "\uf1d0"
|
||||
property string random : "\uf074"
|
||||
property string ravelry : "\uf2d9"
|
||||
property string rebel : "\uf1d0"
|
||||
property string recycle : "\uf1b8"
|
||||
property string reddit : "\uf1a1"
|
||||
property string redditAlien : "\uf281"
|
||||
property string redditSquare : "\uf1a2"
|
||||
property string refresh : "\uf021"
|
||||
property string registered : "\uf25d"
|
||||
property string remove : "\uf00d"
|
||||
property string renren : "\uf18b"
|
||||
property string reorder : "\uf0c9"
|
||||
property string repeat : "\uf01e"
|
||||
property string reply : "\uf112"
|
||||
property string replyAll : "\uf122"
|
||||
property string resistance : "\uf1d0"
|
||||
property string retweet : "\uf079"
|
||||
property string rmb : "\uf157"
|
||||
property string road : "\uf018"
|
||||
property string rocket : "\uf135"
|
||||
property string rotateLeft : "\uf0e2"
|
||||
property string rotateRight : "\uf01e"
|
||||
property string rouble : "\uf158"
|
||||
property string rss : "\uf09e"
|
||||
property string rssSquare : "\uf143"
|
||||
property string rub : "\uf158"
|
||||
property string ruble : "\uf158"
|
||||
property string rupee : "\uf156"
|
||||
property string s15 : "\uf2cd"
|
||||
property string safari : "\uf267"
|
||||
property string save : "\uf0c7"
|
||||
property string scissors : "\uf0c4"
|
||||
property string scribd : "\uf28a"
|
||||
property string search : "\uf002"
|
||||
property string searchMinus : "\uf010"
|
||||
property string searchPlus : "\uf00e"
|
||||
property string sellsy : "\uf213"
|
||||
property string send : "\uf1d8"
|
||||
property string sendO : "\uf1d9"
|
||||
property string server : "\uf233"
|
||||
property string share : "\uf064"
|
||||
property string shareAlt : "\uf1e0"
|
||||
property string shareAltSquare : "\uf1e1"
|
||||
property string shareSquare : "\uf14d"
|
||||
property string shareSquareO : "\uf045"
|
||||
property string shekel : "\uf20b"
|
||||
property string sheqel : "\uf20b"
|
||||
property string shield : "\uf132"
|
||||
property string ship : "\uf21a"
|
||||
property string shirtsinbulk : "\uf214"
|
||||
property string shoppingBag : "\uf290"
|
||||
property string shoppingBasket : "\uf291"
|
||||
property string shoppingCart : "\uf07a"
|
||||
property string shower : "\uf2cc"
|
||||
property string signIn : "\uf090"
|
||||
property string signLanguage : "\uf2a7"
|
||||
property string shieldAlt : "\uf3ed"
|
||||
property string signOutAlt : "\uf2f5"
|
||||
property string signOut : "\uf08b"
|
||||
property string signal : "\uf012"
|
||||
property string signing : "\uf2a7"
|
||||
property string simplybuilt : "\uf215"
|
||||
property string sitemap : "\uf0e8"
|
||||
property string skyatlas : "\uf216"
|
||||
property string skype : "\uf17e"
|
||||
property string slack : "\uf198"
|
||||
property string sliders : "\uf1de"
|
||||
property string slideshare : "\uf1e7"
|
||||
property string smileO : "\uf118"
|
||||
property string snapchat : "\uf2ab"
|
||||
property string snapchatGhost : "\uf2ac"
|
||||
property string snapchatSquare : "\uf2ad"
|
||||
property string snowflakeO : "\uf2dc"
|
||||
property string soccerBallO : "\uf1e3"
|
||||
property string sort : "\uf0dc"
|
||||
property string sortAlphaAsc : "\uf15d"
|
||||
property string sortAlphaDesc : "\uf15e"
|
||||
property string sortAmountAsc : "\uf160"
|
||||
property string sortAmountDesc : "\uf161"
|
||||
property string sortAsc : "\uf0de"
|
||||
property string sortDesc : "\uf0dd"
|
||||
property string sortDown : "\uf0dd"
|
||||
property string sortNumericAsc : "\uf162"
|
||||
property string sortNumericDesc : "\uf163"
|
||||
property string sortUp : "\uf0de"
|
||||
property string soundcloud : "\uf1be"
|
||||
property string spaceShuttle : "\uf197"
|
||||
property string spinner : "\uf110"
|
||||
property string spoon : "\uf1b1"
|
||||
property string spotify : "\uf1bc"
|
||||
property string square : "\uf0c8"
|
||||
property string squareO : "\uf096"
|
||||
property string stackExchange : "\uf18d"
|
||||
property string stackOverflow : "\uf16c"
|
||||
property string star : "\uf005"
|
||||
property string starHalf : "\uf089"
|
||||
property string starHalfEmpty : "\uf123"
|
||||
property string starHalfFull : "\uf123"
|
||||
property string starHalfO : "\uf123"
|
||||
property string starO : "\uf006"
|
||||
property string steam : "\uf1b6"
|
||||
property string steamSquare : "\uf1b7"
|
||||
property string stepBackward : "\uf048"
|
||||
property string stepForward : "\uf051"
|
||||
property string stethoscope : "\uf0f1"
|
||||
property string stickyNote : "\uf249"
|
||||
property string stickyNoteO : "\uf24a"
|
||||
property string stop : "\uf04d"
|
||||
property string stopCircle : "\uf28d"
|
||||
property string stopCircleO : "\uf28e"
|
||||
property string streetView : "\uf21d"
|
||||
property string strikethrough : "\uf0cc"
|
||||
property string stumbleupon : "\uf1a4"
|
||||
property string stumbleuponCircle : "\uf1a3"
|
||||
property string subscript : "\uf12c"
|
||||
property string subway : "\uf239"
|
||||
property string suitcase : "\uf0f2"
|
||||
property string sunO : "\uf185"
|
||||
property string superpowers : "\uf2dd"
|
||||
property string superscript : "\uf12b"
|
||||
property string support : "\uf1cd"
|
||||
property string table : "\uf0ce"
|
||||
property string tablet : "\uf10a"
|
||||
property string tachometer : "\uf0e4"
|
||||
property string tag : "\uf02b"
|
||||
property string tags : "\uf02c"
|
||||
property string tasks : "\uf0ae"
|
||||
property string taxi : "\uf1ba"
|
||||
property string telegram : "\uf2c6"
|
||||
property string television : "\uf26c"
|
||||
property string tencentWeibo : "\uf1d5"
|
||||
property string terminal : "\uf120"
|
||||
property string textHeight : "\uf034"
|
||||
property string textWidth : "\uf035"
|
||||
property string th : "\uf00a"
|
||||
property string thLarge : "\uf009"
|
||||
property string thList : "\uf00b"
|
||||
property string themeisle : "\uf2b2"
|
||||
property string thermometer : "\uf2c7"
|
||||
property string thermometer0 : "\uf2cb"
|
||||
property string thermometer1 : "\uf2ca"
|
||||
property string thermometer2 : "\uf2c9"
|
||||
property string thermometer3 : "\uf2c8"
|
||||
property string thermometer4 : "\uf2c7"
|
||||
property string thermometerEmpty : "\uf2cb"
|
||||
property string thermometerFull : "\uf2c7"
|
||||
property string thermometerHalf : "\uf2c9"
|
||||
property string thermometerQuarter : "\uf2ca"
|
||||
property string thermometerThreeQuarters : "\uf2c8"
|
||||
property string thumbTack : "\uf08d"
|
||||
property string thumbsDown : "\uf165"
|
||||
property string thumbsODown : "\uf088"
|
||||
property string thumbsOUp : "\uf087"
|
||||
property string thumbsUp : "\uf164"
|
||||
property string ticket : "\uf145"
|
||||
property string times : "\uf00d"
|
||||
property string timesCircle : "\uf057"
|
||||
property string timesCircleO : "\uf05c"
|
||||
property string timesRectangle : "\uf2d3"
|
||||
property string timesRectangleO : "\uf2d4"
|
||||
property string tint : "\uf043"
|
||||
property string toggleDown : "\uf150"
|
||||
property string toggleLeft : "\uf191"
|
||||
property string toggleOff : "\uf204"
|
||||
property string toggleOn : "\uf205"
|
||||
property string toggleRight : "\uf152"
|
||||
property string toggleUp : "\uf151"
|
||||
property string trademark : "\uf25c"
|
||||
property string train : "\uf238"
|
||||
property string transgender : "\uf224"
|
||||
property string transgenderAlt : "\uf225"
|
||||
property string trash : "\uf1f8"
|
||||
property string trashO : "\uf014"
|
||||
property string tree : "\uf1bb"
|
||||
property string trello : "\uf181"
|
||||
property string tripadvisor : "\uf262"
|
||||
property string trophy : "\uf091"
|
||||
property string truck : "\uf0d1"
|
||||
property string tryIcon : "\uf195"
|
||||
property string tty : "\uf1e4"
|
||||
property string tumblr : "\uf173"
|
||||
property string tumblrSquare : "\uf174"
|
||||
property string turkishLira : "\uf195"
|
||||
property string tv : "\uf26c"
|
||||
property string twitch : "\uf1e8"
|
||||
property string twitter : "\uf099"
|
||||
property string twitterSquare : "\uf081"
|
||||
property string umbrella : "\uf0e9"
|
||||
property string underline : "\uf0cd"
|
||||
property string undo : "\uf0e2"
|
||||
property string universalAccess : "\uf29a"
|
||||
property string university : "\uf19c"
|
||||
property string unlink : "\uf127"
|
||||
property string unlock : "\uf09c"
|
||||
property string unlockAlt : "\uf13e"
|
||||
property string unsorted : "\uf0dc"
|
||||
property string upload : "\uf093"
|
||||
property string usb : "\uf287"
|
||||
property string usd : "\uf155"
|
||||
property string user : "\uf007"
|
||||
property string userCircle : "\uf2bd"
|
||||
property string userCircleO : "\uf2be"
|
||||
property string userMd : "\uf0f0"
|
||||
property string userO : "\uf2c0"
|
||||
property string userPlus : "\uf234"
|
||||
property string userSecret : "\uf21b"
|
||||
property string userTimes : "\uf235"
|
||||
property string users : "\uf0c0"
|
||||
property string vcard : "\uf2bb"
|
||||
property string vcardO : "\uf2bc"
|
||||
property string venus : "\uf221"
|
||||
property string venusDouble : "\uf226"
|
||||
property string venusMars : "\uf228"
|
||||
property string viacoin : "\uf237"
|
||||
property string viadeo : "\uf2a9"
|
||||
property string viadeoSquare : "\uf2aa"
|
||||
property string videoCamera : "\uf03d"
|
||||
property string vimeo : "\uf27d"
|
||||
property string vimeoSquare : "\uf194"
|
||||
property string vine : "\uf1ca"
|
||||
property string vk : "\uf189"
|
||||
property string volumeControlPhone : "\uf2a0"
|
||||
property string volumeDown : "\uf027"
|
||||
property string volumeOff : "\uf026"
|
||||
property string volumeUp : "\uf028"
|
||||
property string warning : "\uf071"
|
||||
property string wechat : "\uf1d7"
|
||||
property string weibo : "\uf18a"
|
||||
property string weixin : "\uf1d7"
|
||||
property string whatsapp : "\uf232"
|
||||
property string wheelchair : "\uf193"
|
||||
property string wheelchairAlt : "\uf29b"
|
||||
property string wifi : "\uf1eb"
|
||||
property string wikipediaW : "\uf266"
|
||||
property string windowClose : "\uf2d3"
|
||||
property string windowCloseO : "\uf2d4"
|
||||
property string windowMaximize : "\uf2d0"
|
||||
property string windowMinimize : "\uf2d1"
|
||||
property string windowRestore : "\uf2d2"
|
||||
property string windows : "\uf17a"
|
||||
property string won : "\uf159"
|
||||
property string wordpress : "\uf19a"
|
||||
property string wpbeginner : "\uf297"
|
||||
property string wpexplorer : "\uf2de"
|
||||
property string wpforms : "\uf298"
|
||||
property string wrench : "\uf0ad"
|
||||
property string xing : "\uf168"
|
||||
property string xingSquare : "\uf169"
|
||||
property string yCombinator : "\uf23b"
|
||||
property string yCombinatorSquare : "\uf1d4"
|
||||
property string yahoo : "\uf19e"
|
||||
property string yc : "\uf23b"
|
||||
property string ycSquare : "\uf1d4"
|
||||
property string yelp : "\uf1e9"
|
||||
property string yen : "\uf157"
|
||||
property string yoast : "\uf2b1"
|
||||
property string youtube : "\uf167"
|
||||
property string youtubePlay : "\uf16a"
|
||||
property string youtubeSquare : "\uf166"
|
||||
}
|
||||
|
||||
BIN
fonts/FontAwesome/fa-brands-400.otf
Normal file
BIN
fonts/FontAwesome/fa-brands-400.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
fonts/FontAwesome/fa-regular-400.otf
Normal file
BIN
fonts/FontAwesome/fa-regular-400.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
fonts/FontAwesome/fa-solid-900.otf
Normal file
BIN
fonts/FontAwesome/fa-solid-900.otf
Normal file
Binary file not shown.
Binary file not shown.
BIN
images/ledgerNanoS.png
Normal file
BIN
images/ledgerNanoS.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
images/ledgerNanoX.png
Normal file
BIN
images/ledgerNanoX.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
images/trezor.png
Normal file
BIN
images/trezor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
BIN
images/trezor@2x.png
Normal file
BIN
images/trezor@2x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 301 KiB |
@@ -74,13 +74,29 @@ function isValidOpenAliasAddress(address) {
|
||||
return true
|
||||
}
|
||||
|
||||
function makeQRCodeString(addr, amount) {
|
||||
function makeQRCodeString(addr, amount, txDescription, recipientName) {
|
||||
var XMR_URI_SCHEME = "monero:"
|
||||
var XMR_AMOUNT = "tx_amount"
|
||||
var XMR_RECIPIENT_NAME = "recipient_name"
|
||||
var XMR_TX_DESCRIPTION = "tx_description"
|
||||
var qrCodeString =""
|
||||
qrCodeString += (XMR_URI_SCHEME + addr)
|
||||
if (amount !== undefined && amount !== ""){
|
||||
qrCodeString += ("?" + XMR_AMOUNT + "=" + amount)
|
||||
}
|
||||
if (txDescription !== undefined && txDescription !== ""){
|
||||
if (amount == ""){
|
||||
qrCodeString += ("?" + XMR_TX_DESCRIPTION + "=" + encodeURI(txDescription))
|
||||
} else {
|
||||
qrCodeString += ("&" + XMR_TX_DESCRIPTION + "=" + encodeURI(txDescription))
|
||||
}
|
||||
}
|
||||
if (recipientName !== undefined && recipientName !== ""){
|
||||
if (amount == "" && txDescription == ""){
|
||||
qrCodeString += ("?" + XMR_RECIPIENT_NAME + "=" + encodeURI(recipientName))
|
||||
} else {
|
||||
qrCodeString += ("&" + XMR_RECIPIENT_NAME + "=" + encodeURI(recipientName))
|
||||
}
|
||||
}
|
||||
return qrCodeString
|
||||
}
|
||||
|
||||
15
js/Utils.js
15
js/Utils.js
@@ -115,3 +115,18 @@ function capitalize(s){
|
||||
function removeTrailingZeros(value) {
|
||||
return (value + '').replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '');
|
||||
}
|
||||
|
||||
function parseDateStringOrRestoreHeightAsInteger(value) {
|
||||
// Parse date string or restore height as integer
|
||||
var restoreHeight = 0;
|
||||
if (value.indexOf('-') === 4 && value.length === 10) {
|
||||
restoreHeight = Wizard.getApproximateBlockchainHeight(value, Utils.netTypeToString());
|
||||
} else if (parseInt(value.substring(0, 4)) >= 2014 && parseInt(value.substring(0, 4)) <= 2025 && value.length === 8) {
|
||||
// Correct date typed in a wrong format (20201225 instead of 2020-12-25)
|
||||
var restoreHeightHyphenated = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6, 8);
|
||||
restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeightHyphenated, Utils.netTypeToString());
|
||||
} else {
|
||||
restoreHeight = parseInt(value);
|
||||
}
|
||||
return restoreHeight;
|
||||
}
|
||||
|
||||
18
js/Wizard.js
18
js/Wizard.js
@@ -69,10 +69,7 @@ function walletPathExists(accountsDir, directory, filename, isIOS, walletManager
|
||||
if(!filename || filename === "") return false;
|
||||
if(!directory || directory === "") return false;
|
||||
|
||||
// make sure directory endswith path seperator
|
||||
// @TODO: use .endswith() after Qt 5.8
|
||||
var trailing_path_sep = directory[directory.length-1];
|
||||
if(trailing_path_sep !== "/" && trailing_path_sep !== "\\")
|
||||
if (!directory.endsWith("/") && !directory.endsWith("\\"))
|
||||
directory += "/"
|
||||
|
||||
if(isIOS)
|
||||
@@ -85,6 +82,17 @@ function walletPathExists(accountsDir, directory, filename, isIOS, walletManager
|
||||
return false;
|
||||
}
|
||||
|
||||
function unusedWalletName(directory, filename, walletManager) {
|
||||
for (var i = 0; i < 100; i++) {
|
||||
var walletName = filename + (i > 0 ? "_" + i : "");
|
||||
if (!walletManager.walletExists(directory + "/" + walletName + "/" + walletName)) {
|
||||
return walletName;
|
||||
}
|
||||
}
|
||||
|
||||
return filename;
|
||||
}
|
||||
|
||||
function isAscii(str){
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
if (str.charCodeAt(i) > 127)
|
||||
@@ -158,7 +166,7 @@ function getApproximateBlockchainHeight(_date, _nettype){
|
||||
|
||||
if(_nettype == "Testnet"){
|
||||
// testnet got some huge rollbacks, so the estimation is way off
|
||||
var approximateTestnetRolledBackBlocks = 303967;
|
||||
var approximateTestnetRolledBackBlocks = 342100;
|
||||
if(approxBlockchainHeight > approximateTestnetRolledBackBlocks)
|
||||
approxBlockchainHeight -= approximateTestnetRolledBackBlocks
|
||||
}
|
||||
|
||||
104
main.qml
104
main.qml
@@ -26,7 +26,7 @@
|
||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import QtQml.Models 2.12
|
||||
import QtQml.Models 2.2
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Window 2.0
|
||||
import QtQuick.Controls 1.1
|
||||
@@ -62,6 +62,7 @@ ApplicationWindow {
|
||||
minimumHeight: 450
|
||||
|
||||
property var currentItem
|
||||
property var previousActiveFocusItem
|
||||
property bool hideBalanceForced: false
|
||||
property bool ctrlPressed: false
|
||||
property alias persistentSettings : persistentSettings
|
||||
@@ -73,7 +74,7 @@ ApplicationWindow {
|
||||
property int restoreHeight:0
|
||||
property bool daemonSynced: false
|
||||
property bool walletSynced: false
|
||||
property int maxWindowHeight: (isAndroid || isIOS)? screenHeight : (screenHeight < 900)? 720 : 800;
|
||||
property int maxWindowHeight: (isAndroid || isIOS)? screenAvailableHeight : (screenAvailableHeight < 900)? 720 : 800;
|
||||
property bool daemonRunning: !persistentSettings.useRemoteNode && !disconnected
|
||||
property int daemonStartStopInProgress: 0
|
||||
property alias toolTip: toolTip
|
||||
@@ -92,16 +93,14 @@ ApplicationWindow {
|
||||
readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype)
|
||||
property string currentDaemonAddress;
|
||||
property int disconnectedEpoch: 0
|
||||
property int estimatedBlockchainSize: 75 // GB
|
||||
property int estimatedBlockchainSize: persistentSettings.pruneBlockchain ? 40 : 105 // GB
|
||||
property alias viewState: rootItem.state
|
||||
property string prevSplashText;
|
||||
property bool splashDisplayedBeforeButtonRequest;
|
||||
property int appEpoch: Math.floor((new Date).getTime() / 1000)
|
||||
property bool themeTransition: false
|
||||
|
||||
// fiat price conversion
|
||||
property real fiatPriceXMRUSD: 0
|
||||
property real fiatPriceXMREUR: 0
|
||||
property real fiatPrice: 0
|
||||
property var fiatPriceAPIs: {
|
||||
return {
|
||||
"kraken": {
|
||||
@@ -127,8 +126,6 @@ ApplicationWindow {
|
||||
property var current_address_label: "Primary"
|
||||
property int current_subaddress_table_index: 0
|
||||
|
||||
function altKeyReleased() { ctrlPressed = false; }
|
||||
|
||||
function showPageRequest(page) {
|
||||
middlePanel.state = page
|
||||
leftPanel.selectItem(page)
|
||||
@@ -214,6 +211,9 @@ ApplicationWindow {
|
||||
if (prevState) {
|
||||
appWindow.viewState = prevState;
|
||||
}
|
||||
if (wizard.wizardState == "wizardOpenWallet1") {
|
||||
wizard.wizardStateView.wizardOpenWallet1View.pageRoot.forceActiveFocus();
|
||||
}
|
||||
};
|
||||
passwordDialog.open(usefulName(persistentSettings.wallet_path));
|
||||
}
|
||||
@@ -361,6 +361,7 @@ ApplicationWindow {
|
||||
middlePanel.getProofClicked.connect(handleGetProof);
|
||||
middlePanel.checkProofClicked.connect(handleCheckProof);
|
||||
|
||||
persistentSettings.restore_height = currentWallet.walletCreationHeight;
|
||||
|
||||
console.log("Recovering from seed: ", persistentSettings.is_recovering)
|
||||
console.log("restore Height", persistentSettings.restore_height)
|
||||
@@ -424,8 +425,8 @@ ApplicationWindow {
|
||||
leftPanel.balanceString = balance
|
||||
leftPanel.balanceUnlockedString = balanceU
|
||||
if (middlePanel.state === "Account") {
|
||||
middlePanel.accountView.balanceAllText = walletManager.displayAmount(appWindow.currentWallet.balanceAll());
|
||||
middlePanel.accountView.unlockedBalanceAllText = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll());
|
||||
middlePanel.accountView.balanceAllText = walletManager.displayAmount(appWindow.currentWallet.balanceAll()) + " XMR";
|
||||
middlePanel.accountView.unlockedBalanceAllText = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()) + " XMR";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -534,12 +535,6 @@ ApplicationWindow {
|
||||
// try to resolve common wallet cache errors automatically
|
||||
switch (wallet.errorString) {
|
||||
case "basic_string::_M_replace_aux":
|
||||
walletManager.clearWalletCache(wallet.path);
|
||||
walletPassword = passwordDialog.password;
|
||||
appWindow.initialize();
|
||||
console.error("Repairing wallet cache with error: ", wallet.errorString);
|
||||
appWindow.showStatusMessage(qsTr("Repairing incompatible wallet cache. Resyncing wallet."),6);
|
||||
return;
|
||||
case "std::bad_alloc":
|
||||
walletManager.clearWalletCache(wallet.path);
|
||||
walletPassword = passwordDialog.password;
|
||||
@@ -938,7 +933,7 @@ ApplicationWindow {
|
||||
// called after user confirms transaction
|
||||
function handleTransactionConfirmed(fileName) {
|
||||
// View only wallet - we save the tx
|
||||
if(viewOnly && saveTxDialog.fileUrl){
|
||||
if(viewOnly){
|
||||
// No file specified - abort
|
||||
if(!saveTxDialog.fileUrl) {
|
||||
currentWallet.disposeTransaction(transaction)
|
||||
@@ -983,6 +978,11 @@ ApplicationWindow {
|
||||
});
|
||||
}
|
||||
|
||||
function doSearchInHistory(searchTerm) {
|
||||
middlePanel.searchInHistory(searchTerm);
|
||||
leftPanel.selectItem(middlePanel.state)
|
||||
}
|
||||
|
||||
// called on "getProof"
|
||||
function handleGetProof(txid, address, message) {
|
||||
console.log("Getting payment proof: ")
|
||||
@@ -1005,7 +1005,6 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
function txProofComputed(txid, result){
|
||||
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
|
||||
if (result.indexOf("error|") === 0) {
|
||||
var errorString = result.split("|")[1];
|
||||
informationPopup.text = qsTr("Couldn't generate a proof because of the following reason: \n") + errorString + translationManager.emptyString;
|
||||
@@ -1014,8 +1013,6 @@ ApplicationWindow {
|
||||
informationPopup.text = result;
|
||||
informationPopup.icon = StandardIcon.Critical;
|
||||
}
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open()
|
||||
}
|
||||
|
||||
// called on "checkProof"
|
||||
@@ -1070,12 +1067,6 @@ ApplicationWindow {
|
||||
informationPopup.open()
|
||||
}
|
||||
|
||||
// blocks UI if wallet can't be opened or no connection to the daemon
|
||||
function enableUI(enable) {
|
||||
middlePanel.enabled = enable;
|
||||
leftPanel.enabled = enable;
|
||||
}
|
||||
|
||||
function showProcessingSplash(message) {
|
||||
console.log("Displaying processing splash")
|
||||
if (typeof message != 'undefined') {
|
||||
@@ -1113,20 +1104,20 @@ ApplicationWindow {
|
||||
middlePanel.addressBookView.clearFields();
|
||||
middlePanel.transferView.clearFields();
|
||||
middlePanel.receiveView.clearFields();
|
||||
middlePanel.historyView.clearFields();
|
||||
// disable timers
|
||||
userInActivityTimer.running = false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
objectName: "appWindow"
|
||||
visible: true
|
||||
width: Screen.desktopAvailableWidth > 980
|
||||
width: screenAvailableWidth > 980
|
||||
? 980
|
||||
: Math.min(Screen.desktopAvailableWidth, 800)
|
||||
height: Screen.desktopAvailableHeight > maxWindowHeight
|
||||
: Math.min(screenAvailableWidth, 800)
|
||||
height: screenAvailableHeight > maxWindowHeight
|
||||
? maxWindowHeight
|
||||
: Math.min(Screen.desktopAvailableHeight, 700)
|
||||
: Math.min(screenAvailableHeight, 700)
|
||||
color: MoneroComponents.Style.appWindowBackgroundColor
|
||||
flags: persistentSettings.customDecorations ? Windows.flagsCustomDecorations : Windows.flags
|
||||
|
||||
@@ -1213,10 +1204,7 @@ ApplicationWindow {
|
||||
return;
|
||||
}
|
||||
|
||||
if(persistentSettings.fiatPriceCurrency === "xmrusd")
|
||||
appWindow.fiatPriceXMRUSD = ticker;
|
||||
else if(persistentSettings.fiatPriceCurrency === "xmreur")
|
||||
appWindow.fiatPriceXMREUR = ticker;
|
||||
appWindow.fiatPrice = ticker;
|
||||
|
||||
appWindow.updateBalance();
|
||||
}
|
||||
@@ -1255,7 +1243,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
function fiatApiConvertToFiat(amount) {
|
||||
var ticker = persistentSettings.fiatPriceCurrency === "xmrusd" ? appWindow.fiatPriceXMRUSD : appWindow.fiatPriceXMREUR;
|
||||
const ticker = appWindow.fiatPrice;
|
||||
if(ticker <= 0){
|
||||
fiatApiError("Invalid ticker value: " + ticker);
|
||||
return "?.??";
|
||||
@@ -1263,6 +1251,15 @@ ApplicationWindow {
|
||||
return (amount * ticker).toFixed(2);
|
||||
}
|
||||
|
||||
function fiatApiConvertToXMR(amount) {
|
||||
const ticker = appWindow.fiatPrice;
|
||||
if(ticker <= 0){
|
||||
fiatApiError("Invalid ticker value: " + ticker);
|
||||
return "?.??";
|
||||
}
|
||||
return (amount / ticker).toFixed(12);
|
||||
}
|
||||
|
||||
function fiatApiUpdateBalance(balance){
|
||||
// update balance card
|
||||
var bFiat = "?.??"
|
||||
@@ -1285,8 +1282,12 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
x = (Screen.desktopAvailableWidth - width) / 2;
|
||||
y = (Screen.desktopAvailableHeight - height) / 2;
|
||||
if (screenAvailableWidth > width) {
|
||||
x = (screenAvailableWidth - width) / 2;
|
||||
}
|
||||
if (screenAvailableHeight > height) {
|
||||
y = (screenAvailableHeight - height) / 2;
|
||||
}
|
||||
|
||||
translationManager.setLanguage(persistentSettings.locale.split("_")[0]);
|
||||
|
||||
@@ -1414,7 +1415,7 @@ ApplicationWindow {
|
||||
property bool lockOnUserInActivity: true
|
||||
property int walletMode: 2
|
||||
property int lockOnUserInActivityInterval: 10 // minutes
|
||||
property bool blackTheme: true
|
||||
property bool blackTheme: MoneroComponents.Style.blackTheme
|
||||
property bool checkForUpdates: true
|
||||
property bool autosave: true
|
||||
property int autosaveMinutes: 10
|
||||
@@ -1948,7 +1949,8 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
function toggleLanguageView(){
|
||||
languageSidebar.isOpened ? languageSidebar.close() : languageSidebar.open();
|
||||
languageSidebar.visible ? languageSidebar.close() : languageSidebar.open();
|
||||
languageSidebar.selectCurrentLanguage()
|
||||
resetLanguageFields()
|
||||
}
|
||||
|
||||
@@ -2208,8 +2210,7 @@ ApplicationWindow {
|
||||
|
||||
function userActivity() {
|
||||
// register user activity
|
||||
var epoch = Math.floor((new Date).getTime()/1000);
|
||||
appWindow.userLastActive = epoch;
|
||||
appWindow.userLastActive = Utils.epoch();
|
||||
}
|
||||
|
||||
function checkInUserActivity() {
|
||||
@@ -2217,24 +2218,32 @@ ApplicationWindow {
|
||||
if(!persistentSettings.lockOnUserInActivity) return;
|
||||
if(passwordDialog.visible) return;
|
||||
var inputDialogVisible = inputDialog && inputDialog.visible
|
||||
var successfulTxPopupVisible = successfulTxPopup && successfulTxPopup.visible
|
||||
var informationPopupVisible = informationPopup && informationPopup.visible
|
||||
|
||||
// prompt password after X seconds of inactivity
|
||||
var epoch = Math.floor((new Date).getTime() / 1000);
|
||||
var inactivity = epoch - appWindow.userLastActive;
|
||||
var inactivity = Utils.epoch() - appWindow.userLastActive;
|
||||
if(inactivity < (persistentSettings.lockOnUserInActivityInterval * 60)) return;
|
||||
|
||||
passwordDialog.onAcceptedCallback = function() {
|
||||
if(walletPassword === passwordDialog.password){
|
||||
passwordDialog.close();
|
||||
if (inputDialogVisible) inputDialog.open(inputDialog.inputText)
|
||||
if (successfulTxPopupVisible) successfulTxPopup.open(successfulTxPopup.transactionID)
|
||||
if (informationPopupVisible) informationPopup.open()
|
||||
} else {
|
||||
passwordDialog.showError(qsTr("Wrong password"));
|
||||
}
|
||||
if (inputDialogVisible) inputDialog.open(inputDialog.inputText)
|
||||
}
|
||||
|
||||
passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); }
|
||||
if (inputDialogVisible) inputDialog.close()
|
||||
remoteNodeDialog.close();
|
||||
informationPopup.close()
|
||||
txConfirmationPopup.close()
|
||||
txConfirmationPopup.clearFields()
|
||||
txConfirmationPopup.rejected()
|
||||
successfulTxPopup.close();
|
||||
passwordDialog.open();
|
||||
}
|
||||
|
||||
@@ -2251,7 +2260,6 @@ ApplicationWindow {
|
||||
|
||||
function changeWalletMode(mode){
|
||||
appWindow.disconnectedEpoch = 0;
|
||||
appWindow.walletMode = mode;
|
||||
persistentSettings.walletMode = mode;
|
||||
applyWalletMode(mode);
|
||||
}
|
||||
@@ -2355,8 +2363,12 @@ ApplicationWindow {
|
||||
MoneroComponents.LanguageSidebar {
|
||||
id: languageSidebar
|
||||
dragMargin: 0
|
||||
onAboutToShow: previousActiveFocusItem = activeFocusItem;
|
||||
onClosed: { if (previousActiveFocusItem) previousActiveFocusItem.forceActiveFocus() }
|
||||
}
|
||||
|
||||
MoneroComponents.MenuBar { }
|
||||
|
||||
Network {
|
||||
id: network
|
||||
proxyAddress: persistentSettings.getProxyAddress()
|
||||
|
||||
2
monero
2
monero
Submodule monero updated: f6e63ef260...2222bea92f
@@ -103,6 +103,7 @@ Rectangle {
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: balanceAll
|
||||
Layout.rightMargin: 87
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name;
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
@@ -115,7 +116,8 @@ Rectangle {
|
||||
onExited: parent.color = MoneroComponents.Style.defaultFontColor
|
||||
onClicked: {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(parent.text);
|
||||
var balanceAllNumberOnly = parent.text.slice(0, -4);
|
||||
clipboard.setText(balanceAllNumberOnly);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
@@ -136,6 +138,7 @@ Rectangle {
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: unlockedBalanceAll
|
||||
Layout.rightMargin: 87
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name;
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
@@ -148,7 +151,8 @@ Rectangle {
|
||||
onExited: parent.color = MoneroComponents.Style.defaultFontColor
|
||||
onClicked: {
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(parent.text);
|
||||
var unlockedBalanceAllNumberOnly = parent.text.slice(0, -4);
|
||||
clipboard.setText(unlockedBalanceAllNumberOnly);
|
||||
appWindow.showStatusMessage(qsTr("Copied to clipboard"),3)
|
||||
}
|
||||
}
|
||||
@@ -192,6 +196,15 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
color: itemMouseArea.containsMouse || index === currentAccountIndex ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
|
||||
Rectangle {
|
||||
visible: index === currentAccountIndex
|
||||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: "darkgrey"
|
||||
width: 2
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
anchors.right: parent.right
|
||||
@@ -241,7 +254,7 @@ Rectangle {
|
||||
id: addressLabel
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: mainLayout.width >= 590 ? balanceTextLabel.left : balanceNumberLabel.left
|
||||
anchors.left: balanceNumberLabel.left
|
||||
anchors.leftMargin: -addressLabel.width - 30
|
||||
fontSize: 16
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name;
|
||||
@@ -249,18 +262,6 @@ Rectangle {
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: balanceTextLabel
|
||||
visible: mainLayout.width >= 590
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: balanceNumberLabel.left
|
||||
anchors.leftMargin: -balanceTextLabel.width - 5
|
||||
fontSize: 16
|
||||
text: qsTr("Balance: ") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: balanceNumberLabel
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
@@ -269,9 +270,9 @@ Rectangle {
|
||||
anchors.leftMargin: -balanceNumberLabel.width
|
||||
fontSize: 16
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name;
|
||||
text: balance
|
||||
text: balance + " XMR"
|
||||
elide: Text.ElideRight
|
||||
textWidth: mainLayout.width < 660 ? 70 : 135
|
||||
textWidth: 180
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
@@ -298,10 +299,14 @@ Rectangle {
|
||||
MoneroComponents.IconButton {
|
||||
id: renameButton
|
||||
image: "qrc:///images/edit.svg"
|
||||
fontAwesomeFallbackIcon: FontAwesome.edit
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 23
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("Edit account label") + translationManager.emptyString
|
||||
|
||||
onClicked: pageAccount.renameSubaddressAccountLabel(index);
|
||||
}
|
||||
@@ -309,10 +314,14 @@ Rectangle {
|
||||
MoneroComponents.IconButton {
|
||||
id: copyButton
|
||||
image: "qrc:///images/copy.svg"
|
||||
fontAwesomeFallbackIcon: FontAwesome.clipboard
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 16
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
console.log("Address copied to clipboard");
|
||||
@@ -374,8 +383,8 @@ Rectangle {
|
||||
subaddressAccountListView.model = appWindow.currentWallet.subaddressAccountModel;
|
||||
appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount)
|
||||
|
||||
balanceAll.text = walletManager.displayAmount(appWindow.currentWallet.balanceAll())
|
||||
unlockedBalanceAll.text = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll())
|
||||
balanceAll.text = walletManager.displayAmount(appWindow.currentWallet.balanceAll()) + " XMR"
|
||||
unlockedBalanceAll.text = walletManager.displayAmount(appWindow.currentWallet.unlockedBalanceAll()) + " XMR"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -134,7 +134,7 @@ Rectangle {
|
||||
height: addressBookListRow.addressBookListItemHeight
|
||||
width: parent ? parent.width : undefined
|
||||
Layout.fillWidth: true
|
||||
color: "transparent"
|
||||
color: itemMouseArea.containsMouse ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
|
||||
function doSend() {
|
||||
console.log("Sending to: ", address +" "+ paymentId);
|
||||
@@ -159,7 +159,7 @@ Rectangle {
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 5
|
||||
anchors.rightMargin: 110
|
||||
anchors.rightMargin: 125
|
||||
color: "transparent"
|
||||
|
||||
MoneroComponents.Label {
|
||||
@@ -187,8 +187,10 @@ Rectangle {
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemMouseArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
visible: root.selectAndSend
|
||||
onClicked: {
|
||||
doSend();
|
||||
@@ -207,21 +209,42 @@ Rectangle {
|
||||
id: sendToButton
|
||||
image: "qrc:///images/arrow-right-in-circle-outline-medium-white.svg"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowRight
|
||||
fontAwesomeFallbackSize: 22
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 20
|
||||
Layout.preferredHeight: 20
|
||||
tooltip: qsTr("Send to this address") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
doSend();
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
fontAwesomeFallbackIcon: FontAwesome.searchPlus
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 23
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("See transactions") + translationManager.emptyString
|
||||
|
||||
onClicked: doSearchInHistory(address)
|
||||
}
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
id: renameButton
|
||||
image: "qrc:///images/edit.svg"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackIcon: FontAwesome.edit
|
||||
fontAwesomeFallbackSize: 22
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 23
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("Edit address label") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
addressBookListView.currentIndex = index;
|
||||
@@ -232,10 +255,14 @@ Rectangle {
|
||||
MoneroComponents.IconButton {
|
||||
id: copyButton
|
||||
image: "qrc:///images/copy.svg"
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackIcon: FontAwesome.clipboard
|
||||
fontAwesomeFallbackSize: 22
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 16
|
||||
Layout.preferredHeight: 21
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
console.log("Address copied to clipboard");
|
||||
@@ -292,6 +319,8 @@ Rectangle {
|
||||
MoneroComponents.LineEditMulti {
|
||||
id: addressLine
|
||||
Layout.topMargin: 20
|
||||
KeyNavigation.backtab: deleteButton.visible ? deleteButton: cancelButton
|
||||
KeyNavigation.tab: resolveButton.visible ? resolveButton : descriptionLine
|
||||
labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1"
|
||||
.arg(qsTr("Address")) + translationManager.emptyString
|
||||
placeholderText: {
|
||||
@@ -313,6 +342,31 @@ Rectangle {
|
||||
descriptionLine.text = parsed.tx_description;
|
||||
}
|
||||
}
|
||||
onEnterPressed: addButton.enabled ? addButton.clicked() : ""
|
||||
onReturnPressed: addButton.enabled ? addButton.clicked() : ""
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontStyleName: "Solid"
|
||||
fontPixelSize: 18
|
||||
text: FontAwesome.desktop
|
||||
tooltip: qsTr("Grab QR code from screen") + translationManager.emptyString
|
||||
onClicked: {
|
||||
clearFields();
|
||||
const codes = oshelper.grabQrCodesFromScreen();
|
||||
for (var index = 0; index < codes.length; ++index) {
|
||||
const parsed = walletManager.parse_uri_to_object(codes[index]);
|
||||
if (!parsed.error) {
|
||||
addressLine.text = parsed.address
|
||||
descriptionLine.text = parsed.recipient_name
|
||||
break;
|
||||
} else if (walletManager.addressValid(codes[index], appWindow.persistentSettings.nettype)) {
|
||||
addressLine.text = codes[index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
buttonColor: MoneroComponents.Style.orange
|
||||
@@ -328,6 +382,8 @@ Rectangle {
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: resolveButton
|
||||
KeyNavigation.backtab: addressLine
|
||||
KeyNavigation.tab: descriptionLine
|
||||
Layout.topMargin: 10
|
||||
text: qsTr("Resolve") + translationManager.emptyString
|
||||
visible: TxUtils.isValidOpenAliasAddress(addressLine.text)
|
||||
@@ -365,17 +421,25 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.LineEditMulti {
|
||||
MoneroComponents.LineEdit {
|
||||
id: descriptionLine
|
||||
KeyNavigation.backtab: resolveButton.visible ? resolveButton : addressLine
|
||||
KeyNavigation.tab: addButton.enabled ? addButton : cancelButton
|
||||
Layout.topMargin: 20
|
||||
Layout.fillWidth: true
|
||||
fontSize: 16
|
||||
placeholderFontSize: 16
|
||||
labelText: "<style type='text/css'>a {text-decoration: none; color: #858585; font-size: 14px;}</style> %1"
|
||||
.arg(qsTr("Description")) + translationManager.emptyString
|
||||
placeholderText: qsTr("Add a name...") + translationManager.emptyString
|
||||
onAccepted: addButton.enabled ? addButton.clicked() : ""
|
||||
}
|
||||
RowLayout {
|
||||
Layout.topMargin: 20
|
||||
MoneroComponents.StandardButton {
|
||||
id: addButton
|
||||
KeyNavigation.backtab: descriptionLine
|
||||
KeyNavigation.tab: cancelButton
|
||||
text: (root.editEntry ? qsTr("Save") : qsTr("Add")) + translationManager.emptyString
|
||||
enabled: root.checkInformation(addressLine.text, appWindow.persistentSettings.nettype)
|
||||
onClicked: {
|
||||
@@ -401,39 +465,25 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
MoneroComponents.StandardButton {
|
||||
id: cancelButton
|
||||
Layout.leftMargin: 20
|
||||
font.pixelSize: 16
|
||||
font.bold: false
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
KeyNavigation.backtab: addButton
|
||||
KeyNavigation.tab: deleteButton.visible ? deleteButton : addressLine
|
||||
text: qsTr("Cancel") + translationManager.emptyString
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: root.showAddressBook();
|
||||
}
|
||||
primary: false
|
||||
onClicked: root.showAddressBook();
|
||||
}
|
||||
|
||||
Text {
|
||||
MoneroComponents.StandardButton {
|
||||
id: deleteButton
|
||||
KeyNavigation.backtab: cancelButton
|
||||
KeyNavigation.tab: addressLine
|
||||
visible: root.editEntry
|
||||
Layout.leftMargin: 20
|
||||
font.pixelSize: 16
|
||||
font.bold: false
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: qsTr("Delete") + translationManager.emptyString
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onClicked: {
|
||||
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
|
||||
root.showAddressBook();
|
||||
}
|
||||
primary: false
|
||||
onClicked: {
|
||||
currentWallet.addressBook.deleteRow(addressBookListView.currentIndex);
|
||||
root.showAddressBook();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -464,6 +514,7 @@ Rectangle {
|
||||
addressBookEmptyLayout.visible = false
|
||||
addressBookLayout.visible = false;
|
||||
addContactLayout.visible = true;
|
||||
addressLine.forceActiveFocus();
|
||||
}
|
||||
|
||||
function showEditAddress(address, description) {
|
||||
@@ -474,12 +525,14 @@ Rectangle {
|
||||
addContactLayout.visible = true;
|
||||
addressLine.text = address;
|
||||
descriptionLine.text = description;
|
||||
addressLine.forceActiveFocus();
|
||||
addressLine.cursorPosition = addressLine.text.length;
|
||||
}
|
||||
|
||||
function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) {
|
||||
console.log("updateFromQrCode")
|
||||
addressLine.text = address
|
||||
descriptionLine.text = recipient_name + " " + tx_description
|
||||
descriptionLine.text = recipient_name
|
||||
cameraUi.qrcode_decoded.disconnect(updateFromQrCode)
|
||||
}
|
||||
|
||||
|
||||
@@ -154,12 +154,15 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
input.topPadding: 6
|
||||
input.bottomPadding: 6
|
||||
fontSize: 16
|
||||
fontSize: 15
|
||||
labelFontSize: 14
|
||||
placeholderText: qsTr("Search by Transaction ID, Address, Description, Amount or Blockheight") + translationManager.emptyString
|
||||
placeholderFontSize: 16
|
||||
placeholderFontSize: 15
|
||||
inputHeight: 34
|
||||
onTextUpdated: {
|
||||
if (!sortAndFilter.collapsed) {
|
||||
sortAndFilter.collapsed = true;
|
||||
}
|
||||
if(searchInput.text != null && searchInput.text.length >= 3){
|
||||
root.sortSearchString = searchInput.text;
|
||||
root.reset();
|
||||
@@ -170,6 +173,27 @@ Rectangle {
|
||||
root.updateFilter();
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
height: cleanButton.height
|
||||
width: cleanButton.width
|
||||
Layout.rightMargin: -8
|
||||
Layout.leftMargin: -2
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
id: cleanButton
|
||||
buttonColor: "transparent"
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontStyleName: "Solid"
|
||||
fontPixelSize: 18
|
||||
text: FontAwesome.times
|
||||
tooltip: qsTr("Clean") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
visible: searchInput.text != ""
|
||||
onClicked: searchInput.text = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -588,6 +612,7 @@ Rectangle {
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
visible: !isFailed && !isPending
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 24
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@@ -596,6 +621,19 @@ Rectangle {
|
||||
radius: 8
|
||||
color: isout ? "#d85a00" : "#2eb358"
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
visible: isFailed || isPending
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 24
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.family: FontAwesome.fontFamilySolid
|
||||
font.styleName: isFailed ? "Solid" : ""
|
||||
font.pixelSize: 15
|
||||
text: isFailed ? FontAwesome.times : FontAwesome.clockO
|
||||
color: isFailed ? "#FF0000" : MoneroComponents.Style.defaultFontColor
|
||||
themeTransition: false
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
@@ -633,7 +671,7 @@ Rectangle {
|
||||
MoneroComponents.TextPlain {
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 15
|
||||
text: (isout ? qsTr("Sent") : qsTr("Received")) + translationManager.emptyString
|
||||
text: (isout ? qsTr("Sent") : qsTr("Received")) + (isFailed ? " (" + qsTr("Failed") + ")" : (isPending ? " (" + qsTr("Pending") + ")" : "")) + translationManager.emptyString
|
||||
color: MoneroComponents.Style.historyHeaderTextColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
themeTransitionBlackColor: MoneroComponents.Style._b_historyHeaderTextColor
|
||||
@@ -764,12 +802,6 @@ Rectangle {
|
||||
font.pixelSize: 15
|
||||
text: {
|
||||
if (isout) {
|
||||
if (isFailed) {
|
||||
return qsTr("Failed") + translationManager.emptyString;
|
||||
}
|
||||
if (isPending) {
|
||||
return qsTr("Waiting confirmation...") + translationManager.emptyString;
|
||||
}
|
||||
if (address) {
|
||||
return (addressBookName ? FontAwesome.addressBook + " " + addressBookName : TxUtils.addressTruncate(address, 8));
|
||||
}
|
||||
@@ -950,6 +982,8 @@ Rectangle {
|
||||
label.font.family: FontAwesome.fontFamily
|
||||
fontSize: 18
|
||||
width: 34
|
||||
tooltip: qsTr("Transaction details") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
|
||||
MouseArea {
|
||||
state: "details"
|
||||
@@ -957,8 +991,14 @@ Rectangle {
|
||||
hoverEnabled: true
|
||||
z: parent.z + 1
|
||||
|
||||
onEntered: parent.opacity = 0.8;
|
||||
onExited: parent.opacity = 1.0;
|
||||
onEntered: {
|
||||
parent.opacity = 0.8;
|
||||
parent.tooltipPopup.open()
|
||||
}
|
||||
onExited: {
|
||||
parent.opacity = 1.0;
|
||||
parent.tooltipPopup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -980,6 +1020,8 @@ Rectangle {
|
||||
label.font.family: FontAwesome.fontFamilyBrands
|
||||
fontSize: 18
|
||||
width: 34
|
||||
tooltip: qsTr("Generate payment proof") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
|
||||
MouseArea {
|
||||
state: "proof"
|
||||
@@ -987,8 +1029,14 @@ Rectangle {
|
||||
hoverEnabled: true
|
||||
z: parent.z + 1
|
||||
|
||||
onEntered: parent.opacity = 0.8;
|
||||
onExited: parent.opacity = 1.0;
|
||||
onEntered: {
|
||||
parent.opacity = 0.8;
|
||||
parent.tooltipPopup.open()
|
||||
}
|
||||
onExited: {
|
||||
parent.opacity = 1.0;
|
||||
parent.tooltipPopup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1224,7 +1272,7 @@ Rectangle {
|
||||
if(res[i].state === 'copyable_address') (address ? root.toClipboard(address) : root.toClipboard(addressField.text));
|
||||
if(res[i].state === 'copyable_receiving_address') root.toClipboard(currentWallet.address(subaddrAccount, subaddrIndex));
|
||||
if(res[i].state === 'copyable_txkey') root.getTxKey(hash, res[i]);
|
||||
if(res[i].state === 'set_tx_note') root.editDescription(hash, tx_note);
|
||||
if(res[i].state === 'set_tx_note') root.editDescription(hash, tx_note, root.txPage);
|
||||
if(res[i].state === 'details') root.showTxDetails(hash, paymentId, destinations, subaddrAccount, subaddrIndex, dateTime, displayAmount, isout);
|
||||
if(res[i].state === 'proof') root.showTxProof(hash, paymentId, destinations, subaddrAccount, subaddrIndex);
|
||||
doCollapse = false;
|
||||
@@ -1263,6 +1311,8 @@ Rectangle {
|
||||
image: "qrc:///images/whiteDropIndicator.png"
|
||||
rotation: delegate.collapsed ? 180 : 0
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackIcon: FontAwesome.arrowDown
|
||||
fontAwesomeFallbackSize: 14
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1338,7 +1388,7 @@ Rectangle {
|
||||
checked: persistentSettings.historyHumanDates
|
||||
onClicked: {
|
||||
persistentSettings.historyHumanDates = !persistentSettings.historyHumanDates
|
||||
root.updateDisplay(root.txOffset, root.txMax, false);
|
||||
root.updateDisplay(root.txOffset, root.txMax);
|
||||
}
|
||||
text: qsTr("Human readable date format") + translationManager.emptyString
|
||||
}
|
||||
@@ -1385,7 +1435,7 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
function updateFilter(){
|
||||
function updateFilter(currentPage){
|
||||
// applying filters
|
||||
root.txData = JSON.parse(JSON.stringify(root.txModelData)); // deepcopy
|
||||
|
||||
@@ -1435,6 +1485,9 @@ Rectangle {
|
||||
|
||||
root.updateSort();
|
||||
root.updateDisplay(root.txOffset, root.txMax);
|
||||
if (currentPage) {
|
||||
root.paginationJump(parseInt(currentPage));
|
||||
}
|
||||
}
|
||||
|
||||
function updateSort(){
|
||||
@@ -1450,15 +1503,14 @@ Rectangle {
|
||||
root.updateDisplay(root.txOffset, root.txMax);
|
||||
}
|
||||
|
||||
function updateDisplay(tx_offset, tx_max, auto_collapse) {
|
||||
if(typeof auto_collapse === 'undefined') auto_collapse = false;
|
||||
function updateDisplay(tx_offset, tx_max) {
|
||||
txListViewModel.clear();
|
||||
|
||||
// limit results as per tx_max (root.txMax)
|
||||
var txs = root.txData.slice(tx_offset, tx_offset + tx_max);
|
||||
|
||||
// make first result on the first page collapsed by default
|
||||
if(auto_collapse && root.txPage === 1 && txs.length > 0 && (root.sortSearchString == null || root.sortSearchString === ""))
|
||||
// collapse tx if there is a single result
|
||||
if(root.txPage === 1 && txs.length === 1)
|
||||
root.txDataCollapsed.push(txs[0]['hash']);
|
||||
|
||||
// populate listview
|
||||
@@ -1574,20 +1626,20 @@ Rectangle {
|
||||
root.txCount = root.txData.length;
|
||||
}
|
||||
|
||||
function update() {
|
||||
function update(currentPage) {
|
||||
// handle outside mutation of tx model; incoming/outgoing funds or new blocks. Update table.
|
||||
currentWallet.history.refresh(currentWallet.currentSubaddressAccount);
|
||||
|
||||
root.updateTransactionsFromModel();
|
||||
root.updateFilter();
|
||||
root.updateFilter(currentPage);
|
||||
}
|
||||
|
||||
function editDescription(_hash, _tx_note){
|
||||
function editDescription(_hash, _tx_note, currentPage){
|
||||
inputDialog.labelText = qsTr("Set description:") + translationManager.emptyString;
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
appWindow.currentWallet.setUserNote(_hash, inputDialog.inputText);
|
||||
appWindow.showStatusMessage(qsTr("Updated description."),3);
|
||||
root.update();
|
||||
root.update(currentPage);
|
||||
}
|
||||
inputDialog.onRejectedCallback = null;
|
||||
inputDialog.open(_tx_note);
|
||||
@@ -1668,6 +1720,10 @@ Rectangle {
|
||||
|
||||
console.log("getProof: Generate clicked: txid " + hash + ", address " + address);
|
||||
middlePanel.getProofClicked(hash, address, '');
|
||||
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
|
||||
informationPopup.text = qsTr("Generating payment proof") + "..." + translationManager.emptyString;
|
||||
informationPopup.onCloseCallback = null
|
||||
informationPopup.open()
|
||||
}
|
||||
|
||||
function toClipboard(text){
|
||||
@@ -1696,16 +1752,6 @@ Rectangle {
|
||||
+ translationManager.emptyString;
|
||||
}
|
||||
|
||||
function lookupPaymentID(paymentId) {
|
||||
if (!addressBookModel)
|
||||
return ""
|
||||
var idx = addressBookModel.lookupPaymentID(paymentId)
|
||||
if (idx < 0)
|
||||
return ""
|
||||
idx = addressBookModel.index(idx, 0)
|
||||
return addressBookModel.data(idx, AddressBookModel.AddressBookDescriptionRole)
|
||||
}
|
||||
|
||||
FileDialog {
|
||||
id: writeCSVFileDialog
|
||||
title: qsTr("Please choose a folder") + translationManager.emptyString
|
||||
@@ -1749,16 +1795,38 @@ Rectangle {
|
||||
root.model = appWindow.currentWallet.historyModel;
|
||||
root.model.sortRole = TransactionHistoryModel.TransactionBlockHeightRole
|
||||
root.model.sort(0, Qt.DescendingOrder);
|
||||
fromDatePicker.currentDate = model.transactionHistory.firstDateTime
|
||||
var count = root.model.rowCount()
|
||||
if (count > 0) {
|
||||
//date of the first transaction
|
||||
fromDatePicker.currentDate = root.model.data(root.model.index((count - 1), 0), TransactionHistoryModel.TransactionDateRole);
|
||||
} else {
|
||||
//date of monero birth (2014-04-18)
|
||||
fromDatePicker.currentDate = model.transactionHistory.firstDateTime
|
||||
}
|
||||
}
|
||||
|
||||
root.reset();
|
||||
root.refresh();
|
||||
root.initialized = true;
|
||||
root.updateFilter();
|
||||
}
|
||||
|
||||
function onPageClosed(){
|
||||
root.initialized = false;
|
||||
root.reset(true);
|
||||
root.clearFields();
|
||||
}
|
||||
|
||||
function searchInHistory(searchTerm){
|
||||
searchInput.text = searchTerm;
|
||||
searchInput.forceActiveFocus();
|
||||
searchInput.cursorPosition = searchInput.text.length;
|
||||
sortAndFilter.collapsed = true;
|
||||
}
|
||||
|
||||
function clearFields() {
|
||||
sortAndFilter.collapsed = false;
|
||||
searchInput.text = "";
|
||||
root.txDataCollapsed = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ Rectangle {
|
||||
color: "transparent"
|
||||
property var model
|
||||
property alias receiveHeight: mainLayout.height
|
||||
property var state: "Address"
|
||||
|
||||
function renameSubaddressLabel(_index){
|
||||
inputDialog.labelText = qsTr("Set the label of the selected address:") + translationManager.emptyString;
|
||||
@@ -60,6 +61,17 @@ Rectangle {
|
||||
inputDialog.open(appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, _index))
|
||||
}
|
||||
|
||||
function generateQRCodeString() {
|
||||
if (pageReceive.state == "PaymentRequest") {
|
||||
return TxUtils.makeQRCodeString(appWindow.current_address,
|
||||
(amountToReceiveXMR.text != "" && parseFloat(amountToReceiveXMR.text) != 0 ? amountToReceiveXMR.text : ""),
|
||||
(txDescriptionInput.text != "" ? txDescriptionInput.text : ""),
|
||||
(receiverNameInput.text != "" ? receiverNameInput.text : ""));
|
||||
} else {
|
||||
return TxUtils.makeQRCodeString(appWindow.current_address);
|
||||
}
|
||||
}
|
||||
|
||||
Clipboard { id: clipboard }
|
||||
|
||||
/* main layout */
|
||||
@@ -72,17 +84,467 @@ Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.right: parent.right
|
||||
|
||||
spacing: 20
|
||||
spacing: 15
|
||||
|
||||
ColumnLayout {
|
||||
id: selectedAddressDetailsColumn
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
spacing: 0
|
||||
property int qrSize: 220
|
||||
|
||||
MoneroComponents.Navbar {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.bottomMargin: 10
|
||||
|
||||
MoneroComponents.NavbarItem {
|
||||
active: state == "Address"
|
||||
text: qsTr("Address") + translationManager.emptyString
|
||||
onSelected: state = "Address"
|
||||
}
|
||||
|
||||
MoneroComponents.NavbarItem {
|
||||
active: state == "PaymentRequest"
|
||||
text: qsTr("Payment request") + translationManager.emptyString
|
||||
onSelected: {
|
||||
state = "PaymentRequest";
|
||||
qrCodeTextMouseArea.hoverEnabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: qrContainer
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "transparent"
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: parent.qrSize
|
||||
Layout.preferredHeight: width
|
||||
radius: 4
|
||||
|
||||
Image {
|
||||
id: qrCode
|
||||
anchors.fill: parent
|
||||
anchors.margins: 1
|
||||
smooth: false
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: "image://qrcode/" + generateQRCodeString();
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||
onEntered: qrCodeTooltip.tooltipPopup.open()
|
||||
onExited: qrCodeTooltip.tooltipPopup.close()
|
||||
onClicked: {
|
||||
if (mouse.button == Qt.LeftButton){
|
||||
walletManager.saveQrCodeToClipboard(generateQRCodeString());
|
||||
appWindow.showStatusMessage(qsTr("QR code copied to clipboard") + translationManager.emptyString, 3);
|
||||
} else if (mouse.button == Qt.RightButton){
|
||||
qrMenu.x = this.mouseX;
|
||||
qrMenu.y = this.mouseY;
|
||||
qrMenu.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Menu {
|
||||
id: qrMenu
|
||||
title: "QrCode"
|
||||
|
||||
MenuItem {
|
||||
text: qsTr("Copy to clipboard") + translationManager.emptyString;
|
||||
onTriggered: walletManager.saveQrCodeToClipboard(generateQRCodeString())
|
||||
}
|
||||
|
||||
MenuItem {
|
||||
text: qsTr("Save as Image") + translationManager.emptyString;
|
||||
onTriggered: qrFileDialog.open()
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Tooltip {
|
||||
id: qrCodeTooltip
|
||||
text: qsTr("Left click: copy QR code to clipboard") + "<br>" + qsTr("Right click: save QR code as image file") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: qrCodeText
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: 6
|
||||
Layout.maximumWidth: 285
|
||||
Layout.minimumHeight: 75
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
visible: paymentRequestGridLayout.visible
|
||||
font.pixelSize: 12
|
||||
color: qrCodeTextMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.defaultFontColor
|
||||
text: generateQRCodeString();
|
||||
wrapMode: Text.WrapAnywhere
|
||||
tooltip: qsTr("Copy payment request to clipboard") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
|
||||
MouseArea {
|
||||
id: qrCodeTextMouseArea
|
||||
hoverEnabled: false //true when Payment request navbar button is clicked (fix bug displaying tooltip when navbar button is clicked)
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.tooltipPopup.open()
|
||||
onExited: parent.tooltipPopup.close()
|
||||
onClicked: {
|
||||
clipboard.setText(qrCodeText.text);
|
||||
appWindow.showStatusMessage(qsTr("Payment request copied to clipboard") + translationManager.emptyString, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
id: paymentRequestGridLayout
|
||||
columns: 3
|
||||
rows: 4
|
||||
visible: pageReceive.state == "PaymentRequest"
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: 6
|
||||
Layout.preferredWidth: 285
|
||||
Layout.maximumWidth: 285
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: amountTitleFiat
|
||||
Layout.bottomMargin: 3
|
||||
Layout.preferredWidth: 90
|
||||
visible: persistentSettings.fiatPriceEnabled
|
||||
fontSize: 14
|
||||
text: qsTr("Amount") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: amountToReceiveFiat
|
||||
Layout.preferredWidth: 165
|
||||
Layout.maximumWidth: 165
|
||||
visible: persistentSettings.fiatPriceEnabled
|
||||
topPadding: 5
|
||||
leftPadding: 5
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name
|
||||
font.pixelSize: 14
|
||||
font.bold: false
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
placeholderText: "0.00"
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
|
||||
radius: 3
|
||||
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
|
||||
border.width: 1
|
||||
}
|
||||
onTextEdited: {
|
||||
text = text.trim().replace(",", ".");
|
||||
const match = text.match(/^0+(\d.*)/);
|
||||
if (match) {
|
||||
const cursorPosition = cursorPosition;
|
||||
text = match[1];
|
||||
cursorPosition = Math.max(cursorPosition, 1) - 1;
|
||||
} else if(text.indexOf('.') === 0){
|
||||
text = '0' + text;
|
||||
if (text.length > 2) {
|
||||
cursorPosition = 1;
|
||||
}
|
||||
}
|
||||
if (amountToReceiveFiat.text == "") {
|
||||
amountToReceiveXMR.text = "";
|
||||
} else {
|
||||
amountToReceiveXMR.text = fiatApiConvertToXMR(amountToReceiveFiat.text);
|
||||
}
|
||||
}
|
||||
validator: RegExpValidator {
|
||||
regExp: /^\s*(\d{1,8})?([\.,]\d{1,2})?\s*$/
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.bottomMargin: 3
|
||||
visible: persistentSettings.fiatPriceEnabled
|
||||
fontSize: 14
|
||||
text: appWindow.fiatApiCurrencySymbol();
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: amountTitleXMR
|
||||
Layout.bottomMargin: 3
|
||||
Layout.preferredWidth: 90
|
||||
fontSize: 14
|
||||
text: persistentSettings.fiatPriceEnabled ? "" : qsTr("Amount") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: amountToReceiveXMR
|
||||
Layout.preferredWidth: 165
|
||||
Layout.maximumWidth: 165
|
||||
topPadding: 5
|
||||
leftPadding: 5
|
||||
font.family: MoneroComponents.Style.fontMonoRegular.name
|
||||
font.pixelSize: 14
|
||||
font.bold: false
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
placeholderText: "0.000000000000"
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
|
||||
radius: 3
|
||||
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
|
||||
border.width: 1
|
||||
}
|
||||
onTextEdited: {
|
||||
text = text.trim().replace(",", ".");
|
||||
const match = text.match(/^0+(\d.*)/);
|
||||
if (match) {
|
||||
const cursorPosition = cursorPosition;
|
||||
text = match[1];
|
||||
cursorPosition = Math.max(cursorPosition, 1) - 1;
|
||||
} else if(text.indexOf('.') === 0){
|
||||
text = '0' + text;
|
||||
if (text.length > 2) {
|
||||
cursorPosition = 1;
|
||||
}
|
||||
}
|
||||
if (amountToReceiveXMR.text == "") {
|
||||
amountToReceiveFiat.text = "";
|
||||
} else {
|
||||
amountToReceiveFiat.text = fiatApiConvertToFiat(amountToReceiveXMR.text);
|
||||
}
|
||||
}
|
||||
validator: RegExpValidator {
|
||||
regExp: /^\s*(\d{1,8})?([\.,]\d{1,12})?\s*$/
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.bottomMargin: 3
|
||||
fontSize: 14
|
||||
text: "XMR"
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: txDescription
|
||||
Layout.bottomMargin: 3
|
||||
Layout.preferredWidth: 90
|
||||
fontSize: 14
|
||||
text: qsTr("Description") + translationManager.emptyString
|
||||
tooltip: qsTr("What is being payed for (a product, service, donation) (optional)") + translationManager.emptyString
|
||||
tooltipIconVisible: true
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: txDescriptionInput
|
||||
Layout.preferredWidth: 165
|
||||
Layout.maximumWidth: 165
|
||||
topPadding: 7
|
||||
leftPadding: 7
|
||||
font.pixelSize: 14
|
||||
font.bold: false
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
placeholderText: qsTr("Visible to the sender") + translationManager.emptyString
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
|
||||
radius: 3
|
||||
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
|
||||
border.width: 1
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.bottomMargin: 3
|
||||
fontSize: 14
|
||||
text: ""
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
id: receiverNameLabel
|
||||
Layout.bottomMargin: 3
|
||||
Layout.preferredWidth: 90
|
||||
fontSize: 14
|
||||
text: qsTr("Your name") + translationManager.emptyString
|
||||
tooltip: qsTr("Your name, company or website (optional)") + translationManager.emptyString
|
||||
tooltipIconVisible: true
|
||||
}
|
||||
|
||||
MoneroComponents.Input {
|
||||
id: receiverNameInput
|
||||
Layout.preferredWidth: 165
|
||||
Layout.maximumWidth: 165
|
||||
topPadding: 7
|
||||
leftPadding: 7
|
||||
font.pixelSize: 14
|
||||
font.bold: false
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
selectByMouse: true
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
placeholderText: qsTr("Visible to the sender") + translationManager.emptyString
|
||||
|
||||
background: Rectangle {
|
||||
color: MoneroComponents.Style.blackTheme ? "transparent" : "white"
|
||||
radius: 3
|
||||
border.color: parent.activeFocus ? MoneroComponents.Style.inputBorderColorActive : MoneroComponents.Style.inputBorderColorInActive
|
||||
border.width: 1
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.bottomMargin: 3
|
||||
fontSize: 14
|
||||
text: ""
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: selectedaddressIndex
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: 220
|
||||
Layout.maximumWidth: 220
|
||||
Layout.topMargin: 15
|
||||
visible: pageReceive.state == "Address"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
text: qsTr("Address #") + subaddressListView.currentIndex + translationManager.emptyString
|
||||
wrapMode: Text.WordWrap
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 17
|
||||
textFormat: Text.RichText
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: selectedAddressDrescription
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: 220
|
||||
Layout.maximumWidth: 220
|
||||
Layout.topMargin: 10
|
||||
visible: pageReceive.state == "Address"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
text: "(" + qsTr("no label") + ")" + translationManager.emptyString
|
||||
wrapMode: Text.WordWrap
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 17
|
||||
textFormat: Text.RichText
|
||||
color: selectedAddressDrescriptionMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.dimmedFontColor
|
||||
themeTransition: false
|
||||
tooltip: subaddressListView.currentIndex > 0 ? qsTr("Edit address label") : "" + translationManager.emptyString
|
||||
MouseArea {
|
||||
id: selectedAddressDrescriptionMouseArea
|
||||
visible: subaddressListView.currentIndex > 0
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.tooltip ? parent.tooltipPopup.open() : ""
|
||||
onExited: parent.tooltip ? parent.tooltipPopup.close() : ""
|
||||
onClicked: {
|
||||
renameSubaddressLabel(appWindow.current_subaddress_table_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: selectedAddress
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.maximumWidth: 300
|
||||
Layout.topMargin: 11
|
||||
visible: pageReceive.state == "Address"
|
||||
text: appWindow.current_address ? appWindow.current_address : ""
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
wrapMode: Text.Wrap
|
||||
textFormat: Text.RichText
|
||||
color: selectedAddressMouseArea.containsMouse ? MoneroComponents.Style.orange : MoneroComponents.Style.defaultFontColor
|
||||
font.pixelSize: 15
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
themeTransition: false
|
||||
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
|
||||
MouseArea {
|
||||
id: selectedAddressMouseArea
|
||||
hoverEnabled: true
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
onEntered: parent.tooltip ? parent.tooltipPopup.open() : ""
|
||||
onExited: parent.tooltip ? parent.tooltipPopup.close() : ""
|
||||
onClicked: {
|
||||
clipboard.setText(appWindow.current_address);
|
||||
appWindow.showStatusMessage(qsTr("Address copied to clipboard") + translationManager.emptyString, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
Layout.preferredWidth: 220
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: 18
|
||||
small: true
|
||||
text: qsTr("Show on device") + translationManager.emptyString
|
||||
fontSize: 14
|
||||
visible: appWindow.currentWallet ? appWindow.currentWallet.isHwBacked() : false
|
||||
onClicked: {
|
||||
appWindow.currentWallet.deviceShowAddressAsync(
|
||||
appWindow.currentWallet.currentSubaddressAccount,
|
||||
appWindow.current_subaddress_table_index,
|
||||
'');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: addressRow
|
||||
spacing: 0
|
||||
|
||||
MoneroComponents.LabelSubheader {
|
||||
Layout.fillWidth: true
|
||||
fontSize: 24
|
||||
textFormat: Text.RichText
|
||||
text: qsTr("Addresses") + translationManager.emptyString
|
||||
RowLayout {
|
||||
spacing: 0
|
||||
|
||||
MoneroComponents.LabelSubheader {
|
||||
Layout.fillWidth: true
|
||||
fontSize: 24
|
||||
textFormat: Text.RichText
|
||||
text: qsTr("Addresses") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
id: createAddressButton
|
||||
small: true
|
||||
text: qsTr("Create new address") + translationManager.emptyString
|
||||
fontSize: 13
|
||||
onClicked: {
|
||||
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
appWindow.currentWallet.subaddress.addRow(appWindow.currentWallet.currentSubaddressAccount, inputDialog.inputText)
|
||||
current_subaddress_table_index = appWindow.currentWallet.numSubaddresses(appWindow.currentWallet.currentSubaddressAccount) - 1
|
||||
subaddressListView.currentIndex = current_subaddress_table_index
|
||||
}
|
||||
inputDialog.onRejectedCallback = null;
|
||||
inputDialog.open()
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.top: createAddressButton.bottom
|
||||
anchors.topMargin: 8
|
||||
anchors.left: createAddressButton.left
|
||||
anchors.right: createAddressButton.right
|
||||
height: 2
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
@@ -109,6 +571,15 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
color: itemMouseArea.containsMouse || index === appWindow.current_subaddress_table_index ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
|
||||
Rectangle {
|
||||
visible: index === appWindow.current_subaddress_table_index
|
||||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: "darkgrey"
|
||||
width: 2
|
||||
}
|
||||
|
||||
Rectangle{
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
@@ -127,7 +598,7 @@ Rectangle {
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.topMargin: 5
|
||||
anchors.rightMargin: 80
|
||||
anchors.rightMargin: 90
|
||||
color: "transparent"
|
||||
|
||||
MoneroComponents.Label {
|
||||
@@ -182,14 +653,30 @@ Rectangle {
|
||||
height: 21
|
||||
spacing: 10
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
fontAwesomeFallbackIcon: FontAwesome.searchPlus
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 23
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("See transactions") + translationManager.emptyString
|
||||
|
||||
onClicked: doSearchInHistory(address)
|
||||
}
|
||||
|
||||
MoneroComponents.IconButton {
|
||||
id: renameButton
|
||||
image: "qrc:///images/edit.svg"
|
||||
fontAwesomeFallbackIcon: FontAwesome.edit
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 23
|
||||
Layout.preferredHeight: 21
|
||||
visible: index !== 0
|
||||
tooltip: qsTr("Edit address label") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
renameSubaddressLabel(index);
|
||||
@@ -199,10 +686,14 @@ Rectangle {
|
||||
MoneroComponents.IconButton {
|
||||
id: copyButton
|
||||
image: "qrc:///images/copy.svg"
|
||||
fontAwesomeFallbackIcon: FontAwesome.clipboard
|
||||
fontAwesomeFallbackSize: 22
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
opacity: 0.5
|
||||
opacity: isOpenGL ? 0.5 : 1
|
||||
fontAwesomeFallbackOpacity: 0.5
|
||||
Layout.preferredWidth: 16
|
||||
Layout.preferredHeight: 21
|
||||
tooltip: qsTr("Copy address to clipboard") + translationManager.emptyString
|
||||
|
||||
onClicked: {
|
||||
console.log("Address copied to clipboard");
|
||||
@@ -219,6 +710,16 @@ Rectangle {
|
||||
appWindow.currentWallet.currentSubaddressAccount,
|
||||
subaddressListView.currentIndex
|
||||
);
|
||||
if (subaddressListView.currentIndex == 0) {
|
||||
selectedAddressDrescription.text = qsTr("Primary address") + translationManager.emptyString;
|
||||
} else {
|
||||
var selectedAddressLabel = appWindow.currentWallet.getSubaddressLabel(appWindow.currentWallet.currentSubaddressAccount, appWindow.current_subaddress_table_index);
|
||||
if (selectedAddressLabel == "") {
|
||||
selectedAddressDrescription.text = "(" + qsTr("no label") + ")" + translationManager.emptyString
|
||||
} else {
|
||||
selectedAddressDrescription.text = selectedAddressLabel
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -234,84 +735,6 @@ Rectangle {
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.CheckBox {
|
||||
id: addNewAddressCheckbox
|
||||
border: false
|
||||
uncheckedIcon: FontAwesome.plusCircle
|
||||
toggleOnClick: false
|
||||
fontAwesomeIcons: true
|
||||
fontSize: 16
|
||||
iconOnTheLeft: true
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 10
|
||||
text: qsTr("Create new address") + translationManager.emptyString;
|
||||
onClicked: {
|
||||
inputDialog.labelText = qsTr("Set the label of the new address:") + translationManager.emptyString
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
appWindow.currentWallet.subaddress.addRow(appWindow.currentWallet.currentSubaddressAccount, inputDialog.inputText)
|
||||
current_subaddress_table_index = appWindow.currentWallet.numSubaddresses(appWindow.currentWallet.currentSubaddressAccount) - 1
|
||||
subaddressListView.currentIndex = current_subaddress_table_index
|
||||
}
|
||||
inputDialog.onRejectedCallback = null;
|
||||
inputDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
spacing: 11
|
||||
property int qrSize: 220
|
||||
|
||||
Rectangle {
|
||||
id: qrContainer
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "transparent"
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: parent.qrSize
|
||||
Layout.preferredHeight: width
|
||||
radius: 4
|
||||
|
||||
Image {
|
||||
id: qrCode
|
||||
anchors.fill: parent
|
||||
anchors.margins: 1
|
||||
|
||||
smooth: false
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: "image://qrcode/" + TxUtils.makeQRCodeString(appWindow.current_address)
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.RightButton
|
||||
onPressAndHold: qrFileDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
Layout.preferredWidth: 220
|
||||
small: true
|
||||
text: FontAwesome.save + " %1".arg(qsTr("Save as image")) + translationManager.emptyString
|
||||
label.font.family: FontAwesome.fontFamily
|
||||
fontSize: 13
|
||||
onClicked: qrFileDialog.open()
|
||||
}
|
||||
|
||||
MoneroComponents.StandardButton {
|
||||
Layout.preferredWidth: 220
|
||||
small: true
|
||||
text: FontAwesome.eye + " %1".arg(qsTr("Show on device")) + translationManager.emptyString
|
||||
label.font.family: FontAwesome.fontFamily
|
||||
fontSize: 13
|
||||
visible: appWindow.currentWallet ? appWindow.currentWallet.isHwBacked() : false
|
||||
onClicked: {
|
||||
appWindow.currentWallet.deviceShowAddressAsync(
|
||||
appWindow.currentWallet.currentSubaddressAccount,
|
||||
appWindow.current_subaddress_table_index,
|
||||
'');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MessageDialog {
|
||||
@@ -326,12 +749,14 @@ Rectangle {
|
||||
selectExisting: false
|
||||
nameFilters: ["Image (*.png)"]
|
||||
onAccepted: {
|
||||
if(!walletManager.saveQrCode(TxUtils.makeQRCodeString(appWindow.current_address), walletManager.urlToLocalPath(fileUrl))) {
|
||||
if(!walletManager.saveQrCode(generateQRCodeString(), walletManager.urlToLocalPath(fileUrl))) {
|
||||
console.log("Failed to save QrCode to file " + walletManager.urlToLocalPath(fileUrl) )
|
||||
receivePageDialog.title = qsTr("Save QrCode") + translationManager.emptyString;
|
||||
receivePageDialog.text = qsTr("Failed to save QrCode to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString;
|
||||
receivePageDialog.icon = StandardIcon.Error
|
||||
receivePageDialog.open()
|
||||
} else {
|
||||
appWindow.showStatusMessage(qsTr("QR code saved to ") + walletManager.urlToLocalPath(fileUrl) + translationManager.emptyString, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -339,16 +764,23 @@ Rectangle {
|
||||
|
||||
function onPageCompleted() {
|
||||
console.log("Receive page loaded");
|
||||
pageReceive.clearFields();
|
||||
subaddressListView.model = appWindow.currentWallet.subaddressModel;
|
||||
|
||||
if (appWindow.currentWallet) {
|
||||
appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, 0)
|
||||
appWindow.currentWallet.subaddress.refresh(appWindow.currentWallet.currentSubaddressAccount)
|
||||
if (subaddressListView.currentIndex == -1) {
|
||||
subaddressListView.currentIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clearFields() {
|
||||
// @TODO: add fields
|
||||
amountToReceiveFiat.text = "";
|
||||
amountToReceiveXMR.text = "";
|
||||
txDescriptionInput.text = "";
|
||||
receiverNameInput.text = "";
|
||||
}
|
||||
|
||||
function onPageClosed() {
|
||||
|
||||
@@ -102,7 +102,7 @@ Rectangle {
|
||||
|
||||
recipientModel.newRecipient(address, Utils.removeTrailingZeros(amount || ""));
|
||||
setPaymentId(payment_id || "");
|
||||
setDescription((recipient_name ? recipient_name + " " : "") + (tx_description || ""));
|
||||
setDescription((recipient_name ? recipient_name + (tx_description ? " (" + tx_description + ")" : "") : (tx_description || "")));
|
||||
}
|
||||
|
||||
function updateFromQrCode(address, payment_id, amount, tx_description, recipient_name) {
|
||||
@@ -265,7 +265,6 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
Layout.leftMargin: 10
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
@@ -273,9 +272,11 @@ Rectangle {
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontStyleName: "Solid"
|
||||
fontPixelSize: 18
|
||||
text: FontAwesome.desktop
|
||||
tooltip: qsTr("Grab QR code from screen") + translationManager.emptyString
|
||||
onClicked: {
|
||||
clearFields();
|
||||
const codes = oshelper.grabQrCodesFromScreen();
|
||||
@@ -284,15 +285,20 @@ Rectangle {
|
||||
if (!parsed.error) {
|
||||
fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name);
|
||||
break;
|
||||
} else if (walletManager.addressValid(codes[index], appWindow.persistentSettings.nettype)) {
|
||||
fillPaymentDetails(codes[index]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontStyleName: "Solid"
|
||||
text: FontAwesome.qrcode
|
||||
visible: appWindow.qrScannerEnabled
|
||||
tooltip: qsTr("Scan QR code") + translationManager.emptyString
|
||||
onClicked: {
|
||||
cameraUi.state = "Capture"
|
||||
cameraUi.qrcode_decoded.connect(updateFromQrCode)
|
||||
@@ -302,6 +308,7 @@ Rectangle {
|
||||
MoneroComponents.InlineButton {
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
text: FontAwesome.addressBook
|
||||
tooltip: qsTr("Import from address book") + translationManager.emptyString
|
||||
onClicked: {
|
||||
middlePanel.addressBookView.selectAndSend = true;
|
||||
appWindow.showPageRequest("AddressBook");
|
||||
@@ -313,12 +320,32 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
Layout.preferredWidth: recipientLayout.secondRowWidth
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: qsTr("Amount") + translationManager.emptyString
|
||||
RowLayout {
|
||||
id: amountLabel
|
||||
spacing: 6
|
||||
Layout.preferredWidth: 125
|
||||
Layout.maximumWidth: recipientLayout.secondRowWidth
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 16
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
text: qsTr("Amount") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
fontFamily: FontAwesome.fontFamilySolid
|
||||
fontStyleName: "Solid"
|
||||
fontPixelSize: 16
|
||||
text: FontAwesome.infinity
|
||||
visible: recipientModel.count == 1
|
||||
tooltip: qsTr("Send all unlocked balance of this account") + translationManager.emptyString
|
||||
onClicked: recipientRepeater.itemAt(0).children[1].children[2].text = "(all)";
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
@@ -335,7 +362,9 @@ Rectangle {
|
||||
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.rightMargin: recipientLayout.thirdRowWidth
|
||||
Layout.topMargin: -1
|
||||
Layout.leftMargin: 1
|
||||
Layout.rightMargin: recipientLayout.thirdRowWidth + 1
|
||||
color: MoneroComponents.Style.inputBorderColorInActive
|
||||
height: 1
|
||||
visible: index > 0
|
||||
@@ -348,11 +377,12 @@ Rectangle {
|
||||
KeyNavigation.backtab: index > 0 ? recipientRepeater.itemAt(index - 1).children[1].children[2] : sendButton
|
||||
KeyNavigation.tab: parent.children[2]
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.topMargin: index > 0 ? recipientLayout.rowSpacing / 2 : 0
|
||||
Layout.bottomMargin: recipientLayout.rowSpacing / 2
|
||||
Layout.topMargin: index > 0 ? 0 : 1
|
||||
Layout.bottomMargin: 2
|
||||
Layout.fillWidth: true
|
||||
addressValidation: true
|
||||
borderDisabled: true
|
||||
fontColor: error && text != "" ? MoneroComponents.Style.errorColor : MoneroComponents.Style.defaultFontColor
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name
|
||||
fontSize: 14
|
||||
inputPaddingBottom: 0
|
||||
@@ -374,7 +404,7 @@ Rectangle {
|
||||
onTextChanged: {
|
||||
const parsed = walletManager.parse_uri_to_object(text);
|
||||
if (!parsed.error) {
|
||||
fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description);
|
||||
fillPaymentDetails(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name);
|
||||
}
|
||||
address = text;
|
||||
}
|
||||
@@ -427,6 +457,8 @@ Rectangle {
|
||||
|
||||
Rectangle {
|
||||
Layout.fillHeight: true
|
||||
Layout.topMargin: index > 0 ? 0 : 1
|
||||
Layout.bottomMargin: 1
|
||||
Layout.leftMargin: recipientLayout.colSpacing / 2 - width
|
||||
Layout.rightMargin: recipientLayout.colSpacing / 2
|
||||
color: MoneroComponents.Style.inputBorderColorInActive
|
||||
@@ -437,14 +469,18 @@ Rectangle {
|
||||
KeyNavigation.backtab: parent.children[0]
|
||||
KeyNavigation.tab: index + 1 < recipientRepeater.count ? recipientRepeater.itemAt(index + 1).children[1].children[0] : sendButton
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.topMargin: recipientLayout.rowSpacing / 2
|
||||
Layout.bottomMargin: recipientLayout.rowSpacing / 2
|
||||
Layout.topMargin: index > 0 ? 0 : 1
|
||||
Layout.bottomMargin: 2
|
||||
Layout.rightMargin: recipientLayout.colSpacing / 2
|
||||
Layout.preferredWidth: 125
|
||||
Layout.maximumWidth: 125
|
||||
borderDisabled: true
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name
|
||||
fontSize: 14
|
||||
inputPadding: 0
|
||||
inputPaddingLeft: 0
|
||||
inputPaddingRight: 0
|
||||
inputPaddingTop: 0
|
||||
inputPaddingBottom: 0
|
||||
placeholderFontFamily: MoneroComponents.Style.fontMonoRegular.name
|
||||
placeholderFontSize: 14
|
||||
placeholderLeftMargin: 0
|
||||
@@ -479,22 +515,30 @@ Rectangle {
|
||||
font.styleName: "Solid"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
opacity: mouseArea.containsMouse ? 1 : 0.85
|
||||
text: recipientModel.count == 1 ? FontAwesome.infinity : FontAwesome.times
|
||||
text: FontAwesome.times
|
||||
tooltip: qsTr("Remove recipient") + translationManager.emptyString
|
||||
tooltipLeft: true
|
||||
visible: recipientModel.count > 1
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
if (recipientModel.count == 1) {
|
||||
parent.parent.children[2].text = "(all)";
|
||||
} else {
|
||||
recipientModel.remove(index);
|
||||
}
|
||||
}
|
||||
onEntered: parent.tooltipPopup.open()
|
||||
onExited: parent.tooltipPopup.close()
|
||||
onClicked: recipientModel.remove(index);
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
Layout.leftMargin: recipientLayout.colSpacing / 2
|
||||
Layout.preferredWidth: recipientLayout.thirdRowWidth
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
text: "XMR"
|
||||
visible: recipientModel.count == 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -511,6 +555,7 @@ Rectangle {
|
||||
Layout.column: 0
|
||||
Layout.row: 0
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
|
||||
spacing: 0
|
||||
|
||||
CheckBox {
|
||||
@@ -550,11 +595,16 @@ Rectangle {
|
||||
Layout.column: 1
|
||||
Layout.row: 0
|
||||
Layout.preferredWidth: recipientLayout.secondRowWidth
|
||||
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
|
||||
Layout.maximumWidth: recipientLayout.secondRowWidth
|
||||
borderDisabled: true
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name
|
||||
fontSize: 14
|
||||
inputHeight: 30
|
||||
inputPadding: 0
|
||||
inputPaddingLeft: 0
|
||||
inputPaddingRight: 0
|
||||
inputPaddingTop: 0
|
||||
inputPaddingBottom: 0
|
||||
readOnly: true
|
||||
text: Utils.removeTrailingZeros(walletManager.displayAmount(recipientModel.getAmountTotal()))
|
||||
visible: recipientModel.count > 1
|
||||
@@ -564,6 +614,7 @@ Rectangle {
|
||||
Layout.column: 2
|
||||
Layout.row: 0
|
||||
Layout.preferredWidth: recipientLayout.thirdRowWidth
|
||||
Layout.maximumWidth: recipientLayout.thirdRowWidth
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
text: "XMR"
|
||||
@@ -574,11 +625,16 @@ Rectangle {
|
||||
Layout.column: 1
|
||||
Layout.row: recipientModel.count > 1 ? 1 : 0
|
||||
Layout.preferredWidth: recipientLayout.secondRowWidth
|
||||
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
|
||||
Layout.maximumWidth: recipientLayout.secondRowWidth
|
||||
borderDisabled: true
|
||||
fontFamily: MoneroComponents.Style.fontMonoRegular.name
|
||||
fontSize: 14
|
||||
inputHeight: 30
|
||||
inputPadding: 0
|
||||
inputPaddingLeft: 0
|
||||
inputPaddingRight: 0
|
||||
inputPaddingTop: 0
|
||||
inputPaddingBottom: 0
|
||||
opacity: 0.7
|
||||
readOnly: true
|
||||
text: fiatApiConvertToFiat(walletManager.displayAmount(recipientModel.getAmountTotal()))
|
||||
@@ -589,6 +645,8 @@ Rectangle {
|
||||
Layout.column: 2
|
||||
Layout.row: recipientModel.count > 1 ? 1 : 0
|
||||
Layout.preferredWidth: recipientLayout.thirdRowWidth
|
||||
Layout.topMargin: recipientModel.count > 1 ? 0 : -1
|
||||
Layout.maximumWidth: recipientLayout.thirdRowWidth
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
opacity: 0.7
|
||||
@@ -617,13 +675,6 @@ Rectangle {
|
||||
spacing: 0
|
||||
visible: appWindow.walletMode >= 2
|
||||
|
||||
Label {
|
||||
id: transactionPriority
|
||||
Layout.topMargin: 0
|
||||
text: qsTr("Transaction priority") + translationManager.emptyString
|
||||
fontBold: false
|
||||
fontSize: 16
|
||||
}
|
||||
// Note: workaround for translations in listElements
|
||||
// ListElement: cannot use script for property value, so
|
||||
// code like this wont work:
|
||||
@@ -647,15 +698,18 @@ Rectangle {
|
||||
spacing: 10
|
||||
|
||||
StandardDropdown {
|
||||
Layout.preferredWidth: 200
|
||||
Layout.maximumWidth: 200
|
||||
id: priorityDropdown
|
||||
currentIndex: 0
|
||||
dataModel: priorityModelV5
|
||||
labelText: qsTr("Transaction priority") + translationManager.emptyString
|
||||
labelFontSize: 16
|
||||
}
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
id: feeLabel
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.alignment: Qt.AlignBottom
|
||||
Layout.bottomMargin: 11
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
@@ -739,9 +793,11 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
LineEditMulti {
|
||||
LineEdit {
|
||||
id: descriptionLine
|
||||
placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString
|
||||
placeholderFontSize: 16
|
||||
fontSize: 16
|
||||
placeholderText: qsTr("Saved to local wallet history") + " (" + qsTr("only visible to you") + ")" + translationManager.emptyString
|
||||
Layout.fillWidth: true
|
||||
visible: descriptionCheckbox.checked
|
||||
}
|
||||
@@ -857,21 +913,21 @@ Rectangle {
|
||||
console.log("Transfer: import key images clicked")
|
||||
importKeyImagesDialog.open();
|
||||
}
|
||||
helpTextLarge.text: qsTr("Required for view-only wallets to display the real balance") + translationManager.emptyString
|
||||
helpTextSmall.text: {
|
||||
tooltip: {
|
||||
var errorMessage = "";
|
||||
if (appWindow.viewOnly && !appWindow.isTrustedDaemon()){
|
||||
errorMessage = "<p class='orange'>" + qsTr("* To import, you must connect to a local node or a trusted remote node") + "</p>";
|
||||
}
|
||||
return "<style type='text/css'>p{line-height:20px; margin-top:0px; margin-bottom:0px; color:" + MoneroComponents.Style.defaultFontColor +
|
||||
var header = qsTr("Required for view-only wallets to display the real balance") + translationManager.emptyString;
|
||||
return "<style type='text/css'>.header{ font-size: 13px; } p{line-height:20px; margin-top:0px; margin-bottom:0px; " +
|
||||
";} p.orange{color:#ff9323;}</style>" +
|
||||
"<div class='header'>" + header + "</div>" +
|
||||
"<p>" + qsTr("1. Using cold wallet, export the key images into a file") + "</p>" +
|
||||
"<p>" + qsTr("2. Using view-only wallet, import the key images file") + "</p>" +
|
||||
errorMessage + translationManager.emptyString
|
||||
}
|
||||
helpTextSmall.themeTransition: false
|
||||
}
|
||||
|
||||
|
||||
AdvancedOptionsItem {
|
||||
visible: persistentSettings.transferShowAdvanced && appWindow.walletMode >= 2
|
||||
title: qsTr("Offline transaction signing") + translationManager.emptyString
|
||||
@@ -896,14 +952,15 @@ Rectangle {
|
||||
console.log("Transfer: submit tx clicked")
|
||||
submitTxDialog.open();
|
||||
}
|
||||
helpTextLarge.text: qsTr("Spend XMR from a cold (offline) wallet") + translationManager.emptyString
|
||||
helpTextSmall.text: {
|
||||
tooltip: {
|
||||
var errorMessage = "";
|
||||
if (appWindow.viewOnly && !pageRoot.checkInformation()) {
|
||||
errorMessage = "<p class='orange'>" + qsTr("* To create a transaction file, please enter address and amount above") + "</p>";
|
||||
}
|
||||
return "<style type='text/css'>p{line-height:20px; margin-top:0px; margin-bottom:0px; color:" + MoneroComponents.Style.defaultFontColor +
|
||||
var header = qsTr("Spend XMR from a cold (offline) wallet") + translationManager.emptyString;
|
||||
return "<style type='text/css'>.header{ font-size: 13px; } p{line-height:20px; margin-top:0px; margin-bottom:0px; " +
|
||||
";} p.orange{color:#ff9323;}</style>" +
|
||||
"<div class='header'>" + header + "</div>" +
|
||||
"<p>" + qsTr("1. Using view-only wallet, export the outputs into a file") + "</p>" +
|
||||
"<p>" + qsTr("2. Using cold wallet, import the outputs file and export the key images") + "</p>" +
|
||||
"<p>" + qsTr("3. Using view-only wallet, import the key images file and create a transaction file") + "</p>" +
|
||||
@@ -911,7 +968,6 @@ Rectangle {
|
||||
"<p>" + qsTr("4. Using cold wallet, sign your transaction file") + "</p>" +
|
||||
"<p>" + qsTr("5. Using view-only wallet, submit your signed transaction") + "</p>" + translationManager.emptyString
|
||||
}
|
||||
helpTextSmall.themeTransition: false
|
||||
}
|
||||
|
||||
AdvancedOptionsItem {
|
||||
@@ -923,7 +979,7 @@ Rectangle {
|
||||
console.log("Transfer: sweepUnmixableClicked")
|
||||
root.sweepUnmixableClicked()
|
||||
}
|
||||
helpTextLarge.text: qsTr("Create a transaction that spends old unmovable outputs") + translationManager.emptyString
|
||||
tooltip: qsTr("Create a transaction that spends old unmovable outputs") + translationManager.emptyString
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ Rectangle {
|
||||
enabled: TxUtils.checkTxID(getProofTxIdLine.text) && (getProofAddressLine.text.length == 0 || TxUtils.checkAddress(getProofAddressLine.text, appWindow.persistentSettings.nettype))
|
||||
onClicked: {
|
||||
console.log("getProof: Generate clicked: txid " + getProofTxIdLine.text + ", address " + getProofAddressLine.text + ", message: " + getProofMessageLine.text);
|
||||
root.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text)
|
||||
middlePanel.getProofClicked(getProofTxIdLine.text, getProofAddressLine.text, getProofMessageLine.text)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ Rectangle {
|
||||
enabled: TxUtils.checkTxID(checkProofTxIdLine.text) && TxUtils.checkSignature(checkProofSignatureLine.text) && ((checkProofSignatureLine.text.indexOf("SpendProofV") === 0 && checkProofAddressLine.text.length == 0) || (checkProofSignatureLine.text.indexOf("SpendProofV") !== 0 && TxUtils.checkAddress(checkProofAddressLine.text, appWindow.persistentSettings.nettype)))
|
||||
onClicked: {
|
||||
console.log("checkProof: Check clicked: txid " + checkProofTxIdLine.text + ", address " + checkProofAddressLine.text + ", message " + checkProofMessageLine.text + ", signature " + checkProofSignatureLine.text);
|
||||
root.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text)
|
||||
middlePanel.checkProofClicked(checkProofTxIdLine.text, checkProofAddressLine.text, checkProofMessageLine.text, checkProofSignatureLine.text)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ Item {
|
||||
|
||||
function onPageCompleted() {
|
||||
if (appWindow.currentWallet) {
|
||||
appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, 0)
|
||||
appWindow.current_address = appWindow.currentWallet.address(appWindow.currentWallet.currentSubaddressAccount, appWindow.current_subaddress_table_index);
|
||||
}
|
||||
// prepare tracking
|
||||
trackingCheckbox.checked = root.enableTracking
|
||||
|
||||
@@ -42,13 +42,15 @@ Rectangle {
|
||||
Layout.fillWidth: true
|
||||
property alias infoHeight: infoLayout.height
|
||||
property string walletModeString: {
|
||||
var modeStr;
|
||||
if(appWindow.walletMode === 0){
|
||||
return qsTr("Simple mode") + translationManager.emptyString;
|
||||
modeStr = qsTr("Simple mode") + translationManager.emptyString;
|
||||
} else if(appWindow.walletMode === 1){
|
||||
return qsTr("Simple mode") + " (bootstrap)" + translationManager.emptyString;
|
||||
modeStr = qsTr("Simple mode") + " (bootstrap)" + translationManager.emptyString;
|
||||
} else if(appWindow.walletMode === 2){
|
||||
return "%1 (%2)".arg(qsTr("Advanced mode")).arg(persistentSettings.useRemoteNode ? qsTr("Remote node") : qsTr("Local node")) + translationManager.emptyString;
|
||||
modeStr = "%1 (%2)".arg(qsTr("Advanced mode")).arg(persistentSettings.useRemoteNode ? qsTr("Remote node") : qsTr("Local node")) + translationManager.emptyString;
|
||||
}
|
||||
return modeStr + (persistentSettings.portable ? ", %1".arg(qsTr("portable")) : "");
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
@@ -189,13 +191,7 @@ Rectangle {
|
||||
inputDialog.onAcceptedCallback = function() {
|
||||
var _restoreHeight;
|
||||
if (inputDialog.inputText) {
|
||||
var restoreHeightText = inputDialog.inputText;
|
||||
// Parse date string or restore height as integer
|
||||
if(restoreHeightText.indexOf('-') === 4 && restoreHeightText.length === 10) {
|
||||
_restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeightText, Utils.netTypeToString());
|
||||
} else {
|
||||
_restoreHeight = parseInt(restoreHeightText)
|
||||
}
|
||||
_restoreHeight = Utils.parseDateStringOrRestoreHeightAsInteger(inputDialog.inputText);
|
||||
}
|
||||
if (!isNaN(_restoreHeight)) {
|
||||
if(_restoreHeight >= 0) {
|
||||
@@ -399,9 +395,9 @@ Rectangle {
|
||||
|
||||
data += "\nWallet log path: " + logger.logFilePath;
|
||||
data += "\nWallet mode: " + walletModeString;
|
||||
data += "\nGraphics mode: " + isOpenGL ? "OpenGL" : "Low graphics mode";
|
||||
data += "\nGraphics mode: " + (isOpenGL ? "OpenGL" : "Low graphics mode");
|
||||
if (isTails)
|
||||
data += "\nTails: " + tailsUsePersistence ? "persistent" : "persistence disabled";
|
||||
data += "\nTails: " + (tailsUsePersistence ? "persistent" : "persistence disabled");
|
||||
|
||||
console.log("Copied to clipboard");
|
||||
clipboard.setText(data);
|
||||
|
||||
@@ -89,7 +89,6 @@ Rectangle {
|
||||
toggleOnClick: false
|
||||
onClicked: {
|
||||
MoneroComponents.Style.blackTheme = !MoneroComponents.Style.blackTheme;
|
||||
persistentSettings.blackTheme = MoneroComponents.Style.blackTheme;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,52 +178,34 @@ Rectangle {
|
||||
Layout.leftMargin: 36
|
||||
columnSpacing: 32
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 10
|
||||
Layout.fillWidth: true
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: fiatPriceProviderDropDown
|
||||
Layout.maximumWidth: 200
|
||||
labelText: qsTr("Price source") + translationManager.emptyString
|
||||
labelFontSize: 14
|
||||
dataModel: fiatPriceProvidersModel
|
||||
onChanged: {
|
||||
var obj = dataModel.get(currentIndex);
|
||||
persistentSettings.fiatPriceProvider = obj.data;
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.fillWidth: true
|
||||
fontSize: 14
|
||||
text: qsTr("Price source") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: fiatPriceProviderDropDown
|
||||
Layout.fillWidth: true
|
||||
dataModel: fiatPriceProvidersModel
|
||||
onChanged: {
|
||||
var obj = dataModel.get(currentIndex);
|
||||
persistentSettings.fiatPriceProvider = obj.data;
|
||||
|
||||
if(persistentSettings.fiatPriceEnabled)
|
||||
appWindow.fiatApiRefresh();
|
||||
}
|
||||
if(persistentSettings.fiatPriceEnabled)
|
||||
appWindow.fiatApiRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 10
|
||||
Layout.fillWidth: true
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: fiatPriceCurrencyDropdown
|
||||
Layout.maximumWidth: 100
|
||||
labelText: qsTr("Currency") + translationManager.emptyString
|
||||
labelFontSize: 14
|
||||
currentIndex: persistentSettings.fiatPriceCurrency === "xmrusd" ? 0 : 1
|
||||
dataModel: fiatPriceCurrencyModel
|
||||
onChanged: {
|
||||
var obj = dataModel.get(currentIndex);
|
||||
persistentSettings.fiatPriceCurrency = obj.data;
|
||||
|
||||
MoneroComponents.Label {
|
||||
Layout.fillWidth: true
|
||||
fontSize: 14
|
||||
text: qsTr("Currency") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: fiatPriceCurrencyDropdown
|
||||
Layout.fillWidth: true
|
||||
currentIndex: persistentSettings.fiatPriceCurrency === "xmrusd" ? 0 : 1
|
||||
dataModel: fiatPriceCurrencyModel
|
||||
onChanged: {
|
||||
var obj = dataModel.get(currentIndex);
|
||||
persistentSettings.fiatPriceCurrency = obj.data;
|
||||
|
||||
if(persistentSettings.fiatPriceEnabled)
|
||||
appWindow.fiatApiRefresh();
|
||||
}
|
||||
if(persistentSettings.fiatPriceEnabled)
|
||||
appWindow.fiatApiRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
import QtQuick 2.9
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
import "../../js/Utils.js" as Utils
|
||||
import "../../components" as MoneroComponents
|
||||
@@ -132,6 +132,18 @@ Rectangle {
|
||||
font.pixelSize: 18
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
text: qsTr("Daemon log") + translationManager.emptyString
|
||||
themeTransition: false
|
||||
onColorChanged: {
|
||||
var flickableContentYBefore = flickable.contentY
|
||||
var daemonLogText = consoleArea.text
|
||||
consoleArea.clear();
|
||||
if (MoneroComponents.Style.blackTheme) {
|
||||
consoleArea.append(daemonLogText.replace(/#000000/g, '#ffffff').replace(/#008000/g, '#00ff00'));
|
||||
} else {
|
||||
consoleArea.append(daemonLogText.replace(/#ffffff/g, '#000000').replace(/#00ff00/g, '#008000'));
|
||||
}
|
||||
flickable.contentY = flickableContentYBefore
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
@@ -164,7 +176,7 @@ Rectangle {
|
||||
wrapMode: TextEdit.Wrap
|
||||
readOnly: true
|
||||
function logCommand(msg){
|
||||
msg = log_color(msg, "lime");
|
||||
msg = log_color(msg, MoneroComponents.Style.blackTheme ? "lime" : "green");
|
||||
consoleArea.append(msg);
|
||||
}
|
||||
function logMessage(msg){
|
||||
@@ -173,7 +185,7 @@ Rectangle {
|
||||
if(msg.toLowerCase().indexOf('error') >= 0){
|
||||
color = MoneroComponents.Style.errorColor;
|
||||
} else if (msg.toLowerCase().indexOf('warning') >= 0){
|
||||
color = MoneroComponents.Style.warningColor;
|
||||
color = "#fa6800"
|
||||
}
|
||||
|
||||
// format multi-lines
|
||||
@@ -206,6 +218,7 @@ Rectangle {
|
||||
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
onActiveChanged: if (!active && !isMac) active = true
|
||||
policy: isMac ? ScrollBar.AsNeeded : ScrollBar.AlwaysOn
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,11 +226,14 @@ Rectangle {
|
||||
MoneroComponents.LineEdit {
|
||||
id: sendCommandText
|
||||
Layout.fillWidth: true
|
||||
inputPaddingTop: 0
|
||||
inputPaddingBottom: 0
|
||||
property var lastCommands: []
|
||||
property int currentCommandIndex
|
||||
enabled: !persistentSettings.useRemoteNode
|
||||
fontBold: false
|
||||
placeholderText: qsTr("command + enter (e.g 'help' or 'status')") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
placeholderText: qsTr("Type a command (e.g '%1' or '%2') and press Enter").arg("help").arg("status") + translationManager.emptyString
|
||||
placeholderFontSize: 16
|
||||
Keys.onUpPressed: {
|
||||
if (currentCommandIndex != 0) {
|
||||
|
||||
@@ -72,7 +72,7 @@ Rectangle{
|
||||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "darkgrey"
|
||||
color: "darkgrey"
|
||||
width: 2
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ Rectangle{
|
||||
Layout.fillHeight: true
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
color: MoneroComponents.Style.blackTheme ? "white" : "darkgrey"
|
||||
color: "darkgrey"
|
||||
width: 2
|
||||
}
|
||||
|
||||
@@ -248,110 +248,16 @@ Rectangle{
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: remoteNodeLayout
|
||||
anchors.margins: 0
|
||||
spacing: 20
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
MoneroComponents.WarningBox {
|
||||
Layout.topMargin: 46
|
||||
text: qsTr("To find a remote node, type 'Monero remote node' into your favorite search engine. Please ensure the node is run by a trusted third-party.") + translationManager.emptyString
|
||||
visible: persistentSettings.useRemoteNode
|
||||
}
|
||||
|
||||
MoneroComponents.WarningBox {
|
||||
Layout.topMargin: 26
|
||||
Layout.bottomMargin: 6
|
||||
text: qsTr("To find a remote node, type 'Monero remote node' into your favorite search engine. Please ensure the node is run by a trusted third-party.") + translationManager.emptyString
|
||||
}
|
||||
|
||||
MoneroComponents.CheckBox {
|
||||
border: false
|
||||
checkedIcon: FontAwesome.minusCircle
|
||||
uncheckedIcon: FontAwesome.plusCircle
|
||||
fontAwesomeIcons: true
|
||||
fontSize: 16
|
||||
iconOnTheLeft: true
|
||||
text: qsTr("Add remote node") + translationManager.emptyString
|
||||
toggleOnClick: false
|
||||
onClicked: remoteNodeDialog.add(remoteNodesModel.append)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
|
||||
Repeater {
|
||||
model: remoteNodesModel
|
||||
|
||||
Rectangle {
|
||||
height: 30
|
||||
Layout.fillWidth: true
|
||||
color: itemMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent"
|
||||
|
||||
Rectangle {
|
||||
color: MoneroComponents.Style.appWindowBorderColor
|
||||
anchors.right: parent.right
|
||||
anchors.left: parent.left
|
||||
anchors.top: parent.top
|
||||
height: 1
|
||||
visible: index > 0
|
||||
|
||||
MoneroEffects.ColorTransition {
|
||||
targetObj: parent
|
||||
blackColor: MoneroComponents.Style._b_appWindowBorderColor
|
||||
whiteColor: MoneroComponents.Style._w_appWindowBorderColor
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
anchors.rightMargin: 80
|
||||
color: "transparent"
|
||||
|
||||
MoneroComponents.TextPlain {
|
||||
color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 6
|
||||
font.pixelSize: 16
|
||||
text: address
|
||||
themeTransition: false
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemMouseArea
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: remoteNodesModel.applyRemoteNode(index)
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 6
|
||||
height: 30
|
||||
spacing: 10
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
buttonColor: "transparent"
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
fontPixelSize: 18
|
||||
text: FontAwesome.edit
|
||||
onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) {
|
||||
remoteNodesModel.set(index, remoteNode)
|
||||
})
|
||||
}
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
buttonColor: "transparent"
|
||||
fontFamily: FontAwesome.fontFamily
|
||||
text: FontAwesome.times
|
||||
visible: remoteNodesModel.count > 1
|
||||
onClicked: remoteNodesModel.removeSelectNextIfNeeded(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MoneroComponents.RemoteNodeList {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 26
|
||||
visible: persistentSettings.useRemoteNode
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
13
qml.qrc
13
qml.qrc
@@ -9,8 +9,10 @@
|
||||
<file>components/Navbar.qml</file>
|
||||
<file>components/NavbarItem.qml</file>
|
||||
<file>components/RemoteNodeDialog.qml</file>
|
||||
<file>components/RemoteNodeList.qml</file>
|
||||
<file>components/SettingsListItem.qml</file>
|
||||
<file>components/Slider.qml</file>
|
||||
<file>components/Tooltip.qml</file>
|
||||
<file>components/UpdateDialog.qml</file>
|
||||
<file>images/whatIsIcon.png</file>
|
||||
<file>images/whatIsIcon@2x.png</file>
|
||||
@@ -44,6 +46,7 @@
|
||||
<file>images/prevMonth.png</file>
|
||||
<file>images/prevMonth@2x.png</file>
|
||||
<file>components/TitleBar.qml</file>
|
||||
<file>components/MenuBar.qml</file>
|
||||
<file>images/resize.png</file>
|
||||
<file>images/resize@2x.png</file>
|
||||
<file>images/resizeHovered.png</file>
|
||||
@@ -176,9 +179,9 @@
|
||||
<file>images/merchant/arrow_right.png</file>
|
||||
<file>images/merchant/bg.png</file>
|
||||
<file>images/merchant/input_box.png</file>
|
||||
<file>fonts/FontAwesome/fa-brands-400.ttf</file>
|
||||
<file>fonts/FontAwesome/fa-regular-400.ttf</file>
|
||||
<file>fonts/FontAwesome/fa-solid-900.ttf</file>
|
||||
<file>fonts/FontAwesome/fa-brands-400.otf</file>
|
||||
<file>fonts/FontAwesome/fa-regular-400.otf</file>
|
||||
<file>fonts/FontAwesome/fa-solid-900.otf</file>
|
||||
<file>fonts/FontAwesome/FontAwesome.qml</file>
|
||||
<file>fonts/FontAwesome/Object.qml</file>
|
||||
<file>fonts/FontAwesome/qmldir</file>
|
||||
@@ -249,5 +252,9 @@
|
||||
<file>images/success@2x.png</file>
|
||||
<file>components/SuccessfulTxDialog.qml</file>
|
||||
<file>components/TxConfirmationDialog.qml</file>
|
||||
<file>images/ledgerNanoS.png</file>
|
||||
<file>images/ledgerNanoX.png</file>
|
||||
<file>images/trezor.png</file>
|
||||
<file>images/trezor@2x.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
add_subdirectory(QR-Code-scanner)
|
||||
add_subdirectory(daemon)
|
||||
add_subdirectory(libwalletqt)
|
||||
add_subdirectory(model)
|
||||
add_subdirectory(openpgp)
|
||||
add_subdirectory(zxcvbn-c)
|
||||
|
||||
@@ -48,13 +45,6 @@ if(APPLE)
|
||||
list(APPEND SOURCE_FILES "qt/macoshelper.mm")
|
||||
endif()
|
||||
|
||||
if(ENABLE_PASS_STRENGTH_METER)
|
||||
file(GLOB PASS_STRENGTH_FILES
|
||||
"zxcvbn-c/zxcvbn.h"
|
||||
"zxcvbn-c/zxcvbn.c"
|
||||
)
|
||||
endif()
|
||||
|
||||
set(EXECUTABLE_FLAG)
|
||||
if(MINGW)
|
||||
set(EXECUTABLE_FLAG WIN32)
|
||||
@@ -76,7 +66,6 @@ endif()
|
||||
|
||||
set(monero_wallet_gui_sources
|
||||
${SOURCE_FILES}
|
||||
${PASS_STRENGTH_FILES}
|
||||
${RESOURCES}
|
||||
)
|
||||
|
||||
@@ -100,9 +89,6 @@ message(STATUS "OpenGL: libraries at ${OPENGL_LIBRARIES}")
|
||||
|
||||
target_include_directories(monero-wallet-gui PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
target_include_directories(monero-wallet-gui PUBLIC
|
||||
${CMAKE_SOURCE_DIR}/monero/include
|
||||
${CMAKE_SOURCE_DIR}/monero/src
|
||||
@@ -115,8 +101,6 @@ target_include_directories(monero-wallet-gui PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/model
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/QR-Code-scanner
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/zxcvbn-c
|
||||
${LibUSB_INCLUDE_DIRS}
|
||||
${HIDAPI_INCLUDE_DIRS}
|
||||
${X11_INCLUDE_DIR}
|
||||
${Boost_INCLUDE_DIRS}
|
||||
${OPENSSL_INCLUDE_DIR}
|
||||
@@ -139,33 +123,20 @@ endif()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
|
||||
|
||||
target_link_libraries(monero-wallet-gui
|
||||
wallet_merged
|
||||
${LMDB_LIBRARY}
|
||||
epee
|
||||
wallet_api
|
||||
qrcodegen
|
||||
${UNBOUND_LIBRARY}
|
||||
${SODIUM_LIBRARY}
|
||||
easylogging
|
||||
blockchain_db
|
||||
randomx
|
||||
hardforks
|
||||
${Boost_LIBRARIES}
|
||||
${OPENSSL_LIBRARIES}
|
||||
${CMAKE_DL_LIBS}
|
||||
${LibUSB_LIBRARIES}
|
||||
${HIDAPI_LIBRARIES}
|
||||
${QT5_LIBRARIES}
|
||||
${EXTRA_LIBRARIES}
|
||||
${ICU_LIBRARIES}
|
||||
openpgp
|
||||
qrdecoder
|
||||
translations
|
||||
zxcvbn
|
||||
)
|
||||
|
||||
if(DEVICE_TREZOR_READY)
|
||||
target_link_libraries(monero-wallet-gui ${TREZOR_DEP_LIBS})
|
||||
endif()
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(monero-wallet-gui ${X11_LIBRARIES})
|
||||
endif()
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
|
||||
@@ -121,13 +121,6 @@ quint64 AddressBook::count() const
|
||||
return m_rows.size();
|
||||
}
|
||||
|
||||
int AddressBook::lookupPaymentID(const QString &payment_id) const
|
||||
{
|
||||
QReadLocker locker(&m_lock);
|
||||
|
||||
return m_addressBookImpl->lookupPaymentID(payment_id.toStdString());
|
||||
}
|
||||
|
||||
QString AddressBook::getDescription(const QString &address) const
|
||||
{
|
||||
QReadLocker locker(&m_lock);
|
||||
|
||||
@@ -51,7 +51,6 @@ public:
|
||||
quint64 count() const;
|
||||
Q_INVOKABLE QString errorString() const;
|
||||
Q_INVOKABLE int errorCode() const;
|
||||
Q_INVOKABLE int lookupPaymentID(const QString &payment_id) const;
|
||||
Q_INVOKABLE QString getDescription(const QString &address) const;
|
||||
|
||||
enum ErrorCode {
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
|
||||
@@ -181,7 +181,6 @@ QString TransactionHistory::writeCSV(quint32 accountIndex, QString out)
|
||||
TransactionInfo info(tx, this);
|
||||
|
||||
// collect column data
|
||||
double amount = info.amount();
|
||||
quint64 atomicAmount = info.atomicAmount();
|
||||
quint32 subaddrAccount = info.subaddrAccount();
|
||||
QString fee = info.fee();
|
||||
@@ -212,7 +211,7 @@ QString TransactionHistory::writeCSV(quint32 accountIndex, QString out)
|
||||
// format and write
|
||||
QString line = QString("%1,%2,%3,%4,%5,%6,%7,%8,\"%9\",%10,%11\n")
|
||||
.arg(QString::number(blockHeight), QString::number(epoch), date)
|
||||
.arg(direction, QString::number(amount), QString::number(atomicAmount))
|
||||
.arg(direction, displayAmount, QString::number(atomicAmount))
|
||||
.arg(info.fee(), info.hash(), label, QString::number(subaddrAccount))
|
||||
.arg(paymentId);
|
||||
output << line;
|
||||
|
||||
@@ -746,16 +746,6 @@ QString Wallet::integratedAddress(const QString &paymentId) const
|
||||
return QString::fromStdString(m_walletImpl->integratedAddress(paymentId.toStdString()));
|
||||
}
|
||||
|
||||
QString Wallet::paymentId() const
|
||||
{
|
||||
return m_paymentId;
|
||||
}
|
||||
|
||||
void Wallet::setPaymentId(const QString &paymentId)
|
||||
{
|
||||
m_paymentId = paymentId;
|
||||
}
|
||||
|
||||
QString Wallet::getCacheAttribute(const QString &key) const {
|
||||
return QString::fromStdString(m_walletImpl->getCacheAttribute(key.toStdString()));
|
||||
}
|
||||
@@ -1090,9 +1080,9 @@ void Wallet::onPassphraseEntered(const QString &passphrase, bool enter_on_device
|
||||
Wallet::Wallet(Monero::Wallet *w, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_walletImpl(w)
|
||||
, m_history(nullptr)
|
||||
, m_history(new TransactionHistory(m_walletImpl->history(), this))
|
||||
, m_historyModel(nullptr)
|
||||
, m_addressBook(nullptr)
|
||||
, m_addressBook(new AddressBook(m_walletImpl->addressBook(), this))
|
||||
, m_addressBookModel(nullptr)
|
||||
, m_daemonBlockChainHeight(0)
|
||||
, m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS)
|
||||
@@ -1103,18 +1093,14 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent)
|
||||
, m_disconnected(true)
|
||||
, m_initialized(false)
|
||||
, m_currentSubaddressAccount(0)
|
||||
, m_subaddress(nullptr)
|
||||
, m_subaddress(new Subaddress(m_walletImpl->subaddress(), this))
|
||||
, m_subaddressModel(nullptr)
|
||||
, m_subaddressAccount(nullptr)
|
||||
, m_subaddressAccount(new SubaddressAccount(m_walletImpl->subaddressAccount(), this))
|
||||
, m_subaddressAccountModel(nullptr)
|
||||
, m_refreshEnabled(false)
|
||||
, m_refreshing(false)
|
||||
, m_scheduler(this)
|
||||
{
|
||||
m_history = new TransactionHistory(m_walletImpl->history(), this);
|
||||
m_addressBook = new AddressBook(m_walletImpl->addressBook(), this);
|
||||
m_subaddress = new Subaddress(m_walletImpl->subaddress(), this);
|
||||
m_subaddressAccount = new SubaddressAccount(m_walletImpl->subaddressAccount(), this);
|
||||
m_walletListener = new WalletListenerImpl(this);
|
||||
m_walletImpl->setListener(m_walletListener);
|
||||
m_currentSubaddressAccount = getCacheAttribute(ATTRIBUTE_SUBADDRESS_ACCOUNT).toUInt();
|
||||
@@ -1137,17 +1123,6 @@ Wallet::~Wallet()
|
||||
m_walletImpl->stop();
|
||||
m_scheduler.shutdownWaitForFinished();
|
||||
|
||||
delete m_addressBook;
|
||||
m_addressBook = NULL;
|
||||
|
||||
delete m_history;
|
||||
m_history = NULL;
|
||||
delete m_addressBook;
|
||||
m_addressBook = NULL;
|
||||
delete m_subaddress;
|
||||
m_subaddress = NULL;
|
||||
delete m_subaddressAccount;
|
||||
m_subaddressAccount = NULL;
|
||||
//Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl);
|
||||
if(status() == Status_Critical)
|
||||
qDebug("Not storing wallet cache");
|
||||
|
||||
@@ -75,7 +75,6 @@ class Wallet : public QObject, public PassprasePrompter
|
||||
Q_PROPERTY(bool synchronized READ synchronized)
|
||||
Q_PROPERTY(QString errorString READ errorString)
|
||||
Q_PROPERTY(TransactionHistory * history READ history)
|
||||
Q_PROPERTY(QString paymentId READ paymentId WRITE setPaymentId)
|
||||
Q_PROPERTY(TransactionHistorySortFilterModel * historyModel READ historyModel NOTIFY historyModelChanged)
|
||||
Q_PROPERTY(QString path READ path)
|
||||
Q_PROPERTY(AddressBookModel * addressBookModel READ addressBookModel)
|
||||
@@ -298,11 +297,6 @@ public:
|
||||
//! Parse URI
|
||||
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error);
|
||||
|
||||
//! saved payment id
|
||||
QString paymentId() const;
|
||||
|
||||
void setPaymentId(const QString &paymentId);
|
||||
|
||||
//! Namespace your cacheAttribute keys to avoid collisions
|
||||
Q_INVOKABLE bool setCacheAttribute(const QString &key, const QString &val);
|
||||
Q_INVOKABLE QString getCacheAttribute(const QString &key) const;
|
||||
@@ -443,7 +437,6 @@ private:
|
||||
// Used for UI history view
|
||||
mutable TransactionHistoryModel * m_historyModel;
|
||||
mutable TransactionHistorySortFilterModel * m_historySortFilterModel;
|
||||
QString m_paymentId;
|
||||
AddressBook * m_addressBook;
|
||||
mutable AddressBookModel * m_addressBookModel;
|
||||
mutable QElapsedTimer m_daemonBlockChainHeightTime;
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
#include "wallet/api/wallet2_api.h"
|
||||
#include "zxcvbn-c/zxcvbn.h"
|
||||
#include "QRCodeImageProvider.h"
|
||||
#include <QClipboard>
|
||||
#include <QGuiApplication>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
@@ -169,7 +171,7 @@ Wallet *WalletManager::createWalletFromKeys(const QString &path, const QString &
|
||||
}
|
||||
|
||||
Wallet *WalletManager::createWalletFromDevice(const QString &path, const QString &password, NetworkType::Type nettype,
|
||||
const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead)
|
||||
const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead, quint64 kdfRounds)
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
WalletPassphraseListenerImpl tmpListener(this);
|
||||
@@ -187,7 +189,7 @@ Wallet *WalletManager::createWalletFromDevice(const QString &path, const QString
|
||||
m_currentWallet = NULL;
|
||||
}
|
||||
Monero::Wallet * w = m_pimpl->createWalletFromDevice(path.toStdString(), password.toStdString(), static_cast<Monero::NetworkType>(nettype),
|
||||
deviceName.toStdString(), restoreHeight, subaddressLookahead.toStdString(), 1, &tmpListener);
|
||||
deviceName.toStdString(), restoreHeight, subaddressLookahead.toStdString(), kdfRounds, &tmpListener);
|
||||
w->setListener(nullptr);
|
||||
|
||||
m_currentWallet = new Wallet(w);
|
||||
@@ -202,10 +204,10 @@ Wallet *WalletManager::createWalletFromDevice(const QString &path, const QString
|
||||
|
||||
|
||||
void WalletManager::createWalletFromDeviceAsync(const QString &path, const QString &password, NetworkType::Type nettype,
|
||||
const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead)
|
||||
const QString &deviceName, quint64 restoreHeight, const QString &subaddressLookahead, quint64 kdfRounds)
|
||||
{
|
||||
m_scheduler.run([this, path, password, nettype, deviceName, restoreHeight, subaddressLookahead] {
|
||||
Wallet *wallet = createWalletFromDevice(path, password, nettype, deviceName, restoreHeight, subaddressLookahead);
|
||||
m_scheduler.run([this, path, password, nettype, deviceName, restoreHeight, subaddressLookahead, kdfRounds] {
|
||||
Wallet *wallet = createWalletFromDevice(path, password, nettype, deviceName, restoreHeight, subaddressLookahead, kdfRounds);
|
||||
emit walletCreated(wallet);
|
||||
});
|
||||
}
|
||||
@@ -459,7 +461,6 @@ QUrl WalletManager::localPathToUrl(const QString &path) const
|
||||
return QUrl::fromLocalFile(path);
|
||||
}
|
||||
|
||||
#ifndef DISABLE_PASS_STRENGTH_METER
|
||||
double WalletManager::getPasswordStrength(const QString &password) const
|
||||
{
|
||||
static const char *local_dict[] = {
|
||||
@@ -474,7 +475,6 @@ double WalletManager::getPasswordStrength(const QString &password) const
|
||||
ZxcvbnUnInit();
|
||||
return e;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool WalletManager::saveQrCode(const QString &code, const QString &path) const
|
||||
{
|
||||
@@ -482,6 +482,14 @@ 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::saveQrCodeToClipboard(const QString &code) const
|
||||
{
|
||||
QClipboard *clipboard = QGuiApplication::clipboard();
|
||||
QSize size;
|
||||
clipboard->setImage(QRCodeImageProvider::genQrImage(code, &size).scaled(size.expandedTo(QSize(240, 240)), Qt::KeepAspectRatio), QClipboard::Clipboard);
|
||||
clipboard->setImage(QRCodeImageProvider::genQrImage(code, &size).scaled(size.expandedTo(QSize(240, 240)), Qt::KeepAspectRatio), QClipboard::Selection);
|
||||
}
|
||||
|
||||
void WalletManager::checkUpdatesAsync(
|
||||
const QString &software,
|
||||
const QString &subdir,
|
||||
|
||||
@@ -103,14 +103,16 @@ public:
|
||||
NetworkType::Type nettype,
|
||||
const QString &deviceName,
|
||||
quint64 restoreHeight = 0,
|
||||
const QString &subaddressLookahead = "");
|
||||
const QString &subaddressLookahead = "",
|
||||
quint64 kdfRounds = 1);
|
||||
|
||||
Q_INVOKABLE void createWalletFromDeviceAsync(const QString &path,
|
||||
const QString &password,
|
||||
NetworkType::Type nettype,
|
||||
const QString &deviceName,
|
||||
quint64 restoreHeight = 0,
|
||||
const QString &subaddressLookahead = "");
|
||||
const QString &subaddressLookahead = "",
|
||||
quint64 kdfRounds = 1);
|
||||
/*!
|
||||
* \brief closeWallet - closes current open wallet and frees memory
|
||||
* \return wallet address
|
||||
@@ -172,14 +174,13 @@ public:
|
||||
Q_INVOKABLE qint64 addi(qint64 x, qint64 y) const { return x + y; }
|
||||
Q_INVOKABLE qint64 subi(qint64 x, qint64 y) const { return x - y; }
|
||||
|
||||
#ifndef DISABLE_PASS_STRENGTH_METER
|
||||
Q_INVOKABLE double getPasswordStrength(const QString &password) const;
|
||||
#endif
|
||||
|
||||
Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
|
||||
Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const;
|
||||
Q_INVOKABLE QVariantMap parse_uri_to_object(const QString &uri) const;
|
||||
Q_INVOKABLE bool saveQrCode(const QString &, const QString &) const;
|
||||
Q_INVOKABLE void saveQrCodeToClipboard(const QString &) const;
|
||||
Q_INVOKABLE void checkUpdatesAsync(
|
||||
const QString &software,
|
||||
const QString &subdir,
|
||||
|
||||
@@ -27,14 +27,9 @@
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "filter.h"
|
||||
#include <QtGlobal>
|
||||
#include <QKeyEvent>
|
||||
#include <QDebug>
|
||||
|
||||
#ifdef QT_DEBUG
|
||||
#include "private/qabstractanimation_p.h"
|
||||
#endif
|
||||
|
||||
filter::filter(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
@@ -91,21 +86,6 @@ bool filter::eventFilter(QObject *obj, QEvent *ev) {
|
||||
case QEvent::KeyRelease: {
|
||||
QKeyEvent *ke = static_cast<QKeyEvent*>(ev);
|
||||
|
||||
#ifdef QT_DEBUG
|
||||
if(ke->key() == Qt::Key_F9){
|
||||
QUnifiedTimer::instance()->setSlowModeEnabled(true);
|
||||
QUnifiedTimer::instance()->setSlowdownFactor(10);
|
||||
qDebug() << "Slow animations enabled";
|
||||
}
|
||||
|
||||
if(ke->key() == Qt::Key_F10){
|
||||
QUnifiedTimer::instance()->setSlowModeEnabled(false);
|
||||
QUnifiedTimer::instance()->setSlowdownFactor(1);
|
||||
|
||||
qDebug() << "Slow animations disabled";
|
||||
}
|
||||
#endif
|
||||
|
||||
if(ke->key() == Qt::Key_Backtab)
|
||||
m_backtabPressed = false;
|
||||
|
||||
|
||||
@@ -72,6 +72,9 @@
|
||||
#include "qt/KeysFiles.h"
|
||||
#include "qt/MoneroSettings.h"
|
||||
#include "qt/NetworkAccessBlockingFactory.h"
|
||||
#ifdef Q_OS_MAC
|
||||
#include "qt/macoshelper.h"
|
||||
#endif
|
||||
|
||||
// IOS exclusions
|
||||
#ifndef Q_OS_IOS
|
||||
@@ -133,6 +136,7 @@ Q_IMPORT_PLUGIN(QtQuickControls1Plugin)
|
||||
Q_IMPORT_PLUGIN(QtQuick2DialogsPlugin)
|
||||
Q_IMPORT_PLUGIN(QmlFolderListModelPlugin)
|
||||
Q_IMPORT_PLUGIN(QmlSettingsPlugin)
|
||||
Q_IMPORT_PLUGIN(QtLabsPlatformPlugin)
|
||||
Q_IMPORT_PLUGIN(QtQuick2DialogsPrivatePlugin)
|
||||
Q_IMPORT_PLUGIN(QtQuick2PrivateWidgetsPlugin)
|
||||
Q_IMPORT_PLUGIN(QtQuickControls2Plugin)
|
||||
@@ -178,6 +182,10 @@ int main(int argc, char *argv[])
|
||||
if(qgetenv("QMLSCENE_DEVICE") == "softwarecontext")
|
||||
isOpenGL = false;
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
// macOS window tabbing is not supported
|
||||
MacOSHelper::disableWindowTabbing();
|
||||
#endif
|
||||
// disable "QApplication: invalid style override passed" warning
|
||||
if (isDesktop) qputenv("QT_STYLE_OVERRIDE", "fusion");
|
||||
#ifdef Q_OS_LINUX
|
||||
@@ -331,7 +339,7 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
|
||||
// screen settings
|
||||
// Mobile is designed on 128dpi
|
||||
qreal ref_dpi = 128;
|
||||
QRect geo = QGuiApplication::primaryScreen()->availableGeometry();
|
||||
QSize screenAvailableSize = QGuiApplication::primaryScreen()->availableSize();
|
||||
QRect rect = QGuiApplication::primaryScreen()->geometry();
|
||||
qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch();
|
||||
qreal physicalDpi = QGuiApplication::primaryScreen()->physicalDotsPerInch();
|
||||
@@ -354,6 +362,7 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
|
||||
|
||||
qWarning().nospace().noquote() << "Qt:" << QT_VERSION_STR << " GUI:" << GUI_VERSION
|
||||
<< " | screen: " << rect.width() << "x" << rect.height()
|
||||
<< " - available: " << screenAvailableSize
|
||||
<< " - dpi: " << dpi << " - ratio:" << calculated_ratio;
|
||||
|
||||
// registering types for QML
|
||||
@@ -464,8 +473,8 @@ Verify update binary using 'shasum'-compatible (SHA256 algo) output signed by tw
|
||||
engine.rootContext()->setContextProperty("isOpenGL", isOpenGL);
|
||||
engine.rootContext()->setContextProperty("isTails", isTails);
|
||||
|
||||
engine.rootContext()->setContextProperty("screenWidth", geo.width());
|
||||
engine.rootContext()->setContextProperty("screenHeight", geo.height());
|
||||
engine.rootContext()->setContextProperty("screenAvailableWidth", screenAvailableSize.width());
|
||||
engine.rootContext()->setContextProperty("screenAvailableHeight", screenAvailableSize.height());
|
||||
|
||||
#ifndef Q_OS_IOS
|
||||
const QString desktopFolder = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
|
||||
|
||||
@@ -87,11 +87,6 @@ bool AddressBookModel::deleteRow(int row)
|
||||
return m_addressBook->deleteRow(row);
|
||||
}
|
||||
|
||||
int AddressBookModel::lookupPaymentID(const QString &payment_id) const
|
||||
{
|
||||
return m_addressBook->lookupPaymentID(payment_id);
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> AddressBookModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> roleNames = QAbstractListModel::roleNames();
|
||||
|
||||
@@ -52,7 +52,6 @@ public:
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
Q_INVOKABLE bool deleteRow(int row);
|
||||
Q_INVOKABLE int lookupPaymentID(const QString &payment_id) const;
|
||||
virtual QHash<int, QByteArray> roleNames() const override;
|
||||
|
||||
public slots:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <gcrypt.h>
|
||||
|
||||
@@ -40,6 +40,7 @@ public:
|
||||
static bool openFolderAndSelectItem(const QUrl &path);
|
||||
static QPixmap screenshot();
|
||||
static QString bundlePath();
|
||||
static void disableWindowTabbing();
|
||||
};
|
||||
|
||||
#endif //MACOSHELPER_H
|
||||
|
||||
@@ -41,6 +41,14 @@
|
||||
|
||||
#include "ScopeGuard.h"
|
||||
|
||||
void MacOSHelper::disableWindowTabbing()
|
||||
{
|
||||
#ifdef __MAC_10_12
|
||||
if ([NSWindow respondsToSelector:@selector(allowsAutomaticWindowTabbing)])
|
||||
[NSWindow setAllowsAutomaticWindowTabbing: NO];
|
||||
#endif
|
||||
}
|
||||
|
||||
bool MacOSHelper::isCapsLock()
|
||||
{
|
||||
#ifdef __MAC_10_12
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
file(GLOB_RECURSE SRC_SOURCES *.cpp)
|
||||
file(GLOB_RECURSE SRC_HEADERS *.h)
|
||||
|
||||
|
||||
add_library(zxcvbn STATIC zxcvbn.c)
|
||||
set_target_properties(zxcvbn PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_include_directories(zxcvbn PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
# zxcvbn-c
|
||||
This is a C/C++ implementation of the zxcvbn password strength estimation.
|
||||
|
||||
The code is intended to be included as part of the source of a C/C++ program. Like the
|
||||
original this code is for character sets which use single byte characters primarily in the
|
||||
code range 0x20 to 0x7E.
|
||||
|
||||
The original coffee script version is available at
|
||||
https://github.com/lowe/zxcvbn
|
||||
|
||||
An article on the reasons for zxcvbn is at
|
||||
https://tech.dropox.com/2012/04/zxcvbn-realistic-password-strength-estimation
|
||||
|
||||
##Building
|
||||
|
||||
The makefile will build several test programs to test the code. It shows the steps needed
|
||||
to use the code in C and C++ programs, using the dictionary data read from file or included
|
||||
within the program executable.
|
||||
The makefile has only been tried on Linux using GCC version 4.8.4, but should be faily
|
||||
portable to other systems.
|
||||
|
||||
When dictionary data is included in your program's executable, the files `zxcvbn.c` ,
|
||||
`zxcvbn.h` , `dict-src.h` are used in your program.
|
||||
|
||||
When dictionary data is read from file, the files `zxcvbn.c` , `zxcvbn.h` , `dict-crc.h`
|
||||
and `zxcvbn.dict` are used in your program, compiled with `#define USE_DICT_FILE`. The CRC
|
||||
of the dictionary data file is written to `dict-crc.h` so your executable can detect
|
||||
corruption of the data.
|
||||
|
||||
Rename `zxcvbn.c` to `zxcvbn.cpp` (or whatever your compiler uses) to compile as C++.
|
||||
|
||||
The `dict*.h` and `zxcvbn.dict` files are generated by the dictgen program compiled from
|
||||
dict-generate.cpp (see makefile for details).
|
||||
|
||||
##Using
|
||||
|
||||
Initially call `ZxcvbnInit()` with the pathname of the `zxcvbn.dict` file. This can be
|
||||
omitted when dictionary data is included in the executable.
|
||||
|
||||
Call `ZxcvbnMatch()` with the password and optional user dictionary to get the entropy
|
||||
estimation and optional information on the password parts (which will need freeing with
|
||||
`ZxcvbnFreeInfo()` after use). Do this for each password to be tested, or as each character
|
||||
of it is entered into your program. The optional user dictionary can change between each
|
||||
call.
|
||||
|
||||
Finally call `ZxcvbnUninit()` to free the dictionary data from read from file. This can be
|
||||
omitted when dictionary data is included in the executable.
|
||||
|
||||
Review the test program in `test.c` for an example.
|
||||
|
||||
|
||||
## Differences from the original version.
|
||||
|
||||
The entropy calculated will sometimes differ from the original because of
|
||||
|
||||
* The UK keyboard layout is also included, so there are additional spacial sequences, e.g.
|
||||
**;'#** is a spacial sequence.
|
||||
* The different character classes in a password are taken into account when calculating the
|
||||
strength of brute-force matches.
|
||||
* Dijktra's path searching algorithm is used to combine parts of the entered password. This
|
||||
can result in the found parts of the password being combined differently than the
|
||||
original coffee script. E.g. the password **passwordassword**
|
||||
is combined by the original coffee script as **p** (3.5 bits) + **asswordassword** (12.6
|
||||
bits) + multiple part allowance (1.0bit) to give total entropy of 17.1 bits. This
|
||||
implementation combines it as **password** (1.0 bit) + **assword** (11.6 bits) + multiple
|
||||
part allowance (1.0bit) to give 13.6 bits.
|
||||
* For multi part passwords the original coffee script version multiplies the number of
|
||||
guesses needed by the factorial of the number of parts. This is not possible in this
|
||||
version as Dijktra's algorithm is used. Instead one bit entropy is added for the part at the
|
||||
end of the password, 1.7 bits for each part in the middle of a password and nothing
|
||||
for the part at the beginning. This gives similar results compared to the coffee script
|
||||
version when there are 4 or less parts, but will differ significantly when there are many
|
||||
parts (which is likely to be a rare occurrence).
|
||||
|
||||
|
||||
##References
|
||||
|
||||
The original coffee-script version is available at
|
||||
https://github.com/lowe/zxcvbn
|
||||
|
||||
The dictionary words are taken from the original coffee script version.
|
||||
|
||||
Dictionary trie encoding (used for by the word lookup code) based on idea from the Caroline
|
||||
Word Graph from
|
||||
http://www.pathcom.com/~vadco/cwg.html
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
24867
src/zxcvbn-c/dict-src.h
Normal file
24867
src/zxcvbn-c/dict-src.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,104 +0,0 @@
|
||||
CFLAGS ?= -O2 -Wall -Wextra -Wdeclaration-after-statement
|
||||
CXXFLAGS ?= -O2 -Wall -Wextra
|
||||
|
||||
# default programs
|
||||
CC ?= gcc
|
||||
AR ?= ar
|
||||
CXX ?= g++
|
||||
|
||||
# need zxcvbn.h prior to package installation
|
||||
CPPFLAGS += -I.
|
||||
|
||||
# library metadata
|
||||
TARGET_LIB = libzxcvbn.so.0.0.0
|
||||
SONAME = libzxcvbn.so.0
|
||||
|
||||
WORDS = words-eng_wiki.txt words-female.txt words-male.txt words-passwd.txt words-surname.txt words-tv_film.txt
|
||||
|
||||
#all: test-file test-inline test-c++inline test-c++file test-shlib test-statlib
|
||||
all: test-statlib
|
||||
|
||||
test-shlib: test.c $(TARGET_LIB)
|
||||
if [ ! -e libzxcvbn.so ]; then ln -s $(TARGET_LIB) libzxcvbn.so; fi
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -L. $(LDFLAGS) libzxcvbn.so -lm
|
||||
|
||||
$(TARGET_LIB): zxcvbn-inline-pic.o
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) \
|
||||
-o $@ $^ -fPIC -shared -Wl,-soname,$(SONAME) $(LDFLAGS) -lm
|
||||
if [ ! -e $(SONAME) ]; then ln -s $(TARGET_LIB) $(SONAME); fi
|
||||
|
||||
test-statlib: test.c libzxcvbn.a
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lm
|
||||
|
||||
libzxcvbn.a: zxcvbn-inline.o
|
||||
$(AR) cvq $@ $^
|
||||
|
||||
test-file: test.c zxcvbn-file.o
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) \
|
||||
-DUSE_DICT_FILE -o test-file test.c zxcvbn-file.o $(LDFLAGS) -lm
|
||||
|
||||
zxcvbn-file.o: zxcvbn.c dict-crc.h zxcvbn.h
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) \
|
||||
-DUSE_DICT_FILE -c -o zxcvbn-file.o zxcvbn.c
|
||||
|
||||
test-inline: test.c zxcvbn-inline.o
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) \
|
||||
-o test-inline test.c zxcvbn-inline.o $(LDFLAGS) -lm
|
||||
|
||||
zxcvbn-inline-pic.o: zxcvbn.c dict-src.h zxcvbn.h
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -fPIC -c -o $@ $<
|
||||
|
||||
zxcvbn-inline.o: zxcvbn.c dict-src.h zxcvbn.h
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o zxcvbn-inline.o zxcvbn.c
|
||||
|
||||
dict-src.h: dictgen $(WORDS)
|
||||
./dictgen -o dict-src.h $(WORDS)
|
||||
|
||||
dict-crc.h: dictgen $(WORDS)
|
||||
./dictgen -b -o zxcvbn.dict -h dict-crc.h $(WORDS)
|
||||
|
||||
dictgen: dict-generate.cpp makefile
|
||||
$(CXX) $(CPPFLAGS) -std=c++11 $(CXXFLAGS) \
|
||||
-o dictgen dict-generate.cpp $(LDFLAGS)
|
||||
|
||||
test-c++inline: test.c zxcvbn-c++inline.o
|
||||
if [ ! -e test.cpp ]; then ln -s test.c test.cpp; fi
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) \
|
||||
-o test-c++inline test.cpp zxcvbn-c++inline.o $(LDFLAGS) -lm
|
||||
|
||||
zxcvbn-c++inline.o: zxcvbn.c dict-src.h zxcvbn.h
|
||||
if [ ! -e zxcvbn.cpp ]; then ln -s zxcvbn.c zxcvbn.cpp; fi
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) \
|
||||
-c -o zxcvbn-c++inline.o zxcvbn.cpp
|
||||
|
||||
test-c++file: test.c zxcvbn-c++file.o
|
||||
if [ ! -e test.cpp ]; then ln -s test.c test.cpp; fi
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) \
|
||||
-DUSE_DICT_FILE -o test-c++file test.cpp zxcvbn-c++file.o $(LDFLAGS) -lm
|
||||
|
||||
zxcvbn-c++file.o: zxcvbn.c dict-crc.h zxcvbn.h
|
||||
if [ ! -e zxcvbn.cpp ]; then ln -s zxcvbn.c zxcvbn.cpp; fi
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) \
|
||||
-DUSE_DICT_FILE -c -o zxcvbn-c++file.o zxcvbn.cpp
|
||||
|
||||
test: test-file test-inline test-c++inline test-c++file test-shlib test-statlib testcases.txt
|
||||
@echo Testing C build, dictionary from file
|
||||
./test-file -t testcases.txt
|
||||
@echo Testing C build, dictionary in executable
|
||||
./test-inline -t testcases.txt
|
||||
@echo Testing C shlib, dictionary in shlib
|
||||
LD_LIBRARY_PATH=. ./test-shlib -t testcases.txt
|
||||
@echo Testing C static lib, dictionary in lib
|
||||
./test-statlib -t testcases.txt
|
||||
@echo Testing C++ build, dictionary from file
|
||||
./test-c++file -t testcases.txt
|
||||
@echo Testing C++ build, dictionary in executable
|
||||
./test-c++inline -t testcases.txt
|
||||
@echo Finished
|
||||
|
||||
clean:
|
||||
rm -f test-file zxcvbn-file.o test-c++file zxcvbn-c++file.o
|
||||
rm -f test-inline zxcvbn-inline.o zxcvbn-inline-pic.o test-c++inline zxcvbn-c++inline.o
|
||||
rm -f dict-*.h zxcvbn.dict zxcvbn.cpp test.cpp
|
||||
rm -f dictgen
|
||||
rm -f ${TARGET_LIB} ${SONAME} libzxcvbn.so test-shlib libzxcvbn.a test-statlib
|
||||
@@ -1,281 +0,0 @@
|
||||
/**********************************************************************************
|
||||
* Program to test the C implementation of the zxcvbn password strength estimator.
|
||||
* Copyright (c) 2015, Tony Evans
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or other
|
||||
* materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software without specific
|
||||
* prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*
|
||||
**********************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <zxcvbn.h>
|
||||
|
||||
const char *UsrDict[] =
|
||||
{
|
||||
"Onename.Twoname@example.com", "Onename", "Twoname", "example.com", "example",
|
||||
0
|
||||
};
|
||||
|
||||
static void CalcPass(const char *Pwd, int Quiet)
|
||||
{
|
||||
double e;
|
||||
if (!Quiet)
|
||||
{
|
||||
/* Output the details of how the entropy figure was calculated */
|
||||
int Len, ChkLen;
|
||||
struct timeval t1, t2;
|
||||
ZxcMatch_t *Info, *p;
|
||||
double m = 0.0;
|
||||
|
||||
gettimeofday(&t1, 0);
|
||||
e = ZxcvbnMatch(Pwd, UsrDict, &Info);
|
||||
gettimeofday(&t2, 0);
|
||||
for(p = Info; p; p = p->Next)
|
||||
m += p->Entrpy;
|
||||
|
||||
Len = strlen(Pwd);
|
||||
m = e - m;
|
||||
printf("Pass %s \tLength %d\tEntropy bits=%.3f log10=%.3f\tMulti-word extra bits=%.1f\n", Pwd, Len, e, e * 0.301029996, m);
|
||||
p = Info;
|
||||
ChkLen = 0;
|
||||
while(p)
|
||||
{
|
||||
int n;
|
||||
switch((int)p->Type)
|
||||
{
|
||||
case BRUTE_MATCH: printf(" Type: Bruteforce "); break;
|
||||
case DICTIONARY_MATCH: printf(" Type: Dictionary "); break;
|
||||
case DICT_LEET_MATCH: printf(" Type: Dict+Leet "); break;
|
||||
case USER_MATCH: printf(" Type: User Words "); break;
|
||||
case USER_LEET_MATCH: printf(" Type: User+Leet "); break;
|
||||
case REPEATS_MATCH: printf(" Type: Repeated "); break;
|
||||
case SEQUENCE_MATCH: printf(" Type: Sequence "); break;
|
||||
case SPATIAL_MATCH: printf(" Type: Spatial "); break;
|
||||
case DATE_MATCH: printf(" Type: Date "); break;
|
||||
case BRUTE_MATCH+MULTIPLE_MATCH: printf(" Type: Bruteforce(Rep)"); break;
|
||||
case DICTIONARY_MATCH+MULTIPLE_MATCH: printf(" Type: Dictionary(Rep)"); break;
|
||||
case DICT_LEET_MATCH+MULTIPLE_MATCH: printf(" Type: Dict+Leet(Rep) "); break;
|
||||
case USER_MATCH+MULTIPLE_MATCH: printf(" Type: User Words(Rep)"); break;
|
||||
case USER_LEET_MATCH+MULTIPLE_MATCH: printf(" Type: User+Leet(Rep) "); break;
|
||||
case REPEATS_MATCH+MULTIPLE_MATCH: printf(" Type: Repeated(Rep) "); break;
|
||||
case SEQUENCE_MATCH+MULTIPLE_MATCH: printf(" Type: Sequence(Rep) "); break;
|
||||
case SPATIAL_MATCH+MULTIPLE_MATCH: printf(" Type: Spatial(Rep) "); break;
|
||||
case DATE_MATCH+MULTIPLE_MATCH: printf(" Type: Date(Rep) "); break;
|
||||
|
||||
default: printf(" Type: Unknown%d ", p->Type); break;
|
||||
}
|
||||
ChkLen += p->Length;
|
||||
printf(" Length %d Entropy %6.3f (%.2f) ", p->Length, p->Entrpy, p->Entrpy * 0.301029996);
|
||||
for(n = 0; n < p->Length; ++n, ++Pwd)
|
||||
printf("%c", *Pwd);
|
||||
printf("\n");
|
||||
p = p->Next;
|
||||
}
|
||||
ZxcvbnFreeInfo(Info);
|
||||
t2.tv_sec -= t1.tv_sec;
|
||||
t2.tv_usec -= t1.tv_usec;
|
||||
t2.tv_usec += t2.tv_sec * 1000000;
|
||||
printf(" Calculation Time %.2fms\n", t2.tv_usec/1000.0);
|
||||
if (ChkLen != Len)
|
||||
printf("*** Password length (%d) != sum of length of parts (%d) ***\n", Len, ChkLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Only get the final entropy figure */
|
||||
e = ZxcvbnMatch(Pwd, UsrDict, 0);
|
||||
printf("Pass %s \tEntropy %.3f\n", Pwd, e);
|
||||
}
|
||||
}
|
||||
|
||||
int DoChecks(char *file)
|
||||
{
|
||||
char Line[500];
|
||||
int y = 0;
|
||||
int w = 0;
|
||||
int r = 0;
|
||||
FILE *f = fopen(file, "r");
|
||||
if (f == NULL)
|
||||
{
|
||||
printf("Failed to open %s\n", file);
|
||||
return 1;
|
||||
}
|
||||
memset(Line, 0, sizeof Line);
|
||||
while(fgets(Line, sizeof Line - 4, f))
|
||||
{
|
||||
/* Line is password + whitespace + expected entropy */
|
||||
char *Pwd, *s, *t;
|
||||
double Ent, e, x;
|
||||
unsigned int i;
|
||||
++y;
|
||||
for(i = 0; i < sizeof Line - 5; ++i)
|
||||
{
|
||||
if (!Line[i] || (Line[i] == '\n'))
|
||||
break;
|
||||
}
|
||||
/* Skip blank lines or those starting with # */
|
||||
if ((i < 3) || (Line[0] == '#'))
|
||||
continue;
|
||||
memset(Line + i, 0, 4);
|
||||
Pwd = Line;
|
||||
/* Skip leading whitespace */
|
||||
while(*Pwd && (*Pwd <= ' '))
|
||||
++Pwd;
|
||||
|
||||
/* Make password null termnated */
|
||||
s = Pwd;
|
||||
t = strchr(s, '\t');
|
||||
if (t == NULL)
|
||||
t = strstr(s, " ");
|
||||
if (t == NULL)
|
||||
{
|
||||
printf("Bad test condition on line %d\n", y);
|
||||
r = 1;
|
||||
break;
|
||||
}
|
||||
*t++ = 0;
|
||||
|
||||
/* Skip whitespace before entropy value */
|
||||
while(*t && (*t <= ' '))
|
||||
++t;
|
||||
if (!*t)
|
||||
{
|
||||
printf("Bad test condition on line %d\n", y);
|
||||
r = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
Ent = atof(t);
|
||||
if ((Ent < 0.0) || (Ent > 1000.0))
|
||||
{
|
||||
printf("Bad entropy value on line %d\n", y);
|
||||
r = 1;
|
||||
break;
|
||||
}
|
||||
e = ZxcvbnMatch(Pwd, UsrDict, 0);
|
||||
x = e / Ent;
|
||||
/* More than 1% difference is a fail. */
|
||||
if ((x > 1.01) || (x < 1.0/1.01))
|
||||
{
|
||||
printf("Line %2d Calculated entropy %5.2f, expected %5.2f <%s>\n", y, e, Ent, Pwd);
|
||||
r = 1;
|
||||
break;
|
||||
}
|
||||
++w;
|
||||
}
|
||||
fclose(f);
|
||||
if (!r)
|
||||
printf("Tested %d words\n", w);
|
||||
return r;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, Quiet, Checks, White;
|
||||
Quiet = 0;
|
||||
Checks = 0;
|
||||
White = 0;
|
||||
if (!ZxcvbnInit("zxcvbn.dict"))
|
||||
{
|
||||
printf("Failed to open dictionary file\n");
|
||||
return 1;
|
||||
}
|
||||
if ((argc > 1) && (argv[1][0] == '-'))
|
||||
{
|
||||
if (!strcmp(argv[1], "-qs") || !strcmp(argv[1], "-sq"))
|
||||
Quiet = White = 1;
|
||||
if (!strcmp(argv[1], "-t"))
|
||||
Checks = 1;
|
||||
if (!strcmp(argv[1], "-q"))
|
||||
Quiet = 1;
|
||||
if (!strcmp(argv[1], "-s"))
|
||||
White = 1;
|
||||
if ((Checks + Quiet + White) == 0)
|
||||
{
|
||||
char *s = strrchr(argv[0], '/');
|
||||
if (s == NULL)
|
||||
s = argv[0];
|
||||
else
|
||||
++s;
|
||||
printf( "Usage: %s [ -q | -qs ] [ pwd1 pwd2 ... ]\n"
|
||||
" Output entropy of given passwords. If no passwords on command line read\n"
|
||||
" them from stdin.\n"
|
||||
" -q option stops password analysis details from being output.\n"
|
||||
" -s Ignore anything from space on a line when reading from stdin.\n"
|
||||
" %s -t file\n"
|
||||
" Read the file and check for correct results.\n", s, s);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (Checks)
|
||||
{
|
||||
for(i = 2; i < argc; ++i)
|
||||
{
|
||||
Checks = DoChecks(argv[i]);
|
||||
if (Checks)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
i = 1+Quiet;
|
||||
if (i >= argc)
|
||||
{
|
||||
/* No test passwords on command line, so get them from stdin */
|
||||
char Line[500];
|
||||
while(fgets(Line, sizeof Line, stdin))
|
||||
{
|
||||
/* Drop the trailing newline character */
|
||||
for(i = 0; i < (int)(sizeof Line - 1); ++i)
|
||||
{
|
||||
if (Line[i] < ' ')
|
||||
{
|
||||
Line[i] = 0;
|
||||
break;
|
||||
}
|
||||
if (White && (Line[i] == ' '))
|
||||
{
|
||||
Line[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (Line[0])
|
||||
CalcPass(Line, Quiet);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Do the test passwords on the command line */
|
||||
for(; i < argc; ++i)
|
||||
{
|
||||
CalcPass(argv[i], Quiet);
|
||||
}
|
||||
}
|
||||
ZxcvbnUnInit();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
zxcvbn 5.83
|
||||
qwER43@! 26.44
|
||||
Tr0ub4dour&3 30.87
|
||||
archi 13.61
|
||||
|
||||
D0g.................. 19.02
|
||||
abcdefghijk987654321 8.53
|
||||
neverforget13/3/1997 34.86
|
||||
1qaz2wsx3edc 9.98
|
||||
barbarbara 12.43
|
||||
abarbarbara 16.18
|
||||
|
||||
temppass22 17.20
|
||||
briansmith 5.32
|
||||
htimsnairb 6.07
|
||||
briansmith4mayor 21.63
|
||||
password1 4.0
|
||||
viking 7.93
|
||||
thx1138 7.70
|
||||
ScoRpi0ns 19.54
|
||||
do you know 25.51
|
||||
|
||||
ryanhunter2000 20.8
|
||||
rianhunter2000 28.25
|
||||
|
||||
asdfghju7654rewq 29.57
|
||||
AOEUIDHG&*()LS_ 33.33
|
||||
|
||||
12345678 1.59
|
||||
defghi6789 13.61
|
||||
02468 3.32
|
||||
adgjmpsvy 4.17
|
||||
|
||||
rosebud 8.09
|
||||
Rosebud 9.09
|
||||
ROSEBUD 9.09
|
||||
rosebuD 9.09
|
||||
R0$38uD 12.09
|
||||
ros3bud99 14.41
|
||||
r0s3bud99 14.41
|
||||
R0$38uD99 17.41
|
||||
|
||||
verlineVANDERMARK 27.24
|
||||
|
||||
eheuczkqyq 41.24
|
||||
rWibMFACxAUGZmxhVncy 111.0
|
||||
|
||||
illness 11.26
|
||||
1llness 12.26
|
||||
i1lness 12.84
|
||||
11lness 22.44
|
||||
ssenl1i 12.84
|
||||
Ba9ZyWABu99[BK#6MBgbH88Tofv)vs$w 171.63
|
||||
correcthorsebatterystaple 47.98
|
||||
elpatsyrettabesrohtcerroc 48.98
|
||||
coRrecth0rseba++ery9.23.2007staple$ 71.95
|
||||
|
||||
pass.word.pass.word.pass.word. 60.41
|
||||
passpasswordword 17.28
|
||||
quvpzquvpz 24.50
|
||||
|
||||
magicfavoriteunclepromisedpublicbotherislandjimseriouslycellleadknowingbrokenadvicesomehowpaidblairlosingpushhelpedkillingusuallyearlierbosslaurabeginninglikedinnocentdocruleselizabethsabrinasummerexcoplearnedthirtyrisklettingphillipspeakingofficerridiculoussupportafternoonericwithsobutallwellareheohaboutrightyou're 545.9
|
||||
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
@@ -46,3 +46,4 @@ set_source_files_properties(${TRANSLATIONS_CPP} PROPERTIES SKIP_AUTOMOC ON)
|
||||
set_source_files_properties(${TRANSLATIONS_CPP} PROPERTIES SKIP_AUTOUIC ON)
|
||||
|
||||
add_library(translations ${TRANSLATIONS_CPP})
|
||||
target_link_libraries(translations PUBLIC Qt5::Core)
|
||||
|
||||
@@ -82,6 +82,7 @@ Rectangle {
|
||||
|
||||
property var m_wallet;
|
||||
property alias wizardState: wizardStateView.state
|
||||
property alias wizardStateView: wizardStateView
|
||||
property alias wizardStackView: stackView
|
||||
property int wizardSubViewWidth: 780
|
||||
property int wizardSubViewTopMargin: persistentSettings.customDecorations ? 90 : 32
|
||||
@@ -450,12 +451,13 @@ Rectangle {
|
||||
tmpWalletFilename = oshelper.temporaryFilename();
|
||||
console.log("Creating temporary wallet", tmpWalletFilename)
|
||||
var nettype = persistentSettings.nettype;
|
||||
var kdfRounds = persistentSettings.kdfRounds;
|
||||
var restoreHeight = wizardController.walletOptionsRestoreHeight;
|
||||
var subaddressLookahead = wizardController.walletOptionsSubaddressLookahead;
|
||||
var deviceName = wizardController.walletOptionsDeviceName;
|
||||
|
||||
connect();
|
||||
walletManager.createWalletFromDeviceAsync(tmpWalletFilename, "", nettype, deviceName, restoreHeight, subaddressLookahead);
|
||||
walletManager.createWalletFromDeviceAsync(tmpWalletFilename, "", nettype, deviceName, restoreHeight, subaddressLookahead, kdfRounds);
|
||||
creatingWalletDeviceSplash();
|
||||
}
|
||||
|
||||
|
||||
@@ -45,11 +45,14 @@ Rectangle {
|
||||
property string viewName: "wizardCreateDevice1"
|
||||
|
||||
property var deviceName: deviceNameModel.get(deviceNameDropdown.currentIndex).column2
|
||||
property var ledgerType: deviceName == "Ledger" ? deviceNameModel.get(deviceNameDropdown.currentIndex).column1 : null
|
||||
property var hardwareWalletType: wizardCreateDevice1.deviceName;
|
||||
|
||||
ListModel {
|
||||
id: deviceNameModel
|
||||
ListElement { column1: qsTr("Choose your hardware device"); column2: "";}
|
||||
ListElement { column1: "Ledger Nano S/X"; column2: "Ledger";}
|
||||
ListElement { column1: qsTr("Choose your hardware wallet"); column2: "";}
|
||||
ListElement { column1: "Ledger Nano S"; column2: "Ledger";}
|
||||
ListElement { column1: "Ledger Nano X"; column2: "Ledger";}
|
||||
ListElement { column1: "Trezor Model T"; column2: "Trezor";}
|
||||
}
|
||||
|
||||
@@ -78,35 +81,88 @@ Rectangle {
|
||||
id: walletInput
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
RowLayout {
|
||||
id: mainRow
|
||||
spacing: 0
|
||||
Layout.topMargin: 10
|
||||
Layout.topMargin: -10
|
||||
Layout.fillWidth: true
|
||||
|
||||
MoneroComponents.RadioButton {
|
||||
id: newDeviceWallet
|
||||
text: qsTr("Create a new wallet from device.") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
checked: true
|
||||
onClicked: {
|
||||
checked = true;
|
||||
restoreDeviceWallet.checked = false;
|
||||
wizardController.walletOptionsDeviceIsRestore = false;
|
||||
}
|
||||
}
|
||||
ColumnLayout {
|
||||
id: leftColumn
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignTop
|
||||
|
||||
MoneroComponents.RadioButton {
|
||||
id: restoreDeviceWallet
|
||||
Layout.topMargin: 10
|
||||
text: qsTr("Restore a wallet from device. Use this if you used your hardware wallet before.") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
checked: false
|
||||
onClicked: {
|
||||
checked = true;
|
||||
newDeviceWallet.checked = false;
|
||||
wizardController.walletOptionsDeviceIsRestore = true;
|
||||
}
|
||||
}
|
||||
MoneroComponents.TextPlain {
|
||||
font.family: MoneroComponents.Style.fontRegular.name
|
||||
font.pixelSize: 14
|
||||
color: MoneroComponents.Style.defaultFontColor
|
||||
wrapMode: Text.Wrap
|
||||
Layout.fillWidth: true
|
||||
text: qsTr("Hardware wallet model")
|
||||
}
|
||||
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: deviceNameDropdown
|
||||
dataModel: deviceNameModel
|
||||
Layout.preferredWidth: 450
|
||||
Layout.topMargin: 6
|
||||
z: 3
|
||||
}
|
||||
|
||||
MoneroComponents.RadioButton {
|
||||
id: newDeviceWallet
|
||||
Layout.topMargin: 20
|
||||
text: qsTr("Create a new wallet from device.") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
checked: true
|
||||
onClicked: {
|
||||
checked = true;
|
||||
restoreDeviceWallet.checked = false;
|
||||
wizardController.walletOptionsDeviceIsRestore = false;
|
||||
}
|
||||
}
|
||||
|
||||
MoneroComponents.RadioButton {
|
||||
id: restoreDeviceWallet
|
||||
Layout.topMargin: 10
|
||||
text: qsTr("Restore a wallet from device. Use this if you used your hardware wallet before.") + translationManager.emptyString
|
||||
fontSize: 16
|
||||
checked: false
|
||||
onClicked: {
|
||||
checked = true;
|
||||
newDeviceWallet.checked = false;
|
||||
wizardController.walletOptionsDeviceIsRestore = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: rightColumn
|
||||
Layout.alignment: Qt.AlignTop
|
||||
Layout.preferredWidth: 305
|
||||
Layout.minimumWidth: 120
|
||||
Layout.preferredHeight: 165
|
||||
Layout.maximumHeight: 165
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
|
||||
Rectangle {
|
||||
color: "transparent"
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
Layout.topMargin: 0
|
||||
|
||||
Image {
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
|
||||
source: hardwareWalletType == "Trezor" ? "qrc:///images/trezor.png" : hardwareWalletType == "Ledger" ? (ledgerType == "Ledger Nano S" ? "qrc:///images/ledgerNanoS.png" : "qrc:///images/ledgerNanoX.png") : ""
|
||||
z: parent.z + 1
|
||||
width: parent.width
|
||||
height: 165
|
||||
fillMode: Image.PreserveAspectFit
|
||||
mipmap: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
@@ -127,14 +183,6 @@ Rectangle {
|
||||
text: "0"
|
||||
}
|
||||
|
||||
MoneroComponents.StandardDropdown {
|
||||
id: deviceNameDropdown
|
||||
dataModel: deviceNameModel
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 6
|
||||
z: 3
|
||||
}
|
||||
|
||||
CheckBox2 {
|
||||
id: showAdvancedCheckbox
|
||||
checked: false
|
||||
@@ -183,15 +231,8 @@ Rectangle {
|
||||
wizardController.walletOptionsDeviceName = wizardCreateDevice1.deviceName;
|
||||
if(lookahead.text)
|
||||
wizardController.walletOptionsSubaddressLookahead = lookahead.text;
|
||||
var _restoreHeight = 0;
|
||||
if(restoreHeight.text){
|
||||
// Parse date string or restore height as integer
|
||||
if(restoreHeight.text.indexOf('-') === 4 && restoreHeight.text.length === 10){
|
||||
_restoreHeight = Wizard.getApproximateBlockchainHeight(restoreHeight.text, Utils.netTypeToString());
|
||||
} else {
|
||||
_restoreHeight = parseInt(restoreHeight.text)
|
||||
}
|
||||
wizardController.walletOptionsRestoreHeight = _restoreHeight;
|
||||
wizardController.walletOptionsRestoreHeight = Utils.parseDateStringOrRestoreHeightAsInteger(restoreHeight.text);
|
||||
}
|
||||
|
||||
wizardController.walletCreatedFromDevice.connect(onCreateWalletFromDeviceCompleted);
|
||||
|
||||
@@ -71,7 +71,7 @@ Rectangle {
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
|
||||
Layout.topMargin: 10
|
||||
Layout.topMargin: -10
|
||||
Layout.fillWidth: true
|
||||
|
||||
MoneroComponents.LineEditMulti {
|
||||
|
||||
@@ -41,14 +41,7 @@ ColumnLayout {
|
||||
spacing: 10
|
||||
|
||||
function save(){
|
||||
persistentSettings.useRemoteNode = remoteNode.checked
|
||||
const index = remoteNodesModel.appendIfNotExists({
|
||||
address: remoteNodeEdit.getAddress(),
|
||||
username: "",
|
||||
password: "",
|
||||
trusted: false,
|
||||
});
|
||||
remoteNodesModel.applyRemoteNode(index);
|
||||
persistentSettings.useRemoteNode = remoteNode.checked;
|
||||
if (bootstrapNodeEdit.daemonAddrText == "auto") {
|
||||
persistentSettings.bootstrapNodeAddress = "auto";
|
||||
} else {
|
||||
@@ -82,11 +75,20 @@ ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
readOnly: true
|
||||
labelText: qsTr("Blockchain location (optional)") + translationManager.emptyString
|
||||
labelText: {
|
||||
const label = qsTr("Blockchain location (optional)");
|
||||
if (persistentSettings.blockchainDataDir) {
|
||||
const style = "<style type='text/css'>a {cursor:pointer;text-decoration: none; color: #FF6C3C}</style>";
|
||||
return label + style + "<a href='#'> (%1)</a>".arg(qsTr("Reset")) + translationManager.emptyString;
|
||||
} else {
|
||||
return label + translationManager.emptyString;
|
||||
}
|
||||
}
|
||||
labelFontSize: 14
|
||||
placeholderText: qsTr("Default") + translationManager.emptyString
|
||||
placeholderFontSize: 15
|
||||
text: persistentSettings.blockchainDataDir
|
||||
onLabelLinkActivated: persistentSettings.blockchainDataDir = ""
|
||||
|
||||
MoneroComponents.InlineButton {
|
||||
small: true
|
||||
@@ -196,18 +198,9 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
visible: remoteNode.checked
|
||||
spacing: 0
|
||||
|
||||
Layout.topMargin: 8
|
||||
MoneroComponents.RemoteNodeList {
|
||||
Layout.fillWidth: true
|
||||
|
||||
MoneroComponents.RemoteNodeEdit {
|
||||
id: remoteNodeEdit
|
||||
Layout.fillWidth: true
|
||||
|
||||
initialAddress: remoteNodesModel.currentRemoteNode().address
|
||||
}
|
||||
Layout.topMargin: 8
|
||||
visible: remoteNode.checked
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user