Compare commits
210 Commits
nightly/20
...
beta/20231
| Author | SHA1 | Date | |
|---|---|---|---|
| 6360e52eb5 | |||
| d38858c1f3 | |||
| 088c367485 | |||
| fc7109950b | |||
| 5776ab7c7d | |||
| d4d34ad4fc | |||
| 86d55fa985 | |||
| 303acbda64 | |||
| a433974340 | |||
| 7a759dab7a | |||
| d2e87150b4 | |||
| ec60458dbe | |||
| 8a9aea2f28 | |||
| ae86464658 | |||
| 5f0163df05 | |||
| 493addcbd8 | |||
| f144b27db8 | |||
| 861c42e3d5 | |||
| 873c4c72b9 | |||
| 3e012c32d5 | |||
| 6bff3c54f1 | |||
| e55eaa5d8e | |||
| 1a17735d55 | |||
| 4e5f153230 | |||
| 15351a5aae | |||
| e89aa95673 | |||
| 3609dae584 | |||
| 8b21b0fda9 | |||
| 811a93cc27 | |||
| baeb90bced | |||
| 439fea530d | |||
| 55415d6062 | |||
| 9d3b5cd0c5 | |||
| 4e549d123e | |||
| 77193b26d9 | |||
| afb514ee02 | |||
| f1ccd5d05d | |||
| 6a0963d37b | |||
| 6fc30b51d6 | |||
| 2719f303d9 | |||
| 100756b02d | |||
| b963a0bdf2 | |||
| d765fc9297 | |||
| f8f1301fa0 | |||
| b9d24298f7 | |||
| 6b9ce14ca9 | |||
| f88b8584af | |||
| ad35d108f2 | |||
| 63c3d0bf2e | |||
| 6f8f96edfd | |||
| 1bd7d75d29 | |||
| ad29993e17 | |||
| 70ce0c091e | |||
| ea5b2d6589 | |||
| eaababc817 | |||
| aa96b723bc | |||
| 1616261bef | |||
| 926ab72334 | |||
| a6d16ba1f8 | |||
| b0c205159e | |||
| 0c440660c4 | |||
| c8cc61520d | |||
| ab25276e27 | |||
| 7b41c6faff | |||
| 7a84518f2c | |||
| 1a12cb3b8c | |||
| 75a154f4fe | |||
| b95abbc891 | |||
| bc51b74692 | |||
| 899ff6120c | |||
| b77012baae | |||
| bc34abc8f4 | |||
| 69b59ad2dd | |||
| 1f2401bc7e | |||
| 06b0f1d39c | |||
| d5b36e7a6d | |||
| 4e2ae6cde0 | |||
| 0895a9f183 | |||
| e8075a412e | |||
| 4d55a1430d | |||
| 8de099e38d | |||
| 306c428019 | |||
| c0a5ced044 | |||
| 9f570a3cee | |||
| 2371f0c09f | |||
| f605cfce81 | |||
| 2aa3212b8f | |||
| 031d4348bc | |||
| e7436dbc05 | |||
| b291728472 | |||
| 5820052a53 | |||
| 65cc7a36ed | |||
| 46e2354274 | |||
| 1bbd8e31af | |||
| 0bd24bf8c5 | |||
| a028696e57 | |||
| c8b371e77a | |||
| b26259dac8 | |||
| 423290a09a | |||
| 3195fa9b22 | |||
| 4619f04f7b | |||
| ae2380c71b | |||
| 2bdf8e088c | |||
| 9947021394 | |||
| 80fe376e3c | |||
| d1eb1f5885 | |||
| b1ca6cf861 | |||
| 8c728374a7 | |||
| 3a693536e4 | |||
| ffcd3e59a4 | |||
| 77935de893 | |||
| 386ef224d1 | |||
| d62c2ff98e | |||
| 3b00b42213 | |||
| 21f3479a96 | |||
| 8307089900 | |||
| 2916b4c523 | |||
| 5530649f07 | |||
| 7581f9397a | |||
| 7f2c98a594 | |||
| 6341f32618 | |||
| a652a3d20f | |||
| 46da989a59 | |||
| 1a463ec662 | |||
| aee632c967 | |||
| e3a73ac932 | |||
| 416417d15a | |||
| 36a36dadcf | |||
| 38735b052a | |||
| 5b984396cf | |||
| 22cd3d4d4e | |||
| 53811f93b2 | |||
| 5e874f4f4b | |||
| a5bf258476 | |||
| 3b85425aa3 | |||
| e8e9fd30c9 | |||
| e914f795bc | |||
| 007b0c1132 | |||
| 11f67c73c8 | |||
| 01cbcbbb2c | |||
| 76fcd5f910 | |||
| 38a3da38c5 | |||
| f0b78036e3 | |||
| 2f7acbd31b | |||
| 8c1b214619 | |||
| e3e4de0fe7 | |||
| 452d49a439 | |||
| f53c2be978 | |||
| 36e5bdb839 | |||
| b54cb31d75 | |||
| 5134160539 | |||
| a9ad7d0bde | |||
| 6a1a9b60aa | |||
| 61126cfa64 | |||
| ec0feef74d | |||
| eff76eddc7 | |||
| 83039abc1b | |||
| bbdd68fb1d | |||
| afc0423bf6 | |||
| 0b18f3d145 | |||
| 593ecc9910 | |||
| 8fd7c70d1f | |||
| e71c1d1729 | |||
| 207872244b | |||
| 03b3530d3d | |||
| a7bd860e2b | |||
| df9c4b0653 | |||
| d2eed3af64 | |||
| f0eb826b64 | |||
| 2ed89fec3c | |||
| 281516823e | |||
| a2d110740d | |||
| ad14302ac5 | |||
| f903c635a7 | |||
| 5582d39a3f | |||
| 4f1e04a9b9 | |||
| 7514d75242 | |||
| fe2f3258b2 | |||
| c8ec980a3b | |||
| cb0e45c3fa | |||
| 532bf6c4ad | |||
| d7200cc8a3 | |||
| 3383f43688 | |||
| 26212b21b2 | |||
| 136f365fe2 | |||
| 2145ee6229 | |||
| 0f66152d72 | |||
| 24a0a384ff | |||
| 97297eacf7 | |||
| 5a70c7e7e8 | |||
| 7931d66b81 | |||
| 9fd48580bb | |||
| 1789402949 | |||
| 2546b69343 | |||
| fb420b2ff7 | |||
| 8a7547aaba | |||
| 9fe34c5282 | |||
| b948646cbd | |||
| 21c4afa564 | |||
| 41b9e541bb | |||
| e867b578bf | |||
| 944a20b2f3 | |||
| 7f4e3c4739 | |||
| 2ef5dcae71 | |||
| ad4d7aecc3 | |||
| 388ad92d96 | |||
| c37ec740e2 | |||
| cb31ea3575 | |||
| a27c344cb7 | |||
| a65c4f28e1 |
@ -3,6 +3,5 @@ host = https://www.transifex.com
|
||||
|
||||
[o:savoirfairelinux:p:jami:r:jami_client_qt]
|
||||
file_filter = translations/jami_client_qt_<lang>.ts
|
||||
source_file = translations/jami_client_qt.ts
|
||||
source_lang = en
|
||||
source_file = translations/jami_client_qt_en.ts
|
||||
type = TS
|
||||
|
||||
@ -74,16 +74,19 @@ set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests)
|
||||
# Here we let find_package(<PackageName>...) try to find Qt 6,
|
||||
# If it is found, find_package will succeed, and the CMake variable
|
||||
# QT_VERSION_MAJOR will be defined 6.
|
||||
set(QT6_MINVER_MINOR 4)
|
||||
if(QT6_VER AND QT6_PATH)
|
||||
find_package(QT NAMES Qt6 REQUIRED
|
||||
PATHS ${QT6_PATH} NO_DEFAULT_PATH)
|
||||
else()
|
||||
message(STATUS "Looking for Qt 6" ${CMAKE_PREFIX_PATH})
|
||||
find_package(QT NAMES Qt6 REQUIRED)
|
||||
endif()
|
||||
if (${QT_VERSION_MAJOR} STRLESS 6)
|
||||
if (${QT_VERSION_MINOR} STRLESS 4)
|
||||
message(FATAL_ERROR "Qt 6.4 or higher is required.")
|
||||
endif()
|
||||
if (${QT_VERSION_MINOR} GREATER_EQUAL ${QT6_MINVER_MINOR})
|
||||
# Qt version is 6.4 or higher
|
||||
message(STATUS "Found a suitable Qt version ${QT_VERSION}")
|
||||
else()
|
||||
message(FATAL_ERROR "Qt 6.4 or higher is required. Found ${QT_VERSION}")
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
@ -206,6 +209,7 @@ set(COMMON_SOURCES
|
||||
${APP_SRC_DIR}/pluginadapter.cpp
|
||||
${APP_SRC_DIR}/deviceitemlistmodel.cpp
|
||||
${APP_SRC_DIR}/pluginlistmodel.cpp
|
||||
${APP_SRC_DIR}/pluginstorelistmodel.cpp
|
||||
${APP_SRC_DIR}/pluginhandlerlistmodel.cpp
|
||||
${APP_SRC_DIR}/preferenceitemlistmodel.cpp
|
||||
${APP_SRC_DIR}/mediacodeclistmodel.cpp
|
||||
@ -238,13 +242,17 @@ set(COMMON_SOURCES
|
||||
${APP_SRC_DIR}/positioning.cpp
|
||||
${APP_SRC_DIR}/currentcall.cpp
|
||||
${APP_SRC_DIR}/messageparser.cpp
|
||||
${APP_SRC_DIR}/previewengine.cpp)
|
||||
${APP_SRC_DIR}/previewengine.cpp
|
||||
${APP_SRC_DIR}/imagedownloader.cpp
|
||||
${APP_SRC_DIR}/pluginversionmanager.cpp
|
||||
${APP_SRC_DIR}/connectioninfolistmodel.cpp
|
||||
${APP_SRC_DIR}/pluginversionmanager.cpp)
|
||||
|
||||
set(COMMON_HEADERS
|
||||
${APP_SRC_DIR}/avatarimageprovider.h
|
||||
${APP_SRC_DIR}/networkmanager.h
|
||||
${APP_SRC_DIR}/smartlistmodel.h
|
||||
${APP_SRC_DIR}/updatemanager.h
|
||||
${APP_SRC_DIR}/appversionmanager.h
|
||||
${APP_SRC_DIR}/utils.h
|
||||
${APP_SRC_DIR}/bannedlistmodel.h
|
||||
${APP_SRC_DIR}/version.h
|
||||
@ -266,6 +274,7 @@ set(COMMON_HEADERS
|
||||
${APP_SRC_DIR}/pluginadapter.h
|
||||
${APP_SRC_DIR}/deviceitemlistmodel.h
|
||||
${APP_SRC_DIR}/pluginlistmodel.h
|
||||
${APP_SRC_DIR}/pluginstorelistmodel.h
|
||||
${APP_SRC_DIR}/pluginhandlerlistmodel.h
|
||||
${APP_SRC_DIR}/preferenceitemlistmodel.h
|
||||
${APP_SRC_DIR}/mediacodeclistmodel.h
|
||||
@ -301,7 +310,11 @@ set(COMMON_HEADERS
|
||||
${APP_SRC_DIR}/positioning.h
|
||||
${APP_SRC_DIR}/currentcall.h
|
||||
${APP_SRC_DIR}/messageparser.h
|
||||
${APP_SRC_DIR}/htmlparser.h)
|
||||
${APP_SRC_DIR}/htmlparser.h
|
||||
${APP_SRC_DIR}/imagedownloader.h
|
||||
${APP_SRC_DIR}/pluginversionmanager.h
|
||||
${APP_SRC_DIR}/connectioninfolistmodel.h
|
||||
${APP_SRC_DIR}/pttlistener.h)
|
||||
|
||||
# For libavutil/avframe.
|
||||
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
|
||||
@ -333,7 +346,7 @@ if(MSVC)
|
||||
|
||||
list(APPEND COMMON_SOURCES
|
||||
${APP_SRC_DIR}/connectivitymonitor.cpp
|
||||
${APP_SRC_DIR}/updatemanager.cpp)
|
||||
${APP_SRC_DIR}/appversionmanager.cpp)
|
||||
# preprocessor defines
|
||||
add_definitions(-DUNICODE -DQT_NO_DEBUG -DNDEBUG)
|
||||
|
||||
@ -385,7 +398,7 @@ elseif (NOT APPLE)
|
||||
${APP_SRC_DIR}/xrectsel.c
|
||||
${APP_SRC_DIR}/connectivitymonitor.cpp
|
||||
${APP_SRC_DIR}/dbuserrorhandler.cpp
|
||||
${APP_SRC_DIR}/updatemanager.cpp)
|
||||
${APP_SRC_DIR}/appversionmanager.cpp)
|
||||
list(APPEND COMMON_HEADERS
|
||||
${APP_SRC_DIR}/xrectsel.h
|
||||
${APP_SRC_DIR}/dbuserrorhandler.h)
|
||||
@ -437,7 +450,7 @@ elseif (NOT APPLE)
|
||||
find_library(X11 X11)
|
||||
else() # APPLE
|
||||
list(APPEND COMMON_SOURCES
|
||||
${APP_SRC_DIR}/os/macos/updatemanager.mm
|
||||
${APP_SRC_DIR}/os/macos/appversionmanager.mm
|
||||
${APP_SRC_DIR}/os/macos/connectivitymonitor.mm
|
||||
${APP_SRC_DIR}/os/macos/macutils.mm)
|
||||
list(APPEND COMMON_HEADERS
|
||||
@ -483,6 +496,29 @@ else()
|
||||
OPTIONAL_COMPONENTS LinguistTools)
|
||||
endif()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
if (DEFINED ENV{XDG_SESSION_TYPE})
|
||||
if ($ENV{XDG_SESSION_TYPE} STREQUAL "x11")
|
||||
set(PTT_PLATFORM "x11")
|
||||
list(APPEND COMMON_HEADER ${APP_SRC_DIR}/platform/X11/xcbkeyboard.H)
|
||||
# TODO: add Wayland support
|
||||
endif ()
|
||||
endif ()
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
set(PTT_PLATFORM "windows")
|
||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
set(PTT_PLATFORM "macos")
|
||||
endif ()
|
||||
|
||||
if (NOT ${PTT_PLATFORM} STREQUAL "")
|
||||
message(STATUS "Platform: ${PTT_PLATFORM}")
|
||||
add_definitions(-DHAVE_GLOBAL_PTT)
|
||||
list(APPEND COMMON_SOURCES ${APP_SRC_DIR}/platform/${PTT_PLATFORM}/pttlistener.cpp)
|
||||
else ()
|
||||
message(WARNING "Global push-to-talk not supported.")
|
||||
list(APPEND COMMON_SOURCES ${APP_SRC_DIR}/platform/local/pttlistener.cpp)
|
||||
endif ()
|
||||
|
||||
# common includes
|
||||
include_directories(
|
||||
${PROJECT_SOURCE_DIR}
|
||||
@ -583,7 +619,6 @@ elseif (NOT APPLE)
|
||||
${GLIB_LIBRARIES}
|
||||
${GIO_LIBRARIES})
|
||||
|
||||
# Installation rules
|
||||
install(
|
||||
TARGETS ${PROJECT_NAME}
|
||||
RUNTIME DESTINATION bin)
|
||||
@ -714,7 +749,7 @@ else()
|
||||
list(APPEND CLIENT_LIBS
|
||||
"-framework AVFoundation"
|
||||
"-framework CoreAudio -framework CoreMedia -framework CoreVideo"
|
||||
"-framework VideoToolbox -framework AudioUnit"
|
||||
"-framework VideoToolbox -framework AudioUnit -framework Carbon"
|
||||
"-framework Security"
|
||||
compression
|
||||
resolv
|
||||
@ -753,6 +788,7 @@ else()
|
||||
MACOSX_BUNDLE_COPYRIGHT "${PROJ_COPYRIGHT}")
|
||||
if(APPSTORE)
|
||||
message(STATUS "app store version")
|
||||
add_definitions(-DAPPSTORE)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/appstore/Jami.entitlements")
|
||||
else()
|
||||
|
||||
43
INSTALL.md
@ -11,32 +11,38 @@ Because the client-qt is multi-platforms and supporting macOS, we need a recent
|
||||
This version is generally not packaged on a lot of platforms, and to control available plugins and such, we have our own Qt packaged (available on https://jami.net on the distributions we support).
|
||||
So, you will need to get Qt 6.4 first. For this, there is 3 methods:
|
||||
|
||||
### Qt from https://jami.net (recommended)
|
||||
### Qt from our repo (recommended)
|
||||
|
||||
If your distribution is supported, we provide a Qt package (libqt-jami) on our repo.
|
||||
The files will be installed in `/usr/lib/libqt-jami`.
|
||||
|
||||
#### Install libqt-jami, Debian based
|
||||
|
||||
```
|
||||
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
|
||||
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
|
||||
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
|
||||
sudo apt-get update && sudo apt-get install libqt-jami
|
||||
```
|
||||
|
||||
#### Install libqt-jami, Ubuntu based
|
||||
|
||||
```
|
||||
To install libqt-jami on Ubuntu, execute these commands replacing `ubuntu_<VERSION>` by your distribution version. For example "ubuntu_22.04"
|
||||
|
||||
```bash
|
||||
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
|
||||
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
|
||||
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/ubuntu_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
|
||||
sudo apt-get update && sudo apt-get install libqt-jami
|
||||
```
|
||||
|
||||
#### Install libqt-jami, Debian based
|
||||
|
||||
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_11"
|
||||
|
||||
```bash
|
||||
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
|
||||
curl -s https://dl.jami.net/public-key.gpg | sudo tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
|
||||
sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/nightly/debian_<VERSION>/ jami main' > /etc/apt/sources.list.d/jami.list"
|
||||
sudo apt-get update && sudo apt-get install jami
|
||||
```
|
||||
|
||||
#### Install jami-libqt, Fedora based
|
||||
|
||||
```
|
||||
To install libqt-jami on Fedora, execute these commands replacing `fedora_<VERSION>` by your distribution version. For example "fedora_38"
|
||||
|
||||
```bash
|
||||
sudo dnf config-manager --add-repo https://dl.jami.net/nightly/fedora_<VERSION>/jami-nightly.repo
|
||||
sudo dnf update && sudo dnf install jami-libqt
|
||||
```
|
||||
@ -49,7 +55,7 @@ It should be (For now qt5 only is packaged by distributions, so names can change
|
||||
|
||||
#### Dependencies, Debian based
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo apt-get install cmake make doxygen g++ gettext libnotify-dev pandoc nasm libqrencode-dev \
|
||||
libnotify-dev libnm-dev \
|
||||
qt6-base-dev \
|
||||
@ -66,7 +72,7 @@ sudo apt-get install cmake make doxygen g++ gettext libnotify-dev pandoc nasm li
|
||||
|
||||
#### Dependencies, Fedora based
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo dnf install qt6-qtsvg-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel qt6-qtdeclarative-devel qt6-qtquickcontrols2-devel qt6-qtquickcontrols qrencode-devel NetworkManager-libnm-devel
|
||||
```
|
||||
|
||||
@ -87,8 +93,13 @@ for getting the latest development versions; otherwise, you can use
|
||||
`git submodule update --init` then checkout specific commits for each
|
||||
submodule).
|
||||
|
||||
If you're a developer you need to install clang-format separately before initializing with the command
|
||||
```bash
|
||||
./build.py --init --qt=<path/to/qt> # qt path is required for qmlformatting to work
|
||||
sudo apt install clang-format
|
||||
```
|
||||
|
||||
```bash
|
||||
./build.py --init [--qt=<path/to/qt> (this is required for qmlformatting to work)]
|
||||
```
|
||||
|
||||
Then you will need to install dependencies:
|
||||
@ -96,7 +107,7 @@ Then you will need to install dependencies:
|
||||
- For GNU/Linux
|
||||
|
||||
```bash
|
||||
./build.py --dependencies # needs sudo
|
||||
sudo ./build.py --dependencies
|
||||
```
|
||||
|
||||
Then, you can build daemon and the client using:
|
||||
|
||||
105
build.py
@ -329,7 +329,7 @@ def run_init(args):
|
||||
# The client submodule has QML files, so we need to run qmlformat on it,
|
||||
# and thus need to supply the Qt path.
|
||||
execute_script([f'{format_script} --install {client_hooks_dir}'
|
||||
f' --qt {args.qt}' if args.qt else ''],
|
||||
f' --qt {args.qt}'],
|
||||
{"path": client_hooks_dir})
|
||||
|
||||
# The daemon submodule has no QML files, so we don't need to run
|
||||
@ -416,6 +416,11 @@ def run_install(args):
|
||||
|
||||
command = ['extras/scripts/install.sh'] + install_args
|
||||
|
||||
if 'TARBALLS' not in os.environ:
|
||||
print('info: consider setting the TARBALLS environment variable '
|
||||
'to a stable writable location to avoid loosing '
|
||||
'cached tarballs')
|
||||
|
||||
if args.distribution == 'guix':
|
||||
if args.global_install:
|
||||
print('error: global install is not supported when using Guix.')
|
||||
@ -425,10 +430,6 @@ def run_install(args):
|
||||
if 'TARBALLS' in os.environ:
|
||||
share_tarballs_args = ['--preserve=TARBALLS',
|
||||
f'--share={os.environ["TARBALLS"]}']
|
||||
else:
|
||||
print('info: consider setting the TARBALLS environment variable '
|
||||
'to a stable writable location to avoid loosing '
|
||||
'cached tarballs')
|
||||
command = ['guix', 'shell', f'--manifest={GUIX_MANIFEST}',
|
||||
'--symlink=/usr/bin/env=bin/env',
|
||||
'--symlink=/etc/ssl/certs=etc/ssl/certs',
|
||||
@ -457,6 +458,93 @@ def run_clean():
|
||||
'git submodule foreach git clean -xfd'])
|
||||
|
||||
|
||||
def clean_contribs(contribs):
|
||||
"""
|
||||
Helper to clean one or more of the libjami contribs.
|
||||
|
||||
Takes a list of contrib names(space separated) to clean, or 'all' to clean all contribs.
|
||||
|
||||
Contribs are assumed to be in the contrib_dir: daemon/contrib
|
||||
Artifacts to remove include:
|
||||
- build directory: <contrib_dir>/<native_dir>/<contrib_name>
|
||||
- build stamp: <contrib_dir>/<native_dir>/.<contrib_name>
|
||||
- tarball: <contrib_dir>/tarballs/<contrib_name>*.tar.*
|
||||
- build artifacts (we don't care about the contents of share):
|
||||
- <contrib_dir>/<abi_triplet>/bin/<contrib_name>
|
||||
- <contrib_dir>/<abi_triplet>/lib/<contrib_name>*
|
||||
- <contrib_dir>/<abi_triplet>/include/<contrib_name>*
|
||||
"""
|
||||
|
||||
# Not supported on Windows
|
||||
if platform.system() == 'Windows':
|
||||
print('Cleaning contribs is not supported on Windows. Exiting.')
|
||||
sys.exit(1)
|
||||
|
||||
# Assume we are using the submodule here.
|
||||
contrib_dir = 'daemon/contrib'
|
||||
sub_dirs = os.listdir(contrib_dir)
|
||||
|
||||
# Let's find the abi triplet:
|
||||
# The abi_triplet is 3 parts: <arch>-<vendor>-<sys> and should be the only directory
|
||||
# named like that in the contrib directory. We can use a regex to find it.
|
||||
triplet_pattern = re.compile(r'^[a-zA-Z0-9_]+-[a-zA-Z0-9_]+-[a-zA-Z0-9_]+$')
|
||||
def is_triplet(s):
|
||||
return bool(triplet_pattern.match(s))
|
||||
abi_triplet = ''
|
||||
for sub_dir in sub_dirs:
|
||||
if is_triplet(sub_dir):
|
||||
abi_triplet = sub_dir
|
||||
break
|
||||
|
||||
# If we didn't find the abi triplet, we need to stop.
|
||||
if abi_triplet == '':
|
||||
print('Could not find the abi triplet for the contribs. Exiting.')
|
||||
sys.exit(1)
|
||||
|
||||
# Let's find the native build source directory (native-*)
|
||||
native_dir = ''
|
||||
for sub_dir in sub_dirs:
|
||||
if sub_dir.startswith('native'):
|
||||
native_dir = os.path.join(contrib_dir, sub_dir)
|
||||
break
|
||||
|
||||
# If we didn't find the native build source directory, we need to stop.
|
||||
if native_dir == '':
|
||||
print('Could not find the native build source directory. Exiting.')
|
||||
sys.exit(1)
|
||||
|
||||
# If contribs is 'all', construct the list of all contribs from the contrib native directory
|
||||
# list of directories only
|
||||
if contribs == ['all']:
|
||||
contribs = [d for d in os.listdir(native_dir) if os.path.isdir(os.path.join(native_dir, d))]
|
||||
|
||||
# Clean each contrib
|
||||
for contrib in contribs:
|
||||
print(f'Cleaning contrib: {contrib} for {abi_triplet} in {native_dir}')
|
||||
build_dir = os.path.join(native_dir, contrib, '*')
|
||||
build_stamp = os.path.join(native_dir, f'.{contrib}*')
|
||||
tarball = os.path.join(contrib_dir, 'tarballs', f'{contrib}*.tar.*')
|
||||
bins = os.path.join(contrib_dir, abi_triplet, 'bin', contrib)
|
||||
libs = os.path.join(contrib_dir, abi_triplet, 'lib', f'lib{contrib}*')
|
||||
includes = os.path.join(contrib_dir, abi_triplet, 'include', f'{contrib}*')
|
||||
|
||||
# EXCEPTIONS: pjproject and ffmpeg
|
||||
if contrib == 'pjproject':
|
||||
libs = f' {os.path.join(contrib_dir, abi_triplet, "lib", "libpj*")}' \
|
||||
f' {os.path.join(contrib_dir, abi_triplet, "lib", "libsrtp*")}'
|
||||
includes = os.path.join(contrib_dir, abi_triplet, 'include', 'pj*')
|
||||
elif contrib == 'ffmpeg':
|
||||
libs = f' {os.path.join(contrib_dir, abi_triplet, "lib", "libav*")}' \
|
||||
f' {os.path.join(contrib_dir, abi_triplet, "lib", "libsw*")}'
|
||||
includes = f' {os.path.join(contrib_dir, abi_triplet, "include", "libav*")}' \
|
||||
f' {os.path.join(contrib_dir, abi_triplet, "include", "libsw*")}'
|
||||
|
||||
# For a dry run:
|
||||
# execute_script([f'find {build_dir} {build_stamp} {tarball} {bins} {libs} {includes}'], fail=False)
|
||||
|
||||
execute_script([f'rm -rf {build_dir} {build_stamp} {tarball} {bins} {libs} {includes}'], fail=False)
|
||||
|
||||
|
||||
def run_run(args):
|
||||
run_env = os.environ
|
||||
|
||||
@ -639,6 +727,9 @@ def parse_args():
|
||||
default=False, action='store_true',
|
||||
help='Do not use Qt WebEngine.')
|
||||
ap.add_argument('--arch')
|
||||
ap.add_argument('--clean-contribs', nargs='+',
|
||||
help='Clean the specified contribs (space separated) or \
|
||||
"all" to clean all contribs before building.')
|
||||
|
||||
dist = choose_distribution()
|
||||
|
||||
@ -685,6 +776,10 @@ def choose_distribution():
|
||||
def main():
|
||||
parsed_args = parse_args()
|
||||
|
||||
# Clean contribs if specified first.
|
||||
if parsed_args.clean_contribs:
|
||||
clean_contribs(parsed_args.clean_contribs)
|
||||
|
||||
if parsed_args.dependencies:
|
||||
run_dependencies(parsed_args)
|
||||
|
||||
|
||||
2
daemon
@ -49,7 +49,7 @@ QT_MAJOR := 6
|
||||
QT_MINOR := 4
|
||||
QT_PATCH := 3
|
||||
QT_TARBALL_CHECKSUM := 29a7eebdbba0ea57978dea6083709c93593a60f0f3133a3de08b9571ee8eaab4
|
||||
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-2
|
||||
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-3
|
||||
DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
|
||||
QT_JAMI_PREFIX := /usr/lib/libqt-jami
|
||||
|
||||
@ -161,15 +161,16 @@ endif
|
||||
#
|
||||
DISTRIBUTIONS := \
|
||||
debian_11 \
|
||||
debian_12 \
|
||||
debian_testing \
|
||||
debian_unstable \
|
||||
ubuntu_20.04 \
|
||||
ubuntu_22.04 \
|
||||
ubuntu_22.10 \
|
||||
ubuntu_23.04 \
|
||||
fedora_36 \
|
||||
ubuntu_23.10 \
|
||||
fedora_37 \
|
||||
fedora_38 \
|
||||
fedora_39 \
|
||||
opensuse-leap_15.4 \
|
||||
snap
|
||||
|
||||
|
||||
22
extras/packaging/gnu-linux/docker/Dockerfile_debian_12
Normal file
@ -0,0 +1,22 @@
|
||||
FROM debian:bookworm
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get clean
|
||||
RUN apt-get update && \
|
||||
apt-get install -y -o Acquire::Retries=10 \
|
||||
devscripts \
|
||||
equivs \
|
||||
python-is-python3 \
|
||||
wget
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
|
||||
|
||||
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
|
||||
RUN /opt/prebuild-package-debian.sh qt-deps
|
||||
|
||||
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
|
||||
RUN /opt/prebuild-package-debian.sh jami-deps
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
|
||||
CMD ["/opt/build-package-debian.sh"]
|
||||
@ -1,6 +1,7 @@
|
||||
FROM fedora:36
|
||||
FROM fedora:39
|
||||
|
||||
RUN dnf clean all
|
||||
RUN dnf update -y
|
||||
|
||||
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
|
||||
dnf install -y mock
|
||||
@ -29,8 +30,6 @@ RUN dnf install -y \
|
||||
libXext-devel \
|
||||
libXfixes-devel \
|
||||
yasm \
|
||||
python2.7 \
|
||||
python3-html5lib \
|
||||
speex-devel \
|
||||
gsm-devel \
|
||||
chrpath \
|
||||
@ -97,7 +96,8 @@ RUN dnf install -y \
|
||||
clang \
|
||||
cmake \
|
||||
fmt-devel \
|
||||
cups-devel #Chromium for Qt
|
||||
python3.10 \
|
||||
cups-devel
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
|
||||
|
||||
@ -70,6 +70,7 @@ RUN zypper --non-interactive install -y \
|
||||
nodejs12 \
|
||||
mozilla-nss-devel \
|
||||
python-xml \
|
||||
python-six \
|
||||
libxcb* \
|
||||
libxkb* \
|
||||
libX11-devel \
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
FROM ubuntu:22.10
|
||||
FROM ubuntu:23.10
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
From ecae5d93b0a89e2b8c16a2227b2d176f58579d04 Mon Sep 17 00:00:00 2001
|
||||
From: Rémi Denis-Courmont <remi@remlab.net>
|
||||
Date: Sun, 16 Jul 2023 18:18:02 +0300
|
||||
Subject: [PATCH] Fix ffmpeg assembly with newer binutil
|
||||
|
||||
avcodec/x86/mathops: clip constants used with shift instructions within inline assembly
|
||||
|
||||
Fixes assembling with binutil as >= 2.41
|
||||
|
||||
FFmpeg commit effadce6c756247ea8bae32dc13bb3e6f464f0eb.
|
||||
|
||||
Deals with: "Error: operand type mismatch for `shr'"
|
||||
|
||||
Fixes: QTBUG-116649
|
||||
Change-Id: I094e8c23fed4a61fba3f1e3a9c73c016d129d830
|
||||
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/495990
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
(cherry picked from commit 29354c7c7def7bdc66bcd25d401677fd9421f657)
|
||||
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/509219
|
||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||
---
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h b/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
index 6298f5e..ca7e2df 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
@@ -35,12 +35,20 @@
|
||||
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
|
||||
{
|
||||
int rt, dummy;
|
||||
+ if (__builtin_constant_p(shift))
|
||||
__asm__ (
|
||||
"imull %3 \n\t"
|
||||
"shrdl %4, %%edx, %%eax \n\t"
|
||||
:"=a"(rt), "=d"(dummy)
|
||||
- :"a"(a), "rm"(b), "ci"((uint8_t)shift)
|
||||
+ :"a"(a), "rm"(b), "i"(shift & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ (
|
||||
+ "imull %3 \n\t"
|
||||
+ "shrdl %4, %%edx, %%eax \n\t"
|
||||
+ :"=a"(rt), "=d"(dummy)
|
||||
+ :"a"(a), "rm"(b), "c"((uint8_t)shift)
|
||||
+ );
|
||||
return rt;
|
||||
}
|
||||
|
||||
@@ -113,19 +121,31 @@
|
||||
// avoid +32 for shift optimization (gcc should do that ...)
|
||||
#define NEG_SSR32 NEG_SSR32
|
||||
static inline int32_t NEG_SSR32( int32_t a, int8_t s){
|
||||
+ if (__builtin_constant_p(s))
|
||||
__asm__ ("sarl %1, %0\n\t"
|
||||
: "+r" (a)
|
||||
- : "ic" ((uint8_t)(-s))
|
||||
+ : "i" (-s & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ ("sarl %1, %0\n\t"
|
||||
+ : "+r" (a)
|
||||
+ : "c" ((uint8_t)(-s))
|
||||
+ );
|
||||
return a;
|
||||
}
|
||||
|
||||
#define NEG_USR32 NEG_USR32
|
||||
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
|
||||
+ if (__builtin_constant_p(s))
|
||||
__asm__ ("shrl %1, %0\n\t"
|
||||
: "+r" (a)
|
||||
- : "ic" ((uint8_t)(-s))
|
||||
+ : "i" (-s & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ ("shrl %1, %0\n\t"
|
||||
+ : "+r" (a)
|
||||
+ : "c" ((uint8_t)(-s))
|
||||
+ );
|
||||
return a;
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
index 3488120..120e47a 100644
|
||||
--- a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
+++ b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
@@ -472,7 +472,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length)
|
||||
}
|
||||
catch (const DeadlyImportError& e)
|
||||
{
|
||||
- if (!is64bits && (length > std::numeric_limits<std::uint32_t>::max())) {
|
||||
+ if (!is64bits && (length > std::numeric_limits<uint32_t>::max())) {
|
||||
throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (", ai_to_string(version), ") of the FBX format. (", e.what(), ")");
|
||||
}
|
||||
throw;
|
||||
@ -0,0 +1,433 @@
|
||||
qtbase/src/corelib/debug_script.py | 2 +-
|
||||
qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py | 2 +-
|
||||
qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py | 2 +-
|
||||
.../3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py | 2 +-
|
||||
31 files changed, 31 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/qtbase/src/corelib/debug_script.py b/qtbase/src/corelib/debug_script.py
|
||||
index f6207c6104..663c8e0ac1 100644
|
||||
--- a/qtbase/src/corelib/debug_script.py
|
||||
+++ b/qtbase/src/corelib/debug_script.py
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
diff --git a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
index 681039d34b..a1fe56fa05 100644
|
||||
--- a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
+++ b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
@@ -16,7 +16,7 @@ import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
# from TestCasePackagerConfig import *
|
||||
|
||||
diff --git a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
index 92d4e6139b..7a18e12ced 100644
|
||||
--- a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
+++ b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
@@ -7,7 +7,7 @@ import unittest
|
||||
|
||||
import os
|
||||
import yaml
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
# add parent dir to search path
|
||||
import sys
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py b/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
index c7412927c8..ad2caff318 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
-import imp
|
||||
+import importlib
|
||||
import tempfile
|
||||
import unittest
|
||||
import PRESUBMIT
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
index 5daee773ba..2d6b124162 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
@@ -9,7 +9,7 @@
|
||||
"""
|
||||
from __future__ import print_function
|
||||
import abc
|
||||
-import imp
|
||||
+import importlib
|
||||
import optparse
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
index bf626f5479..3fae129aaa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
@@ -3,7 +3,7 @@
|
||||
# found in the LICENSE file.
|
||||
|
||||
import errno
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
index ff5753a291..04fc34f742 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import shutil
|
||||
import sys
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
index 32c884a8c0..e761faa54c 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
index 95a916db08..4331e2fbfa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
index 62798631db..28e9dbf705 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
index cba249b0f3..5a4051827a 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
index 4a2fefc712..11a9879cb7 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
index cc17ae0253..bcc944f06b 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
index bd72830e54..f2fdc9ae28 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py b/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
index 1feb303a48..8428de61bb 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
@@ -6,7 +6,7 @@
|
||||
angle_presubmit_utils_unittest.py: Top-level unittest script for ANGLE presubmit checks.
|
||||
"""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os
|
||||
import unittest
|
||||
from angle_presubmit_utils import *
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py b/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
index ed4f38c67b..cac734cefa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
@@ -7,7 +7,7 @@ See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
|
||||
for more details about the presubmit API built into gcl.
|
||||
"""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py b/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
index 0244c9787e..f535afe99c 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
@@ -32,7 +32,7 @@ if PY3:
|
||||
memoryview_type = memoryview
|
||||
struct_bool_decl = "?"
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
string_types = (unicode,)
|
||||
if PY26 or PY27:
|
||||
binary_types = (str,bytearray)
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py b/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
index 8430390eea..29212205bc 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
@@ -732,7 +732,7 @@ class Environment(object):
|
||||
)
|
||||
py_compile = False
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
import marshal
|
||||
|
||||
py_header = imp.get_magic() + u"\xff\xff\xff\xff".encode("iso-8859-15")
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py b/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
index 06bb8d99f5..05089dc982 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
@@ -115,7 +115,7 @@ if py3k:
|
||||
return module
|
||||
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
|
||||
def load_module(module_id, path):
|
||||
fp = open(path, "rb")
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
index a7dc683365..68b6804c78 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for call_trees module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from tensorflow.python.autograph.converters import call_trees
|
||||
from tensorflow.python.autograph.converters import functions
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
index 81a7fde808..1370f900fd 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for converter module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from tensorflow.python.autograph.core import converter
|
||||
from tensorflow.python.autograph.core import converter_testing
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
index b93cbb627b..452ec71f5b 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
@@ -15,7 +15,7 @@
|
||||
"""Base class for tests in this module."""
|
||||
|
||||
import contextlib
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
index 9a62d7c0d2..7ec4fa6dca 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
@@ -19,7 +19,7 @@ import collections
|
||||
import contextlib
|
||||
import functools
|
||||
import gc
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
index 852af3efe7..6456c50446 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for conversion module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import sys
|
||||
import types
|
||||
import weakref
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
index a50a64534a..ba0f31afa2 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
@@ -17,7 +17,7 @@
|
||||
import abc
|
||||
import collections
|
||||
import functools
|
||||
-import imp
|
||||
+import importlib
|
||||
import textwrap
|
||||
|
||||
import six
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
index 29f38d853a..7ca88fa371 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for templates module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from absl.testing import parameterized
|
||||
import gast
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
index e46460574b..a40fea6568 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# =============================================================================
|
||||
"""Tests for create_python_api."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import sys
|
||||
|
||||
from tensorflow.python.platform import test
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
index 73d1742714..ea77dd7647 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
@@ -1,5 +1,5 @@
|
||||
import importlib
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from .browsers import product_list
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
index 6a744472b5..9175cb5d34 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
@@ -1,6 +1,6 @@
|
||||
import copy
|
||||
import functools
|
||||
-import imp
|
||||
+import importlib
|
||||
import io
|
||||
import os
|
||||
from collections import OrderedDict, defaultdict
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py b/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
index 6912b6f3c0..7d851f7f76 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import optparse
|
||||
import os
|
||||
import pipes
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py b/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
index 1c2aba80af..55260d697e 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
@@ -10,7 +10,7 @@ from __future__ import print_function
|
||||
|
||||
import os
|
||||
import re
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from _monkeyYaml import load as yamlLoad
|
||||
|
||||
@ -1,2 +1,5 @@
|
||||
0001-fix-gcc13.patch
|
||||
0002-OpenFile-portal-do-not-use-O_PATH-fds.patch
|
||||
0002-OpenFile-portal-do-not-use-O_PATH-fds.patch
|
||||
0003-fix-mathops.patch
|
||||
0004-fix-binary-tokenizer.patch
|
||||
0005-importlib.patch
|
||||
@ -93,14 +93,16 @@ if [ -f /etc/os-release ]; then
|
||||
# Set-up Jami repository end tag
|
||||
if [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
|
||||
ENDTAG="debian_11"
|
||||
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
|
||||
ENDTAG="debian_12"
|
||||
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
|
||||
ENDTAG="ubuntu_20.04"
|
||||
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
|
||||
ENDTAG="ubuntu_22.04"
|
||||
elif [ "${UBUNTU_CODENAME}" = "kinetic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.10" ]; then
|
||||
ENDTAG="ubuntu_22.10"
|
||||
elif [ "${UBUNTU_CODENAME}" = "lunar" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.04" ]; then
|
||||
ENDTAG="ubuntu_23.04"
|
||||
elif [ "${UBUNTU_CODENAME}" = "mantic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.10" ]; then
|
||||
ENDTAG="ubuntu_23.10"
|
||||
elif [ "${ID}" = "debian" ] && \
|
||||
[ "$(command -v lsb_release)" ] && \
|
||||
[ "$(lsb_release -rs)" = "testing" ]; then
|
||||
|
||||
@ -28,6 +28,9 @@ URL: https://jami.net/
|
||||
Source: jami-libqt-%{version}.tar.xz
|
||||
Patch0: 0001-fix-gcc13.patch
|
||||
Patch1: 0002-OpenFile-portal-do-not-use-O_PATH-fds.patch
|
||||
Patch2: 0003-fix-mathops.patch
|
||||
Patch3: 0004-fix-binary-tokenizer.patch
|
||||
Patch4: 0005-importlib.patch
|
||||
|
||||
%global gst 0.10
|
||||
%if 0%{?fedora} || 0%{?rhel} > 7
|
||||
@ -42,6 +45,7 @@ BuildRequires: bison
|
||||
BuildRequires: gperf
|
||||
BuildRequires: flex
|
||||
BuildRequires: vulkan-devel
|
||||
BuildRequires: python-six
|
||||
%if %{defined suse_version}
|
||||
BuildRequires: ffmpeg-devel
|
||||
BuildRequires: ffmpeg
|
||||
@ -64,6 +68,9 @@ This package contains Qt libraries for Jami.
|
||||
%setup -n qt-everywhere-src-%{version}
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
|
||||
%build
|
||||
echo "Building Qt using %{job_count} parallel jobs"
|
||||
@ -84,6 +91,15 @@ cat qtbase/src/corelib/global/qendian.h
|
||||
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
|
||||
sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
|
||||
cat qtwebengine/configure.cmake
|
||||
|
||||
#https://bugreports.qt.io/browse/QTBUG-117979
|
||||
if test -f "/usr/bin/python3.10"; then
|
||||
/usr/bin/python3.10 -m venv env
|
||||
source env/bin/activate
|
||||
python -m pip install html5lib
|
||||
python -m pip install six
|
||||
fi
|
||||
|
||||
# recent gcc version do not like lto from qt
|
||||
CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) ${LDFLAGS}" ./configure \
|
||||
-opensource \
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
From ecae5d93b0a89e2b8c16a2227b2d176f58579d04 Mon Sep 17 00:00:00 2001
|
||||
From: Rémi Denis-Courmont <remi@remlab.net>
|
||||
Date: Sun, 16 Jul 2023 18:18:02 +0300
|
||||
Subject: [PATCH] Fix ffmpeg assembly with newer binutil
|
||||
|
||||
avcodec/x86/mathops: clip constants used with shift instructions within inline assembly
|
||||
|
||||
Fixes assembling with binutil as >= 2.41
|
||||
|
||||
FFmpeg commit effadce6c756247ea8bae32dc13bb3e6f464f0eb.
|
||||
|
||||
Deals with: "Error: operand type mismatch for `shr'"
|
||||
|
||||
Fixes: QTBUG-116649
|
||||
Change-Id: I094e8c23fed4a61fba3f1e3a9c73c016d129d830
|
||||
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/495990
|
||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
||||
(cherry picked from commit 29354c7c7def7bdc66bcd25d401677fd9421f657)
|
||||
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/509219
|
||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||
---
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h b/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
index 6298f5e..ca7e2df 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h
|
||||
@@ -35,12 +35,20 @@
|
||||
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
|
||||
{
|
||||
int rt, dummy;
|
||||
+ if (__builtin_constant_p(shift))
|
||||
__asm__ (
|
||||
"imull %3 \n\t"
|
||||
"shrdl %4, %%edx, %%eax \n\t"
|
||||
:"=a"(rt), "=d"(dummy)
|
||||
- :"a"(a), "rm"(b), "ci"((uint8_t)shift)
|
||||
+ :"a"(a), "rm"(b), "i"(shift & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ (
|
||||
+ "imull %3 \n\t"
|
||||
+ "shrdl %4, %%edx, %%eax \n\t"
|
||||
+ :"=a"(rt), "=d"(dummy)
|
||||
+ :"a"(a), "rm"(b), "c"((uint8_t)shift)
|
||||
+ );
|
||||
return rt;
|
||||
}
|
||||
|
||||
@@ -113,19 +121,31 @@
|
||||
// avoid +32 for shift optimization (gcc should do that ...)
|
||||
#define NEG_SSR32 NEG_SSR32
|
||||
static inline int32_t NEG_SSR32( int32_t a, int8_t s){
|
||||
+ if (__builtin_constant_p(s))
|
||||
__asm__ ("sarl %1, %0\n\t"
|
||||
: "+r" (a)
|
||||
- : "ic" ((uint8_t)(-s))
|
||||
+ : "i" (-s & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ ("sarl %1, %0\n\t"
|
||||
+ : "+r" (a)
|
||||
+ : "c" ((uint8_t)(-s))
|
||||
+ );
|
||||
return a;
|
||||
}
|
||||
|
||||
#define NEG_USR32 NEG_USR32
|
||||
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
|
||||
+ if (__builtin_constant_p(s))
|
||||
__asm__ ("shrl %1, %0\n\t"
|
||||
: "+r" (a)
|
||||
- : "ic" ((uint8_t)(-s))
|
||||
+ : "i" (-s & 0x1F)
|
||||
);
|
||||
+ else
|
||||
+ __asm__ ("shrl %1, %0\n\t"
|
||||
+ : "+r" (a)
|
||||
+ : "c" ((uint8_t)(-s))
|
||||
+ );
|
||||
return a;
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
index 3488120..120e47a 100644
|
||||
--- a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
+++ b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
@@ -472,7 +472,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length)
|
||||
}
|
||||
catch (const DeadlyImportError& e)
|
||||
{
|
||||
- if (!is64bits && (length > std::numeric_limits<std::uint32_t>::max())) {
|
||||
+ if (!is64bits && (length > std::numeric_limits<uint32_t>::max())) {
|
||||
throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (", ai_to_string(version), ") of the FBX format. (", e.what(), ")");
|
||||
}
|
||||
throw;
|
||||
@ -0,0 +1,433 @@
|
||||
qtbase/src/corelib/debug_script.py | 2 +-
|
||||
qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py | 2 +-
|
||||
qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py | 2 +-
|
||||
.../src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py | 2 +-
|
||||
.../3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py | 2 +-
|
||||
qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py | 2 +-
|
||||
31 files changed, 31 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/qtbase/src/corelib/debug_script.py b/qtbase/src/corelib/debug_script.py
|
||||
index f6207c6104..663c8e0ac1 100644
|
||||
--- a/qtbase/src/corelib/debug_script.py
|
||||
+++ b/qtbase/src/corelib/debug_script.py
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
diff --git a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
index 681039d34b..a1fe56fa05 100644
|
||||
--- a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
+++ b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/parseTestRecord.py
|
||||
@@ -16,7 +16,7 @@ import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
# from TestCasePackagerConfig import *
|
||||
|
||||
diff --git a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
index 92d4e6139b..7a18e12ced 100644
|
||||
--- a/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
+++ b/qtdeclarative/tests/auto/qml/ecmascripttests/test262/tools/packaging/test/test_monkeyYaml.py
|
||||
@@ -7,7 +7,7 @@ import unittest
|
||||
|
||||
import os
|
||||
import yaml
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
# add parent dir to search path
|
||||
import sys
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py b/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
index c7412927c8..ad2caff318 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/chrome/browser/resources/PRESUBMIT_test.py
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import os
|
||||
import sys
|
||||
-import imp
|
||||
+import importlib
|
||||
import tempfile
|
||||
import unittest
|
||||
import PRESUBMIT
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
index 5daee773ba..2d6b124162 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
|
||||
@@ -9,7 +9,7 @@
|
||||
"""
|
||||
from __future__ import print_function
|
||||
import abc
|
||||
-import imp
|
||||
+import importlib
|
||||
import optparse
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
index bf626f5479..3fae129aaa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
|
||||
@@ -3,7 +3,7 @@
|
||||
# found in the LICENSE file.
|
||||
|
||||
import errno
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
index ff5753a291..04fc34f742 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import shutil
|
||||
import sys
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
index 32c884a8c0..e761faa54c 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
index 95a916db08..4331e2fbfa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
index 62798631db..28e9dbf705 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
index cba249b0f3..5a4051827a 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
index 4a2fefc712..11a9879cb7 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
index cc17ae0253..bcc944f06b 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
index bd72830e54..f2fdc9ae28 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
|
||||
@@ -2,7 +2,7 @@
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os.path
|
||||
import sys
|
||||
import unittest
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py b/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
index 1feb303a48..8428de61bb 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/angle/scripts/angle_presubmit_utils_unittest.py
|
||||
@@ -6,7 +6,7 @@
|
||||
angle_presubmit_utils_unittest.py: Top-level unittest script for ANGLE presubmit checks.
|
||||
"""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import os
|
||||
import unittest
|
||||
from angle_presubmit_utils import *
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py b/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
index ed4f38c67b..cac734cefa 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/blink/PRESUBMIT.py
|
||||
@@ -7,7 +7,7 @@ See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
|
||||
for more details about the presubmit API built into gcl.
|
||||
"""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py b/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
index 0244c9787e..f535afe99c 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/flatbuffers/src/python/flatbuffers/compat.py
|
||||
@@ -32,7 +32,7 @@ if PY3:
|
||||
memoryview_type = memoryview
|
||||
struct_bool_decl = "?"
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
string_types = (unicode,)
|
||||
if PY26 or PY27:
|
||||
binary_types = (str,bytearray)
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py b/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
index 8430390eea..29212205bc 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/jinja2/environment.py
|
||||
@@ -732,7 +732,7 @@ class Environment(object):
|
||||
)
|
||||
py_compile = False
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
import marshal
|
||||
|
||||
py_header = imp.get_magic() + u"\xff\xff\xff\xff".encode("iso-8859-15")
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py b/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
index 06bb8d99f5..05089dc982 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/mako/mako/compat.py
|
||||
@@ -115,7 +115,7 @@ if py3k:
|
||||
return module
|
||||
|
||||
else:
|
||||
- import imp
|
||||
+ import importlib
|
||||
|
||||
def load_module(module_id, path):
|
||||
fp = open(path, "rb")
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
index a7dc683365..68b6804c78 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/converters/call_trees_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for call_trees module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from tensorflow.python.autograph.converters import call_trees
|
||||
from tensorflow.python.autograph.converters import functions
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
index 81a7fde808..1370f900fd 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for converter module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from tensorflow.python.autograph.core import converter
|
||||
from tensorflow.python.autograph.core import converter_testing
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
index b93cbb627b..452ec71f5b 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/core/converter_testing.py
|
||||
@@ -15,7 +15,7 @@
|
||||
"""Base class for tests in this module."""
|
||||
|
||||
import contextlib
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import sys
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
index 9a62d7c0d2..7ec4fa6dca 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/api_test.py
|
||||
@@ -19,7 +19,7 @@ import collections
|
||||
import contextlib
|
||||
import functools
|
||||
import gc
|
||||
-import imp
|
||||
+import importlib
|
||||
import inspect
|
||||
import os
|
||||
import re
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
index 852af3efe7..6456c50446 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/impl/conversion_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for conversion module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import sys
|
||||
import types
|
||||
import weakref
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
index a50a64534a..ba0f31afa2 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/inspect_utils_test.py
|
||||
@@ -17,7 +17,7 @@
|
||||
import abc
|
||||
import collections
|
||||
import functools
|
||||
-import imp
|
||||
+import importlib
|
||||
import textwrap
|
||||
|
||||
import six
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
index 29f38d853a..7ca88fa371 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/autograph/pyct/templates_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# ==============================================================================
|
||||
"""Tests for templates module."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from absl.testing import parameterized
|
||||
import gast
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
index e46460574b..a40fea6568 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/tflite/src/tensorflow/python/tools/api/generator/create_python_api_test.py
|
||||
@@ -14,7 +14,7 @@
|
||||
# =============================================================================
|
||||
"""Tests for create_python_api."""
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import sys
|
||||
|
||||
from tensorflow.python.platform import test
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
index 73d1742714..ea77dd7647 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
|
||||
@@ -1,5 +1,5 @@
|
||||
import importlib
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from .browsers import product_list
|
||||
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
index 6a744472b5..9175cb5d34 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
|
||||
@@ -1,6 +1,6 @@
|
||||
import copy
|
||||
import functools
|
||||
-import imp
|
||||
+import importlib
|
||||
import io
|
||||
import os
|
||||
from collections import OrderedDict, defaultdict
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py b/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
index 6912b6f3c0..7d851f7f76 100755
|
||||
--- a/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/tools/sublime/ninja_options_script.py
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
-import imp
|
||||
+import importlib
|
||||
import optparse
|
||||
import os
|
||||
import pipes
|
||||
diff --git a/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py b/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
index 1c2aba80af..55260d697e 100644
|
||||
--- a/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
+++ b/qtwebengine/src/3rdparty/chromium/v8/third_party/test262-harness/src/parseTestRecord.py
|
||||
@@ -10,7 +10,7 @@ from __future__ import print_function
|
||||
|
||||
import os
|
||||
import re
|
||||
-import imp
|
||||
+import importlib
|
||||
|
||||
from _monkeyYaml import load as yamlLoad
|
||||
|
||||
@ -308,7 +308,7 @@ parts:
|
||||
- libexpat1-dev
|
||||
- libjsoncpp-dev
|
||||
- libnm-dev # connectivityChanged()
|
||||
- libdbus-1-dev # dbus
|
||||
- libsystemd-dev # sdbus-cpp
|
||||
- libpulse-dev # pulse
|
||||
- libudev-dev
|
||||
- libopus-dev # Avoid to build opus from contrib
|
||||
|
||||
@ -46,7 +46,7 @@ CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
|
||||
QT_MAJOR=6
|
||||
QT_MINOR=4
|
||||
QT_PATCH=3
|
||||
QT_RELEASE_PATCH=2
|
||||
QT_RELEASE_PATCH=3
|
||||
|
||||
QT_MAJOR_MINOR=${QT_MAJOR}.${QT_MINOR}
|
||||
QT_MAJOR_MINOR_PATCH=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
|
||||
@ -105,18 +105,14 @@ if [ ! -f "${RPM_PATH}" ]; then
|
||||
# Cache the built Qt RPM package.
|
||||
if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el8.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_33" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc33.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_34" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc34.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_35" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc35.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_36" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc36.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_37" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc37.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_38" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc38.x86_64.rpm "${RPM_PATH}"
|
||||
elif [[ "${DISTRIBUTION}" == "fedora_39" ]]; then
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc39.x86_64.rpm "${RPM_PATH}"
|
||||
else
|
||||
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm "${RPM_PATH}"
|
||||
fi
|
||||
|
||||
@ -272,7 +272,7 @@ function package()
|
||||
{
|
||||
if [[ $DISTRIBUTION =~ debian|ubuntu|raspbian|guix-deb-pack ]]; then
|
||||
package_deb
|
||||
elif [[ $DISTRIBUTION =~ fedora|rhel|opensuse|guix-rpm-pack ]]; then
|
||||
elif [[ $DISTRIBUTION =~ alma|fedora|rhel|opensuse|guix-rpm-pack ]]; then
|
||||
package_rpm
|
||||
elif [[ $DISTRIBUTION =~ snap ]]; then
|
||||
package_snap
|
||||
|
||||
@ -22,7 +22,7 @@ import shutil
|
||||
from platform import uname
|
||||
|
||||
CFVERSION = "9"
|
||||
CLANGFORMAT = ""
|
||||
CLANGFORMAT = None
|
||||
|
||||
QMLFORMAT = None
|
||||
|
||||
@ -138,27 +138,29 @@ def main():
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.type in ["cpp", "both"]:
|
||||
if not command_exists("clang-format-" + CFVERSION):
|
||||
if not command_exists("clang-format"):
|
||||
print("Required version of clang-format not found")
|
||||
sys.exit(1)
|
||||
else:
|
||||
CLANGFORMAT = "clang-format"
|
||||
else:
|
||||
CLANGFORMAT = "clang-format-" + CFVERSION
|
||||
if command_exists("clang-format-" + CFVERSION):
|
||||
CLANGFORMAT = "clang-format-" + CFVERSION
|
||||
elif command_exists("clang-format"):
|
||||
CLANGFORMAT = "clang-format"
|
||||
|
||||
if CLANGFORMAT is not None:
|
||||
print("Using source formatter: " + CLANGFORMAT)
|
||||
else:
|
||||
print("clang-format not found. can't format source files")
|
||||
|
||||
if args.qt is not None and args.type in ["qml", "both"]:
|
||||
global QMLFORMAT # pylint: disable=global-statement
|
||||
QMLFORMAT = find_qmlformat(args.qt)
|
||||
|
||||
if QMLFORMAT is not None:
|
||||
print("Using qmlformatter: " + QMLFORMAT)
|
||||
else:
|
||||
print("No qmlformat found, can't format QML files")
|
||||
if QMLFORMAT is not None:
|
||||
print("Using qmlformatter: " + QMLFORMAT)
|
||||
else:
|
||||
print("qmlformat not found, can't format QML files")
|
||||
|
||||
if args.install:
|
||||
install_hook(args.install, args.qt)
|
||||
if CLANGFORMAT is not None or QMLFORMAT is not None:
|
||||
install_hook(args.install, args.qt)
|
||||
else:
|
||||
print("No formatters found, skipping hook install")
|
||||
sys.exit(0)
|
||||
|
||||
src_files = get_files([".cpp", ".cxx", ".cc", ".h", ".hpp"],
|
||||
|
||||
@ -125,6 +125,8 @@ else
|
||||
if [[ "$OSTYPE" != "darwin"* ]]; then
|
||||
CONFIGURE_FLAGS+=" --disable-shared"
|
||||
fi
|
||||
else
|
||||
CONFIGURE_FLAGS+="--without-dbus"
|
||||
fi
|
||||
|
||||
BUILD_TYPE="Release"
|
||||
|
||||
@ -10,4 +10,4 @@ if (-not(Test-Path -Path $QtDir)) {
|
||||
$lupdate = "$QtDir\bin\lupdate.exe"
|
||||
|
||||
$tsFileNames = Get-ChildItem -Path "$clientDir\translations" -Recurse -Include *.ts
|
||||
Invoke-Expression("$lupdate $clientDir\src -ts $tsFileNames -no-obsolete")
|
||||
Invoke-Expression("$lupdate -extensions cpp,h,qml $clientDir\src -ts $tsFileNames -no-obsolete")
|
||||
|
||||
@ -34,9 +34,9 @@
|
||||
<string>Jami requires to access your camera to make calls and record video</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>Jami requires to access your microphone to make calls and record audio</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Jami requires to access your photo library to show image on profile and send via chat</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<true/>
|
||||
<key>NSAppleEventsUsageDescription</key>
|
||||
<string>Jami requires to monitor global key events for push-to-talk functionality.</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
12
resources/icons/Connected_Black_24dp.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<path id="noun-connection-5025318" d="M18,6.3c1.2,0,2.2-1,2.2-2.1C20.1,3,19.2,2,18,2c-1.2,0-2.2,1-2.2,2.1c0,0.5,0.2,1.1,0.6,1.5
|
||||
l-3.3,3.8c-0.8-0.6-2-0.5-2.7,0.2L7.3,7.1c0.5-0.8,0.2-1.9-0.6-2.4C5.9,4.2,4.8,4.5,4.3,5.3C3.8,6.1,4,7.2,4.9,7.7
|
||||
C5.6,8.1,6.4,8,7,7.5l3.1,2.5c-0.5,0.8-0.4,1.9,0.3,2.6l-2.9,2.9c-1.1-0.7-2.5-0.4-3.2,0.7c-0.7,1.1-0.4,2.5,0.7,3.2
|
||||
c1.1,0.7,2.5,0.4,3.2-0.7c0.6-0.9,0.5-2.1-0.3-2.9l2.9-2.9c0.3,0.2,0.7,0.3,1.2,0.3c0,0,0.1,0,0.1,0l0.8,4.8
|
||||
c-1.1,0.3-1.7,1.4-1.4,2.5c0.3,1.1,1.4,1.7,2.5,1.4c1.1-0.3,1.7-1.4,1.4-2.5c-0.3-0.9-1-1.4-1.9-1.4c0,0-0.1,0-0.1,0l-0.8-4.8
|
||||
c0.4-0.1,0.7-0.3,0.9-0.6l3.6,2.7c-0.4,0.8-0.2,1.8,0.6,2.2c0.8,0.4,1.8,0.2,2.2-0.6c0.4-0.8,0.2-1.8-0.6-2.2
|
||||
c-0.6-0.4-1.4-0.3-1.9,0.2l-3.6-2.7c0.2-0.3,0.3-0.7,0.3-1.1c0-0.5-0.2-1.1-0.6-1.5l3.3-3.8C17.1,6.2,17.5,6.3,18,6.3L18,6.3z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
23
resources/icons/Connecting_Black_24dp.svg
Normal file
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<g id="noun-waiting-3611673" transform="translate(-13.64 -30.48)">
|
||||
<path id="Path_278" d="M25.9,34.5c0.5,0,0.8-0.4,0.8-0.8c0-0.5-0.4-0.8-0.8-0.8c-0.5,0-0.8,0.4-0.8,0.8c0,0.2,0.1,0.4,0.2,0.6
|
||||
C25.4,34.4,25.6,34.5,25.9,34.5z"/>
|
||||
<path id="Path_279" d="M32.7,36.9c0.4-0.4,0.4-1.1,0-1.5c-0.4-0.4-1.1-0.4-1.5,0c-0.4,0.4-0.4,1.1,0,1.5c0.2,0.2,0.5,0.3,0.8,0.3
|
||||
C32.2,37.2,32.5,37.1,32.7,36.9z"/>
|
||||
<path id="Path_280" d="M34.5,41c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2c0.7,0,1.2-0.5,1.2-1.2c0-0.3-0.1-0.6-0.3-0.8
|
||||
C35.1,41.1,34.8,41,34.5,41z"/>
|
||||
<path id="Path_281" d="M31.9,47c-0.7,0-1.3,0.6-1.3,1.3c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3c0-0.3-0.1-0.7-0.4-0.9
|
||||
C32.6,47.1,32.3,47,31.9,47z"/>
|
||||
<path id="Path_282" d="M25.9,49.4c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.8,0,1.4-0.6,1.4-1.4c0-0.4-0.1-0.7-0.4-1
|
||||
C26.6,49.5,26.2,49.4,25.9,49.4z"/>
|
||||
<path id="Path_283" d="M18.7,47.2L18.7,47.2c-0.6,0.6-0.6,1.6,0,2.2c0.6,0.6,1.6,0.6,2.2,0c0.6-0.6,0.6-1.6,0-2.2
|
||||
c-0.3-0.3-0.7-0.5-1.1-0.5C19.4,46.7,19,46.9,18.7,47.2z"/>
|
||||
<path id="Path_284" d="M18.9,42.2c0-0.9-0.7-1.7-1.6-1.7s-1.7,0.7-1.7,1.6c0,0.9,0.7,1.7,1.6,1.7c0.4,0,0.9-0.2,1.2-0.5
|
||||
C18.8,43,18.9,42.6,18.9,42.2z"/>
|
||||
<path id="Path_285" d="M21.1,34.9c-0.7-0.3-1.5-0.1-1.9,0.6c-0.3,0.7-0.1,1.5,0.6,1.9c0.7,0.3,1.5,0.1,1.9-0.6
|
||||
c0.1-0.2,0.2-0.5,0.1-0.7C21.8,35.5,21.5,35.1,21.1,34.9z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
15
resources/icons/Icon_Donate.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="43" height="52.655" viewBox="0 0 43 52.655">
|
||||
<defs>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_268" data-name="Rectangle 268" width="38" height="24" transform="translate(-0.407 0.083)" fill="#fff" stroke="#707070" stroke-width="1"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Icon_Donate" transform="translate(-22 -189.345)">
|
||||
<rect id="Rectangle_267" data-name="Rectangle 267" width="43" height="10" rx="5" transform="translate(22 232)" fill="#9eb3c3"/>
|
||||
<path id="Path_459" data-name="Path 459" d="M9.674,17.083,8.562,16.07C4.609,12.486,2,10.122,2,7.221A4.18,4.18,0,0,1,6.221,3,4.6,4.6,0,0,1,9.674,4.6,4.6,4.6,0,0,1,13.128,3a4.18,4.18,0,0,1,4.221,4.221c0,2.9-2.609,5.265-6.562,8.856Z" transform="translate(22.407 199.828)" fill="#ff0045" opacity="0.3"/>
|
||||
<path id="Path_460" data-name="Path 460" d="M6.953,12.088l-.718-.654C3.684,9.122,2,7.6,2,5.724A2.7,2.7,0,0,1,4.724,3,2.966,2.966,0,0,1,6.953,4.035,2.966,2.966,0,0,1,9.182,3a2.7,2.7,0,0,1,2.724,2.724c0,1.872-1.684,3.4-4.235,5.716Z" transform="translate(45.571 186.345)" fill="#ff0045" opacity="0.16"/>
|
||||
<g id="Mask_Group_38" data-name="Mask Group 38" transform="translate(24.407 213.918)" clip-path="url(#clip-path)">
|
||||
<path id="Path_270" data-name="Path 270" d="M12.649,22.542l-1.544-1.406C5.621,16.163,2,12.883,2,8.857A5.8,5.8,0,0,1,7.857,3a6.377,6.377,0,0,1,4.792,2.226A6.377,6.377,0,0,1,17.442,3,5.8,5.8,0,0,1,23.3,8.857c0,4.025-3.621,7.306-9.105,12.289Z" transform="translate(5.992 5.54)" fill="#ff0045"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
14
resources/icons/Preview_Black_24dp.svg
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<g id="noun-overview-4287788" transform="translate(-112.49 -112.51)">
|
||||
<path id="Path_272" d="M134.5,133.4l-3.5-3.5c3.3-3.9,2.8-9.8-1.1-13.2c-3.9-3.3-9.8-2.8-13.2,1.1c-3.3,3.9-2.8,9.8,1.1,13.2
|
||||
c3.5,2.9,8.6,2.9,12.1,0l3.5,3.5L134.5,133.4z M123.8,131.6c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8c4.3,0,7.8,3.5,7.8,7.8l0,0
|
||||
C131.6,128.2,128.1,131.6,123.8,131.6L123.8,131.6z"/>
|
||||
<path id="Path_273" d="M123.8,119.7c-3.5,0-6.2,1.8-6.2,4.1s2.7,4.1,6.2,4.1c3.5,0,6.2-1.8,6.2-4.1S127.3,119.7,123.8,119.7z
|
||||
M123.8,126.6c-2.6,0-4.8-1.3-4.8-2.8s2.2-2.8,4.8-2.8c2.6,0,4.8,1.3,4.8,2.8S126.5,126.6,123.8,126.6z"/>
|
||||
<path id="Path_274" d="M126.1,123.9c0,1.3-1,2.3-2.3,2.3c-1.3,0-2.3-1-2.3-2.3c0-1.3,1-2.3,2.3-2.3
|
||||
C125.1,121.6,126.1,122.6,126.1,123.9L126.1,123.9"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
7
resources/icons/Shift-Enter_Black_24dp.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<path d="M5.8,4.7h12.5c0.7,0,1.2,0.6,1.2,1.2v7.5c0,0.7-0.6,1.2-1.2,1.2h-12l2.9-2.9l-1.8-1.8l-5,5c-0.1,0.1-0.2,0.3-0.3,0.4
|
||||
c-0.2,0.5-0.1,1,0.3,1.4l5,5L9.1,20l-2.9-2.9h12c2.1,0,3.7-1.7,3.7-3.7V5.9c0-2.1-1.7-3.7-3.7-3.7H5.8V4.7z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 582 B |
9
resources/icons/Trash_Black_24dp.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<path d="M20.9,4.6H15V4.2C15,3,14,2,12.8,2h-1.6C10,2,9,3,9,4.2v0.3H3.1c-0.4,0-0.7,0.3-0.7,0.7s0.3,0.7,0.7,0.7h1.4l0.7,13.8
|
||||
C5.2,21,6.3,22,7.6,22h8.9c1.3,0,2.4-1,2.4-2.3l0.7-13.8h1.4c0.4,0,0.7-0.3,0.7-0.7S21.3,4.6,20.9,4.6z M10.3,4.6V4.2
|
||||
c0-0.5,0.4-0.8,0.8-0.8h1.6c0.5,0,0.8,0.4,0.8,0.8v0.3H10.3z M18.1,5.9l-0.7,13.7c0,0.6-0.5,1-1,1H7.6c-0.6,0-1-0.4-1-1L5.8,5.9
|
||||
H18.1z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 726 B |
15
resources/icons/backup.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="26.503" height="26.5" viewBox="0 0 26.503 26.5">
|
||||
<g id="noun-backup-2912773" transform="translate(-51.27 -51.32)">
|
||||
<path id="Path_259" data-name="Path 259" d="M76.04,60.533H53a1.483,1.483,0,0,1-1.482-1.482v-6A1.483,1.483,0,0,1,53,51.57H76.04a1.483,1.483,0,0,1,1.482,1.482v6A1.483,1.483,0,0,1,76.04,60.533ZM53,52.014a1.038,1.038,0,0,0-1.037,1.037v6A1.038,1.038,0,0,0,53,60.089H76.04a1.038,1.038,0,0,0,1.037-1.037v-6a1.038,1.038,0,0,0-1.037-1.037Z" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_260" data-name="Path 260" d="M72.468,779.243H53.042a1.483,1.483,0,0,1-1.482-1.482v-6a1.483,1.483,0,0,1,1.482-1.482h16.2a.222.222,0,1,1,0,.444h-16.2A1.038,1.038,0,0,0,52,771.762v6a1.038,1.038,0,0,0,1.037,1.037H72.468a.222.222,0,1,1,0,.444Z" transform="translate(-0.039 -701.673)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_261" data-name="Path 261" d="M723.843,728.9a5.093,5.093,0,1,1,5.093-5.093,5.1,5.1,0,0,1-5.093,5.093Zm0-9.741a4.649,4.649,0,1,0,3.079,1.166A4.642,4.642,0,0,0,723.843,719.156Z" transform="translate(-651.414 -651.328)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_262" data-name="Path 262" d="M77.382,423.416a.222.222,0,0,1-.222-.222V412.138a.76.76,0,0,0-.759-.759H52.807a.76.76,0,0,0-.759.759v6.556a.76.76,0,0,0,.759.759H69.285a.222.222,0,1,1,0,.444H52.807a1.205,1.205,0,0,1-1.2-1.2v-6.556a1.205,1.205,0,0,1,1.2-1.2H76.4a1.205,1.205,0,0,1,1.2,1.2v11.056A.222.222,0,0,1,77.382,423.416Z" transform="translate(-0.081 -350.845)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_263" data-name="Path 263" d="M168.967,149.643a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0v3.889A.222.222,0,0,1,168.967,149.643Z" transform="translate(-114.446 -91.518)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_264" data-name="Path 264" d="M168.967,524.643a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0v3.889A.222.222,0,0,1,168.967,524.643Z" transform="translate(-114.446 -457.629)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_265" data-name="Path 265" d="M168.967,899.623a.222.222,0,0,1-.222-.222v-3.889a.222.222,0,1,1,.444,0V899.4A.222.222,0,0,1,168.967,899.623Z" transform="translate(-114.446 -823.72)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_266" data-name="Path 266" d="M498.2,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,498.2,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,498.2,169.194Z" transform="translate(-434.793 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_267" data-name="Path 267" d="M709.143,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,709.143,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,709.143,169.194Z" transform="translate(-640.733 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_268" data-name="Path 268" d="M920.083,171.417a1.333,1.333,0,1,1,1.333-1.333A1.335,1.335,0,0,1,920.083,171.417Zm0-2.222a.889.889,0,1,0,.889.889A.89.89,0,0,0,920.083,169.194Z" transform="translate(-846.673 -114.402)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
<path id="Path_269" data-name="Path 269" d="M826.331,853.344h-.015a.222.222,0,0,1-.17-.1l-1.111-1.667a.222.222,0,1,1,.37-.247l.95,1.425,3.7-4.226a.222.222,0,0,1,.335.293l-3.889,4.445a.223.223,0,0,1-.167.076Z" transform="translate(-755.142 -777.995)" fill="#005699" stroke="#005699" stroke-width="0.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
5
resources/icons/favorite_black_24dp.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="21.5" height="20.112" viewBox="0 0 21.5 20.112">
|
||||
<g id="favorite_black_24dp" transform="translate(-1.25 -2.25)">
|
||||
<path id="Path_270" data-name="Path 270" d="M12,21.35l-1.45-1.32C5.4,15.36,2,12.28,2,8.5A5.447,5.447,0,0,1,7.5,3,5.988,5.988,0,0,1,12,5.09,5.988,5.988,0,0,1,16.5,3,5.447,5.447,0,0,1,22,8.5c0,3.78-3.4,6.86-8.55,11.54Z" fill="none" stroke="#03b9e9" stroke-width="1.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 448 B |
358
resources/icons/jami-logo-icon.svg
Normal file
@ -0,0 +1,358 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 116.3 116.3" style="enable-background:new 0 0 116.3 116.3;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:url(#SVGID_1_);}
|
||||
.st1{fill:url(#SVGID_2_);}
|
||||
.st2{fill:url(#SVGID_3_);}
|
||||
.st3{fill:url(#SVGID_4_);}
|
||||
.st4{fill:url(#SVGID_5_);}
|
||||
.st5{fill:url(#SVGID_6_);}
|
||||
.st6{opacity:0.4;fill:url(#SVGID_7_);enable-background:new ;}
|
||||
.st7{fill:url(#SVGID_8_);}
|
||||
.st8{fill:url(#SVGID_9_);}
|
||||
.st9{fill:url(#SVGID_10_);}
|
||||
.st10{fill:url(#SVGID_11_);}
|
||||
.st11{fill:url(#SVGID_12_);}
|
||||
.st12{fill:url(#SVGID_13_);}
|
||||
.st13{fill:url(#SVGID_14_);}
|
||||
.st14{fill:url(#SVGID_15_);}
|
||||
.st15{fill:url(#SVGID_16_);}
|
||||
.st16{opacity:0.2;fill:url(#SVGID_17_);enable-background:new ;}
|
||||
.st17{fill:url(#SVGID_18_);}
|
||||
.st18{fill:url(#SVGID_19_);}
|
||||
.st19{opacity:0.25;fill:url(#SVGID_20_);enable-background:new ;}
|
||||
.st20{fill:url(#SVGID_21_);}
|
||||
.st21{fill:url(#SVGID_22_);}
|
||||
.st22{opacity:0.2;fill:url(#SVGID_23_);enable-background:new ;}
|
||||
.st23{fill:url(#SVGID_24_);}
|
||||
</style>
|
||||
<g>
|
||||
<g>
|
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="69.0328" y1="454.9245" x2="64.4435" y2="449.5703" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<polygon class="st0" points="54.9,55.8 62,55.6 58.4,62.2 "/>
|
||||
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="108.534" y1="457.2333" x2="108.534" y2="494.0327" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
|
||||
<stop offset="0.2165" style="stop-color:#2E5589"/>
|
||||
<stop offset="0.3608" style="stop-color:#2B5E97"/>
|
||||
<stop offset="0.5" style="stop-color:#29629C"/>
|
||||
<stop offset="0.6392" style="stop-color:#2B5E97"/>
|
||||
<stop offset="0.7835" style="stop-color:#2E5589"/>
|
||||
<stop offset="0.9296" style="stop-color:#2D4576"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st1" d="M85.5,57.5c26.1,4.2,29.8,10.7,29.8,10.7c0,0.4,0,0.8,0,1.2c0,0.2-0.1,0.4-0.2,0.7c-0.1,0.3-2.7,5.7-19.6,9.3
|
||||
L85.5,57.5z"/>
|
||||
|
||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="26.7686" y1="496.8278" x2="38.7091" y2="475.5678" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#252B59"/>
|
||||
<stop offset="8.590000e-02" style="stop-color:#2B3A69"/>
|
||||
<stop offset="0.2267" style="stop-color:#2E4A7C"/>
|
||||
<stop offset="0.3658" style="stop-color:#2E5487"/>
|
||||
<stop offset="0.5" style="stop-color:#2D578C"/>
|
||||
<stop offset="0.6342" style="stop-color:#2E5487"/>
|
||||
<stop offset="0.7733" style="stop-color:#2E4A7C"/>
|
||||
<stop offset="0.9141" style="stop-color:#2B3A69"/>
|
||||
<stop offset="1" style="stop-color:#252B59"/>
|
||||
</linearGradient>
|
||||
<path class="st2" d="M19.8,78.5c-5.9,15.7-2.9,20.6-2.7,21c0.1,0.2,0.2,0.4,0.4,0.5c0.4,0,0.8-0.1,1.2-0.2c0,0,10.7-0.5,23.2-18.3
|
||||
L19.8,78.5z"/>
|
||||
|
||||
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="60.8512" y1="424.6486" x2="41.0872" y2="401.5905" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#181844"/>
|
||||
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
|
||||
<stop offset="0.1353" style="stop-color:#283261"/>
|
||||
<stop offset="0.2468" style="stop-color:#2D4172"/>
|
||||
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
|
||||
<stop offset="0.5" style="stop-color:#2E4D7F"/>
|
||||
<stop offset="0.6177" style="stop-color:#2D4576"/>
|
||||
<stop offset="0.8125" style="stop-color:#273160"/>
|
||||
<stop offset="1" style="stop-color:#181844"/>
|
||||
</linearGradient>
|
||||
<path class="st3" d="M58.8,18.6C44.5,2.9,37.5,3.8,37.1,3.9c-0.2,0-0.5,0.1-0.7,0.2c-0.5,0.2-1,1.8-1,1.8s-3,8.7,9.1,31.9
|
||||
L58.8,18.6z"/>
|
||||
|
||||
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="99.9721" y1="499.3526" x2="84.7036" y2="450.1664" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#181844"/>
|
||||
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
|
||||
<stop offset="0.1353" style="stop-color:#283261"/>
|
||||
<stop offset="0.2468" style="stop-color:#2D4172"/>
|
||||
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
|
||||
<stop offset="0.5" style="stop-color:#2E4D7F"/>
|
||||
<stop offset="0.6177" style="stop-color:#2D4576"/>
|
||||
<stop offset="0.8125" style="stop-color:#273160"/>
|
||||
<stop offset="1" style="stop-color:#181844"/>
|
||||
</linearGradient>
|
||||
<path class="st4" d="M71.2,78.8C90.6,101,97.4,99.8,97.4,99.8c0.4,0.1,0.9,0.2,1.3,0.2c0.2-0.1,0.3-0.3,0.4-0.5
|
||||
c0.3-0.4,5.8-9.4-12.8-41.8L71.2,78.8z"/>
|
||||
|
||||
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="31.6447" y1="457.2331" x2="31.6447" y2="494.0317" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
|
||||
<stop offset="0.2165" style="stop-color:#2E5589"/>
|
||||
<stop offset="0.3608" style="stop-color:#2B5E97"/>
|
||||
<stop offset="0.5" style="stop-color:#29629C"/>
|
||||
<stop offset="0.6392" style="stop-color:#2B5E97"/>
|
||||
<stop offset="0.7835" style="stop-color:#2E5589"/>
|
||||
<stop offset="0.9296" style="stop-color:#2D4576"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st5" d="M46.1,82.2c-40-1.7-44.8-11.6-45-12.1C1.1,69.9,1,69.7,1,69.5c0.1-0.7,1.5-2,1.5-2s10.6-6.5,28.3-10
|
||||
L46.1,82.2z"/>
|
||||
|
||||
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="51.8906" y1="421.1236" x2="66.337" y2="421.1236" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st6" d="M57.6,17.4c-5,5.4-9.6,11.2-13.8,17.2h1c3.1-3.9,10.8-13.7,13.4-16.5L57.6,17.4z"/>
|
||||
|
||||
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="70.9709" y1="436.4003" x2="70.9709" y2="401.6908" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#252B59"/>
|
||||
<stop offset="0.5" style="stop-color:#2D578C"/>
|
||||
<stop offset="0.6934" style="stop-color:#2D5588"/>
|
||||
<stop offset="0.8038" style="stop-color:#2E4F80"/>
|
||||
<stop offset="0.8932" style="stop-color:#2D4474"/>
|
||||
<stop offset="0.971" style="stop-color:#283463"/>
|
||||
<stop offset="1" style="stop-color:#252B59"/>
|
||||
</linearGradient>
|
||||
<path class="st7" d="M73.8,35.4C84.2,10.7,80.2,5,80.2,5c-0.1-0.3-0.2-0.7-0.3-1c-0.2-0.1-0.4-0.1-0.7-0.2
|
||||
c-0.5-0.1-11.4-1.5-34.4,30.7L73.8,35.4z"/>
|
||||
|
||||
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="39.2669" y1="503.7654" x2="102.6764" y2="407.9172" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="8.239999e-02" style="stop-color:#177EBC"/>
|
||||
<stop offset="0.1675" style="stop-color:#0E91D1"/>
|
||||
<stop offset="0.2527" style="stop-color:#10A2E1"/>
|
||||
<stop offset="0.337" style="stop-color:#18ACEA"/>
|
||||
<stop offset="0.42" style="stop-color:#24B1ED"/>
|
||||
<stop offset="0.5" style="stop-color:#28B1ED"/>
|
||||
<stop offset="0.58" style="stop-color:#24B1ED"/>
|
||||
<stop offset="0.663" style="stop-color:#18ACEA"/>
|
||||
<stop offset="0.7473" style="stop-color:#10A2E1"/>
|
||||
<stop offset="0.8325" style="stop-color:#0E91D1"/>
|
||||
<stop offset="0.9176" style="stop-color:#177EBC"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st8" d="M58,97.4c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8l-17.3-11c7.3-1.6,16.3-10.2,25.7-21.3
|
||||
L58,97.4z"/>
|
||||
|
||||
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="33.568" y1="505.6873" x2="58.683" y2="483.2007" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2C5D95"/>
|
||||
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
|
||||
<stop offset="0.1808" style="stop-color:#1B79B9"/>
|
||||
<stop offset="0.3007" style="stop-color:#1080C2"/>
|
||||
<stop offset="0.5" style="stop-color:#0E81C5"/>
|
||||
<stop offset="0.6993" style="stop-color:#1080C2"/>
|
||||
<stop offset="0.8192" style="stop-color:#1B79B9"/>
|
||||
<stop offset="0.9178" style="stop-color:#246EAB"/>
|
||||
<stop offset="1" style="stop-color:#2C5D95"/>
|
||||
</linearGradient>
|
||||
<path class="st9" d="M58.6,98c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8L17.6,100c7.3-1.6,16.9-9.6,26.3-20.7
|
||||
L58.6,98z"/>
|
||||
|
||||
<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="31.3212" y1="407.2591" x2="89.6399" y2="504.4568" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2C5D95"/>
|
||||
<stop offset="1.760000e-02" style="stop-color:#2A6199"/>
|
||||
<stop offset="0.1407" style="stop-color:#1C79B7"/>
|
||||
<stop offset="0.2631" style="stop-color:#0A8CCA"/>
|
||||
<stop offset="0.3837" style="stop-color:#0B97D4"/>
|
||||
<stop offset="0.5" style="stop-color:#0E9AD8"/>
|
||||
<stop offset="0.6163" style="stop-color:#0B97D4"/>
|
||||
<stop offset="0.7369" style="stop-color:#0A8CCA"/>
|
||||
<stop offset="0.8593" style="stop-color:#1C79B7"/>
|
||||
<stop offset="0.9824" style="stop-color:#2A6199"/>
|
||||
<stop offset="1" style="stop-color:#2C5D95"/>
|
||||
</linearGradient>
|
||||
<path class="st10" d="M20.7,38c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2l17.3-11c-1.5,7.1,2.3,18,8.2,30.7L20.7,38z"/>
|
||||
|
||||
<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="94.4028" y1="503.8655" x2="56.9038" y2="456.6339" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2C5D95"/>
|
||||
<stop offset="2.570000e-02" style="stop-color:#2A6199"/>
|
||||
<stop offset="0.2053" style="stop-color:#1C79B7"/>
|
||||
<stop offset="0.384" style="stop-color:#0A8CCA"/>
|
||||
<stop offset="0.5599" style="stop-color:#0B97D4"/>
|
||||
<stop offset="0.7296" style="stop-color:#0E9AD8"/>
|
||||
<stop offset="0.7925" style="stop-color:#0B97D4"/>
|
||||
<stop offset="0.8577" style="stop-color:#0A8CCA"/>
|
||||
<stop offset="0.9239" style="stop-color:#1C79B7"/>
|
||||
<stop offset="0.9905" style="stop-color:#2A6199"/>
|
||||
<stop offset="1" style="stop-color:#2C5D95"/>
|
||||
</linearGradient>
|
||||
<path class="st11" d="M57.2,57.2c-8.7,0-17.4,0.7-26,1.9c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41
|
||||
c0.6-0.2,1.2-0.5,1.7-0.8l17.3-11C87,97.5,70.6,78.2,57.2,57.2z"/>
|
||||
|
||||
<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="40.2175" y1="431.0724" x2="32.9164" y2="404.7886" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2C5D95"/>
|
||||
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
|
||||
<stop offset="0.1808" style="stop-color:#1B79B9"/>
|
||||
<stop offset="0.3007" style="stop-color:#1080C2"/>
|
||||
<stop offset="0.5" style="stop-color:#0E81C5"/>
|
||||
<stop offset="0.6993" style="stop-color:#1080C2"/>
|
||||
<stop offset="0.8192" style="stop-color:#1B79B9"/>
|
||||
<stop offset="0.9178" style="stop-color:#246EAB"/>
|
||||
<stop offset="1" style="stop-color:#2C5D95"/>
|
||||
</linearGradient>
|
||||
<path class="st12" d="M20.1,38.5c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2L36.5,4.1c-1.5,7.1,1.7,18.6,7.6,31.2
|
||||
L20.1,38.5z"/>
|
||||
|
||||
<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="122.9025" y1="448.7971" x2="9.1479" y2="448.7971" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="1.280000e-02" style="stop-color:#256BA7"/>
|
||||
<stop offset="0.1121" style="stop-color:#0B83C3"/>
|
||||
<stop offset="0.2115" style="stop-color:#1797D8"/>
|
||||
<stop offset="0.3099" style="stop-color:#25A3E2"/>
|
||||
<stop offset="0.4066" style="stop-color:#27ABE7"/>
|
||||
<stop offset="0.5" style="stop-color:#2AAEEA"/>
|
||||
<stop offset="0.5934" style="stop-color:#27ABE7"/>
|
||||
<stop offset="0.6901" style="stop-color:#25A3E2"/>
|
||||
<stop offset="0.7885" style="stop-color:#1797D8"/>
|
||||
<stop offset="0.8879" style="stop-color:#0B83C3"/>
|
||||
<stop offset="0.9872" style="stop-color:#256BA7"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st13" d="M85.5,59.6c13.5,1.9,24.7,4.7,29.8,9.8V48.9c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,59.6z"/>
|
||||
|
||||
<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="90.2941" y1="447.1362" x2="122.8074" y2="448.8884" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2E5284"/>
|
||||
<stop offset="6.100000e-03" style="stop-color:#2E5486"/>
|
||||
<stop offset="9.120000e-02" style="stop-color:#29649D"/>
|
||||
<stop offset="0.1876" style="stop-color:#236FAD"/>
|
||||
<stop offset="0.3049" style="stop-color:#1D77B6"/>
|
||||
<stop offset="0.5" style="stop-color:#1C78B9"/>
|
||||
<stop offset="0.6951" style="stop-color:#1D77B6"/>
|
||||
<stop offset="0.8124" style="stop-color:#236FAD"/>
|
||||
<stop offset="0.9088" style="stop-color:#29649D"/>
|
||||
<stop offset="0.9939" style="stop-color:#2E5486"/>
|
||||
<stop offset="1" style="stop-color:#2E5284"/>
|
||||
</linearGradient>
|
||||
<path class="st14" d="M85.5,58.8c13.5,1.9,24.7,5.5,29.8,10.6V48.1c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,58.8z"/>
|
||||
|
||||
<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="9.0577" y1="447.1912" x2="67.7186" y2="447.1912" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="2.250000e-02" style="stop-color:#256BA7"/>
|
||||
<stop offset="0.1971" style="stop-color:#0B83C3"/>
|
||||
<stop offset="0.3718" style="stop-color:#1797D8"/>
|
||||
<stop offset="0.5447" style="stop-color:#25A3E2"/>
|
||||
<stop offset="0.7147" style="stop-color:#27ABE7"/>
|
||||
<stop offset="0.8788" style="stop-color:#2AAEEA"/>
|
||||
<stop offset="0.9015" style="stop-color:#27ABE7"/>
|
||||
<stop offset="0.9249" style="stop-color:#25A3E2"/>
|
||||
<stop offset="0.9487" style="stop-color:#1797D8"/>
|
||||
<stop offset="0.9728" style="stop-color:#0B83C3"/>
|
||||
<stop offset="0.9969" style="stop-color:#256BA7"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st15" d="M73.2,35.1c-3-0.1-9.5-0.4-15.1-0.4C7.1,34.7,1.4,46.5,1.2,47C1,47.6,1,48.3,1,48.9v20.6
|
||||
c5-5,15.9-7.7,29.2-9.7c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C60.8,57.8,76.3,35.2,73.2,35.1z"/>
|
||||
|
||||
<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="50.3126" y1="432.0108" x2="28.2664" y2="428.9106" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st16" d="M44.1,33.5c-10.7,0.5-18.4,1.3-24.8,3.1l0.3,0.8c0.6-0.1,1.3-0.3,1.9-0.4c7.7-1.2,15.4-2,23.1-2.3L44.1,33.5
|
||||
z"/>
|
||||
|
||||
<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="72.7451" y1="450.8669" x2="10.4435" y2="442.1056" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
|
||||
<stop offset="0.1177" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.2081" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.5" style="stop-color:#109EDE"/>
|
||||
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.7919" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.8823" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.9618" style="stop-color:#2174B1"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st17" d="M73.2,34.3c-3-0.1-9.5-0.4-15.1-0.4c-51.1,0-56.7,11.8-57,12.4C1,46.8,1,47.5,1,48.1v21.4
|
||||
c5-5,15.9-8.5,29.2-10.5c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C63.2,57.1,76.3,34.4,73.2,34.3z"/>
|
||||
|
||||
<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="101.6202" y1="407.733" x2="71.9933" y2="458.7571" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="0.1238" style="stop-color:#177EBC"/>
|
||||
<stop offset="0.2516" style="stop-color:#0E91D1"/>
|
||||
<stop offset="0.3797" style="stop-color:#10A2E1"/>
|
||||
<stop offset="0.5064" style="stop-color:#18ACEA"/>
|
||||
<stop offset="0.631" style="stop-color:#24B1ED"/>
|
||||
<stop offset="0.7513" style="stop-color:#28B1ED"/>
|
||||
<stop offset="0.7911" style="stop-color:#24B1ED"/>
|
||||
<stop offset="0.8324" style="stop-color:#18ACEA"/>
|
||||
<stop offset="0.8743" style="stop-color:#10A2E1"/>
|
||||
<stop offset="0.9167" style="stop-color:#0E91D1"/>
|
||||
<stop offset="0.959" style="stop-color:#177EBC"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st18" d="M58.2,58.8C72.1,37.9,82.4,16,79.8,4.1l17.3,11c0.5,0.3,1,0.7,1.4,1.2c0.3,0.5,7.1,11.7-20.7,54.5
|
||||
c-2,3.2-3.9,6.9-4.6,7.2c-4.1-4-12.6-15.6-14.7-18.5C58.3,59.1,58.2,58.8,58.2,58.8z"/>
|
||||
|
||||
<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="105.3445" y1="433.3988" x2="94.5575" y2="453.6416" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st19" d="M96.6,37.2c-3.1,7.8-6.8,15.3-11.1,22.4l1.3,0.2c5.5-9.5,8.7-16.5,10.9-22.4L96.6,37.2z"/>
|
||||
|
||||
<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="100.6479" y1="408.8533" x2="70.927" y2="464.6275" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
|
||||
<stop offset="0.1177" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.2081" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.5" style="stop-color:#109EDE"/>
|
||||
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.7919" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.8823" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.9618" style="stop-color:#2174B1"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st20" d="M78.5,71.4c27.8-42.8,21-54,20.7-54.5c-0.4-0.5-0.9-0.9-1.4-1.2L79.8,4.1c2.5,11.8-7.4,34.6-21.2,55.5
|
||||
c4.6,7.1,9.4,14,14.5,19.9C74.1,78.3,76.7,74.3,78.5,71.4z"/>
|
||||
|
||||
<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="102.9539" y1="410.1097" x2="72.9714" y2="466.375" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2867A2"/>
|
||||
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
|
||||
<stop offset="0.1177" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.2081" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.5" style="stop-color:#109EDE"/>
|
||||
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.7919" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.8823" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.9618" style="stop-color:#2174B1"/>
|
||||
<stop offset="1" style="stop-color:#2867A2"/>
|
||||
</linearGradient>
|
||||
<path class="st21" d="M72.6,80.2c0.1-0.1,0.2-0.1,0.2-0.2c-5.3-6.2-10.2-12.8-14.7-19.7c-0.1,0.1-0.2,0.2-0.2,0.4
|
||||
C57.9,60.6,67.6,75.9,72.6,80.2z"/>
|
||||
|
||||
<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="54.5637" y1="474.0854" x2="62.254" y2="494.9197" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2B3B6A"/>
|
||||
<stop offset="1" style="stop-color:#2B3B6A"/>
|
||||
</linearGradient>
|
||||
<path class="st22" d="M58.2,98.4C57.9,98.1,47.7,86.1,43.1,79l-0.8,0.9C46.9,86.6,52,93,57.6,99L58.2,98.4z"/>
|
||||
|
||||
<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="69.1674" y1="452.6575" x2="78.2209" y2="509.0225" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
|
||||
<stop offset="0" style="stop-color:#2E5284"/>
|
||||
<stop offset="2.440000e-02" style="stop-color:#2C5C92"/>
|
||||
<stop offset="8.880000e-02" style="stop-color:#2075B1"/>
|
||||
<stop offset="0.1599" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.2403" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.3378" style="stop-color:#0E9CDA"/>
|
||||
<stop offset="0.5" style="stop-color:#109EDE"/>
|
||||
<stop offset="0.6718" style="stop-color:#0C9BDB"/>
|
||||
<stop offset="0.7751" style="stop-color:#0A94D2"/>
|
||||
<stop offset="0.8603" style="stop-color:#0B86C4"/>
|
||||
<stop offset="0.9351" style="stop-color:#2174B1"/>
|
||||
<stop offset="1" style="stop-color:#2C5D95"/>
|
||||
</linearGradient>
|
||||
<path class="st23" d="M72.9,79.9c-5.3-6.2-10.2-12.8-14.7-19.7c-0.5-0.8-1.1-1.6-1.6-2.4c-8.7,0-17.4,0.7-26,1.9
|
||||
c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41c0.6-0.2,1.2-0.5,1.7-0.8L98.8,100C91.4,98.4,82.1,90.6,72.9,79.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
1
resources/icons/jami_id_logo.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="24" viewBox="0 0 30 24"><defs><style>.a{fill:#005699;}.b,.d{fill:none;}.b{stroke:#005699;stroke-width:1.5px;}.c{stroke:none;}</style></defs><g transform="translate(7.328 6.159)"><g transform="translate(0 0)"><path class="a" d="M-2124.191-3452.351h.007a1.335,1.335,0,0,0,.972-.341,1.106,1.106,0,0,0,.351-.847.958.958,0,0,0-.34-.76,1.407,1.407,0,0,0-.983-.337h-.012a1.365,1.365,0,0,0-.977.342,1.1,1.1,0,0,0-.053,1.549l.055.056a1.364,1.364,0,0,0,.973.341Z" transform="translate(2125.521 3454.638)"/></g><g transform="translate(0.358 0.062)"><path class="a" d="M-2123.846-3442.183h9.042a8,8,0,0,0,3.567-.767,5.651,5.651,0,0,0,2.353-2.118,6.555,6.555,0,0,0,0-6.4,5.651,5.651,0,0,0-2.351-2.114,7.975,7.975,0,0,0-3.562-.766h-3.427v8.653h2.057v-7.142h1.216a4.586,4.586,0,0,1,4.953,4.187,4.586,4.586,0,0,1-4.187,4.954,4.585,4.585,0,0,1-.772,0h-6.942v-6.035h-1.946v6.035h0Z" transform="translate(2123.846 3454.35)"/></g></g><g class="b"><path class="c" d="M5,0H25a5,5,0,0,1,5,5V24a0,0,0,0,1,0,0H5a5,5,0,0,1-5-5V5A5,5,0,0,1,5,0Z"/><path class="d" d="M5,.75H25A4.25,4.25,0,0,1,29.25,5V22.5a.75.75,0,0,1-.75.75H5A4.25,4.25,0,0,1,.75,19V5A4.25,4.25,0,0,1,5,.75Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
13
resources/icons/more_Menu_Black_24dp.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
||||
<g id="noun-add-929469" transform="translate(-102.6 -102.6)">
|
||||
<path id="Path_270" d="M107.5,107.5c-3.9,3.9-3.9,10.2,0,14.1c3.9,3.9,10.2,3.9,14.1,0c3.9-3.9,3.9-10.2,0-14.1
|
||||
C117.8,103.6,111.4,103.6,107.5,107.5C107.5,107.5,107.5,107.5,107.5,107.5z M120.5,120.5c-3.3,3.3-8.5,3.3-11.8,0
|
||||
c-3.3-3.3-3.3-8.5,0-11.8c3.3-3.3,8.5-3.3,11.8,0C123.7,112,123.7,117.2,120.5,120.5z"/>
|
||||
<path id="Path_271" d="M114.6,109.8c-0.4,0-0.8,0.4-0.8,0.8c0,0,0,0,0,0v3.1h-3.1c-0.5,0-0.8,0.4-0.8,0.8c0,0.5,0.4,0.8,0.8,0.8
|
||||
h3.1v3.1c0,0.4,0.4,0.8,0.8,0.8c0,0,0,0,0,0c0.5,0,0.8-0.4,0.8-0.8v-3.1h3.1c0.5,0,0.8-0.4,0.8-0.8c0-0.4-0.4-0.8-0.8-0.8
|
||||
c0,0,0,0,0,0h-3.1v-3.1C115.4,110.2,115.1,109.8,114.6,109.8C114.6,109.8,114.6,109.8,114.6,109.8z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
41
resources/icons/plugins_default_icon.svg
Normal file
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 428 428" style="enable-background:new 0 0 428 428;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
|
||||
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_2_);}
|
||||
.st2{fill:url(#SVGID_3_);}
|
||||
.st3{fill:url(#SVGID_4_);}
|
||||
</style>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-12.625" y1="262.475" x2="165.425" y2="84.425" gradientTransform="matrix(1 0 0 -1 0 428)">
|
||||
<stop offset="0" style="stop-color:#7E7E7E"/>
|
||||
<stop offset="1" style="stop-color:#E9FFFF"/>
|
||||
</linearGradient>
|
||||
<path class="st0" d="M1.6,154v21.5v1.4c0.2,0,0.4,0,0.6,0c21.8,0,39.5,17.7,39.5,39.5S24,255.9,2.2,255.9c-0.2,0-0.4,0-0.6,0V408
|
||||
H101V152c0.2,0.1,0.3,0.1,0.5,0.2V51.4L1.6,154z"/>
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="227.375" y1="343.175" x2="405.475" y2="165.075" gradientTransform="matrix(1 0 0 -1 0 428)">
|
||||
<stop offset="0" style="stop-color:#999999"/>
|
||||
<stop offset="0.3476" style="stop-color:#9B9B9B"/>
|
||||
<stop offset="0.525" style="stop-color:#A1A3A3"/>
|
||||
<stop offset="0.6639" style="stop-color:#ABB0B0"/>
|
||||
<stop offset="0.7828" style="stop-color:#BAC3C3"/>
|
||||
<stop offset="0.8889" style="stop-color:#CDDCDC"/>
|
||||
<stop offset="0.9845" style="stop-color:#E5F9F9"/>
|
||||
<stop offset="1" style="stop-color:#E9FFFF"/>
|
||||
</linearGradient>
|
||||
<path class="st1" d="M386.9,176.8L386.9,176.8V19h-93.7v256c-0.1-0.1-0.3-0.1-0.4-0.2v100.8l94.2-96.7v-23.2l0,0
|
||||
c21.8,0,39.5-17.7,39.5-39.5C426.4,194.5,408.7,176.8,386.9,176.8z"/>
|
||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1.6" y1="341.5" x2="395.2748" y2="341.5" gradientTransform="matrix(1 0 0 -1 0 428)">
|
||||
<stop offset="0" style="stop-color:#999999"/>
|
||||
<stop offset="0.9889" style="stop-color:#E9FFFF"/>
|
||||
</linearGradient>
|
||||
<path class="st2" d="M181.3,19C126.4,19,1.6,31.5,1.6,154c0,0,49.3-42.7,136.9-25s160.9-0.7,207.6-49.1
|
||||
c18.6-19.3,32.4-39.6,40.2-60.9H181.3z"/>
|
||||
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-723.2346" y1="1360.2583" x2="-329.5598" y2="1360.2583" gradientTransform="matrix(-1 0 0 1 -336.3346 -1016.8083)">
|
||||
<stop offset="0" style="stop-color:#E9FFFF"/>
|
||||
<stop offset="1" style="stop-color:#999999"/>
|
||||
</linearGradient>
|
||||
<path class="st3" d="M207.2,408c54.9,0,179.7-11.9,179.7-129.1c0,0-49.3,40.8-136.9,23.9s-160.9,0.7-207.6,47
|
||||
C23.8,368.3,10.1,387.6,2.2,408H207.2z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M39 38v-8.7q0-2.7-1.9-4.6-1.9-1.9-4.6-1.9H11.7l7.7 7.7-2.1 2.1L6 21.3 17.3 10l2.1 2.1-7.7 7.7h20.8q3.9 0 6.7 2.775Q42 25.35 42 29.3V38Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 216 B |
4
resources/icons/reply_black_24dp.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg id="reply_black_24dp" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path id="Path_333" data-name="Path 333" d="M0,0H24V24H0Z" fill="none"/>
|
||||
<path id="Path_334" data-name="Path 334" d="M10,9V5L3,12l7,7V14.9c5,0,8.5,1.6,11,5.1C20,15,17,10,10,9Z" fill="none" stroke="#000" stroke-linecap="round" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 364 B |
BIN
resources/images/BG-DarkMode-ID_Jami.png
Normal file
|
After Width: | Height: | Size: 514 KiB |
BIN
resources/images/BG-LightMode-ID_Jami.png
Normal file
|
After Width: | Height: | Size: 622 KiB |
BIN
resources/images/Background_Don_dark.jpg
Normal file
|
After Width: | Height: | Size: 779 KiB |
BIN
resources/images/Background_Don_white.jpg
Normal file
|
After Width: | Height: | Size: 653 KiB |
BIN
resources/images/default_plugin_background.jpg
Normal file
|
After Width: | Height: | Size: 145 KiB |
@ -35,9 +35,6 @@ BaseView {
|
||||
|
||||
property bool successState: true
|
||||
|
||||
// signal to redirect the page to main view
|
||||
signal loaderSourceChangeRequested(int sourceToLoad)
|
||||
|
||||
function slotMigrationButtonClicked() {
|
||||
stackedWidget.currentIndex = AccountMigrationView.AccountMigrationStep.Synching;
|
||||
AccountAdapter.setArchivePasswordAsync(CurrentAccountToMigrate.accountId, passwordInputLineEdit.text);
|
||||
|
||||
@ -43,7 +43,6 @@ ApplicationWindow {
|
||||
LayoutMirroring.childrenInherit: isRTL
|
||||
|
||||
enum LoadedSource {
|
||||
WizardView,
|
||||
MainView,
|
||||
AccountMigrationView,
|
||||
None
|
||||
@ -66,6 +65,15 @@ ApplicationWindow {
|
||||
}
|
||||
}
|
||||
|
||||
header: Loader {
|
||||
active: true
|
||||
sourceComponent: GenericErrorsRow {
|
||||
id: genericError
|
||||
text: CurrentAccount.enabled ? JamiStrings.noNetworkConnectivity : JamiStrings.disabledAccount
|
||||
height: visible? JamiTheme.chatViewHeaderPreferredHeight : 0
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: focusOverlay
|
||||
objectName: "focusOverlay"
|
||||
@ -95,19 +103,13 @@ ApplicationWindow {
|
||||
|
||||
function checkLoadedSource() {
|
||||
var sourceString = mainApplicationLoader.source.toString();
|
||||
if (sourceString === JamiQmlUtils.wizardViewLoadPath)
|
||||
return MainApplicationWindow.LoadedSource.WizardView;
|
||||
else if (sourceString === JamiQmlUtils.mainViewLoadPath)
|
||||
if (sourceString === JamiQmlUtils.mainViewLoadPath)
|
||||
return MainApplicationWindow.LoadedSource.MainView;
|
||||
return MainApplicationWindow.LoadedSource.None;
|
||||
}
|
||||
|
||||
function startClient() {
|
||||
if (UtilsAdapter.getAccountListSize() !== 0) {
|
||||
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
|
||||
} else {
|
||||
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
|
||||
}
|
||||
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
|
||||
}
|
||||
|
||||
function setMainLoaderSource(source) {
|
||||
@ -129,9 +131,6 @@ ApplicationWindow {
|
||||
// If we're in the onboarding wizard or 'MinimizeOnClose'
|
||||
// is set, then we can quit
|
||||
if (force || !UtilsAdapter.getAppValue(Settings.MinimizeOnClose) || !UtilsAdapter.getAccountListSize()) {
|
||||
if (checkLoadedSource() === MainApplicationWindow.LoadedSource.MainView) {
|
||||
cleanupMainView();
|
||||
}
|
||||
Qt.quit();
|
||||
} else {
|
||||
layoutManager.closeToTray();
|
||||
@ -159,14 +158,6 @@ ApplicationWindow {
|
||||
asynchronous: true
|
||||
visible: status == Loader.Ready
|
||||
|
||||
Connections {
|
||||
target: viewCoordinator
|
||||
|
||||
function onRequestAppWindowWizardView() {
|
||||
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
id: connectionMigrationEnded
|
||||
|
||||
@ -182,32 +173,16 @@ ApplicationWindow {
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: mainApplicationLoader.item
|
||||
|
||||
function onLoaderSourceChangeRequested(sourceToLoad) {
|
||||
if (sourceToLoad === MainApplicationWindow.LoadedSource.WizardView)
|
||||
setMainLoaderSource(JamiQmlUtils.wizardViewLoadPath);
|
||||
else if (sourceToLoad === MainApplicationWindow.LoadedSource.AccountMigrationView)
|
||||
setMainLoaderSource(JamiQmlUtils.accountMigrationViewLoadPath);
|
||||
else
|
||||
setMainLoaderSource(JamiQmlUtils.mainViewLoadPath);
|
||||
}
|
||||
}
|
||||
|
||||
// Set `visible = false` when loading a new QML file.
|
||||
onSourceChanged: windowSettingsLoaded = false
|
||||
|
||||
onLoaded: {
|
||||
if (checkLoadedSource() === MainApplicationWindow.LoadedSource.WizardView) {
|
||||
// Onboarding wizard window, these settings are fixed.
|
||||
// - window screen will default to the primary
|
||||
// - the window will showNormal once windowSettingsLoaded is
|
||||
// set to true(then forcing visible to true)
|
||||
appWindow.width = JamiTheme.wizardViewMinWidth;
|
||||
appWindow.height = JamiTheme.wizardViewMinHeight;
|
||||
appWindow.minimumWidth = JamiTheme.wizardViewMinWidth;
|
||||
appWindow.minimumHeight = JamiTheme.wizardViewMinHeight;
|
||||
if (UtilsAdapter.getAccountListSize() === 0) {
|
||||
layoutManager.restoreWindowSettings();
|
||||
if (!viewCoordinator.rootView)
|
||||
// Set the viewCoordinator's root item.
|
||||
viewCoordinator.init(item);
|
||||
viewCoordinator.present("WizardView");
|
||||
} else {
|
||||
// Main window, load any valid app settings, and allow the
|
||||
// layoutManager to handle as much as possible.
|
||||
@ -220,8 +195,9 @@ ApplicationWindow {
|
||||
viewCoordinator.present("WelcomePage");
|
||||
viewCoordinator.preload("ConversationView");
|
||||
});
|
||||
// Set the viewCoordinator's root item.
|
||||
viewCoordinator.init(item);
|
||||
if (!viewCoordinator.rootView)
|
||||
// Set the viewCoordinator's root item.
|
||||
viewCoordinator.init(item);
|
||||
if (CurrentAccountToMigrate.accountToMigrateListSize > 0)
|
||||
viewCoordinator.present("AccountMigrationView");
|
||||
}
|
||||
@ -235,8 +211,8 @@ ApplicationWindow {
|
||||
// Quiet check for updates on start if set to.
|
||||
if (Qt.platform.os.toString() === "windows") {
|
||||
if (UtilsAdapter.getAppValue(Settings.AutoUpdate)) {
|
||||
UpdateManager.checkForUpdates(true);
|
||||
UpdateManager.setAutoUpdateCheck(true);
|
||||
AppVersionManager.checkForUpdates(true);
|
||||
AppVersionManager.setAutoUpdateCheck(true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -263,6 +239,10 @@ ApplicationWindow {
|
||||
Connections {
|
||||
target: MainApplication
|
||||
|
||||
function onAboutToQuit() {
|
||||
cleanupMainView()
|
||||
}
|
||||
|
||||
function onCloseRequested() {
|
||||
close(true);
|
||||
}
|
||||
@ -288,7 +268,7 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
function presentUpdateInfoDialog(infoText) {
|
||||
viewCoordinator.presentDialog(appWindow, "commoncomponents/SimpleMessageDialog.qml", {
|
||||
return viewCoordinator.presentDialog(appWindow, "commoncomponents/SimpleMessageDialog.qml", {
|
||||
"title": JamiStrings.updateDialogTitle,
|
||||
"infoText": infoText,
|
||||
"buttonTitles": [JamiStrings.optionOk],
|
||||
@ -297,10 +277,40 @@ ApplicationWindow {
|
||||
});
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UpdateManager
|
||||
function presentUpdateConfirmInstallDialog(switchToBeta=false) {
|
||||
return viewCoordinator.presentDialog(appWindow, "commoncomponents/SimpleMessageDialog.qml", {
|
||||
"title": JamiStrings.updateDialogTitle,
|
||||
"infoText": switchToBeta ? JamiStrings.confirmBeta : JamiStrings.updateFound,
|
||||
"buttonTitles": [JamiStrings.optionUpgrade, JamiStrings.optionLater],
|
||||
"buttonStyles": [SimpleMessageDialog.ButtonStyle.TintedBlue, SimpleMessageDialog.ButtonStyle.TintedBlue],
|
||||
"buttonCallBacks": [function () {
|
||||
AppVersionManager.applyUpdates(switchToBeta);
|
||||
}]
|
||||
});
|
||||
}
|
||||
|
||||
function onUpdateDownloadStarted() {
|
||||
function translateErrorToString(error) {
|
||||
switch (error) {
|
||||
case NetworkManager.DISCONNECTED:
|
||||
return JamiStrings.networkDisconnected;
|
||||
case NetworkManager.CONTENT_NOT_FOUND:
|
||||
return JamiStrings.contentNotFoundError;
|
||||
case NetworkManager.ACCESS_DENIED:
|
||||
return JamiStrings.accessError;
|
||||
case NetworkManager.SSL_ERROR:
|
||||
return JamiStrings.updateSSLError;
|
||||
case NetworkManager.CANCELED:
|
||||
return JamiStrings.updateDownloadCanceled;
|
||||
case NetworkManager.NETWORK_ERROR:
|
||||
default:
|
||||
return JamiStrings.updateNetworkError;
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: AppVersionManager
|
||||
|
||||
function onDownloadStarted() {
|
||||
viewCoordinator.presentDialog(appWindow, "settingsview/components/UpdateDownloadDialog.qml", {
|
||||
"title": JamiStrings.updateDialogTitle
|
||||
});
|
||||
@ -308,41 +318,22 @@ ApplicationWindow {
|
||||
|
||||
function onUpdateCheckReplyReceived(ok, found) {
|
||||
if (!ok) {
|
||||
// Show an error dialog describing that we could not successfully check for an update.
|
||||
presentUpdateInfoDialog(JamiStrings.updateCheckError);
|
||||
return;
|
||||
}
|
||||
if (!found) {
|
||||
// Show a dialog describing that no update was found.
|
||||
presentUpdateInfoDialog(JamiStrings.updateNotFound);
|
||||
} else {
|
||||
viewCoordinator.presentDialog(appWindow, "commoncomponents/SimpleMessageDialog.qml", {
|
||||
"title": JamiStrings.updateDialogTitle,
|
||||
"infoText": JamiStrings.updateFound,
|
||||
"buttonTitles": [JamiStrings.optionUpgrade, JamiStrings.optionLater],
|
||||
"buttonStyles": [SimpleMessageDialog.ButtonStyle.TintedBlue, SimpleMessageDialog.ButtonStyle.TintedBlue],
|
||||
"buttonCallBacks": [function () {
|
||||
UpdateManager.applyUpdates();
|
||||
}]
|
||||
});
|
||||
// Show a dialog describing that an update were found, and offering to install it.
|
||||
presentUpdateConfirmInstallDialog()
|
||||
}
|
||||
}
|
||||
|
||||
function onUpdateErrorOccurred(error) {
|
||||
presentUpdateInfoDialog((function () {
|
||||
switch (error) {
|
||||
case NetworkManager.ACCESS_DENIED:
|
||||
return JamiStrings.genericError;
|
||||
case NetworkManager.DISCONNECTED:
|
||||
return JamiStrings.networkDisconnected;
|
||||
case NetworkManager.NETWORK_ERROR:
|
||||
return JamiStrings.updateNetworkError;
|
||||
case NetworkManager.SSL_ERROR:
|
||||
return JamiStrings.updateSSLError;
|
||||
case NetworkManager.CANCELED:
|
||||
return JamiStrings.updateDownloadCanceled;
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
})());
|
||||
function onNetworkErrorOccurred(error) {
|
||||
var errorStr = translateErrorToString(error);
|
||||
presentUpdateInfoDialog(errorStr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -27,7 +27,10 @@ QtObject {
|
||||
required property QtObject viewManager
|
||||
|
||||
signal initialized
|
||||
signal requestAppWindowWizardView
|
||||
|
||||
function requestAppWindowWizardView() {
|
||||
viewCoordinator.present("WizardView");
|
||||
}
|
||||
|
||||
// A map of view names to file paths for QML files that define each view.
|
||||
property variant resources: {
|
||||
@ -71,7 +74,7 @@ QtObject {
|
||||
// Create, present, and return a dialog object.
|
||||
function presentDialog(parent, path, props = {}) {
|
||||
// Open the dialog once the object is created
|
||||
return viewManager.createView(path, parent, function (obj) {
|
||||
return viewManager.createUniqueView(path, parent, function (obj) {
|
||||
const doneCb = function () {
|
||||
viewManager.destroyView(path);
|
||||
};
|
||||
|
||||
@ -36,36 +36,70 @@ QtObject {
|
||||
}
|
||||
}
|
||||
|
||||
// Create a view from a path only if it doesn't already exist. This is used
|
||||
// by the view coordinator to create views that are not self-destructing
|
||||
// (main views) and only exist once per instance of the app.
|
||||
function createView(path, parent = null, cb = null, props = {}) {
|
||||
if (views.hasOwnProperty(path)) {
|
||||
// an instance of <path> already exists
|
||||
const component = Qt.createComponent(Qt.resolvedUrl(path));
|
||||
return createViewFromComponent(component, path, parent, cb, props);
|
||||
}
|
||||
|
||||
// Create a new view. Useful when we want to create multiple views that are
|
||||
// self-destructing (dialogs).
|
||||
function createUniqueView(path, parent = null, cb = null, props = {}) {
|
||||
const component = Qt.createComponent(Qt.resolvedUrl(path));
|
||||
return createViewFromComponent(component, getViewName(path), parent, cb,
|
||||
props);
|
||||
}
|
||||
|
||||
// Create a new view from a component. If a view with the same path already
|
||||
// exists, it is returned instead.
|
||||
function createViewFromComponent(component, viewName, parent = null,
|
||||
cb = null, props = {}) {
|
||||
if (views.hasOwnProperty(viewName)) {
|
||||
// an instance of the view already exists
|
||||
if (cb !== null) {
|
||||
cb(views[path])
|
||||
cb(views[viewName])
|
||||
}
|
||||
return views[path]
|
||||
return views[viewName]
|
||||
}
|
||||
const component = Qt.createComponent(Qt.resolvedUrl(path))
|
||||
if (component.status === Component.Ready) {
|
||||
const obj = component.createObject(parent, props)
|
||||
if (obj === null) {
|
||||
print("error creating object")
|
||||
console.error("error creating object")
|
||||
return null
|
||||
}
|
||||
views[path] = obj
|
||||
views[viewName] = obj
|
||||
// Set the view name to the object name if it has one.
|
||||
const viewName = obj.objectName.toString() !== '' ? obj.objectName : path.replace(/^.*[\\\/]/, '').replace(/\.[^/.]+$/, "")
|
||||
viewPaths[viewName] = path
|
||||
const friendlyName = obj.objectName.toString() !== '' ?
|
||||
obj.objectName :
|
||||
viewName.replace(/^.*[\\\/]/, '').replace(/\.[^/.]+$/, "")
|
||||
viewPaths[friendlyName] = viewName
|
||||
if (cb !== null) {
|
||||
cb(obj)
|
||||
}
|
||||
return views[path]
|
||||
return views[viewName]
|
||||
}
|
||||
print("error creating component", path)
|
||||
console.error("error creating component", component.url)
|
||||
console.error(component.errorString())
|
||||
Qt.exit(1)
|
||||
return null
|
||||
}
|
||||
|
||||
// Finds a unique view name for a given path by appending a number to the
|
||||
// base name. For example, if a view named "MyView" already exists, the next
|
||||
// view will be named "MyView_1".
|
||||
function getViewName(path) {
|
||||
const baseName = path.replace(/^.*[\\\/]/, '').replace(/\.[^/.]+$/, "")
|
||||
let viewName = baseName
|
||||
let suffix = 1
|
||||
while (views.hasOwnProperty(viewName)) {
|
||||
viewName = `${baseName}_${suffix}`
|
||||
suffix++
|
||||
}
|
||||
return viewName
|
||||
}
|
||||
|
||||
function destroyView(path) {
|
||||
// The view may already have been destroyed.
|
||||
if (!views.hasOwnProperty(path)) {
|
||||
|
||||
@ -34,10 +34,12 @@ AccountAdapter::AccountAdapter(AppSettingsManager* settingsManager,
|
||||
, settingsManager_(settingsManager)
|
||||
, systemTray_(systemTray)
|
||||
, accountListModel_(new AccountListModel(instance))
|
||||
, deviceItemListModel_(new DeviceItemListModel(instance))
|
||||
, deviceItemListModel_(new DeviceItemListModel(instance, parent))
|
||||
, moderatorListModel_(new ModeratorListModel(instance, parent))
|
||||
{
|
||||
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, accountListModel_.get(), "AccountListModel");
|
||||
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, deviceItemListModel_.get(), "DeviceItemListModel");
|
||||
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, moderatorListModel_.get(), "ModeratorListModel");
|
||||
|
||||
connect(&lrcInstance_->accountModel(),
|
||||
&AccountModel::accountStatusChanged,
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
|
||||
#include "accountlistmodel.h"
|
||||
#include "deviceitemlistmodel.h"
|
||||
#include "moderatorlistmodel.h"
|
||||
#include "systemtray.h"
|
||||
#include "lrcinstance.h"
|
||||
#include "utils.h"
|
||||
@ -102,5 +103,6 @@ private:
|
||||
|
||||
QScopedPointer<AccountListModel> accountListModel_;
|
||||
QScopedPointer<DeviceItemListModel> deviceItemListModel_;
|
||||
QScopedPointer<ModeratorListModel> moderatorListModel_;
|
||||
};
|
||||
Q_DECLARE_METATYPE(AccountAdapter*)
|
||||
|
||||
@ -33,6 +33,7 @@
|
||||
extern const QString defaultDownloadPath;
|
||||
|
||||
// clang-format off
|
||||
#ifdef APPSTORE
|
||||
#define KEYS \
|
||||
X(MinimizeOnClose, false) \
|
||||
X(DownloadPath, defaultDownloadPath) \
|
||||
@ -46,9 +47,10 @@ extern const QString defaultDownloadPath;
|
||||
X(AppTheme, "System") \
|
||||
X(BaseZoom, 1.0) \
|
||||
X(ParticipantsSide, false) \
|
||||
X(HideSelf, false) \
|
||||
X(HideSelf, true) \
|
||||
X(HideSpectators, false) \
|
||||
X(AutoUpdate, true) \
|
||||
X(PluginAutoUpdate, false) \
|
||||
X(StartMinimized, false) \
|
||||
X(ShowChatviewHorizontally, true) \
|
||||
X(NeverShowMeAgain, false) \
|
||||
@ -56,11 +58,53 @@ extern const QString defaultDownloadPath;
|
||||
X(WindowState, QWindow::AutomaticVisibility) \
|
||||
X(EnableExperimentalSwarm, false) \
|
||||
X(LANG, "SYSTEM") \
|
||||
X(PluginStoreEndpoint, "https://plugins.jami.net") \
|
||||
X(PositionShareDuration, 15) \
|
||||
X(PositionShareLimit, true) \
|
||||
X(FlipSelf, true) \
|
||||
X(ShowMardownOption, false) \
|
||||
X(ShowSendOption, false)
|
||||
X(ChatViewEnterIsNewLine, false) \
|
||||
X(ShowSendOption, false) \
|
||||
X(EnablePtt, false) \
|
||||
X(pttKey, 36)
|
||||
#else
|
||||
#define KEYS \
|
||||
X(MinimizeOnClose, false) \
|
||||
X(DownloadPath, defaultDownloadPath) \
|
||||
X(ScreenshotPath, {}) \
|
||||
X(EnableNotifications, true) \
|
||||
X(EnableTypingIndicator, true) \
|
||||
X(EnableReadReceipt, true) \
|
||||
X(AcceptTransferBelow, 20) \
|
||||
X(AutoAcceptFiles, true) \
|
||||
X(DisplayHyperlinkPreviews, true) \
|
||||
X(AppTheme, "System") \
|
||||
X(BaseZoom, 1.0) \
|
||||
X(ParticipantsSide, false) \
|
||||
X(HideSelf, true) \
|
||||
X(HideSpectators, false) \
|
||||
X(AutoUpdate, true) \
|
||||
X(PluginAutoUpdate, false) \
|
||||
X(StartMinimized, false) \
|
||||
X(ShowChatviewHorizontally, true) \
|
||||
X(NeverShowMeAgain, false) \
|
||||
X(WindowGeometry, QRectF(qQNaN(), qQNaN(), 0., 0.)) \
|
||||
X(WindowState, QWindow::AutomaticVisibility) \
|
||||
X(EnableExperimentalSwarm, false) \
|
||||
X(LANG, "SYSTEM") \
|
||||
X(PluginStoreEndpoint, "https://plugins.jami.net") \
|
||||
X(PositionShareDuration, 15) \
|
||||
X(PositionShareLimit, true) \
|
||||
X(FlipSelf, true) \
|
||||
X(ShowMardownOption, false) \
|
||||
X(ChatViewEnterIsNewLine, false) \
|
||||
X(ShowSendOption, false) \
|
||||
X(DonationVisibleDate, "2023-11-01 05:00") \
|
||||
X(IsDonationVisible, true) \
|
||||
X(DonationEndDate, "2024-01-01 00:00") \
|
||||
X(EnablePtt, false) \
|
||||
X(pttKey, 36)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* A class to expose settings keys in both c++ and QML.
|
||||
|
||||
220
src/app/appversionmanager.cpp
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2023 Savoir-faire Linux Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "appversionmanager.h"
|
||||
|
||||
#include "lrcinstance.h"
|
||||
#include "version.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QTimer>
|
||||
#include <QDir>
|
||||
|
||||
#ifdef BETA
|
||||
static constexpr bool isBeta = true;
|
||||
#else
|
||||
static constexpr bool isBeta = false;
|
||||
#endif
|
||||
|
||||
static constexpr int updatePeriod = 1000 * 60 * 60 * 24; // one day in millis
|
||||
static constexpr char downloadUrl[] = "https://dl.jami.net/windows";
|
||||
static constexpr char versionSubUrl[] = "/version";
|
||||
static constexpr char betaVersionSubUrl[] = "/beta/version";
|
||||
static constexpr char msiSubUrl[] = "/jami.release.x64.msi";
|
||||
static constexpr char betaMsiSubUrl[] = "/beta/jami.beta.x64.msi";
|
||||
|
||||
struct AppVersionManager::Impl : public QObject
|
||||
{
|
||||
Impl(const QString& url, LRCInstance* instance, AppVersionManager& parent)
|
||||
: QObject(nullptr)
|
||||
, parent_(parent)
|
||||
, lrcInstance_(instance)
|
||||
, baseUrlString_(url.isEmpty() ? downloadUrl : url)
|
||||
, updateTimer_(new QTimer(this))
|
||||
{
|
||||
connect(updateTimer_, &QTimer::timeout, this, [this] {
|
||||
// Quiet period update check.
|
||||
parent_.checkForUpdates(true);
|
||||
});
|
||||
};
|
||||
~Impl() = default;
|
||||
|
||||
void checkForUpdates(bool quiet)
|
||||
{
|
||||
parent_.disconnect();
|
||||
// Fail without UI if this is a programmatic check.
|
||||
if (!quiet)
|
||||
connect(&parent_,
|
||||
&NetworkManager::errorOccurred,
|
||||
&parent_,
|
||||
&AppVersionManager::networkErrorOccurred);
|
||||
|
||||
cleanUpdateFiles();
|
||||
const QUrl versionUrl {isBeta ? QUrl::fromUserInput(baseUrlString_ + betaVersionSubUrl)
|
||||
: QUrl::fromUserInput(baseUrlString_ + versionSubUrl)};
|
||||
parent_.sendGetRequest(versionUrl, [this, quiet](const QByteArray& latestVersionString) {
|
||||
if (latestVersionString.isEmpty()) {
|
||||
qWarning() << "Error checking version";
|
||||
if (!quiet)
|
||||
Q_EMIT parent_.updateCheckReplyReceived(false);
|
||||
return;
|
||||
}
|
||||
auto currentVersion = QString(VERSION_STRING).toULongLong();
|
||||
auto latestVersion = latestVersionString.toULongLong();
|
||||
const QString channelStr = isBeta ? "beta" : "stable";
|
||||
const auto newVersionFound = latestVersion > currentVersion;
|
||||
qInfo().noquote() << "--------- Version info ------------"
|
||||
<< QString("\n - Current: %1 (%2)").arg(currentVersion).arg(channelStr);
|
||||
if (newVersionFound) {
|
||||
qDebug() << " - Latest: " << latestVersion;
|
||||
Q_EMIT parent_.updateCheckReplyReceived(true, true);
|
||||
} else if (!quiet) {
|
||||
Q_EMIT parent_.updateCheckReplyReceived(true, false);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
void applyUpdates(bool beta = false)
|
||||
{
|
||||
parent_.disconnect();
|
||||
connect(&parent_,
|
||||
&NetworkManager::errorOccurred,
|
||||
&parent_,
|
||||
&AppVersionManager::networkErrorOccurred);
|
||||
|
||||
const QUrl downloadUrl {(beta || isBeta)
|
||||
? QUrl::fromUserInput(baseUrlString_ + betaMsiSubUrl)
|
||||
: QUrl::fromUserInput(baseUrlString_ + msiSubUrl)};
|
||||
|
||||
const auto lastDownloadReplyId = parent_.replyId_;
|
||||
parent_.replyId_ = parent_.downloadFile(
|
||||
downloadUrl,
|
||||
lastDownloadReplyId,
|
||||
[downloadUrl](bool success, const QString& errorMessage) {
|
||||
Q_UNUSED(success)
|
||||
Q_UNUSED(errorMessage)
|
||||
QProcess process;
|
||||
auto basePath = QDir::tempPath() + QDir::separator();
|
||||
auto msiPath = QDir::toNativeSeparators(basePath + downloadUrl.fileName());
|
||||
auto logPath = QDir::toNativeSeparators(basePath + "jami_x64_install.log");
|
||||
process.startDetached("msiexec",
|
||||
QStringList() << "/i" << msiPath << "/passive"
|
||||
<< "/norestart"
|
||||
<< "WIXNONUILAUNCH=1"
|
||||
<< "/L*V" << logPath);
|
||||
},
|
||||
QDir::tempPath());
|
||||
};
|
||||
|
||||
void cancelUpdate()
|
||||
{
|
||||
parent_.cancelDownload(parent_.replyId_);
|
||||
};
|
||||
|
||||
void setAutoUpdateCheck(bool state)
|
||||
{
|
||||
// Quiet check for updates periodically, if set to.
|
||||
if (!state) {
|
||||
updateTimer_->stop();
|
||||
return;
|
||||
}
|
||||
updateTimer_->start(updatePeriod);
|
||||
};
|
||||
|
||||
void cleanUpdateFiles()
|
||||
{
|
||||
// Delete all logs and msi in the temporary directory before launching.
|
||||
const QString dir = QDir::tempPath();
|
||||
QDir log_dir(dir, {"jami*.log"});
|
||||
for (const QString& filename : log_dir.entryList()) {
|
||||
log_dir.remove(filename);
|
||||
}
|
||||
QDir msi_dir(dir, {"jami*.msi"});
|
||||
for (const QString& filename : msi_dir.entryList()) {
|
||||
msi_dir.remove(filename);
|
||||
}
|
||||
QDir version_dir(dir, {"version"});
|
||||
for (const QString& filename : version_dir.entryList()) {
|
||||
version_dir.remove(filename);
|
||||
}
|
||||
};
|
||||
|
||||
AppVersionManager& parent_;
|
||||
|
||||
LRCInstance* lrcInstance_ {nullptr};
|
||||
QString baseUrlString_;
|
||||
QTimer* updateTimer_;
|
||||
};
|
||||
|
||||
AppVersionManager::AppVersionManager(const QString& url,
|
||||
ConnectivityMonitor* cm,
|
||||
LRCInstance* instance,
|
||||
QObject* parent)
|
||||
: NetworkManager(cm, parent)
|
||||
, replyId_(0)
|
||||
, pimpl_(std::make_unique<Impl>(url, instance, *this))
|
||||
{}
|
||||
|
||||
AppVersionManager::~AppVersionManager()
|
||||
{
|
||||
cancelDownload(replyId_);
|
||||
}
|
||||
|
||||
void
|
||||
AppVersionManager::checkForUpdates(bool quiet)
|
||||
{
|
||||
pimpl_->checkForUpdates(quiet);
|
||||
}
|
||||
|
||||
void
|
||||
AppVersionManager::applyUpdates(bool beta)
|
||||
{
|
||||
pimpl_->applyUpdates(beta);
|
||||
}
|
||||
|
||||
void
|
||||
AppVersionManager::cancelUpdate()
|
||||
{
|
||||
pimpl_->cancelUpdate();
|
||||
}
|
||||
|
||||
void
|
||||
AppVersionManager::setAutoUpdateCheck(bool state)
|
||||
{
|
||||
pimpl_->setAutoUpdateCheck(state);
|
||||
}
|
||||
|
||||
bool
|
||||
AppVersionManager::isCurrentVersionBeta()
|
||||
{
|
||||
return isBeta;
|
||||
}
|
||||
|
||||
bool
|
||||
AppVersionManager::isUpdaterEnabled()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
AppVersionManager::isAutoUpdaterEnabled()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2023 Savoir-faire Linux Inc.
|
||||
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -25,51 +24,35 @@
|
||||
class LRCInstance;
|
||||
class ConnectivityMonitor;
|
||||
|
||||
class UpdateManager final : public NetworkManager
|
||||
class AppVersionManager final : public NetworkManager
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY(UpdateManager)
|
||||
Q_DISABLE_COPY(AppVersionManager)
|
||||
public:
|
||||
explicit UpdateManager(const QString& url,
|
||||
ConnectivityMonitor* cm,
|
||||
LRCInstance* instance = nullptr,
|
||||
QObject* parent = nullptr);
|
||||
~UpdateManager();
|
||||
|
||||
enum Status { STARTED, FINISHED };
|
||||
Q_ENUM(Status)
|
||||
explicit AppVersionManager(const QString& url,
|
||||
ConnectivityMonitor* cm,
|
||||
LRCInstance* instance = nullptr,
|
||||
QObject* parent = nullptr);
|
||||
~AppVersionManager();
|
||||
|
||||
Q_INVOKABLE void checkForUpdates(bool quiet = false);
|
||||
Q_INVOKABLE void applyUpdates(bool beta = false);
|
||||
Q_INVOKABLE void cancelUpdate();
|
||||
Q_INVOKABLE void setAutoUpdateCheck(bool state);
|
||||
Q_INVOKABLE bool isCurrentVersionBeta();
|
||||
Q_INVOKABLE bool isUpdaterEnabled();
|
||||
Q_INVOKABLE bool isAutoUpdaterEnabled();
|
||||
Q_INVOKABLE void cancelDownload();
|
||||
|
||||
void downloadFile(const QUrl& url,
|
||||
std::function<void(bool, const QString&)> onDoneCallback,
|
||||
const QString& filePath);
|
||||
Q_INVOKABLE void setAutoUpdateCheck(bool state);
|
||||
Q_INVOKABLE void cancelUpdate();
|
||||
Q_INVOKABLE bool isCurrentVersionBeta();
|
||||
|
||||
Q_SIGNALS:
|
||||
void statusChanged(UpdateManager::Status status);
|
||||
void downloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
|
||||
|
||||
void updateCheckReplyReceived(bool ok, bool found = false);
|
||||
void updateErrorOccurred(const NetworkManager::GetError& error);
|
||||
void updateDownloadStarted();
|
||||
void updateDownloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
|
||||
void updateDownloadFinished();
|
||||
void appCloseRequested();
|
||||
void updateCheckReplyReceived(bool ok, bool found = false);
|
||||
void updateDownloadProgressChanged(qint64 bytesRead, qint64 totalBytes);
|
||||
void networkErrorOccurred(const NetworkManager::GetError& error);
|
||||
|
||||
private:
|
||||
void resetDownload();
|
||||
QNetworkReply* downloadReply_ {nullptr};
|
||||
QScopedPointer<QFile> file_;
|
||||
|
||||
private:
|
||||
int replyId_;
|
||||
struct Impl;
|
||||
friend struct Impl;
|
||||
std::unique_ptr<Impl> pimpl_;
|
||||
};
|
||||
Q_DECLARE_METATYPE(UpdateManager*)
|
||||
Q_DECLARE_METATYPE(AppVersionManager*)
|
||||
@ -195,8 +195,28 @@ AvAdapter::shareFile(const QString& filePath)
|
||||
auto callId = lrcInstance_->getCurrentCallId();
|
||||
if (!callId.isEmpty()) {
|
||||
muteCamera_ = !isCapturing();
|
||||
lrcInstance_->getCurrentCallModel()
|
||||
->addMedia(callId, filePath, lrc::api::CallModel::MediaRequestType::FILESHARING);
|
||||
auto resource = QString("%1%2%3")
|
||||
.arg(libjami::Media::VideoProtocolPrefix::FILE)
|
||||
.arg(libjami::Media::VideoProtocolPrefix::SEPARATOR)
|
||||
.arg(QUrl(filePath).toLocalFile());
|
||||
|
||||
Utils::oneShotConnect(&lrcInstance_->avModel(),
|
||||
&lrc::api::AVModel::fileOpened,
|
||||
this,
|
||||
[this, callId, filePath, resource](bool hasAudio, bool hasVideo) {
|
||||
// TODO: allow audio only sharing
|
||||
if (hasVideo) { // only start sharing if video is available
|
||||
lrcInstance_->avModel().pausePlayer(resource, false);
|
||||
lrcInstance_->avModel().setAutoRestart(resource, true);
|
||||
lrcInstance_->getCurrentCallModel()
|
||||
->addMedia(callId, filePath, lrc::api::CallModel::MediaRequestType::FILESHARING, false, hasAudio);
|
||||
} else {
|
||||
// Close media player because we are not going to start sharing
|
||||
lrcInstance_->avModel().closeMediaPlayer(resource);
|
||||
}
|
||||
});
|
||||
|
||||
lrcInstance_->avModel().createMediaPlayer(resource);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -53,21 +53,21 @@ public:
|
||||
return {};
|
||||
}
|
||||
|
||||
auto imageId = idInfo.at(1);
|
||||
const auto& imageId = idInfo.at(1);
|
||||
if (!imageId.size()) {
|
||||
qWarning() << Q_FUNC_INFO << "Missing id in the image url";
|
||||
return {};
|
||||
}
|
||||
|
||||
auto type = idInfo.at(0);
|
||||
const auto& type = idInfo.at(0);
|
||||
if (type == "conversation") {
|
||||
if (imageId == "temp")
|
||||
return Utils::tempConversationAvatar(requestedSize);
|
||||
|
||||
return Utils::conversationAvatar(lrcInstance_, imageId, requestedSize);
|
||||
} else if (type == "account")
|
||||
}
|
||||
if (type == "account")
|
||||
return Utils::accountPhoto(lrcInstance_, imageId, requestedSize);
|
||||
else if (type == "contact")
|
||||
if (type == "contact")
|
||||
return Utils::contactPhoto(lrcInstance_, imageId, requestedSize);
|
||||
|
||||
qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url";
|
||||
|
||||
@ -77,6 +77,7 @@ void
|
||||
AvatarRegistry::onProfileUpdated(const QString& uri)
|
||||
{
|
||||
auto& convInfo = lrcInstance_->getConversationFromPeerUri(uri);
|
||||
addOrUpdateImage(uri);
|
||||
if (convInfo.uid.isEmpty())
|
||||
return;
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
|
||||
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
|
||||
* Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
|
||||
* Author: Capucine Berthet <capucine.berthet@savoirfairelinux.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -47,7 +48,7 @@ CallAdapter::CallAdapter(SystemTray* systemTray, LRCInstance* instance, QObject*
|
||||
timer = new QTimer(this);
|
||||
connect(timer, &QTimer::timeout, this, &CallAdapter::updateAdvancedInformation);
|
||||
|
||||
overlayModel_.reset(new CallOverlayModel(lrcInstance_, this));
|
||||
overlayModel_.reset(new CallOverlayModel(lrcInstance_, listener_, this));
|
||||
QML_REGISTERSINGLETONTYPE_POBJECT(NS_MODELS, overlayModel_.get(), "CallOverlayModel");
|
||||
|
||||
accountId_ = lrcInstance_->get_currentAccountId();
|
||||
@ -97,6 +98,65 @@ CallAdapter::CallAdapter(SystemTray* systemTray, LRCInstance* instance, QObject*
|
||||
&LRCInstance::selectedConvUidChanged,
|
||||
this,
|
||||
&CallAdapter::saveConferenceSubcalls);
|
||||
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
connectPtt();
|
||||
#endif
|
||||
}
|
||||
|
||||
CallAdapter::~CallAdapter()
|
||||
{
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
disconnectPtt();
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CallAdapter::connectPtt()
|
||||
{
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
if (listener_->getPttState()) {
|
||||
QObject::connect(
|
||||
listener_,
|
||||
&PTTListener::pttKeyPressed,
|
||||
this,
|
||||
[this]() {
|
||||
const auto callId
|
||||
= lrcInstance_->getCallIdForConversationUid(lrcInstance_->get_selectedConvUid(),
|
||||
accountId_);
|
||||
try {
|
||||
isMicrophoneMuted_ = isMuted(callId);
|
||||
if (isMicrophoneMuted_)
|
||||
muteAudioToggle();
|
||||
} catch (const std::exception& e) {
|
||||
qWarning() << e.what();
|
||||
}
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
|
||||
QObject::connect(
|
||||
listener_,
|
||||
&PTTListener::pttKeyReleased,
|
||||
this,
|
||||
[this]() {
|
||||
if (isMicrophoneMuted_) {
|
||||
muteAudioToggle();
|
||||
}
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CallAdapter::disconnectPtt()
|
||||
{
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
if (listener_->getPttState()) {
|
||||
QObject::disconnect(listener_, &PTTListener::pttKeyPressed, this, nullptr);
|
||||
QObject::disconnect(listener_, &PTTListener::pttKeyReleased, this, nullptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -172,6 +232,12 @@ CallAdapter::onCallStarted(const QString& callId)
|
||||
// update call Information list by adding the new information related to the callId
|
||||
callInformationListModel_->addElement(
|
||||
qMakePair(callId, callModel->advancedInformationForCallId(callId)));
|
||||
if (listener_->getPttState()){
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
listener_->startListening();
|
||||
toMute += callId;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -181,6 +247,10 @@ CallAdapter::onCallEnded(const QString& callId)
|
||||
return;
|
||||
// update call Information list by removing information related to the callId
|
||||
callInformationListModel_->removeElement(callId);
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
if (listener_->getPttState() && !hasCall_)
|
||||
listener_->stopListening();
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -271,6 +341,15 @@ CallAdapter::onCallStatusChanged(const QString& callId, int code)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CallAdapter::onCallInfosChanged(const QString& accountId, const QString& callId)
|
||||
{
|
||||
Q_UNUSED(accountId)
|
||||
auto mute = toMute.remove(callId);
|
||||
if (mute && listener_->getPttState())
|
||||
muteAudioToggle();
|
||||
}
|
||||
|
||||
void
|
||||
CallAdapter::onCallAddedToConference(const QString& callId, const QString& confId)
|
||||
{
|
||||
@ -494,6 +573,12 @@ CallAdapter::connectCallModel(const QString& accountId)
|
||||
QOverload<const QString&, int>::of(&CallAdapter::onCallStatusChanged),
|
||||
Qt::UniqueConnection);
|
||||
|
||||
connect(accInfo.callModel.get(),
|
||||
&CallModel::callInfosChanged,
|
||||
this,
|
||||
&CallAdapter::onCallInfosChanged,
|
||||
Qt::UniqueConnection);
|
||||
|
||||
connect(accInfo.callModel.get(),
|
||||
&CallModel::callAddedToConference,
|
||||
this,
|
||||
@ -816,6 +901,23 @@ CallAdapter::holdThisCallToggle()
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
CallAdapter::isMuted(const QString& callId)
|
||||
{
|
||||
if (!(callId.isEmpty() || !lrcInstance_->getCurrentCallModel()->hasCall(callId))) {
|
||||
auto* callModel = lrcInstance_->getCurrentCallModel();
|
||||
if (callModel->hasCall(callId)) {
|
||||
const auto callInfo = lrcInstance_->getCurrentCallModel()->getCall(callId);
|
||||
auto mute = false;
|
||||
for (const auto& m : callInfo.mediaList)
|
||||
if (m[libjami::Media::MediaAttributeKey::LABEL] == "audio_0")
|
||||
mute = m[libjami::Media::MediaAttributeKey::MUTED] == TRUE_STR;
|
||||
return mute;
|
||||
}
|
||||
}
|
||||
throw std::runtime_error("CallAdapter::isMuted: callId is empty or call does not exist");
|
||||
}
|
||||
|
||||
void
|
||||
CallAdapter::muteAudioToggle()
|
||||
{
|
||||
@ -825,13 +927,10 @@ CallAdapter::muteAudioToggle()
|
||||
return;
|
||||
}
|
||||
auto* callModel = lrcInstance_->getCurrentCallModel();
|
||||
if (callModel->hasCall(callId)) {
|
||||
const auto callInfo = lrcInstance_->getCurrentCallModel()->getCall(callId);
|
||||
auto mute = false;
|
||||
for (const auto& m : callInfo.mediaList)
|
||||
if (m[libjami::Media::MediaAttributeKey::LABEL] == "audio_0")
|
||||
mute = m[libjami::Media::MediaAttributeKey::MUTED] == FALSE_STR;
|
||||
callModel->muteMedia(callId, "audio_0", mute);
|
||||
try {
|
||||
callModel->muteMedia(callId, "audio_0", !isMuted(callId));
|
||||
} catch (const std::exception& e) {
|
||||
qWarning() << e.what();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,10 @@
|
||||
#include "screensaver.h"
|
||||
#include "calloverlaymodel.h"
|
||||
|
||||
#ifdef HAVE_GLOBAL_PTT
|
||||
#include "pttlistener.h"
|
||||
#endif
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QVariant>
|
||||
@ -46,7 +50,7 @@ public:
|
||||
Q_ENUM(MuteStates)
|
||||
|
||||
explicit CallAdapter(SystemTray* systemTray, LRCInstance* instance, QObject* parent = nullptr);
|
||||
~CallAdapter() = default;
|
||||
~CallAdapter();
|
||||
|
||||
public:
|
||||
Q_INVOKABLE void startTimerInformation();
|
||||
@ -76,6 +80,9 @@ public:
|
||||
Q_INVOKABLE void holdThisCallToggle();
|
||||
Q_INVOKABLE void recordThisCallToggle();
|
||||
Q_INVOKABLE void muteAudioToggle();
|
||||
Q_INVOKABLE bool isMuted(const QString& callId);
|
||||
Q_INVOKABLE void connectPtt();
|
||||
Q_INVOKABLE void disconnectPtt();
|
||||
Q_INVOKABLE void muteCameraToggle();
|
||||
Q_INVOKABLE bool isRecordingThisCall();
|
||||
Q_INVOKABLE void muteParticipant(const QString& accountUri,
|
||||
@ -109,6 +116,7 @@ public Q_SLOTS:
|
||||
void onCallAddedToConference(const QString& callId, const QString& confId);
|
||||
void onCallStarted(const QString& callId);
|
||||
void onCallEnded(const QString& callId);
|
||||
void onCallInfosChanged(const QString& accountId, const QString& callId);
|
||||
|
||||
private:
|
||||
void showNotification(const QString& accountId, const QString& convUid);
|
||||
@ -121,6 +129,9 @@ private:
|
||||
SystemTray* systemTray_;
|
||||
QScopedPointer<CallOverlayModel> overlayModel_;
|
||||
VectorString currentConfSubcalls_;
|
||||
|
||||
std::unique_ptr<CallInformationListModel> callInformationListModel_;
|
||||
|
||||
PTTListener* listener_ = new PTTListener(systemTray_->getSettingsManager());
|
||||
bool isMicrophoneMuted_ = true;
|
||||
QSet<QString> toMute;
|
||||
};
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
#include <QEvent>
|
||||
#include <QMouseEvent>
|
||||
#include <QQuickWindow>
|
||||
#include <QKeyEvent>
|
||||
|
||||
IndexRangeFilterProxyModel::IndexRangeFilterProxyModel(QAbstractListModel* parent)
|
||||
: QSortFilterProxyModel(parent)
|
||||
@ -74,10 +75,10 @@ PendingConferenceesListModel::data(const QModelIndex& index, int role) const
|
||||
using namespace PendingConferences;
|
||||
|
||||
// WARNING: not swarm ready
|
||||
lrc::api::call::Status callStatus;
|
||||
QString pendingConferenceeCallId;
|
||||
QString pendingConferenceeContactUri;
|
||||
ContactModel* contactModel {nullptr};
|
||||
lrc::api::call::Status callStatus;
|
||||
try {
|
||||
auto callModel = lrcInstance_->getCurrentCallModel();
|
||||
auto currentPendingConferenceeInfo = callModel->getPendingConferencees().at(index.row());
|
||||
@ -268,7 +269,7 @@ CallControlListModel::clearData()
|
||||
data_.clear();
|
||||
}
|
||||
|
||||
CallOverlayModel::CallOverlayModel(LRCInstance* instance, QObject* parent)
|
||||
CallOverlayModel::CallOverlayModel(LRCInstance* instance, PTTListener* listener, QObject* parent)
|
||||
: QObject(parent)
|
||||
, lrcInstance_(instance)
|
||||
, primaryModel_(new CallControlListModel(this))
|
||||
@ -283,6 +284,10 @@ CallOverlayModel::CallOverlayModel(LRCInstance* instance, QObject* parent)
|
||||
this,
|
||||
&CallOverlayModel::setControlRanges);
|
||||
overflowVisibleModel_->setFilterRole(CallControl::Role::UrgentCount);
|
||||
|
||||
#ifndef HAVE_GLOBAL_PTT
|
||||
listener_ = listener;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -386,6 +391,19 @@ CallOverlayModel::eventFilter(QObject* object, QEvent* event)
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifndef HAVE_GLOBAL_PTT
|
||||
else if (event->type() == QEvent::KeyPress && listener_->getPttState()) {
|
||||
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
|
||||
if (keyEvent->key() == listener_->getCurrentKey() && !keyEvent->isAutoRepeat()) {
|
||||
Q_EMIT pttKeyPressed();
|
||||
}
|
||||
} else if (event->type() == QEvent::KeyRelease && listener_->getPttState()) {
|
||||
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
|
||||
if (keyEvent->key() == listener_->getCurrentKey() && !keyEvent->isAutoRepeat()) {
|
||||
Q_EMIT pttKeyReleased();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return QObject::eventFilter(object, event);
|
||||
}
|
||||
|
||||
|
||||
@ -21,6 +21,9 @@
|
||||
|
||||
#include "lrcinstance.h"
|
||||
#include "qtutils.h"
|
||||
#include "mainapplication.h"
|
||||
|
||||
#include "pttlistener.h"
|
||||
|
||||
#include <QAbstractListModel>
|
||||
#include <QObject>
|
||||
@ -36,7 +39,7 @@
|
||||
|
||||
namespace CallControl {
|
||||
Q_NAMESPACE
|
||||
enum Role { ItemAction = Qt::UserRole + 1, UrgentCount, Enabled};
|
||||
enum Role { ItemAction = Qt::UserRole + 1, UrgentCount, Enabled };
|
||||
Q_ENUM_NS(Role)
|
||||
|
||||
struct Item
|
||||
@ -121,7 +124,7 @@ class CallOverlayModel : public QObject
|
||||
QML_PROPERTY(int, overflowIndex)
|
||||
|
||||
public:
|
||||
CallOverlayModel(LRCInstance* instance, QObject* parent = nullptr);
|
||||
CallOverlayModel(LRCInstance* instance, PTTListener* listener, QObject* parent = nullptr);
|
||||
|
||||
Q_INVOKABLE void addPrimaryControl(const QVariant& action, bool enabled);
|
||||
Q_INVOKABLE void addSecondaryControl(const QVariant& action, bool enabled);
|
||||
@ -142,6 +145,8 @@ public:
|
||||
|
||||
Q_SIGNALS:
|
||||
void mouseMoved(QQuickItem* item);
|
||||
void pttKeyPressed();
|
||||
void pttKeyReleased();
|
||||
|
||||
private Q_SLOTS:
|
||||
void setControlRanges();
|
||||
@ -157,4 +162,8 @@ private:
|
||||
PendingConferenceesListModel* pendingConferenceesModel_;
|
||||
|
||||
QList<QQuickItem*> watchedItems_;
|
||||
|
||||
#ifndef HAVE_GLOBAL_PTT
|
||||
PTTListener* listener_ {nullptr};
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -38,7 +38,7 @@ Item {
|
||||
property string imageId
|
||||
|
||||
readonly property string divider: '_'
|
||||
readonly property string baseProviderPrefix: 'image://avatarImage'
|
||||
readonly property string baseProviderPrefix: 'image://avatarimage'
|
||||
property string typePrefix: {
|
||||
switch (mode) {
|
||||
case Avatar.Mode.Account:
|
||||
|
||||
@ -20,6 +20,7 @@ import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import net.jami.Constants 1.1
|
||||
import "../mainview/components"
|
||||
|
||||
Popup {
|
||||
id: root
|
||||
@ -28,64 +29,80 @@ Popup {
|
||||
property bool autoClose: true
|
||||
property alias backgroundColor: container.color
|
||||
property alias title: titleText.text
|
||||
property var popupContentLoader: containerSubContentLoader
|
||||
property var popupcontainerSubContentLoader: containerSubContentLoader
|
||||
property bool topLayoutVisible: true
|
||||
property alias popupContentLoadStatus: containerSubContentLoader.status
|
||||
property alias popupContent: containerSubContentLoader.sourceComponent
|
||||
property int popupContentPreferredHeight: 0
|
||||
property int popupContentPreferredWidth: 0
|
||||
property int popupContentMargins: 0
|
||||
property int popupContentMargins: JamiTheme.preferredMarginSize
|
||||
|
||||
parent: Overlay.overlay
|
||||
|
||||
// center in parent
|
||||
x: Math.round((parent.width - width) / 2)
|
||||
y: Math.round((parent.height - height) / 2)
|
||||
|
||||
anchors.centerIn: parent
|
||||
modal: true
|
||||
padding: popupContentMargins
|
||||
|
||||
padding: 0
|
||||
|
||||
// A popup is invisible until opened.
|
||||
visible: false
|
||||
focus: true
|
||||
closePolicy: autoClose ? (Popup.CloseOnEscape | Popup.CloseOnPressOutside) : Popup.NoAutoClose
|
||||
|
||||
Rectangle {
|
||||
contentItem: Control {
|
||||
id: container
|
||||
|
||||
anchors.fill: parent
|
||||
property color color: JamiTheme.secondaryBackgroundColor
|
||||
padding: popupContentMargins
|
||||
anchors.margins: popupContentMargins
|
||||
anchors.centerIn: parent
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
background: Rectangle {
|
||||
id: bgRect
|
||||
radius: JamiTheme.modalPopupRadius
|
||||
color: container.color
|
||||
layer.enabled: true
|
||||
layer.effect: DropShadow {
|
||||
horizontalOffset: 3.0
|
||||
verticalOffset: 3.0
|
||||
radius: bgRect.radius * 4
|
||||
color: JamiTheme.shadowColor
|
||||
source: bgRect
|
||||
transparentBorder: true
|
||||
samples: radius + 1
|
||||
}
|
||||
}
|
||||
|
||||
spacing: 0
|
||||
contentItem: ColumnLayout {
|
||||
id: contentLayout
|
||||
|
||||
Text {
|
||||
id: titleText
|
||||
RowLayout {
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.bottomMargin: JamiTheme.preferredMarginSize
|
||||
visible: topLayoutVisible
|
||||
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
Layout.margins: text.length === 0 ? 0 : 10
|
||||
Label {
|
||||
id: titleText
|
||||
|
||||
Layout.preferredHeight: text.length === 0 ? 0 : contentHeight
|
||||
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
|
||||
font.pointSize: JamiTheme.menuFontSize
|
||||
color: JamiTheme.textColor
|
||||
|
||||
font.pointSize: 12
|
||||
color: JamiTheme.textColor
|
||||
|
||||
visible: text.length > 0
|
||||
}
|
||||
|
||||
JamiPushButton {
|
||||
id: closeButton
|
||||
Layout.alignment: Qt.AlignRight
|
||||
imageColor: "grey"
|
||||
normalColor: "transparent"
|
||||
|
||||
source: JamiResources.round_close_24dp_svg
|
||||
onClicked: close()
|
||||
}
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: containerSubContentLoader
|
||||
|
||||
Layout.topMargin: popupContentMargins
|
||||
Layout.bottomMargin: popupContentMargins
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.fillWidth: popupContentPreferredWidth === 0
|
||||
Layout.fillHeight: popupContentPreferredHeight === 0
|
||||
Layout.preferredHeight: popupContentPreferredHeight
|
||||
Layout.preferredWidth: popupContentPreferredWidth
|
||||
}
|
||||
}
|
||||
|
||||
radius: JamiTheme.modalPopupRadius
|
||||
color: JamiTheme.secondaryBackgroundColor
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
@ -102,19 +119,6 @@ Popup {
|
||||
}
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
z: -1
|
||||
width: root.width
|
||||
height: root.height
|
||||
horizontalOffset: 3.0
|
||||
verticalOffset: 3.0
|
||||
radius: container.radius * 4
|
||||
color: JamiTheme.shadowColor
|
||||
source: container
|
||||
transparentBorder: true
|
||||
samples: radius + 1
|
||||
}
|
||||
|
||||
enter: Transition {
|
||||
NumberAnimation {
|
||||
properties: "opacity"
|
||||
|
||||
@ -28,7 +28,7 @@ SBSMessageBase {
|
||||
component JoinCallButton: PushButton {
|
||||
visible: root.isActive
|
||||
toolTipText: JamiStrings.joinCall
|
||||
preferredSize: 40
|
||||
preferredSize: visible ? 40 : 0
|
||||
imageColor: callLabel.color
|
||||
normalColor: "transparent"
|
||||
hoveredColor: Qt.rgba(255, 255, 255, 0.2)
|
||||
@ -84,7 +84,7 @@ SBSMessageBase {
|
||||
}
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
|
||||
font.pixelSize: JamiTheme.emojiBubbleSize
|
||||
font.pointSize: JamiTheme.mediumFontSize
|
||||
font.hintingPreference: Font.PreferNoHinting
|
||||
font.bold: true
|
||||
renderType: Text.NativeRendering
|
||||
|
||||
123
src/app/commoncomponents/ChangePttKeyPopup.qml
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Savoir-faire Linux Inc.
|
||||
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
||||
BaseModalDialog {
|
||||
id: pttPage
|
||||
|
||||
property string bestName: ""
|
||||
property string accountId: ""
|
||||
property int pressedKey: Qt.Key_unknown
|
||||
|
||||
signal accepted
|
||||
signal choiceMade(int chosenKey)
|
||||
|
||||
title: JamiStrings.changeShortcut
|
||||
|
||||
popupContent: ColumnLayout {
|
||||
id: deleteAccountContentColumnLayout
|
||||
anchors.centerIn: parent
|
||||
spacing: JamiTheme.preferredMarginSize
|
||||
|
||||
Component.onCompleted: keyItem.forceActiveFocus()
|
||||
Label {
|
||||
id: instructionLabel
|
||||
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.preferredWidth: JamiTheme.preferredDialogWidth - 4*JamiTheme.preferredMarginSize
|
||||
color: JamiTheme.textColor
|
||||
text: JamiStrings.assignmentIndication
|
||||
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
font.pointSize: JamiTheme.textFontSize
|
||||
font.kerning: true
|
||||
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
Label {
|
||||
id: keyLabel
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
color: JamiTheme.blackColor
|
||||
wrapMode: Text.WordWrap
|
||||
text: ""
|
||||
font.pointSize: JamiTheme.settingsFontSize
|
||||
font.kerning: true
|
||||
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
background: Rectangle {
|
||||
id: backgroundRect
|
||||
|
||||
anchors.centerIn: parent
|
||||
|
||||
width: keyLabel.width + 2 * JamiTheme.preferredMarginSize
|
||||
height: keyLabel.height + JamiTheme.preferredMarginSize
|
||||
color: JamiTheme.lightGrey_
|
||||
border.color: JamiTheme.darkGreyColor
|
||||
radius: 4
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
MaterialButton {
|
||||
id: btnAssign
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
|
||||
|
||||
color: JamiTheme.buttonTintedBlack
|
||||
hoveredColor: JamiTheme.buttonTintedBlackHovered
|
||||
pressedColor: JamiTheme.buttonTintedBlackPressed
|
||||
secondary: true
|
||||
|
||||
text: JamiStrings.assign
|
||||
autoAccelerator: true
|
||||
|
||||
onClicked: {
|
||||
if (!(pressedKey === Qt.Key_unknown)){
|
||||
pttListener.setPttKey(pressedKey);
|
||||
choiceMade(pressedKey);
|
||||
}
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: keyItem
|
||||
|
||||
Keys.onPressed: (event)=>{
|
||||
keyLabel.text = pttListener.keyToString(event.key);
|
||||
pressedKey = event.key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -27,9 +27,6 @@ BaseModalDialog {
|
||||
|
||||
signal accepted
|
||||
|
||||
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
|
||||
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
|
||||
|
||||
property string confirmLabel: ""
|
||||
property string textLabel: ""
|
||||
|
||||
@ -40,7 +37,7 @@ BaseModalDialog {
|
||||
id: labelAction
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: column.width - JamiTheme.preferredMarginSize * 2
|
||||
Layout.maximumWidth: root.width - JamiTheme.preferredMarginSize * 4
|
||||
|
||||
color: JamiTheme.textColor
|
||||
text: root.textLabel
|
||||
@ -55,8 +52,8 @@ BaseModalDialog {
|
||||
|
||||
RowLayout {
|
||||
spacing: 16
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.topMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
MaterialButton {
|
||||
id: primaryBtn
|
||||
|
||||
@ -30,17 +30,16 @@ Column {
|
||||
property int timestamp: Timestamp
|
||||
property string formattedTime: MessagesAdapter.getFormattedTime(Timestamp)
|
||||
property string formattedDay: MessagesAdapter.getFormattedDay(Timestamp)
|
||||
property int seq: MsgSeq.single//a changer par textlabel
|
||||
property int seq: MsgSeq.single
|
||||
property alias messageToSend: textLabel.text
|
||||
|
||||
width: ListView.view ? ListView.view.width : 0
|
||||
spacing: 2
|
||||
topPadding: 12
|
||||
bottomPadding: 12
|
||||
height: timestampItem.height + textLabel.height
|
||||
spacing: 0
|
||||
|
||||
ColumnLayout {
|
||||
Item {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: parent.width
|
||||
height: timestampItem.height + textLabel.height
|
||||
|
||||
TimestampInfo {
|
||||
id: timestampItem
|
||||
@ -49,46 +48,23 @@ Column {
|
||||
showTime: root.showTime
|
||||
formattedTime: root.formattedTime
|
||||
formattedDay: root.formattedDay
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: parent.top
|
||||
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: msg
|
||||
Label {
|
||||
id: textLabel
|
||||
|
||||
width: childrenRect.width
|
||||
height: JamiTheme.contactMessageAvatarSize + 12
|
||||
radius: JamiTheme.contactMessageAvatarSize / 2 + 6
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
color: "transparent"
|
||||
border.width: 1
|
||||
border.color: CurrentConversation.isCoreDialog ? JamiTheme.messageInBgColor : CurrentConversation.color
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: timestampItem.bottom
|
||||
|
||||
RowLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
Avatar {
|
||||
Layout.leftMargin: 6
|
||||
width: JamiTheme.contactMessageAvatarSize
|
||||
height: JamiTheme.contactMessageAvatarSize
|
||||
visible: ActionUri !== ""
|
||||
imageId: ActionUri !== CurrentAccount.uri ? ActionUri : CurrentAccount.id
|
||||
showPresenceIndicator: false
|
||||
mode: ActionUri !== CurrentAccount.uri ? Avatar.Mode.Contact : Avatar.Mode.Account
|
||||
}
|
||||
|
||||
Label {
|
||||
id: textLabel
|
||||
|
||||
Layout.rightMargin: 6
|
||||
width: parent.width
|
||||
text: Body
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
font.pointSize: JamiTheme.contactEventPointSize
|
||||
font.bold: true
|
||||
color: JamiTheme.chatviewTextColor
|
||||
textFormat: TextEdit.PlainText
|
||||
}
|
||||
}
|
||||
text: Body
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
font.pointSize: JamiTheme.smallFontSize
|
||||
color: JamiTheme.chatviewSecondaryInformationColor
|
||||
textFormat: TextEdit.PlainText
|
||||
}
|
||||
}
|
||||
opacity: 0
|
||||
|
||||
@ -68,7 +68,8 @@ BaseModalDialog {
|
||||
id: daemonReconnectPopupTextLabel
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
|
||||
Layout.topMargin: preferredMargin
|
||||
Layout.maximumWidth: root.parent.width - 4 * JamiTheme.preferredMarginSize
|
||||
wrapMode: Text.Wrap
|
||||
|
||||
text: connectionFailed ? JamiStrings.reconnectionFailed : JamiStrings.reconnectDaemon
|
||||
font.pointSize: JamiTheme.textFontSize + 2
|
||||
|
||||
@ -88,8 +88,11 @@ Loader {
|
||||
target: parent
|
||||
enabled: canOpen
|
||||
onHoveredChanged: {
|
||||
dataTransferItem.hoveredLink = enabled && hovered ?
|
||||
("file:///" + Body) : ""
|
||||
if (enabled && hovered) {
|
||||
dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
|
||||
} else {
|
||||
dataTransferItem.hoveredLink = ""
|
||||
}
|
||||
}
|
||||
cursorShape: enabled ?
|
||||
Qt.PointingHandCursor :
|
||||
@ -199,10 +202,12 @@ Loader {
|
||||
Qt.PointingHandCursor :
|
||||
Qt.ArrowCursor
|
||||
onClicked: function (mouse) {
|
||||
dataTransferItem.hoveredLink = canOpen ?
|
||||
("file:///" + Body) : ""
|
||||
if (dataTransferItem.hoveredLink)
|
||||
if (canOpen) {
|
||||
dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
|
||||
Qt.openUrlExternally(new Url(dataTransferItem.hoveredLink))
|
||||
} else {
|
||||
dataTransferItem.hoveredLink = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -303,7 +308,7 @@ Loader {
|
||||
antialiasing: true
|
||||
autoTransform: true
|
||||
asynchronous: true
|
||||
source: "file:///" + Body
|
||||
source: UtilsAdapter.urlFromLocalPath(Body)
|
||||
property real aspectRatio: implicitWidth / implicitHeight
|
||||
property real adjustedWidth: Math.min(maxSize,
|
||||
Math.max(minSize,
|
||||
@ -348,7 +353,7 @@ Loader {
|
||||
antialiasing: true
|
||||
autoTransform: true
|
||||
asynchronous: true
|
||||
source: Body !== undefined ? "file:///" + Body : ''
|
||||
source: Body !== undefined ? UtilsAdapter.urlFromLocalPath(Body) : ''
|
||||
|
||||
// The sourceSize represents the maximum source dimensions.
|
||||
// This should not be a dynamic binding, as property changes
|
||||
|
||||
@ -33,17 +33,15 @@ BaseModalDialog {
|
||||
|
||||
title: JamiStrings.deleteAccount
|
||||
|
||||
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
|
||||
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
|
||||
|
||||
popupContent: ColumnLayout {
|
||||
id: deleteAccountContentColumnLayout
|
||||
anchors.centerIn: parent
|
||||
|
||||
Label {
|
||||
id: labelDeletion
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
|
||||
Layout.maximumWidth: root.width - 4*JamiTheme.preferredMarginSize
|
||||
|
||||
color: JamiTheme.textColor
|
||||
text: JamiStrings.confirmDeleteQuestion
|
||||
@ -51,8 +49,6 @@ BaseModalDialog {
|
||||
font.pointSize: JamiTheme.textFontSize
|
||||
font.kerning: true
|
||||
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
@ -60,7 +56,6 @@ BaseModalDialog {
|
||||
id: labelBestId
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
|
||||
|
||||
color: JamiTheme.textColor
|
||||
text: bestName
|
||||
@ -68,9 +63,6 @@ BaseModalDialog {
|
||||
font.pointSize: JamiTheme.textFontSize
|
||||
font.kerning: true
|
||||
font.bold: true
|
||||
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
@ -78,7 +70,7 @@ BaseModalDialog {
|
||||
id: labelAccountHash
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
|
||||
Layout.preferredWidth: root.width - 4*JamiTheme.preferredMarginSize
|
||||
|
||||
color: JamiTheme.textColor
|
||||
text: accountId
|
||||
@ -87,7 +79,6 @@ BaseModalDialog {
|
||||
font.kerning: true
|
||||
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
@ -97,7 +88,7 @@ BaseModalDialog {
|
||||
visible: !isSIP
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: deleteAccountContentColumnLayout.width - JamiTheme.preferredMarginSize * 2
|
||||
Layout.preferredWidth: root.width - 4*JamiTheme.preferredMarginSize
|
||||
|
||||
text: JamiStrings.deleteAccountInfos
|
||||
|
||||
@ -120,6 +111,7 @@ BaseModalDialog {
|
||||
id: btnDelete
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
|
||||
@ -164,6 +156,7 @@ BaseModalDialog {
|
||||
id: btnCancel
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
|
||||
|
||||
@ -85,10 +85,12 @@ BaseView {
|
||||
clip: true
|
||||
required property bool isMinorPane
|
||||
onWidthChanged: {
|
||||
if (!isSinglePane && ((isRTL && !isMinorPane) || (!isRTL && isMinorPane)))
|
||||
if (!isSinglePane && isMinorPane)
|
||||
previousMinorPaneWidth = width
|
||||
if (!isSinglePane && ((isRTL && isMinorPane) || (!isRTL && !isMinorPane)))
|
||||
if (!isSinglePane && !isMinorPane)
|
||||
previousMajorPaneWidth = width
|
||||
if (isMinorPane)
|
||||
JamiTheme.currentLeftPaneWidth = width
|
||||
}
|
||||
|
||||
Connections {
|
||||
@ -101,8 +103,9 @@ BaseView {
|
||||
}
|
||||
}
|
||||
|
||||
SplitView.minimumWidth: isSinglePane ? viewNode.width : (isMinorPane && !isRTL ? minorPaneMinWidth : majorPaneMinWidth)
|
||||
SplitView.maximumWidth: isSinglePane ? viewNode.width : viewNode.width - (isMinorPane && !isRTL ? majorPaneMinWidth : minorPaneMinWidth)
|
||||
SplitView.preferredWidth: isMinorPane && !isRTL ? minorPaneMinWidth : majorPaneMinWidth
|
||||
SplitView.minimumWidth: isSinglePane ? undefined : (isMinorPane ? minorPaneMinWidth : majorPaneMinWidth)
|
||||
SplitView.maximumWidth: isSinglePane || !isMinorPane ? undefined : Math.abs(viewNode.width - majorPaneMinWidth)
|
||||
SplitView.preferredWidth: isSinglePane || !isMinorPane ? undefined : JamiTheme.currentLeftPaneWidth
|
||||
SplitView.fillWidth: !isMinorPane || isSinglePane
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,19 +25,13 @@ import net.jami.Constants 1.1
|
||||
BaseModalDialog {
|
||||
id: root
|
||||
|
||||
width: 488
|
||||
height: 256
|
||||
width: JamiTheme.secondaryDialogDimension
|
||||
|
||||
property var previousBodies: undefined
|
||||
|
||||
popupContent: Item {
|
||||
id: rect
|
||||
|
||||
width: root.width
|
||||
|
||||
JamiListView {
|
||||
anchors.fill: parent
|
||||
anchors.margins: JamiTheme.preferredMarginSize
|
||||
popupContent: JamiListView {
|
||||
width: root.width - 4 * JamiTheme.preferredMarginSize
|
||||
height: Math.min(count * 50, 150)
|
||||
|
||||
model: root.previousBodies
|
||||
|
||||
@ -79,17 +73,4 @@ BaseModalDialog {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: btnCancel
|
||||
imageColor: "grey"
|
||||
normalColor: "transparent"
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 10
|
||||
anchors.rightMargin: 10
|
||||
source: JamiResources.round_close_24dp_svg
|
||||
onClicked: close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,6 +42,7 @@ Popup {
|
||||
padding: 0
|
||||
|
||||
visible: false
|
||||
focus: true
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
|
||||
Rectangle {
|
||||
|
||||
@ -24,9 +24,13 @@ import net.jami.Constants 1.1
|
||||
Item {
|
||||
id: root
|
||||
|
||||
width: reactionBubble.width
|
||||
|
||||
property var reactions
|
||||
property real contentHeight: bubble.height
|
||||
property real contentWidth: bubble.width
|
||||
property real contentHeight: reactionBubble.height
|
||||
property real contentWidth: reactionBubble.width
|
||||
property color borderColor: undefined
|
||||
property int maxWidth: JamiTheme.defaulMaxWidthReaction
|
||||
|
||||
visible: emojis.length && Body !== ""
|
||||
|
||||
@ -80,36 +84,30 @@ Item {
|
||||
return [];
|
||||
}
|
||||
|
||||
// TODO:
|
||||
|
||||
// -order emojis based on the timestamp of the reaction and/or the quantity of emojis
|
||||
Rectangle {
|
||||
id: bubble
|
||||
id: reactionBubble
|
||||
|
||||
color: JamiTheme.emojiReactBubbleBgColor
|
||||
width: textEmojis.width + 6
|
||||
height: textEmojis.height + 6
|
||||
radius: 10
|
||||
|
||||
Text {
|
||||
id: textEmojis
|
||||
|
||||
anchors.margins: 10
|
||||
anchors.centerIn: bubble
|
||||
font.pointSize: JamiTheme.emojiReactSize
|
||||
color: JamiTheme.chatviewTextColor
|
||||
text: root.emojis
|
||||
}
|
||||
width: textEmojis.width + 10
|
||||
height: textEmojis.height + 10
|
||||
anchors.centerIn: textEmojis
|
||||
radius: 5
|
||||
border.color: root.borderColor
|
||||
border.width: 1
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
z: -1
|
||||
Text {
|
||||
id: textEmojis
|
||||
anchors.margins: 10
|
||||
anchors.centerIn: root
|
||||
|
||||
width: bubble.width
|
||||
height: bubble.height
|
||||
horizontalOffset: 3.0
|
||||
verticalOffset: 3.0
|
||||
radius: bubble.radius * 4
|
||||
color: JamiTheme.shadowColor
|
||||
source: bubble
|
||||
transparentBorder: true
|
||||
samples: radius + 1
|
||||
font.pointSize: JamiTheme.emojiReactSize
|
||||
color: JamiTheme.chatviewTextColor
|
||||
text: root.emojis
|
||||
width: Math.min(implicitWidth,root.maxWidth)
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,6 +40,7 @@ Column {
|
||||
ColumnLayout {
|
||||
|
||||
width: parent.width
|
||||
spacing: 0
|
||||
|
||||
TimestampInfo {
|
||||
id: timestampItem
|
||||
|
||||
75
src/app/commoncomponents/HeaderToggleSwitch.qml
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Savoir-faire Linux Inc.
|
||||
* Author: Xavier Jouslin <xavier.jouslindenoray@savoirfairelinux.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Qt.labs.platform
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
||||
RowLayout {
|
||||
id: root
|
||||
property string labelText: ""
|
||||
property int widthOfSwitch: 50
|
||||
property int heightOfSwitch: 10
|
||||
|
||||
property string tooltipText: ""
|
||||
|
||||
property alias toggleSwitch: autoupdate
|
||||
property alias checked: autoupdate.checked
|
||||
|
||||
signal switchToggled
|
||||
Layout.alignment: Qt.AlignRight
|
||||
JamiSwitch {
|
||||
id: autoupdate
|
||||
Layout.alignment: Qt.AlignLeft
|
||||
|
||||
Layout.preferredWidth: widthOfSwitch
|
||||
|
||||
hoverEnabled: true
|
||||
toolTipText: tooltipText
|
||||
|
||||
Accessible.role: Accessible.Button
|
||||
Accessible.name: JamiStrings.autoUpdate
|
||||
Accessible.description: root.tooltipText
|
||||
|
||||
onToggled: switchToggled()
|
||||
}
|
||||
Text {
|
||||
id: description
|
||||
Layout.rightMargin: JamiTheme.preferredMarginSize
|
||||
text: JamiStrings.autoUpdate
|
||||
font.pixelSize: JamiTheme.wizardViewButtonFontPixelSize
|
||||
visible: labelText !== ""
|
||||
font.kerning: true
|
||||
wrapMode: Text.WordWrap
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
color: JamiTheme.textColor
|
||||
}
|
||||
TapHandler {
|
||||
target: parent
|
||||
enabled: parent.visible
|
||||
onTapped: function onTapped(eventPoint) {
|
||||
// switchToggled should be emitted as onToggled is not called (because it's only called if the user click on the switch)
|
||||
autoupdate.toggle();
|
||||
switchToggled();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -23,151 +23,188 @@ import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
||||
Item {
|
||||
id: root
|
||||
id: jamiId
|
||||
|
||||
property alias backgroundColor: outerRect.color
|
||||
property bool slimDisplay: true
|
||||
property color backgroundColor: JamiTheme.welcomeBlockColor
|
||||
property color contentColor: JamiTheme.tintedBlue
|
||||
property bool centered: true
|
||||
height: getHeight()
|
||||
|
||||
width: childrenRect.width
|
||||
height: controlsLayout.height + usernameTextEdit.height + 2 * JamiTheme.preferredMarginSize
|
||||
|
||||
// Background rounded rectangle.
|
||||
Rectangle {
|
||||
id: outerRect
|
||||
anchors.fill: parent
|
||||
radius: 20
|
||||
color: JamiTheme.secondaryBackgroundColor
|
||||
function getHeight() {
|
||||
return outerRow.height;
|
||||
}
|
||||
|
||||
// Logo masked by outerRect.
|
||||
Item {
|
||||
anchors.fill: outerRect
|
||||
layer.enabled: true
|
||||
layer.effect: OpacityMask {
|
||||
maskSource: outerRect
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: logoRect
|
||||
width: 97 + radius
|
||||
height: 40
|
||||
color: JamiTheme.mainColor
|
||||
radius: 20
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: -radius
|
||||
|
||||
ResponsiveImage {
|
||||
id: jamiIdLogo
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
// Adjust offset for parent masking margin.
|
||||
anchors.horizontalCenterOffset: parent.radius / 2
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: JamiTheme.jamiIdLogoWidth
|
||||
height: JamiTheme.jamiIdLogoHeight
|
||||
source: JamiResources.jamiid_svg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: columnLayout
|
||||
|
||||
spacing: JamiTheme.preferredMarginSize
|
||||
|
||||
RowLayout {
|
||||
id: controlsLayout
|
||||
|
||||
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||
Layout.topMargin: JamiTheme.pushButtonMargin / 2
|
||||
Layout.rightMargin: JamiTheme.pushButtonMargin
|
||||
Layout.preferredHeight: childrenRect.height
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnEdit
|
||||
visible: CurrentAccount.registeredName === ""
|
||||
border.color: enabled ? JamiTheme.buttonTintedBlue : JamiTheme.buttonTintedBlack
|
||||
imageColor: enabled ? JamiTheme.buttonTintedBlue : JamiTheme.buttonTintedBlack
|
||||
enabled: {
|
||||
if (!usernameTextEdit.editMode)
|
||||
return true;
|
||||
switch (usernameTextEdit.nameRegistrationState) {
|
||||
case UsernameTextEdit.NameRegistrationState.BLANK:
|
||||
case UsernameTextEdit.NameRegistrationState.FREE:
|
||||
return true;
|
||||
case UsernameTextEdit.NameRegistrationState.SEARCHING:
|
||||
case UsernameTextEdit.NameRegistrationState.INVALID:
|
||||
case UsernameTextEdit.NameRegistrationState.TAKEN:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
source: usernameTextEdit.editMode ? JamiResources.check_black_24dp_svg : JamiResources.round_edit_24dp_svg
|
||||
toolTipText: JamiStrings.chooseUsername
|
||||
onClicked: {
|
||||
if (usernameTextEdit.readOnly) {
|
||||
usernameTextEdit.startEditing();
|
||||
usernameTextEdit.readOnly = false;
|
||||
} else {
|
||||
usernameTextEdit.accepted();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnCopy
|
||||
source: JamiResources.content_copy_24dp_svg
|
||||
toolTipText: JamiStrings.copy
|
||||
onClicked: UtilsAdapter.setClipboardText(usernameTextEdit.staticText)
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnShare
|
||||
source: JamiResources.share_24dp_svg
|
||||
toolTipText: JamiStrings.share
|
||||
onClicked: viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml")
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnId
|
||||
source: JamiResources.key_black_24dp_svg
|
||||
visible: CurrentAccount.registeredName !== ""
|
||||
toolTipText: JamiStrings.identifierURI
|
||||
onClicked: {
|
||||
if (clicked) {
|
||||
usernameTextEdit.staticText = CurrentAccount.uri;
|
||||
btnId.toolTipText = JamiStrings.identifierRegisterName;
|
||||
} else {
|
||||
usernameTextEdit.staticText = CurrentAccount.registeredName;
|
||||
btnId.toolTipText = JamiStrings.identifierURI;
|
||||
}
|
||||
clicked = !clicked;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UsernameTextEdit {
|
||||
id: usernameTextEdit
|
||||
|
||||
Layout.preferredWidth: 330
|
||||
Layout.preferredHeight: implicitHeight + JamiTheme.preferredMarginSize
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
Layout.leftMargin: JamiTheme.preferredMarginSize
|
||||
Layout.rightMargin: JamiTheme.preferredMarginSize
|
||||
fontPixelSize: JamiTheme.jamiIdFontSize
|
||||
editMode: false
|
||||
isPersistent: false
|
||||
readOnly: true
|
||||
|
||||
onAccepted: {
|
||||
Connections {
|
||||
target: CurrentAccount
|
||||
function onIdChanged(id) {
|
||||
if (!usernameTextEdit.readOnly) {
|
||||
usernameTextEdit.readOnly = true;
|
||||
if (dynamicText === '') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: outerRow
|
||||
anchors.horizontalCenter: jamiId.centered ? parent.horizontalCenter : undefined
|
||||
anchors.left: jamiId.centered ? undefined : parent.left
|
||||
spacing: 2
|
||||
|
||||
RoundedBorderRectangle {
|
||||
id: leftRect
|
||||
fillColor: jamiId.backgroundColor
|
||||
Layout.preferredWidth: childrenRect.width
|
||||
Layout.maximumWidth: jamiId.width - rightRect.width
|
||||
Layout.preferredHeight: childrenRect.height
|
||||
radius: {
|
||||
"tl": 5,
|
||||
"tr": 0,
|
||||
"br": 0,
|
||||
"bl": 5
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
ResponsiveImage {
|
||||
id: jamiIdLogoImage
|
||||
Layout.preferredHeight: 40
|
||||
containerHeight: 40
|
||||
containerWidth: 40
|
||||
Layout.leftMargin: JamiTheme.pushButtonMargins
|
||||
source: JamiResources.jami_id_logo_svg
|
||||
color: jamiId.contentColor
|
||||
}
|
||||
|
||||
UsernameTextEdit {
|
||||
id: usernameTextEdit
|
||||
visible: !readOnly
|
||||
Layout.preferredHeight: 40
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
textColor: jamiId.contentColor
|
||||
fontPixelSize: staticText.length > 16 || dynamicText.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
|
||||
editMode: false
|
||||
isPersistent: false
|
||||
readOnly: true
|
||||
|
||||
onAccepted: {
|
||||
usernameTextEdit.readOnly = true;
|
||||
if (dynamicText === '') {
|
||||
return;
|
||||
}
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "settingsview/components/NameRegistrationDialog.qml", {
|
||||
"registeredName": dynamicText
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
usernameTextEdit.nameRegistrationState = UsernameTextEdit.NameRegistrationState.BLANK;
|
||||
});
|
||||
}
|
||||
}
|
||||
Label{
|
||||
id: usernameLabel
|
||||
visible: usernameTextEdit.readOnly
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.rightMargin: JamiTheme.pushButtonMargins
|
||||
Layout.maximumWidth: leftRect.width - 50
|
||||
elide: Text.ElideRight
|
||||
color: jamiId.contentColor
|
||||
font.pixelSize : text.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
|
||||
property string registeredName: CurrentAccount.registeredName
|
||||
property string infohash: CurrentAccount.uri
|
||||
text: registeredName ? registeredName : infohash
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RoundedBorderRectangle {
|
||||
id: rightRect
|
||||
fillColor: jamiId.backgroundColor
|
||||
Layout.preferredWidth: childrenRect.width + 2 * JamiTheme.pushButtonMargins
|
||||
|
||||
Layout.preferredHeight: leftRect.height
|
||||
radius: {
|
||||
"tl": 0,
|
||||
"tr": 5,
|
||||
"br": 5,
|
||||
"bl": 0
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: controlsLayout
|
||||
|
||||
height: childrenRect.height
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.rightMargin: JamiTheme.pushButtonMargins
|
||||
anchors.leftMargin: JamiTheme.pushButtonMargins
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnEdit
|
||||
anchors.leftMargin: JamiTheme.pushButtonMargins
|
||||
visible: CurrentAccount.registeredName === ""
|
||||
border.color: enabled ? jamiId.contentColor : JamiTheme.buttonTintedBlack
|
||||
imageColor: enabled ? jamiId.contentColor : JamiTheme.buttonTintedBlack
|
||||
enabled: {
|
||||
if (!usernameTextEdit.editMode)
|
||||
return true;
|
||||
switch (usernameTextEdit.nameRegistrationState) {
|
||||
case UsernameTextEdit.NameRegistrationState.BLANK:
|
||||
case UsernameTextEdit.NameRegistrationState.FREE:
|
||||
return true;
|
||||
case UsernameTextEdit.NameRegistrationState.SEARCHING:
|
||||
case UsernameTextEdit.NameRegistrationState.INVALID:
|
||||
case UsernameTextEdit.NameRegistrationState.TAKEN:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
source: usernameTextEdit.editMode ? JamiResources.check_black_24dp_svg : JamiResources.round_edit_24dp_svg
|
||||
toolTipText: JamiStrings.chooseUsername
|
||||
onClicked: {
|
||||
if (usernameTextEdit.readOnly) {
|
||||
usernameTextEdit.startEditing();
|
||||
usernameTextEdit.readOnly = false;
|
||||
} else {
|
||||
usernameTextEdit.accepted();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnCopy
|
||||
anchors.leftMargin: JamiTheme.pushButtonMargins
|
||||
source: JamiResources.content_copy_24dp_svg
|
||||
border.color: "transparent"
|
||||
toolTipText: JamiStrings.copy
|
||||
onClicked: UtilsAdapter.setClipboardText(usernameTextEdit.staticText)
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnShare
|
||||
source: JamiResources.share_24dp_svg
|
||||
border.color: "transparent"
|
||||
toolTipText: JamiStrings.share
|
||||
onClicked: viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml")
|
||||
}
|
||||
|
||||
JamiIdControlButton {
|
||||
id: btnId
|
||||
source: JamiResources.key_black_24dp_svg
|
||||
visible: CurrentAccount.registeredName !== ""
|
||||
border.color: "transparent"
|
||||
toolTipText: JamiStrings.identifierURI
|
||||
onClicked: {
|
||||
if (clicked) {
|
||||
usernameLabel.text = Qt.binding(function() {return CurrentAccount.uri} );
|
||||
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.uri} );
|
||||
btnId.toolTipText = JamiStrings.identifierRegisterName;
|
||||
} else {
|
||||
usernameLabel.text = Qt.binding(function() {return CurrentAccount.registeredName} );
|
||||
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.registeredName} );
|
||||
btnId.toolTipText = JamiStrings.identifierURI;
|
||||
}
|
||||
clicked = !clicked;
|
||||
}
|
||||
}
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "settingsview/components/NameRegistrationDialog.qml", {
|
||||
"registeredName": dynamicText
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
usernameTextEdit.nameRegistrationState = UsernameTextEdit.NameRegistrationState.BLANK;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -175,11 +212,12 @@ Item {
|
||||
component JamiIdControlButton: PushButton {
|
||||
property bool clicked: true
|
||||
preferredSize: 30
|
||||
radius: 5
|
||||
normalColor: JamiTheme.transparentColor
|
||||
hoveredColor: JamiTheme.hoveredButtonColorWizard
|
||||
imageContainerWidth: JamiTheme.pushButtonSize
|
||||
imageContainerHeight: JamiTheme.pushButtonSize
|
||||
border.color: JamiTheme.tintedBlue
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
border.color: jamiId.contentColor
|
||||
imageColor: jamiId.contentColor
|
||||
duration: 0
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,6 +68,7 @@ SplitView {
|
||||
}
|
||||
|
||||
handle: Rectangle {
|
||||
visible: !isSinglePane
|
||||
implicitWidth: JamiTheme.splitViewHandlePreferredWidth
|
||||
implicitHeight: root.height
|
||||
color: JamiTheme.primaryBackgroundColor
|
||||
|
||||
@ -35,8 +35,10 @@ ContextMenuAutoLoader {
|
||||
GeneralMenuItem {
|
||||
id: copy
|
||||
|
||||
canTrigger: lineEditObj.selectedText.length
|
||||
canTrigger: true
|
||||
isActif: lineEditObj.selectedText.length
|
||||
itemName: JamiStrings.copy
|
||||
hasIcon: false
|
||||
onClicked: {
|
||||
lineEditObj.copy();
|
||||
}
|
||||
@ -44,9 +46,10 @@ ContextMenuAutoLoader {
|
||||
GeneralMenuItem {
|
||||
id: cut
|
||||
|
||||
canTrigger: lineEditObj.selectedText.length && !selectOnly
|
||||
canTrigger: true
|
||||
isActif: lineEditObj.selectedText.length && !selectOnly
|
||||
itemName: JamiStrings.cut
|
||||
|
||||
hasIcon: false
|
||||
onClicked: {
|
||||
lineEditObj.cut();
|
||||
}
|
||||
@ -56,6 +59,7 @@ ContextMenuAutoLoader {
|
||||
|
||||
canTrigger: !selectOnly
|
||||
itemName: JamiStrings.paste
|
||||
hasIcon: false
|
||||
onClicked: {
|
||||
if (customizePaste)
|
||||
root.contextMenuRequirePaste();
|
||||
@ -76,10 +80,6 @@ ContextMenuAutoLoader {
|
||||
lineEditObj.select(selectionStart, selectionEnd);
|
||||
}
|
||||
|
||||
contextMenuItemPreferredHeight: JamiTheme.lineEditContextMenuItemsHeight
|
||||
contextMenuItemPreferredWidth: JamiTheme.lineEditContextMenuItemsWidth
|
||||
contextMenuSeparatorPreferredHeight: JamiTheme.lineEditContextMenuSeparatorsHeight
|
||||
|
||||
Connections {
|
||||
target: root.item
|
||||
enabled: root.status === Loader.Ready
|
||||
|
||||
@ -30,14 +30,18 @@ Popup {
|
||||
padding: 0
|
||||
property list<Action> menuTypoActionsSecond
|
||||
|
||||
focus: true
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
|
||||
contentItem: ListView {
|
||||
id: listViewTypoSecond
|
||||
|
||||
width: contentWidth + leftMargin
|
||||
width: contentWidth + leftMargin + rightMargin
|
||||
height: JamiTheme.chatViewFooterButtonSize
|
||||
orientation: ListView.Horizontal
|
||||
interactive: false
|
||||
leftMargin: 10
|
||||
rightMargin: 10
|
||||
spacing: 10
|
||||
|
||||
Rectangle {
|
||||
@ -50,7 +54,7 @@ Popup {
|
||||
model: menuTypoActionsSecond
|
||||
|
||||
delegate: PushButton {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
|
||||
|
||||
preferredSize: JamiTheme.chatViewFooterRealButtonSize
|
||||
imageContainerWidth: 20
|
||||
@ -64,7 +68,7 @@ Popup {
|
||||
focusPolicy: Qt.TabFocus
|
||||
|
||||
normalColor: JamiTheme.chatViewFooterListColor
|
||||
imageColor: JamiTheme.chatViewFooterImgColor
|
||||
imageColor: JamiTheme.chatViewFooterImgHoverColor
|
||||
hoveredColor: JamiTheme.showMoreButtonOpenColor
|
||||
pressedColor: hoveredColor
|
||||
|
||||
|
||||
@ -27,7 +27,6 @@ AbstractButton {
|
||||
id: root
|
||||
|
||||
property bool autoAccelerator: false
|
||||
property bool boldFont: false
|
||||
property bool primary: false
|
||||
property bool secondary: false
|
||||
property bool tertiary: false
|
||||
@ -51,12 +50,12 @@ AbstractButton {
|
||||
height: buttontextHeightMargin + textButton.height
|
||||
Layout.preferredHeight: height
|
||||
|
||||
Binding on width {
|
||||
Binding on width {
|
||||
when: root.preferredWidth !== undefined || root.Layout.fillWidth
|
||||
value: root.preferredWidth
|
||||
}
|
||||
|
||||
Binding on Layout.preferredWidth {
|
||||
Binding on Layout.preferredWidth {
|
||||
when: root.preferredWidth !== undefined || root.Layout.fillWidth
|
||||
value: width
|
||||
}
|
||||
@ -66,7 +65,6 @@ AbstractButton {
|
||||
value: height
|
||||
}
|
||||
|
||||
hoverEnabled: true
|
||||
focusPolicy: Qt.StrongFocus
|
||||
|
||||
Accessible.role: Accessible.Button
|
||||
@ -96,7 +94,7 @@ AbstractButton {
|
||||
contentItem: Item {
|
||||
id: item
|
||||
|
||||
Binding on implicitWidth {
|
||||
Binding on implicitWidth {
|
||||
when: root.preferredWidth === undefined || !root.Layout.fillWidth
|
||||
value: item.childrenRect.width
|
||||
}
|
||||
@ -105,7 +103,7 @@ AbstractButton {
|
||||
|
||||
RowLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Binding on width {
|
||||
Binding on width {
|
||||
when: root.preferredWidth !== undefined || root.Layout.fillWidth
|
||||
value: root.availableWidth
|
||||
}
|
||||
@ -168,7 +166,6 @@ AbstractButton {
|
||||
leftPadding: root.primary ? JamiTheme.buttontextWizzardPadding : textLeftPadding
|
||||
rightPadding: root.primary ? JamiTheme.buttontextWizzardPadding : textRightPadding
|
||||
text: root.text
|
||||
font.weight: (root.hovered && root.hoverEnabled) || boldFont ? Font.Bold : Font.Medium
|
||||
elide: Text.ElideRight
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: root.textAlignment
|
||||
@ -183,18 +180,18 @@ AbstractButton {
|
||||
color: {
|
||||
var baseColor = root.color;
|
||||
if (root.primary) {
|
||||
if (root.hovered && root.hoverEnabled)
|
||||
if (root.hovered && root.enabled)
|
||||
return root.hoveredColor;
|
||||
return baseColor;
|
||||
}
|
||||
if (root.secondary || root.tertiary) {
|
||||
if (root.hovered && root.hoverEnabled)
|
||||
if (root.hovered && root.enabled)
|
||||
return root.secHoveredColor;
|
||||
return JamiTheme.transparentColor;
|
||||
}
|
||||
if (root.down)
|
||||
return root.pressedColor;
|
||||
if (root.hovered && root.hoverEnabled)
|
||||
if (root.hovered && root.enabled)
|
||||
return root.hoveredColor;
|
||||
return baseColor;
|
||||
}
|
||||
@ -202,7 +199,7 @@ AbstractButton {
|
||||
border.color: {
|
||||
if (root.primary || root.tertiary)
|
||||
return JamiTheme.transparentColor;
|
||||
if (root.secondary && root.hovered && root.hoverEnabled)
|
||||
if (root.secondary && root.hovered && root.enabled)
|
||||
return JamiTheme.secondaryButtonHoveredBorderColor;
|
||||
if (root.secondary)
|
||||
return JamiTheme.secondaryButtonBorderColor;
|
||||
@ -226,7 +223,7 @@ AbstractButton {
|
||||
|
||||
// We don't want to eat clicks on the Text.
|
||||
acceptedButtons: Qt.NoButton
|
||||
cursorShape: (root.hovered && root.hoverEnabled) ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
cursorShape: (root.hovered && root.enabled) ? Qt.PointingHandCursor : Qt.ArrowCursor
|
||||
}
|
||||
|
||||
Shortcut {
|
||||
|
||||
@ -74,7 +74,7 @@ RadioButton {
|
||||
spacing: 10
|
||||
|
||||
anchors.left: root.indicator.right
|
||||
anchors.leftMargin: root.spacing
|
||||
anchors.leftMargin: 10
|
||||
|
||||
ResponsiveImage {
|
||||
color: borderColor
|
||||
@ -89,6 +89,8 @@ RadioButton {
|
||||
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
|
||||
text: root.text
|
||||
wrapMode: Text.WordWrap
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
|
||||
}
|
||||
}
|
||||
|
||||
@ -100,7 +102,7 @@ RadioButton {
|
||||
color: "transparent"
|
||||
implicitHeight: 20
|
||||
implicitWidth: 20
|
||||
radius: JamiTheme.settingsBoxRadius
|
||||
radius: 10
|
||||
z: 1
|
||||
|
||||
border {
|
||||
@ -114,7 +116,7 @@ RadioButton {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: checkedColor
|
||||
height: 12
|
||||
radius: JamiTheme.settingsBoxRadius
|
||||
radius: 10
|
||||
visible: checked || hovered
|
||||
width: 12
|
||||
|
||||
|
||||
@ -1,294 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Savoir-faire Linux Inc.
|
||||
* Author: Nicolas Vengeon <nicolas.vengeon@savoirfairelinux.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import QtQuick.Layouts
|
||||
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
||||
Popup {
|
||||
id: root
|
||||
|
||||
width: emojiColumn.width + JamiTheme.emojiMargins
|
||||
height: emojiColumn.height + JamiTheme.emojiMargins
|
||||
padding: 0
|
||||
background.visible: false
|
||||
|
||||
required property var emojiReactions
|
||||
property var emojiReplied: emojiReactions.ownEmojis
|
||||
|
||||
required property string msgId
|
||||
required property string msgBody
|
||||
required property bool isOutgoing
|
||||
required property int type
|
||||
required property string transferName
|
||||
required property Item msgBubble
|
||||
required property ListView listView
|
||||
|
||||
property string transferId: msgId
|
||||
property string location: msgBody
|
||||
property bool closeWithoutAnimation: false
|
||||
property var emojiPicker
|
||||
|
||||
function xPositionProvider(width) {
|
||||
// Use the width at function scope to retrigger property evaluation.
|
||||
const listViewWidth = listView.width
|
||||
if (isOutgoing) {
|
||||
const leftMargin = msgBubble.mapToItem(listView, 0, 0).x
|
||||
return width > leftMargin ? -leftMargin : -width
|
||||
} else {
|
||||
const rightMargin = listViewWidth - (msgBubble.x + msgBubble.width)
|
||||
return width > rightMargin ? msgBubble.width - width : msgBubble.width
|
||||
}
|
||||
}
|
||||
function yPositionProvider(height) {
|
||||
const topOffset = msgBubble.mapToItem(listView, 0, 0).y
|
||||
if (topOffset < 0) return -topOffset
|
||||
const bottomOffset = topOffset + height - listView.height
|
||||
if (bottomOffset > 0) return -bottomOffset
|
||||
return 0
|
||||
}
|
||||
x: xPositionProvider(width)
|
||||
y: yPositionProvider(height)
|
||||
|
||||
signal addMoreEmoji
|
||||
onAddMoreEmoji: {
|
||||
JamiQmlUtils.updateMessageBarButtonsPoints()
|
||||
openEmojiPicker()
|
||||
}
|
||||
|
||||
function openEmojiPicker() {
|
||||
var component = WITH_WEBENGINE ?
|
||||
Qt.createComponent("qrc:/webengine/emojipicker/EmojiPicker.qml") :
|
||||
Qt.createComponent("qrc:/nowebengine/EmojiPicker.qml")
|
||||
emojiPicker = component.createObject(root.parent, { listView: listView })
|
||||
emojiPicker.emojiIsPicked.connect(function(content) {
|
||||
if (emojiReplied.includes(content)) {
|
||||
MessagesAdapter.removeEmojiReaction(CurrentConversation.id, content, msgId)
|
||||
} else {
|
||||
MessagesAdapter.addEmojiReaction(CurrentConversation.id, content, msgId)
|
||||
}
|
||||
})
|
||||
if (emojiPicker !== null) {
|
||||
root.opacity = 0
|
||||
emojiPicker.closed.connect(() => close())
|
||||
emojiPicker.x = xPositionProvider(JamiTheme.emojiPickerWidth)
|
||||
emojiPicker.y = yPositionProvider(JamiTheme.emojiPickerHeight)
|
||||
emojiPicker.open()
|
||||
} else {
|
||||
console.log("Error creating emojiPicker from message options popup");
|
||||
}
|
||||
}
|
||||
|
||||
// Close the picker when listView vertical properties change.
|
||||
property real listViewHeight: listView.height
|
||||
onListViewHeightChanged: close()
|
||||
property bool isScrolling: listView.verticalScrollBar.active
|
||||
onIsScrollingChanged: close()
|
||||
|
||||
onOpened: root.closeWithoutAnimation = false
|
||||
onClosed: if (emojiPicker) emojiPicker.closeEmojiPicker()
|
||||
|
||||
function getModel() {
|
||||
const defaultModel = ["👍", "👎", "😂"]
|
||||
const reactedEmojis = Array.isArray(emojiReplied) ? emojiReplied.slice(0, defaultModel.length) : []
|
||||
const uniqueEmojis = Array.from(new Set(reactedEmojis))
|
||||
const missingEmojis = defaultModel.filter(emoji => !uniqueEmojis.includes(emoji))
|
||||
return uniqueEmojis.concat(missingEmojis)
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bubble
|
||||
|
||||
color: JamiTheme.chatviewBgColor
|
||||
anchors.fill: parent
|
||||
radius: JamiTheme.modalPopupRadius
|
||||
|
||||
ColumnLayout {
|
||||
id: emojiColumn
|
||||
|
||||
anchors.centerIn: parent
|
||||
|
||||
RowLayout {
|
||||
id: emojiRow
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
Repeater {
|
||||
model: root.getModel()
|
||||
|
||||
delegate: Button {
|
||||
id: emojiButton
|
||||
|
||||
height: 50
|
||||
width: 50
|
||||
text: modelData
|
||||
font.pointSize: JamiTheme.emojiBubbleSize
|
||||
|
||||
Text {
|
||||
visible: emojiButton.hovered
|
||||
anchors.centerIn: parent
|
||||
text: modelData
|
||||
font.pointSize: JamiTheme.emojiBubbleSizeBig
|
||||
z: 1
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
anchors.fill: parent
|
||||
opacity: emojiReplied ? (emojiReplied.includes(modelData) ? 1 : 0) : 0
|
||||
color: JamiTheme.emojiReactPushButtonColor
|
||||
radius: 10
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
if (emojiReplied.includes(modelData))
|
||||
MessagesAdapter.removeEmojiReaction(CurrentConversation.id,text,msgId)
|
||||
else
|
||||
MessagesAdapter.addEmojiReaction(CurrentConversation.id,text,msgId)
|
||||
close()
|
||||
}
|
||||
}
|
||||
}
|
||||
PushButton {
|
||||
toolTipText: JamiStrings.moreEmojis
|
||||
source: JamiResources.add_reaction_svg
|
||||
normalColor: JamiTheme.emojiReactBubbleBgColor
|
||||
imageColor: JamiTheme.emojiReactPushButtonColor
|
||||
visible: WITH_WEBENGINE
|
||||
onClicked: {
|
||||
root.closeWithoutAnimation = true
|
||||
root.addMoreEmoji()
|
||||
//close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
Layout.margins: 5
|
||||
color: JamiTheme.timestampColor
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 1
|
||||
radius: width * 0.5
|
||||
opacity: 0.6
|
||||
}
|
||||
|
||||
MessageOptionButton {
|
||||
textButton: JamiStrings.copy
|
||||
iconSource: JamiResources.copy_svg
|
||||
Layout.fillWidth: true
|
||||
Layout.margins: 5
|
||||
onClicked: {
|
||||
UtilsAdapter.setClipboardText(msgBody)
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
MessageOptionButton {
|
||||
visible: type === Interaction.Type.DATA_TRANSFER
|
||||
textButton: JamiStrings.saveFile
|
||||
iconSource: JamiResources.save_file_svg
|
||||
Layout.fillWidth: true
|
||||
Layout.margins: 5
|
||||
onClicked: {
|
||||
MessagesAdapter.copyToDownloads(root.transferId, root.transferName)
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
MessageOptionButton {
|
||||
visible: type === Interaction.Type.DATA_TRANSFER
|
||||
textButton: JamiStrings.openLocation
|
||||
iconSource: JamiResources.round_folder_24dp_svg
|
||||
Layout.fillWidth: true
|
||||
Layout.margins: 5
|
||||
onClicked: {
|
||||
MessagesAdapter.openDirectory(root.location)
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
MessageOptionButton {
|
||||
id: buttonEdit
|
||||
|
||||
visible: root.isOutgoing && type === Interaction.Type.TEXT
|
||||
textButton: JamiStrings.editMessage
|
||||
iconSource: JamiResources.edit_svg
|
||||
Layout.fillWidth: true
|
||||
Layout.margins: 5
|
||||
|
||||
onClicked: {
|
||||
MessagesAdapter.replyToId = ""
|
||||
MessagesAdapter.editId = root.msgId
|
||||
close()
|
||||
}
|
||||
}
|
||||
|
||||
MessageOptionButton {
|
||||
visible: root.isOutgoing && type === Interaction.Type.TEXT
|
||||
textButton: JamiStrings.deleteMessage
|
||||
iconSource: JamiResources.delete_svg
|
||||
Layout.fillWidth: true
|
||||
Layout.margins: 5
|
||||
onClicked: {
|
||||
MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId)
|
||||
close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Overlay.modal: Rectangle {
|
||||
color: JamiTheme.transparentColor
|
||||
// Color animation for overlay when pop up is shown.
|
||||
ColorAnimation on color {
|
||||
to: JamiTheme.popupOverlayColor
|
||||
duration: 500
|
||||
}
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
z: -1
|
||||
|
||||
width: bubble.width
|
||||
height: bubble.height
|
||||
horizontalOffset: 3.0
|
||||
verticalOffset: 3.0
|
||||
radius: bubble.radius * 4
|
||||
color: JamiTheme.shadowColor
|
||||
source: bubble
|
||||
transparentBorder: true
|
||||
samples: radius + 1
|
||||
}
|
||||
|
||||
enter: Transition {
|
||||
NumberAnimation {
|
||||
properties: "opacity"; from: 0.0; to: 1.0
|
||||
duration: JamiTheme.shortFadeDuration
|
||||
}
|
||||
}
|
||||
|
||||
exit: Transition {
|
||||
NumberAnimation {
|
||||
properties: "opacity"; from: 1.0; to: 0.0
|
||||
duration: root.closeWithoutAnimation ? 0 : JamiTheme.shortFadeDuration
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -35,9 +35,6 @@ BaseModalDialog {
|
||||
|
||||
signal done(bool success, int purpose)
|
||||
|
||||
width: Math.min(appWindow.width - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogWidth)
|
||||
height: Math.min(appWindow.height - 2 * JamiTheme.preferredMarginSize, JamiTheme.preferredDialogHeight)
|
||||
|
||||
title: {
|
||||
switch (purpose) {
|
||||
case PasswordDialog.ExportAccount:
|
||||
@ -75,7 +72,7 @@ BaseModalDialog {
|
||||
popupContent: ColumnLayout {
|
||||
id: popupContentColumnLayout
|
||||
|
||||
spacing: 0
|
||||
spacing: 16
|
||||
|
||||
function validatePassword() {
|
||||
switch (purpose) {
|
||||
@ -128,6 +125,8 @@ BaseModalDialog {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: JamiTheme.preferredFieldWidth
|
||||
Layout.preferredHeight: visible ? 48 : 0
|
||||
Layout.leftMargin: JamiTheme.preferredMarginSize
|
||||
Layout.rightMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.ExportAccount
|
||||
placeholderText: JamiStrings.enterCurrentPassword
|
||||
@ -141,6 +140,8 @@ BaseModalDialog {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: JamiTheme.preferredFieldWidth
|
||||
Layout.preferredHeight: visible ? 48 : 0
|
||||
Layout.leftMargin: JamiTheme.preferredMarginSize
|
||||
Layout.rightMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.SetPassword
|
||||
|
||||
@ -155,6 +156,8 @@ BaseModalDialog {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.preferredWidth: JamiTheme.preferredFieldWidth
|
||||
Layout.preferredHeight: visible ? 48 : 0
|
||||
Layout.leftMargin: JamiTheme.preferredMarginSize
|
||||
Layout.rightMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
visible: purpose === PasswordDialog.ChangePassword || purpose === PasswordDialog.SetPassword
|
||||
|
||||
@ -163,49 +166,24 @@ BaseModalDialog {
|
||||
onDynamicTextChanged: popupContentColumnLayout.validatePassword()
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 16
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
MaterialButton {
|
||||
id: btnConfirm
|
||||
|
||||
MaterialButton {
|
||||
id: btnConfirm
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
color: enabled ? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
|
||||
hoveredColor: JamiTheme.buttonTintedBlackHovered
|
||||
pressedColor: JamiTheme.buttonTintedBlackPressed
|
||||
secondary: true
|
||||
autoAccelerator: true
|
||||
enabled: purpose === PasswordDialog.SetPassword
|
||||
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
text: (purpose === PasswordDialog.ExportAccount) ? JamiStrings.exportAccount : JamiStrings.change
|
||||
|
||||
color: enabled ? JamiTheme.buttonTintedBlack : JamiTheme.buttonTintedGrey
|
||||
hoveredColor: JamiTheme.buttonTintedBlackHovered
|
||||
pressedColor: JamiTheme.buttonTintedBlackPressed
|
||||
secondary: true
|
||||
autoAccelerator: true
|
||||
enabled: purpose === PasswordDialog.SetPassword
|
||||
|
||||
text: (purpose === PasswordDialog.ExportAccount) ? JamiStrings.exportAccount : JamiStrings.change
|
||||
|
||||
onClicked: {
|
||||
btnConfirm.enabled = false;
|
||||
timerToOperate.restart();
|
||||
}
|
||||
}
|
||||
|
||||
MaterialButton {
|
||||
id: btnCancel
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
preferredWidth: JamiTheme.preferredFieldWidth / 2 - 8
|
||||
|
||||
color: JamiTheme.buttonTintedBlack
|
||||
hoveredColor: JamiTheme.buttonTintedBlackHovered
|
||||
pressedColor: JamiTheme.buttonTintedBlackPressed
|
||||
secondary: true
|
||||
autoAccelerator: true
|
||||
|
||||
text: JamiStrings.optionCancel
|
||||
|
||||
onClicked: close()
|
||||
onClicked: {
|
||||
btnConfirm.enabled = false;
|
||||
timerToOperate.restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -32,15 +32,12 @@ import "../mainview/components"
|
||||
BaseModalDialog {
|
||||
id: root
|
||||
|
||||
height: 157
|
||||
x: - width / 2
|
||||
y: - height / 5
|
||||
|
||||
property string imageId
|
||||
property bool newItem
|
||||
property real buttonSize: JamiTheme.smartListAvatarSize
|
||||
property real imageSize: 25
|
||||
|
||||
|
||||
signal focusOnPreviousItem
|
||||
signal focusOnNextItem
|
||||
|
||||
@ -60,9 +57,15 @@ BaseModalDialog {
|
||||
importButton.forceActiveFocus()
|
||||
}
|
||||
|
||||
width: JamiTheme.preferredDialogWidth
|
||||
|
||||
title: JamiStrings.chooseAvatarPicture
|
||||
|
||||
RecordBox {
|
||||
id: recordBox
|
||||
|
||||
anchors.centerIn: parent
|
||||
|
||||
isPhoto: true
|
||||
visible: false
|
||||
|
||||
@ -77,223 +80,176 @@ BaseModalDialog {
|
||||
}
|
||||
}
|
||||
|
||||
popupContent: Item {
|
||||
popupContent: RowLayout {
|
||||
id: buttonsRowLayout
|
||||
|
||||
Component.onCompleted: {
|
||||
root.width = Qt.binding(() => clearButton.visible ? 283 : 210)
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: container
|
||||
|
||||
anchors.fill: parent
|
||||
radius: JamiTheme.photoPopupRadius
|
||||
color: JamiTheme.inviteHoverColor
|
||||
spacing: 10
|
||||
|
||||
PushButton {
|
||||
id: btnCancel
|
||||
imageColor: "grey"
|
||||
id: takePhotoButton
|
||||
|
||||
objectName: "takePhotoButton"
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 10
|
||||
anchors.rightMargin: 10
|
||||
source: JamiResources.round_close_24dp_svg
|
||||
onClicked: { close();}
|
||||
}
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
toolTipText: JamiStrings.takePhoto
|
||||
source: JamiResources.baseline_camera_alt_24dp_svg
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
anchors.fill: parent
|
||||
anchors.margins: JamiTheme.preferredMarginSize
|
||||
|
||||
Text {
|
||||
id: informativeLabel
|
||||
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 26
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
text: JamiStrings.chooseAvatarPicture
|
||||
color: JamiTheme.primaryForegroundColor
|
||||
font.pixelSize: JamiTheme.popupPhotoTextSize
|
||||
elide: Text.ElideRight
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Up) {
|
||||
root.focusOnPreviousItem()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: buttonsRowLayout
|
||||
Layout.preferredHeight: childrenRect.height
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
spacing: 10
|
||||
KeyNavigation.tab: {
|
||||
if (clearButton.visible)
|
||||
return clearButton
|
||||
return importButton
|
||||
}
|
||||
KeyNavigation.down: KeyNavigation.tab
|
||||
|
||||
PushButton {
|
||||
id: takePhotoButton
|
||||
onClicked: {
|
||||
recordBox.parent = buttonsRowLayout
|
||||
|
||||
objectName: "takePhotoButton"
|
||||
recordBox.x = Qt.binding(function() {
|
||||
var buttonCenterX = buttonsRowLayout.width / 2
|
||||
return buttonCenterX - recordBox.width / 2
|
||||
})
|
||||
recordBox.y = Qt.binding(function() {
|
||||
return - recordBox.height / 2
|
||||
})
|
||||
startBooth()
|
||||
}
|
||||
}
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
PushButton {
|
||||
id: importButton
|
||||
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
toolTipText: JamiStrings.takePhoto
|
||||
source: JamiResources.baseline_camera_alt_24dp_svg
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
objectName: "photoboothViewImportButton"
|
||||
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Up) {
|
||||
root.focusOnPreviousItem()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
}
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
visible: parent.visible
|
||||
|
||||
KeyNavigation.tab: {
|
||||
if (clearButton.visible)
|
||||
return clearButton
|
||||
return importButton
|
||||
}
|
||||
KeyNavigation.down: KeyNavigation.tab
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
source: JamiResources.round_folder_24dp_svg
|
||||
toolTipText: JamiStrings.importFromFile
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
|
||||
onClicked: {
|
||||
recordBox.parent = buttonsRowLayout
|
||||
|
||||
recordBox.x = Qt.binding(function() {
|
||||
var buttonCenterX = buttonsRowLayout.width / 2
|
||||
return buttonCenterX - recordBox.width / 2
|
||||
})
|
||||
recordBox.y = Qt.binding(function() {
|
||||
return - recordBox.height / 2
|
||||
})
|
||||
startBooth()
|
||||
}
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Down ||
|
||||
keyEvent.key === Qt.Key_Tab) {
|
||||
clearButton.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: importButton
|
||||
KeyNavigation.up: takePhotoButton
|
||||
|
||||
objectName: "photoboothViewImportButton"
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
visible: parent.visible
|
||||
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
source: JamiResources.round_folder_24dp_svg
|
||||
toolTipText: JamiStrings.importFromFile
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
|
||||
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Down ||
|
||||
keyEvent.key === Qt.Key_Tab) {
|
||||
clearButton.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
onClicked: {
|
||||
stopBooth()
|
||||
var dlg = viewCoordinator.presentDialog(
|
||||
appWindow,
|
||||
"commoncomponents/JamiFileDialog.qml",
|
||||
{
|
||||
title: JamiStrings.chooseAvatarImage,
|
||||
fileMode: JamiFileDialog.OpenFile,
|
||||
folder: StandardPaths.writableLocation(
|
||||
StandardPaths.PicturesLocation),
|
||||
nameFilters: [JamiStrings.imageFiles,
|
||||
JamiStrings.allFiles]
|
||||
})
|
||||
dlg.fileAccepted.connect(function(file) {
|
||||
var filePath = UtilsAdapter.getAbsPath(file)
|
||||
if (!root.newItem) {
|
||||
AccountAdapter.setCurrentAccountAvatarFile(filePath)
|
||||
} else {
|
||||
UtilsAdapter.setTempCreationImageFromFile(filePath, root.imageId)
|
||||
}
|
||||
root.close()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
KeyNavigation.up: takePhotoButton
|
||||
PushButton {
|
||||
id: clearButton
|
||||
|
||||
onClicked: {
|
||||
stopBooth()
|
||||
var dlg = viewCoordinator.presentDialog(
|
||||
appWindow,
|
||||
"commoncomponents/JamiFileDialog.qml",
|
||||
{
|
||||
title: JamiStrings.chooseAvatarImage,
|
||||
fileMode: JamiFileDialog.OpenFile,
|
||||
folder: StandardPaths.writableLocation(
|
||||
StandardPaths.PicturesLocation),
|
||||
nameFilters: [JamiStrings.imageFiles,
|
||||
JamiStrings.allFiles]
|
||||
})
|
||||
dlg.fileAccepted.connect(function(file) {
|
||||
var filePath = UtilsAdapter.getAbsPath(file)
|
||||
if (!root.newItem) {
|
||||
AccountAdapter.setCurrentAccountAvatarFile(filePath)
|
||||
} else {
|
||||
UtilsAdapter.setTempCreationImageFromFile(filePath, root.imageId)
|
||||
}
|
||||
root.close()
|
||||
})
|
||||
}
|
||||
objectName: "photoboothViewClearButton"
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
source: JamiResources.ic_hangup_participant_24dp_svg
|
||||
toolTipText: JamiStrings.clearAvatar
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
|
||||
|
||||
visible: {
|
||||
if (!newItem && LRCInstance.currentAccountAvatarSet)
|
||||
return true
|
||||
if (newItem && UtilsAdapter.tempCreationImage(imageId).length !== 0)
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
KeyNavigation.up: importButton
|
||||
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
importButton.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Down ||
|
||||
keyEvent.key === Qt.Key_Tab) {
|
||||
btnCancel.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: clearButton
|
||||
|
||||
objectName: "photoboothViewClearButton"
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
height: buttonSize
|
||||
width: buttonSize
|
||||
imageContainerWidth: imageSize
|
||||
imageContainerHeight: imageSize
|
||||
radius: height / 2
|
||||
border.color: JamiTheme.buttonTintedBlue
|
||||
normalColor: "transparent"
|
||||
source: JamiResources.ic_hangup_participant_24dp_svg
|
||||
toolTipText: JamiStrings.clearAvatar
|
||||
imageColor: JamiTheme.buttonTintedBlue
|
||||
hoveredColor: JamiTheme.smartListHoveredColor
|
||||
|
||||
|
||||
visible: {
|
||||
if (!newItem && LRCInstance.currentAccountAvatarSet)
|
||||
return true
|
||||
if (newItem && UtilsAdapter.tempCreationImage(imageId).length !== 0)
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
KeyNavigation.up: importButton
|
||||
|
||||
Keys.onPressed: function (keyEvent) {
|
||||
if (keyEvent.key === Qt.Key_Enter ||
|
||||
keyEvent.key === Qt.Key_Return) {
|
||||
clicked()
|
||||
importButton.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
} else if (keyEvent.key === Qt.Key_Down ||
|
||||
keyEvent.key === Qt.Key_Tab) {
|
||||
btnCancel.forceActiveFocus()
|
||||
keyEvent.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
if (!root.newItem)
|
||||
AccountAdapter.setCurrentAccountAvatarBase64()
|
||||
else
|
||||
UtilsAdapter.setTempCreationImageFromString("", imageId)
|
||||
visible = false
|
||||
stopBooth()
|
||||
root.close()
|
||||
}
|
||||
}
|
||||
onClicked: {
|
||||
if (!root.newItem)
|
||||
AccountAdapter.setCurrentAccountAvatarBase64()
|
||||
else
|
||||
UtilsAdapter.setTempCreationImageFromString("", imageId)
|
||||
visible = false
|
||||
stopBooth()
|
||||
root.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -85,7 +85,7 @@ ItemDelegate {
|
||||
id: prefLlabel
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
|
||||
Layout.leftMargin: 8
|
||||
Layout.leftMargin: 20
|
||||
|
||||
text: preferenceName
|
||||
color: JamiTheme.textColor
|
||||
@ -103,7 +103,7 @@ ItemDelegate {
|
||||
normalColor: JamiTheme.primaryBackgroundColor
|
||||
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlingVCenter
|
||||
Layout.rightMargin: 8
|
||||
Layout.rightMargin: 20
|
||||
Layout.preferredWidth: preferredSize
|
||||
Layout.preferredHeight: preferredSize
|
||||
imageColor: JamiTheme.textColor
|
||||
@ -119,7 +119,7 @@ ItemDelegate {
|
||||
|
||||
visible: preferenceType === PreferenceItemListModel.SWITCH
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlingVCenter
|
||||
Layout.rightMargin: 16
|
||||
Layout.rightMargin: 20
|
||||
Layout.preferredHeight: 30
|
||||
Layout.preferredWidth: 30
|
||||
checked: preferenceCurrentValue === "1"
|
||||
@ -134,7 +134,7 @@ ItemDelegate {
|
||||
visible: preferenceType === PreferenceItemListModel.LIST
|
||||
Layout.preferredWidth: root.width / 2 - 8
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
||||
Layout.rightMargin: 4
|
||||
Layout.rightMargin: 20
|
||||
|
||||
font.pointSize: JamiTheme.settingsFontSize
|
||||
font.kerning: true
|
||||
@ -157,7 +157,7 @@ ItemDelegate {
|
||||
buttontextHeightMargin: JamiTheme.buttontextHeightMargin
|
||||
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
||||
Layout.rightMargin: 4
|
||||
Layout.rightMargin: 20
|
||||
|
||||
text: UtilsAdapter.fileName(preferenceCurrentValue)
|
||||
toolTipText: JamiStrings.chooseImageFile
|
||||
@ -176,7 +176,7 @@ ItemDelegate {
|
||||
Layout.preferredWidth: root.width / 2 - 8
|
||||
Layout.preferredHeight: 30
|
||||
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
||||
Layout.rightMargin: 4
|
||||
Layout.rightMargin: 20
|
||||
|
||||
visible: preferenceType === PreferenceItemListModel.EDITTEXT
|
||||
width: root.width / 2 - 8
|
||||
|
||||
@ -53,6 +53,7 @@ AbstractButton {
|
||||
property alias toolTipText: toolTip.text
|
||||
property alias hasShortcut: toolTip.hasShortcut
|
||||
property alias shortcutKey: toolTip.shortcutKey
|
||||
property int buttonTextFontSize: 12
|
||||
|
||||
// State colors
|
||||
property string pressedColor: JamiTheme.pressedButtonColor
|
||||
@ -143,7 +144,7 @@ AbstractButton {
|
||||
|
||||
color: JamiTheme.primaryForegroundColor
|
||||
font.kerning: true
|
||||
font.pixelSize: 12
|
||||
font.pixelSize: buttonTextFontSize
|
||||
elide: Qt.ElideRight
|
||||
}
|
||||
|
||||
|
||||
@ -64,7 +64,7 @@ Item {
|
||||
|
||||
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
|
||||
selectByMouse: true
|
||||
font.pixelSize: IsEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.emojiBubbleSize
|
||||
font.pixelSize: IsEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.mediumFontSize
|
||||
font.hintingPreference: Font.PreferNoHinting
|
||||
renderType: Text.NativeRendering
|
||||
textFormat: Text.MarkdownText
|
||||
|
||||
@ -31,7 +31,9 @@ Item {
|
||||
|
||||
property alias source: image.source
|
||||
property alias status: image.status
|
||||
property alias fillMode: image.fillMode
|
||||
property alias cache: image.cache
|
||||
property alias image: image
|
||||
property alias mirror: image.mirror
|
||||
property string color: "transparent"
|
||||
property bool hovered: false
|
||||
@ -68,6 +70,7 @@ Item {
|
||||
antialiasing: true
|
||||
asynchronous: true
|
||||
visible: false
|
||||
mipmap: true
|
||||
|
||||
function setSourceSize() {
|
||||
sourceSize = undefined;
|
||||
|
||||
77
src/app/commoncomponents/RoundedBorderRectangle.qml
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Savoir-faire Linux Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
|
||||
Canvas {
|
||||
|
||||
property var radius
|
||||
property string fillColor: Style.colorBGPrimary
|
||||
|
||||
onRadiusChanged: requestPaint()
|
||||
onFillColorChanged: requestPaint()
|
||||
|
||||
//Draw rounded rectangle.
|
||||
onPaint: {
|
||||
var ctx = getContext("2d");
|
||||
var r = {};
|
||||
Object.assign(r, radius);
|
||||
if (typeof r === 'undefined')
|
||||
r = 0;
|
||||
if (typeof r === 'number')
|
||||
r = {
|
||||
"tl": r,
|
||||
"tr": r,
|
||||
"br": r,
|
||||
"bl": r
|
||||
};
|
||||
else {
|
||||
var defaultRadius = {
|
||||
"tl": 0,
|
||||
"tr": 0,
|
||||
"br": 0,
|
||||
"bl": 0
|
||||
};
|
||||
for (var side in defaultRadius)
|
||||
r[side] = r[side] || defaultRadius[side];
|
||||
}
|
||||
var x0 = 0;
|
||||
var y0 = x0;
|
||||
var x1 = width;
|
||||
var y1 = height;
|
||||
ctx.reset();
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(x0 + r.tl, y0);
|
||||
ctx.lineTo(x1 - r.tr, y0);
|
||||
ctx.quadraticCurveTo(x1, y0, x1, y0 + r.tr);
|
||||
ctx.lineTo(x1, y1 - r.br);
|
||||
ctx.quadraticCurveTo(x1, y1, x1 - r.br, y1);
|
||||
ctx.lineTo(x0 + r.bl, y1);
|
||||
ctx.quadraticCurveTo(x0, y1, x0, y1 - r.bl);
|
||||
ctx.lineTo(x0, y0 + r.tl);
|
||||
ctx.quadraticCurveTo(x0, y0, x0 + r.tl, y0);
|
||||
ctx.closePath();
|
||||
ctx.fillStyle = fillColor;
|
||||
ctx.fill();
|
||||
}
|
||||
}
|
||||
@ -37,6 +37,7 @@ ContextMenuAutoLoader {
|
||||
|
||||
canTrigger: root.transferId !== ""
|
||||
itemName: JamiStrings.saveFile
|
||||
iconSource: JamiResources.save_file_svg
|
||||
onClicked: MessagesAdapter.copyToDownloads(root.transferId, root.transferName)
|
||||
},
|
||||
GeneralMenuItem {
|
||||
@ -44,6 +45,7 @@ ContextMenuAutoLoader {
|
||||
|
||||
canTrigger: root.transferId !== ""
|
||||
itemName: JamiStrings.openLocation
|
||||
iconSource: JamiResources.round_folder_24dp_svg
|
||||
onClicked: {
|
||||
MessagesAdapter.openDirectory(root.location);
|
||||
}
|
||||
@ -52,6 +54,7 @@ ContextMenuAutoLoader {
|
||||
id: reply
|
||||
|
||||
itemName: JamiStrings.reply
|
||||
iconSource: JamiResources.reply_black_24dp_svg
|
||||
onClicked: {
|
||||
MessagesAdapter.editId = "";
|
||||
MessagesAdapter.replyToId = root.msgId;
|
||||
@ -62,6 +65,7 @@ ContextMenuAutoLoader {
|
||||
|
||||
canTrigger: transferId === "" && isOutgoing
|
||||
itemName: JamiStrings.edit
|
||||
iconSource: JamiResources.edit_svg
|
||||
onClicked: {
|
||||
MessagesAdapter.replyToId = "";
|
||||
MessagesAdapter.editId = root.msgId;
|
||||
@ -73,6 +77,7 @@ ContextMenuAutoLoader {
|
||||
|
||||
canTrigger: transferId === "" && isOutgoing
|
||||
itemName: JamiStrings.optionDelete
|
||||
iconSource: JamiResources.delete_svg
|
||||
onClicked: {
|
||||
MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId);
|
||||
}
|
||||
|
||||
@ -60,10 +60,21 @@ Control {
|
||||
property real textContentHeight
|
||||
property bool isReply: ReplyTo !== ""
|
||||
|
||||
property real maxMsgWidth: root.width - senderMargin - 2 * hPadding - avatarBlockWidth
|
||||
|
||||
// If the ListView attached properties are not available,
|
||||
// then the root delegate is likely a Loader.
|
||||
readonly property ListView listView: ListView.view ? ListView.view : parent.ListView.view
|
||||
|
||||
function getBaseColor() {
|
||||
var baseColor = isOutgoing ? CurrentConversation.color : JamiTheme.messageInBgColor;
|
||||
if (Id === MessagesAdapter.replyToId || Id === MessagesAdapter.editId) {
|
||||
// If we are replying to or editing the message
|
||||
return Qt.darker(baseColor, 1.5);
|
||||
}
|
||||
return baseColor;
|
||||
}
|
||||
|
||||
rightPadding: hPadding
|
||||
leftPadding: hPadding
|
||||
|
||||
@ -90,14 +101,15 @@ Control {
|
||||
id: usernameblock
|
||||
Layout.preferredHeight: (seq === MsgSeq.first || seq === MsgSeq.single) ? 10 : 0
|
||||
visible: !isReply
|
||||
Layout.topMargin: (seq === MsgSeq.first || seq === MsgSeq.single) && !isOutgoing && !root.showTime ? 20 : 0
|
||||
|
||||
Label {
|
||||
id: username
|
||||
text: UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author)
|
||||
font.bold: true
|
||||
visible: (seq === MsgSeq.first || seq === MsgSeq.single) && !isOutgoing
|
||||
font.pixelSize: JamiTheme.usernameBlockFontSize
|
||||
color: JamiTheme.chatviewUsernameColor
|
||||
font.pointSize: JamiTheme.smallFontSize
|
||||
color: JamiTheme.chatviewSecondaryInformationColor
|
||||
lineHeight: JamiTheme.usernameBlockLineHeight
|
||||
leftPadding: JamiTheme.usernameBlockPadding
|
||||
textFormat: TextEdit.PlainText
|
||||
@ -114,7 +126,7 @@ Control {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: childrenRect.height
|
||||
|
||||
Layout.topMargin: JamiTheme.sbsMessageBaseReplyTopMargin
|
||||
Layout.topMargin: visible ? JamiTheme.sbsMessageBaseReplyTopMargin : 0
|
||||
Layout.leftMargin: isOutgoing ? undefined : JamiTheme.sbsMessageBaseReplyMargin
|
||||
Layout.rightMargin: !isOutgoing ? undefined : JamiTheme.sbsMessageBaseReplyMargin
|
||||
|
||||
@ -200,7 +212,7 @@ Control {
|
||||
RowLayout {
|
||||
id: msgRowlayout
|
||||
|
||||
Layout.preferredHeight: innerContent.height + root.extraHeight
|
||||
Layout.preferredHeight: innerContent.height + root.extraHeight + (emojiReactions.emojis === "" ? 0 : emojiReactions.height - 8)
|
||||
Layout.topMargin: ((seq === MsgSeq.first || seq === MsgSeq.single) && !root.isReply) ? 6 : 0
|
||||
|
||||
Item {
|
||||
@ -231,6 +243,7 @@ Control {
|
||||
|
||||
anchors.fill: bubble
|
||||
hoverEnabled: true
|
||||
|
||||
onClicked: function (mouse) {
|
||||
if (root.hoveredLink) {
|
||||
MessagesAdapter.openUrl(root.hoveredLink);
|
||||
@ -265,8 +278,8 @@ Control {
|
||||
anchors.rightMargin: isOutgoing ? 10 : 0
|
||||
anchors.leftMargin: !isOutgoing ? 10 : 0
|
||||
|
||||
imageColor: JamiTheme.emojiReactPushButtonColor
|
||||
normalColor: JamiTheme.transparentColor
|
||||
imageColor: hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor
|
||||
normalColor: JamiTheme.primaryBackgroundColor
|
||||
toolTipText: JamiStrings.moreOptions
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.right: isOutgoing ? optionButtonItem.right : undefined
|
||||
@ -275,33 +288,54 @@ Control {
|
||||
source: JamiResources.more_vert_24dp_svg
|
||||
width: optionButtonItem.width / 2
|
||||
height: optionButtonItem.height
|
||||
circled: false
|
||||
property bool isOpen: false
|
||||
property var obj: undefined
|
||||
|
||||
function bind() {
|
||||
more.isOpen = false;
|
||||
visible = Qt.binding(() => CurrentAccount.type !== Profile.Type.SIP && Body !== "" && (bubbleArea.bubbleHovered || hovered || reply.hovered || bgHandler.hovered));
|
||||
imageColor = Qt.binding(() => hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor);
|
||||
normalColor = Qt.binding(() => JamiTheme.primaryBackgroundColor);
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
var component = Qt.createComponent("qrc:/commoncomponents/MessageOptionsPopup.qml");
|
||||
var obj = component.createObject(bubble, {
|
||||
"emojiReactions": emojiReactions,
|
||||
"isOutgoing": isOutgoing,
|
||||
"msgId": Id,
|
||||
"msgBody": Body,
|
||||
"type": Type,
|
||||
"transferName": TransferName,
|
||||
"msgBubble": bubble,
|
||||
"listView": listView
|
||||
});
|
||||
obj.open();
|
||||
if (more.isOpen) {
|
||||
more.bind();
|
||||
obj.close();
|
||||
} else {
|
||||
var component = Qt.createComponent("qrc:/commoncomponents/ShowMoreMenu.qml");
|
||||
obj = component.createObject(more, {
|
||||
"emojiReactions": emojiReactions,
|
||||
"isOutgoing": isOutgoing,
|
||||
"msgId": Id,
|
||||
"msgBody": Body,
|
||||
"type": Type,
|
||||
"transferName": TransferName,
|
||||
"msgBubble": bubble,
|
||||
"listView": listView
|
||||
});
|
||||
obj.open();
|
||||
more.isOpen = true;
|
||||
visible = true;
|
||||
imageColor = JamiTheme.chatViewFooterImgHoverColor;
|
||||
normalColor = JamiTheme.hoveredButtonColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PushButton {
|
||||
id: reply
|
||||
|
||||
imageColor: JamiTheme.emojiReactPushButtonColor
|
||||
normalColor: JamiTheme.transparentColor
|
||||
circled: false
|
||||
imageColor: hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor
|
||||
normalColor: JamiTheme.primaryBackgroundColor
|
||||
toolTipText: JamiStrings.reply
|
||||
source: JamiResources.reply_svg
|
||||
source: JamiResources.reply_black_24dp_svg
|
||||
width: optionButtonItem.width / 2
|
||||
height: optionButtonItem.height
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.rightMargin: 5
|
||||
anchors.right: isOutgoing ? more.left : undefined
|
||||
anchors.left: !isOutgoing ? more.right : undefined
|
||||
visible: CurrentAccount.type !== Profile.Type.SIP && Body !== "" && (bubbleArea.bubbleHovered || hovered || more.hovered || bgHandler.hovered)
|
||||
@ -322,17 +356,7 @@ Control {
|
||||
out: isOutgoing
|
||||
type: seq
|
||||
isReply: root.isReply
|
||||
|
||||
function getBaseColor() {
|
||||
var baseColor = isOutgoing ? CurrentConversation.color : JamiTheme.messageInBgColor;
|
||||
if (Id === MessagesAdapter.replyToId || Id === MessagesAdapter.editId) {
|
||||
// If we are replying to or editing the message
|
||||
return Qt.darker(baseColor, 1.5);
|
||||
}
|
||||
return baseColor;
|
||||
}
|
||||
|
||||
color: getBaseColor()
|
||||
color: root.getBaseColor()
|
||||
radius: msgRadius
|
||||
anchors.right: isOutgoing ? parent.right : undefined
|
||||
anchors.top: parent.top
|
||||
@ -341,6 +365,55 @@ Control {
|
||||
height: innerContent.childrenRect.height + (visible ? root.extraHeight : 0)
|
||||
}
|
||||
|
||||
EmojiReactions {
|
||||
id: emojiReactions
|
||||
|
||||
anchors.top: bubble.bottom
|
||||
anchors.topMargin: -8
|
||||
|
||||
height: contentHeight + 5
|
||||
reactions: Reactions
|
||||
borderColor: root.getBaseColor()
|
||||
maxWidth: 2 / 3 * maxMsgWidth - JamiTheme.emojiMargins
|
||||
|
||||
state: root.isOutgoing ? "anchorsRight" : (emojiReactions.width > bubble.width - JamiTheme.emojiMargins ? "anchorsLeft" : "anchorsRight")
|
||||
|
||||
TapHandler {
|
||||
onTapped: {
|
||||
reactionPopup.open();
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "anchorsRight"
|
||||
AnchorChanges {
|
||||
target: emojiReactions
|
||||
anchors.right: bubble.right
|
||||
anchors.left: undefined
|
||||
}
|
||||
PropertyChanges {
|
||||
target: emojiReactions
|
||||
anchors.rightMargin: JamiTheme.emojiMargins
|
||||
anchors.leftMargin: 0
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "anchorsLeft"
|
||||
AnchorChanges {
|
||||
target: emojiReactions
|
||||
anchors.right: undefined
|
||||
anchors.left: bubble.left
|
||||
}
|
||||
PropertyChanges {
|
||||
target: emojiReactions
|
||||
anchors.rightMargin: 0
|
||||
anchors.leftMargin: JamiTheme.emojiMargins
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bg
|
||||
|
||||
@ -439,25 +512,6 @@ Control {
|
||||
}
|
||||
}
|
||||
|
||||
EmojiReactions {
|
||||
id: emojiReactions
|
||||
|
||||
property bool isOutgoing: Author === CurrentAccount.uri
|
||||
Layout.alignment: isOutgoing ? Qt.AlignRight : Qt.AlignLeft
|
||||
Layout.rightMargin: isOutgoing ? status.width : undefined
|
||||
Layout.leftMargin: !isOutgoing ? avatarBlock.width : undefined
|
||||
Layout.topMargin: -contentHeight / 4
|
||||
Layout.preferredHeight: contentHeight + 5
|
||||
Layout.preferredWidth: contentWidth
|
||||
reactions: Reactions
|
||||
|
||||
TapHandler {
|
||||
onTapped: {
|
||||
reactionPopup.open();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ListView {
|
||||
id: infoCell
|
||||
|
||||
|
||||
65
src/app/commoncomponents/ShareMenu.qml
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2023 Savoir-faire Linux Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import QtQuick
|
||||
import net.jami.Constants 1.1
|
||||
import "contextmenu"
|
||||
|
||||
BaseContextMenu {
|
||||
id: root
|
||||
property var modelList
|
||||
signal audioRecordMessageButtonClicked
|
||||
signal videoRecordMessageButtonClicked
|
||||
signal showMapClicked
|
||||
|
||||
property list<GeneralMenuItem> menuItems: [
|
||||
GeneralMenuItem {
|
||||
id: audioMessage
|
||||
|
||||
canTrigger: true
|
||||
iconSource: JamiResources.message_audio_black_24dp_svg
|
||||
itemName: JamiStrings.leaveAudioMessage
|
||||
onClicked: {
|
||||
root.audioRecordMessageButtonClicked();
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: videoMessage
|
||||
|
||||
canTrigger: true
|
||||
iconSource: JamiResources.message_video_black_24dp_svg
|
||||
itemName: JamiStrings.leaveVideoMessage
|
||||
|
||||
onClicked: {
|
||||
root.videoRecordMessageButtonClicked();
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: shareLocation
|
||||
|
||||
canTrigger: true
|
||||
iconSource: JamiResources.localisation_sharing_send_pin_svg
|
||||
itemName: JamiStrings.shareLocation
|
||||
onClicked: {
|
||||
root.showMapClicked();
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Component.onCompleted: {
|
||||
root.loadMenuItems(menuItems);
|
||||
}
|
||||
}
|
||||
190
src/app/commoncomponents/ShowMoreMenu.qml
Normal file
@ -0,0 +1,190 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2023 Savoir-faire Linux Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import QtQuick
|
||||
import net.jami.Constants 1.1
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import QtQuick.Controls
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import "contextmenu"
|
||||
|
||||
BaseContextMenu {
|
||||
id: root
|
||||
|
||||
required property var emojiReactions
|
||||
property var emojiReplied: emojiReactions.ownEmojis
|
||||
|
||||
required property string msgId
|
||||
required property string msgBody
|
||||
required property bool isOutgoing
|
||||
required property int type
|
||||
required property string transferName
|
||||
required property Item msgBubble
|
||||
required property ListView listView
|
||||
|
||||
property string location: msgBody
|
||||
property bool closeWithoutAnimation: false
|
||||
property var emojiPicker
|
||||
|
||||
function xPositionProvider(width) {
|
||||
// Use the width at function scope to retrigger property evaluation.
|
||||
const listViewWidth = listView.width;
|
||||
const parentX = parent.x;
|
||||
if (isOutgoing) {
|
||||
return parentX - width - 21;
|
||||
} else {
|
||||
return parentX + 21;
|
||||
}
|
||||
}
|
||||
|
||||
x: xPositionProvider(width)
|
||||
y: parent.y
|
||||
|
||||
signal addMoreEmoji
|
||||
onAddMoreEmoji: {
|
||||
JamiQmlUtils.updateMessageBarButtonsPoints();
|
||||
openEmojiPicker();
|
||||
}
|
||||
|
||||
function openEmojiPicker() {
|
||||
var component = WITH_WEBENGINE ? Qt.createComponent("qrc:/webengine/emojipicker/EmojiPicker.qml") : Qt.createComponent("qrc:/nowebengine/EmojiPicker.qml");
|
||||
emojiPicker = component.createObject(root.parent, {
|
||||
"listView": listView
|
||||
});
|
||||
emojiPicker.emojiIsPicked.connect(function (content) {
|
||||
if (emojiReplied.includes(content)) {
|
||||
MessagesAdapter.removeEmojiReaction(CurrentConversation.id, content, msgId);
|
||||
} else {
|
||||
MessagesAdapter.addEmojiReaction(CurrentConversation.id, content, msgId);
|
||||
}
|
||||
});
|
||||
if (emojiPicker !== null) {
|
||||
root.opacity = 0;
|
||||
emojiPicker.closed.connect(() => close());
|
||||
emojiPicker.x = xPositionProvider(JamiTheme.emojiPickerWidth);
|
||||
emojiPicker.y = yPositionProvider(JamiTheme.emojiPickerHeight);
|
||||
emojiPicker.open();
|
||||
} else {
|
||||
console.log("Error creating emojiPicker from message options popup");
|
||||
}
|
||||
}
|
||||
|
||||
// Close the picker when listView vertical properties change.
|
||||
property real listViewHeight: listView.height
|
||||
onListViewHeightChanged: close()
|
||||
property bool isScrolling: listView.verticalScrollBar.active
|
||||
onIsScrollingChanged: close()
|
||||
|
||||
onOpened: root.closeWithoutAnimation = false
|
||||
onClosed: if (emojiPicker)
|
||||
emojiPicker.closeEmojiPicker()
|
||||
|
||||
function getModel() {
|
||||
const defaultModel = ["👍", "👎", "😂"];
|
||||
const reactedEmojis = Array.isArray(emojiReplied) ? emojiReplied.slice(0, defaultModel.length) : [];
|
||||
const uniqueEmojis = Array.from(new Set(reactedEmojis));
|
||||
const missingEmojis = defaultModel.filter(emoji => !uniqueEmojis.includes(emoji));
|
||||
return uniqueEmojis.concat(missingEmojis);
|
||||
}
|
||||
|
||||
property list<MenuItem> menuItems: [
|
||||
GeneralMenuItemList {
|
||||
id: audioMessage
|
||||
|
||||
modelList: getModel()
|
||||
canTrigger: true
|
||||
iconSource: JamiResources.add_reaction_svg
|
||||
itemName: JamiStrings.copy
|
||||
addMenuSeparatorAfter: true
|
||||
messageId: msgId
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: saveFile
|
||||
|
||||
canTrigger: type === Interaction.Type.DATA_TRANSFER
|
||||
iconSource: JamiResources.save_file_svg
|
||||
itemName: JamiStrings.saveFile
|
||||
onClicked: {
|
||||
MessagesAdapter.copyToDownloads(root.msgId, root.transferName);
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: openLocation
|
||||
|
||||
canTrigger: type === Interaction.Type.DATA_TRANSFER
|
||||
iconSource: JamiResources.round_folder_24dp_svg
|
||||
itemName: JamiStrings.openLocation
|
||||
onClicked: {
|
||||
MessagesAdapter.openDirectory(root.location);
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: removeLocally
|
||||
|
||||
canTrigger: type === Interaction.Type.DATA_TRANSFER && Status === Interaction.Status.TRANSFER_FINISHED
|
||||
iconSource: JamiResources.trash_black_24dp_svg
|
||||
itemName: JamiStrings.removeLocally
|
||||
onClicked: {
|
||||
MessagesAdapter.removeFile(msgId, root.location);
|
||||
;
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: editMessage
|
||||
|
||||
canTrigger: root.isOutgoing && type === Interaction.Type.TEXT
|
||||
iconSource: JamiResources.edit_svg
|
||||
itemName: JamiStrings.editMessage
|
||||
onClicked: {
|
||||
MessagesAdapter.replyToId = "";
|
||||
MessagesAdapter.editId = root.msgId;
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: deleteMessage
|
||||
|
||||
canTrigger: root.isOutgoing && type === Interaction.Type.TEXT
|
||||
iconSource: JamiResources.delete_svg
|
||||
itemName: JamiStrings.deleteMessage
|
||||
onClicked: {
|
||||
MessagesAdapter.editMessage(CurrentConversation.id, "", root.msgId);
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: copyMessage
|
||||
|
||||
canTrigger: true
|
||||
iconSource: JamiResources.copy_svg
|
||||
itemName: JamiStrings.copy
|
||||
onClicked: {
|
||||
UtilsAdapter.setClipboardText(msgBody);
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Component.onCompleted: {
|
||||
root.loadMenuItems(menuItems);
|
||||
}
|
||||
|
||||
onAboutToHide: {
|
||||
root.destroy();
|
||||
}
|
||||
|
||||
Component.onDestruction: {
|
||||
parent.bind();
|
||||
}
|
||||
}
|
||||
@ -44,9 +44,6 @@ BaseModalDialog {
|
||||
open();
|
||||
}
|
||||
|
||||
width: Math.max(JamiTheme.preferredDialogWidth, buttonTitles.length * (JamiTheme.preferredFieldWidth / 2 + JamiTheme.preferredMarginSize))
|
||||
height: JamiTheme.preferredDialogHeight / 2 - JamiTheme.preferredMarginSize
|
||||
|
||||
popupContent: ColumnLayout {
|
||||
Label {
|
||||
id: infoTextLabel
|
||||
@ -72,12 +69,10 @@ BaseModalDialog {
|
||||
|
||||
data: innerContentData
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: JamiTheme.preferredMarginSize
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: contentHeight
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
Layout.bottomMargin: JamiTheme.preferredMarginSize
|
||||
|
||||
|
||||
@ -32,9 +32,8 @@ Item {
|
||||
property int spinningAnimationWidth: 4
|
||||
property real outerCutRadius: root.height / 2
|
||||
property int spinningAnimationDuration: 1000
|
||||
|
||||
property color color: "white"
|
||||
visible: mode !== SpinningAnimation.Mode.Disabled
|
||||
|
||||
ConicalGradient {
|
||||
id: conicalGradientOne
|
||||
|
||||
@ -48,7 +47,7 @@ Item {
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "white"
|
||||
color: mode === SpinningAnimation.Mode.Disabled ? "transparent" : root.color
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,7 +89,7 @@ Item {
|
||||
}
|
||||
GradientStop {
|
||||
position: 1.0
|
||||
color: "white"
|
||||
color: mode === SpinningAnimation.Mode.Disabled ? "transparent" : root.color
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -30,15 +30,14 @@ SBSMessageBase {
|
||||
|
||||
property bool isRemoteImage
|
||||
property bool isEmojiOnly: IsEmojiOnly
|
||||
property real maxMsgWidth: root.width - senderMargin - 2 * hPadding - avatarBlockWidth
|
||||
property string colorUrl: UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark
|
||||
property string colorText: UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
|
||||
|
||||
Connections {
|
||||
target: bubble
|
||||
function onColorChanged(color) {
|
||||
root.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark
|
||||
root.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
|
||||
root.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark;
|
||||
root.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark;
|
||||
// Update parsed body with correct colors
|
||||
if (Body !== "")
|
||||
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
|
||||
@ -65,7 +64,7 @@ SBSMessageBase {
|
||||
text: {
|
||||
if (Body !== "" && ParsedBody.length === 0) {
|
||||
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
|
||||
return ""
|
||||
return "";
|
||||
}
|
||||
return (ParsedBody !== "") ? ParsedBody : "<i>(" + JamiStrings.deletedMessage + ")</i>";
|
||||
}
|
||||
@ -86,7 +85,7 @@ SBSMessageBase {
|
||||
|
||||
wrapMode: Label.WrapAtWordBoundaryOrAnywhere
|
||||
selectByMouse: true
|
||||
font.pixelSize: isEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.emojiBubbleSize
|
||||
font.pointSize: isEmojiOnly ? JamiTheme.chatviewEmojiSize : JamiTheme.mediumFontSize
|
||||
font.hintingPreference: Font.PreferNoHinting
|
||||
renderType: Text.NativeRendering
|
||||
textFormat: Text.RichText
|
||||
@ -277,5 +276,5 @@ SBSMessageBase {
|
||||
duration: 100
|
||||
}
|
||||
}
|
||||
Component.onCompleted: opacity = 1;
|
||||
Component.onCompleted: opacity = 1
|
||||
}
|
||||
|
||||
@ -49,8 +49,7 @@ ColumnLayout {
|
||||
|
||||
Layout.preferredHeight: childrenRect.height
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: JamiTheme.dayTimestampTopMargin
|
||||
Layout.bottomMargin: formattedTimeLabel.visible ? 0 : JamiTheme.dayTimestampBottomMargin
|
||||
Layout.topMargin: 30
|
||||
|
||||
Rectangle {
|
||||
id: line
|
||||
@ -95,12 +94,12 @@ ColumnLayout {
|
||||
id: formattedTimeLabel
|
||||
|
||||
text: formattedTime
|
||||
Layout.bottomMargin: JamiTheme.timestampBottomMargin
|
||||
Layout.topMargin: JamiTheme.timestampTopMargin
|
||||
Layout.topMargin: 30
|
||||
Layout.bottomMargin: 30
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
color: JamiTheme.timestampColor
|
||||
color: JamiTheme.chatviewSecondaryInformationColor
|
||||
visible: showTime || showDay
|
||||
Layout.preferredHeight: visible * implicitHeight
|
||||
font.pointSize: JamiTheme.timestampFont
|
||||
font.pointSize: JamiTheme.smallFontSize
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,6 +23,8 @@ import net.jami.Constants 1.1
|
||||
Menu {
|
||||
id: root
|
||||
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside | Popup.CloseOnPressOutsideParent
|
||||
|
||||
property int menuPreferredWidth: 0
|
||||
property int menuItemsPreferredHeight: 0
|
||||
property int menuSeparatorPreferredHeight: 0
|
||||
@ -43,11 +45,9 @@ Menu {
|
||||
|
||||
function loadMenuItems(menuItems) {
|
||||
root.addItem(menuTopBorder);
|
||||
|
||||
// use the maximum text width as the preferred width for menu
|
||||
for (var j = 0; j < menuItems.length; ++j) {
|
||||
var currentItemWidth = menuItems[j].itemPreferredWidth;
|
||||
if (currentItemWidth !== JamiTheme.menuItemsPreferredWidth && currentItemWidth > menuPreferredWidth)
|
||||
if (currentItemWidth !== JamiTheme.menuItemsPreferredWidth && currentItemWidth > menuPreferredWidth && menuItems[j].canTrigger)
|
||||
menuPreferredWidth = currentItemWidth;
|
||||
}
|
||||
for (var i = 0; i < menuItems.length; ++i) {
|
||||
@ -55,17 +55,28 @@ Menu {
|
||||
menuItems[i].parentMenu = root;
|
||||
root.addItem(menuItems[i]);
|
||||
if (menuPreferredWidth)
|
||||
menuItems[i].itemPreferredWidth = menuPreferredWidth;
|
||||
menuItems[i].itemRealWidth = menuPreferredWidth;
|
||||
if (menuItemsPreferredHeight)
|
||||
menuItems[i].itemPreferredHeight = menuItemsPreferredHeight;
|
||||
}
|
||||
if (menuItems[i].addMenuSeparatorAfter) {
|
||||
// If the QML file to be loaded is a local file,
|
||||
// you could omit the finishCreation() function
|
||||
var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root);
|
||||
var menuSeparatorComponentObj = menuSeparatorComponent.createObject();
|
||||
generalMenuSeparatorList.push(menuSeparatorComponentObj);
|
||||
root.addItem(menuSeparatorComponentObj);
|
||||
if (i !== menuItems.length - 1) {
|
||||
var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root);
|
||||
var menuSeparatorComponentObj = menuSeparatorComponent.createObject();
|
||||
generalMenuSeparatorList.push(menuSeparatorComponentObj);
|
||||
root.addItem(menuSeparatorComponentObj);
|
||||
}
|
||||
if (menuItems[i].addMenuSeparatorAfter) {
|
||||
var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root);
|
||||
var menuSeparatorComponentObj = menuSeparatorComponent.createObject(root, {
|
||||
"separatorColor": "#DEDEDE",
|
||||
"separatorPreferredHeight": 0
|
||||
});
|
||||
generalMenuSeparatorList.push(menuSeparatorComponentObj);
|
||||
root.addItem(menuSeparatorComponentObj);
|
||||
var menuSeparatorComponent = Qt.createComponent("GeneralMenuSeparator.qml", Component.PreferSynchronous, root);
|
||||
var menuSeparatorComponentObj = menuSeparatorComponent.createObject();
|
||||
generalMenuSeparatorList.push(menuSeparatorComponentObj);
|
||||
root.addItem(menuSeparatorComponentObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
root.addItem(menuBottomBorder);
|
||||
@ -77,28 +88,22 @@ Menu {
|
||||
root.close();
|
||||
}
|
||||
|
||||
modal: true
|
||||
Overlay.modal: Rectangle {
|
||||
color: "transparent"
|
||||
}
|
||||
font.pointSize: JamiTheme.menuFontSize
|
||||
|
||||
background: Rectangle {
|
||||
id: container
|
||||
|
||||
implicitWidth: menuPreferredWidth ? menuPreferredWidth : JamiTheme.menuItemsPreferredWidth
|
||||
|
||||
border.width: JamiTheme.menuItemsCommonBorderWidth
|
||||
border.color: JamiTheme.tabbarBorderColor
|
||||
color: JamiTheme.backgroundColor
|
||||
color: JamiTheme.primaryBackgroundColor
|
||||
radius: 5
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: DropShadow {
|
||||
z: -1
|
||||
horizontalOffset: 3.0
|
||||
horizontalOffset: 0.0
|
||||
verticalOffset: 3.0
|
||||
radius: 16.0
|
||||
color: JamiTheme.shadowColor
|
||||
radius: 6
|
||||
color: "#29000000"
|
||||
transparentBorder: true
|
||||
samples: radius + 1
|
||||
}
|
||||
|
||||
@ -30,6 +30,8 @@ Loader {
|
||||
|
||||
active: false
|
||||
|
||||
visible: false
|
||||
|
||||
function openMenu() {
|
||||
root.active = true;
|
||||
root.sourceComponent = menuComponent;
|
||||
|
||||